gdata.tlslite.integration.TLSTwistedProtocolWrapper | index /usr/local/google/home/afshar/src/external-gdata-release/google3/src/gdata/tlslite/integration/TLSTwistedProtocolWrapper.py

`TLS Lite + Twisted.`

Modules
`` |  |
errno | socket |  |

Classes
`` |  | gdata.tlslite.integration.AsyncStateMachine.AsyncStateMachine TLSTwistedProtocolWrapper(twisted.protocols.policies.ProtocolWrapper, gdata.tlslite.integration.AsyncStateMachine.AsyncStateMachine) twisted.protocols.policies.ProtocolWrapper(twisted.internet.protocol.Protocol) TLSTwistedProtocolWrapper(twisted.protocols.policies.ProtocolWrapper, gdata.tlslite.integration.AsyncStateMachine.AsyncStateMachine)
class TLSTwistedProtocolWrapper(twisted.protocols.policies.ProtocolWrapper, gdata.tlslite.integration.AsyncStateMachine.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 - out(Connect|Close|Read)Event - ProtocolWrapper.(connectionMade|loseConnection|dataReceived) - self.(loseConnection|write|writeSequence) - AsyncStateMachine.(setCloseOp|setWriteOp)`
| Method resolution order: TLSTwistedProtocolWrapper twisted.protocols.policies.ProtocolWrapper twisted.internet.protocol.Protocol twisted.internet.protocol.BaseProtocol gdata.tlslite.integration.AsyncStateMachine.AsyncStateMachine Methods defined here: __init__(self, factory, wrappedProtocol) connectionLost(self, reason) connectionMade(self) dataReceived(self, data) loseConnection(self) outCloseEvent(self) outConnectEvent(self) outReadEvent(self, data) setServerHandshakeOp(self, **args) write(self, data) writeSequence(self, seq) Methods inherited from twisted.protocols.policies.ProtocolWrapper: __getattr__(self, name) getHost(self) getPeer(self) logPrefix(self) `Use a customized log prefix mentioning both the wrapped protocol and the current one.` makeConnection(self, transport) `When a connection is made, register this wrapper with its factory, save the real transport, and connect the wrapped protocol to this L{ProtocolWrapper} to intercept any transport calls it makes.` registerProducer(self, producer, streaming) stopConsuming(self) unregisterProducer(self) Data and other attributes inherited from twisted.protocols.policies.ProtocolWrapper: disconnecting = 0 Methods inherited from twisted.internet.protocol.Protocol: __provides__ `Special descriptor for class __provides__ The descriptor caches the implementedBy info, so that we can get declarations for objects without instance-specific interfaces a bit quicker. For example: >>> from zope.interface import Interface >>> class IFooFactory(Interface): ... pass >>> class IFoo(Interface): ... pass >>> class C(object): ... implements(IFoo) ... classProvides(IFooFactory) >>> [i.getName() for i in C.__provides__] ['IFooFactory'] >>> [i.getName() for i in C().__provides__] ['IFoo']` Data and other attributes inherited from twisted.internet.protocol.Protocol: __implemented__ = <implementedBy twisted.internet.protocol.Protocol> Methods inherited from twisted.internet.protocol.BaseProtocol: __providedBy__ = <zope.interface.declarations.Declaration object> Data and other attributes inherited from twisted.internet.protocol.BaseProtocol: connected = 0 transport = None Methods inherited from gdata.tlslite.integration.AsyncStateMachine.AsyncStateMachine: inReadEvent(self) `Tell the state machine it can read from the socket.` inWriteEvent(self) `Tell the state machine it can write to the socket.` outWriteEvent(self) `Called when a write operation completes. May be overridden in subclass.` setCloseOp(self) `Start a close operation.` setHandshakeOp(self, handshaker) `Start a handshake operation. @type handshaker: generator @param handshaker: A generator created by using one of the asynchronous handshake functions (i.e. handshakeServerAsync, or handshakeClientxxx(..., async=True).` setWriteOp(self, writeBuffer) `Start a write operation. @type writeBuffer: str @param writeBuffer: The string to transmit.` wantsReadEvent(self) `If the state machine wants to read. If an operation is active, this returns whether or not the operation wants to read from the socket. If an operation is not active, this returns None. @rtype: bool or None @return: If the state machine wants to read.` wantsWriteEvent(self) `If the state machine wants to write. If an operation is active, this returns whether or not the operation wants to write to the socket. If an operation is not active, this returns None. @rtype: bool or None @return: If the state machine wants to write.`