Package ldaptor :: Module checkers
[hide private]
[frames] | no frames]

Source Code for Module ldaptor.checkers

 1  from zope.interface import implements 
 2  from twisted.cred import checkers, credentials, error 
 3  from twisted.internet import reactor 
 4  from twisted.python import failure 
 5  from ldaptor import ldapfilter, config 
 6  from ldaptor.protocols.ldap import ldapconnector, ldapclient, ldapsyntax, ldaperrors 
 7   
8 -def makeFilter(name, template=None):
9 filter=None 10 try: 11 filter=ldapfilter.parseFilter(name) 12 except ldapfilter.InvalidLDAPFilter: 13 try: 14 filter=ldapfilter.parseFilter('('+name+')') 15 except ldapfilter.InvalidLDAPFilter: 16 if template is not None: 17 try: 18 filter=ldapfilter.parseFilter(template % {'name':name}) 19 except ldapfilter.InvalidLDAPFilter: 20 pass 21 return filter
22
23 -class LDAPBindingChecker:
24 """ 25 26 The avatarID returned is an LDAPEntry. 27 28 """ 29 30 implements(checkers.ICredentialsChecker) 31 credentialInterfaces = (credentials.IUsernamePassword,) 32
33 - def __init__(self, cfg):
34 self.config = cfg
35
36 - def _valid(self, result, entry):
37 matchedDN, serverSaslCreds = result 38 return entry
39
40 - def _found(self, results, credentials):
41 if not results: 42 return failure.Failure(error.UnauthorizedLogin('TODO 1')) 43 assert len(results)==1 44 entry = results[0] 45 d = entry.client.bind(str(entry.dn), credentials.password) 46 d.addCallback(self._valid, entry) 47 return d
48
49 - def _connected(self, client, filt, credentials):
50 base = ldapsyntax.LDAPEntry(client, self.config.getIdentityBaseDN()) 51 d = base.search(filterObject=filt, 52 sizeLimit=1, 53 attributes=[''], # TODO no attributes 54 ) 55 d.addCallback(self._found, credentials) 56 return d
57
58 - def requestAvatarId(self, credentials):
59 try: 60 baseDN = self.config.getIdentityBaseDN() 61 except config.MissingBaseDNError, e: 62 return failure.Failure(error.UnauthorizedLogin("Disabled due configuration error: %s." % e)) 63 if not credentials.username: 64 return failure.Failure(error.UnauthorizedLogin("I don't support anonymous")) 65 filtText = self.config.getIdentitySearch(credentials.username) 66 try: 67 filt = ldapfilter.parseFilter(filtText) 68 except ldapfilter.InvalidLDAPFilter: 69 return failure.Failure(error.UnauthorizedLogin("Couldn't create filter")) 70 71 c = ldapconnector.LDAPClientCreator(reactor, ldapclient.LDAPClient) 72 d = c.connect(baseDN, self.config.getServiceLocationOverrides()) 73 d.addCallback(self._connected, filt, credentials) 74 def _err(reason): 75 reason.trap(ldaperrors.LDAPInvalidCredentials, 76 77 # this happens with slapd 2.1.30 when binding 78 # with DN but no password 79 ldaperrors.LDAPUnwillingToPerform) 80 return failure.Failure(error.UnauthorizedLogin())
81 d.addErrback(_err) 82 return d
83