[CalendarServer-changes] [487] CalendarServer/branches/users/wsanchez/provisioning/twistedcaldav/ directory

source_changes at macosforge.org source_changes at macosforge.org
Wed Nov 15 19:35:40 PST 2006


Revision: 487
          http://trac.macosforge.org/projects/calendarserver/changeset/487
Author:   wsanchez at apple.com
Date:     2006-11-15 19:35:40 -0800 (Wed, 15 Nov 2006)

Log Message:
-----------
Some reorg to make room for both Basic and Digest implementations.

Modified Paths:
--------------
    CalendarServer/branches/users/wsanchez/provisioning/twistedcaldav/directory/apache.py
    CalendarServer/branches/users/wsanchez/provisioning/twistedcaldav/directory/test/test_apache.py

Modified: CalendarServer/branches/users/wsanchez/provisioning/twistedcaldav/directory/apache.py
===================================================================
--- CalendarServer/branches/users/wsanchez/provisioning/twistedcaldav/directory/apache.py	2006-11-16 03:29:48 UTC (rev 486)
+++ CalendarServer/branches/users/wsanchez/provisioning/twistedcaldav/directory/apache.py	2006-11-16 03:35:40 UTC (rev 487)
@@ -21,8 +21,8 @@
 """
 
 __all__ = [
-    "FileDirectoryService",
-    "FileDirectoryRecord",
+    "BasicDirectoryService",
+    "DigestDirectoryService",
 ]
 
 from crypt import crypt
@@ -33,9 +33,9 @@
 from twistedcaldav.directory.directory import DirectoryService, DirectoryRecord
 from twistedcaldav.directory.directory import UnknownRecordTypeError
 
-class FileDirectoryService(DirectoryService):
+class AbstractDirectoryService(DirectoryService):
     """
-    Apache UserFile/GroupFile implementation of L{IDirectoryService}.
+    Abstract Apache-compatible implementation of L{IDirectoryService}.
     """
     def __repr__(self):
         return "<%s %r %r>" % (self.__class__.__name__, self.userFile, self.groupFile)
@@ -56,35 +56,38 @@
         return recordTypes
 
     def listRecords(self, recordType):
-        for entryShortName, entryData in self._entriesForRecordType(recordType):
+        for entryShortName, entryData in self.entriesForRecordType(recordType):
             yield entryShortName
 
     def recordWithShortName(self, recordType, shortName):
-        for entryShortName, entryData in self._entriesForRecordType(recordType):
+        for entryShortName, entryData in self.entriesForRecordType(recordType):
             if entryShortName == shortName:
                 if recordType == "user":
-                    return FileDirectoryRecord(
+                    return self.userRecordClass(
                         service       = self,
                         recordType    = recordType,
                         shortName     = entryShortName,
                         cryptPassword = entryData,
                     )
-                elif recordType == "group":
-                    return FileDirectoryRecord(
+
+                if recordType == "group":
+                    return GroupRecord(
                         service    = self,
                         recordType = recordType,
                         shortName  = entryShortName,
                         members    = entryData,
                     )
-                else:
-                    raise AssertionError("We shouldn't be here.")
 
+                # Subclass should cover the remaining record types
+                raise AssertionError("Subclass should have handled record type: %r"
+                                     % (recordType,))
+
         return None
 
     def recordWithGUID(self, guid):
         raise NotImplementedError()
 
-    def _entriesForRecordType(self, recordType):
+    def entriesForRecordType(self, recordType):
         if recordType == "user":
             recordFile = self.userFile
         elif recordType == "group":
@@ -100,28 +103,25 @@
                 shortName, rest = entry.rstrip("\n").split(":", 1)
                 yield shortName, rest
 
-class FileDirectoryRecord(DirectoryRecord):
+class AbstractDirectoryRecord(DirectoryRecord):
     """
