Author: dmeyer
Date: Tue Mar  4 15:09:52 2008
New Revision: 3156

Log:
fix tls

Modified:
   trunk/base/src/net/tls.py

Modified: trunk/base/src/net/tls.py
==============================================================================
--- trunk/base/src/net/tls.py   (original)
+++ trunk/base/src/net/tls.py   Tue Mar  4 15:09:52 2008
@@ -28,6 +28,9 @@
 #
 # -----------------------------------------------------------------------------
 
+# python imports
+import logging
+
 # import some classes to the namespace of this module
 from tlslite.api import X509, X509CertChain, parsePEMKey, Session
 
@@ -37,6 +40,15 @@
 # kaa imports
 import kaa
 
+# exceptions from tlslite
+TLSAbruptCloseError = tlslite.api.TLSAbruptCloseError
+TLSLocalAlert = tlslite.api.TLSLocalAlert
+TLSRemoteAlert = tlslite.api.TLSRemoteAlert
+
+# get logging object
+log = logging.getLogger('tls')
+
+
 class TLSConnection(tlslite.api.TLSConnection):
     """
     This class wraps a socket and provides TLS handshaking and data transfer.
@@ -98,7 +110,7 @@
     def __init__(self):
         kaa.Socket.__init__(self)
         self.signals['tls'] = kaa.Signal()
-
+        self._handshake = False
 
     def _accept(self):
         """
@@ -128,6 +140,21 @@
         if not self._rmon.active():
             self._rmon.register(self._socket.fileno(), kaa.IO_READ)
 
+    def write(self, data):
+        if self._handshake:
+            # do not send data while doing a handshake
+            return self._write_buffer.append(data)
+        return super(TlsSocket, self).write(data)
+        
+    def _handle_read(self):
+        try:
+            return super(TlsSocket, self)._handle_read()
+        except TLSAbruptCloseError, e:
+            log.error('TLSAbruptCloseError')
+            self._read_signal.emit(None)
+            self._readline_signal.emit(None)
+            return self.close(immediate=True, expected=False)
+
     @kaa.coroutine()
     def starttls_client(self, session=None):
         """
@@ -135,15 +162,18 @@
         Note: this function DOES NOT check the server key based on the
         key chain yet.
         """
-        if session is None:
-            session = Session()
-        c = TLSConnection(self._socket)
-        self._rmon.unregister()
-        yield c.handshakeClientCert(session=session)
-        self._socket = c
-        self.signals['tls'].emit()
-        self._rmon.register(self._socket.fileno(), kaa.IO_READ)
-
+        try:
+            self._handshake = True
+            if session is None:
+                session = Session()
+            c = TLSConnection(self._socket)
+            self._rmon.unregister()
+            yield c.handshakeClientCert(session=session)
+            self._socket = c
+            self.signals['tls'].emit()
+            self._rmon.register(self._socket.fileno(), kaa.IO_READ)
+        finally:
+            self._handshake = False
 
     @kaa.coroutine()
     def starttls_server(self, key, cert_chain, client_cert=None):
@@ -151,14 +181,17 @@
         Start a certificate-based handshake in the role of a TLS server.
         Note: this function DOES NOT check the client key if requested.
         """
-        c = TLSConnection(self._socket)
-        self._rmon.unregister()
-       yield c.handshakeServer(
-            privateKey=key, certChain=cert_chain, reqCert=client_cert)
-        self._socket = c
-        self.signals['tls'].emit()
-        self._rmon.register(self._socket.fileno(), kaa.IO_READ)
-
+        try:
+            self._handshake = True
+            c = TLSConnection(self._socket)
+            self._rmon.unregister()
+            yield c.handshakeServer(
+                privateKey=key, certChain=cert_chain, reqCert=client_cert)
+            self._socket = c
+            self.signals['tls'].emit()
+            self._rmon.register(self._socket.fileno(), kaa.IO_READ)
+        finally:
+            self._handshake = False
 
 def loadkey(filename, private=False):
     """

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to