[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