-    Apache UserFile/GroupFile implementation of L{IDirectoryRecord}.
+    Abstract Apache-compatible implementation of L{IDirectoryRecord}.
     """
-    def __init__(self, service, recordType, shortName, cryptPassword=None, members=()):
-        if type(members) is str:
-            members = tuple(m.strip() for m in members.split(","))
+    def __init__(self, service, recordType, shortName):
+        super(AbstractDirectoryRecord, self).__init__(
+            service        = service,
+            recordType     = recordType,
+            guid           = None,
+            shortName      = shortName,
+            fullName       = None,
+        )
 
-        assert recordType == "group" or not members, "Only group records may have members."
+class AbstractUserRecord(AbstractDirectoryRecord):
+    def __init__(self, service, recordType, shortName, cryptPassword=None):
+        super(AbstractUserRecord, self).__init__(service, recordType, shortName)
 
-        self.service        = service
-        self.recordType     = recordType
-        self.guid           = None
-        self.shortName      = shortName
-        self.fullName       = None
         self._cryptPassword = cryptPassword
-        self._members       = members
 
-    def members(self):
-        for shortName in self._members:
-            yield self.service.recordWithShortName("user", shortName)
-
     def groups(self):
         for groupName in self.service.listRecords("group"):
             group = self.service.recordWithShortName("group", groupName)
@@ -130,6 +130,10 @@
                     yield group
                     continue
 
+class BasicUserRecord(AbstractUserRecord):
+    """
+    Apache UserFile implementation of L{IDirectoryRecord}.
+    """
     def verifyCredentials(self, credentials):
         if self._cryptPassword in ("", "*", "x"):
             return False
@@ -137,4 +141,39 @@
         if isinstance(credentials, UsernamePassword):
             return crypt(credentials.password, self._cryptPassword) == self._cryptPassword
 
-        return super(FileDirectoryRecord, self).verifyCredentials(credentials)
+        return super(BasicUserRecord, self).verifyCredentials(credentials)
+
+class BasicDirectoryService(AbstractDirectoryService):
+    """
+    Apache UserFile/GroupFile implementation of L{IDirectoryService}.
+    """
+    userRecordClass = BasicUserRecord
+
+class DigestUserRecord(AbstractUserRecord):
+    """
+    Apache DigestUserFile implementation of L{IDirectoryRecord}.
+    """
+    def verifyCredentials(self, credentials):
+        raise NotImplementedError()
+
+class DigestDirectoryService(AbstractDirectoryService):
+    """
+    Apache DigestUserFile/GroupFile implementation of L{IDirectoryService}.
+    """
+    userRecordClass = DigestUserRecord
+
+class GroupRecord(AbstractDirectoryRecord):
+    """
+    Apache GroupFile implementation of L{IDirectoryRecord}.
+    """
+    def __init__(self, service, recordType, shortName, members=()):
+        super(GroupRecord, self).__init__(service, recordType, shortName)
+
+        if type(members) is str:
+            members = tuple(m.strip() for m in members.split(","))
+
+        self._members = members
+
+    def members(self):
+        for shortName in self._members:
+            yield self.service.recordWithShortName("user", shortName)

Modified: CalendarServer/branches/users/wsanchez/provisioning/twistedcaldav/directory/test/test_apache.py
===================================================================
--- CalendarServer/branches/users/wsanchez/provisioning/twistedcaldav/directory/test/test_apache.py	2006-11-16 03:29:48 UTC (rev 486)
+++ CalendarServer/branches/users/wsanchez/provisioning/twistedcaldav/directory/test/test_apache.py	2006-11-16 03:35:40 UTC (rev 487)
@@ -21,7 +21,7 @@
 import twisted.trial.unittest
 from twisted.cred.credentials import UsernamePassword
 
-from twistedcaldav.directory.apache import FileDirectoryService, FileDirectoryRecord
+from twistedcaldav.directory.apache import BasicDirectoryService
 
 users = {
     "wsanchez": "foo" ,
@@ -51,37 +51,37 @@
     """
     def test_recordTypes_user(self):
         """
-        FileDirectoryService.recordTypes(userFile)
+        BasicDirectoryService.recordTypes(userFile)
         """
