Skip to content
This repository has been archived by the owner on Feb 13, 2020. It is now read-only.

Commit

Permalink
Make sure hidden trash collection is not exposed in sync report results.
Browse files Browse the repository at this point in the history
  • Loading branch information
cyrusdaboo committed May 22, 2015
1 parent 2a20a4e commit 1532efe
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 0 deletions.
101 changes: 101 additions & 0 deletions txdav/caldav/datastore/test/test_sql.py
Expand Up @@ -2348,6 +2348,107 @@ def test_removeAfterRevisionCleanup(self):
yield self.commit()


@inlineCallbacks
def test_homeSyncTokenWithTrash_Visible(self):
"""
L{ICalendarHome.resourceNamesSinceToken} will return the names of
calendar objects created since L{ICalendarHome.syncToken} last returned
a particular value.
"""

self.patch(config, "EnableTrashCollection", True)
self.patch(config, "ExposeTrashCollection", True)

home = yield self.homeUnderTest()
cal = yield self.calendarUnderTest()
st = yield home.syncToken()
yield cal.createCalendarObjectWithName("new.ics", Component.fromString(
test_event_text
))

obj1 = yield cal.calendarObjectWithName("2.ics")
yield obj1.remove()
yield home.createCalendarWithName("other-calendar")
st2 = yield home.syncToken()
self.failIfEquals(st, st2)

home = yield self.homeUnderTest()

expected = [
"calendar_1/",
"calendar_1/new.ics",
"calendar_1/2.ics",
"other-calendar/"
]

trash = yield home.getTrash()
if trash is not None:
trashed = yield trash.calendarObjects()
expected.extend([
"{}/".format(trash.name()),
"{}/{}".format(trash.name(), trashed[0].name()),
])

changed, deleted, invalid = yield home.resourceNamesSinceToken(
self.token2revision(st), "infinity")

self.assertEquals(set(changed), set(expected))
self.assertEquals(set(deleted), set(["calendar_1/2.ics"]))
self.assertEquals(invalid, [])

changed, deleted, invalid = yield home.resourceNamesSinceToken(
self.token2revision(st2), "infinity")
self.assertEquals(changed, [])
self.assertEquals(deleted, [])
self.assertEquals(invalid, [])


@inlineCallbacks
def test_homeSyncTokenWithTrash_Invisible(self):
"""
L{ICalendarHome.resourceNamesSinceToken} will return the names of
calendar objects created since L{ICalendarHome.syncToken} last returned
a particular value.
"""

self.patch(config, "EnableTrashCollection", True)

home = yield self.homeUnderTest()
cal = yield self.calendarUnderTest()
st = yield home.syncToken()
yield cal.createCalendarObjectWithName("new.ics", Component.fromString(
test_event_text
))

obj1 = yield cal.calendarObjectWithName("2.ics")
yield obj1.remove()
yield home.createCalendarWithName("other-calendar")
st2 = yield home.syncToken()
self.failIfEquals(st, st2)

home = yield self.homeUnderTest()

expected = [
"calendar_1/",
"calendar_1/new.ics",
"calendar_1/2.ics",
"other-calendar/"
]

changed, deleted, invalid = yield home.resourceNamesSinceToken(
self.token2revision(st), "infinity")

self.assertEquals(set(changed), set(expected))
self.assertEquals(set(deleted), set(["calendar_1/2.ics"]))
self.assertEquals(invalid, [])

changed, deleted, invalid = yield home.resourceNamesSinceToken(
self.token2revision(st2), "infinity")
self.assertEquals(changed, [])
self.assertEquals(deleted, [])
self.assertEquals(invalid, [])



class SchedulingTests(CommonCommonTests, unittest.TestCase):
"""
Expand Down
12 changes: 12 additions & 0 deletions txdav/common/datastore/sql.py
Expand Up @@ -2610,11 +2610,22 @@ def resourceNamesSinceRevision(self, revision, depth):
(yield self.doChangesQuery(revision))
]

if not config.ExposeTrashCollection:
trash = yield self.getTrash(create=False)
trashName = trash.name() if trash else None
else:
trashName = None

changed = set()
deleted = set()
invalid = set()
deleted_collections = set()
for path, name, wasdeleted in results:

# Don't report the trash if it is hidden
if trashName and path == trashName:
continue

if wasdeleted:
if name:
# Resource deleted - for depth "1" report collection as changed,
Expand Down Expand Up @@ -3154,6 +3165,7 @@ def recoverTrash(self, mode, recoveryID):
yield collection.fromTrash(restoreChildren=True)



class CommonHomeChild(FancyEqMixin, Memoizable, _SharedSyncLogic, HomeChildBase, SharingMixIn):
"""
Common ancestor class of AddressBooks and Calendars.
Expand Down

0 comments on commit 1532efe

Please sign in to comment.