[CalendarServer-changes] [3767] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Feb 27 18:54:21 PST 2009


Revision: 3767
          http://trac.macosforge.org/projects/calendarserver/changeset/3767
Author:   cdaboo at apple.com
Date:     2009-02-27 18:54:21 -0800 (Fri, 27 Feb 2009)
Log Message:
-----------
Schedule-Tag support for DELETE and MOVE.

Modified Paths:
--------------
    CalendarServer/trunk/run
    CalendarServer/trunk/twistedcaldav/method/delete_common.py
    CalendarServer/trunk/twistedcaldav/method/put_common.py

Modified: CalendarServer/trunk/run
===================================================================
--- CalendarServer/trunk/run	2009-02-28 02:14:12 UTC (rev 3766)
+++ CalendarServer/trunk/run	2009-02-28 02:54:21 UTC (rev 3767)
@@ -707,7 +707,7 @@
 
 caldavtester="${top}/CalDAVTester";
 
-svn_get "CalDAVTester" "${caldavtester}" "${svn_uri_base}/CalDAVTester/trunk" 3742;
+svn_get "CalDAVTester" "${caldavtester}" "${svn_uri_base}/CalDAVTester/trunk" 3766;
 
 #
 # PyFlakes

Modified: CalendarServer/trunk/twistedcaldav/method/delete_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/delete_common.py	2009-02-28 02:14:12 UTC (rev 3766)
+++ CalendarServer/trunk/twistedcaldav/method/delete_common.py	2009-02-28 02:54:21 UTC (rev 3767)
@@ -29,7 +29,8 @@
 from twisted.web2.dav.util import joinURL
 from twisted.web2.http import HTTPError, StatusResponse
 
-from twistedcaldav.caldavxml import caldav_namespace
+from twistedcaldav.caldavxml import caldav_namespace, ScheduleTag
+from twistedcaldav.config import config
 from twistedcaldav.log import Logger
 from twistedcaldav.memcachelock import MemcacheLock, MemcacheLockTimeoutError
 from twistedcaldav.method.report_common import applyToCalendarCollections
@@ -50,6 +51,29 @@
         self.depth = depth
         self.internal_request = internal_request
 
+    def validIfScheduleMatch(self):
+        """
+        Check for If-ScheduleTag-Match header behavior.
+        """
+        
+        # Only when a direct request
+        if not self.internal_request:
+            header = self.request.headers.getHeader("If-Schedule-Tag-Match")
+            if header:
+                # Do "precondition" test
+                matched = False
+                if self.resource.exists() and self.resource.hasDeadProperty(ScheduleTag):
+                    scheduletag = self.resource.readDeadProperty(ScheduleTag)
+                    matched = (scheduletag == header)
+                if not matched:
+                    log.debug("If-Schedule-Tag-Match: header value '%s' does not match resource value '%s'" % (header, scheduletag,))
+                    raise HTTPError(responsecode.PRECONDITION_FAILED)
+            
+            elif config.Scheduling.CalDAV.ScheduleTagCompatibility:
+                # Actually by the time we get here the pre-condition will already have been tested and found to be OK
+                # (CalDAVFile.checkPreconditions) so we can ignore this case.
+                pass
+
     @inlineCallbacks
     def deleteResource(self, delresource, deluri, parent):
         """
@@ -104,6 +128,9 @@
         # TODO: need to use transaction based delete on live scheduling object resources
         # as the iTIP operation may fail and may need to prevent the delete from happening.
     
+        # Do If-Schedule-Tag-Match behavior first
+        self.validIfScheduleMatch()
+
         # Do quota checks before we start deleting things
         myquota = (yield delresource.quota(self.request))
         if myquota is not None:

Modified: CalendarServer/trunk/twistedcaldav/method/put_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/put_common.py	2009-02-28 02:14:12 UTC (rev 3766)
+++ CalendarServer/trunk/twistedcaldav/method/put_common.py	2009-02-28 02:54:21 UTC (rev 3767)
@@ -395,11 +395,13 @@
             header = self.request.headers.getHeader("If-Schedule-Tag-Match")
             if header:
                 # Do "precondition" test
-                matched = False
-                if self.destination.exists() and self.destination.hasDeadProperty(ScheduleTag):
-                    scheduletag = self.destination.readDeadProperty(ScheduleTag)
-                    matched = (scheduletag == header)
-                if not matched:
+                
+                # If COPY/MOVE get Schedule-Tag on source, else use destination
+                def _getScheduleTag(resource):
+                    return resource.readDeadProperty(ScheduleTag) if resource.exists() and resource.hasDeadProperty(ScheduleTag) else None
+
+                scheduletag = _getScheduleTag(self.source if self.source else self.destination)
+                if scheduletag != header:
                     log.debug("If-Schedule-Tag-Match: header value '%s' does not match resource value '%s'" % (header, scheduletag,))
                     raise HTTPError(responsecode.PRECONDITION_FAILED)
                 self.schedule_tag_match = True
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090227/905cae14/attachment.html>


More information about the calendarserver-changes mailing list