[Jython-checkins] jython: Fix for #1997: Incomplete ssl support in Jython2.7a2

alan.kennedy jython-checkins at python.org
Sat Feb 2 11:57:18 CET 2013


http://hg.python.org/jython/rev/fe47bfd36e5c
changeset:   6975:fe47bfd36e5c
user:        Alan Kennedy <alan at xhaus.com>
date:        Sat Feb 02 10:55:45 2013 +0000
summary:
  Fix for #1997: Incomplete ssl support in Jython2.7a2

files:
  Lib/socket.py               |  35 ++++++++++++------------
  Lib/ssl.py                  |   2 +-
  Lib/test/test_socket_ssl.py |   9 ++++++
  3 files changed, 28 insertions(+), 18 deletions(-)


diff --git a/Lib/socket.py b/Lib/socket.py
--- a/Lib/socket.py
+++ b/Lib/socket.py
@@ -1850,24 +1850,31 @@
 
 class ssl:
 
-    def __init__(self, plain_sock, keyfile=None, certfile=None):
+    def __init__(self, jython_socket_wrapper, keyfile=None, certfile=None):
         try:
-            self.ssl_sock = self._make_ssl_socket(plain_sock)
-            self._in_buf = java.io.BufferedInputStream(self.ssl_sock.getInputStream())
-            self._out_buf = java.io.BufferedOutputStream(self.ssl_sock.getOutputStream())
+            self.jython_socket_wrapper = jython_socket_wrapper
+            jython_socket = self.jython_socket_wrapper._sock
+            self.java_ssl_socket = self._make_ssl_socket(jython_socket)
+            self._in_buf = java.io.BufferedInputStream(self.java_ssl_socket.getInputStream())
+            self._out_buf = java.io.BufferedOutputStream(self.java_ssl_socket.getOutputStream())
         except java.lang.Exception, jlx:
             raise _map_exception(jlx)
 
-    def _make_ssl_socket(self, plain_socket, auto_close=0):
-        java_net_socket = plain_socket._get_jsocket()
+    def _make_ssl_socket(self, jython_socket, auto_close=0):
+        java_net_socket = jython_socket._get_jsocket()
         assert isinstance(java_net_socket, java.net.Socket)
         host = java_net_socket.getInetAddress().getHostAddress()
         port = java_net_socket.getPort()
         factory = javax.net.ssl.SSLSocketFactory.getDefault();
-        ssl_socket = factory.createSocket(java_net_socket, host, port, auto_close)
-        ssl_socket.setEnabledCipherSuites(ssl_socket.getSupportedCipherSuites())
-        ssl_socket.startHandshake()
-        return ssl_socket
+        java_ssl_socket = factory.createSocket(java_net_socket, host, port, auto_close)
+        java_ssl_socket.setEnabledCipherSuites(java_ssl_socket.getSupportedCipherSuites())
+        java_ssl_socket.startHandshake()
+        return java_ssl_socket
+
+    def __getattr__(self, attr_name):
+        if hasattr(self.jython_socket_wrapper, attr_name):
+            return getattr(self.jython_socket_wrapper, attr_name)
+        raise AttributeError(attr_name)
 
     def read(self, n=4096):
         try:
@@ -1891,7 +1898,7 @@
 
     def _get_server_cert(self):
         try:
-            return self.ssl_sock.getSession().getPeerCertificates()[0]
+            return self.java_ssl_socket.getSession().getPeerCertificates()[0]
         except java.lang.Exception, jlx:
             raise _map_exception(jlx)
 
@@ -1903,12 +1910,6 @@
         cert = self._get_server_cert()
         return cert.getIssuerDN().toString()
 
-_realssl = ssl
-def ssl(sock, keyfile=None, certfile=None):
-    if hasattr(sock, "_sock"):
-        sock = sock._sock
-    return _realssl(sock, keyfile, certfile)
-
 def test():
     s = socket(AF_INET, SOCK_STREAM)
     s.connect(("", 80))
diff --git a/Lib/ssl.py b/Lib/ssl.py
--- a/Lib/ssl.py
+++ b/Lib/ssl.py
@@ -7,4 +7,4 @@
 
 import socket
 
-wrap = socket.ssl
+wrap_socket = socket.ssl
diff --git a/Lib/test/test_socket_ssl.py b/Lib/test/test_socket_ssl.py
--- a/Lib/test/test_socket_ssl.py
+++ b/Lib/test/test_socket_ssl.py
@@ -61,11 +61,20 @@
     time.sleep(1)
     connector()
 
+def test_https_socket():
+    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    s.connect(('www.verisign.com', 443))
+    ssl_sock = socket.ssl(s)
+    ssl_sock.server()
+    ssl_sock.issuer()
+    s.close()    
+
 def test_main():
     if not hasattr(socket, "ssl"):
         raise test_support.TestSkipped("socket module has no ssl support")
     test_rude_shutdown()
     test_basic()
+    test_https_socket()
 
 if __name__ == "__main__":
     test_main()

-- 
Repository URL: http://hg.python.org/jython


More information about the Jython-checkins mailing list