[CalendarServer-changes] [8995] CalendarServer/branches/users/gaya/ldapdirectorybacker

source_changes at macosforge.org source_changes at macosforge.org
Fri Apr 6 16:07:07 PDT 2012


Revision: 8995
          http://trac.macosforge.org/projects/calendarserver/changeset/8995
Author:   gaya at apple.com
Date:     2012-04-06 16:07:06 -0700 (Fri, 06 Apr 2012)
Log Message:
-----------
add searchAttributes to limit od search query

Modified Paths:
--------------
    CalendarServer/branches/users/gaya/ldapdirectorybacker/conf/carddav-odtest.plist
    CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/ldapdirectorybacker.py
    CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/opendirectorybacker.py
    CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/stdconfig.py

Modified: CalendarServer/branches/users/gaya/ldapdirectorybacker/conf/carddav-odtest.plist
===================================================================
--- CalendarServer/branches/users/gaya/ldapdirectorybacker/conf/carddav-odtest.plist	2012-04-06 19:47:21 UTC (rev 8994)
+++ CalendarServer/branches/users/gaya/ldapdirectorybacker/conf/carddav-odtest.plist	2012-04-06 23:07:06 UTC (rev 8995)
@@ -1057,7 +1057,7 @@
           </array>
           -->
           <!-- add this key to limit directory service attributes used to make vCard properties
-          		When using directory service templates, list should include only mapped attributes.
+                  When using directory service templates, list should include only mapped attributes.
           <key>allowedAttributes</key>
           <array>
             <string>dsAttrTypeStandard:AddressLine1</string>
@@ -1103,7 +1103,26 @@
             <string>dsAttrTypeStandard:UserPKCS12Data</string>
             <string>dsAttrTypeStandard:UserSMIMECertificate</string>
             <string>dsAttrTypeStandard:WeblogURI</string>
-          </array>
+           </array>
+           -->
+           <!-- add this key to change directory service query attributes.
+                Missing defaults to od indexed attributes
+                Use an empty array not to restrict the query.
+          <key>searchAttributes</key>
+          <array>
+            <string>dsAttrTypeStandard:GeneratedUID</string>
+            <string>dsAttrTypeStandard:RealName</string>
+            <string>dsAttrTypeStandard:FirstName</string>
+            <string>dsAttrTypeStandard:LastName</string>
+            <string>dsAttrTypeStandard:PhoneNumber</string>
+            <string>dsAttrTypeStandard:MobileNumber</string>
+            <string>dsAttrTypeStandard:Department</string>
+            <string>dsAttrTypeStandard:Company</string>
+            <string>dsAttrTypeStandard:Street</string>
+            <string>dsAttrTypeStandard:State</string>
+            <string>dsAttrTypeStandard:City</string>
+            <string>dsAttrTypeStandard:Country</string>
+           </array>
           -->
         </dict>
         <!-- twistedcaldav.directory.opendirectorybacker.OpenDirectoryBackingService ->

Modified: CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/ldapdirectorybacker.py
===================================================================
--- CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/ldapdirectorybacker.py	2012-04-06 19:47:21 UTC (rev 8994)
+++ CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/ldapdirectorybacker.py	2012-04-06 23:07:06 UTC (rev 8995)
@@ -266,7 +266,7 @@
                                     for dsAttributeName in dsAttributeNames:
                                         
                                         # base64 encode binary attributes
-                                        if dsAttributeName in ABDirectoryQueryResult.binaryDSAttributeStrs:
+                                        if dsAttributeName in ABDirectoryQueryResult.binaryDSAttrNames:
                                             ldapAttributeValues = [attr.encode('base64') for attr in ldapAttributeValues]
                                         
                                         # add to dsRecordAttributes

Modified: CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/opendirectorybacker.py
===================================================================
--- CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/opendirectorybacker.py	2012-04-06 19:47:21 UTC (rev 8994)
+++ CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/opendirectorybacker.py	2012-04-06 23:07:06 UTC (rev 8995)
@@ -90,8 +90,9 @@
         generateSimpleUIDs = False,       # use simple synthetic UIDs --- good for testing
         appleInternalServer=False,
         
