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.