Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplify SSLSocket / SSLObject doc string #9972

Merged
merged 1 commit into from
May 17, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 21 additions & 16 deletions Lib/ssl.py
Original file line number Diff line number Diff line change
Expand Up @@ -781,6 +781,12 @@ def verify_client_post_handshake(self):
return self._sslobj.verify_client_post_handshake()


def _sslcopydoc(func):
"""Copy docstring from SSLObject to SSLSocket"""
func.__doc__ = getattr(SSLObject, func.__name__).__doc__
return func


class SSLSocket(socket):
"""This class implements a subtype of socket.socket that wraps
the underlying OS socket in an SSL context when necessary, and
Expand Down Expand Up @@ -857,6 +863,7 @@ def _create(cls, sock, server_side=False, do_handshake_on_connect=True,
return self

@property
@_sslcopydoc
def context(self):
return self._context

Expand All @@ -866,8 +873,8 @@ def context(self, ctx):
self._sslobj.context = ctx

@property
@_sslcopydoc
def session(self):
"""The SSLSession for client socket."""
if self._sslobj is not None:
return self._sslobj.session

Expand All @@ -878,8 +885,8 @@ def session(self, session):
self._sslobj.session = session

@property
@_sslcopydoc
def session_reused(self):
"""Was the client session reused during handshake"""
if self._sslobj is not None:
return self._sslobj.session_reused

Expand Down Expand Up @@ -929,44 +936,45 @@ def write(self, data):
raise ValueError("Write on closed or unwrapped SSL socket.")
return self._sslobj.write(data)

@_sslcopydoc
def getpeercert(self, binary_form=False):
"""Returns a formatted version of the data in the
certificate provided by the other end of the SSL channel.
Return None if no certificate was provided, {} if a
certificate was provided, but not validated."""

self._checkClosed()
self._check_connected()
return self._sslobj.getpeercert(binary_form)

@_sslcopydoc
def selected_npn_protocol(self):
self._checkClosed()
if self._sslobj is None or not _ssl.HAS_NPN:
return None
else:
return self._sslobj.selected_npn_protocol()

@_sslcopydoc
def selected_alpn_protocol(self):
self._checkClosed()
if self._sslobj is None or not _ssl.HAS_ALPN:
return None
else:
return self._sslobj.selected_alpn_protocol()

@_sslcopydoc
def cipher(self):
self._checkClosed()
if self._sslobj is None:
return None
else:
return self._sslobj.cipher()

@_sslcopydoc
def shared_ciphers(self):
self._checkClosed()
if self._sslobj is None:
return None
else:
return self._sslobj.shared_ciphers()

@_sslcopydoc
def compression(self):
self._checkClosed()
if self._sslobj is None:
Expand Down Expand Up @@ -1077,6 +1085,7 @@ def recvmsg_into(self, *args, **kwargs):
raise NotImplementedError("recvmsg_into not allowed on instances of "
"%s" % self.__class__)

@_sslcopydoc
def pending(self):
self._checkClosed()
if self._sslobj is not None:
Expand All @@ -1089,6 +1098,7 @@ def shutdown(self, how):
self._sslobj = None
super().shutdown(how)

@_sslcopydoc
def unwrap(self):
if self._sslobj:
s = self._sslobj.shutdown()
Expand All @@ -1097,6 +1107,7 @@ def unwrap(self):
else:
raise ValueError("No SSL wrapper around " + str(self))

@_sslcopydoc
def verify_client_post_handshake(self):
if self._sslobj:
return self._sslobj.verify_client_post_handshake()
Expand All @@ -1107,8 +1118,8 @@ def _real_close(self):
self._sslobj = None
super()._real_close()

@_sslcopydoc
def do_handshake(self, block=False):
"""Perform a TLS/SSL handshake."""
self._check_connected()
timeout = self.gettimeout()
try:
Expand Down Expand Up @@ -1166,11 +1177,8 @@ def accept(self):
server_side=True)
return newsock, addr

@_sslcopydoc
def get_channel_binding(self, cb_type="tls-unique"):
"""Get channel binding data for current connection. Raise ValueError
if the requested `cb_type` is not supported. Return bytes of the data
or None if the data is not available (e.g. before the handshake).
"""
if self._sslobj is not None:
return self._sslobj.get_channel_binding(cb_type)
else:
Expand All @@ -1180,11 +1188,8 @@ def get_channel_binding(self, cb_type="tls-unique"):
)
return None

@_sslcopydoc
def version(self):
"""
Return a string identifying the protocol version used by the
current SSL channel, or None if there is no established channel.
"""
if self._sslobj is not None:
return self._sslobj.version()
else:
Expand Down