[CalendarServer-changes] [9890] CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/ scheduling

source_changes at macosforge.org source_changes at macosforge.org
Wed Oct 3 02:52:28 PDT 2012


Revision: 9890
          http://trac.calendarserver.org//changeset/9890
Author:   cdaboo at apple.com
Date:     2012-10-03 02:52:28 -0700 (Wed, 03 Oct 2012)
Log Message:
-----------
Re-map CalDAV <-> iSchedule XML namespaces during response aggregation. Make sure we undo address normalization when sending via iSchedule.

Modified Paths:
--------------
    CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/ischedule/delivery.py
    CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/ischedule/scheduler.py
    CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/ischedule/xml.py
    CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/scheduler.py

Modified: CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/ischedule/delivery.py
===================================================================
--- CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/ischedule/delivery.py	2012-10-03 09:50:32 UTC (rev 9889)
+++ CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/ischedule/delivery.py	2012-10-03 09:52:28 UTC (rev 9890)
@@ -45,10 +45,12 @@
 from twistedcaldav.scheduling.ischedule.remoteservers import IScheduleServers
 from twistedcaldav.scheduling.ischedule.utils import lookupServerViaSRV
 from twistedcaldav.scheduling.ischedule.xml import ScheduleResponse, Response, \
-    RequestStatus, Recipient, ischedule_namespace
+    RequestStatus, Recipient, ischedule_namespace, CalendarData, \
+    ResponseDescription, Error
 from twistedcaldav.scheduling.itip import iTIPRequestStatus
 from twistedcaldav.util import utf8String, normalizationLookup
 from urlparse import urlsplit
+from twistedcaldav.ical import normalizeCUAddress
 
 """
 Handles the sending of iSchedule scheduling messages. Used for both cross-domain scheduling,
@@ -360,7 +362,9 @@
         self.sign_headers.append("Host")
 
         # The Originator must be the ORGANIZER (for a request) or ATTENDEE (for a reply)
-        self.headers.addRawHeader("Originator", utf8String(self.scheduler.organizer.cuaddr if self.scheduler.isiTIPRequest else self.scheduler.attendee))
+        originator = self.scheduler.organizer.cuaddr if self.scheduler.isiTIPRequest else self.scheduler.attendee
+        originator = normalizeCUAddress(originator, normalizationLookup, self.scheduler.resource.principalForCalendarUserAddress, toUUID=False)
+        self.headers.addRawHeader("Originator", utf8String(originator))
         self.sign_headers.append("Originator")
 
         for recipient in self.recipients:
@@ -398,6 +402,7 @@
         """
 
         if self.data is None:
+            # Need to remap cuaddrs from urn:uuid
             if self.server.unNormalizeAddresses and self.scheduler.method == "PUT":
                 normalizedCalendar = self.scheduler.calendar.duplicate()
                 normalizedCalendar.normalizeCalendarUserAddresses(
@@ -406,6 +411,11 @@
                     toUUID=False)
             else:
                 normalizedCalendar = self.scheduler.calendar
+
+            # For VFREEBUSY we need to strip out ATTENDEEs that do not match the recipient list
+            if self.scheduler.isfreebusy:
+                normalizedCalendar.removeAllButTheseAttendees([recipient.cuaddr for recipient in self.recipients])
+
             self.data = str(normalizedCalendar)
 
 
@@ -468,4 +478,21 @@
             if not recipient or not request_status:
                 raise HTTPError(responsecode.BAD_REQUEST)
         for response in schedule_response.children:
-            self.responses.clone(response)
+            recipient = str(response.childOfType(Recipient))
+            request_status = str(response.childOfType(RequestStatus))
+            calendar_data = response.childOfType(CalendarData)
+            if calendar_data:
+                calendar_data = str(calendar_data)
+            error = response.childOfType(Error)
+            if error:
+                error = error.children
+            desc = response.childOfType(ResponseDescription)
+            if desc:
+                desc = str(desc)
+            self.responses.clone(
+                recipient,
+                request_status,
+                calendar_data,
+                error,
+                desc,
+            )

Modified: CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/ischedule/scheduler.py
===================================================================
--- CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/ischedule/scheduler.py	2012-10-03 09:50:32 UTC (rev 9889)
+++ CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/ischedule/scheduler.py	2012-10-03 09:52:28 UTC (rev 9890)
@@ -41,6 +41,7 @@
 from txdav.xml.base import WebDAVUnknownElement
 from twistedcaldav.scheduling.ischedule.utils import getIPsFromHost
 from twistedcaldav.scheduling.ischedule import xml
+from twistedcaldav.ical import normalizeCUAddress
 
 """
 L{IScheduleScheduler} - handles deliveries for scheduling messages being POSTed to the iSchedule inbox.
@@ -187,10 +188,20 @@
         """
 
         if not self.checkForFreeBusy():
