[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