Package ldaptor :: Package protocols :: Package ldap :: Module proxy
[hide private]
[frames] | no frames]

Source Code for Module ldaptor.protocols.ldap.proxy

  1  """LDAP protocol proxy server""" 
  2   
  3  from twisted.internet import reactor, defer 
  4  from ldaptor.protocols.ldap import ldapserver, ldapconnector, ldapclient 
  5  from ldaptor.protocols import pureldap 
  6   
7 -class Proxy(ldapserver.BaseLDAPServer):
8 protocol = ldapclient.LDAPClient 9 10 client = None 11 waitingConnect = [] 12 unbound = False 13
14 - def __init__(self, config):
15 """ 16 Initialize the object. 17 18 @param config: The configuration. 19 @type config: ldaptor.interfaces.ILDAPConfig 20 """ 21 ldapserver.BaseLDAPServer.__init__(self) 22 self.config = config
23
24 - def _whenConnected(self, fn, *a, **kw):
25 if self.client is None: 26 d = defer.Deferred() 27 self.waitingConnect.append((d, fn, a, kw)) 28 return d 29 else: 30 return defer.maybeDeferred(fn, *a, **kw)
31
32 - def _cbConnectionMade(self, proto):
33 self.client = proto 34 while self.waitingConnect: 35 d, fn, a, kw = self.waitingConnect.pop(0) 36 d2 = defer.maybeDeferred(fn, *a, **kw) 37 d2.chainDeferred(d)
38
39 - def _clientQueue(self, request, controls, reply):
40 # TODO controls 41 if request.needs_answer: 42 d = self.client.send_multiResponse(request, self._gotResponse, reply) 43 # TODO handle d errbacks 44 else: 45 self.client.send_noResponse(request)
46
47 - def _gotResponse(self, response, reply):
48 reply(response) 49 50 # TODO this is ugly 51 return isinstance(response, ( 52 pureldap.LDAPSearchResultDone, 53 pureldap.LDAPBindResponse, 54 ))
55
56 - def _failConnection(self, reason):
57 #TODO self.loseConnection() 58 return reason # TODO
59
60 - def connectionMade(self):
61 clientCreator = ldapconnector.LDAPClientCreator( 62 reactor, self.protocol) 63 d = clientCreator.connect( 64 dn='', 65 overrides=self.config.getServiceLocationOverrides()) 66 d.addCallback(self._cbConnectionMade) 67 d.addErrback(self._failConnection) 68 69 ldapserver.BaseLDAPServer.connectionMade(self)
70
71 - def connectionLost(self, reason):
72 assert self.client is not None 73 if self.client.connected: 74 if not self.unbound: 75 self.client.unbind() 76 self.unbound = True 77 else: 78 self.client.transport.loseConnection() 79 self.client = None 80 ldapserver.BaseLDAPServer.connectionLost(self, reason)
81
82 - def _handleUnknown(self, request, controls, reply):
83 self._whenConnected(self._clientQueue, request, controls, reply) 84 return None
85
86 - def handleUnknown(self, request, controls, reply):
87 d = defer.succeed(request) 88 d.addCallback(self._handleUnknown, controls, reply) 89 return d
90
91 - def handle_LDAPUnbindRequest(self, request, controls, reply):
92 self.unbound = True 93 self.handleUnknown(request, controls, reply)
94 95 if __name__ == '__main__': 96 """ 97 Demonstration LDAP proxy; passes all requests to localhost:389. 98 """ 99 from twisted.internet import protocol 100 from twisted.python import log 101 import sys 102 log.startLogging(sys.stderr) 103 104 factory = protocol.ServerFactory() 105 factory.protocol = lambda : Proxy(overrides={ 106 '': ('localhost', 389), 107 }) 108 reactor.listenTCP(10389, factory) 109 reactor.run() 110