-            self.calendar.normalizeCalendarUserAddresses(normalizationLookup,
-                self.resource.principalForCalendarUserAddress)
+            # Need to normalize the calendar data and recipient values to keep those in sync,
+            # as we might later try to match them
+            self.calendar.normalizeCalendarUserAddresses(normalizationLookup, self.resource.principalForCalendarUserAddress)
 
 
+    def loadRecipientsFromRequestHeaders(self):
+        """
+        Need to normalize the calendar data and recipient values to keep those in sync,
+        as we might later try to match them
+        """
+        super(IScheduleScheduler, self).loadRecipientsFromRequestHeaders()
+        self.recipients = [normalizeCUAddress(recipient, normalizationLookup, self.resource.principalForCalendarUserAddress) for recipient in self.recipients]
+
+
     def checkAuthorization(self):
         # Must have an unauthenticated user
         if self.resource.currentPrincipal(self.request) != davxml.Principal(davxml.Unauthenticated()):

Modified: CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/ischedule/xml.py
===================================================================
--- CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/ischedule/xml.py	2012-10-03 09:50:32 UTC (rev 9889)
+++ CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/ischedule/xml.py	2012-10-03 09:52:28 UTC (rev 9890)
@@ -18,8 +18,10 @@
 This module provides XML definitions for use with Timezone Standard Service.
 """
 
+from twistedcaldav.config import config
+from twistedcaldav.ical import Component as iComponent
+from txdav.xml.element import PCDATAElement, WebDAVElement, WebDAVEmptyElement, WebDAVTextElement
 from txdav.xml.element import registerElement
-from txdav.xml.element import WebDAVElement, WebDAVEmptyElement, WebDAVTextElement
 
 
 ##
@@ -248,7 +250,22 @@
     name = "calendar-data"
 
 
+    @classmethod
+    def fromCalendar(clazz, calendar):
+        if isinstance(calendar, str):
+            if not calendar:
+                raise ValueError("Missing calendar data")
+            return clazz(PCDATAElement(calendar))
+        elif isinstance(calendar, iComponent):
+            assert calendar.name() == "VCALENDAR", "Not a calendar: %r" % (calendar,)
+            return clazz(PCDATAElement(calendar.getTextWithTimezones(includeTimezones=not config.EnableTimezonesByReference)))
+        else:
+            raise ValueError("Not a calendar: %s" % (calendar,))
 
+    fromTextData = fromCalendar
+
+
+
 @registerElement
 class Error (WebDAVElement):
     namespace = ischedule_namespace

Modified: CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/scheduler.py
===================================================================
--- CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/scheduler.py	2012-10-03 09:50:32 UTC (rev 9889)
+++ CalendarServer/branches/users/cdaboo/ischedule-dkim/twistedcaldav/scheduling/scheduler.py	2012-10-03 09:52:28 UTC (rev 9890)
@@ -844,34 +844,26 @@
 
     def errorForFailure(self, failure):
         if failure.check(HTTPError) and isinstance(failure.value.response, ErrorResponse):
-            return self.error_element.Error(failure.value.response.error)
+            return self.error_element(failure.value.response.error)
         else:
             return None
 
 
-    def clone(self, clone):
+    def clone(self, recipient, request_status, calendar_data, error, desc):
         """
-        Add a response cloned from an existing caldavxml.Response element.
+        Add a response cloned from existing data.
         @param clone: the response to clone.
         """
-        if not isinstance(clone, caldavxml.Response):
-            raise AssertionError("Incorrect element type: %r" % (clone,))
 
-        recipient = clone.childOfType(self.recipient_element)
-        request_status = clone.childOfType(self.request_status_element)
-        calendar_data = clone.childOfType(self.calendar_data_element)
-        error = clone.childOfType(self.error_element)
-        desc = clone.childOfType(self.response_description_element)
-
         children = []
-        children.append(recipient)
-        children.append(request_status)
+        children.append(self.recipient_element(davxml.HRef.fromString(recipient)) if self.recipient_uses_href else self.recipient_element.fromString(recipient))
+        children.append(self.request_status_element.fromString(request_status))
         if calendar_data is not None:
-            children.append(calendar_data)
+            children.append(self.calendar_data_element.fromCalendar(calendar_data))
         if error is not None:
-            children.append(error)
+            children.append(self.error_element(*error))
         if desc is not None:
-            children.append(desc)
+            children.append(self.response_description_element.fromString(desc))
         self.responses.append(self.response_element(*children))
 
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20121003/417e8d93/attachment-0001.html>


More information about the calendarserver-changes mailing list