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

Source Code for Module ldaptor.protocols.ldap.ldapconnector

  1  from twisted.internet import protocol, defer 
  2  from ldaptor.protocols.ldap import distinguishedname 
  3   
  4  try: 
  5      from twisted.internet.utils import SRVConnector 
  6  except ImportError: 
  7      from twisted.names.srvconnect import SRVConnector 
  8   
9 -class LDAPConnector(SRVConnector):
10 - def __init__(self, reactor, dn, factory, 11 overrides=None, bindAddress=None):
12 if not isinstance(dn, distinguishedname.DistinguishedName): 13 dn = distinguishedname.DistinguishedName(stringValue=dn) 14 if overrides is None: 15 overrides={} 16 self.override = self._findOverRide(dn, overrides) 17 18 domain = dn.getDomainName() 19 SRVConnector.__init__(self, reactor, 20 'ldap', domain, factory, 21 connectFuncKwArgs={'bindAddress': bindAddress})
22
23 - def __getstate__(self):
24 r={} 25 r.update(self.__dict__) 26 r['connector'] = None 27 return r
28
29 - def _findOverRide(self, dn, overrides):
30 while True: 31 if overrides.has_key(dn): 32 return overrides[dn] 33 if dn == '': 34 break 35 dn = dn.up() 36 return None
37
38 - def _isQueryNeeded(self):
39 """Is there both need to do an SRV query.""" 40 if self.override is None: 41 return True 42 43 assert not callable(self.override) 44 overriddenHost, overriddenPort = self.override 45 if overriddenHost is None: 46 return True 47 if overriddenPort is not None: 48 return False 49 return True
50
51 - def connect(self):
52 if callable(self.override): 53 self.override(self.factory) 54 elif not self._isQueryNeeded(): 55 self.factory.doStart() 56 self.factory.startedConnecting(self) 57 self._reallyConnect() 58 else: 59 SRVConnector.connect(self)
60
61 - def pickServer(self):
62 if self.override is None: 63 overriddenHost, overriddenPort = None, None 64 else: 65 overriddenHost, overriddenPort = self.override 66 67 if (overriddenHost is not None 68 and (overriddenPort is not None 69 or self.domain is None)): 70 host = overriddenHost 71 port = overriddenPort 72 else: 73 host, port = SRVConnector.pickServer(self) 74 if overriddenHost is not None: 75 host = overriddenHost 76 if overriddenPort is not None: 77 port = overriddenPort 78 79 try: 80 port = int(port) 81 except ValueError: 82 pass 83 84 assert host is not None 85 if port is None: 86 port = 389 87 return host, port
88
89 -class LDAPClientCreator(protocol.ClientCreator):
90 - def connect(self, dn, overrides=None, bindAddress=None):
91 """Connect to remote host, return Deferred of resulting protocol instance.""" 92 d = defer.Deferred() 93 f = protocol._InstanceFactory(self.reactor, self.protocolClass(*self.args, **self.kwargs), d) 94 c = LDAPConnector(self.reactor, dn, f, overrides=overrides, 95 bindAddress=bindAddress) 96 c.connect() 97 return d
98
99 - def connectAnonymously(self, dn, overrides=None):
100 """Connect to remote host and bind anonymously, return Deferred of resulting protocol instance.""" 101 d = self.connect(dn, overrides=overrides) 102 103 def _bind(proto): 104 d=proto.bind() 105 d.addCallback(lambda _: proto) 106 return d
107 d.addCallback(_bind) 108 return d
109