-        service = FileDirectoryService(basicUserFile)
+        service = BasicDirectoryService(basicUserFile)
         self.assertEquals(set(service.recordTypes()), set(("user",)))
 
     def test_recordTypes_group(self):
         """
-        FileDirectoryService.recordTypes(userFile, groupFile)
+        BasicDirectoryService.recordTypes(userFile, groupFile)
         """
-        service = FileDirectoryService(basicUserFile, groupFile)
+        service = BasicDirectoryService(basicUserFile, groupFile)
         self.assertEquals(set(service.recordTypes()), set(("user", "group")))
 
     def test_listRecords_user(self):
         """
-        FileDirectoryService.listRecords("user")
+        BasicDirectoryService.listRecords("user")
         """
-        service = FileDirectoryService(basicUserFile)
+        service = BasicDirectoryService(basicUserFile)
         self.assertEquals(set(service.listRecords("user")), set(users.keys()))
 
     def test_listRecords_group(self):
         """
-        FileDirectoryService.listRecords("group")
+        BasicDirectoryService.listRecords("group")
         """
-        service = FileDirectoryService(basicUserFile, groupFile)
+        service = BasicDirectoryService(basicUserFile, groupFile)
         self.assertEquals(set(service.listRecords("group")), set(groups.keys()))
 
     def test_recordWithShortName_user(self):
         """
-        FileDirectoryService.recordWithShortName("user")
+        BasicDirectoryService.recordWithShortName("user")
         """
-        service = FileDirectoryService(basicUserFile)
+        service = BasicDirectoryService(basicUserFile)
         for user in users:
             record = service.recordWithShortName("user", user)
             self.assertEquals(record.shortName, user)
@@ -89,9 +89,9 @@
 
     def test_recordWithShortName_group(self):
         """
-        FileDirectoryService.recordWithShortName("group")
+        BasicDirectoryService.recordWithShortName("group")
         """
-        service = FileDirectoryService(basicUserFile, groupFile)
+        service = BasicDirectoryService(basicUserFile, groupFile)
         for group in groups:
             groupRecord = service.recordWithShortName("group", group)
             self.assertEquals(groupRecord.shortName, group)
@@ -99,27 +99,27 @@
 
     def test_groupMembers(self):
         """
-        FileDirectoryRecord.members()
+        BasicDirectoryRecord.members()
         """
-        service = FileDirectoryService(basicUserFile, groupFile)
+        service = BasicDirectoryService(basicUserFile, groupFile)
         for group in groups:
             groupRecord = service.recordWithShortName("group", group)
             self.assertEquals(set(m.shortName for m in groupRecord.members()), set(groups[group]))
 
     def test_groupMemberships(self):
         """
-        FileDirectoryRecord.groups()
+        BasicDirectoryRecord.groups()
         """
-        service = FileDirectoryService(basicUserFile, groupFile)
+        service = BasicDirectoryService(basicUserFile, groupFile)
         for user in users:
             userRecord = service.recordWithShortName("user", user)
             self.assertEquals(set(g.shortName for g in userRecord.groups()), set(g for g in groups if user in groups[g]))
 
     def test_verifyCredentials(self):
         """
-        FileDirectoryRecord.verifyCredentials()
+        BasicDirectoryRecord.verifyCredentials()
         """
-        service = FileDirectoryService(basicUserFile)
+        service = BasicDirectoryService(basicUserFile)
         for user in users:
             userRecord = service.recordWithShortName("user", user)
             self.failUnless(userRecord.verifyCredentials(UsernamePassword(user, users[user])))

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20061115/48a608c0/attachment.html


More information about the calendarserver-changes mailing list