[CalendarServer-changes] [14114] twext/trunk/twext/who/ldap

source_changes at macosforge.org source_changes at macosforge.org
Tue Oct 28 11:07:22 PDT 2014


Revision: 14114
          http://trac.calendarserver.org//changeset/14114
Author:   sagen at apple.com
Date:     2014-10-28 11:07:22 -0700 (Tue, 28 Oct 2014)
Log Message:
-----------
Support per recordType filters; work with new mockldap

Modified Paths:
--------------
    twext/trunk/twext/who/ldap/_service.py
    twext/trunk/twext/who/ldap/test/test_service.py

Modified: twext/trunk/twext/who/ldap/_service.py
===================================================================
--- twext/trunk/twext/who/ldap/_service.py	2014-10-28 15:26:59 UTC (rev 14113)
+++ twext/trunk/twext/who/ldap/_service.py	2014-10-28 18:07:22 UTC (rev 14114)
@@ -229,7 +229,7 @@
         useTLS=False,
         fieldNameToAttributesMap=DEFAULT_FIELDNAME_ATTRIBUTE_MAP,
         recordTypeSchemas=DEFAULT_RECORDTYPE_SCHEMAS,
-        extraFilter=None,
+        extraFilters=None,
         ownThreadpool=True,
         threadPoolMax=10,
         connectionMax=10,
@@ -267,9 +267,9 @@
         @type recordTypeSchemas: mapping from L{NamedConstant} to
             L{RecordTypeSchema}
 
-        @param extraFilter: An extra filter fragment to AND in to any generated
-            queries.
-        @type extraFilter: L{unicode}
+        @param extraFilters: A dict (keyed off recordType) of extra filter
+            fragments to AND in to any generated queries.
+        @type extraFilters: L{dicts} of L{unicode}
 
         """
 
@@ -277,7 +277,7 @@
         self._baseDN = baseDN
         self._credentials = credentials
         self._timeout = timeout
-        self._extraFilter = extraFilter
+        self._extraFilters = extraFilters
 
         if tlsCACertificateFile is None:
             self._tlsCACertificateFile = None
@@ -587,10 +587,10 @@
         )
 
 
-    def _addExtraFilter(self, queryString):
-        if self._extraFilter:
+    def _addExtraFilter(self, recordType, queryString):
+        if self._extraFilters and self._extraFilters.get(recordType, ""):
             queryString = "(&{extra}{query})".format(
-                extra=self._extraFilter, query=queryString
+                extra=self._extraFilters[recordType], query=queryString
             )
         return queryString
 
@@ -603,8 +603,6 @@
         This method is always called in a thread.
         """
 
-        queryString = self._addExtraFilter(queryString)
-
         records = []
 
         with DirectoryService.Connection(self) as connection:
@@ -629,10 +627,11 @@
                     ldap.dn.str2dn(rdn.lower()) +
                     ldap.dn.str2dn(self._baseDN.lower())
                 )
+                filteredQuery=self._addExtraFilter(recordType, queryString)
                 self.log.debug(
                     "Performing LDAP query: {rdn} {query} {recordType}{limit}{timeout}",
                     rdn=rdn,
-                    query=queryString,
+                    query=filteredQuery,
                     recordType=recordType,
                     limit=" limit={}".format(limitResults) if limitResults else "",
                     timeout=" timeout={}".format(timeoutSeconds) if timeoutSeconds else "",
@@ -642,7 +641,7 @@
                     s.startSearch(
                         ldap.dn.dn2str(rdn),
                         ldap.SCOPE_SUBTREE,
-                        queryString,
+                        filteredQuery,
                         attrList=self._attributesToFetch,
                         timeout=timeoutSeconds if timeoutSeconds else -1,
                         sizelimit=limitResults if limitResults else 0

Modified: twext/trunk/twext/who/ldap/test/test_service.py
===================================================================
--- twext/trunk/twext/who/ldap/test/test_service.py	2014-10-28 15:26:59 UTC (rev 14113)
+++ twext/trunk/twext/who/ldap/test/test_service.py	2014-10-28 18:07:22 UTC (rev 14114)
@@ -443,22 +443,28 @@
         self.assertEquals(repr(service), u"<TestService u'ldap://localhost/'>")
 
 
-class ExtraFilterTest(BaseTestCase, unittest.TestCase):
+class ExtraFiltersTest(BaseTestCase, unittest.TestCase):
 
-    def test_extra(self):
-        service = self.service(extraFilter="(foo=1)")
+    def test_extraFilters(self):
+        extraFilters = {
+            RecordType.user: "(foo=1)",
+        }
+        service = self.service(extraFilters=extraFilters)
         self.assertEquals(
             "(&(foo=1)(bar=2))",
-            service._addExtraFilter("(bar=2)")
+            service._addExtraFilter(RecordType.user, "(bar=2)")
         )
+        self.assertEquals(
+            "(bar=2)",
+            service._addExtraFilter(RecordType.group, "(bar=2)")
+        )
 
-        service = self.service(extraFilter=None)
+        service = self.service(extraFilters=None)
         self.assertEquals(
             "(bar=2)",
-            service._addExtraFilter("(bar=2)")
+            service._addExtraFilter(RecordType.group, "(bar=2)")
         )
 
-
 class RecordsFromReplyTest(BaseTestCase, unittest.TestCase):
 
     def test_boolean(self):
@@ -548,6 +554,11 @@
             return schema.attributes
 
         else:
+
+            # mockldap requires data in this structure: {dn: {attr: [values]}}
+            if not isinstance(fieldValue, (tuple, list)):
+                fieldValue = [fieldValue]
+
             # Question: why convert to unicode?  We get utf-8 encoded strings
             # back from a real LDAP server, don't we?
             value = toUnicode(fieldValue)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20141028/4b8492f8/attachment-0001.html>


More information about the calendarserver-changes mailing list