[CalendarServer-changes] [12158] twext/trunk/twext/who/opendirectory/_service.py

source_changes at macosforge.org source_changes at macosforge.org
Wed Mar 12 11:16:42 PDT 2014


Revision: 12158
          http://trac.calendarserver.org//changeset/12158
Author:   wsanchez at apple.com
Date:     2013-12-19 16:19:14 -0800 (Thu, 19 Dec 2013)
Log Message:
-----------
Make sure field names are of the correct type.

Modified Paths:
--------------
    twext/trunk/twext/who/opendirectory/_service.py

Modified: twext/trunk/twext/who/opendirectory/_service.py
===================================================================
--- twext/trunk/twext/who/opendirectory/_service.py	2013-12-19 23:32:17 UTC (rev 12157)
+++ twext/trunk/twext/who/opendirectory/_service.py	2013-12-20 00:19:14 UTC (rev 12158)
@@ -62,7 +62,7 @@
     OpenDirectory error.
     """
 
-    def __init__(self, message, odError):
+    def __init__(self, message, odError=None):
         super(OpenDirectoryError, self).__init__(message)
         self.odError = odError
 
@@ -144,8 +144,8 @@
     recordType = ValueConstant("dsAttrTypeStandard:RecordType")
     recordType.fieldName = BaseFieldName.recordType
 
-    uid = ValueConstant("dsAttrTypeStandard:GeneratedUID")
-    uid.fieldName = BaseFieldName.uid
+    # uid = ValueConstant("dsAttrTypeStandard:GeneratedUID")
+    # uid.fieldName = BaseFieldName.uid
 
     guid = ValueConstant("dsAttrTypeStandard:GeneratedUID")
     guid.fieldName = BaseFieldName.guid
@@ -308,7 +308,7 @@
     #                         "Failed to open local node: {error}}",
     #                         error=e,
     #                     )
-    #                     raise OpenDirectoryError(e)
+    #                     raise OpenDirectoryError("", e)
     #             else:
     #                 self._localNode = None
 
@@ -340,7 +340,10 @@
                     "{source.nodeName!r}: {error}",
                     error=error
                 )
-                raise OpenDirectoryConnectionError(error)
+                raise OpenDirectoryConnectionError(
+                    "Unable to connect to OpenDirectory node",
+                    error
+                )
 
             self._session = session
             self._node = node
@@ -421,10 +424,12 @@
 
         if error:
             self.log.error(
-                "Error while forming OpenDirectory query: {error}",
+                "Error while forming OpenDirectory compound query: {error}",
                 error=error
             )
-            raise OpenDirectoryQueryError(error)
+            raise OpenDirectoryQueryError(
+                "Unable to form OpenDirectory compound query", error
+            )
 
         return query
 
@@ -475,10 +480,12 @@
 
         if error:
             self.log.error(
-                "Error while forming OpenDirectory query: {error}",
+                "Error while forming OpenDirectory match query: {error}",
                 error=error
             )
-            raise OpenDirectoryQueryError(error)
+            raise OpenDirectoryQueryError(
+                "Unable to form OpenDirectory match query", error
+            )
 
         return query
 
@@ -501,7 +508,9 @@
                 "Error while executing OpenDirectory query: {error}",
                 error=error
             )
-            raise OpenDirectoryQueryError(error)
+            raise OpenDirectoryQueryError(
+                "Unable to execute OpenDirectory query", error
+            )
 
         for odRecord in odRecords:
             yield DirectoryRecord(self, odRecord)
@@ -548,10 +557,10 @@
         )
         if error:
             self.log.error(
-                "Error while executing OpenDirectory query: {error}",
+                "Error while looking up user: {error}",
                 error=error
             )
-            raise OpenDirectoryQueryError("Could not look up user", error)
+            raise OpenDirectoryQueryError("Unable to look up user", error)
 
         return record
 
@@ -662,8 +671,25 @@
                 "Error while reading OpenDirectory record: {error}",
                 error=error
             )
-            raise OpenDirectoryDataError(error)
+            raise OpenDirectoryDataError(
+                "Unable to read OpenDirectory record", error
+            )
 
+        def coerceType(fieldName, value):
+            # Record type field value needs to be looked up
+            if fieldName is service.fieldName.recordType:
+                return ODRecordType.lookupByValue(value).recordType
+
+            # Otherwise, cast to the valueType specified by the field name
+            valueType = service.fieldName.valueType(fieldName)
+            try:
+                return valueType(value)
+            except BaseException as e:
+                raise OpenDirectoryDataError(
+                    "Unable to coerce OD value {0!r} to type {1}: {2}"
+                    .format(value, valueType, e)
+                )
+
         fields = {}
         for name, values in details.iteritems():
             if name == ODAttribute.metaRecordName.value:
@@ -678,39 +704,22 @@
                     attribute=name
                 )
                 continue
+
             fieldName = attribute.fieldName
 
             if type(values) is bytes:
-                values = (unicode(values),)
+                values = (coerceType(fieldName, values),)
             else:
-                values = [unicode(v) for v in values]
+                values = tuple(coerceType(fieldName, v) for v in values)
 
             if service.fieldName.isMultiValue(fieldName):
                 fields[fieldName] = values
             else:
                 assert len(values) == 1
+                fields[fieldName] = values[0]
 
-                if fieldName is service.fieldName.recordType:
-                    fields[fieldName] = ODRecordType.lookupByValue(
-                        values[0]
-                    ).recordType
-                else:
-                    fields[fieldName] = values[0]
+        # Set uid from guid
+        fields[service.fieldName.uid] = unicode(fields[service.fieldName.guid])
 
-        # Make sure that uid and guid are both set and equal
-        uid = fields.get(service.fieldName.uid, None)
-        guid = fields.get(service.fieldName.guid, None)
-
-        if uid is not None and guid is not None:
-            if uid != guid:
-                raise ValueError(
-                    "uid and guid must be equal ({uid} != {guid})"
-                    .format(uid=uid, guid=guid)
-                )
-        elif uid is None:
-            fields[service.fieldName.uid] = guid
-        elif guid is None:
-            fields[service.fieldName.guid] = uid
-
         super(DirectoryRecord, self).__init__(service, fields)
         self._odRecord = odRecord
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140312/0daf9118/attachment.html>


More information about the calendarserver-changes mailing list