def test_free_busy_set_tasks(self): """ Test that calendar-free-busy-set ignores tasks calendar. """ request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(set([str(child) for child in prop.children]), set(("/calendars/__uids__/user01/calendar/", ))) newfbset = set() newfbset.add("/calendars/users/user01/tasks/") newset = caldavxml.CalendarFreeBusySet( *[davxml.HRef(url) for url in newfbset]) yield inbox.writeProperty(newset, request) yield request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(len(prop.children), 0) yield request._newStoreTransaction.commit() calendar = yield request.locateResource( "/calendars/__uids__/user01/tasks/") self.assertFalse(calendar._newStoreObject.isUsedForFreeBusy()) calendar = yield request.locateResource( "/calendars/__uids__/user01/calendar/") self.assertFalse(calendar._newStoreObject.isUsedForFreeBusy())
def test_free_busy_set_tasks(self): """ Test that calendar-free-busy-set ignores tasks calendar. """ request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual( set([str(child) for child in prop.children]), set(( "/calendars/__uids__/user01/calendar/", )) ) newfbset = set() newfbset.add("/calendars/users/user01/tasks/") newset = caldavxml.CalendarFreeBusySet(*[davxml.HRef(url) for url in newfbset]) yield inbox.writeProperty(newset, request) yield request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(len(prop.children), 0) yield request._newStoreTransaction.commit() calendar = yield request.locateResource("/calendars/__uids__/user01/tasks/") self.assertFalse(calendar._newStoreObject.isUsedForFreeBusy()) calendar = yield request.locateResource("/calendars/__uids__/user01/calendar/") self.assertFalse(calendar._newStoreObject.isUsedForFreeBusy())
def test_free_busy_set_same(self): """ Test that calendar-free-busy-set has the correct value and can be reset to the same. """ request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(prop.children[0], davxml.HRef("/calendars/__uids__/user01/calendar/")) newfbset = set() newfbset.add("/calendars/users/user01/calendar/") newset = caldavxml.CalendarFreeBusySet(*[davxml.HRef(url) for url in newfbset]) yield inbox.writeProperty(newset, request) yield request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(prop.children[0], davxml.HRef("/calendars/__uids__/user01/calendar/")) yield request._newStoreTransaction.commit() calendar = yield request.locateResource("/calendars/__uids__/user01/calendar/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy())
def test_free_busy_set_same(self): """ Test that calendar-free-busy-set has the correct value and can be reset to the same. """ request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(prop.children[0], davxml.HRef("/calendars/__uids__/user01/calendar/")) newfbset = set() newfbset.add("/calendars/users/user01/calendar/") newset = caldavxml.CalendarFreeBusySet( *[davxml.HRef(url) for url in newfbset]) yield inbox.writeProperty(newset, request) yield request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(prop.children[0], davxml.HRef("/calendars/__uids__/user01/calendar/")) yield request._newStoreTransaction.commit() calendar = yield request.locateResource( "/calendars/__uids__/user01/calendar/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy())
def test_renderPrivileges(self): """ Verify that a directory listing includes children which you don't have access to. """ request = SimpleRequest(self.site, "GET", "/") def setEmptyACL(resource): resource.setAccessControlList( davxml.ACL()) # Empty ACL = no access return resource def renderRoot(_): d = request.locateResource("/") d.addCallback(lambda r: r.render(request)) return d def assertListing(response): data = [] d = readStream(response.stream, lambda s: data.append(str(s))) d.addCallback(lambda _: self.failIf( 'dir2/' not in "".join(data), "'dir2' expected in listing: %r" % (data, ))) return d d = request.locateResource("/dir2") d.addCallback(setEmptyACL) d.addCallback(renderRoot) d.addCallback(assertListing) return d
def _checkPrivileges(self, resource, url, principal, privilege, allowed): request = SimpleRequest(self.site, "GET", "/") def gotResource(resource): d = resource.checkPrivileges( request, (privilege,), principal=davxml.Principal(principal) ) if allowed: def onError(f): f.trap(AccessDeniedError) # print(resource.readDeadProperty(davxml.ACL)) self.fail( "%s should have %s privilege on %r" % (principal.sname(), privilege.sname(), resource) ) d.addErrback(onError) else: def expectAccessDenied(f): f.trap(AccessDeniedError) def onSuccess(_): # print(resource.readDeadProperty(davxml.ACL)) self.fail( "%s should not have %s privilege on %r" % (principal.sname(), privilege.sname(), resource) ) d.addCallbacks(onSuccess, expectAccessDenied) return d d = request.locateResource(url) d.addCallback(gotResource) return d
def test_renderPrivileges(self): """ Verify that a directory listing includes children which you don't have access to. """ request = SimpleRequest(self.site, "GET", "/") def setEmptyACL(resource): resource.setAccessControlList(davxml.ACL()) # Empty ACL = no access return resource def renderRoot(_): d = request.locateResource("/") d.addCallback(lambda r: r.render(request)) return d def assertListing(response): data = [] d = readStream(response.stream, lambda s: data.append(str(s))) d.addCallback(lambda _: self.failIf( 'dir2/' not in "".join(data), "'dir2' expected in listing: %r" % (data,) )) return d d = request.locateResource("/dir2") d.addCallback(setEmptyACL) d.addCallback(renderRoot) d.addCallback(assertListing) return d
def test_checkPrivileges(self): """ DAVResource.checkPrivileges() """ ds = [] authAllResource = AuthAllResource() requested_access = (davxml.All(), ) site = Site(authAllResource) def expectError(failure): failure.trap(AccessDeniedError) errors = failure.value.errors self.failUnless(len(errors) == 1) subpath, denials = errors[0] self.failUnless(subpath is None) self.failUnless( tuple(denials) == requested_access, "%r != %r" % (tuple(denials), requested_access)) def expectOK(result): self.failUnlessEquals(result, None) def _checkPrivileges(resource): d = resource.checkPrivileges(request, requested_access) return d # No auth; should deny request = SimpleRequest(site, "GET", "/") d = request.locateResource("/").addCallback( _checkPrivileges).addErrback(expectError) ds.append(d) # Has auth; should allow request = SimpleRequest(site, "GET", "/") request.authzUser = request.authnUser = self.rootresource.principalForUser( "gooduser") d = request.locateResource("/") d.addCallback(_checkPrivileges) d.addCallback(expectOK) ds.append(d) return DeferredList(ds)
def test_checkPrivileges(self): """ DAVResource.checkPrivileges() """ ds = [] authAllResource = AuthAllResource() requested_access = (davxml.All(),) site = Site(authAllResource) def expectError(failure): failure.trap(AccessDeniedError) errors = failure.value.errors self.failUnless(len(errors) == 1) subpath, denials = errors[0] self.failUnless(subpath is None) self.failUnless( tuple(denials) == requested_access, "%r != %r" % (tuple(denials), requested_access) ) def expectOK(result): self.failUnlessEquals(result, None) def _checkPrivileges(resource): d = resource.checkPrivileges(request, requested_access) return d # No auth; should deny request = SimpleRequest(site, "GET", "/") d = request.locateResource("/").addCallback(_checkPrivileges).addErrback(expectError) ds.append(d) # Has auth; should allow request = SimpleRequest(site, "GET", "/") request.authnUser = davxml.Principal(davxml.HRef("/users/d00d")) request.authzUser = davxml.Principal(davxml.HRef("/users/d00d")) d = request.locateResource("/") d.addCallback(_checkPrivileges) d.addCallback(expectOK) ds.append(d) return DeferredList(ds)
def test_free_busy_set_invalid_url(self): """ Test that calendar-free-busy-set will generate an error if an invalid value is used. """ request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) oldfbset = set(("/calendar",)) newfbset = set() newfbset.update(oldfbset) newfbset.add("/calendar-broken") newset = caldavxml.CalendarFreeBusySet(*[davxml.HRef(url) for url in newfbset]) yield self.failUnlessFailure(inbox.writeProperty(newset, request), HTTPError)
def test_findChildrenWithPrivileges(self): """ This test revokes read privileges for the C{"/file2"} and C{"/dir2/"} resource to verify that we can not find them giving our unauthenticated privileges. """ expected_children = [ "/file1", "/dir1/", ] request = SimpleRequest(self.site, "GET", "/") resource = waitForDeferred(request.locateResource("/")) yield resource resource = resource.getResult() def checkChildren(resource, uri): self.assertEquals(uri, resource.uri) if uri not in expected_children: unexpected_children.append(uri) else: found_children.append(uri) found_children = [] unexpected_children = [] privileges = waitForDeferred(resource.currentPrivileges(request)) yield privileges privileges = privileges.getResult() fc = resource.findChildren("1", request, checkChildren, privileges) completed = waitForDeferred(fc) yield completed completed.getResult() self.assertEquals( unexpected_children, [], "Found unexpected children: %r" % (unexpected_children,) ) expected_children.sort() found_children.sort() self.assertEquals(expected_children, found_children)
def test_free_busy_set_different(self): """ Test that calendar-free-busy-set has the correct value and can be reset to the same. """ txn = self.transactionUnderTest() home = (yield txn.calendarHomeWithUID("user01", create=True)) yield home.createCalendarWithName("calendar_new") yield self.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual( set([str(child) for child in prop.children]), set(( "/calendars/__uids__/user01/calendar/", "/calendars/__uids__/user01/calendar_new/", ))) calendar = yield request.locateResource( "/calendars/__uids__/user01/calendar_new/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy()) calendar = yield request.locateResource( "/calendars/__uids__/user01/calendar/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy()) newfbset = set() newfbset.add("/calendars/users/user01/calendar_new/") newset = caldavxml.CalendarFreeBusySet( *[davxml.HRef(url) for url in newfbset]) yield inbox.writeProperty(newset, request) yield request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual( prop.children[0], davxml.HRef("/calendars/__uids__/user01/calendar_new/")) yield request._newStoreTransaction.commit() calendar = yield request.locateResource( "/calendars/__uids__/user01/calendar_new/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy()) calendar = yield request.locateResource( "/calendars/__uids__/user01/calendar/") self.assertFalse(calendar._newStoreObject.isUsedForFreeBusy())
def test_findChildrenWithPrivileges(self): """ This test revokes read privileges for the C{"/file2"} and C{"/dir2/"} resource to verify that we can not find them giving our unauthenticated privileges. """ expected_children = [ "/file1", "/dir1/", ] request = SimpleRequest(self.site, "GET", "/") resource = waitForDeferred(request.locateResource("/")) yield resource resource = resource.getResult() def checkChildren(resource, uri): self.assertEquals(uri, resource.uri) if uri not in expected_children: unexpected_children.append(uri) else: found_children.append(uri) found_children = [] unexpected_children = [] privileges = waitForDeferred(resource.currentPrivileges(request)) yield privileges privileges = privileges.getResult() fc = resource.findChildren("1", request, checkChildren, privileges) completed = waitForDeferred(fc) yield completed completed.getResult() self.assertEquals( unexpected_children, [], "Found unexpected children: %r" % (unexpected_children, )) expected_children.sort() found_children.sort() self.assertEquals(expected_children, found_children)
def test_free_busy_set_invalid_url(self): """ Test that calendar-free-busy-set will generate an error if an invalid value is used. """ request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) oldfbset = set(("/calendar", )) newfbset = set() newfbset.update(oldfbset) newfbset.add("/calendar-broken") newset = caldavxml.CalendarFreeBusySet( *[davxml.HRef(url) for url in newfbset]) self.failUnlessFailure(inbox.writeProperty(newset, request), HTTPError)
def test_findChildrenCallbackRaises(self): """ Verify that when the user callback raises an exception the completion deferred returned by findChildren errbacks TODO: Verify that the user callback doesn't get called subsequently """ def raiseOnChild(resource, uri): raise Exception("Oh no!") def findChildren(resource): return self.assertFailure( resource.findChildren("infinity", request, raiseOnChild), Exception) request = SimpleRequest(self.site, "GET", "/") d = request.locateResource("/").addCallback(findChildren) return d
def test_findChildrenCallbackRaises(self): """ Verify that when the user callback raises an exception the completion deferred returned by findChildren errbacks TODO: Verify that the user callback doesn't get called subsequently """ def raiseOnChild(resource, uri): raise Exception("Oh no!") def findChildren(resource): return self.assertFailure( resource.findChildren("infinity", request, raiseOnChild), Exception ) request = SimpleRequest(self.site, "GET", "/") d = request.locateResource("/").addCallback(findChildren) return d
def test_free_busy_set_different(self): """ Test that calendar-free-busy-set has the correct value and can be reset to the same. """ txn = self.transactionUnderTest() home = (yield txn.calendarHomeWithUID("user01", create=True)) yield home.createCalendarWithName("calendar_new") yield self.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual( set([str(child) for child in prop.children]), set(( "/calendars/__uids__/user01/calendar/", "/calendars/__uids__/user01/calendar_new/", )) ) calendar = yield request.locateResource("/calendars/__uids__/user01/calendar_new/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy()) calendar = yield request.locateResource("/calendars/__uids__/user01/calendar/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy()) newfbset = set() newfbset.add("/calendars/users/user01/calendar_new/") newset = caldavxml.CalendarFreeBusySet(*[davxml.HRef(url) for url in newfbset]) yield inbox.writeProperty(newset, request) yield request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(prop.children[0], davxml.HRef("/calendars/__uids__/user01/calendar_new/")) yield request._newStoreTransaction.commit() calendar = yield request.locateResource("/calendars/__uids__/user01/calendar_new/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy()) calendar = yield request.locateResource("/calendars/__uids__/user01/calendar/") self.assertFalse(calendar._newStoreObject.isUsedForFreeBusy())
def test_findChildren(self): """ This test asserts that we have: 1) not found any unexpected children 2) found all expected children It does this for all depths C{"0"}, C{"1"}, and C{"infintiy"} """ expected_children = { "0": [], "1": [ "/file1", "/file2", "/dir1/", "/dir2/", ], "infinity": [ "/file1", "/file2", "/dir1/", "/dir1/subdir1/", "/dir2/", "/dir2/file1", "/dir2/file2", "/dir2/subdir1/", "/dir2/subdir1/file1", "/dir2/subdir1/file2", ], } request = SimpleRequest(self.site, "GET", "/") resource = waitForDeferred(request.locateResource("/")) yield resource resource = resource.getResult() def checkChildren(resource, uri): self.assertEquals(uri, resource.uri) if uri not in expected_children[depth]: unexpected_children.append(uri) else: found_children.append(uri) for depth in ["0", "1", "infinity"]: found_children = [] unexpected_children = [] fc = resource.findChildren(depth, request, checkChildren) completed = waitForDeferred(fc) yield completed completed.getResult() self.assertEquals( unexpected_children, [], "Found unexpected children: %r" % (unexpected_children,) ) expected_children[depth].sort() found_children.sort() self.assertEquals(expected_children[depth], found_children)
def test_findChildren(self): """ This test asserts that we have: 1) not found any unexpected children 2) found all expected children It does this for all depths C{"0"}, C{"1"}, and C{"infintiy"} """ expected_children = { "0": [], "1": [ "/file1", "/file2", "/dir1/", "/dir2/", ], "infinity": [ "/file1", "/file2", "/dir1/", "/dir1/subdir1/", "/dir2/", "/dir2/file1", "/dir2/file2", "/dir2/subdir1/", "/dir2/subdir1/file1", "/dir2/subdir1/file2", ], } request = SimpleRequest(self.site, "GET", "/") resource = waitForDeferred(request.locateResource("/")) yield resource resource = resource.getResult() def checkChildren(resource, uri): self.assertEquals(uri, resource.uri) if uri not in expected_children[depth]: unexpected_children.append(uri) else: found_children.append(uri) for depth in ["0", "1", "infinity"]: found_children = [] unexpected_children = [] fc = resource.findChildren(depth, request, checkChildren) completed = waitForDeferred(fc) yield completed completed.getResult() self.assertEquals( unexpected_children, [], "Found unexpected children: %r" % (unexpected_children, )) expected_children[depth].sort() found_children.sort() self.assertEquals(expected_children[depth], found_children)