[CalendarServer-changes] [11599] CalendarServer/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Mon Aug 12 11:56:46 PDT 2013
Revision: 11599
http://trac.calendarserver.org//changeset/11599
Author: sagen at apple.com
Date: 2013-08-12 11:56:46 -0700 (Mon, 12 Aug 2013)
Log Message:
-----------
Linux may not have OpenDirectory, but don't let that stop us
Modified Paths:
--------------
CalendarServer/trunk/calendarserver/tap/caldav.py
CalendarServer/trunk/calendarserver/tools/test/test_agent.py
CalendarServer/trunk/calendarserver/tools/test/test_resources.py
CalendarServer/trunk/twistedcaldav/upgrade.py
Modified: CalendarServer/trunk/calendarserver/tap/caldav.py
===================================================================
--- CalendarServer/trunk/calendarserver/tap/caldav.py 2013-08-12 18:17:19 UTC (rev 11598)
+++ CalendarServer/trunk/calendarserver/tap/caldav.py 2013-08-12 18:56:46 UTC (rev 11599)
@@ -107,7 +107,6 @@
from calendarserver.push.notifier import PushDistributor
from calendarserver.push.amppush import AMPPushMaster, AMPPushForwarder
from calendarserver.push.applepush import ApplePushNotifierService
-from calendarserver.tools.agent import makeAgentService
try:
from calendarserver.version import version
@@ -1260,6 +1259,7 @@
config.EnableCalDAV = config.EnableCardDAV = True
def agentServiceCreator(pool, store, ignored, storageService):
+ from calendarserver.tools.agent import makeAgentService
if storageService is not None:
# Shut down if DataRoot becomes unavailable
from twisted.internet import reactor
@@ -1409,12 +1409,12 @@
return pgserv
elif config.DBType == 'postgres':
# Connect to a postgres database that is already running.
- return createSubServiceFactory()(pgConnectorFromConfig(config))
+ return createSubServiceFactory()(pgConnectorFromConfig(config), None)
elif config.DBType == 'oracle':
# Connect to an Oracle database that is already running.
return createSubServiceFactory(dialect=ORACLE_DIALECT,
paramstyle='numeric')(
- oracleConnectorFromConfig(config)
+ oracleConnectorFromConfig(config), None
)
else:
raise UsageError("Unknown database type %r" (config.DBType,))
Modified: CalendarServer/trunk/calendarserver/tools/test/test_agent.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/test/test_agent.py 2013-08-12 18:17:19 UTC (rev 11598)
+++ CalendarServer/trunk/calendarserver/tools/test/test_agent.py 2013-08-12 18:56:46 UTC (rev 11599)
@@ -14,163 +14,168 @@
# limitations under the License.
##
-from calendarserver.tools.agent import AgentRealm
-from calendarserver.tools.agent import CustomDigestCredentialFactory
-from calendarserver.tools.agent import DirectoryServiceChecker
-from calendarserver.tools.agent import InactivityDetector
-from twistedcaldav.test.util import TestCase
-from twisted.internet.defer import inlineCallbacks
-from twisted.internet.task import Clock
-from twisted.cred.error import UnauthorizedLogin
-from twisted.web.resource import IResource
-from twisted.web.resource import ForbiddenResource
+try:
+ from calendarserver.tools.agent import AgentRealm
+ from calendarserver.tools.agent import CustomDigestCredentialFactory
+ from calendarserver.tools.agent import DirectoryServiceChecker
+ from calendarserver.tools.agent import InactivityDetector
+ from twistedcaldav.test.util import TestCase
+ from twisted.internet.defer import inlineCallbacks
+ from twisted.internet.task import Clock
+ from twisted.cred.error import UnauthorizedLogin
+ from twisted.web.resource import IResource
+ from twisted.web.resource import ForbiddenResource
+ RUN_TESTS = True
+except ImportError:
+ RUN_TESTS = False
-class AgentTestCase(TestCase):
+if RUN_TESTS:
+ class AgentTestCase(TestCase):
- def test_CustomDigestCredentialFactory(self):
- f = CustomDigestCredentialFactory("md5", "/Local/Default")
- challenge = f.getChallenge(FakeRequest())
- self.assertTrue("qop" not in challenge)
- self.assertEquals(challenge["algorithm"], "md5")
- self.assertEquals(challenge["realm"], "/Local/Default")
+ def test_CustomDigestCredentialFactory(self):
+ f = CustomDigestCredentialFactory("md5", "/Local/Default")
+ challenge = f.getChallenge(FakeRequest())
+ self.assertTrue("qop" not in challenge)
+ self.assertEquals(challenge["algorithm"], "md5")
+ self.assertEquals(challenge["realm"], "/Local/Default")
- @inlineCallbacks
- def test_DirectoryServiceChecker(self):
- c = DirectoryServiceChecker("/Local/Default")
- fakeOpenDirectory = FakeOpenDirectory()
- c.directoryModule = fakeOpenDirectory
+ @inlineCallbacks
+ def test_DirectoryServiceChecker(self):
+ c = DirectoryServiceChecker("/Local/Default")
+ fakeOpenDirectory = FakeOpenDirectory()
+ c.directoryModule = fakeOpenDirectory
- fields = {
- "username" : "foo",
- "realm" : "/Local/Default",
- "nonce" : 1,
- "uri" : "/gateway",
- "response" : "abc",
- "algorithm" : "md5",
- }
- creds = FakeCredentials("foo", fields)
+ fields = {
+ "username" : "foo",
+ "realm" : "/Local/Default",
+ "nonce" : 1,
+ "uri" : "/gateway",
+ "response" : "abc",
+ "algorithm" : "md5",
+ }
+ creds = FakeCredentials("foo", fields)
- # Record does not exist:
- fakeOpenDirectory.returnThisRecord(None)
- try:
- yield c.requestAvatarId(creds)
- except UnauthorizedLogin:
- pass
- else:
- self.fail("Didn't raise UnauthorizedLogin")
+ # Record does not exist:
+ fakeOpenDirectory.returnThisRecord(None)
+ try:
+ yield c.requestAvatarId(creds)
+ except UnauthorizedLogin:
+ pass
+ else:
+ self.fail("Didn't raise UnauthorizedLogin")
- # Record exists, but invalid credentials
- fakeOpenDirectory.returnThisRecord("fooRecord")
- fakeOpenDirectory.returnThisAuthResponse(False)
- try:
- yield c.requestAvatarId(creds)
- except UnauthorizedLogin:
- pass
- else:
- self.fail("Didn't raise UnauthorizedLogin")
+ # Record exists, but invalid credentials
+ fakeOpenDirectory.returnThisRecord("fooRecord")
+ fakeOpenDirectory.returnThisAuthResponse(False)
+ try:
+ yield c.requestAvatarId(creds)
+ except UnauthorizedLogin:
+ pass
+ else:
+ self.fail("Didn't raise UnauthorizedLogin")
- # Record exists, valid credentials
- fakeOpenDirectory.returnThisRecord("fooRecord")
- fakeOpenDirectory.returnThisAuthResponse(True)
- avatar = (yield c.requestAvatarId(creds))
- self.assertEquals(avatar, "foo")
+ # Record exists, valid credentials
+ fakeOpenDirectory.returnThisRecord("fooRecord")
+ fakeOpenDirectory.returnThisAuthResponse(True)
+ avatar = (yield c.requestAvatarId(creds))
+ self.assertEquals(avatar, "foo")
- # Record exists, but missing fields in credentials
- del creds.fields["nonce"]
- fakeOpenDirectory.returnThisRecord("fooRecord")
- fakeOpenDirectory.returnThisAuthResponse(False)
- try:
- yield c.requestAvatarId(creds)
- except UnauthorizedLogin:
- pass
- else:
- self.fail("Didn't raise UnauthorizedLogin")
+ # Record exists, but missing fields in credentials
+ del creds.fields["nonce"]
+ fakeOpenDirectory.returnThisRecord("fooRecord")
+ fakeOpenDirectory.returnThisAuthResponse(False)
+ try:
+ yield c.requestAvatarId(creds)
+ except UnauthorizedLogin:
+ pass
+ else:
+ self.fail("Didn't raise UnauthorizedLogin")
- def test_AgentRealm(self):
- realm = AgentRealm("root", ["abc"])
+ def test_AgentRealm(self):
+ realm = AgentRealm("root", ["abc"])
- # Valid avatar
- interface, resource, ignored = realm.requestAvatar("abc", None, IResource)
- self.assertEquals(resource, "root")
+ # Valid avatar
+ interface, resource, ignored = realm.requestAvatar("abc", None, IResource)
+ self.assertEquals(resource, "root")
- # Not allowed avatar
- interface, resource, ignored = realm.requestAvatar("def", None, IResource)
- self.assertTrue(isinstance(resource, ForbiddenResource))
+ # Not allowed avatar
+ interface, resource, ignored = realm.requestAvatar("def", None, IResource)
+ self.assertTrue(isinstance(resource, ForbiddenResource))
- # Interface unhandled
- try:
- realm.requestAvatar("def", None, None)
- except NotImplementedError:
- pass
- else:
- self.fail("Didn't raise NotImplementedError")
+ # Interface unhandled
+ try:
+ realm.requestAvatar("def", None, None)
+ except NotImplementedError:
+ pass
+ else:
+ self.fail("Didn't raise NotImplementedError")
-class InactivityDectectorTestCase(TestCase):
+ class InactivityDectectorTestCase(TestCase):
- def test_inactivity(self):
- clock = Clock()
+ def test_inactivity(self):
+ clock = Clock()
- self.inactivityReached = False
- def becameInactive():
- self.inactivityReached = True
+ self.inactivityReached = False
+ def becameInactive():
+ self.inactivityReached = True
- id = InactivityDetector(clock, 5, becameInactive)
+ id = InactivityDetector(clock, 5, becameInactive)
- # After 3 seconds, not inactive
- clock.advance(3)
- self.assertFalse(self.inactivityReached)
+ # After 3 seconds, not inactive
+ clock.advance(3)
+ self.assertFalse(self.inactivityReached)
- # Activity happens, pushing out the inactivity threshold
- id.activity()
- clock.advance(3)
- self.assertFalse(self.inactivityReached)
+ # Activity happens, pushing out the inactivity threshold
+ id.activity()
+ clock.advance(3)
+ self.assertFalse(self.inactivityReached)
- # Time passes without activity
- clock.advance(3)
- self.assertTrue(self.inactivityReached)
+ # Time passes without activity
+ clock.advance(3)
+ self.assertTrue(self.inactivityReached)
- id.stop()
+ id.stop()
-class FakeRequest(object):
+ class FakeRequest(object):
- def getClientIP(self):
- return "127.0.0.1"
+ def getClientIP(self):
+ return "127.0.0.1"
-class FakeOpenDirectory(object):
+ class FakeOpenDirectory(object):
- def returnThisRecord(self, response):
- self.recordResponse = response
+ def returnThisRecord(self, response):
+ self.recordResponse = response
- def getUserRecord(self, ignored, username):
- return self.recordResponse
+ def getUserRecord(self, ignored, username):
+ return self.recordResponse
- def returnThisAuthResponse(self, response):
- self.authResponse = response
+ def returnThisAuthResponse(self, response):
+ self.authResponse = response
- def authenticateUserDigest(self, ignored, node, username, challenge, response,
- method):
- return self.authResponse
+ def authenticateUserDigest(self, ignored, node, username, challenge, response,
+ method):
+ return self.authResponse
- ODNSerror = "Error"
+ ODNSerror = "Error"
-class FakeCredentials(object):
+ class FakeCredentials(object):
- def __init__(self, username, fields):
- self.username = username
- self.fields = fields
- self.method = "POST"
+ def __init__(self, username, fields):
+ self.username = username
+ self.fields = fields
+ self.method = "POST"
Modified: CalendarServer/trunk/calendarserver/tools/test/test_resources.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/test/test_resources.py 2013-08-12 18:17:19 UTC (rev 11598)
+++ CalendarServer/trunk/calendarserver/tools/test/test_resources.py 2013-08-12 18:56:46 UTC (rev 11599)
@@ -14,151 +14,149 @@
# limitations under the License.
##
-from calendarserver.tools.resources import migrateResources
-from twisted.internet.defer import inlineCallbacks, succeed
-from twistedcaldav.directory.directory import DirectoryService
-from twistedcaldav.test.util import TestCase
-
try:
+ from calendarserver.tools.resources import migrateResources
+ from twisted.internet.defer import inlineCallbacks, succeed
+ from twistedcaldav.directory.directory import DirectoryService
+ from twistedcaldav.test.util import TestCase
import dsattributes
strGUID = dsattributes.kDS1AttrGeneratedUID
strName = dsattributes.kDS1AttrDistinguishedName
+ RUN_TESTS = True
except ImportError:
- dsattributes = None
+ RUN_TESTS = False
-class StubDirectoryRecord(object):
+if RUN_TESTS:
+ class StubDirectoryRecord(object):
- def __init__(self, recordType, guid=None, shortNames=None, fullName=None):
- self.recordType = recordType
- self.guid = guid
- self.shortNames = shortNames
- self.fullName = fullName
+ def __init__(self, recordType, guid=None, shortNames=None, fullName=None):
+ self.recordType = recordType
+ self.guid = guid
+ self.shortNames = shortNames
+ self.fullName = fullName
-class StubDirectoryService(object):
+ class StubDirectoryService(object):
- def __init__(self, augmentService):
- self.records = {}
- self.augmentService = augmentService
+ def __init__(self, augmentService):
+ self.records = {}
+ self.augmentService = augmentService
- def recordWithGUID(self, guid):
- return None
+ def recordWithGUID(self, guid):
+ return None
- def createRecords(self, data):
- for recordType, recordData in data:
- guid = recordData["guid"]
- record = StubDirectoryRecord(recordType, guid=guid,
- shortNames=recordData['shortNames'],
- fullName=recordData['fullName'])
- self.records[guid] = record
+ def createRecords(self, data):
+ for recordType, recordData in data:
+ guid = recordData["guid"]
+ record = StubDirectoryRecord(recordType, guid=guid,
+ shortNames=recordData['shortNames'],
+ fullName=recordData['fullName'])
+ self.records[guid] = record
- def updateRecord(self, recordType, guid=None, shortNames=None,
- fullName=None):
- pass
+ def updateRecord(self, recordType, guid=None, shortNames=None,
+ fullName=None):
+ pass
-class StubAugmentRecord(object):
+ class StubAugmentRecord(object):
- def __init__(self, guid=None):
- self.guid = guid
- self.autoSchedule = True
+ def __init__(self, guid=None):
+ self.guid = guid
+ self.autoSchedule = True
-class StubAugmentService(object):
+ class StubAugmentService(object):
- records = {}
+ records = {}
- @classmethod
- def getAugmentRecord(cls, guid, recordType):
- if not cls.records.has_key(guid):
- record = StubAugmentRecord(guid=guid)
- cls.records[guid] = record
- return succeed(cls.records[guid])
+ @classmethod
+ def getAugmentRecord(cls, guid, recordType):
+ if not cls.records.has_key(guid):
+ record = StubAugmentRecord(guid=guid)
+ cls.records[guid] = record
+ return succeed(cls.records[guid])
- @classmethod
- def addAugmentRecords(cls, records):
- for record in records:
- cls.records[record.guid] = record
- return succeed(True)
+ @classmethod
+ def addAugmentRecords(cls, records):
+ for record in records:
+ cls.records[record.guid] = record
+ return succeed(True)
-class MigrateResourcesTestCase(TestCase):
+ class MigrateResourcesTestCase(TestCase):
- if dsattributes is None:
- skip = "dsattributes module not available"
+ @inlineCallbacks
+ def test_migrateResources(self):
- @inlineCallbacks
- def test_migrateResources(self):
+ data = {
+ dsattributes.kDSStdRecordTypeResources :
+ [
+ ['projector1', {
+ strGUID : '6C99E240-E915-4012-82FA-99E0F638D7EF',
+ strName : 'Projector 1'
+ }],
+ ['projector2', {
+ strGUID : '7C99E240-E915-4012-82FA-99E0F638D7EF',
+ strName : 'Projector 2'
+ }],
+ ],
+ dsattributes.kDSStdRecordTypePlaces :
+ [
+ ['office1', {
+ strGUID : '8C99E240-E915-4012-82FA-99E0F638D7EF',
+ strName : 'Office 1'
+ }],
+ ],
+ }
- data = {
- dsattributes.kDSStdRecordTypeResources :
- [
- ['projector1', {
- strGUID : '6C99E240-E915-4012-82FA-99E0F638D7EF',
- strName : 'Projector 1'
- }],
- ['projector2', {
- strGUID : '7C99E240-E915-4012-82FA-99E0F638D7EF',
- strName : 'Projector 2'
- }],
- ],
- dsattributes.kDSStdRecordTypePlaces :
- [
- ['office1', {
- strGUID : '8C99E240-E915-4012-82FA-99E0F638D7EF',
- strName : 'Office 1'
- }],
- ],
- }
+ def queryMethod(sourceService, recordType, verbose=False):
+ return data[recordType]
- def queryMethod(sourceService, recordType, verbose=False):
- return data[recordType]
+ directoryService = StubDirectoryService(StubAugmentService())
+ yield migrateResources(None, directoryService, queryMethod=queryMethod)
+ for guid, recordType in (
+ ('6C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
+ ('7C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
+ ('8C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_locations),
+ ):
+ self.assertTrue(guid in directoryService.records)
+ record = directoryService.records[guid]
+ self.assertEquals(record.recordType, recordType)
- directoryService = StubDirectoryService(StubAugmentService())
- yield migrateResources(None, directoryService, queryMethod=queryMethod)
- for guid, recordType in (
- ('6C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
- ('7C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
- ('8C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_locations),
- ):
- self.assertTrue(guid in directoryService.records)
- record = directoryService.records[guid]
- self.assertEquals(record.recordType, recordType)
+ self.assertTrue(guid in StubAugmentService.records)
- self.assertTrue(guid in StubAugmentService.records)
+ #
+ # Add more to OD and re-migrate
+ #
- #
- # Add more to OD and re-migrate
- #
+ data[dsattributes.kDSStdRecordTypeResources].append(
+ ['projector3', {
+ strGUID : '9C99E240-E915-4012-82FA-99E0F638D7EF',
+ strName : 'Projector 3'
+ }]
+ )
+ data[dsattributes.kDSStdRecordTypePlaces].append(
+ ['office2', {
+ strGUID : 'AC99E240-E915-4012-82FA-99E0F638D7EF',
+ strName : 'Office 2'
+ }]
+ )
- data[dsattributes.kDSStdRecordTypeResources].append(
- ['projector3', {
- strGUID : '9C99E240-E915-4012-82FA-99E0F638D7EF',
- strName : 'Projector 3'
- }]
- )
- data[dsattributes.kDSStdRecordTypePlaces].append(
- ['office2', {
- strGUID : 'AC99E240-E915-4012-82FA-99E0F638D7EF',
- strName : 'Office 2'
- }]
- )
+ yield migrateResources(None, directoryService, queryMethod=queryMethod)
- yield migrateResources(None, directoryService, queryMethod=queryMethod)
+ for guid, recordType in (
+ ('6C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
+ ('7C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
+ ('9C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
+ ('8C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_locations),
+ ('AC99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_locations),
+ ):
+ self.assertTrue(guid in directoryService.records)
+ record = directoryService.records[guid]
+ self.assertEquals(record.recordType, recordType)
- for guid, recordType in (
- ('6C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
- ('7C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
- ('9C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
- ('8C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_locations),
- ('AC99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_locations),
- ):
- self.assertTrue(guid in directoryService.records)
- record = directoryService.records[guid]
- self.assertEquals(record.recordType, recordType)
-
- self.assertTrue(guid in StubAugmentService.records)
+ self.assertTrue(guid in StubAugmentService.records)
Modified: CalendarServer/trunk/twistedcaldav/upgrade.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/upgrade.py 2013-08-12 18:17:19 UTC (rev 11598)
+++ CalendarServer/trunk/twistedcaldav/upgrade.py 2013-08-12 18:56:46 UTC (rev 11599)
@@ -38,7 +38,6 @@
from twistedcaldav import caldavxml
from twistedcaldav.directory import calendaruserproxy
-from twistedcaldav.directory.appleopendirectory import OpenDirectoryService
from twistedcaldav.directory.calendaruserproxyloader import XMLCalendarUserProxyLoader
from twistedcaldav.directory.directory import DirectoryService
from twistedcaldav.directory.directory import GroupMembershipCacheUpdater
@@ -62,12 +61,10 @@
from twisted.protocols.amp import AMP, Command, String, Boolean
from calendarserver.tap.util import getRootResource, FakeRequest, directoryFromConfig
-from calendarserver.tools.resources import migrateResources
from calendarserver.tools.util import getDirectory
from txdav.caldav.datastore.scheduling.imip.mailgateway import migrateTokensToStore
-
deadPropertyXattrPrefix = namedAny(
"txdav.base.propertystore.xattr.PropertyStore.deadPropertyXattrPrefix"
)
@@ -912,6 +909,12 @@
#
# Migrates locations and resources from OD
#
+ try:
+ from twistedcaldav.directory.appleopendirectory import OpenDirectoryService
+ from calendarserver.tools.resources import migrateResources
+ except ImportError:
+ return succeed(None)
+
log.warn("Migrating locations and resources")
userService = directory.serviceForRecordType("users")
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130812/94370c9a/attachment-0001.html>
More information about the calendarserver-changes
mailing list