[CalendarServer-changes] [7220] CalendarServer/trunk/calendarserver/platform/darwin/od

source_changes at macosforge.org source_changes at macosforge.org
Fri Mar 18 11:25:07 PDT 2011


Revision: 7220
          http://trac.macosforge.org/projects/calendarserver/changeset/7220
Author:   sagen at apple.com
Date:     2011-03-18 11:25:06 -0700 (Fri, 18 Mar 2011)
Log Message:
-----------
Adds support for OD attributes requiring base64-decoding

Modified Paths:
--------------
    CalendarServer/trunk/calendarserver/platform/darwin/od/opendirectory.py
    CalendarServer/trunk/calendarserver/platform/darwin/od/test/test_opendirectory.py

Modified: CalendarServer/trunk/calendarserver/platform/darwin/od/opendirectory.py
===================================================================
--- CalendarServer/trunk/calendarserver/platform/darwin/od/opendirectory.py	2011-03-18 17:47:23 UTC (rev 7219)
+++ CalendarServer/trunk/calendarserver/platform/darwin/od/opendirectory.py	2011-03-18 18:25:06 UTC (rev 7220)
@@ -21,6 +21,7 @@
 import odframework
 import objc
 import dsattributes
+import base64
 from twext.python.log import Logger
 
 log = Logger()
@@ -66,11 +67,15 @@
 
     # return caseInsensitiveEquivalents[matchType] if caseInsensitive else matchType
 
-def recordToResult(record):
+
+def recordToResult(record, encodings):
     """
     Takes an ODRecord and turns it into a (recordName, attributesDictionary)
     tuple.  Unicode values are converted to utf-8 encoded strings. (Not sure
     what to do with non-unicode values)
+
+    encodings is a attribute-name-to-encoding mapping, useful for specifying
+    how to decode values.
     """
     details, error = record.recordDetailsForAttributes_error_(None, None)
     if error:
@@ -78,17 +83,47 @@
         raise ODError(error)
     result = {}
     for key, value in details.iteritems():
+        encoding = encodings.get(key, None)
         if key in SINGLE_VALUE_ATTRIBUTES:
-            if len(value) == 0:
-                result[key] = None
+            if encoding:
+                if encoding == "base64":
+                    result[key] = base64.b64encode(value.bytes().tobytes())
             else:
-                if isinstance(value[0], objc.pyobjc_unicode):
-                    result[key] = unicode(value[0]).encode("utf-8") # convert from pyobjc
+                if len(value) == 0:
+                    result[key] = None
+                else:
+                    if isinstance(value[0], objc.pyobjc_unicode):
+                        result[key] = unicode(value[0]).encode("utf-8") # convert from pyobjc
         else:
-            result[key] = [unicode(v).encode("utf-8") for v in value if isinstance(v, objc.pyobjc_unicode)]
+            if encoding:
+                if encoding == "base64":
+                    result[key] = [base64.b64encode(v.bytes().tobytes()) for v in value]
+            else:
+                result[key] = [unicode(v).encode("utf-8") for v in value if isinstance(v, objc.pyobjc_unicode)]
 
     return (details.get(dsattributes.kDSNAttrRecordName, [None])[0], result)
 
+
+def attributeNamesFromList(attributes):
+    """
+    The attributes list can contain string names or tuples of the form (name,
+    encoding).  Return just the names.
+    """
+
+    if attributes is None:
+        attributes = []
+
+    names = []
+    encodings = {}
+    for attribute in attributes:
+        if isinstance(attribute, tuple):
+            names.append(attribute[0])
+            encodings[attribute[0]] = attribute[1]
+        else:
+            names.append(attribute)
+    return names, encodings
+
+
 def odInit(nodeName):
     """
     Create an Open Directory object to operate on the specified directory service node name.
@@ -139,13 +174,16 @@
         for each record found, or C{None} otherwise.
     """
     results = []
+
+    attributeNames, encodings = attributeNamesFromList(attributes)
+
     query, error = odframework.ODQuery.queryWithNode_forRecordTypes_attribute_matchType_queryValues_returnAttributes_maximumResults_error_(
         directory.node,
         recordType,
         None,
         MATCHANY,
         None,
-        attributes,
+        attributeNames,
         count,
         None)
     if error:
@@ -156,7 +194,7 @@
         log.error(error)
         raise ODError(error)
     for record in records:
-        results.append(recordToResult(record))
+        results.append(recordToResult(record, encodings))
     return results
 
 
