[CalendarServer-changes] [4222] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri May 8 20:05:44 PDT 2009


Revision: 4222
          http://trac.macosforge.org/projects/calendarserver/changeset/4222
Author:   cdaboo at apple.com
Date:     2009-05-08 20:05:43 -0700 (Fri, 08 May 2009)
Log Message:
-----------
Make sure REPLY processing ignores invalid instances. Make sure REPLYs only contain the minimum set
of instances being changed.

Modified Paths:
--------------
    CalendarServer/trunk/run
    CalendarServer/trunk/twistedcaldav/scheduling/icaldiff.py
    CalendarServer/trunk/twistedcaldav/scheduling/implicit.py
    CalendarServer/trunk/twistedcaldav/scheduling/itip.py
    CalendarServer/trunk/twistedcaldav/scheduling/test/test_icaldiff.py

Modified: CalendarServer/trunk/run
===================================================================
--- CalendarServer/trunk/run	2009-05-09 03:02:13 UTC (rev 4221)
+++ CalendarServer/trunk/run	2009-05-09 03:05:43 UTC (rev 4222)
@@ -727,7 +727,7 @@
 
 caldavtester="${top}/CalDAVTester";
 
-svn_get "CalDAVTester" "${caldavtester}" "${svn_uri_base}/CalDAVTester/trunk" 4212;
+svn_get "CalDAVTester" "${caldavtester}" "${svn_uri_base}/CalDAVTester/trunk" 4221;
 
 #
 # PyFlakes

Modified: CalendarServer/trunk/twistedcaldav/scheduling/icaldiff.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/icaldiff.py	2009-05-09 03:02:13 UTC (rev 4221)
+++ CalendarServer/trunk/twistedcaldav/scheduling/icaldiff.py	2009-05-09 03:05:43 UTC (rev 4222)
@@ -293,7 +293,7 @@
                     # Mark Attendee as DECLINED in the server instance
                     if self._attendeeDecline(self.newCalendar.overriddenComponent(rid)):
                         changeCausesReply = True
-                        changedRids.append(rid)
+                        changedRids.append(toString(rid) if rid else "")
                 else:
                     log.debug("attendeeMerge: Missing uncancelled component from first calendar: %s" % (key,))
                     return False, False, (), None
@@ -356,7 +356,7 @@
                 return False, False, (), None
             changeCausesReply |= reply
             if reply:
-                changedRids.append(rid)
+                changedRids.append(toString(rid) if rid else "")
 
         # We need to derive instances for any declined using an EXDATE
         for decline in sorted(declines):
@@ -367,7 +367,7 @@
                     self.newCalendar.addComponent(overridden)
                     if self._attendeeDecline(overridden):
                         changeCausesReply = True
-                        changedRids.append(decline)
+                        changedRids.append(toString(decline) if decline else "")
                 else:
                     log.debug("Unable to override and instance to mark as DECLINED: %s" % (decline,))
                     return False, False, (), None

Modified: CalendarServer/trunk/twistedcaldav/scheduling/implicit.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/implicit.py	2009-05-09 03:02:13 UTC (rev 4221)
+++ CalendarServer/trunk/twistedcaldav/scheduling/implicit.py	2009-05-09 03:05:43 UTC (rev 4222)
@@ -726,7 +726,7 @@
             if self.organizer_calendar:
 
                 # Determine whether the current change is allowed
-                changeAllowed, doITipReply, _ignore_changedRids, newCalendar = self.isAttendeeChangeInsignificant()
+                changeAllowed, doITipReply, changedRids, newCalendar = self.isAttendeeChangeInsignificant()
                 if changeAllowed:
                     self.return_calendar = self.calendar = newCalendar
 
@@ -759,10 +759,10 @@
                 # to make any change they like as we cannot verify what is reasonable. In reality
                 # we ought to be comparing the Attendee changes against the attendee's own copy
                 # and restrict changes based on that when the organizer's copy is not available.
-                pass
+                changedRids = None
 
             log.debug("Implicit - attendee '%s' is updating UID: '%s'" % (self.attendee, self.uid))
-            yield self.scheduleWithOrganizer()
+            yield self.scheduleWithOrganizer(changedRids)
 
     @inlineCallbacks
     def getOrganizersCopy(self):
@@ -811,16 +811,16 @@
         differ = iCalDiff(oldcalendar, self.calendar, self.do_smart_merge)
         return differ.attendeeMerge(self.attendee)
 
-    def scheduleWithOrganizer(self):
+    def scheduleWithOrganizer(self, changedRids=None):
 
-        itipmsg = iTipGenerator.generateAttendeeReply(self.calendar, self.attendee)
+        itipmsg = iTipGenerator.generateAttendeeReply(self.calendar, self.attendee, changedRids=changedRids)
 
         # Send scheduling message
         return self.sendToOrganizer("REPLY", itipmsg)
 
     def scheduleCancelWithOrganizer(self):
 
-        itipmsg = iTipGenerator.generateAttendeeReply(self.calendar, self.attendee, True)
+        itipmsg = iTipGenerator.generateAttendeeReply(self.calendar, self.attendee, force_decline=True)
 
         # Send scheduling message
         return self.sendToOrganizer("CANCEL", itipmsg)

