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:
parent
a426020e04
commit
8cb3acd510
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -541,16 +541,31 @@ class WebSockifyServer(object):
|
|||
% self.cert)
|
||||
retsock = None
|
||||
try:
|
||||
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
|
||||
context.load_cert_chain(certfile=self.cert, keyfile=self.key)
|
||||
if self.verify_client:
|
||||
context.verify_mode = ssl.CERT_REQUIRED
|
||||
context.set_default_verify_paths()
|
||||
if self.cafile:
|
||||
context.load_verify_locations(cafile=self.cafile)
|
||||
retsock = context.wrap_socket(
|
||||
sock,
|
||||
server_side=True)
|
||||
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:
|
||||
context.verify_mode = ssl.CERT_REQUIRED
|
||||
context.set_default_verify_paths()
|
||||
if self.cafile:
|
||||
context.load_verify_locations(cafile=self.cafile)
|
||||
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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue