Skip to content

Commit 0828ebc

Browse files
author
Pan
committed
Added socket properties to session for providing socket. Added test for connecting with an existing python socket.
1 parent c49b27e commit 0828ebc

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

ssh/session.pxd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,5 @@ cimport c_ssh
1818

1919
cdef class Session:
2020
cdef c_ssh.ssh_session _session
21+
cdef c_ssh.socket_t _sock
22+
cdef object sock

ssh/session.pyx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,29 @@ cdef class Session:
3636
self._session = c_ssh.ssh_new()
3737
if self._session is NULL:
3838
raise MemoryError
39+
self.sock = None
3940

4041
def __dealloc__(self):
4142
if self._session is not NULL:
4243
c_ssh.ssh_free(self._session)
4344
self._session = NULL
4445

46+
def set_socket(self, socket):
47+
"""Set socket to use for session.
48+
49+
Not part of libssh API but needs to be done in C to be able to
50+
translate python sockets to file descriptors to be used by libssh.
51+
"""
52+
cdef c_ssh.socket_t _sock = PyObject_AsFileDescriptor(socket)
53+
cdef c_ssh.ssh_options_e fd = c_ssh.ssh_options_e.SSH_OPTIONS_FD
54+
cdef int rc
55+
with nogil:
56+
rc = c_ssh.ssh_options_set(self._session, fd, &_sock)
57+
handle_ssh_error_codes(rc, self._session)
58+
self._sock = _sock
59+
self.sock = socket
60+
return rc
61+
4562
def blocking_flush(self, int timeout):
4663
cdef int rc
4764
with nogil:
@@ -247,8 +264,11 @@ cdef class Session:
247264
rc = c_ssh.ssh_service_request(self._session, c_service)
248265
return handle_ssh_error_codes(rc, self._session)
249266

250-
def set_agent_channel(self, channel):
251-
raise NotImplementedError
267+
def set_agent_channel(self, Channel channel):
268+
cdef int rc
269+
with nogil:
270+
rc = c_ssh.ssh_set_agent_channel(self._session, channel._channel)
271+
return handle_ssh_error_codes(rc, self._session)
252272

253273
def set_agent_socket(self, c_ssh.socket_t fd):
254274
cdef int rc

tests/test_session.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-130
1616

1717
import unittest
18+
import socket
1819

1920
from .base_test import SSHTestCase
2021

@@ -27,6 +28,19 @@
2728

2829
class SessionTest(SSHTestCase):
2930

31+
def test_socket_connect(self):
32+
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
33+
sock.connect((self.host, self.port))
34+
session = Session()
35+
session.options_set(options.USER, self.user)
36+
session.options_set(options.HOST, self.host)
37+
session.options_set_port(self.port)
38+
self.assertEqual(session.set_socket(sock), 0)
39+
self.assertEqual(self.session.connect(), 0)
40+
self.assertRaises(RequestDenied, self.session.userauth_none)
41+
self.assertEqual(
42+
self.session.userauth_publickey(self.pkey), 0)
43+
3044
def test_connect(self):
3145
self.assertEqual(self.session.connect(), 0)
3246
self.assertRaises(RequestDenied, self.session.userauth_none)

0 commit comments

Comments
 (0)