Modified: CalendarServer/trunk/twistedcaldav/scheduling/itip.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/itip.py	2009-05-09 03:02:13 UTC (rev 4221)
+++ CalendarServer/trunk/twistedcaldav/scheduling/itip.py	2009-05-09 03:05:43 UTC (rev 4222)
@@ -304,6 +304,9 @@
                 match_component = calendar.deriveInstance(rid)
                 if match_component:
                     calendar.addComponent(match_component)
+                else:
+                    log.error("Ignoring instance: %s in iTIP REPLY for: %s" % (rid, itip_message.resourceUID()))
+                    continue
 
             attendee, partstat, private_comment = iTipProcessing.updateAttendeeData(itip_component, match_component)
             attendees.add(attendee)
@@ -571,13 +574,16 @@
             return None
 
     @staticmethod
-    def generateAttendeeReply(original, attendee, force_decline=False):
+    def generateAttendeeReply(original, attendee, changedRids=None, force_decline=False):
 
         # Start with a copy of the original as we may have to modify bits of it
         itip = original.duplicate()
         itip.replaceProperty(Property("PRODID", iCalendarProductID))
         itip.addProperty(Property("METHOD", "REPLY"))
-        
+
+        # Now filter out components except the ones specified
+        itip.filterComponents(changedRids)
+
         # Force update to DTSTAMP everywhere
         itip.replacePropertyInAllComponents(Property("DTSTAMP", datetime.datetime.now(tz=utc)))
 
@@ -592,6 +598,7 @@
             "UID",
             "RECURRENCE-ID",
             "SEQUENCE",
+            "STATUS",
             "DTSTAMP",
             "DTSTART",
             "DTEND",

Modified: CalendarServer/trunk/twistedcaldav/scheduling/test/test_icaldiff.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/test/test_icaldiff.py	2009-05-09 03:02:13 UTC (rev 4221)
+++ CalendarServer/trunk/twistedcaldav/scheduling/test/test_icaldiff.py	2009-05-09 03:05:43 UTC (rev 4222)
@@ -18,7 +18,6 @@
 from twistedcaldav.scheduling.icaldiff import iCalDiff
 import twistedcaldav.test.util
 from difflib import unified_diff
-from twistedcaldav.dateops import toString
 
 import itertools
 
@@ -552,7 +551,7 @@
 END:VCALENDAR
 """,
                 "mailto:user2 at example.com",
-                (True, True, (None,), """BEGIN:VCALENDAR
+                (True, True, ("",), """BEGIN:VCALENDAR
 VERSION:2.0
 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
 BEGIN:VEVENT
@@ -1122,7 +1121,7 @@
             diffResult = (
                 diffResult[0],
                 diffResult[1],
-                tuple([toString(i) if i else None for i in diffResult[2]]),
+                tuple(diffResult[2]),
                 str(diffResult[3]).replace("\r", "") if diffResult[3] else None,
             )
             self.assertEqual(diffResult, result, msg="%s: actual result: (%s)" % (description, ", ".join([str(i).replace("\r", "") for i in diffResult]),))
@@ -1568,7 +1567,7 @@
             diffResult = (
                 diffResult[0],
                 diffResult[1],
-                tuple([toString(i) if i else None for i in diffResult[2]]),
+                tuple(diffResult[2]),
                 str(diffResult[3]).replace("\r", "") if diffResult[3] else None,
             )
             self.assertEqual(diffResult, result, msg="%s: actual result: (%s)" % (description, ", ".join([str(i).replace("\r", "") for i in diffResult]),))
@@ -1910,7 +1909,7 @@
             diffResult = (
                 diffResult[0],
                 diffResult[1],
-                tuple([toString(i) if i else None for i in diffResult[2]]),
+                tuple(diffResult[2]),
                 str(diffResult[3]).replace("\r", "") if diffResult[3] else None,
             )
             self.assertEqual(diffResult, result, msg="%s: actual result: (%s)" % (description, ", ".join([str(i).replace("\r", "") for i in diffResult]),))
@@ -2248,7 +2247,7 @@
             diffResult = (
                 diffResult[0],
                 diffResult[1],
-                tuple([toString(i) if i else None for i in diffResult[2]]),
+                tuple(diffResult[2]),
                 str(diffResult[3]).replace("\r", "") if diffResult[3] else None,
             )
             self.assertEqual(diffResult, result, msg="%s: actual result: (%s)" % (description, ", ".join([str(i).replace("\r", "") for i in diffResult]),))
@@ -2499,7 +2498,7 @@
             diffResult = (
                 diffResult[0],
                 diffResult[1],
-                tuple([toString(i) if i else None for i in diffResult[2]]),
+                tuple(diffResult[2]),
                 str(diffResult[3]).replace("\r", "") if diffResult[3] else None,
             )
             self.assertEqual(diffResult, result, msg="%s: actual result: (%s)" % (description, ", ".join([str(i).replace("\r", "") for i in diffResult]),))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090508/f4b075bf/attachment-0001.html>


More information about the calendarserver-changes mailing list