Author: Amaury Forgeot d'Arc <amaur...@gmail.com> Branch: py3.5 Changeset: r87300:d58ded0f71fb Date: 2016-09-22 03:08 +0200 http://bitbucket.org/pypy/pypy/changeset/d58ded0f71fb/
Log: Fix many tests in module/_ssl diff --git a/pypy/module/_ssl/interp_ssl.py b/pypy/module/_ssl/interp_ssl.py --- a/pypy/module/_ssl/interp_ssl.py +++ b/pypy/module/_ssl/interp_ssl.py @@ -311,7 +311,8 @@ class SSLSocket(W_Root): - def __init__(self, space): + def __init__(self, space, w_ctx): + self.w_ctx = w_ctx self.w_socket = None self.ssl = lltype.nullptr(SSL.TO) self.peer_cert = lltype.nullptr(X509.TO) @@ -691,6 +692,16 @@ self.w_ctx = w_ctx libssl_SSL_set_SSL_CTX(self.ssl, ctx.ctx) + def descr_get_owner(self, space): + if self.w_owner: + w_owner = self.w_owner() + if w_owner: + return w_owner + return space.w_None + + def descr_set_owner(self, space, w_owner): + self.w_owner = weakref.ref(w_owner) + SSLSocket.typedef = TypeDef("_ssl._SSLSocket", write = interp2app(SSLSocket.write), @@ -707,6 +718,8 @@ tls_unique_cb = interp2app(SSLSocket.tls_unique_cb_w), context=GetSetProperty(SSLSocket.descr_get_context, SSLSocket.descr_set_context), + owner=GetSetProperty(SSLSocket.descr_get_owner, + SSLSocket.descr_set_owner), ) def _certificate_to_der(space, certificate): @@ -999,14 +1012,14 @@ libssl_sk_DIST_POINT_free(dps) return space.newtuple(cdp_w[:]) -def new_sslobject(space, ctx, w_sock, side, server_hostname): - ss = SSLSocket(space) +def new_sslobject(space, w_ctx, w_sock, side, server_hostname): + ss = SSLSocket(space, w_ctx) sock_fd = space.int_w(space.call_method(w_sock, "fileno")) w_timeout = space.call_method(w_sock, "gettimeout") has_timeout = not space.is_none(w_timeout) - ss.ssl = libssl_SSL_new(ctx) # new ssl struct + ss.ssl = libssl_SSL_new(w_ctx.ctx) # new ssl struct libssl_SSL_set_fd(ss.ssl, sock_fd) # set the socket for SSL # The ACCEPT_MOVING_WRITE_BUFFER flag is necessary because the address # of a str object may be changed by the garbage collector. @@ -1261,7 +1274,20 @@ index = rffi.cast(lltype.Signed, libssl_SSL_get_app_data(ssl)) w_ssl = SOCKET_STORAGE.get(index) assert isinstance(w_ssl, SSLSocket) - w_ssl_socket = w_ssl # So far. Need to change in 3.3. + # The servername callback expects an argument that represents the current + # SSL connection and that has a .context attribute that can be changed to + # identify the requested hostname. Since the official API is the Python + # level API we want to pass the callback a Python level object rather than + # a _ssl.SSLSocket instance. If there's an "owner" (typically an + # SSLObject) that will be passed. Otherwise if there's a socket then that + # will be passed. If both do not exist only then the C-level object is + # passed. + if w_ssl.w_owner: + w_ssl_socket = w_ssl.w_owner() + elif w_ssl.w_socket: + w_ssl_socket = w_ssl.w_socket() + else: + w_ssl_socket = w_ssl if space.is_none(w_ssl_socket): ad[0] = rffi.cast(rffi.INT, SSL_AD_INTERNAL_ERROR) return rffi.cast(rffi.INT, SSL_TLSEXT_ERR_ALERT_FATAL) @@ -1392,7 +1418,7 @@ "server_hostname is not supported by your OpenSSL " "library") - return new_sslobject(space, self.ctx, w_sock, server_side, hostname) + return new_sslobject(space, self, w_sock, server_side, hostname) def session_stats_w(self, space): w_stats = space.newdict() @@ -1796,9 +1822,8 @@ SSLContext.descr_set_verify_mode), verify_flags=GetSetProperty(SSLContext.descr_get_verify_flags, SSLContext.descr_set_verify_flags), - # XXX: For use by 3.4 ssl.py only - #check_hostname=GetSetProperty(SSLContext.descr_get_check_hostname, - # SSLContext.descr_set_check_hostname), + check_hostname=GetSetProperty(SSLContext.descr_get_check_hostname, + SSLContext.descr_set_check_hostname), ) diff --git a/pypy/module/_ssl/test/test_ssl.py b/pypy/module/_ssl/test/test_ssl.py --- a/pypy/module/_ssl/test/test_ssl.py +++ b/pypy/module/_ssl/test/test_ssl.py @@ -428,7 +428,7 @@ class AppTestSSLError: spaceconfig = dict(usemodules=('_ssl', '_socket', 'binascii', 'thread', - 'struct')) + 'struct', 'select')) def setup_class(cls): tmpfile = udir / "tmpfile.pem" _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit