[CalendarServer-changes] [4913] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Jan 7 10:53:48 PST 2010


Revision: 4913
          http://trac.macosforge.org/projects/calendarserver/changeset/4913
Author:   cdaboo at apple.com
Date:     2010-01-07 10:53:47 -0800 (Thu, 07 Jan 2010)
Log Message:
-----------
Support for SCHEDULE-AGENT on Organizer.

Modified Paths:
--------------
    CalendarServer/trunk/support/build.sh
    CalendarServer/trunk/twistedcaldav/ical.py
    CalendarServer/trunk/twistedcaldav/scheduling/implicit.py

Modified: CalendarServer/trunk/support/build.sh
===================================================================
--- CalendarServer/trunk/support/build.sh	2010-01-07 18:50:45 UTC (rev 4912)
+++ CalendarServer/trunk/support/build.sh	2010-01-07 18:53:47 UTC (rev 4913)
@@ -496,7 +496,7 @@
     false true true true 212;
 
   # Tool dependencies.  The code itself doesn't depend on these, but you probably want them.
-  svn_get "CalDAVTester" "${top}/CalDAVTester" "${svn_uri_base}/CalDAVTester/trunk" 4906;
+  svn_get "CalDAVTester" "${top}/CalDAVTester" "${svn_uri_base}/CalDAVTester/trunk" 4912;
   svn_get "Pyflakes" "${top}/Pyflakes" http://divmod.org/svn/Divmod/trunk/Pyflakes 17198;
 }
 

Modified: CalendarServer/trunk/twistedcaldav/ical.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/ical.py	2010-01-07 18:50:45 UTC (rev 4912)
+++ CalendarServer/trunk/twistedcaldav/ical.py	2010-01-07 18:53:47 UTC (rev 4913)
@@ -1511,6 +1511,18 @@
 
         return None
 
+    def getOrganizerScheduleAgent(self):
+
+        is_server = False
+        organizerProp = self.getOrganizerProperty()
+        if "SCHEDULE-AGENT" in organizerProp.params():
+            if organizerProp.paramValue("SCHEDULE-AGENT") == "SERVER":
+                is_server = True
+        else:
+            is_server = True
+
+        return is_server
+
     def getAttendees(self):
         """
         Get the attendee value. Works on either a VCALENDAR or on a component.

Modified: CalendarServer/trunk/twistedcaldav/scheduling/implicit.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/implicit.py	2010-01-07 18:50:45 UTC (rev 4912)
+++ CalendarServer/trunk/twistedcaldav/scheduling/implicit.py	2010-01-07 18:53:47 UTC (rev 4913)
@@ -760,13 +760,19 @@
         if not self.internal_request:
             yield self.doAccessControl(self.attendeePrincipal, False)
 
+        # Check SCHEDULE-AGENT
+        doScheduling = self.checkOrganizerScheduleAgent()
+
         if self.action == "remove":
             if self.calendar.hasPropertyValueInAllComponents(Property("STATUS", "CANCELLED")):
                 log.debug("Implicit - attendee '%s' is removing cancelled UID: '%s'" % (self.attendee, self.uid))
                 # Nothing else to do
-            else:
+            elif doScheduling:
                 log.debug("Implicit - attendee '%s' is cancelling UID: '%s'" % (self.attendee, self.uid))
                 yield self.scheduleCancelWithOrganizer()
+            else:
+                log.debug("Implicit - attendee '%s' is removing UID without server scheduling: '%s'" % (self.attendee, self.uid))
+                # Nothing else to do
         
         else:
             # Make sure ORGANIZER is not changed
@@ -833,9 +839,30 @@
                 log.debug("Attendee '%s' is allowed to update UID: '%s' with remote organizer '%s'" % (self.attendee, self.uid, self.organizer))
                 changedRids = None
 
-            log.debug("Implicit - attendee '%s' is updating UID: '%s'" % (self.attendee, self.uid))
-            yield self.scheduleWithOrganizer(changedRids)
+            if doScheduling:
+                log.debug("Implicit - attendee '%s' is updating UID: '%s'" % (self.attendee, self.uid))
+                yield self.scheduleWithOrganizer(changedRids)
+            else:
+                log.debug("Implicit - attendee '%s' is updating UID without server scheduling: '%s'" % (self.attendee, self.uid))
+                # Nothing else to do
 
+    def checkOrganizerScheduleAgent(self):
+
+        is_server = self.calendar.getOrganizerScheduleAgent()
+        local_organizer = isinstance(self.organizerAddress, LocalCalendarUser)
+
+        if local_organizer and not is_server:
+            log.error("Attendee '%s' is not allowed to change SCHEDULE-AGENT on organizer: UID:%s" % (self.attendeePrincipal, self.uid,))
+            raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (caldav_namespace, "valid-attendee-change")))
+        elif not local_organizer and is_server:
+            # Coerce ORGANIZER to SCHEDULE-AGENT=NONE
+            log.debug("Attendee '%s' is not allowed to use SCHEDULE-AGENT=SERVER on organizer: UID:%s" % (self.attendeePrincipal, self.uid,))
+            self.calendar.setParameterToValueForPropertyWithValue("SCHEDULE-AGENT", "NONE", "ORGANIZER", None)
+            self.calendar.setParameterToValueForPropertyWithValue("SCHEDULE-STATUS", iTIPRequestStatus.NO_USER_SUPPORT_CODE, "ORGANIZER", None)
+            is_server = False
+            
+        return is_server
+
     @inlineCallbacks
     def getOrganizersCopy(self):
         """
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20100107/b5867430/attachment.html>


More information about the calendarserver-changes mailing list