[CalendarServer-changes] [4203] CalendarServer/branches/release/CalendarServer-2.2-dev

source_changes at macosforge.org source_changes at macosforge.org
Thu May 7 13:29:47 PDT 2009


Revision: 4203
          http://trac.macosforge.org/projects/calendarserver/changeset/4203
Author:   wsanchez at apple.com
Date:     2009-05-07 13:29:47 -0700 (Thu, 07 May 2009)
Log Message:
-----------
Pulled up r4194 from trunk.

Modified Paths:
--------------
    CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/instance.py
    CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/method/put_common.py
    CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/scheduling/processing.py
    CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/test/test_icalendar.py

Property Changed:
----------------
    CalendarServer/branches/release/CalendarServer-2.2-dev/
    CalendarServer/branches/release/CalendarServer-2.2-dev/doc/Extensions/caldav-privatecomments.txt
    CalendarServer/branches/release/CalendarServer-2.2-dev/doc/Extensions/caldav-privatecomments.xml
    CalendarServer/branches/release/CalendarServer-2.2-dev/doc/Extensions/caldav-schedulingchanges.txt
    CalendarServer/branches/release/CalendarServer-2.2-dev/doc/Extensions/caldav-schedulingchanges.xml


Property changes on: CalendarServer/branches/release/CalendarServer-2.2-dev
___________________________________________________________________
Modified: svn:mergeinfo
   - /CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
/CalendarServer/trunk:4105-4107,4113-4116,4121-4124,4137-4139,4141-4144,4154-4159,4163-4167,4172,4174-4176,4178-4180
   + /CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
/CalendarServer/trunk:4105-4107,4113-4116,4121-4124,4137-4139,4141-4144,4154-4159,4163-4167,4172,4174-4176,4178-4180,4194


Property changes on: CalendarServer/branches/release/CalendarServer-2.2-dev/doc/Extensions/caldav-privatecomments.txt
___________________________________________________________________
Modified: svn:mergeinfo
   - /CalendarServer/branches/users/cdaboo/attendee-comments-2886/doc/Extensions/caldav-privatecomments-00.txt:2887-2910
/CalendarServer/branches/users/cdaboo/byebye-serviceslocator-2937/doc/Extensions/caldav-privatecomments-00.txt:2938-3097
/CalendarServer/branches/users/cdaboo/implicit-if-match-3306/doc/Extensions/caldav-privatecomments.txt:3307-3349
/CalendarServer/branches/users/cdaboo/implicitauto-2947/doc/Extensions/caldav-privatecomments-00.txt:2948-2989
/CalendarServer/branches/users/cdaboo/location-partial-accept-3573/doc/Extensions/caldav-privatecomments.txt:3574-3581
/CalendarServer/branches/users/sagen/resource-delegates-4038/doc/Extensions/caldav-privatecomments.txt:4040-4067
/CalendarServer/branches/users/sagen/resource-delegates-4066/doc/Extensions/caldav-privatecomments.txt:4068-4075
/CalendarServer/trunk/doc/Extensions/caldav-privatecomments.txt:4105-4107,4113-4116,4121-4124,4137-4139,4141-4144,4154-4159,4163-4167,4172,4174-4176,4178-4180
   + /CalendarServer/branches/users/cdaboo/attendee-comments-2886/doc/Extensions/caldav-privatecomments-00.txt:2887-2910
/CalendarServer/branches/users/cdaboo/byebye-serviceslocator-2937/doc/Extensions/caldav-privatecomments-00.txt:2938-3097
/CalendarServer/branches/users/cdaboo/implicit-if-match-3306/doc/Extensions/caldav-privatecomments.txt:3307-3349
/CalendarServer/branches/users/cdaboo/implicitauto-2947/doc/Extensions/caldav-privatecomments-00.txt:2948-2989
/CalendarServer/branches/users/cdaboo/location-partial-accept-3573/doc/Extensions/caldav-privatecomments.txt:3574-3581
/CalendarServer/branches/users/sagen/resource-delegates-4038/doc/Extensions/caldav-privatecomments.txt:4040-4067
/CalendarServer/branches/users/sagen/resource-delegates-4066/doc/Extensions/caldav-privatecomments.txt:4068-4075
/CalendarServer/trunk/doc/Extensions/caldav-privatecomments.txt:4105-4107,4113-4116,4121-4124,4137-4139,4141-4144,4154-4159,4163-4167,4172,4174-4176,4178-4180,4194


Property changes on: CalendarServer/branches/release/CalendarServer-2.2-dev/doc/Extensions/caldav-privatecomments.xml
___________________________________________________________________
Modified: svn:mergeinfo
   - /CalendarServer/branches/users/cdaboo/attendee-comments-2886/doc/Extensions/caldav-privatecomments-00.xml:2887-2910
