[CalendarServer-changes] [13144] CalendarServer/branches/release/CalendarServer-5.2-dev
source_changes at macosforge.org
source_changes at macosforge.org
Thu Apr 3 10:59:12 PDT 2014
Revision: 13144
http://trac.calendarserver.org//changeset/13144
Author: cdaboo at apple.com
Date: 2014-04-03 10:59:12 -0700 (Thu, 03 Apr 2014)
Log Message:
-----------
Fix principal purge where a private event needs to be cancelled.
Modified Paths:
--------------
CalendarServer/branches/release/CalendarServer-5.2-dev/calendarserver/tools/purge.py
CalendarServer/branches/release/CalendarServer-5.2-dev/calendarserver/tools/test/test_purge.py
CalendarServer/branches/release/CalendarServer-5.2-dev/txdav/caldav/datastore/scheduling/freebusy.py
CalendarServer/branches/release/CalendarServer-5.2-dev/txdav/caldav/datastore/sql.py
CalendarServer/branches/release/CalendarServer-5.2-dev/txdav/common/datastore/sql.py
Modified: CalendarServer/branches/release/CalendarServer-5.2-dev/calendarserver/tools/purge.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-5.2-dev/calendarserver/tools/purge.py 2014-04-03 17:50:55 UTC (rev 13143)
+++ CalendarServer/branches/release/CalendarServer-5.2-dev/calendarserver/tools/purge.py 2014-04-03 17:59:12 UTC (rev 13144)
@@ -833,7 +833,7 @@
for calendarName in calendarNames:
- txn = self.store.newTransaction()
+ txn = self.store.newTransaction(authz_uid=uid)
storeCalHome = (yield txn.calendarHomeWithUID(uid))
calendar = (yield storeCalHome.calendarWithName(calendarName))
childNames = []
@@ -850,7 +850,7 @@
for childName in childNames:
- txn = self.store.newTransaction()
+ txn = self.store.newTransaction(authz_uid=uid)
storeCalHome = (yield txn.calendarHomeWithUID(uid))
calendar = (yield storeCalHome.calendarWithName(calendarName))
@@ -918,7 +918,7 @@
def _removeCalendarHome(self, uid):
try:
- txn = self.store.newTransaction()
+ txn = self.store.newTransaction(authz_uid=uid)
# Remove empty calendar collections (and calendar home if no more
# calendars)
@@ -936,7 +936,10 @@
else:
print("Deleting calendar: %s" % (calendarName,))
if not self.dryrun:
- (yield storeCalHome.removeChildWithName(calendarName))
+ if calColl.owned():
+ yield storeCalHome.removeChildWithName(calendarName)
+ else:
+ yield calColl.unshare()
if not remainingCalendars:
if self.verbose:
@@ -960,7 +963,7 @@
def _removeAddressbookHome(self, uid):
count = 0
- txn = self.store.newTransaction()
+ txn = self.store.newTransaction(authz_uid=uid)
try:
# Remove VCards
@@ -978,15 +981,18 @@
if not self.dryrun:
(yield card.remove())
count += 1
+ abName = abColl.name()
if self.verbose:
- abName = abColl.name()
if self.dryrun:
print("Would delete addressbook: %s" % (abName,))
else:
print("Deleting addressbook: %s" % (abName,))
if not self.dryrun:
# Also remove the addressbook collection itself
- (yield storeAbHome.removeChildWithName(abColl.name()))
+ if abColl.owned():
+ yield storeAbHome.removeChildWithName(abName)
+ else:
+ yield abColl.unshare()
if self.verbose:
if self.dryrun:
Modified: CalendarServer/branches/release/CalendarServer-5.2-dev/calendarserver/tools/test/test_purge.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-5.2-dev/calendarserver/tools/test/test_purge.py 2014-04-03 17:50:55 UTC (rev 13143)
+++ CalendarServer/branches/release/CalendarServer-5.2-dev/calendarserver/tools/test/test_purge.py 2014-04-03 17:59:12 UTC (rev 13144)
@@ -776,7 +776,27 @@
""".replace("\n", "\r\n")
+# Purging non-existent organizer; has existing attendee; repeating
+REPEATING_PUBLIC_EVENT_ORGANIZER_ICS = """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.1//EN
+X-CALENDARSERVER-ACCESS:PRIVATE
+BEGIN:VEVENT
+UID:8ED97931-9A19-4596-9D4D-52B36D6AB803
+SUMMARY:Repeating Organizer
+DTSTART:%s
+DURATION:PT1H
+RRULE:FREQ=DAILY;COUNT=400
+ORGANIZER:urn:uuid:6423F94A-6B76-4A3A-815B-D52CFD77935D
+ATTENDEE;CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:urn:uuid:6423F94A-6B76-4A3A-815B-D52CFD77935D
+ATTENDEE;CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:urn:uuid:291C2C29-B663-4342-8EA1-A055E6A04D65
+DTSTAMP:20100303T195203Z
+END:VEVENT
+END:VCALENDAR
+""".replace("\n", "\r\n") % (past,)
+
+
class PurgePrincipalTests(StoreTestCase):
"""
Tests for purging the data belonging to a given principal
@@ -796,6 +816,7 @@
uid : {
"calendar1" : {
"attachment.ics" : (ATTACHMENT_ICS, metadata,),
+ "organizer.ics" : (REPEATING_PUBLIC_EVENT_ORGANIZER_ICS, metadata,),
}
},
uid2 : {
@@ -870,7 +891,7 @@
count, ignored = (yield PurgePrincipalService.purgeUIDs(self.storeUnderTest(), self.directory,
self.rootResource, (self.uid,), verbose=False, proxies=False, completely=True))
- self.assertEquals(count, 1) # 1 event
+ self.assertEquals(count, 2) # 2 events
# Now you don't
txn = self._sqlCalendarStore.newTransaction()
@@ -890,3 +911,41 @@
home = (yield txn.calendarHomeWithUID(self.uid))
self.assertEquals(home, None)
(yield txn.commit())
+
+
+ @inlineCallbacks
+ def test_purgeUIDsNotCompletely(self):
+ """
+ Verify purgeUIDs removes some events, but leaves others and the home behind
+ """
+
+ self.patch(config, "EnablePrivateEvents", True)
+
+ # Now you see it
+ txn = self._sqlCalendarStore.newTransaction()
+ home = (yield txn.calendarHomeWithUID(self.uid))
+ self.assertNotEquals(home, None)
+ (yield txn.commit())
+
+ count, ignored = (yield PurgePrincipalService.purgeUIDs(self.storeUnderTest(), self.directory,
+ self.rootResource, (self.uid,), verbose=False, proxies=False, completely=False))
+ self.assertEquals(count, 1) # 2 events
+
+ # Now you still see it
+ txn = self._sqlCalendarStore.newTransaction()
+ home = (yield txn.calendarHomeWithUID(self.uid))
+ self.assertNotEquals(home, None)
+ # Verify calendar1 was unshared to uid2
+ home2 = (yield txn.calendarHomeWithUID(self.uid2))
+ self.assertEquals((yield home2.childWithName(self.sharedName)), None)
+ (yield txn.commit())
+
+ count, ignored = (yield PurgePrincipalService.purgeUIDs(self.storeUnderTest(), self.directory,
+ self.rootResource, (self.uid,), verbose=False, proxies=False, completely=False))
+ self.assertEquals(count, 1)
+
+ # And you still do
+ txn = self._sqlCalendarStore.newTransaction()
+ home = (yield txn.calendarHomeWithUID(self.uid))
+ self.assertNotEquals(home, None)
+ (yield txn.commit())
Modified: CalendarServer/branches/release/CalendarServer-5.2-dev/txdav/caldav/datastore/scheduling/freebusy.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-5.2-dev/txdav/caldav/datastore/scheduling/freebusy.py 2014-04-03 17:50:55 UTC (rev 13143)
+++ CalendarServer/branches/release/CalendarServer-5.2-dev/txdav/caldav/datastore/scheduling/freebusy.py 2014-04-03 17:59:12 UTC (rev 13144)
@@ -155,7 +155,7 @@
# the organizer is making the request
authz_uid = organizer_uid
authz_record = organizer_record
- if hasattr(calresource._txn, "_authz_uid") and calresource._txn._authz_uid != organizer_uid:
+ if calresource._txn._authz_uid is not None and calresource._txn._authz_uid != organizer_uid:
authz_uid = calresource._txn._authz_uid
authz_record = calresource.directoryService().recordWithUID(authz_uid)
Modified: CalendarServer/branches/release/CalendarServer-5.2-dev/txdav/caldav/datastore/sql.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-5.2-dev/txdav/caldav/datastore/sql.py 2014-04-03 17:50:55 UTC (rev 13143)
+++ CalendarServer/branches/release/CalendarServer-5.2-dev/txdav/caldav/datastore/sql.py 2014-04-03 17:59:12 UTC (rev 13144)
@@ -1706,7 +1706,7 @@
cutype == "RESOURCE" and config.Scheduling.Options.TrackUnscheduledResourceData):
# Find current principal and update modified by details
- if hasattr(self._txn, "_authz_uid"):
+ if self._txn._authz_uid is not None:
authz = self.directoryService().recordWithUID(self._txn._authz_uid)
prop = Property("X-CALENDARSERVER-MODIFIED-BY", authz.canonicalCalendarUserAddress())
prop.setParameter("CN", authz.displayName())
@@ -1734,7 +1734,7 @@
# Only DAV:owner is able to set the property to other than PUBLIC
if internal_state == ComponentUpdateState.NORMAL:
- if self.calendar().viewerHome().uid() != self._txn._authz_uid and access != Component.ACCESS_PUBLIC:
+ if (self._txn._authz_uid is None or self.calendar().viewerHome().uid() != self._txn._authz_uid) and access != Component.ACCESS_PUBLIC:
raise InvalidCalendarAccessError("Private event access level change not allowed")
self.accessMode = access
Modified: CalendarServer/branches/release/CalendarServer-5.2-dev/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-5.2-dev/txdav/common/datastore/sql.py 2014-04-03 17:50:55 UTC (rev 13143)
+++ CalendarServer/branches/release/CalendarServer-5.2-dev/txdav/common/datastore/sql.py 2014-04-03 17:59:12 UTC (rev 13144)
@@ -246,7 +246,7 @@
)
- def newTransaction(self, label="unlabeled", disableCache=False):
+ def newTransaction(self, label="unlabeled", disableCache=False, authz_uid=None):
"""
@see: L{IDataStore.newTransaction}
"""
@@ -258,7 +258,8 @@
self._notifierFactories if self._enableNotifications else {},
label,
self._migrating,
- disableCache
+ disableCache,
+ authz_uid,
)
if self.logTransactionWaits or self.timeoutTransactions:
CommonStoreTransactionMonitor(txn, self.logTransactionWaits,
@@ -455,9 +456,12 @@
id = 0
- def __init__(self, store, sqlTxn,
- enableCalendars, enableAddressBooks,
- notifierFactories, label, migrating=False, disableCache=False):
+ def __init__(
+ self, store, sqlTxn,
+ enableCalendars, enableAddressBooks,
+ notifierFactories, label, migrating=False, disableCache=False,
+ authz_uid=None,
+ ):
self._store = store
self._calendarHomes = {}
self._addressbookHomes = {}
@@ -473,6 +477,7 @@
self._queryCacher = None
else:
self._queryCacher = store.queryCacher
+ self._authz_uid = authz_uid
CommonStoreTransaction.id += 1
self._txid = CommonStoreTransaction.id
@@ -3253,7 +3258,7 @@
@param shared: whether or not the owned collection is "shared"
@type shared: C{bool}
"""
- assert self.owned()
+ assert self.owned(), "Cannot change share mode on a shared collection"
self._bindMessage = "shared" if shared else None
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140403/013609bc/attachment-0001.html>
More information about the calendarserver-changes
mailing list