Twisted Perspective Broker: IP del client
« il: Settembre 13, 2011, 14:16 »
Salve, sto scrivendo un piccolo server Twisted con Perspective Broker, devo recuperare l'IP del client. Nel log mi viene correttamente scritto, es:
[codice]2011-09-11 16:41:58+0200 [Broker,0,127.0.0.1] ............[/codice]
Ho provato self.transport.getPeer(), ma il risultato è:
[codice]exceptions.AttributeError: Listner instance has no attribute 'transport'[/codice]
Dalle varie ricerche ho provato anche ad usare mind.broker.transport.getPeer() sfruttando la classe MyRealm, ma senza successo.

Avete qualche suggerimento da darmi?
Grazie, saluti.
Di seguito il codice del server:

[codice]from OpenSSL import SSL
from twisted.internet import reactor, ssl
from ConfigParser import SafeConfigParser
from twisted.python import log
from twisted.spread import pb
from twisted.cred import checkers, portal
from zope.interface import implements
import hashlib

class Listner(pb.Avatar):

   def __init__(self, name):
           self.name = name

   def perspective_getDictionary(self, dictionary):
      print dictionary

   def perspective_simplyAccess(self, access):
      print access

def verifyCallback(connection, x509,  errnum, errdepth, ok):
   if not ok:
      log.msg("Certificato non valido: %s" % x509.get_subject())
      return False
   else:
      log.msg("Connessione stabilita, vertificato valido: %s" %
x509.get_subject())
   return True


class MyRealm:
    implements(portal.IRealm)
    def requestAvatar(self, avatarId, mind, *interfaces):
        if pb.IPerspective not in interfaces:
            raise NotImplementedError
        return pb.IPerspective, Listner(avatarId), lambda:None


if __name__ == "__main__":

       CONFIGURATION = SafeConfigParser()
       CONFIGURATION.read('server.conf')
       PORT = CONFIGURATION.get('general', 'port')
       LOGFILE = CONFIGURATION.get('general', 'log')

        log.startLogging(open(LOGFILE,'a'))


       myContextFactory =
ssl.DefaultOpenSSLContextFactory(CONFIGURATION.get('general',
'keypath'), CONFIGURATION.get('general', 'certpath'))
       ctx = myContextFactory.getContext()
       ctx.set_verify(SSL.VERIFY_PEER |
SSL.VERIFY_FAIL_IF_NO_PEER_CERT, verifyCallback)

       ctx.load_verify_locations(CONFIGURATION.get('general', 'cacert'))

       p = portal.Portal(MyRealm())
       c = checkers.FilePasswordDB('passwords.txt',
caseSensitive=True, cache=True)
       p.registerChecker(c)
       factory = pb.PBServerFactory(p)
       reactor.listenSSL(int(PORT), factory, myContextFactory)
       reactor.run()
[/codice]