[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