[CalendarServer-changes] [7694] CalendarServer/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Thu Jun 30 09:29:37 PDT 2011
Revision: 7694
http://trac.macosforge.org/projects/calendarserver/changeset/7694
Author: cdaboo at apple.com
Date: 2011-06-30 09:29:37 -0700 (Thu, 30 Jun 2011)
Log Message:
-----------
Support new validation mode in pycalendar. This includes re-factoring the validation apis to be clearer as well as doing
validation/fix/log for data read from the database.
Modified Paths:
--------------
CalendarServer/trunk/support/build.sh
CalendarServer/trunk/twistedcaldav/caldavxml.py
CalendarServer/trunk/twistedcaldav/datafilters/test/test_peruserdata.py
CalendarServer/trunk/twistedcaldav/ical.py
CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py
CalendarServer/trunk/twistedcaldav/method/put_common.py
CalendarServer/trunk/twistedcaldav/scheduling/scheduler.py
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184A66-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184D26-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185326-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31854DA-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31856AC-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318585A-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185A14-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185BBD-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185D63-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185F20-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31860C8-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318627C-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186426-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31865E4-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186792-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186938-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186ADE-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186C96-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186E3A-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186FE7-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318719A-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3187343-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188906-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188B3A-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188CFF-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188EAA-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189058-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189203-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31893C2-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189572-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189716-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31898D4-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189A88-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189C32-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189DEC-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189F94-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A148-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A2F3-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A4BA-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A6E1-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A898-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AA54-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ABFE-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ADAA-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AF53-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B108-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B2D2-1ED0-11D9-A5E0-000A958A3252.ics
CalendarServer/trunk/twistedcaldav/test/test_icalendar.py
CalendarServer/trunk/twistedcaldav/test/test_multiget.py
CalendarServer/trunk/twistedcaldav/test/test_validation.py
CalendarServer/trunk/twistedcaldav/test/test_xml.py
CalendarServer/trunk/twistedcaldav/vcard.py
CalendarServer/trunk/txdav/caldav/datastore/file.py
CalendarServer/trunk/txdav/caldav/datastore/index_file.py
CalendarServer/trunk/txdav/caldav/datastore/sql.py
CalendarServer/trunk/txdav/caldav/datastore/test/common.py
CalendarServer/trunk/txdav/caldav/datastore/test/test_index_file.py
CalendarServer/trunk/txdav/caldav/datastore/util.py
CalendarServer/trunk/txdav/carddav/datastore/file.py
CalendarServer/trunk/txdav/carddav/datastore/index_file.py
CalendarServer/trunk/txdav/carddav/datastore/sql.py
CalendarServer/trunk/txdav/carddav/datastore/util.py
CalendarServer/trunk/txdav/common/datastore/file.py
CalendarServer/trunk/txdav/common/datastore/sql.py
Modified: CalendarServer/trunk/support/build.sh
===================================================================
--- CalendarServer/trunk/support/build.sh 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/support/build.sh 2011-06-30 16:29:37 UTC (rev 7694)
@@ -732,9 +732,9 @@
"http://svn.osafoundation.org/vobject/trunk";
# XXX actually PyCalendar should be imported in-place.
- py_dependency -fe -i "src" -r 161 \
+ py_dependency -fe -i "src" -r 169 \
"pycalendar" "pycalendar" "pycalendar" \
- "http://svn.mulberrymail.com/repos/PyCalendar/branches/server-stable";
+ "http://svn.mulberrymail.com/repos/PyCalendar/branches/server";
#
# Tool dependencies. The code itself doesn't depend on these, but
Modified: CalendarServer/trunk/twistedcaldav/caldavxml.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/caldavxml.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/caldavxml.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -390,16 +390,6 @@
# optimize them originals away
self.children = (data,)
- # Verify that we have valid calendar data, but don't call
- # validateForCalDAV() on the result, since some responses may
- # require a calendar-data element with iCalendar data not meant
- # for use as a CalDAV resource.
- #try:
- # self.calendar()
- #except ValueError, e:
- # log.err("Invalid iCalendar data (%s): %r" % (e, data))
- # raise
-
if "content-type" in attributes:
self.content_type = attributes["content-type"]
else:
Modified: CalendarServer/trunk/twistedcaldav/datafilters/test/test_peruserdata.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/datafilters/test/test_peruserdata.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/datafilters/test/test_peruserdata.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -27,6 +27,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -66,6 +67,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -87,6 +89,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:TRANSPARENT
BEGIN:VALARM
@@ -108,6 +111,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -128,6 +132,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -149,6 +154,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -174,6 +180,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -193,6 +200,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -240,6 +248,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -250,6 +259,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -271,6 +281,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -281,6 +292,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -306,6 +318,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -322,6 +335,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -341,6 +355,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -351,6 +366,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -374,6 +390,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -384,6 +401,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -418,6 +436,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -434,6 +453,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:TRANSPARENT
BEGIN:VALARM
@@ -453,6 +473,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -463,6 +484,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -486,6 +508,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -496,6 +519,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -522,6 +546,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -532,6 +557,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:TRANSPARENT
BEGIN:VALARM
@@ -551,6 +577,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -561,6 +588,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -584,6 +612,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -619,6 +648,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -635,6 +665,7 @@
DTEND:20080602T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:TRANSPARENT
BEGIN:VALARM
@@ -654,6 +685,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -678,6 +710,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -734,6 +767,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -750,6 +784,7 @@
DTEND:20080602T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:TRANSPARENT
BEGIN:VALARM
@@ -769,6 +804,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -785,6 +821,7 @@
DTEND:20080603T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:TRANSPARENT
BEGIN:VALARM
@@ -804,6 +841,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -829,6 +867,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -856,6 +895,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:TRANSPARENT
BEGIN:VALARM
@@ -876,6 +916,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -901,6 +942,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -914,6 +956,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -941,6 +984,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -960,6 +1004,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -985,6 +1030,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1006,6 +1052,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -1037,6 +1084,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1047,6 +1095,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1060,6 +1109,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1070,6 +1120,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -1097,6 +1148,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -1113,6 +1165,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -1132,6 +1185,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1142,6 +1196,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -1167,6 +1222,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1177,6 +1233,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1198,6 +1255,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -1214,6 +1272,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:TRANSPARENT
BEGIN:VALARM
@@ -1233,6 +1292,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1243,6 +1303,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -1277,6 +1338,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1287,6 +1349,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1308,6 +1371,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1318,6 +1382,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:TRANSPARENT
BEGIN:VALARM
@@ -1337,6 +1402,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1347,6 +1413,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -1375,6 +1442,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1385,6 +1453,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1406,6 +1475,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -1422,6 +1492,7 @@
DTEND:20080602T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:TRANSPARENT
BEGIN:VALARM
@@ -1441,6 +1512,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1476,6 +1548,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1486,6 +1559,7 @@
DTEND:20080602T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1507,6 +1581,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -1523,6 +1598,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:TRANSPARENT
BEGIN:VALARM
@@ -1542,6 +1618,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1552,6 +1629,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -1586,6 +1664,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1596,6 +1675,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1619,6 +1699,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1632,6 +1713,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -1651,6 +1733,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1671,6 +1754,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -1690,6 +1774,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -1715,6 +1800,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -1747,6 +1833,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -1766,6 +1853,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -1803,6 +1891,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -1847,6 +1936,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1860,6 +1950,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -1897,6 +1988,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -1937,6 +2029,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1951,6 +2044,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -1971,6 +2065,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1991,6 +2086,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -2001,6 +2097,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -2014,6 +2111,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -2024,6 +2122,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2043,6 +2142,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -2064,6 +2164,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -2078,6 +2179,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2098,6 +2200,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -2118,6 +2221,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -2138,6 +2242,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2163,6 +2268,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -2196,6 +2302,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -2212,6 +2319,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -2231,6 +2339,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2256,6 +2365,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -2266,6 +2376,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2308,6 +2419,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -2328,6 +2440,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2354,6 +2467,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -2388,6 +2502,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -2408,6 +2523,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2445,6 +2561,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -2490,6 +2607,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -2506,6 +2624,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -2525,6 +2644,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2562,6 +2682,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -2572,6 +2693,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2626,6 +2748,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -2645,6 +2768,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2683,6 +2807,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2716,6 +2841,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -2730,6 +2856,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2767,6 +2894,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -2806,6 +2934,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -2816,6 +2945,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -2829,6 +2959,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2866,6 +2997,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -2876,6 +3008,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2916,6 +3049,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -2929,6 +3063,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2967,6 +3102,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -2996,6 +3132,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -3010,6 +3147,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -3030,6 +3168,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -3051,6 +3190,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -3065,6 +3205,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -3085,6 +3226,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -3095,6 +3237,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -3115,6 +3258,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -3128,6 +3272,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3148,6 +3293,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -3168,6 +3314,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -3187,6 +3334,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -3213,6 +3361,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3245,6 +3394,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -3264,6 +3414,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -3274,6 +3425,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3299,6 +3451,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3331,6 +3484,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -3351,6 +3505,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3377,6 +3532,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3409,6 +3565,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -3428,6 +3585,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -3466,6 +3624,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3510,6 +3669,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -3529,6 +3689,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -3539,6 +3700,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3594,6 +3756,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3638,6 +3801,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -3658,6 +3822,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3697,6 +3862,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3729,6 +3895,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -3743,6 +3910,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3780,6 +3948,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -3819,6 +3988,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -3829,6 +3999,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -3842,6 +4013,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3879,6 +4051,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -3889,6 +4062,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3928,6 +4102,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -3942,6 +4117,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -3981,6 +4157,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -4009,6 +4186,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4023,6 +4201,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4043,6 +4222,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4064,6 +4244,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -4084,6 +4265,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4110,6 +4292,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4143,6 +4326,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -4163,6 +4347,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4201,6 +4386,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4246,6 +4432,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4260,6 +4447,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4298,6 +4486,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4337,6 +4526,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4351,6 +4541,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4398,6 +4589,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4439,6 +4631,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4449,6 +4642,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -4462,6 +4656,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4472,6 +4667,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -4491,6 +4687,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4501,6 +4698,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -4521,6 +4719,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -4537,6 +4736,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -4556,6 +4756,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4566,6 +4767,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -4600,6 +4802,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4610,6 +4813,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -4651,6 +4855,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
TRANSP:OPAQUE
@@ -4667,6 +4872,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -4686,6 +4892,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4696,6 +4903,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -4751,6 +4959,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4761,6 +4970,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -4814,6 +5024,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4824,6 +5035,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -4837,6 +5049,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4847,6 +5060,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -4902,6 +5116,7 @@
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY
END:VEVENT
@@ -4912,6 +5127,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -4953,6 +5169,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -4967,6 +5184,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -4988,6 +5206,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -5009,6 +5228,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -5029,6 +5249,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -5056,6 +5277,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -5090,6 +5312,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
TRANSP:OPAQUE
BEGIN:VALARM
@@ -5110,6 +5333,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -5150,6 +5374,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -5184,6 +5409,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -5198,6 +5424,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -5238,6 +5465,7 @@
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
END:VEVENT
BEGIN:X-CALENDARSERVER-PERUSER
@@ -5267,6 +5495,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY;COUNT=5
TRANSP:OPAQUE
@@ -5287,6 +5516,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY;COUNT=10
END:VEVENT
@@ -5343,6 +5573,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY;COUNT=5
END:VEVENT
@@ -5397,6 +5628,7 @@
DTEND:20080602T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY;COUNT=10
TRANSP:OPAQUE
@@ -5417,6 +5649,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY;COUNT=10
END:VEVENT
@@ -5464,6 +5697,7 @@
DTEND:20080602T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY;COUNT=10
END:VEVENT
@@ -5518,6 +5752,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY;COUNT=10
TRANSP:OPAQUE
@@ -5538,6 +5773,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RDATE:20080602T150000Z
RRULE:FREQ=DAILY;COUNT=10
@@ -5586,6 +5822,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY;COUNT=10
END:VEVENT
@@ -5632,6 +5869,7 @@
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
EXDATE:20080602T110000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY;COUNT=10
TRANSP:OPAQUE
@@ -5652,6 +5890,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY;COUNT=10
END:VEVENT
@@ -5699,6 +5938,7 @@
DTEND:20080601T120000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
EXDATE:20080602T110000Z
ORGANIZER;CN=User 01:mailto:user1 at example.com
RRULE:FREQ=DAILY;COUNT=10
Modified: CalendarServer/trunk/twistedcaldav/ical.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/ical.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/ical.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -48,7 +48,7 @@
from pycalendar.componentbase import PyCalendarComponentBase
from pycalendar.datetime import PyCalendarDateTime
from pycalendar.duration import PyCalendarDuration
-from pycalendar.exceptions import PyCalendarInvalidData
+from pycalendar.exceptions import PyCalendarError
from pycalendar.period import PyCalendarPeriod
from pycalendar.property import PyCalendarProperty
from pycalendar.timezone import PyCalendarTimezone
@@ -343,7 +343,7 @@
cal = PyCalendar()
try:
result = cal.parse(stream)
- except PyCalendarInvalidData:
+ except PyCalendarError:
result = None
if not result:
stream.seek(0)
@@ -421,6 +421,9 @@
self._parent = None
def __str__ (self):
+ """
+ NB This does not automatically include timezones in VCALENDAR objects.
+ """
return str(self._pycalendar)
def __repr__(self):
@@ -437,6 +440,17 @@
return False
return self._pycalendar == other._pycalendar
+ def getText(self):
+ """
+ Serialize the calendar object. For a VCALENDAR always ensure the proper set of
+ timezones are included.
+ """
+
+ if self.name() == "VCALENDAR":
+ return self._pycalendar.getText(includeTimezones=True)
+ else:
+ return self._pycalendar.getText()
+
# FIXME: Should this not be in __eq__?
def same(self, other):
return self._pycalendar == other._pycalendar
@@ -1239,9 +1253,11 @@
return self._resource_type
- def validCalendarForCalDAV(self):
+ def validCalendarData(self, doFix=True, doRaise=True):
"""
- @raise InvalidICalendarDataError: if the given calendar data is not valid.
+ @return: tuple of fixed, unfixed issues
+ @raise InvalidICalendarDataError: if the given calendar data is not valid and
+ cannot be fixed.
"""
if self.name() != "VCALENDAR":
log.debug("Not a calendar: %s" % (self,))
@@ -1250,34 +1266,30 @@
log.debug("Unknown resource type: %s" % (self,))
raise InvalidICalendarDataError("Unknown resource type")
- version = self.propertyValue("VERSION")
- if version != "2.0":
- msg = "Not a version 2.0 iCalendar (version=%s)" % (version,)
- log.debug(msg)
- raise InvalidICalendarDataError(msg)
+ # Do underlying iCalendar library validation with data fix
+ fixed, unfixed = self._pycalendar.validate(doFix=doFix)
+ if unfixed:
+ log.debug("Calendar data had unfixable problems:\n %s" % ("\n ".join(unfixed),))
+ if doRaise:
+ raise InvalidICalendarDataError("Calendar data had unfixable problems:\n %s" % ("\n ".join(unfixed),))
+ if fixed:
+ log.debug("Calendar data had fixable problems:\n %s" % ("\n ".join(fixed),))
+
+ return fixed, unfixed
- def validateForCalDAV(self):
+ def validCalendarForCalDAV(self, methodAllowed):
"""
+ @param methodAllowed: True if METHOD property is allowed, False otherwise.
@raise InvalidICalendarDataError: if the given calendar component is not valid for
use as a X{CalDAV} resource.
"""
- self.validCalendarForCalDAV()
# Disallowed in CalDAV-Access-08, section 4.1
- if self.hasProperty("METHOD"):
+ if not methodAllowed and self.hasProperty("METHOD"):
msg = "METHOD property is not allowed in CalDAV iCalendar data"
log.debug(msg)
raise InvalidICalendarDataError(msg)
- self.validateComponentsForCalDAV(False)
-
- def validateComponentsForCalDAV(self, method, fix=False):
- """
- @param method: True if METHOD property is allowed, False otherwise.
- @param fix: True to try and fix bogus data
- @raise InvalidICalendarDataError: if the given calendar component is not valid for
- use as a X{CalDAV} resource.
- """
#
# Must not contain more than one type of iCalendar component, except for
# the required timezone components, and component UIDs must match
@@ -1292,12 +1304,6 @@
#master_recurring = False
for subcomponent in self.subcomponents():
- # Disallowed in CalDAV-Access-08, section 4.1
- if not method and subcomponent.hasProperty("METHOD"):
- msg = "METHOD property is not allowed in CalDAV iCalendar data"
- log.debug(msg)
- raise InvalidICalendarDataError(msg)
-
if subcomponent.name() == "VTIMEZONE":
timezones.add(subcomponent.propertyValue("TZID"))
elif subcomponent.name() in ignoredComponents:
@@ -1363,42 +1369,6 @@
else:
component_rids.add(rid)
- # Check for mismatch in DTSTART and UNTIL value type
- # If they're not both date or both date-time, raise error
- if (subcomponent.hasProperty("DTSTART") and
- subcomponent.hasProperty("RRULE")):
- dtValue = subcomponent.propertyValue("DTSTART")
- dtutc = dtValue.duplicateAsUTC()
- # Using properties("RRULE") rather than getRRuleSet() here
- # because the dateutil rrule's _until values are datetime
- # even if the UNTIL is a date (and therefore we can't
- # check validity without doing the following):
- rrules = subcomponent._pycalendar.getRecurrenceSet()
- for rrule in rrules.getRules():
- if rrule.getUseUntil():
- if rrule.getUntil().isDateOnly() ^ dtValue.isDateOnly():
- msg = "Calendar resources must have matching type for DTSTART and UNTIL"
- log.debug(msg)
- if fix:
- log.debug("Fixing mismatch")
- rrule.getUntil().setDateOnly(dtValue.isDateOnly())
- if not dtValue.isDateOnly():
- rrule.getUntil().setHHMMSS(dtutc.getHours(), dtutc.getMinutes(), dtutc.getSeconds())
- rrule.getUntil().setTimezone(PyCalendarTimezone(utc=True))
- rrules.changed()
- else:
- raise InvalidICalendarDataError(msg)
-
- # Check for VEVENT - DTEND and DURATION cannot appear together
- if (subcomponent.name() == "VEVENT" and
- subcomponent.hasProperty("DTEND") and
- subcomponent.hasProperty("DURATION")):
- if fix:
- # Remove the DTEND
- subcomponent.removeProperty("DTEND")
- else:
- raise InvalidICalendarDataError(msg)
-
timezone_refs.update(subcomponent.timezoneIDs())
#
@@ -1508,7 +1478,7 @@
return False
# First make sure components are all of the same time (excluding VTIMEZONE)
- self.validateComponentsForCalDAV(True)
+ self.validCalendarForCalDAV(methodAllowed=True)
# Next we could check the iTIP status for each type of method/component pair, however
# we can also leave that up to the server except for the REQUEST/VFREEBUSY case which
Modified: CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -198,12 +198,22 @@
"Could not parse vCard",
))
- # Valid vcard data for CalDAV check
+ # Valid vcard data check
result, message = self.validAddressDataCheck()
if not result:
log.err(message)
raise HTTPError(ErrorResponse(
responsecode.FORBIDDEN,
+ (carddav_namespace, "valid-address-data"),
+ description=message
+ ))
+
+ # Valid vcard data for CalDAV check
+ result, message = self.validCardDAVDataCheck()
+ if not result:
+ log.err(message)
+ raise HTTPError(ErrorResponse(
+ responsecode.FORBIDDEN,
(carddav_namespace, "valid-addressbook-object-resource"),
"Invalid vCard data",
))
@@ -283,8 +293,8 @@
def validAddressDataCheck(self):
"""
- Check that the vcard data is valid vCard.
- @return: tuple: (True/False if the vcard data is valid,
+ Check that the calendar data is valid iCalendar.
+ @return: tuple: (True/False if the calendar data is valid,
log message string).
"""
result = True
@@ -294,13 +304,29 @@
message = "Empty resource not allowed in vcard collection"
else:
try:
- self.vcard.validForCardDAV()
+ self.vcard.validVCardData()
except ValueError, e:
result = False
message = "Invalid vcard data: %s" % (e,)
return result, message
+ def validCardDAVDataCheck(self):
+ """
+ Check that the vcard data is valid vCard.
+ @return: tuple: (True/False if the vcard data is valid,
+ log message string).
+ """
+ result = True
+ message = ""
+ try:
+ self.vcard.validForCardDAV()
+ except ValueError, e:
+ result = False
+ message = "vCard data does not conform to CardDAV requirements: %s" % (e,)
+
+ return result, message
+
def validSizeCheck(self):
"""
Make sure that the content-type of the source resource is text/vcard.
Modified: CalendarServer/trunk/twistedcaldav/method/put_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/put_common.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/method/put_common.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -463,7 +463,7 @@
message = "Empty resource not allowed in calendar collection"
else:
try:
- self.calendar.validCalendarForCalDAV()
+ self.calendar.validCalendarData()
except ValueError, e:
result = False
message = "Invalid calendar data: %s" % (e,)
@@ -479,10 +479,7 @@
result = True
message = ""
try:
- if self.isiTIP:
- self.calendar.validateComponentsForCalDAV(True)
- else:
- self.calendar.validateForCalDAV()
+ self.calendar.validCalendarForCalDAV(methodAllowed=self.isiTIP)
except ValueError, e:
result = False
message = "Calendar data does not conform to CalDAV requirements: %s" % (e,)
Modified: CalendarServer/trunk/twistedcaldav/scheduling/scheduler.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/scheduler.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/scheduling/scheduler.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -300,7 +300,7 @@
def checkCalendarData(self):
# Must be a valid calendar
try:
- self.calendar.validCalendarForCalDAV()
+ self.calendar.validCalendarData()
except ValueError, e:
log.err("%s request calendar component is not valid:%s %s" % (self.method, e, self.calendar,))
raise HTTPError(ErrorResponse(
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184A66-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184A66-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184A66-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3184A66-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020101
DTEND;VALUE=DATE:20020102
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20031231;BYMONTH=1
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184D26-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184D26-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3184D26-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3184D26-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020121
DTEND;VALUE=DATE:20020122
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040118;BYMONTH=1;BYDAY=3MO
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185326-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185326-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185326-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3185326-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020212
DTEND;VALUE=DATE:20020213
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=2
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31854DA-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31854DA-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31854DA-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C31854DA-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020214
DTEND;VALUE=DATE:20020215
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=2
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31856AC-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31856AC-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31856AC-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C31856AC-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020218
DTEND;VALUE=DATE:20020219
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040215;BYMONTH=2;BYDAY=3MO
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318585A-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318585A-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318585A-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C318585A-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020222
DTEND;VALUE=DATE:20020223
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040221;BYMONTH=2
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185A14-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185A14-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185A14-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3185A14-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020317
DTEND;VALUE=DATE:20020318
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=3
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185BBD-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185BBD-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185BBD-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3185BBD-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020331
DTEND;VALUE=DATE:20020401
SUMMARY:Easter
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185D63-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185D63-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185D63-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3185D63-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020415
DTEND;VALUE=DATE:20020416
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=4
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185F20-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185F20-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3185F20-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3185F20-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020512
DTEND;VALUE=DATE:20020513
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5;BYDAY=2SU
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31860C8-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31860C8-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31860C8-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C31860C8-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020527
DTEND;VALUE=DATE:20020528
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040530;BYMONTH=5;BYDAY=-1MO
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318627C-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318627C-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318627C-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C318627C-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020529
DTEND;VALUE=DATE:20020530
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186426-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186426-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186426-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3186426-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020616
DTEND;VALUE=DATE:20020617
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=6;BYDAY=3SU
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31865E4-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31865E4-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31865E4-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C31865E4-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020704
DTEND;VALUE=DATE:20020705
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040703;BYMONTH=7
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186792-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186792-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186792-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3186792-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020902
DTEND;VALUE=DATE:20020903
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040905;BYMONTH=9;BYDAY=1MO
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186938-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186938-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186938-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3186938-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20021014
DTEND;VALUE=DATE:20021015
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20041010;BYMONTH=10;BYDAY=2MO
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186ADE-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186ADE-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186ADE-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3186ADE-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20021027
DTEND;VALUE=DATE:20021028
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186C96-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186C96-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186C96-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3186C96-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20021031
DTEND;VALUE=DATE:20021101
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=10
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186E3A-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186E3A-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186E3A-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3186E3A-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20021111
DTEND;VALUE=DATE:20021112
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20041110;BYMONTH=11
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186FE7-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186FE7-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3186FE7-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3186FE7-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20021128
DTEND;VALUE=DATE:20021129
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20041124;BYMONTH=11;BYDAY=4TH
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318719A-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318719A-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318719A-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C318719A-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20021225
DTEND;VALUE=DATE:20021226
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20041224;BYMONTH=12
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3187343-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3187343-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3187343-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3187343-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20030420
DTEND;VALUE=DATE:20030421
SUMMARY:Easter
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188906-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188906-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188906-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3188906-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020407
DTEND;VALUE=DATE:20020408
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=4;BYDAY=1SU
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188B3A-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188B3A-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188B3A-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3188B3A-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020202
DURATION:P1D
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=2
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188CFF-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188CFF-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188CFF-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3188CFF-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020401
DURATION:P1D
SEQUENCE:2
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188EAA-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188EAA-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3188EAA-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3188EAA-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020506
DURATION:P1D
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040502;BYMONTH=5;BYDAY=1MO
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189058-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189058-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189058-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3189058-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020505
DURATION:P1D
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189203-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189203-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189203-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3189203-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20020614
DURATION:P1D
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=6
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31893C2-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31893C2-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31893C2-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C31893C2-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20050327
DTEND;VALUE=DATE:20050328
SEQUENCE:3
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189572-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189572-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189572-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3189572-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20040401
DTEND;VALUE=DATE:20040402
RRULE:FREQ=YEARLY;INTERVAL=1
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189716-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189716-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189716-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3189716-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20040101
DTEND;VALUE=DATE:20040102
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=1
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31898D4-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31898D4-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C31898D4-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C31898D4-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20040119
DTEND;VALUE=DATE:20040120
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=1;BYDAY=3MO
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189A88-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189A88-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189A88-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3189A88-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20040216
DTEND;VALUE=DATE:20040217
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=2;BYDAY=3MO
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189C32-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189C32-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189C32-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3189C32-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20040222
DTEND;VALUE=DATE:20040223
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=2
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189DEC-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189DEC-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189DEC-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3189DEC-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20040411
DTEND;VALUE=DATE:20040412
SEQUENCE:2
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189F94-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189F94-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C3189F94-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C3189F94-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20060416
DTEND;VALUE=DATE:20060417
SEQUENCE:2
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A148-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A148-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A148-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C318A148-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20040531
DTEND;VALUE=DATE:20040601
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5;BYDAY=-1MO
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A2F3-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A2F3-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A2F3-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C318A2F3-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20040503
DURATION:P1D
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5;BYDAY=1MO
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A4BA-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A4BA-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A4BA-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C318A4BA-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20040704
DTEND;VALUE=DATE:20040705
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=7
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A6E1-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A6E1-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A6E1-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C318A6E1-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20040906
DTEND;VALUE=DATE:20040907
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=9;BYDAY=1MO
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A898-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A898-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318A898-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C318A898-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20041011
DTEND;VALUE=DATE:20041012
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=10;BYDAY=2MO
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AA54-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AA54-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AA54-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C318AA54-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20041111
DTEND;VALUE=DATE:20041112
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ABFE-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ABFE-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ABFE-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C318ABFE-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20041125
DTEND;VALUE=DATE:20041127
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11;BYDAY=4TH
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ADAA-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ADAA-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318ADAA-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C318ADAA-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20041225
DTEND;VALUE=DATE:20041226
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=12
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AF53-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AF53-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318AF53-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C318AF53-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20041231
DTEND;VALUE=DATE:20050101
RRULE:FREQ=YEARLY;INTERVAL=1
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B108-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B108-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B108-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C318B108-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20040912
DTEND;VALUE=DATE:20040913
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=9;BYDAY=2SU
Modified: CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B2D2-1ED0-11D9-A5E0-000A958A3252.ics
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B2D2-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/data/Holidays/C318B2D2-1ED0-11D9-A5E0-000A958A3252.ics 2011-06-30 16:29:37 UTC (rev 7694)
@@ -4,6 +4,7 @@
VERSION:2.0
BEGIN:VEVENT
UID:C318B2D2-1ED0-11D9-A5E0-000A958A3252
+DTSTAMP:20041015T171054Z
DTSTART;VALUE=DATE:20041102
DTEND;VALUE=DATE:20041103
DESCRIPTION:Every four years on the first Tuesday after the first Monday in
Modified: CalendarServer/trunk/twistedcaldav/test/test_icalendar.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_icalendar.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/test_icalendar.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -87,6 +87,7 @@
UID:12345-67890
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
SUMMARY:Test
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
@@ -104,6 +105,7 @@
UID:12345-67890
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
SUMMARY:Test
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
@@ -125,6 +127,7 @@
UID:12345-67890
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
SUMMARY:Test
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
@@ -138,6 +141,7 @@
RECURRENCE-ID:20080602T120000Z
DTSTART:20080602T130000Z
DTEND:20080602T140000Z
+DTSTAMP:20080601T120000Z
SUMMARY:Test
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
@@ -153,6 +157,7 @@
RECURRENCE-ID:20080602T120000Z
DTSTART:20080602T130000Z
DTEND:20080602T140000Z
+DTSTAMP:20080601T120000Z
SUMMARY:Test
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
@@ -162,6 +167,7 @@
UID:12345-67890
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
SUMMARY:Test
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
@@ -183,6 +189,7 @@
UID:12345-67890
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
SUMMARY:Test
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
@@ -210,6 +217,7 @@
UID:12345-67890
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
SUMMARY:Test
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
@@ -248,9 +256,13 @@
CalDAV resource validation.
"""
calendar = Component.fromStream(file(os.path.join(self.data_dir, "Holidays.ics")))
- try: calendar.validateForCalDAV()
- except ValueError: pass
- else: self.fail("Monolithic iCalendar shouldn't validate for CalDAV")
+ try:
+ calendar.validCalendarData()
+ calendar.validCalendarForCalDAV(methodAllowed=False)
+ except ValueError:
+ pass
+ else:
+ self.fail("Monolithic iCalendar shouldn't validate for CalDAV")
resource_dir = os.path.join(self.data_dir, "Holidays")
for filename in resource_dir:
@@ -258,8 +270,11 @@
filename = os.path.join(resource_dir, filename)
calendar = Component.fromStream(file(filename))
- try: calendar.validateForCalDAV()
- except ValueError: self.fail("Resource iCalendar %s didn't validate for CalDAV" % (filename,))
+ try:
+ calendar.validCalendarData()
+ calendar.validCalendarForCalDAV(methodAllowed=False)
+ except ValueError:
+ self.fail("Resource iCalendar %s didn't validate for CalDAV" % (filename,))
def test_component_validate_and_fix(self):
"""
@@ -267,6 +282,7 @@
"""
data = """BEGIN:VCALENDAR
VERSION:2.0
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
BEGIN:VTIMEZONE
TZID:America/Los_Angeles
BEGIN:DAYLIGHT
@@ -298,20 +314,24 @@
"""
# Ensure it starts off invalid
calendar = Component.fromString(data)
- try: calendar.validateComponentsForCalDAV(False)
- except InvalidICalendarDataError: pass
- else: self.fail("Shouldn't validate for CalDAV")
+ try:
+ calendar.validCalendarData(doFix=False)
+ except InvalidICalendarDataError:
+ pass
+ else:
+ self.fail("Shouldn't validate for CalDAV")
# Fix it
- calendar.validateComponentsForCalDAV(False, fix=True)
+ calendar.validCalendarData(doFix=True)
self.assertTrue("RRULE:FREQ=DAILY;UNTIL=20110121T203000Z\r\n"
in str(calendar))
# Now it should pass without fixing
- calendar.validateComponentsForCalDAV(False, fix=False)
+ calendar.validCalendarData(doFix=False)
data = """BEGIN:VCALENDAR
VERSION:2.0
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
BEGIN:VTIMEZONE
TZID:America/Los_Angeles
BEGIN:DAYLIGHT
@@ -343,16 +363,19 @@
"""
# Ensure it starts off invalid
calendar = Component.fromString(data)
- try: calendar.validateComponentsForCalDAV(False)
- except InvalidICalendarDataError: pass
- else: self.fail("Shouldn't validate for CalDAV")
+ try:
+ calendar.validCalendarData(doFix=False)
+ except InvalidICalendarDataError:
+ pass
+ else:
+ self.fail("Shouldn't validate for CalDAV")
# Fix it
- calendar.validateComponentsForCalDAV(False, fix=True)
+ calendar.validCalendarData(doFix=True)
self.assertTrue("RRULE:FREQ=DAILY;UNTIL=20110131\r\n" in str(calendar))
# Now it should pass without fixing
- calendar.validateComponentsForCalDAV(False, fix=False)
+ calendar.validCalendarData(doFix=False)
def test_component_timeranges(self):
@@ -491,11 +514,13 @@
data = """BEGIN:VCALENDAR
VERSION:2.0
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
BEGIN:VEVENT
UID:12345-67890
DTSTART:20071114T000000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20071114T000000Z
END:VEVENT
END:VCALENDAR
"""
@@ -507,11 +532,13 @@
data = """BEGIN:VCALENDAR
VERSION:2.0
+DTSTART:20071114T000000Z
BEGIN:VEVENT
UID:12345-67890
DTSTART:20071114T000000Z
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20071114T000000Z
END:VEVENT
END:VCALENDAR
"""
@@ -528,6 +555,7 @@
BEGIN:VEVENT
UID:12345-67890
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -541,6 +569,7 @@
BEGIN:VEVENT
UID:12345-67890
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
END:VEVENT
@@ -556,6 +585,7 @@
BEGIN:VEVENT
UID:12345-67890
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
ORGANIZER:mailto:user2 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -570,6 +600,7 @@
BEGIN:VEVENT
UID:12345-67890
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
RRULE:FREQ=YEARLY
@@ -578,6 +609,7 @@
UID:12345-67890
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
END:VEVENT
@@ -594,6 +626,7 @@
BEGIN:VEVENT
UID:12345-67890
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
RRULE:FREQ=YEARLY
@@ -602,6 +635,7 @@
UID:12345-67890
RECURRENCE-ID:20091114T000000Z
DTSTART:20071114T020000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user3 at example.com
ATTENDEE:mailto:user2 at example.com
END:VEVENT
@@ -618,6 +652,7 @@
BEGIN:VEVENT
UID:12345-67890
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
RRULE:FREQ=YEARLY
@@ -626,6 +661,7 @@
UID:12345-67890
RECURRENCE-ID:20091114T000000Z
DTSTART:20071114T020000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user3 at example.com
ORGANIZER:mailto:user4 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -651,6 +687,7 @@
BEGIN:VEVENT
UID:12345-67890
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -663,6 +700,7 @@
BEGIN:VEVENT
UID:12345-67890
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
END:VEVENT
@@ -679,6 +717,7 @@
BEGIN:VEVENT
UID:12345-67890
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
ATTENDEE:mailto:user3 at example.com
@@ -697,6 +736,7 @@
BEGIN:VEVENT
UID:12345-67890
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
RRULE:FREQ=YEARLY
@@ -705,6 +745,7 @@
UID:12345-67890
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
ATTENDEE;SCHEDULE-AGENT=NONE:mailto:user2 at example.com
ATTENDEE;SCHEDULE-AGENT=CLIENT:mailto:user3 at example.com
@@ -724,6 +765,7 @@
BEGIN:VEVENT
UID:12345-67890
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
ATTENDEE;SCHEDULE-AGENT=NONE:mailto:user2 at example.com
ATTENDEE:mailto:user3 at example.com
@@ -741,6 +783,7 @@
BEGIN:VEVENT
UID:12345-67890
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
ATTENDEE;SCHEDULE-AGENT=SERVER:mailto:user2 at example.com
RRULE:FREQ=YEARLY
@@ -749,6 +792,7 @@
UID:12345-67890
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
ATTENDEE;SCHEDULE-AGENT=NONE:mailto:user2 at example.com
ATTENDEE;SCHEDULE-AGENT=CLIENT:mailto:user3 at example.com
@@ -778,6 +822,7 @@
DTSTART:20071114T000000Z
ATTENDEE:mailto:user01 at example.com
ATTENDEE:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user01 at example.com
END:VEVENT
END:VCALENDAR
@@ -790,6 +835,7 @@
DTSTART:20071114T000000Z
ATTENDEE:mailto:user01 at example.com
ATTENDEE;SCHEDULE-STATUS=2.0:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user01 at example.com
END:VEVENT
END:VCALENDAR
@@ -811,6 +857,7 @@
DTSTART:20071114T000000Z
ATTENDEE:mailto:user01 at example.com
ATTENDEE;SCHEDULE-STATUS=5.0:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user01 at example.com
END:VEVENT
END:VCALENDAR
@@ -823,6 +870,7 @@
DTSTART:20071114T000000Z
ATTENDEE:mailto:user01 at example.com
ATTENDEE;SCHEDULE-STATUS=2.0:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user01 at example.com
END:VEVENT
END:VCALENDAR
@@ -844,6 +892,7 @@
DTSTART:20071114T000000Z
ATTENDEE:mailto:user01 at example.com
ATTENDEE:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user01 at example.com
END:VEVENT
END:VCALENDAR
@@ -856,6 +905,7 @@
DTSTART:20071114T000000Z
ATTENDEE:mailto:user01 at example.com
ATTENDEE:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;SCHEDULE-STATUS=2.0:mailto:user01 at example.com
END:VEVENT
END:VCALENDAR
@@ -877,6 +927,7 @@
DTSTART:20071114T000000Z
ATTENDEE:mailto:user01 at example.com
ATTENDEE:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;SCHEDULE-STATUS=5.0:mailto:user01 at example.com
END:VEVENT
END:VCALENDAR
@@ -889,6 +940,7 @@
DTSTART:20071114T000000Z
ATTENDEE:mailto:user01 at example.com
ATTENDEE:mailto:user02 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER;SCHEDULE-STATUS=2.0:mailto:user01 at example.com
END:VEVENT
END:VCALENDAR
@@ -917,6 +969,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -926,6 +979,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
REQUEST-STATUS:2.0;Success
END:VEVENT
END:VCALENDAR
@@ -939,12 +993,14 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
BEGIN:VEVENT
UID:12345-67890-1
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T020000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -954,6 +1010,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
REQUEST-STATUS:2.0;Success
RRULE:FREQ=DAILY
END:VEVENT
@@ -961,6 +1018,7 @@
UID:12345-67890-1
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T020000Z
+DTSTAMP:20080601T120000Z
REQUEST-STATUS:2.0;Success
END:VEVENT
END:VCALENDAR
@@ -984,6 +1042,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -994,6 +1053,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -1008,6 +1068,7 @@
BEGIN:VEVENT
UID:12345-67890-2
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -1029,6 +1090,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1041,6 +1103,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1057,6 +1120,7 @@
UID:12345-67890-4
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1079,6 +1143,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
END:VEVENT
@@ -1087,6 +1152,7 @@
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1099,6 +1165,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
END:VEVENT
@@ -1107,6 +1174,7 @@
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1123,6 +1191,7 @@
UID:12345-67890-4
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
END:VEVENT
@@ -1131,6 +1200,7 @@
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1153,6 +1223,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
END:VEVENT
@@ -1160,6 +1231,7 @@
UID:12345-67890
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1172,6 +1244,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
EXDATE:20081114T000000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
@@ -1190,6 +1263,7 @@
UID:12345-67890-4
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
END:VEVENT
@@ -1197,6 +1271,7 @@
UID:12345-67890
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1218,6 +1293,7 @@
BEGIN:VEVENT
UID:12345-67890-3
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
END:VEVENT
@@ -1226,6 +1302,7 @@
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1239,6 +1316,7 @@
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1254,6 +1332,7 @@
BEGIN:VEVENT
UID:12345-67890-4
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
END:VEVENT
@@ -1262,6 +1341,7 @@
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1283,6 +1363,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -1293,6 +1374,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -1307,6 +1389,7 @@
BEGIN:VEVENT
UID:12345-67890-2
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -1328,6 +1411,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1340,6 +1424,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1356,6 +1441,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE;SCHEDULE-AGENT=SERVER:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1368,6 +1454,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE;SCHEDULE-AGENT=SERVER:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1384,6 +1471,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE;SCHEDULE-AGENT=CLIENT:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1406,6 +1494,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE;SCHEDULE-AGENT=NONE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1437,6 +1526,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -1446,6 +1536,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -1461,6 +1552,7 @@
UID:12345-67890-2
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1471,6 +1563,7 @@
BEGIN:VEVENT
UID:12345-67890-2
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1487,6 +1580,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1498,6 +1592,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1515,6 +1610,7 @@
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
ATTENDEE:mailto:user3 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1525,6 +1621,7 @@
BEGIN:VEVENT
UID:12345-67890-4
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1542,6 +1639,7 @@
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
ATTENDEE:mailto:user3 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1553,6 +1651,7 @@
UID:12345-67890-5
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1579,6 +1678,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
SUMMARY:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
ORGANIZER:mailto:user1 at example.com
@@ -1592,6 +1692,7 @@
BEGIN:VEVENT
UID:12345-67890-1
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1609,6 +1710,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
BEGIN:VALARM
@@ -1622,6 +1724,7 @@
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1633,6 +1736,7 @@
BEGIN:VEVENT
UID:12345-67890-3
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
BEGIN:VALARM
ACTION:DISPLAY
@@ -1644,6 +1748,7 @@
UID:12345-67890
RECURRENCE-ID:20081114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1670,6 +1775,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
SUMMARY:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
ORGANIZER:mailto:user1 at example.com
@@ -1683,6 +1789,7 @@
BEGIN:VEVENT
UID:12345-67890-1
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1700,6 +1807,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
BEGIN:VALARM
@@ -1713,6 +1821,7 @@
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1724,6 +1833,7 @@
BEGIN:VEVENT
UID:12345-67890-3
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
BEGIN:VALARM
@@ -1736,6 +1846,7 @@
UID:12345-67890
RECURRENCE-ID:20081114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1761,6 +1872,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -1770,6 +1882,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -1783,6 +1896,7 @@
BEGIN:VEVENT
UID:12345-67890-2
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:Test
@@ -1797,6 +1911,7 @@
BEGIN:VEVENT
UID:12345-67890-2
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -1811,6 +1926,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
BEGIN:VALARM
@@ -1824,6 +1940,7 @@
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1835,6 +1952,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
END:VEVENT
@@ -1843,6 +1961,7 @@
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1858,6 +1977,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
BEGIN:VALARM
@@ -1871,6 +1991,7 @@
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
BEGIN:VALARM
ACTION:DISPLAY
@@ -1887,6 +2008,7 @@
UID:12345-67890-3
DTSTART:20071114T000000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
RRULE:FREQ=YEARLY
END:VEVENT
@@ -1895,6 +2017,7 @@
RECURRENCE-ID:20081114T000000Z
DTSTART:20071114T010000Z
ATTENDEE:mailto:user2 at example.com
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user1 at example.com
END:VEVENT
END:VCALENDAR
@@ -1918,6 +2041,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
DURATION:PT1H
END:VEVENT
END:VCALENDAR
@@ -1933,6 +2057,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
DURATION:PT1H
RRULE:FREQ=DAILY;COUNT=2
END:VEVENT
@@ -1952,6 +2077,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
DURATION:PT1H
RRULE:FREQ=DAILY;COUNT=2
RDATE:20071116T010000Z
@@ -1973,6 +2099,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
DURATION:PT1H
RRULE:FREQ=DAILY;COUNT=3
EXDATE:20071115T000000Z
@@ -1993,6 +2120,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
DURATION:PT1H
RRULE:FREQ=DAILY;COUNT=3
EXDATE:20071114T000000Z
@@ -2013,6 +2141,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
DURATION:PT1H
RRULE:FREQ=DAILY;COUNT=2
END:VEVENT
@@ -2020,6 +2149,7 @@
UID:12345-67890-1
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T010000Z
+DTSTAMP:20080601T120000Z
DURATION:PT1H
END:VEVENT
END:VCALENDAR
@@ -2039,6 +2169,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY;COUNT=2
END:VEVENT
BEGIN:VEVENT
@@ -2046,6 +2177,7 @@
RECURRENCE-ID:20071115T010000Z
DTSTART:20071115T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2061,6 +2193,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY;COUNT=2
END:VEVENT
BEGIN:VEVENT
@@ -2068,6 +2201,7 @@
RECURRENCE-ID:20071115T010000Z
DTSTART:20071115T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2101,6 +2235,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2116,6 +2251,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2131,6 +2267,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
BEGIN:VEVENT
@@ -2138,6 +2275,7 @@
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T010000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2153,6 +2291,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
BEGIN:VEVENT
@@ -2160,6 +2299,7 @@
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T010000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2175,6 +2315,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
BEGIN:VEVENT
@@ -2182,6 +2323,7 @@
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T010000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2197,6 +2339,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
BEGIN:VEVENT
@@ -2204,6 +2347,7 @@
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T010000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2219,6 +2363,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
BEGIN:VEVENT
@@ -2226,6 +2371,7 @@
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T010000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2241,12 +2387,14 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
BEGIN:VEVENT
UID:12345-67890-1
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T010000Z
+DTSTAMP:20080601T120000Z
DURATION:PT1H
END:VEVENT
END:VCALENDAR
@@ -2272,6 +2420,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
X-ITEM1:True
END:VEVENT
END:VCALENDAR
@@ -2283,6 +2432,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
X-ITEM2:True
END:VEVENT
END:VCALENDAR
@@ -2294,6 +2444,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
X-ITEM1:True
X-ITEM2:True
END:VEVENT
@@ -2310,6 +2461,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
X-ITEM1:True
END:VEVENT
END:VCALENDAR
@@ -2321,6 +2473,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
X-ITEM2:True
X-ITEM3:True
END:VEVENT
@@ -2333,6 +2486,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
X-ITEM1:True
X-ITEM2:True
X-ITEM3:True
@@ -2350,6 +2504,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
X-ITEM1:True
END:VEVENT
END:VCALENDAR
@@ -2361,6 +2516,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
X-ITEM2:True
X-ITEM1:False
END:VEVENT
@@ -2373,6 +2529,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
X-ITEM1:True
X-ITEM2:True
X-ITEM1:False
@@ -2390,6 +2547,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
X-ITEM1:True
END:VEVENT
@@ -2398,6 +2556,7 @@
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T010000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
X-ITEM1:False
END:VEVENT
END:VCALENDAR
@@ -2409,6 +2568,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
X-ITEM2:True
END:VEVENT
@@ -2417,6 +2577,7 @@
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T010000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
X-ITEM2:False
END:VEVENT
END:VCALENDAR
@@ -2428,6 +2589,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
X-ITEM1:True
X-ITEM2:True
@@ -2437,6 +2599,7 @@
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T010000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
X-ITEM1:False
X-ITEM2:False
END:VEVENT
@@ -2453,6 +2616,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
X-ITEM1:True
END:VEVENT
@@ -2461,6 +2625,7 @@
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T010000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
X-ITEM1:False
END:VEVENT
END:VCALENDAR
@@ -2472,6 +2637,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
X-ITEM2:True
END:VEVENT
@@ -2484,6 +2650,7 @@
UID:12345-67890-1
DTSTART:20071114T000000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
X-ITEM1:True
X-ITEM2:True
@@ -2493,6 +2660,7 @@
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T010000Z
DURATION:PT1H
+DTSTAMP:20080601T120000Z
X-ITEM1:False
X-ITEM2:True
END:VEVENT
@@ -2520,6 +2688,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART;VALUE=DATE-TIME:20071114T000000Z
+DTSTAMP:20080601T120000Z
SEQUENCE:0
END:VEVENT
END:VCALENDAR
@@ -2530,6 +2699,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2542,6 +2712,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART;VALUE=DATE-TIME:20071114T000000Z
+DTSTAMP:20080601T120000Z
TRANSP:OPAQUE
ORGANIZER:mailto:user01 at example.com
ATTENDEE;RSVP=TRUE;PARTSTAT=NEEDS-ACTION:mailto:user02 at example.com
@@ -2557,6 +2728,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user01 at example.com
ATTENDEE;RSVP=TRUE:mailto:user02 at example.com
ATTENDEE:mailto:user03 at example.com
@@ -2574,6 +2746,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART;VALUE=DATE-TIME:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=WEEKLY;WKST=SU;INTERVAL=1;BYDAY=MO,WE,FR
TRANSP:OPAQUE
ORGANIZER:mailto:user01 at example.com
@@ -2590,6 +2763,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user01 at example.com
ATTENDEE;RSVP=TRUE:mailto:user02 at example.com
ATTENDEE:mailto:user03 at example.com
@@ -2625,6 +2799,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART;TZID=US/Pacific:20071114T000000
+DTSTAMP:20080601T120000Z
RRULE:FREQ=WEEKLY;WKST=SU;INTERVAL=1;BYDAY=MO,WE,FR
TRANSP:OPAQUE
ORGANIZER:mailto:user01 at example.com
@@ -2658,6 +2833,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART;_TZID=US/Pacific:20071114T080000Z
+DTSTAMP:20080601T120000Z
ORGANIZER:mailto:user01 at example.com
ATTENDEE;RSVP=TRUE:mailto:user02 at example.com
ATTENDEE:mailto:user03 at example.com
@@ -2690,6 +2866,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART;VALUE=DATE-TIME:20071114
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2699,6 +2876,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART;VALUE=DATE-TIME:20071114
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2712,6 +2890,7 @@
UID:12345-67890-1
DTSTART;VALUE=DATE-TIME:20071114
ATTACH:http://example.com/file.txt
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2722,6 +2901,7 @@
UID:12345-67890-1
DTSTART;VALUE=DATE-TIME:20071114
ATTACH:http://example.com/file.txt
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2735,6 +2915,7 @@
UID:12345-67890-1
DTSTART;VALUE=DATE-TIME:20071114
ATTACH:http://example.com/calendars/user.dropbox/file.txt
+DTSTAMP:20080601T120000Z
X-APPLE-DROPBOX:/calendars/user.dropbox
END:VEVENT
END:VCALENDAR
@@ -2745,6 +2926,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART;VALUE=DATE-TIME:20071114
+DTSTAMP:20080601T120000Z
X-APPLE-DROPBOX:/calendars/user.dropbox
END:VEVENT
END:VCALENDAR
@@ -2759,6 +2941,7 @@
UID:12345-67890-1
DTSTART;VALUE=DATE-TIME:20071114
ATTACH:http://example.com/calendars/user.dropbox/file.txt
+DTSTAMP:20080601T120000Z
X-APPLE-DROPBOX:/calendars/user1.dropbox
END:VEVENT
END:VCALENDAR
@@ -2770,6 +2953,7 @@
UID:12345-67890-1
DTSTART;VALUE=DATE-TIME:20071114
ATTACH:http://example.com/calendars/user.dropbox/file.txt
+DTSTAMP:20080601T120000Z
X-APPLE-DROPBOX:/calendars/user1.dropbox
END:VEVENT
END:VCALENDAR
@@ -2798,6 +2982,7 @@
UID:12345-67890-1
DTSTART:20090101T000000Z
DTEND:20090102T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -2812,6 +2997,7 @@
UID:12345-67890-1
DTSTART:20090101T000000Z
DTEND:20090102T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY;COUNT=2
END:VEVENT
END:VCALENDAR
@@ -2827,6 +3013,7 @@
UID:12345-67890-1
DTSTART:20090101T000000Z
DTEND:20090102T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY;UNTIL=20090108T000000Z
END:VEVENT
END:VCALENDAR
@@ -2842,6 +3029,7 @@
UID:12345-67890-1
DTSTART:20090101T000000Z
DTEND:20090102T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
END:VCALENDAR
@@ -2867,6 +3055,7 @@
UID:12345-67890-1
DTSTART:20090101T080000Z
DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
END:VCALENDAR
@@ -2877,6 +3066,7 @@
RECURRENCE-ID:20090102T080000Z
DTSTART:20090102T080000Z
DTEND:20090102T090000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
),
@@ -2889,6 +3079,7 @@
UID:12345-67890-1
DTSTART:20090101T080000Z
DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
RDATE:20090102T180000Z
END:VEVENT
@@ -2900,6 +3091,7 @@
RECURRENCE-ID:20090102T180000Z
DTSTART:20090102T180000Z
DTEND:20090102T190000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
),
@@ -2912,6 +3104,7 @@
UID:12345-67890-1
DTSTART:20090101T080000Z
DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
RDATE:20090102T180000Z,20090103T180000Z
RDATE:20090104T180000Z
@@ -2924,6 +3117,7 @@
RECURRENCE-ID:20090103T180000Z
DTSTART:20090103T180000Z
DTEND:20090103T190000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
),
@@ -2936,6 +3130,7 @@
UID:12345-67890-1
DTSTART:20090101T080000Z
DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
END:VCALENDAR
@@ -2952,6 +3147,7 @@
UID:12345-67890-1
DTSTART:20090101T080000Z
DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
RDATE:20090102T180000Z
END:VEVENT
@@ -2969,6 +3165,7 @@
UID:12345-67890-1
DTSTART:20090101T080000Z
DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
RDATE:20090102T180000Z,20090103T180000Z
RDATE:20090104T180000Z
@@ -2987,6 +3184,7 @@
UID:12345-67890-1
DTSTART;VALUE=DATE:20090101
DTEND;VALUE=DATE:20090102
+DTSTAMP:20080601T120000Z
RRULE:FREQ=WEEKLY
END:VEVENT
END:VCALENDAR
@@ -2997,6 +3195,7 @@
RECURRENCE-ID;VALUE=DATE:20090108
DTSTART;VALUE=DATE:20090108
DTEND;VALUE=DATE:20090109
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
),
@@ -3009,6 +3208,7 @@
UID:12345-67890-1
DTSTART;VALUE=DATE:20090101
DTEND;VALUE=DATE:20090102
+DTSTAMP:20080601T120000Z
RRULE:FREQ=WEEKLY
RDATE;VALUE=DATE:20090103
END:VEVENT
@@ -3020,6 +3220,7 @@
RECURRENCE-ID;VALUE=DATE:20090103
DTSTART;VALUE=DATE:20090103
DTEND;VALUE=DATE:20090104
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
),
@@ -3032,6 +3233,7 @@
UID:12345-67890-1
DTSTART;VALUE=DATE:20090101
DTEND;VALUE=DATE:20090102
+DTSTAMP:20080601T120000Z
RRULE:FREQ=WEEKLY
RDATE;VALUE=DATE:20090103,20090110
RDATE;VALUE=DATE:20090118
@@ -3044,6 +3246,7 @@
RECURRENCE-ID;VALUE=DATE:20090110
DTSTART;VALUE=DATE:20090110
DTEND;VALUE=DATE:20090111
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
),
@@ -3056,6 +3259,7 @@
UID:12345-67890-1
DTSTART;VALUE=DATE:20090101
DTEND;VALUE=DATE:20090102
+DTSTAMP:20080601T120000Z
RRULE:FREQ=WEEKLY
END:VEVENT
END:VCALENDAR
@@ -3072,6 +3276,7 @@
UID:12345-67890-1
DTSTART;VALUE=DATE:20090101
DTEND;VALUE=DATE:20090102
+DTSTAMP:20080601T120000Z
RRULE:FREQ=WEEKLY
RDATE;VALUE=DATE:20090104
END:VEVENT
@@ -3089,6 +3294,7 @@
UID:12345-67890-1
DTSTART;VALUE=DATE:20090101
DTEND;VALUE=DATE:20090102
+DTSTAMP:20080601T120000Z
RRULE:FREQ=WEEKLY
RDATE;VALUE=DATE:20090104,20090111
RDATE;VALUE=DATE:20090118
@@ -3118,6 +3324,7 @@
UID:12345-67890-1
DTSTART:20090101T080000Z
DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
END:VCALENDAR
@@ -3132,6 +3339,7 @@
RECURRENCE-ID:20090102T080000Z
DTSTART:20090102T080000Z
DTEND:20090102T090000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
"""BEGIN:VEVENT
@@ -3139,6 +3347,7 @@
RECURRENCE-ID:20090104T080000Z
DTSTART:20090104T080000Z
DTEND:20090104T090000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
),
@@ -3152,6 +3361,7 @@
UID:12345-67890-1
DTSTART:20090101T080000Z
DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
RDATE:20090102T180000Z
END:VEVENT
@@ -3167,6 +3377,7 @@
RECURRENCE-ID:20090102T180000Z
DTSTART:20090102T180000Z
DTEND:20090102T190000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
"""BEGIN:VEVENT
@@ -3174,6 +3385,7 @@
RECURRENCE-ID:20090104T080000Z
DTSTART:20090104T080000Z
DTEND:20090104T090000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
),
@@ -3187,6 +3399,7 @@
UID:12345-67890-1
DTSTART:20090101T080000Z
DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
RDATE:20090102T180000Z,20090103T180000Z
RDATE:20090104T180000Z
@@ -3203,6 +3416,7 @@
RECURRENCE-ID:20090103T180000Z
DTSTART:20090103T180000Z
DTEND:20090103T190000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
"""BEGIN:VEVENT
@@ -3210,6 +3424,7 @@
RECURRENCE-ID:20090105T080000Z
DTSTART:20090105T080000Z
DTEND:20090105T090000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
),
@@ -3223,6 +3438,7 @@
UID:12345-67890-1
DTSTART:20090101T080000Z
DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
END:VCALENDAR
@@ -3238,6 +3454,7 @@
RECURRENCE-ID:20090103T080000Z
DTSTART:20090103T080000Z
DTEND:20090103T090000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
),
@@ -3251,6 +3468,7 @@
UID:12345-67890-1
DTSTART:20090101T080000Z
DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
RDATE:20090102T180000Z
END:VEVENT
@@ -3267,6 +3485,7 @@
RECURRENCE-ID:20090103T080000Z
DTSTART:20090103T080000Z
DTEND:20090103T090000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
),
@@ -3280,6 +3499,7 @@
UID:12345-67890-1
DTSTART:20090101T080000Z
DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
RDATE:20090102T180000Z,20090103T180000Z
RDATE:20090104T180000Z
@@ -3297,6 +3517,7 @@
RECURRENCE-ID:20090103T080000Z
DTSTART:20090103T080000Z
DTEND:20090103T090000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
""",
),
@@ -3321,6 +3542,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -3334,6 +3556,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=WEEKLY;COUNT=2
END:VEVENT
END:VCALENDAR
@@ -3348,6 +3571,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=WEEKLY;UNTIL=20071128T000000Z
END:VEVENT
END:VCALENDAR
@@ -3362,6 +3586,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=WEEKLY;COUNT=2000
END:VEVENT
END:VCALENDAR
@@ -3372,6 +3597,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:COUNT=400;FREQ=WEEKLY
END:VEVENT
END:VCALENDAR
@@ -3385,6 +3611,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY;UNTIL=20471128T000000Z
END:VEVENT
END:VCALENDAR
@@ -3395,6 +3622,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:COUNT=400;FREQ=DAILY
END:VEVENT
END:VCALENDAR
@@ -3408,6 +3636,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=WEEKLY;UNTIL=20071128T000000Z
END:VEVENT
END:VCALENDAR
@@ -3422,6 +3651,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
END:VCALENDAR
@@ -3432,6 +3662,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:COUNT=400;FREQ=DAILY
END:VEVENT
END:VCALENDAR
@@ -3467,6 +3698,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -3484,6 +3716,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RDATE:20091004T000000Z
END:VEVENT
END:VCALENDAR
@@ -3503,6 +3736,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
END:VCALENDAR
@@ -3523,6 +3757,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
RDATE:20091004T010000Z
END:VEVENT
@@ -3545,6 +3780,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
RDATE:20091004T010000Z
EXDATE:20091003T000000Z
@@ -3569,6 +3805,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
END:VEVENT
BEGIN:VEVENT
@@ -3595,6 +3832,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
RRULE:FREQ=DAILY
RDATE:20071115T010000Z
END:VEVENT
@@ -3602,6 +3840,7 @@
UID:12345-67890-1
RECURRENCE-ID:20071115T010000Z
DTSTART:20071115T020000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -3624,6 +3863,7 @@
UID:12345-67890-1
RECURRENCE-ID:20071115T000000Z
DTSTART:20071115T010000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -3642,6 +3882,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -3657,6 +3898,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -3672,6 +3914,7 @@
BEGIN:VEVENT
UID:12345-67890-1
DTSTART:20071114T000000Z
+DTSTAMP:20080601T120000Z
END:VEVENT
END:VCALENDAR
""",
@@ -3784,11 +4027,12 @@
for text in invalid:
calendar = Component.fromString(text)
- self.assertRaises(InvalidICalendarDataError, calendar.validateForCalDAV)
+ self.assertRaises(InvalidICalendarDataError, calendar.validCalendarData, doFix=False)
for text in valid:
calendar = Component.fromString(text)
try:
- calendar.validateForCalDAV()
+ calendar.validCalendarData()
+ calendar.validCalendarForCalDAV(methodAllowed=False)
except:
self.fail("Valid calendar should validate")
@@ -3798,6 +4042,7 @@
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:12345-67890
+DTSTAMP:20080601T120000Z
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
@@ -3841,6 +4086,7 @@
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:12345-67890
+DTSTAMP:20080601T120000Z
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
@@ -3866,6 +4112,7 @@
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:12345-67890
+DTSTAMP:20080601T120000Z
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
@@ -3903,6 +4150,7 @@
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:12345-67890
+DTSTAMP:20080601T120000Z
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
@@ -3948,6 +4196,7 @@
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:12345-67890
+DTSTAMP:20080601T120000Z
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
@@ -3979,6 +4228,7 @@
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:12345-67890
+DTSTAMP:20080601T120000Z
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
@@ -4024,6 +4274,7 @@
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:12345-67890
+DTSTAMP:20080601T120000Z
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
@@ -4078,6 +4329,7 @@
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:12345-67890
+DTSTAMP:20080601T120000Z
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
@@ -4089,6 +4341,7 @@
BEGIN:VEVENT
UID:12345-67890
RECURRENCE-ID:20080602T120000Z
+DTSTAMP:20080601T120000Z
DTSTART:20080602T130000Z
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
@@ -4132,6 +4385,7 @@
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:12345-67890
+DTSTAMP:20080601T120000Z
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
@@ -4142,6 +4396,7 @@
BEGIN:VEVENT
UID:12345-67890
RECURRENCE-ID:20080602T120000Z
+DTSTAMP:20080601T120000Z
DTSTART:20080602T130000Z
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
@@ -4208,6 +4463,7 @@
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:12345-67890
+DTSTAMP:20080601T120000Z
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
ATTENDEE:mailto:user1 at example.com
@@ -4218,6 +4474,7 @@
BEGIN:VEVENT
UID:12345-67890
RECURRENCE-ID:20080602T120000Z
+DTSTAMP:20080601T120000Z
DTSTART:20080602T130000Z
DTEND:20080602T140000Z
ATTENDEE:mailto:user1 at example.com
Modified: CalendarServer/trunk/twistedcaldav/test/test_multiget.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_multiget.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/test_multiget.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -121,6 +121,7 @@
UID:good
DTSTART;VALUE=DATE:20020101
DTEND;VALUE=DATE:20020102
+DTSTAMP:20020101T121212Z
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20031231;BYMONTH=1
SUMMARY:New Year's Day
END:VEVENT
@@ -134,6 +135,7 @@
UID:bad
DTSTART;VALUE=DATE:20020214
DTEND;VALUE=DATE:20020215
+DTSTAMP:20020101T121212Z
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=2
SUMMARY:Valentine's Day
END:VEVENT
@@ -154,6 +156,7 @@
UID:bad
DTSTART;VALUE=DATE:20020214
DTEND;VALUE=DATE:20020
+DTSTAMP:20020101T121212Z
END:VCALENDAR
""".replace("\n", "\r\n"))
f.close
Modified: CalendarServer/trunk/twistedcaldav/test/test_validation.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_validation.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/test_validation.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -48,8 +48,10 @@
def _getSampleCalendar(self):
return Component.fromString("""BEGIN:VCALENDAR
VERSION:2.0
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
BEGIN:VEVENT
UID:12345-67890
+DTSTAMP:20071114T000000Z
DTSTART:20071114T000000Z
ORGANIZER:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
Modified: CalendarServer/trunk/twistedcaldav/test/test_xml.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_xml.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/test/test_xml.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -30,7 +30,8 @@
calendar_file = os.path.join(os.path.dirname(__file__), "data", "Holidays",
"C3184A66-1ED0-11D9-A5E0-000A958A3252.ics")
calendar = Component.fromStream(file(calendar_file))
- calendar.validateForCalDAV()
+ calendar.validCalendarData()
+ calendar.validCalendarForCalDAV(methodAllowed=False)
def test_ComponentFilter(self):
"""
Modified: CalendarServer/trunk/twistedcaldav/vcard.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/vcard.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/twistedcaldav/vcard.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -27,15 +27,18 @@
import cStringIO as StringIO
import codecs
+from twext.python.log import Logger
from twext.web2.stream import IStream
from twext.web2.dav.util import allDataFromStream
from pycalendar.attribute import PyCalendarAttribute
from pycalendar.componentbase import PyCalendarComponentBase
-from pycalendar.exceptions import PyCalendarInvalidData
+from pycalendar.exceptions import PyCalendarError
from pycalendar.vcard.card import Card
from pycalendar.vcard.property import Property as pyProperty
+log = Logger()
+
vCardProductID = "-//CALENDARSERVER.ORG//NONSGML Version 1//EN"
class InvalidVCardDataError(ValueError):
@@ -197,7 +200,7 @@
"""
try:
results = Card.parseMultiple(stream)
- except PyCalendarInvalidData:
+ except PyCalendarError:
results = None
if not results:
stream.seek(0)
@@ -235,7 +238,7 @@
cal = Card()
try:
result = cal.parse(stream)
- except PyCalendarInvalidData:
+ except PyCalendarError:
result = None
if not result:
stream.seek(0)
@@ -409,6 +412,26 @@
return self._resource_uid
+ def validVCardData(self, doFix=True, doRaise=True):
+ """
+ @return: tuple of fixed, unfixed issues
+ @raise InvalidVCardDataError: if the given vcard data is not valid.
+ """
+ if self.name() != "VCARD":
+ log.debug("Not a vcard: %s" % (self,))
+ raise InvalidVCardDataError("Not a vcard")
+
+ # Do underlying vCard library validation with data fix
+ fixed, unfixed = self._pycard.validate(doFix=doFix)
+ if unfixed:
+ log.debug("vCard data had unfixable problems:\n %s" % ("\n ".join(unfixed),))
+ if doRaise:
+ raise InvalidVCardDataError("Calendar data had unfixable problems:\n %s" % ("\n ".join(unfixed),))
+ if fixed:
+ log.debug("vCard data had fixable problems:\n %s" % ("\n ".join(fixed),))
+
+ return fixed, unfixed
+
def validForCardDAV(self):
"""
@raise ValueError: if the given vcard data is not valid.
Modified: CalendarServer/trunk/txdav/caldav/datastore/file.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/file.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/caldav/datastore/file.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -14,6 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
##
+from twistedcaldav.ical import InvalidICalendarDataError
"""
File calendar store.
@@ -37,7 +38,6 @@
from txdav.base.propertystore.xattr import PropertyStore
-from twext.python.vcomponent import InvalidICalendarDataError
from twext.python.vcomponent import VComponent
from twext.web2.dav import davxml
from twext.web2.dav.element.rfc2518 import ResourceType, GETContentType
@@ -302,8 +302,8 @@
self.name(), component
)
- self._component = component
- # FIXME: needs to clear text cache
+ componentText = str(component)
+ self._objectText = componentText
def do():
# Mark all properties as dirty, so they can be added back
@@ -315,7 +315,6 @@
backup = hidden(self._path.temporarySibling())
self._path.moveTo(backup)
- componentText = str(component)
fh = self._path.open("w")
try:
# FIXME: concurrency problem; if this write is interrupted
@@ -342,23 +341,38 @@
def component(self):
+ """
+ Read calendar data and validate/fix it. Do not raise a store error here if there are unfixable
+ errors as that could prevent the overall request to fail. Instead we will hand bad data off to
+ the caller - that is not ideal but in theory we should have checked everything on the way in and
+ only allowed in good data.
+ """
text = self._text()
-
try:
component = VComponent.fromString(text)
- # Fix any bogus data we can
- component.validateComponentsForCalDAV(False, fix=True)
except InvalidICalendarDataError, e:
+ # This is a really bad situation, so do raise
raise InternalDataStoreError(
"File corruption detected (%s) in file: %s"
% (e, self._path.path)
)
+
+ # Fix any bogus data we can
+ fixed, unfixed = component.validCalendarData(doFix=True, doRaise=False)
+
+ if unfixed:
+ self.log_error("Calendar data at %s had unfixable problems:\n %s" % (self._path.path, "\n ".join(unfixed),))
+
+ if fixed:
+ self.log_error("Calendar data at %s had fixable problems:\n %s" % (self._path.path, "\n ".join(fixed),))
+
return component
def _text(self):
- if self._component is not None:
- return str(self._component)
+ if self._objectText is not None:
+ return self._objectText
+
try:
fh = self._path.open()
except IOError, e:
@@ -388,6 +402,8 @@
"File corruption detected (improper start) in file: %s"
% (self._path.path,)
)
+
+ self._objectText = text
return text
def uid(self):
Modified: CalendarServer/trunk/txdav/caldav/datastore/index_file.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/index_file.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/caldav/datastore/index_file.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -1046,7 +1046,8 @@
# FIXME: This is blocking I/O
try:
calendar = Component.fromStream(stream)
- calendar.validateForCalDAV()
+ calendar.validCalendarData()
+ calendar.validCalendarForCalDAV(methodAllowed=False)
except ValueError:
log.err("Non-calendar resource: %s" % (name,))
else:
@@ -1149,8 +1150,8 @@
# FIXME: This is blocking I/O
try:
calendar = Component.fromStream(stream)
- calendar.validCalendarForCalDAV()
- calendar.validateComponentsForCalDAV(True)
+ calendar.validCalendarData()
+ calendar.validCalendarForCalDAV(methodAllowed=True)
except ValueError:
log.err("Non-calendar resource: %s" % (name,))
else:
Modified: CalendarServer/trunk/txdav/caldav/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/sql.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/caldav/datastore/sql.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -39,7 +39,7 @@
from twistedcaldav.config import config
from twistedcaldav.dateops import normalizeForIndex, datetimeMktime,\
parseSQLTimestamp, pyCalendarTodatetime
-from twistedcaldav.ical import Component
+from twistedcaldav.ical import Component, InvalidICalendarDataError
from twistedcaldav.instance import InvalidOverriddenInstanceError
from twistedcaldav.memcacher import Memcacher
@@ -71,7 +71,8 @@
from txdav.caldav.icalendarstore import QuotaExceeded
from txdav.caldav.datastore.util import StorageTransportBase
-from txdav.common.icommondatastore import IndexedSearchException
+from txdav.common.icommondatastore import IndexedSearchException,\
+ InternalDataStoreError
from pycalendar.datetime import PyCalendarDateTime
from pycalendar.duration import PyCalendarDuration
@@ -614,9 +615,35 @@
@inlineCallbacks
def component(self):
- returnValue(VComponent.fromString((yield self._text())))
+ """
+ Read calendar data and validate/fix it. Do not raise a store error here if there are unfixable
+ errors as that could prevent the overall request to fail. Instead we will hand bad data off to
+ the caller - that is not ideal but in theory we should have checked everything on the way in and
+ only allowed in good data.
+ """
+ text = yield self._text()
+ try:
+ component = VComponent.fromString(text)
+ except InvalidICalendarDataError, e:
+ # This is a really bad situation, so do raise
+ raise InternalDataStoreError(
+ "Data corruption detected (%s) in id: %s"
+ % (e, self._resourceID)
+ )
+ # Fix any bogus data we can
+ fixed, unfixed = component.validCalendarData(doFix=True, doRaise=False)
+
+ if unfixed:
+ self.log_error("Calendar data id=%s had unfixable problems:\n %s" % (self._resourceID, "\n ".join(unfixed),))
+
+ if fixed:
+ self.log_error("Calendar data id=%s had fixable problems:\n %s" % (self._resourceID, "\n ".join(fixed),))
+
+ returnValue(component)
+
+
@inlineCallbacks
def organizer(self):
returnValue((yield self.component()).getOrganizer())
Modified: CalendarServer/trunk/txdav/caldav/datastore/test/common.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/common.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/common.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -927,6 +927,7 @@
BEGIN:VEVENT
DTSTART:20110101T120000Z
DTEND:20110101T120100Z
+DTSTAMP:20080601T120000Z
UID:event-with-some-per-user-data
ATTENDEE:urn:uuid:home1
ORGANIZER:urn:uuid:home1
@@ -937,6 +938,7 @@
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:somebody else
+TRIGGER:-PT20M
END:VALARM
END:X-CALENDARSERVER-PERINSTANCE
END:X-CALENDARSERVER-PERUSER
@@ -946,6 +948,7 @@
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:the owner
+TRIGGER:-PT20M
END:VALARM
END:X-CALENDARSERVER-PERINSTANCE
END:X-CALENDARSERVER-PERUSER
@@ -959,12 +962,14 @@
BEGIN:VEVENT
DTSTART:20110101T120000Z
DTEND:20110101T120100Z
+DTSTAMP:20080601T120000Z
UID:event-with-some-per-user-data
ATTENDEE:urn:uuid:home1
ORGANIZER:urn:uuid:home1
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:the owner
+TRIGGER:-PT20M
END:VALARM
END:VEVENT
END:VCALENDAR
@@ -977,12 +982,14 @@
BEGIN:VEVENT
DTSTART:20110101T120000Z
DTEND:20110101T120100Z
+DTSTAMP:20080601T120000Z
UID:event-with-some-per-user-data
ATTENDEE:urn:uuid:home1
ORGANIZER:urn:uuid:home1
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:somebody else
+TRIGGER:-PT20M
END:VALARM
END:VEVENT
END:VCALENDAR
@@ -1008,8 +1015,11 @@
filtered per-user data.
"""
obj = yield self.setUpPerUser()
+ temp = yield obj.component()
+ obj._component = temp.duplicate()
otherComp = (yield obj.filteredComponent("some-other-user"))
self.assertEquals(otherComp, self.asSeenByOther())
+ obj._component = temp.duplicate()
ownerComp = (yield obj.filteredComponent("home1"))
self.assertEquals(ownerComp, self.asSeenByOwner())
@@ -1431,7 +1441,7 @@
now that logic lives in the protocol layer, so this testing method
replicates it.
"""
- uuid, rev = token.split("_", 1)
+ _ignore_uuid, rev = token.split("_", 1)
rev = int(rev)
return rev
Modified: CalendarServer/trunk/txdav/caldav/datastore/test/test_index_file.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/test_index_file.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_index_file.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -49,7 +49,8 @@
try:
component = Component.fromString(text)
# Fix any bogus data we can
- component.validateComponentsForCalDAV(False, fix=True)
+ component.validCalendarData()
+ component.validCalendarForCalDAV(methodAllowed=False)
except InvalidICalendarDataError, e:
raise InternalDataStoreError(
"File corruption detected (%s) in file: %s"
@@ -163,6 +164,7 @@
UID:12345-67890-1.1
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -182,6 +184,7 @@
UID:12345-67890-2.1
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -202,6 +205,7 @@
UID:12345-67890-2.2
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -212,6 +216,7 @@
RECURRENCE-ID:20080608T120000Z
DTSTART:20080608T120000Z
DTEND:20080608T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -231,6 +236,7 @@
UID:12345-67890-2.3
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -241,6 +247,7 @@
RECURRENCE-ID:20080609T120000Z
DTSTART:20080608T120000Z
DTEND:20080608T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -260,6 +267,7 @@
UID:12345-67890-2.4
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -270,6 +278,7 @@
RECURRENCE-ID:20080609T120000Z
DTSTART:20080608T120000Z
DTEND:20080608T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -322,6 +331,7 @@
UID:12345-67890-1.1
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -342,6 +352,7 @@
UID:12345-67890-1.2
DTSTART:20080602T120000Z
DTEND:20080602T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -363,6 +374,7 @@
UID:12345-67890-1.3
DTSTART:20080603T120000Z
DTEND:20080603T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -384,6 +396,7 @@
UID:12345-67890-1.4
DTSTART:20080604T120000Z
DTEND:20080604T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -405,6 +418,7 @@
UID:12345-67890-2.1
DTSTART:20080605T120000Z
DTEND:20080605T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -429,6 +443,7 @@
UID:12345-67890-2.2
DTSTART:20080607T120000Z
DTEND:20080607T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -439,6 +454,7 @@
RECURRENCE-ID:20080608T120000Z
DTSTART:20080608T140000Z
DTEND:20080608T150000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -502,6 +518,7 @@
UID:12345-67890-1.1
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -543,6 +560,7 @@
UID:12345-67890-1.2
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -599,6 +617,7 @@
UID:12345-67890-1.1
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -647,6 +666,7 @@
UID:12345-67890-1.2
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -713,6 +733,7 @@
UID:12345-67890-1.1
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -723,6 +744,7 @@
RECURRENCE-ID:20080602T120000Z
DTSTART:20080602T130000Z
DTEND:20080602T140000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -776,6 +798,7 @@
UID:12345-67890-1.2
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -786,6 +809,7 @@
RECURRENCE-ID:20080602T120000Z
DTSTART:20080602T130000Z
DTEND:20080602T140000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -899,6 +923,7 @@
UID:12345-67890-1.1
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -912,6 +937,7 @@
UID:12345-67890-2.1
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
@@ -926,6 +952,7 @@
UID:12345-67890-2.3
DTSTART:20080601T120000Z
DTEND:20080601T130000Z
+DTSTAMP:20080601T120000Z
ORGANIZER;CN="User 01":mailto:user1 at example.com
ATTENDEE:mailto:user1 at example.com
ATTENDEE:mailto:user2 at example.com
Modified: CalendarServer/trunk/txdav/caldav/datastore/util.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/util.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/caldav/datastore/util.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -64,12 +64,10 @@
pass
try:
- # FIXME: This is a bad way to do this test, there should be a
+ # FIXME: This is a bad way to do this test (== 'inbox'), there should be a
# Calendar-level API for it.
- if calendar.name() == 'inbox':
- component.validateComponentsForCalDAV(True)
- else:
- component.validateForCalDAV()
+ component.validCalendarData()
+ component.validCalendarForCalDAV(methodAllowed=calendar.name() == 'inbox')
except InvalidICalendarDataError, e:
raise InvalidObjectResourceError(e)
Modified: CalendarServer/trunk/txdav/carddav/datastore/file.py
===================================================================
--- CalendarServer/trunk/txdav/carddav/datastore/file.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/carddav/datastore/file.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -144,9 +144,6 @@
),
)
- def _doValidate(self, component):
- component.validForCardDAV()
-
def contentType(self):
"""
The content type of Addresbook objects is text/vcard.
@@ -181,8 +178,8 @@
self.name(), component
)
- self._component = component
- # FIXME: needs to clear text cache
+ componentText = str(component)
+ self._objectText = componentText
def do():
# Mark all properties as dirty, so they can be added back
@@ -194,7 +191,6 @@
backup = hidden(self._path.temporarySibling())
self._path.moveTo(backup)
- componentText = str(component)
fh = self._path.open("w")
try:
# FIXME: concurrency problem; if this write is interrupted
@@ -221,23 +217,38 @@
def component(self):
- if self._component is not None:
- return self._component
+ """
+ Read address data and validate/fix it. Do not raise a store error here if there are unfixable
+ errors as that could prevent the overall request to fail. Instead we will hand bad data off to
+ the caller - that is not ideal but in theory we should have checked everything on the way in and
+ only allowed in good data.
+ """
text = self._text()
-
try:
component = VComponent.fromString(text)
except InvalidVCardDataError, e:
+ # This is a really bad situation, so do raise
raise InternalDataStoreError(
"File corruption detected (%s) in file: %s"
% (e, self._path.path)
)
+
+ # Fix any bogus data we can
+ fixed, unfixed = component.validVCardData(doFix=True, doRaise=False)
+
+ if unfixed:
+ self.log_error("Address data at %s had unfixable problems:\n %s" % (self._path.path, "\n ".join(unfixed),))
+
+ if fixed:
+ self.log_error("Address data at %s had fixable problems:\n %s" % (self._path.path, "\n ".join(fixed),))
+
return component
def _text(self):
- if self._component is not None:
- return str(self._component)
+ if self._objectText is not None:
+ return self._objectText
+
try:
fh = self._path.open()
except IOError, e:
@@ -259,6 +270,8 @@
"File corruption detected (improper start) in file: %s"
% (self._path.path,)
)
+
+ self._objectText = text
return text
def uid(self):
Modified: CalendarServer/trunk/txdav/carddav/datastore/index_file.py
===================================================================
--- CalendarServer/trunk/txdav/carddav/datastore/index_file.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/carddav/datastore/index_file.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -589,6 +589,7 @@
# FIXME: This is blocking I/O
try:
vcard = Component.fromStream(stream)
+ vcard.validVCardData()
vcard.validForCardDAV()
except ValueError:
log.err("Non-addressbook resource: %s" % (name,))
Modified: CalendarServer/trunk/txdav/carddav/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/carddav/datastore/sql.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/carddav/datastore/sql.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -14,6 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
##
+from txdav.common.icommondatastore import InternalDataStoreError
"""
SQL backend for CardDAV storage.
@@ -35,7 +36,7 @@
from twistedcaldav import carddavxml, customxml
from twistedcaldav.memcacher import Memcacher
-from twistedcaldav.vcard import Component as VCard
+from twistedcaldav.vcard import Component as VCard, InvalidVCardDataError
from txdav.common.datastore.sql_legacy import \
PostgresLegacyABIndexEmulator, SQLLegacyAddressBookInvites,\
@@ -177,10 +178,6 @@
)
- def _doValidate(self, component):
- component.validForCardDAV()
-
-
def contentType(self):
"""
The content type of Addresbook objects is text/vcard.
@@ -271,13 +268,39 @@
@inlineCallbacks
def component(self):
- returnValue(VCard.fromString((yield self._text())))
+ """
+ Read address data and validate/fix it. Do not raise a store error here if there are unfixable
+ errors as that could prevent the overall request to fail. Instead we will hand bad data off to
+ the caller - that is not ideal but in theory we should have checked everything on the way in and
+ only allowed in good data.
+ """
+ text = yield self._text()
+ try:
+ component = VCard.fromString(text)
+ except InvalidVCardDataError, e:
+ # This is a really bad situation, so do raise
+ raise InternalDataStoreError(
+ "Data corruption detected (%s) in id: %s"
+ % (e, self._resourceID)
+ )
+ # Fix any bogus data we can
+ fixed, unfixed = component.validVCardData(doFix=True, doRaise=False)
+
+ if unfixed:
+ self.log_error("Address data id=%s had unfixable problems:\n %s" % (self._resourceID, "\n ".join(unfixed),))
+
+ if fixed:
+ self.log_error("Address data id=%s had fixable problems:\n %s" % (self._resourceID, "\n ".join(fixed),))
+
+ returnValue(component)
+
+
# IDataStoreObject
def contentType(self):
"""
- The content type of Addressbook objects is text/x-vcard.
+ The content type of Addressbook objects is text/vcard.
"""
return MimeType.fromString("text/vcard; charset=utf-8")
Modified: CalendarServer/trunk/txdav/carddav/datastore/util.py
===================================================================
--- CalendarServer/trunk/txdav/carddav/datastore/util.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/carddav/datastore/util.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -58,6 +58,7 @@
pass
try:
+ component.validVCardData()
component.validForCardDAV()
except InvalidVCardDataError, e:
raise InvalidObjectResourceError(e)
Modified: CalendarServer/trunk/txdav/common/datastore/file.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/file.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/common/datastore/file.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -857,9 +857,6 @@
"""
pass
- def _doValidate(self, component):
- raise NotImplementedError
-
def addNotifier(self, notifier):
if self._notifiers is None:
self._notifiers = ()
@@ -906,7 +903,7 @@
self._name = name
self._parentCollection = parent
self._transaction = parent._transaction
- self._component = None
+ self._objectText = None
@property
@@ -1088,12 +1085,7 @@
name = uid + ".xml"
self.removeNotificationObjectWithName(name)
- def _doValidate(self, component):
- # Nothing to do - notifications are always generated internally by the server
- # so they better be valid all the time!
- pass
-
class NotificationObject(CommonObjectResource):
"""
"""
Modified: CalendarServer/trunk/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql.py 2011-06-30 16:25:55 UTC (rev 7693)
+++ CalendarServer/trunk/txdav/common/datastore/sql.py 2011-06-30 16:29:37 UTC (rev 7694)
@@ -2037,10 +2037,6 @@
"""
- def _doValidate(self, component):
- raise NotImplementedError
-
-
# IDataStoreObject
def contentType(self):
raise NotImplementedError()
@@ -2095,9 +2091,7 @@
class CommonObjectResource(LoggingMixIn, FancyEqMixin):
"""
- @ivar _path: The path of the file on disk
-
- @type _path: L{FilePath}
+ Base class for object resources.
"""
compareAttributes = (
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110630/c2139159/attachment-0001.html>
More information about the calendarserver-changes
mailing list