/CalendarServer/branches/users/cdaboo/byebye-serviceslocator-2937/doc/Extensions/caldav-privatecomments-00.xml:2938-3097
/CalendarServer/branches/users/cdaboo/implicit-if-match-3306/doc/Extensions/caldav-privatecomments.xml:3307-3349
/CalendarServer/branches/users/cdaboo/implicitauto-2947/doc/Extensions/caldav-privatecomments-00.xml:2948-2989
/CalendarServer/branches/users/cdaboo/location-partial-accept-3573/doc/Extensions/caldav-privatecomments.xml:3574-3581
/CalendarServer/branches/users/sagen/resource-delegates-4038/doc/Extensions/caldav-privatecomments.xml:4040-4067
/CalendarServer/branches/users/sagen/resource-delegates-4066/doc/Extensions/caldav-privatecomments.xml:4068-4075
/CalendarServer/trunk/doc/Extensions/caldav-privatecomments.xml:4105-4107,4113-4116,4121-4124,4137-4139,4141-4144,4154-4159,4163-4167,4172,4174-4176,4178-4180
   + /CalendarServer/branches/users/cdaboo/attendee-comments-2886/doc/Extensions/caldav-privatecomments-00.xml:2887-2910
/CalendarServer/branches/users/cdaboo/byebye-serviceslocator-2937/doc/Extensions/caldav-privatecomments-00.xml:2938-3097
/CalendarServer/branches/users/cdaboo/implicit-if-match-3306/doc/Extensions/caldav-privatecomments.xml:3307-3349
/CalendarServer/branches/users/cdaboo/implicitauto-2947/doc/Extensions/caldav-privatecomments-00.xml:2948-2989
/CalendarServer/branches/users/cdaboo/location-partial-accept-3573/doc/Extensions/caldav-privatecomments.xml:3574-3581
/CalendarServer/branches/users/sagen/resource-delegates-4038/doc/Extensions/caldav-privatecomments.xml:4040-4067
/CalendarServer/branches/users/sagen/resource-delegates-4066/doc/Extensions/caldav-privatecomments.xml:4068-4075
/CalendarServer/trunk/doc/Extensions/caldav-privatecomments.xml:4105-4107,4113-4116,4121-4124,4137-4139,4141-4144,4154-4159,4163-4167,4172,4174-4176,4178-4180,4194


Property changes on: CalendarServer/branches/release/CalendarServer-2.2-dev/doc/Extensions/caldav-schedulingchanges.txt
___________________________________________________________________
Modified: svn:mergeinfo
   - /CalendarServer/branches/users/cdaboo/attendee-comments-2886/doc/Extensions/caldav-schedulingchanges-01.txt:2887-2910
/CalendarServer/branches/users/cdaboo/byebye-serviceslocator-2937/doc/Extensions/caldav-schedulingchanges-01.txt:2938-3097
/CalendarServer/branches/users/cdaboo/implicit-if-match-3306/doc/Extensions/caldav-schedulingchanges.txt:3307-3349
/CalendarServer/branches/users/cdaboo/implicitauto-2947/doc/Extensions/caldav-schedulingchanges-01.txt:2948-2989
/CalendarServer/branches/users/cdaboo/location-partial-accept-3573/doc/Extensions/caldav-schedulingchanges.txt:3574-3581
/CalendarServer/branches/users/sagen/resource-delegates-4038/doc/Extensions/caldav-schedulingchanges.txt:4040-4067
/CalendarServer/branches/users/sagen/resource-delegates-4066/doc/Extensions/caldav-schedulingchanges.txt:4068-4075
/CalendarServer/trunk/doc/Extensions/caldav-schedulingchanges.txt:4105-4107,4113-4116,4121-4124,4137-4139,4141-4144,4154-4159,4163-4167,4172,4174-4176,4178-4180
   + /CalendarServer/branches/users/cdaboo/attendee-comments-2886/doc/Extensions/caldav-schedulingchanges-01.txt:2887-2910
