[CalendarServer-changes] [8234] CalendarServer/trunk/twistedcaldav/directory

source_changes at macosforge.org source_changes at macosforge.org
Thu Oct 27 15:32:39 PDT 2011


Revision: 8234
          http://trac.macosforge.org/projects/calendarserver/changeset/8234
Author:   sagen at apple.com
Date:     2011-10-27 15:32:39 -0700 (Thu, 27 Oct 2011)
Log Message:
-----------
LDAP DNs should be considered case insensitive, so lowercase them when comparing.

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/directory/ldapdirectory.py
    CalendarServer/trunk/twistedcaldav/directory/test/test_ldapdirectory.py

Modified: CalendarServer/trunk/twistedcaldav/directory/ldapdirectory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/ldapdirectory.py	2011-10-27 21:37:35 UTC (rev 8233)
+++ CalendarServer/trunk/twistedcaldav/directory/ldapdirectory.py	2011-10-27 22:32:39 UTC (rev 8234)
@@ -257,7 +257,7 @@
         self.typeDNs = {}
         for recordType in self.recordTypes():
             self.typeDNs[recordType] = ldap.dn.str2dn(
-                self.rdnSchema[recordType]["rdn"]
+                self.rdnSchema[recordType]["rdn"].lower()
             ) + self.base
 
         # Create LDAP connection
@@ -1034,12 +1034,16 @@
 
         returnValue(recordsByAlias.values())
 
-    def recordTypeForDN(self, dn):
+    def recordTypeForDN(self, dnStr):
         """
-        Examine a dn to determine which recordType it belongs to
+        Examine a DN to determine which recordType it belongs to
+        @param dn: DN to compare
+        @type dn: string
+        @return: recordType string, or None if no match
         """
+        dn = ldap.dn.str2dn(dnStr.lower())
         for recordType in self.recordTypes():
-            base = self.typeDNs[recordType]
+            base = self.typeDNs[recordType] # already lowercase
             if dnContainedIn(dn, base):
                 return recordType
         return None
@@ -1191,7 +1195,7 @@
 
                 dn, attrs = result.pop()
                 self.log_debug("Retrieved: %s %s" % (dn,attrs))
-                recordType = self.service.recordTypeForDN(ldap.dn.str2dn(dn))
+                recordType = self.service.recordTypeForDN(dn)
                 if recordType is None:
                     self.log_error("Unable to map %s to a record type" % (dn,))
                     continue

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_ldapdirectory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_ldapdirectory.py	2011-10-27 21:37:35 UTC (rev 8233)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_ldapdirectory.py	2011-10-27 22:32:39 UTC (rev 8234)
@@ -24,6 +24,7 @@
     from twistedcaldav.directory import calendaruserproxy
     from twistedcaldav.directory.directory import GroupMembershipCache, GroupMembershipCacheUpdater
     from twisted.internet.defer import inlineCallbacks
+    import ldap
 except ImportError:
     print "Skipping because ldap module not installed"
 else:
@@ -152,7 +153,7 @@
                     "base": "dc=example,dc=com",
                     "guidAttr": "apple-generateduid",
                     "users": {
-                        "rdn": "cn=users",
+                        "rdn": "cn=Users",
                         "attr": "uid", # used only to synthesize email address
                         "emailSuffix": None, # used only to synthesize email address
                         "filter": "(objectClass=apple-user)", # additional filter for this type
@@ -169,7 +170,7 @@
                         },
                     },
                     "groups": {
-                        "rdn": "cn=groups",
+                        "rdn": "cn=Groups",
                         "attr": "cn", # used only to synthesize email address
                         "emailSuffix": None, # used only to synthesize email address
                         "filter": "(objectClass=apple-group)", # additional filter for this type
@@ -182,7 +183,7 @@
                         },
                     },
                     "locations": {
-                        "rdn": "cn=places",
+                        "rdn": "cn=Places",
                         "attr": "cn", # used only to synthesize email address
                         "emailSuffix": None, # used only to synthesize email address
                         "filter": "(objectClass=apple-resource)", # additional filter for this type
@@ -197,7 +198,7 @@
                         },
                     },
                     "resources": {
-                        "rdn": "cn=resources",
+                        "rdn": "cn=Resources",
                         "attr": "cn", # used only to synthesize email address
                         "emailSuffix": None, # used only to synthesize email address
                         "filter": "(objectClass=apple-resource)", # additional filter for this type
@@ -634,3 +635,26 @@
             # Empty
             results = list(splitIntoBatches(set([]), 5)) # empty data
             self.assertEquals(results, [set([])])
+
+        def test_recordTypeForDN(self):
+            # Ensure dn comparison is case insensitive and ignores extra
+            # whitespace
+
+            # Base DNs for each recordtype should already be lowercase
+            for dn in self.service.typeDNs.itervalues():
+                dnStr = ldap.dn.dn2str(dn)
+                self.assertEquals(dnStr, dnStr.lower())
+
+            # Match
+            dnStr = "uid=foo,cn=USers ,dc=EXAMple,dc=com"
+            self.assertEquals(self.service.recordTypeForDN(dnStr), "users")
+            dnStr = "uid=foo,cn=PLaces,dc=EXAMple,dc=com"
+            self.assertEquals(self.service.recordTypeForDN(dnStr), "locations")
+            dnStr = "uid=foo,cn=Groups  ,dc=EXAMple,dc=com"
+            self.assertEquals(self.service.recordTypeForDN(dnStr), "groups")
+            dnStr = "uid=foo,cn=Resources  ,dc=EXAMple,dc=com"
+            self.assertEquals(self.service.recordTypeForDN(dnStr), "resources")
+
+            # No Match
+            dnStr = "uid=foo,cn=US ers ,dc=EXAMple,dc=com"
+            self.assertEquals(self.service.recordTypeForDN(dnStr), None)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20111027/cdd2ceaa/attachment-0001.html>


More information about the calendarserver-changes mailing list