[CalendarServer-changes] [3617] CalendarServer/trunk/twistedcaldav/directory

source_changes at macosforge.org source_changes at macosforge.org
Wed Jan 28 08:47:19 PST 2009


Revision: 3617
          http://trac.macosforge.org/projects/calendarserver/changeset/3617
Author:   cdaboo at apple.com
Date:     2009-01-28 08:47:18 -0800 (Wed, 28 Jan 2009)
Log Message:
-----------
Redo fix for invalid XML in resourceInfo attribute.

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py
    CalendarServer/trunk/twistedcaldav/directory/test/test_opendirectoryrecords.py
    CalendarServer/trunk/twistedcaldav/directory/test/test_opendirectoryschema.py

Modified: CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py	2009-01-28 08:01:06 UTC (rev 3616)
+++ CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py	2009-01-28 16:47:18 UTC (rev 3617)
@@ -1,5 +1,5 @@
 ##
-# Copyright (c) 2006-2008 Apple Inc. All rights reserved.
+# Copyright (c) 2006-2009 Apple Inc. All rights reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -191,6 +191,33 @@
                 
         return result
 
+    def _parseResourceInfo(self, plist, guid, recordType, shortname):
+        """
+        Parse OD ResourceInfo attribute and extract information that the server needs.
+
+        @param plist: the plist that is the attribute value.
+        @type plist: str
+        @param guid: the directory GUID of the record being parsed.
+        @type guid: str
+        @param shortname: the record shortname of the record being parsed.
+        @type shortname: str
+        @return: a C{tuple} of C{bool} for auto-accept, C{str} for proxy GUID, C{str} for read-only proxy GUID.
+        """
+        try:
+            plist = readPlistFromString(plist)
+            wpframework = plist.get("com.apple.WhitePagesFramework", {})
+            autoaccept = wpframework.get("AutoAcceptsInvitation", False)
+            proxy = wpframework.get("CalendaringDelegate", None)
+            read_only_proxy = wpframework.get("ReadOnlyCalendaringDelegate", None)
+        except (ExpatError, AttributeError), e:
+            self.log_error(
+                "Failed to parse ResourceInfo attribute of record (%s)%s (guid=%s): %s\n%s" %
+                (recordType, shortname, guid, e, plist,)
+            )
+            raise ValueError("Invalid ResourceInfo")
+
+        return (autoaccept, proxy, read_only_proxy,)
+
     def recordTypes(self):
         return (
             DirectoryService.recordType_users,
@@ -528,19 +555,9 @@
                 resourceInfo = value.get(dsattributes.kDSNAttrResourceInfo)
                 if resourceInfo is not None:
                     try:
-                        plist = readPlistFromString(resourceInfo)
-                    except ExpatError, e:
-                        self.log_error(
-                            "Failed to parse ResourceInfo attribute of record (%s)%s (guid=%s, name=%s): %s\n%s" %
-                            (recordType, recordShortName, recordGUID, recordFullName, e, resourceInfo)
-                        )
+                        autoSchedule, proxy, read_only_proxy = self._parseResourceInfo(resourceInfo, recordGUID, recordType, recordShortName)
+                    except ValueError:
                         continue
-
-                    wpframework = plist.get("com.apple.WhitePagesFramework", {})
-                    autoSchedule = wpframework.get("AutoAcceptsInvitation", False)
-                    proxy = wpframework.get("CalendaringDelegate", None)
-                    read_only_proxy = wpframework.get("ReadOnlyCalendaringDelegate", None)
-
                     if proxy:
                         proxyGUIDs = (proxy,)
                     if read_only_proxy:

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_opendirectoryrecords.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_opendirectoryrecords.py	2009-01-28 08:01:06 UTC (rev 3616)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_opendirectoryrecords.py	2009-01-28 16:47:18 UTC (rev 3617)
@@ -608,7 +608,59 @@
             self.verifyQuery(self.service.recordWithEmailAddress, "location05 at example.com")
             self.verifyNoQuery(self.service.recordWithEmailAddress, "location05 at example.com")
 
-def fakeODRecord(fullName, shortName=None, guid=None, email=None, members=None):
+        def test_resourceinfo(self):
+            good_plist = """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+    <key>com.apple.WhitePagesFramework</key>
+    <dict>
+        <key>AutoAcceptsInvitation</key>
+        <true/>
+        <key>Label</key>
+        <string>Location</string>
+        <key>CalendaringDelegate</key>
+        <string></string>
+        <key>ReadOnlyCalendaringDelegate</key>
+        <string></string>
+    </dict>
+</dict>
+</plist>
+"""
+
+            bad_plist = """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+    <key>com.apple.WhitePagesFramework</key>
+    <string>bogus</string>
+</dict>
+</plist>
+"""
+
+            invalid_xml = """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+    <key>com.apple.WhitePagesFramework</key>
+    <string>R&D</string>
+</dict>
+</plist>
+"""
+
+            self.loadRecords({
+                DirectoryService.recordType_locations: [
+                    fakeODRecord("Location 01", resourceInfo=good_plist),
+                    fakeODRecord("Location 02", resourceInfo=bad_plist),
+                    fakeODRecord("Location 03", resourceInfo=invalid_xml),
+                ],
+            })
+
+            self.verifyRecords(DirectoryService.recordType_locations, ("location01",))
+            self.verifyDisabledRecords(DirectoryService.recordType_locations, (), ())
+
+
+def fakeODRecord(fullName, shortName=None, guid=None, email=None, members=None, resourceInfo=None):
     if shortName is None:
         shortName = shortNameForFullName(fullName)
 
@@ -630,6 +682,9 @@
     if members:
         attrs[dsattributes.kDSNAttrGroupMembers] = members
 
+    if resourceInfo:
+        attrs[dsattributes.kDSNAttrResourceInfo] = resourceInfo
+
     return [ shortName, attrs ]
 
 def shortNameForFullName(fullName):

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_opendirectoryschema.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_opendirectoryschema.py	2009-01-28 08:01:06 UTC (rev 3616)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_opendirectoryschema.py	2009-01-28 16:47:18 UTC (rev 3617)
@@ -114,20 +114,34 @@
 </plist>
 """
 
+        plist_invalid_xml = """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+    <key>com.apple.WhitePagesFramework</key>
+    <string>R&D</string>
+</dict>
+</plist>
+"""
+
         test_bool = (
-            (plist_good_false, False, "1234-GUID-5678", "1234-GUID-5679"),
-            (plist_good_true, True, "", ""),
-            (plist_good_missing, False, None, None),
-            (plist_wrong, False, None, None),
-            (plist_bad, False, None, None),
-            (plist_invalid, False, None, None),
+            (plist_good_false, False, "1234-GUID-5678", "1234-GUID-5679", None),
+            (plist_good_true, True, "", "", None),
+            (plist_good_missing, False, None, None, None),
+            (plist_wrong, False, None, None, None),
+            (plist_bad, False, None, None, ValueError),
+            (plist_invalid, False, None, None, ValueError),
+            (plist_invalid_xml, False, None, None, ValueError),
         )
 
         def test_plists(self):
             service = OpenDirectoryService(node="/Search", dosetup=False)
             
             for item in ODResourceInfoParse.test_bool:
-                item1, item2, item3 = service._parseResourceInfo(item[0], "guid", "name")
-                self.assertEqual(item1, item[1])
-                self.assertEqual(item2, item[2])
-                self.assertEqual(item3, item[3])
+                if item[4] is None:
+                    item1, item2, item3 = service._parseResourceInfo(item[0], "guid", "locations", "name")
+                    self.assertEqual(item1, item[1])
+                    self.assertEqual(item2, item[2])
+                    self.assertEqual(item3, item[3])
+                else:
+                    self.assertRaises(item[4], service._parseResourceInfo, item[0], "guid", "locations", "name")
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090128/df645238/attachment.html>


More information about the calendarserver-changes mailing list