/CalendarServer/branches/users/cdaboo/byebye-serviceslocator-2937/doc/Extensions/caldav-schedulingchanges-01.txt:2938-3097
/CalendarServer/branches/users/cdaboo/implicit-if-match-3306/doc/Extensions/caldav-schedulingchanges.txt:3307-3349
/CalendarServer/branches/users/cdaboo/implicitauto-2947/doc/Extensions/caldav-schedulingchanges-01.txt:2948-2989
/CalendarServer/branches/users/cdaboo/location-partial-accept-3573/doc/Extensions/caldav-schedulingchanges.txt:3574-3581
/CalendarServer/branches/users/sagen/resource-delegates-4038/doc/Extensions/caldav-schedulingchanges.txt:4040-4067
/CalendarServer/branches/users/sagen/resource-delegates-4066/doc/Extensions/caldav-schedulingchanges.txt:4068-4075
/CalendarServer/trunk/doc/Extensions/caldav-schedulingchanges.txt:4105-4107,4113-4116,4121-4124,4137-4139,4141-4144,4154-4159,4163-4167,4172,4174-4176,4178-4180,4194


Property changes on: CalendarServer/branches/release/CalendarServer-2.2-dev/doc/Extensions/caldav-schedulingchanges.xml
___________________________________________________________________
Modified: svn:mergeinfo
   - /CalendarServer/branches/users/cdaboo/attendee-comments-2886/doc/Extensions/caldav-schedulingchanges-01.xml:2887-2910
/CalendarServer/branches/users/cdaboo/byebye-serviceslocator-2937/doc/Extensions/caldav-schedulingchanges-01.xml:2938-3097
/CalendarServer/branches/users/cdaboo/implicit-if-match-3306/doc/Extensions/caldav-schedulingchanges.xml:3307-3349
/CalendarServer/branches/users/cdaboo/implicitauto-2947/doc/Extensions/caldav-schedulingchanges-01.xml:2948-2989
/CalendarServer/branches/users/cdaboo/location-partial-accept-3573/doc/Extensions/caldav-schedulingchanges.xml:3574-3581
/CalendarServer/branches/users/sagen/resource-delegates-4038/doc/Extensions/caldav-schedulingchanges.xml:4040-4067
/CalendarServer/branches/users/sagen/resource-delegates-4066/doc/Extensions/caldav-schedulingchanges.xml:4068-4075
/CalendarServer/trunk/doc/Extensions/caldav-schedulingchanges.xml:4105-4107,4113-4116,4121-4124,4137-4139,4141-4144,4154-4159,4163-4167,4172,4174-4176,4178-4180
   + /CalendarServer/branches/users/cdaboo/attendee-comments-2886/doc/Extensions/caldav-schedulingchanges-01.xml:2887-2910
/CalendarServer/branches/users/cdaboo/byebye-serviceslocator-2937/doc/Extensions/caldav-schedulingchanges-01.xml:2938-3097
/CalendarServer/branches/users/cdaboo/implicit-if-match-3306/doc/Extensions/caldav-schedulingchanges.xml:3307-3349
/CalendarServer/branches/users/cdaboo/implicitauto-2947/doc/Extensions/caldav-schedulingchanges-01.xml:2948-2989
/CalendarServer/branches/users/cdaboo/location-partial-accept-3573/doc/Extensions/caldav-schedulingchanges.xml:3574-3581
/CalendarServer/branches/users/sagen/resource-delegates-4038/doc/Extensions/caldav-schedulingchanges.xml:4040-4067
/CalendarServer/branches/users/sagen/resource-delegates-4066/doc/Extensions/caldav-schedulingchanges.xml:4068-4075
/CalendarServer/trunk/doc/Extensions/caldav-schedulingchanges.xml:4105-4107,4113-4116,4121-4124,4137-4139,4141-4144,4154-4159,4163-4167,4172,4174-4176,4178-4180,4194

Modified: CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/instance.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/instance.py	2009-05-07 07:07:12 UTC (rev 4202)
+++ CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/instance.py	2009-05-07 20:29:47 UTC (rev 4203)
@@ -36,6 +36,14 @@
     def __repr__(self):
         return "<%s max:%s>" % (self.__class__.__name__, self.max_allowed)
 
+class InvalidOverriddenInstanceError(Exception):
+    def __init__(self, rid):
+        Exception.__init__(self)
+        self.rid = rid
+
+    def __repr__(self):
+        return "<%s invalid:%s>" % (self.__class__.__name__, self.rid)
+
 class Instance(object):
     
     __slots__ = ["component", "start", "end", "rid", "overridden", "future"]
