[Twisted-Python] Strange SSL behaviour.

Voznesensky Vladimir vovic at nfi.kiae.ru
Mon Jun 18 10:49:26 EDT 2007


Dear all!

I have a bug demonstration code.
Blocking SSL works where Twisted one does not.
It is below.
How should I handle this case?
Can anybody tell me what to do with this bug?
I can dig into twisted sources, but I'm not a
twisted specialist, so it could take weeks to
boil them to get the dirt.
Help me, please.

Thank you.
VV

---8<---
from twisted.python.util import println

from twisted.protocols.basic import LineReceiver
from twisted.internet import protocol, reactor, defer, ssl
from twisted.python.failure import Failure
from OpenSSL import crypto, SSL

_CMD="""VERSION=MYPROXYv2
COMMAND=%d
USERNAME=%s
PASSPHRASE=%s
LIFETIME=%d\0""" % (0, "LOGIN", 'PASSPHRASE', 100)
WHERETO = ("myproxy.cern.ch",7512)

## Myproxy client protocol.
class MyproxyClient(protocol.Protocol):

   def connectionMade(self):
     self.transport.write('0') # GT compat. stuff.
     self.transport.write(_CMD)

   def dataReceived(self, data):
     self.transport.loseConnection()

   def connectionLost(self, 
reason=protocol.connectionDone):
     d = self.factory.deferred
     if reason != protocol.connectionDone:
       d.errback(reason)
     else:
       d.callback(data)

## Myproxy client factory.
class MyproxyClientFactory(protocol.ClientFactory):
   protocol = MyproxyClient

   def __init__(self):
     self.deferred = defer.Deferred()

   def clientConnectionFailed(self, connector, reason):
     self.deferred.errback(reason)

## Context factory suitable for local needs.
class CF:
   def getContext(self):
     ctx = SSL.Context(SSL.SSLv3_METHOD)
     # disable for compatibility with myproxy server (er, 
globus)
     # globus doesn't handle this case, apparently, and 
instead
     # chokes in proxy delegation code
     ctx.set_options(0x00000800L)

     return ctx

ctx = CF().getContext()
import socket
conn = SSL.Connection(ctx,socket.socket())
conn.connect(WHERETO)
conn.write('0')
conn.write(_CMD)
dat = conn.recv(8192)
print 'data received by blocking call\n', dat
conn.close()
del ctx

f = MyproxyClientFactory()
contextFactory = CF()
reactor.connectSSL(WHERETO[0], WHERETO[1], f, 
contextFactory)
f.deferred.addCallbacks(
       callback=lambda data:(println("data received", 
data),reactor.stop()),
       errback=lambda error:(println("an error occurred", 
error),reactor.stop()))
reactor.run()
---8<---

Yours,
VV




More information about the Twisted-Python mailing list