Skip to content

Commit 25fc942

Browse files
committed
add missing socket wrappers, SSLSocket.pending()
1 parent 3d96e3e commit 25fc942

2 files changed

Lines changed: 55 additions & 11 deletions

File tree

src/wolfssl/__init__.py

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ def __init__(self, sock=None, keyfile=None, certfile=None,
359359
# set options
360360
self.do_handshake_on_connect = do_handshake_on_connect
361361
self.suppress_ragged_eofs = suppress_ragged_eofs
362-
self.server_side = server_side
362+
self._server_side = server_side
363363

364364
# save socket
365365
self._sock = sock
@@ -447,13 +447,22 @@ def _release_native_object(self):
447447
_lib.wolfSSL_free(self.native_object)
448448
self.native_object = _ffi.NULL
449449

450+
def pending(self):
451+
return _lib.wolfSSL_pending(self.native_object)
452+
450453
@property
451454
def context(self):
452455
"""
453456
Returns the context used by this object.
454457
"""
455458
return self._context
456459

460+
def server_side(self):
461+
"""
462+
Returns True for server-side socket, otherwise False.
463+
"""
464+
return self._server_side;
465+
457466
def dup(self):
458467
raise NotImplementedError("Can't dup() %s instances" %
459468
self.__class__.__name__)
@@ -615,7 +624,7 @@ def shutdown(self, how):
615624
if self.native_object != _ffi.NULL:
616625
_lib.wolfSSL_shutdown(self.native_object)
617626
self._release_native_object()
618-
socket.shutdown(self._sock, how)
627+
self._sock.shutdown(how)
619628

620629
def unwrap(self):
621630
"""
@@ -634,17 +643,14 @@ def unwrap(self):
634643

635644
return sock
636645

637-
def close(self):
638-
self._sock.close()
639-
640646
def do_handshake(self, block=False): # pylint: disable=unused-argument
641647
"""
642648
Perform a TLS/SSL handshake.
643649
"""
644650
self._check_closed("do_handshake")
645651
self._check_connected()
646652

647-
if self.server_side:
653+
if self._server_side:
648654
ret = _lib.wolfSSL_accept(self.native_object)
649655
else:
650656
ret = _lib.wolfSSL_connect(self.native_object)
@@ -687,7 +693,7 @@ def do_handshake(self, block=False): # pylint: disable=unused-argument
687693
(err, eStr))
688694

689695
def _real_connect(self, addr, connect_ex):
690-
if self.server_side:
696+
if self._server_side:
691697
raise ValueError("can't connect in server-side mode")
692698

693699
# Here we assume that the socket is client-side, and not
@@ -696,10 +702,10 @@ def _real_connect(self, addr, connect_ex):
696702
raise ValueError("attempt to connect already-connected SSLSocket!")
697703

698704
if connect_ex:
699-
err = socket.connect_ex(self._sock, addr)
705+
err = self._sock.connect_ex(addr)
700706
else:
701707
err = 0
702-
socket.connect(self._sock, addr)
708+
self._sock.connect(addr)
703709

704710
if err == 0:
705711
self._connected = True
@@ -728,10 +734,10 @@ def accept(self):
728734
containing that new connection wrapped with a server-side secure
729735
channel, and the address of the remote client.
730736
"""
731-
if not self.server_side:
737+
if not self._server_side:
732738
raise ValueError("can't accept in client-side mode")
733739

734-
newsock, addr = socket.accept(self._sock)
740+
newsock, addr = self._sock.accept()
735741
newsock = self.context.wrap_socket(
736742
newsock,
737743
do_handshake_on_connect=self.do_handshake_on_connect,
@@ -767,6 +773,43 @@ def getpeercert(self, binary_form=False):
767773
return {'subject': ((('commonName', x509.get_subject_cn()),),),
768774
'subjectAltName': x509.get_altnames() }
769775

776+
# The following functions expose functionality of the underlying
777+
# Socket object. These are also expsed through Python's ssl module
778+
# API and are provided here for compatibility.
779+
def close(self):
780+
self._sock.close()
781+
782+
def fileno(self):
783+
"""
784+
Return file descriptor of underlying socket.
785+
"""
786+
return self._sock.fileno()
787+
788+
def gettimeout(self):
789+
"""
790+
Return the socket timeout of the underlying wrapped socket
791+
"""
792+
return self._sock.gettimeout()
793+
794+
def settimeout(self, timeout):
795+
"""
796+
Set the timeout on the underlying wrapped socket
797+
"""
798+
self._sock.settimeout(timeout)
799+
800+
def getpeername(self):
801+
"""
802+
Return the remote address that the underlying socket is connected to
803+
"""
804+
return self._sock.getpeername()
805+
806+
def getsockname(self):
807+
"""
808+
Return the underlying socket's address
809+
"""
810+
return self._sock.getsockname()
811+
812+
770813

771814
def wrap_socket(sock, keyfile=None, certfile=None, server_side=False,
772815
cert_reqs=CERT_NONE, ssl_version=PROTOCOL_TLS, ca_certs=None,

src/wolfssl/_build_ffi.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@
114114
int wolfSSL_accept(void*);
115115
int wolfSSL_write(void*, const void*, int);
116116
int wolfSSL_read(void*, void*, int);
117+
int wolfSSL_pending(void*);
117118
int wolfSSL_shutdown(void*);
118119
void* wolfSSL_get_peer_certificate(void*);
119120
int wolfSSL_UseSNI(void*, unsigned char, const void*, unsigned short);

0 commit comments

Comments
 (0)