Index: third_party/tlslite/tlslite/integration/TLSTwistedProtocolWrapper.py |
diff --git a/third_party/tlslite/tlslite/integration/TLSTwistedProtocolWrapper.py b/third_party/tlslite/tlslite/integration/TLSTwistedProtocolWrapper.py |
deleted file mode 100644 |
index 0a83d376fe95a05e9ff5a5fd82e9a45b2a6a2dd5..0000000000000000000000000000000000000000 |
--- a/third_party/tlslite/tlslite/integration/TLSTwistedProtocolWrapper.py |
+++ /dev/null |
@@ -1,196 +0,0 @@ |
-"""TLS Lite + Twisted.""" |
- |
-from twisted.protocols.policies import ProtocolWrapper, WrappingFactory |
-from twisted.python.failure import Failure |
- |
-from asyncstatemachine import AsyncStateMachine |
-from tlslite.tlsconnection import TLSConnection |
-from tlslite.errors import * |
- |
-import socket |
-import errno |
- |
- |
-#The TLSConnection is created around a "fake socket" that |
-#plugs it into the underlying Twisted transport |
-class _FakeSocket: |
- def __init__(self, wrapper): |
- self.wrapper = wrapper |
- self.data = "" |
- |
- def send(self, data): |
- ProtocolWrapper.write(self.wrapper, data) |
- return len(data) |
- |
- def recv(self, numBytes): |
- if self.data == "": |
- raise socket.error, (errno.EWOULDBLOCK, "") |
- returnData = self.data[:numBytes] |
- self.data = self.data[numBytes:] |
- return returnData |
- |
-class TLSTwistedProtocolWrapper(ProtocolWrapper, AsyncStateMachine): |
- """This class can wrap Twisted protocols to add TLS support. |
- |
- Below is a complete example of using TLS Lite with a Twisted echo |
- server. |
- |
- There are two server implementations below. Echo is the original |
- protocol, which is oblivious to TLS. Echo1 subclasses Echo and |
- negotiates TLS when the client connects. Echo2 subclasses Echo and |
- negotiates TLS when the client sends "STARTTLS":: |
- |
- from twisted.internet.protocol import Protocol, Factory |
- from twisted.internet import reactor |
- from twisted.protocols.policies import WrappingFactory |
- from twisted.protocols.basic import LineReceiver |
- from twisted.python import log |
- from twisted.python.failure import Failure |
- import sys |
- from tlslite.api import * |
- |
- s = open("./serverX509Cert.pem").read() |
- x509 = X509() |
- x509.parse(s) |
- certChain = X509CertChain([x509]) |
- |
- s = open("./serverX509Key.pem").read() |
- privateKey = parsePEMKey(s, private=True) |
- |
- verifierDB = VerifierDB("verifierDB") |
- verifierDB.open() |
- |
- class Echo(LineReceiver): |
- def connectionMade(self): |
- self.transport.write("Welcome to the echo server!\\r\\n") |
- |
- def lineReceived(self, line): |
- self.transport.write(line + "\\r\\n") |
- |
- class Echo1(Echo): |
- def connectionMade(self): |
- if not self.transport.tlsStarted: |
- self.transport.setServerHandshakeOp(certChain=certChain, |
- privateKey=privateKey, |
- verifierDB=verifierDB) |
- else: |
- Echo.connectionMade(self) |
- |
- def connectionLost(self, reason): |
- pass #Handle any TLS exceptions here |
- |
- class Echo2(Echo): |
- def lineReceived(self, data): |
- if data == "STARTTLS": |
- self.transport.setServerHandshakeOp(certChain=certChain, |
- privateKey=privateKey, |
- verifierDB=verifierDB) |
- else: |
- Echo.lineReceived(self, data) |
- |
- def connectionLost(self, reason): |
- pass #Handle any TLS exceptions here |
- |
- factory = Factory() |
- factory.protocol = Echo1 |
- #factory.protocol = Echo2 |
- |
- wrappingFactory = WrappingFactory(factory) |
- wrappingFactory.protocol = TLSTwistedProtocolWrapper |
- |
- log.startLogging(sys.stdout) |
- reactor.listenTCP(1079, wrappingFactory) |
- reactor.run() |
- |
- This class works as follows: |
- |
- Data comes in and is given to the AsyncStateMachine for handling. |
- AsyncStateMachine will forward events to this class, and we'll |
- pass them on to the ProtocolHandler, which will proxy them to the |
- wrapped protocol. The wrapped protocol may then call back into |
- this class, and these calls will be proxied into the |
- AsyncStateMachine. |
- |
- The call graph looks like this: |
- - self.dataReceived |
- - AsyncStateMachine.inReadEvent |
- - self.out(Connect|Close|Read)Event |
- - ProtocolWrapper.(connectionMade|loseConnection|dataReceived) |
- - self.(loseConnection|write|writeSequence) |
- - AsyncStateMachine.(setCloseOp|setWriteOp) |
- """ |
- |
- #WARNING: IF YOU COPY-AND-PASTE THE ABOVE CODE, BE SURE TO REMOVE |
- #THE EXTRA ESCAPING AROUND "\\r\\n" |
- |
- def __init__(self, factory, wrappedProtocol): |
- ProtocolWrapper.__init__(self, factory, wrappedProtocol) |
- AsyncStateMachine.__init__(self) |
- self.fakeSocket = _FakeSocket(self) |
- self.tlsConnection = TLSConnection(self.fakeSocket) |
- self.tlsStarted = False |
- self.connectionLostCalled = False |
- |
- def connectionMade(self): |
- try: |
- ProtocolWrapper.connectionMade(self) |
- except TLSError, e: |
- self.connectionLost(Failure(e)) |
- ProtocolWrapper.loseConnection(self) |
- |
- def dataReceived(self, data): |
- try: |
- if not self.tlsStarted: |
- ProtocolWrapper.dataReceived(self, data) |
- else: |
- self.fakeSocket.data += data |
- while self.fakeSocket.data: |
- AsyncStateMachine.inReadEvent(self) |
- except TLSError, e: |
- self.connectionLost(Failure(e)) |
- ProtocolWrapper.loseConnection(self) |
- |
- def connectionLost(self, reason): |
- if not self.connectionLostCalled: |
- ProtocolWrapper.connectionLost(self, reason) |
- self.connectionLostCalled = True |
- |
- |
- def outConnectEvent(self): |
- ProtocolWrapper.connectionMade(self) |
- |
- def outCloseEvent(self): |
- ProtocolWrapper.loseConnection(self) |
- |
- def outReadEvent(self, data): |
- if data == "": |
- ProtocolWrapper.loseConnection(self) |
- else: |
- ProtocolWrapper.dataReceived(self, data) |
- |
- |
- def setServerHandshakeOp(self, **args): |
- self.tlsStarted = True |
- AsyncStateMachine.setServerHandshakeOp(self, **args) |
- |
- def loseConnection(self): |
- if not self.tlsStarted: |
- ProtocolWrapper.loseConnection(self) |
- else: |
- AsyncStateMachine.setCloseOp(self) |
- |
- def write(self, data): |
- if not self.tlsStarted: |
- ProtocolWrapper.write(self, data) |
- else: |
- #Because of the FakeSocket, write operations are guaranteed to |
- #terminate immediately. |
- AsyncStateMachine.setWriteOp(self, data) |
- |
- def writeSequence(self, seq): |
- if not self.tlsStarted: |
- ProtocolWrapper.writeSequence(self, seq) |
- else: |
- #Because of the FakeSocket, write operations are guaranteed to |
- #terminate immediately. |
- AsyncStateMachine.setWriteOp(self, "".join(seq)) |