[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