@@ -179,13 +217,16 @@
     """
 
     results = []
+
+    attributeNames, encodings = attributeNamesFromList(attributes)
+
     query, error = odframework.ODQuery.queryWithNode_forRecordTypes_attribute_matchType_queryValues_returnAttributes_maximumResults_error_(
         directory.node,
         recordType,
         attr,
         adjustMatchType(matchType, casei),
         value.decode("utf-8"),
-        attributes,
+        attributeNames,
         count,
         None)
     if error:
@@ -196,7 +237,7 @@
         log.error(error)
         raise ODError(error)
     for record in records:
-        results.append(recordToResult(record))
+        results.append(recordToResult(record, encodings))
     return results
 
 
@@ -216,13 +257,16 @@
         for each record found, or C{None} otherwise.
     """
     results = []
+
+    attributeNames, encodings = attributeNamesFromList(attributes)
+
     query, error = odframework.ODQuery.queryWithNode_forRecordTypes_attribute_matchType_queryValues_returnAttributes_maximumResults_error_(
         directory.node,
         recordType,
         None,
         0x210B, # adjustMatchType(matchType, casei),
         compound,
-        attributes,
+        attributeNames,
         count,
         None)
     if error:
@@ -233,7 +277,7 @@
         log.error(error)
         raise ODError(error)
     for record in records:
-        results.append(recordToResult(record))
+        results.append(recordToResult(record, encodings))
     return results
 
 

Modified: CalendarServer/trunk/calendarserver/platform/darwin/od/test/test_opendirectory.py
===================================================================
--- CalendarServer/trunk/calendarserver/platform/darwin/od/test/test_opendirectory.py	2011-03-18 17:47:23 UTC (rev 7219)
+++ CalendarServer/trunk/calendarserver/platform/darwin/od/test/test_opendirectory.py	2011-03-18 18:25:06 UTC (rev 7220)
@@ -93,6 +93,7 @@
         dsattributes.kDS1AttrLastName,
         dsattributes.kDSNAttrEMailAddress,
         dsattributes.kDSNAttrMetaNodeLocation,
+        (dsattributes.kDSNAttrJPEGPhoto, "base64"),
     ]
 
     class OpenDirectoryTests(TestCase):
@@ -557,8 +558,8 @@
             self.assertTrue("odtestgrouptop" in recordNames)
             groupMembers = results[0][1][dsattributes.kDSNAttrGroupMembers]
             self.assertEquals(
-                groupMembers,
-                setup_directory.masterGroups[1][1][dsattributes.kDSNAttrGroupMembers]
+                set(groupMembers),
+                set(setup_directory.masterGroups[1][1][dsattributes.kDSNAttrGroupMembers])
             )
 
         def test_queryRecordsWithAttribute_list_groupMembers_recordName_local(self):
@@ -582,8 +583,8 @@
             self.assertTrue("odtestsubgroupa" in recordNames)
             groupMembers = results[0][1][dsattributes.kDSNAttrGroupMembers]
             self.assertEquals(
-                groupMembers,
-                setup_directory.localGroups[0][1][dsattributes.kDSNAttrGroupMembers]
+                set(groupMembers),
+                set(setup_directory.localGroups[0][1][dsattributes.kDSNAttrGroupMembers])
             )
 
 
@@ -608,8 +609,8 @@
             self.assertTrue("odtestgrouptop" in recordNames)
             groupMembers = results[0][1][dsattributes.kDSNAttrGroupMembers]
             self.assertEquals(
-                groupMembers,
-                setup_directory.masterGroups[1][1][dsattributes.kDSNAttrGroupMembers]
+                set(groupMembers),
+                set(setup_directory.masterGroups[1][1][dsattributes.kDSNAttrGroupMembers])
             )
 
         def test_queryRecordsWithAttribute_list_groupMembers_guid_local(self):
@@ -823,7 +824,7 @@
         def test_result_types(self):
             directory = opendirectory.odInit("/Search")
             record = opendirectory.getUserRecord(directory, "odtestbill")
-            name, data = opendirectory.recordToResult(record)
+            name, data = opendirectory.recordToResult(record, {})
             for value in data.values():
                 if isinstance(value, list):
                     for item in value:
@@ -886,3 +887,12 @@
                 result[dsattributes.kDS1AttrGeneratedUID],
                 "C662F833-75AD-4589-9879-5FF102943CEF"
             )
+
+        def test_attributeNamesFromList(self):
+            self.assertEquals(
+                ([], {}), opendirectory.attributeNamesFromList(None)
+            )
+            self.assertEquals(
+                (["a", "b"], {"b":"base64"}),
+                opendirectory.attributeNamesFromList(["a", ("b", "base64")])
+            )
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110318/6186ecb7/attachment-0001.html>


More information about the calendarserver-changes mailing list