-        additionalAttributes=[],
-        allowedAttributes=[],
+        additionalAttributes=None,
+        allowedAttributes=None,
+        searchAttributes=None,
         directoryBackedAddressBook=None
     ):
         """
@@ -156,29 +157,69 @@
         self.generateSimpleUIDs = generateSimpleUIDs
         self.appleInternalServer = appleInternalServer
         
-        if ignoreSystemRecords:
-            # needed for sytem record test, but not has no part in generating in vCard properties
-            additionalAttributes += [dsattributes.kDS1AttrUniqueID,]
         
-        self.additionalAttributes = additionalAttributes
-        # filter allows attributes, but make sure there are a minimum of attributes for functionality
+        if searchAttributes is None:
+            # this is the intersection of ds default indexed attributes and ABDirectoryQueryResult.vcardPropToDSAttrMap.values()
+            # so, not all indexed attributes are below
+            searchAttributes = [
+                dsattributes.kDS1AttrGeneratedUID,
+                dsattributes.kDS1AttrDistinguishedName,
+                dsattributes.kDS1AttrFirstName,
+                dsattributes.kDS1AttrLastName,
+                dsattributes.kDSNAttrPhoneNumber,
+                dsattributes.kDSNAttrMobileNumber,
+                dsattributes.kDSNAttrDepartment,
+                dsattributes.kDSNAttrCompany,
+                dsattributes.kDSNAttrStreet,
+                dsattributes.kDSNAttrState,
+                dsattributes.kDSNAttrCity,
+                dsattributes.kDSNAttrCountry,
+                ]
+        elif not searchAttributes:
+            # if search Attributes is [], don't restrict searching (but no binary)
+            searchAttributes = stringDSAttrNames
+        self.log_debug("self.searchAttributes=%s" % (searchAttributes, ))
+        
+        # calculate search map
+        vCardPropToSearchableDSAttrMap = {}
+        for prop, dsAttributeList in ABDirectoryQueryResult.vcardPropToDSAttrMap.iteritems():
+            dsIndexedAttributeList = [attr for attr in dsAttributeList if attr in searchAttributes]
+            if len(dsIndexedAttributeList):
+                vCardPropToSearchableDSAttrMap[prop] = dsIndexedAttributeList
+        
+        self.vCardPropToSearchableDSAttrMap = vCardPropToSearchableDSAttrMap
+        self.log_debug("self.vCardPropToSearchableDSAttrMap=%s" % (self.vCardPropToSearchableDSAttrMap, ))
+        
+        
+        #get attributes required for needed for valid vCard
+        requiredAttributes = [attr for prop in ("UID", "FN", "N") for attr in ABDirectoryQueryResult.vcardPropToDSAttrMap[prop]]
+        requiredAttributes += [dsattributes.kDS1AttrModificationTimestamp, dsattributes.kDS1AttrCreationTimestamp,] # for VCardResult property mix in
+        self.requiredAttributes = list(set(requiredAttributes))
+        self.log_debug("self.requiredAttributes=%s" % (self.requiredAttributes, ))
+           
+        # get returned attributes
+        #allowedAttributes = [dsattributes.kDS1AttrUniqueID,]
         if allowedAttributes:
-            self.allowedDSQueryAttributes = sorted(list(set(
-                                                [attr for attr in ABDirectoryQueryResult.allDSQueryAttributes
+            
+            returnedAttributes = [attr for attr in ABDirectoryQueryResult.allDSQueryAttributes
                                                     if (isinstance(attr, str) and attr in allowedAttributes) or
-                                                       (isinstance(attr, tuple) and attr[0] in allowedAttributes)] +
-                                                ABDirectoryQueryResult.dsqueryAttributesForProperty.get("X-INTERNAL-REQUIRED")
-                                                )))
-            if (self.allowedDSQueryAttributes != ABDirectoryQueryResult.allDSQueryAttributes):
-                self.log_info("Allowed DS query attributes = %r" % (self.allowedDSQueryAttributes, ))
+                                                       (isinstance(attr, tuple) and attr[0] in allowedAttributes)]
+            self.log_debug("allowedAttributes%s" % (allowedAttributes, ))
         else:
-            self.allowedDSQueryAttributes = ABDirectoryQueryResult.allDSQueryAttributes
+            returnedAttributes = ABDirectoryQueryResult.allDSQueryAttributes
+            
+        # add required
+        returnedAttributes += self.requiredAttributes
         
-        #self.returnedAttributes = ABDirectoryQueryResult.allDSQueryAttributes
-        self.returnedAttributes = self.allowedDSQueryAttributes
+        if additionalAttributes:
+            returnedAttributes += addtionalAttributes
         
-            
+        if ignoreSystemRecords:
+            returnedAttributes += [dsattributes.kDS1AttrUniqueID,]
         
+        self.returnedAttributes = list(set(returnedAttributes))
+        self.log_debug("self.returnedAttributes=%s" % (self.returnedAttributes, ))
+              
         
         self._dsLocalResults = {}
         self._nextDSLocalQueryTime = 0
@@ -226,16 +267,15 @@
             recordTypes = [dsattributes.kDSStdRecordTypePeople, dsattributes.kDSStdRecordTypeUsers, ]
             try:
                 localNodeDirectory = self.odModule.odInit("/Local/Default")
-                returnedAttributes = list(set(self.returnedAttributes + self.additionalAttributes))
                 self.log_debug("opendirectory.listAllRecordsWithAttributes_list(%r,%r,%r)" % (
                         "/DSLocal",
                         recordTypes,
-                        returnedAttributes,
+                        self.returnedAttributes,
                     ))
                 records = list(self.odModule.listAllRecordsWithAttributes_list(
                         localNodeDirectory,
                         recordTypes,
-                        returnedAttributes,
+                        self.returnedAttributes,
                     ))
             except self.odModule.ODError, ex:
                 self.log_error("Open Directory (node=%s) error: %s" % ("/Local/Default", str(ex)))
@@ -338,9 +378,7 @@
         
         if not attributes:
             attributes = self.returnedAttributes
-            
-        attributes = list(set(attributes + self.additionalAttributes)) # remove duplicates
-        
+                    
         directoryAndRecordTypes = []
         if self.peopleDirectory == self.userDirectory:
             # use single ds query if possible for best performance
@@ -437,15 +475,14 @@
             return self.returnedAttributes
         
         else:
-            propertyNames.append("X-INTERNAL-MINIMUM-VCARD-PROPERTIES") # these properties are required to make a vCard
-            queryAttributes = []
+            queryAttributes = self.requiredAttributes
             for prop in propertyNames:
-                if prop in ABDirectoryQueryResult.dsqueryAttributesForProperty:
-                    #print("adding attributes %r" % ABDirectoryQueryResult.dsqueryAttributesForProperty.get(prop))
-                    queryAttributes += ABDirectoryQueryResult.dsqueryAttributesForProperty.get(prop)
+                attributes = self.vCardPropToSearchableDSAttrMap.get(prop)
+                if attributes:
+                    queryAttributes += attributes
+                    
+            return list(set(queryAttributes))
 
-            return list(set(queryAttributes).intersection(set(self.returnedAttributes)))
-
     
 
     @inlineCallbacks
@@ -454,7 +491,7 @@
         Get vCards for a given addressBookFilter and addressBookQuery
         """
     
-        allRecords, filterAttributes, dsFilter  = dsFilterFromAddressBookFilter( addressBookFilter, vcardPropToDSAttrMap=ABDirectoryQueryResult.vcardPropToDSAttrMap, allowedAttributes=self.allowedDSQueryAttributes );
+        allRecords, filterAttributes, dsFilter  = dsFilterFromAddressBookFilter( addressBookFilter, vcardPropToDSAttrMap=self.vCardPropToSearchableDSAttrMap );
         #print("allRecords = %s, query = %s" % (allRecords, "None" if dsFilter is None else dsFilter.generate(),))
         
         # testing:
@@ -519,7 +556,7 @@
     return (etagRequested, propertyNames if len(propertyNames) else None)
 
 
-def dsFilterFromAddressBookFilter(addressBookFilter, vcardPropToDSAttrMap, allowedAttributes=None):
+def dsFilterFromAddressBookFilter(addressBookFilter, vcardPropToDSAttrMap):
     """
     Convert the supplied addressbook-query into a ds expression tree.
 
@@ -734,8 +771,6 @@
             queryAttributes = vcardPropToDSAttrMap.get(propFilter.filter_name, [])
             if isinstance(queryAttributes, str):
                 queryAttributes = [queryAttributes,]
-            if allowedAttributes:
-                queryAttributes = list(set(queryAttributes).intersection(set(allowedAttributes)))
             
             binaryAttrNames = []
             stringAttrNames = []
@@ -954,29 +989,7 @@
                 ],
          "X-ABRELATEDNAMES" :  [
                 dsattributes.kDSNAttrRelationships,
-                ],
-          "X-INTERNAL-MINIMUM-VCARD-PROPERTIES" : [
-                dsattributes.kDS1AttrGeneratedUID,
-                dsattributes.kDS1AttrFirstName, 
-                dsattributes.kDS1AttrLastName, 
-                dsattributes.kDS1AttrMiddleName,
-                dsattributes.kDSNAttrNamePrefix,
-                dsattributes.kDSNAttrNameSuffix,
-                dsattributes.kDS1AttrDistinguishedName,
-                dsattributes.kDSNAttrRecordName,
-                dsattributes.kDSNAttrRecordType,
-                dsattributes.kDS1AttrModificationTimestamp,
-                dsattributes.kDS1AttrCreationTimestamp,
-                ],
-          "X-INTERNAL-REQUIRED" : [
-                dsattributes.kDS1AttrGeneratedUID,
-                dsattributes.kDS1AttrDistinguishedName,
-                dsattributes.kDSNAttrRecordName,
-                dsattributes.kDS1AttrFirstName, 
-                dsattributes.kDS1AttrLastName, 
-                dsattributes.kDSNAttrRecordType,
-                ],
-  
+                ],  
     }
     
     allDSQueryAttributes = list(set([attr for lookupAttributes in vcardPropToDSAttrMap.values()

Modified: CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/stdconfig.py
===================================================================
--- CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/stdconfig.py	2012-04-06 19:47:21 UTC (rev 8994)
+++ CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/stdconfig.py	2012-04-06 23:07:06 UTC (rev 8995)
@@ -225,8 +225,9 @@
         "generateSimpleUIDs": False,
         "addDSAttrXProperties": False,
         "appleInternalServer": False,
-        "additionalAttributes" : [],
-        "allowedAttributes" : [],
+        "additionalAttributes" : None,
+        "allowedAttributes" : None,
+        "searchAttributes" : None,
     },
     "twistedcaldav.directory.ldapdirectorybacker.LdapDirectoryBackingService": {
         "appleInternalServer": False,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120406/2c070390/attachment-0001.html>


More information about the calendarserver-changes mailing list