[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