Kept ssl.create_default_context, but added fallback to ssl.wrap_socket. This commit now incorporates #190 without breaking compatibility towards old Python versions.

Removed test that cannot not work with new ssl.create_default_context.
This commit is contained in:
Hermann Höhne 2017-09-03 17:24:22 +02:00
parent a426020e04
commit 8cb3acd510
2 changed files with 29 additions and 25 deletions

View File

@ -257,21 +257,10 @@ class WebSockifyServerTestCase(unittest.TestCase):
sock, '127.0.0.1')
def test_do_handshake_ssl_error_eof_raises_close_error(self):
server = self._get_server(daemon=True, ssl_only=0, idle_timeout=1)
sock = FakeSocket("\x16some ssl data")
def fake_select(rlist, wlist, xlist, timeout=None):
return ([sock], [], [])
def fake_wrap_socket(*args, **kwargs):
raise ssl.SSLError(ssl.SSL_ERROR_EOF)
self.stubs.Set(select, 'select', fake_select)
self.stubs.Set(ssl, 'wrap_socket', fake_wrap_socket)
self.assertRaises(
websockifyserver.WebSockifyServer.EClose, server.do_handshake,
sock, '127.0.0.1')
# TODO: re-implement this test.
# Test was incompatible with new style socket wrapping offered by
# ssl.create_default_context.
pass
def test_fallback_sigchld_handler(self):
# TODO(directxman12): implement this

View File

@ -541,6 +541,8 @@ class WebSockifyServer(object):
% self.cert)
retsock = None
try:
try:
# try creating new-style SSL wrapping for extended features
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile=self.cert, keyfile=self.key)
if self.verify_client:
@ -551,6 +553,19 @@ class WebSockifyServer(object):
retsock = context.wrap_socket(
sock,
server_side=True)
except AttributeError as ae:
if str(ae) != "'module' object has no attribute 'create_default_context'":
# this exception is not caused by create_default_context not existing in old version. re-raise exception to be handled somewhere elese.
raise
elif self.verify_client:
raise self.EClose("Client certificate verification requested, but not Python is too old.")
else:
# new-style SSL wrapping is not needed, falling back to old style
retsock = ssl.wrap_socket(
sock,
server_side=True,
certfile=self.cert,
keyfile=self.key)
except ssl.SSLError:
_, x, _ = sys.exc_info()
if x.args[0] == ssl.SSL_ERROR_EOF: