Greetings,

We use DNS in our Active Directory domain, so we get some extra results in 
a search:

  [(None, 
['ldap://ForestDnsZones.domain.com/DC=ForestDnsZones,DC=domain,DC=com']),
   (None, 
['ldap://DomainDnsZones.domain.com/DC=DomainDnsZones,DC=ttsd,DC=ttsd,DC=k12,DC=or,DC=us']),
   (None, ['ldap://domain.com/CN=Configuration,DC=domain,DC=com'])]

When a search is made at login for the account, the value of result ends up 
being a list rather than a dictionary with the value of sAMAccountName.

The following patch does a simple test of the type and returns False if it 
is not a dict. I tried to attach the patch file to this message, but got a 
communication error.

--- gluon/contrib/login_methods/ldap_auth.py.org        2011-10-28 
12:26:01.000000000 -0700
+++ gluon/contrib/login_methods/ldap_auth.py    2011-10-28 
14:42:34.000000000 -0700
@@ -97,6 +97,12 @@
                 result = con.search_ext_s(
                     ldap_basedn, ldap.SCOPE_SUBTREE,
                     "(&(sAMAccountName=%s)(%s))" % (username_bare, 
filterstr), ["sAMAccountName"])[0][1]
+                # In cases where ForestDnsZones and DomainDnsZones are 
found,
+                # result will look like the following:
+                #     
['ldap://ForestDnsZones.domain.com/DC=ForestDnsZones,DC=domain,DC=com']
+                if not isinstance(result, dict):
+                    # result should be a dict in the form 
{'sAMAccountName': [username_bare]}
+                    return False
                 if ldap_binddn:
                     # We know the user exists & is in the correct OU
                     # so now we just check the password


As an aside, I am really enjoying web2py.

Carlos Hanson

Reply via email to