@@ -115,6 +123,7 @@
         """
         
         # Look at each component type
+        got_master = False
         overrides = []
         for component in componentSet:
             if component.name() == "VEVENT":
@@ -122,11 +131,13 @@
                     overrides.append(component)
                 else:
                     self._addMasterEventComponent(component, limit)
+                    got_master = True
             elif component.name() == "VTODO":
                 if component.hasProperty("RECURRENCE-ID"):
                     overrides.append(component)
                 else:
                     self._addMasterToDoComponent(component, limit)
+                    got_master = True
             elif component.name() == "VJOURNAL":
                 #TODO: VJOURNAL
                 raise NotImplementedError("VJOURNAL recurrence expansion not supported yet")
@@ -140,18 +151,19 @@
                 else:
                     # AVAILABLE components are just like VEVENT components
                     self._addMasterEventComponent(component, limit)
+                    got_master = True
             
         for component in overrides:
             if component.name() == "VEVENT":
-                self._addOverrideEventComponent(component)
+                self._addOverrideEventComponent(component, limit, got_master)
             elif component.name() == "VTODO":
-                self._addOverrideToDoComponent(component)
+                self._addOverrideToDoComponent(component, limit, got_master)
             elif component.name() == "VJOURNAL":
                 #TODO: VJOURNAL
                 raise NotImplementedError("VJOURNAL recurrence expansion not supported yet")
             elif component.name() == "AVAILABLE":
                 # AVAILABLE components are just like VEVENT components
-                self._addOverrideEventComponent(component)
+                self._addOverrideEventComponent(component, limit, got_master)
 
     def addInstance(self, instance):
         """
@@ -191,12 +203,12 @@
 
         self._addMasterComponent(component, limit, start, end, duration)
 
-    def _addOverrideEventComponent(self, component):
+    def _addOverrideEventComponent(self, component, limit, got_master):
         """
         Add the specified overridden VEVENT Component to the instance list, replacing 
         the one generated by the master component.
         @param component: the overridden Component.
-        @param limit: the end datetime.datetime for expansion.
+        @param got_master: whether a master component has already been expanded.
         """
         
         #TODO: This does not take into account THISANDPRIOR - only THISANDFUTURE
@@ -218,7 +230,7 @@
         else:
             duration = differenceDateTime(start, end)
 
-        self._addOverrideComponent(component, start, end)
+        self._addOverrideComponent(component, limit, start, end, got_master)
 
     def _addMasterToDoComponent(self, component, limit):
         """
@@ -241,12 +253,12 @@
 
         self._addMasterComponent(component, limit, start, due, duration)
 
-    def _addOverrideToDoComponent(self, component):
+    def _addOverrideToDoComponent(self, component, limit, got_master):
         """
         Add the specified overridden VTODO Component to the instance list, replacing 
         the one generated by the master component.
         @param component: the overridden Component.
