The following sample code worked until Twisted began to prefer memory BIOs over 
socket BIOs.  Now it produces this error...

exceptions.AttributeError: 'NoneType' object has no attribute 'getpeername'

...on line 9 where getpeername() is called by the verify() callback.

Is there any way to obtain the peer name, given the OpenSSL.SSL.Connection 
object passed into verify()?  Anything that surfaces the underlying socket?  
(Perhaps something similar to what is done in connectionMade(), which does 
work.)  Or alternatively, is there a way to tell the reactor to employ socket 
BIOs?

Thanks,
Nathan

----------------------------------------------
from OpenSSL import SSL
from twisted.internet import reactor, ssl
from twisted.internet.protocol import ClientFactory
from twisted.protocols.basic import LineReceiver

class VerifyContextFactory(ssl.ClientContextFactory):

    def verify(self, connection, x509, errnum, errdepth, ok):
        print connection.getpeername()[0]
        return ok

    def getContext(self):
        ctx = ssl.ClientContextFactory.getContext(self)
        ctx.set_verify(SSL.VERIFY_PEER|SSL.VERIFY_FAIL_IF_NO_PEER_CERT, 
self.verify)
        return ctx

class MyClient(LineReceiver):

    def connectionMade(self):
        print "connected to", self.transport.socket.getpeername()[0]
        return

    def connectionFailed(self, reason):
        reactor.stop()

    def connectionLost(self, reason):
        reactor.stop()

class MyClientFactory(ClientFactory):

    protocol = MyClient

if __name__ == "__main__":
    reactor.connectSSL('www.example.com', 443, MyClientFactory(), 
VerifyContextFactory())
    reactor.run()


_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to