[CalendarServer-changes] [3620] CalendarServer/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Wed Jan 28 15:17:49 PST 2009
Revision: 3620
http://trac.macosforge.org/projects/calendarserver/changeset/3620
Author: cdaboo at apple.com
Date: 2009-01-28 15:17:49 -0800 (Wed, 28 Jan 2009)
Log Message:
-----------
Reject invalid recurrence components.
Modified Paths:
--------------
CalendarServer/trunk/run
CalendarServer/trunk/twistedcaldav/ical.py
Modified: CalendarServer/trunk/run
===================================================================
--- CalendarServer/trunk/run 2009-01-28 23:16:21 UTC (rev 3619)
+++ CalendarServer/trunk/run 2009-01-28 23:17:49 UTC (rev 3620)
@@ -692,7 +692,7 @@
caldavtester="${top}/CalDAVTester";
-svn_get "CalDAVTester" "${caldavtester}" "${svn_uri_base}/CalDAVTester/trunk" 3608;
+svn_get "CalDAVTester" "${caldavtester}" "${svn_uri_base}/CalDAVTester/trunk" 3619;
#
# Calendar Server
Modified: CalendarServer/trunk/twistedcaldav/ical.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/ical.py 2009-01-28 23:16:21 UTC (rev 3619)
+++ CalendarServer/trunk/twistedcaldav/ical.py 2009-01-28 23:17:49 UTC (rev 3620)
@@ -1042,12 +1042,14 @@
# Must not contain more than one type of iCalendar component, except for
# the required timezone components, and component UIDs must match
#
- ctype = None
- component_id = None
- component_rids = set()
- timezone_refs = set()
- timezones = set()
- got_master = False
+ ctype = None
+ component_id = None
+ component_rids = set()
+ timezone_refs = set()
+ timezones = set()
+ got_master = False
+ got_override = False
+ master_recurring = False
for subcomponent in self.subcomponents():
# Disallowed in CalDAV-Access-08, section 4.1
@@ -1070,21 +1072,32 @@
uid = subcomponent.propertyValue("UID")
if uid is None:
raise ValueError("All components must have UIDs")
-
+ rid = subcomponent.getRecurrenceIDUTC()
+
+ # Verify that UIDs are the same
if component_id is None:
component_id = uid
- else:
- if component_id != uid:
+ elif component_id != uid:
raise ValueError("Calendar resources may not contain components with different UIDs " +
"(%s and %s found)" % (component_id, subcomponent.propertyValue("UID")))
- elif subcomponent.propertyValue("Recurrence-ID") is None:
- if got_master:
- raise ValueError("Calendar resources may not contain components with the same UIDs and no Recurrence-IDs " +
- "(%s and %s found)" % (component_id, subcomponent.propertyValue("UID")))
- else:
- got_master = True
-
- rid = subcomponent.getRecurrenceIDUTC()
+
+ # Verify that there is only one master component
+ if rid is None:
+ if got_master:
+ raise ValueError("Calendar resources may not contain components with the same UIDs and no Recurrence-IDs " +
+ "(%s and %s found)" % (component_id, subcomponent.propertyValue("UID")))
+ else:
+ got_master = True
+ master_recurring = subcomponent.hasProperty("RRULE") or subcomponent.hasProperty("RDATE")
+ else:
+ got_override = True
+
+ # Check that if an override is present then the master is recurring
+ if got_override and got_master and not master_recurring:
+ raise ValueError("Calendar resources must have a recurring master component if there is an overridden one " +
+ "(%s)" % (subcomponent.propertyValue("UID"),))
+
+ # Check for duplicate RECURRENCE-IDs
if rid in component_rids:
raise ValueError("Calendar resources may not contain components with the same Recurrence-IDs " +
"(%s)" % (rid,))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090128/95d7c552/attachment-0001.html>
More information about the calendarserver-changes
mailing list