-        @param limit: the end datetime.datetime for expansion.
+        @param got_master: whether a master component has already been expanded.
         """
         
         #TODO: This does not take into account THISANDPRIOR - only THISANDFUTURE
@@ -262,7 +274,7 @@
         elif due is None:
             due = start
 
-        self._addOverrideComponent(component, start, due)
+        self._addOverrideComponent(component, limit, start, due, got_master)
 
     def _addMasterComponent(self, component, limit, start, end, duration):
         # Always add first instance if included in range.
@@ -294,7 +306,7 @@
                 endDate = normalizeForIndex(endDate)
                 self.addInstance(Instance(component, startDate, endDate))
     
-    def _addOverrideComponent(self, component, start, end):
+    def _addOverrideComponent(self, component, limit, start, end, got_master):
 
         # Get the recurrence override info
         rid = component.getRecurrenceIDUTC()
@@ -304,6 +316,16 @@
         start = normalizeForIndex(start)
         end = normalizeForIndex(end)
         rid = normalizeForIndex(rid)
+
+        # Make sure start is within the limit
+        if compareDateTime(start, limit) > 0 and compareDateTime(rid, limit) > 0:
+            return
+
+        # Make sure override RECURRENCE-ID is a valid instance of the master
+        if got_master:
+            if str(rid) not in self.instances:
+                raise InvalidOverriddenInstanceError(str(rid))
+        
         self.addInstance(Instance(component, start, end, rid, True, range))
         
         # Handle THISANDFUTURE if present

Modified: CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/method/put_common.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/method/put_common.py	2009-05-07 07:07:12 UTC (rev 4202)
+++ CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/method/put_common.py	2009-05-07 20:29:47 UTC (rev 4203)
@@ -57,7 +57,8 @@
 from twistedcaldav.fileops import copyWithXAttrs
 from twistedcaldav.ical import Component, Property
 from twistedcaldav.index import ReservationError
-from twistedcaldav.instance import TooManyInstancesError
+from twistedcaldav.instance import TooManyInstancesError,\
+    InvalidOverriddenInstanceError
 from twistedcaldav.log import Logger
 from twistedcaldav.memcachelock import MemcacheLock, MemcacheLockTimeoutError
 from twistedcaldav.scheduling.implicit import ImplicitScheduler
@@ -1082,4 +1083,12 @@
             if self.rollback:
                 self.rollback.Rollback()
 
-            raise err
+            if isinstance(err, InvalidOverriddenInstanceError):
+                raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (caldav_namespace, "valid-calendar-data")))
+            elif isinstance(err, TooManyInstancesError):
+                raise HTTPError(ErrorResponse(
+                    responsecode.FORBIDDEN,
+                        NumberOfRecurrencesWithinLimits(PCDATAElement(str(err.max_allowed)))
+                    ))
+            else:
+                raise err

Modified: CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/scheduling/processing.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/scheduling/processing.py	2009-05-07 07:07:12 UTC (rev 4202)
+++ CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/scheduling/processing.py	2009-05-07 20:29:47 UTC (rev 4203)
@@ -274,7 +274,7 @@
                 log.error("No default calendar for recipient: '%s'." % (self.recipient.cuaddr,))
                 raise ImplicitProcessorException(iTIPRequestStatus.NO_USER_SUPPORT)
 
-            log.debug("ImplicitProcessing - originator '%s' to recipient '%s' ignoring METHOD:REQUEST, UID: '%s' - new processed" % (self.originator.cuaddr, self.recipient.cuaddr, self.uid))
+            log.debug("ImplicitProcessing - originator '%s' to recipient '%s' processing METHOD:REQUEST, UID: '%s' - new processed" % (self.originator.cuaddr, self.recipient.cuaddr, self.uid))
             autoprocessed = (yield self.recipient.principal.getAutoSchedule())
             new_calendar = iTipProcessing.processNewRequest(self.message, self.recipient.cuaddr, autoprocessing=autoprocessed)
             name =  md5(str(new_calendar) + str(time.time()) + default.fp.path).hexdigest() + ".ics"

Modified: CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/test/test_icalendar.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/test/test_icalendar.py	2009-05-07 07:07:12 UTC (rev 4202)
+++ CalendarServer/branches/release/CalendarServer-2.2-dev/twistedcaldav/test/test_icalendar.py	2009-05-07 20:29:47 UTC (rev 4203)
@@ -24,6 +24,7 @@
 
 from twistedcaldav.ical import Component, parse_date, parse_datetime,\
     parse_date_or_datetime, parse_duration, Property
+from twistedcaldav.instance import InvalidOverriddenInstanceError
 import twistedcaldav.test.util
 
 from vobject.icalendar import utc
@@ -1532,14 +1533,62 @@
                     datetime.datetime(2007, 11, 16, 0, 0, 0, tzinfo=tzutc()),
                 )
             ),
+            (
+                "Recurring with override",
+                """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//PYVOBJECT//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890-1
+DTSTART:20071114T000000Z
+DURATION:P1H
+RRULE:FREQ=DAILY;COUNT=2
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890-1
+RECURRENCE-ID:20071115T000000Z
+DTSTART:20071115T010000Z
+DURATION:P1H
+END:VEVENT
+END:VCALENDAR
+""",
+                (
+                    datetime.datetime(2007, 11, 14, 0, 0, 0, tzinfo=tzutc()),
+                    datetime.datetime(2007, 11, 15, 1, 0, 0, tzinfo=tzutc()),
+                )
+            ),
+            (
+                "Recurring with invalid override",
+                """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//PYVOBJECT//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890-1
+DTSTART:20071114T000000Z
+DURATION:P1H
+RRULE:FREQ=DAILY;COUNT=2
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890-1
+RECURRENCE-ID:20071115T010000Z
+DTSTART:20071115T000000Z
+DURATION:P1H
+END:VEVENT
+END:VCALENDAR
+""",
+                None
+            ),
         )
         
         for description, original, results in data:
             component = Component.fromString(original)
-            instances = component.expandTimeRanges(datetime.date(2100, 1, 1))
-            self.assertTrue(len(instances.instances) == len(results), "%s: wrong number of instances" % (description,))
-            for instance in instances:
-                self.assertTrue(instances[instance].start in results, "%s: %s missing" % (description, instance,))
+            if results is None:
+                self.assertRaises(InvalidOverriddenInstanceError, component.expandTimeRanges, datetime.date(2100, 1, 1))
+            else:
+                instances = component.expandTimeRanges(datetime.date(2100, 1, 1))
+                self.assertTrue(len(instances.instances) == len(results), "%s: wrong number of instances" % (description,))
+                for instance in instances:
+                    self.assertTrue(instances[instance].start in results, "%s: %s missing" % (description, instance,))
        
     def test_has_property_in_any_component(self):
         
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090507/44fe63ce/attachment-0001.html>


More information about the calendarserver-changes mailing list