[CalendarServer-changes] [3141] CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav /directory

source_changes at macosforge.org source_changes at macosforge.org
Sat Oct 11 20:18:52 PDT 2008


Revision: 3141
          http://trac.macosforge.org/projects/calendarserver/changeset/3141
Author:   cdaboo at apple.com
Date:     2008-10-11 20:18:51 -0700 (Sat, 11 Oct 2008)
Log Message:
-----------
Cache group memberships for records.

Modified Paths:
--------------
    CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/appleopendirectory.py
    CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/test/test_opendirectoryrecords.py

Modified: CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/appleopendirectory.py
===================================================================
--- CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/appleopendirectory.py	2008-10-10 19:05:55 UTC (rev 3140)
+++ CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/appleopendirectory.py	2008-10-12 03:18:51 UTC (rev 3141)
@@ -13,7 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ##
-from uuid import UUID
 
 """
 Apple Open Directory directory service implementation.
@@ -27,6 +26,7 @@
 import itertools
 import sys
 from random import random
+from uuid import UUID
 
 import opendirectory
 import dsattributes
@@ -90,6 +90,8 @@
         self.cacheTimeout = cacheTimeout
         self._records = {}
         self._delayedCalls = set()
+        self._groupIndex = {}
+        self._groupIndexValid = False
 
         if dosetup:
             for recordType in self.recordTypes():
@@ -300,6 +302,26 @@
         return record
 
 
+    def groupsForGUID(self, guid):
+        
+        # Check whether cache exists
+        if not self._groupIndexValid:
+            self._reindexGroups()
+        
+        # Lookup in index
+        try:
+            return self._groupIndex[guid]
+        except KeyError:
+            return ()
+
+    def _reindexGroups(self):
+        index = {}
+        for groupRecord in self.recordsForType(DirectoryService.recordType_groups).itervalues():
+            for guid in groupRecord._memberGUIDs:
+                index.setdefault(guid, set()).add(groupRecord)
+        self._groupIndex = index
+        self._groupIndexValid = True
+
     _ODFields = {
         'fullName' : dsattributes.kDS1AttrDistinguishedName,
         'firstName' : dsattributes.kDS1AttrFirstName,
@@ -374,6 +396,8 @@
         elif guid is None:
             self.log_info("Reloading %s record cache" % (recordType,))
 
+        self._groupIndexValid = False
+
         results = self._queryDirectory(recordType, shortName=shortName, guid=guid)
 
         if shortName is None and guid is None:
@@ -732,9 +756,7 @@
                 yield userRecord
 
     def groups(self):
-        for groupRecord in self.service.recordsForType(DirectoryService.recordType_groups).itervalues():
-            if self.guid in groupRecord._memberGUIDs:
-                yield groupRecord
+        return self.service.groupsForGUID(self.guid)
 
     def proxies(self):
         if self.recordType not in (DirectoryService.recordType_resources, DirectoryService.recordType_locations):

Modified: CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/test/test_opendirectoryrecords.py
===================================================================
--- CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/test/test_opendirectoryrecords.py	2008-10-10 19:05:55 UTC (rev 3140)
+++ CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/test/test_opendirectoryrecords.py	2008-10-12 03:18:51 UTC (rev 3141)
@@ -337,7 +337,77 @@
                 ("EDB9EE55-31F2-4EA9-B5FB-D8AE2A8BA35E", "62368DDF-0C62-4C97-9A58-DE9FD46131A0", "D10F3EE0-5014-41D3-8488-3819D3EF3B2A"),
             )
 
-def fakeODRecord(fullName, shortName=None, guid=None, email=None):
+        def test_groupmembers(self):
+            self._service.fakerecords = {
+                DirectoryService.recordType_users: [
+                    fakeODRecord("User 01"),
+                    fakeODRecord("User 02"),
+                ],
+                DirectoryService.recordType_groups: [
+                    fakeODRecord("Group 01", members=[
+                        guidForShortName("user01"),
+                        guidForShortName("user02"),
+                    ]),
+                    fakeODRecord("Group 02", members=[
+                        guidForShortName("resource01"),
+                        guidForShortName("user02"),
+                    ]),
+                ],
+                DirectoryService.recordType_resources: [
+                    fakeODRecord("Resource 01"),
+                    fakeODRecord("Resource 02"),
+                ],
+                DirectoryService.recordType_locations: [
+                    fakeODRecord("Location 01"),
+                    fakeODRecord("Location 02"),
+                ],
+            }
+
+            self._service.reloadCache(DirectoryService.recordType_users)
+            self._service.reloadCache(DirectoryService.recordType_groups)
+            self._service.reloadCache(DirectoryService.recordType_resources)
+            self._service.reloadCache(DirectoryService.recordType_locations)
+
+            group1 = self._service.recordWithShortName(DirectoryService.recordType_groups, "group01")
+            self.assertTrue(group1 is not None)
+
+            group2 = self._service.recordWithShortName(DirectoryService.recordType_groups, "group02")
+            self.assertTrue(group2 is not None)
+
+            user1 = self._service.recordWithShortName(DirectoryService.recordType_users, "user01")
+            self.assertTrue(user1 is not None)
+            self.assertEqual(set((group1,)), user1.groups()) 
+            
+            user2 = self._service.recordWithShortName(DirectoryService.recordType_users, "user02")
+            self.assertTrue(user2 is not None)
+            self.assertEqual(set((group1, group2)), user2.groups()) 
+            
+            self._service.fakerecords[DirectoryService.recordType_groups] = [
+                fakeODRecord("Group 01", members=[
+                    guidForShortName("user01"),
+                ]),
+                fakeODRecord("Group 02", members=[
+                    guidForShortName("resource01"),
+                    guidForShortName("user02"),
+                ]),
+            ]
+            self._service.reloadCache(DirectoryService.recordType_groups)
+
+            group1 = self._service.recordWithShortName(DirectoryService.recordType_groups, "group01")
+            self.assertTrue(group1 is not None)
+
+            group2 = self._service.recordWithShortName(DirectoryService.recordType_groups, "group02")
+            self.assertTrue(group2 is not None)
+
+            user1 = self._service.recordWithShortName(DirectoryService.recordType_users, "user01")
+            self.assertTrue(user1 is not None)
+            self.assertEqual(set((group1,)), user1.groups()) 
+            
+            user2 = self._service.recordWithShortName(DirectoryService.recordType_users, "user02")
+            self.assertTrue(user2 is not None)
+            self.assertEqual(set((group2,)), user2.groups()) 
+
+def fakeODRecord(fullName, shortName=None, guid=None, email=None, members=None):
     if shortName is None:
         shortName = shortNameForFullName(fullName)
 
@@ -355,6 +425,9 @@
         dsattributes.kDSNAttrEMailAddress: email,
         dsattributes.kDSNAttrMetaNodeLocation: "/LDAPv3/127.0.0.1",
     }
+    
+    if members:
+        attrs[dsattributes.kDSNAttrGroupMembers] = members
 
     return [ shortName, attrs ]
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20081011/973af8e3/attachment.html 


More information about the calendarserver-changes mailing list