[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