[CalendarServer-changes] [7188] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Sat Mar 12 20:33:14 PST 2011


Revision: 7188
          http://trac.macosforge.org/projects/calendarserver/changeset/7188
Author:   cdaboo at apple.com
Date:     2011-03-12 20:33:13 -0800 (Sat, 12 Mar 2011)
Log Message:
-----------
Add error descriptions to all ErrorResponses.

Modified Paths:
--------------
    CalendarServer/trunk/twext/web2/dav/http.py
    CalendarServer/trunk/twistedcaldav/dropbox.py
    CalendarServer/trunk/twistedcaldav/freebusyurl.py
    CalendarServer/trunk/twistedcaldav/method/copymove.py
    CalendarServer/trunk/twistedcaldav/method/copymove_contact.py
    CalendarServer/trunk/twistedcaldav/method/get.py
    CalendarServer/trunk/twistedcaldav/method/mkcalendar.py
    CalendarServer/trunk/twistedcaldav/method/mkcol.py
    CalendarServer/trunk/twistedcaldav/method/post.py
    CalendarServer/trunk/twistedcaldav/method/put.py
    CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py
    CalendarServer/trunk/twistedcaldav/method/put_common.py
    CalendarServer/trunk/twistedcaldav/method/report.py
    CalendarServer/trunk/twistedcaldav/method/report_addressbook_query.py
    CalendarServer/trunk/twistedcaldav/method/report_calendar_query.py
    CalendarServer/trunk/twistedcaldav/method/report_freebusy.py
    CalendarServer/trunk/twistedcaldav/method/report_multiget_common.py
    CalendarServer/trunk/twistedcaldav/method/report_sync_collection.py
    CalendarServer/trunk/twistedcaldav/resource.py
    CalendarServer/trunk/twistedcaldav/schedule.py
    CalendarServer/trunk/twistedcaldav/scheduling/caldav.py
    CalendarServer/trunk/twistedcaldav/scheduling/imip.py
    CalendarServer/trunk/twistedcaldav/scheduling/implicit.py
    CalendarServer/trunk/twistedcaldav/scheduling/ischedule.py
    CalendarServer/trunk/twistedcaldav/scheduling/scheduler.py
    CalendarServer/trunk/twistedcaldav/sharing.py
    CalendarServer/trunk/twistedcaldav/storebridge.py
    CalendarServer/trunk/twistedcaldav/timezoneservice.py

Modified: CalendarServer/trunk/twext/web2/dav/http.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/http.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twext/web2/dav/http.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -79,8 +79,9 @@
             error.namespace = xml_namespace
             error.name = xml_name
 
-        if description:
-            output = davxml.Error(error, davxml.ErrorDescription(description)).toxml()
+        self.description = description
+        if self.description:
+            output = davxml.Error(error, davxml.ErrorDescription(self.description)).toxml()
         else:
             output = davxml.Error(error).toxml()
 
@@ -337,7 +338,7 @@
 def messageForFailure(failure):
     if failure.check(HTTPError):
         if isinstance(failure.value.response, ErrorResponse):
-            return None
-        if isinstance(failure.value.response, StatusResponse):
             return failure.value.response.description
+        elif isinstance(failure.value.response, StatusResponse):
+            return failure.value.response.description
     return str(failure)

Modified: CalendarServer/trunk/twistedcaldav/dropbox.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/dropbox.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/dropbox.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -119,5 +119,6 @@
     def http_PUT(self, request):
         return ErrorResponse(
             responsecode.FORBIDDEN,
-            (calendarserver_namespace, "valid-drop-box")
+            (calendarserver_namespace, "valid-drop-box"),
+            "Cannot store resources in dropbox",
         )

Modified: CalendarServer/trunk/twistedcaldav/freebusyurl.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/freebusyurl.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/freebusyurl.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -162,7 +162,8 @@
         if self.token or self.user:
             raise HTTPError(ErrorResponse(
                 responsecode.NOT_ACCEPTABLE,
-                (calendarserver_namespace, "supported-query-parameter")
+                (calendarserver_namespace, "supported-query-parameter"),
+                "Invalid query parameter",
             ))
         
         # Check format
@@ -171,7 +172,8 @@
             if self.format not in ("text/calendar", "text/plain"):
                 raise HTTPError(ErrorResponse(
                     responsecode.NOT_ACCEPTABLE,
-                    (calendarserver_namespace, "supported-format")
+                    (calendarserver_namespace, "supported-format"),
+                    "Invalid return format requested",
                 ))
         else:
             self.format = "text/calendar"
@@ -191,7 +193,8 @@
         except ValueError:
             raise HTTPError(ErrorResponse(
                 responsecode.BAD_REQUEST,
-                (calendarserver_namespace, "valid-query-parameters")
+                (calendarserver_namespace, "valid-query-parameters"),
+                "Invalid query parameters",
             ))
         
         # Sanity check start/end/duration
@@ -200,14 +203,16 @@
         if self.end and self.duration:
             raise HTTPError(ErrorResponse(
                 responsecode.NOT_ACCEPTABLE,
-                (calendarserver_namespace, "valid-query-parameters")
+                (calendarserver_namespace, "valid-query-parameters"),
+                "Invalid query parameters",
             ))
         
         # Duration must be positive
         if self.duration and self.duration.days < 0:
             raise HTTPError(ErrorResponse(
                 responsecode.BAD_REQUEST,
-                (calendarserver_namespace, "valid-query-parameters")
+                (calendarserver_namespace, "valid-query-parameters"),
+                "Invalid query parameters",
             ))
         
         # Now fill in the missing pieces
@@ -223,7 +228,8 @@
         if self.end <= self.start:
             raise HTTPError(ErrorResponse(
                 responsecode.BAD_REQUEST,
-                (calendarserver_namespace, "valid-query-parameters")
+                (calendarserver_namespace, "valid-query-parameters"),
+                "Invalid query parameters",
             ))
         
         # TODO: We should probably verify that the actual time-range is within sensible bounds (e.g. not too far in the past or future and not too long)

Modified: CalendarServer/trunk/twistedcaldav/method/copymove.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/copymove.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/copymove.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -90,7 +90,8 @@
         log.err("Attempt to copy a calendar collection into another calendar collection %s" % destination)
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            (caldav_namespace, "calendar-collection-location-ok")
+            (caldav_namespace, "calendar-collection-location-ok"),
+            "Cannot copy calendar collection inside another calendar collection",
         ))
 
     # We also do not allow regular collections in calendar collections
@@ -173,7 +174,8 @@
             log.err("Attempt to move a calendar collection into another calendar collection %s" % destination)
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "calendar-collection-location-ok")
+                (caldav_namespace, "calendar-collection-location-ok"),
+                "Cannot move calendar collection inside another calendar collection",
             ))
     
         # We also do not allow regular collections in calendar collections

Modified: CalendarServer/trunk/twistedcaldav/method/copymove_contact.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/copymove_contact.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/copymove_contact.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -83,7 +83,8 @@
         log.err("Attempt to copy an addressbook collection into another addressbook collection %s" % destination)
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            (carddav_namespace, "addressbook-collection-location-ok")
+            (carddav_namespace, "addressbook-collection-location-ok"),
+            "Cannot copy address book collection inside another address book collection",
         ))
 
     # We also do not allow regular collections in addressbook collections
@@ -153,7 +154,8 @@
             log.err("Attempt to move an addressbook collection into another addressbook collection %s" % destination)
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (carddav_namespace, "addressbook-collection-location-ok")
+                (carddav_namespace, "addressbook-collection-location-ok"),
+                "Cannot move address book collection inside another address book collection",
             ))
     
         # We also do not allow regular collections in addressbook collections

Modified: CalendarServer/trunk/twistedcaldav/method/get.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/get.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/get.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -48,7 +48,8 @@
                 if len(action) != 1:
                     raise HTTPError(ErrorResponse(
                         responsecode.BAD_REQUEST,
-                        (calendarserver_namespace, "valid-action")
+                        (calendarserver_namespace, "valid-action"),
+                        "Invalid action parameter: %s" % (action,),
                     ))
                 action = action[0]
                     
@@ -59,7 +60,8 @@
                 if dispatch is None:
                     raise HTTPError(ErrorResponse(
                         responsecode.BAD_REQUEST,
-                        (calendarserver_namespace, "supported-action")
+                        (calendarserver_namespace, "supported-action"),
+                        "Action not supported: %s" % (action,),
                     ))
         
                 response = (yield dispatch(request))

Modified: CalendarServer/trunk/twistedcaldav/method/mkcalendar.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/mkcalendar.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/mkcalendar.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -53,7 +53,8 @@
         log.err("Attempt to create collection where resource exists: %s"  % (self,))
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            (davxml.dav_namespace, "resource-must-be-null")
+            (davxml.dav_namespace, "resource-must-be-null"),
+            "Resource already exists",
         ))
 
     if not parent.isCollection():
@@ -61,7 +62,8 @@
                 % (self,))
         raise HTTPError(ErrorResponse(
             responsecode.CONFLICT,
-            (caldavxml.caldav_namespace, "calendar-collection-location-ok")
+            (caldavxml.caldav_namespace, "calendar-collection-location-ok"),
+            "Cannot create calendar inside another calendar",
         ))
 
     #

Modified: CalendarServer/trunk/twistedcaldav/method/mkcol.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/mkcol.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/mkcol.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -58,7 +58,8 @@
                 % (self,))
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            (davxml.dav_namespace, "resource-must-be-null")
+            (davxml.dav_namespace, "resource-must-be-null"),
+            "Resource already exists",
         ))
 
     if not parent.isCollection():
@@ -66,7 +67,8 @@
                 % (self,))
         raise HTTPError(ErrorResponse(
             responsecode.CONFLICT,
-            (davxml.dav_namespace, "collection-location-ok")
+            (davxml.dav_namespace, "collection-location-ok"),
+            "Cannot create calendar inside another calendar",
         ))
 
     #

Modified: CalendarServer/trunk/twistedcaldav/method/post.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/post.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/post.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -77,7 +77,8 @@
             self.log_error("MIME type %s not allowed in calendar collection" % (content_type,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "supported-calendar-data")
+                (caldav_namespace, "supported-calendar-data"),
+                "Wrong MIME type for calendar collection",
             ))
             
         # Read the calendar component from the stream
@@ -133,7 +134,8 @@
             self.log_error("MIME type %s not allowed in address book collection" % (content_type,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (carddav_namespace, "supported-address-data")
+                (carddav_namespace, "supported-address-data"),
+                "Wrong MIME type for address book collection",
             ))
             
         # Read the calendar component from the stream

Modified: CalendarServer/trunk/twistedcaldav/method/put.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/put.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/put.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -54,7 +54,8 @@
             log.err("MIME type %s not allowed in calendar collection" % (content_type,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "supported-calendar-data")
+                (caldav_namespace, "supported-calendar-data"),
+                "Invalid MIME type for calendar collection",
             ))
             
         # Read the calendar component from the stream
@@ -96,7 +97,8 @@
             log.err("MIME type %s not allowed in address book collection" % (content_type,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (carddav_namespace, "supported-address-data")
+                (carddav_namespace, "supported-address-data"),
+                "Invalid MIME type for address book collection",
             ))
             
         # Read the vcard component from the stream

Modified: CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/put_addressbook_common.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -167,7 +167,8 @@
                 log.err(message)
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    customxml.MaxResources()
+                    customxml.MaxResources(),
+                    message,
                 ))
 
             if not self.sourceadbk:
@@ -178,7 +179,8 @@
                         log.err(message)
                         raise HTTPError(ErrorResponse(
                             responsecode.FORBIDDEN,
-                            (carddav_namespace, "supported-address-data")
+                            (carddav_namespace, "supported-address-data"),
+                            "Invalid content-type",
                         ))
                 
                     # At this point we need the calendar data to do more tests
@@ -192,7 +194,8 @@
                         log.err(str(e))
                         raise HTTPError(ErrorResponse(
                             responsecode.FORBIDDEN,
-                            (carddav_namespace, "valid-address-data")
+                            (carddav_namespace, "valid-address-data"),
+                            "Could not parse vCard",
                         ))
                         
                 # Valid vcard data for CalDAV check
@@ -201,7 +204,8 @@
                     log.err(message)
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (carddav_namespace, "valid-addressbook-object-resource")
+                        (carddav_namespace, "valid-addressbook-object-resource"),
+                        "Invalid vCard data",
                     ))
 
                 # Must have a valid UID at this point
@@ -214,7 +218,8 @@
                     log.err("Source vcard does not have a UID: %s" % self.source.name())
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (carddav_namespace, "valid-addressbook-object-resource")
+                        (carddav_namespace, "valid-addressbook-object-resource"),
+                        "Missing UID in vCard",
                     ))
 
                 # FIXME: We need this here because we have to re-index the destination. Ideally it
@@ -227,7 +232,8 @@
                 log.err(message)
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (carddav_namespace, "max-resource-size")
+                    (carddav_namespace, "max-resource-size"),
+                    "Address data too large",
                 ))
 
             # Check access
@@ -433,7 +439,8 @@
                                     rname.encode("utf-8")
                                 )
                             )
-                        )
+                        ),
+                        "UID already used in another resource",
                     ))
             
             # Do the actual put or copy

Modified: CalendarServer/trunk/twistedcaldav/method/put_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/put_common.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/put_common.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -215,7 +215,8 @@
                 log.err(message)
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    customxml.MaxResources()
+                    customxml.MaxResources(),
+                    "Too many resources in collection",
                 ))
 
             # Valid data sizes - do before parsing the data
@@ -226,7 +227,8 @@
                     log.err(message)
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (caldav_namespace, "max-resource-size")
+                        (caldav_namespace, "max-resource-size"),
+                        "Calendar data too large",
                     ))
             else:
                 # Valid calendar data size check
@@ -235,7 +237,8 @@
                     log.err(message)
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (caldav_namespace, "max-resource-size")
+                        (caldav_namespace, "max-resource-size"),
+                        "Calendar data too large",
                     ))
 
             if not self.sourcecal:
@@ -246,7 +249,8 @@
                         log.err(message)
                         raise HTTPError(ErrorResponse(
                             responsecode.FORBIDDEN,
-                            (caldav_namespace, "supported-calendar-data")
+                            (caldav_namespace, "supported-calendar-data"),
+                            "Invalid content-type for data",
                         ))
                 
                     # At this point we need the calendar data to do more tests
@@ -288,7 +292,8 @@
                     log.err(message)
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (caldav_namespace, "valid-calendar-object-resource")
+                        (caldav_namespace, "valid-calendar-object-resource"),
+                        "Invalid calendar data",
                     ))
 
                 # Valid attendee list size check
@@ -298,7 +303,8 @@
                     raise HTTPError(
                         ErrorResponse(
                             responsecode.FORBIDDEN,
-                            MaxAttendeesPerInstance.fromString(str(config.MaxAttendeesPerInstance))
+                            MaxAttendeesPerInstance.fromString(str(config.MaxAttendeesPerInstance)),
+                            "Too many attendees in calenbdar data",
                         )
                     )
 
@@ -316,7 +322,8 @@
                     log.err("Source calendar does not have a UID: %s" % self.source)
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (caldav_namespace, "valid-calendar-object-resource")
+                        (caldav_namespace, "valid-calendar-object-resource"),
+                        "Missing UID in calendar data",
                     ))
 
                 # FIXME: We need this here because we have to re-index the destination. Ideally it
@@ -526,7 +533,8 @@
             if self.access is None:
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (calendarserver_namespace, "valid-access-restriction")
+                    (calendarserver_namespace, "valid-access-restriction"),
+                    "Private event access level not allowed",
                 ))
                 
             # Only DAV:owner is able to set the property to other than PUBLIC
@@ -537,7 +545,8 @@
                     if davxml.Principal(parent_owner) != authz and self.access != Component.ACCESS_PUBLIC:
                         raise HTTPError(ErrorResponse(
                             responsecode.FORBIDDEN,
-                            (calendarserver_namespace, "valid-access-restriction-change")
+                            (calendarserver_namespace, "valid-access-restriction-change"),
+                            "Private event access level change not allowed",
                         ))
                     
                     return None
@@ -561,11 +570,11 @@
             try:
                 result = self.calendar.truncateRecurrence(config.MaxInstancesForRRULE)
             except (ValueError, TypeError), ex:
-                msg = "Cannot truncate calendar resource: %s" % (ex,)
-                log.err(msg)
+                log.err("Cannot truncate calendar resource: %s" % (ex,))
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "valid-calendar-data"), description=msg
+                    (caldav_namespace, "valid-calendar-data"),
+                   "Cannot truncate recurrences",
                 ))
             if result:
                 self.calendardata = str(self.calendar)
@@ -795,11 +804,11 @@
             try:
                 self.calendar = PerUserDataFilter(accessUID).merge(self.calendar.duplicate(), oldCal)
             except ValueError:
-                msg = "Invalid per-user data merge"
-                log.err(msg)
+                log.err("Invalid per-user data merge")
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "valid-calendar-data"), description=msg
+                    (caldav_namespace, "valid-calendar-data"),
+                    "Cannot merge per-user data",
                 ))
             self.calendardata = None
 
@@ -960,7 +969,8 @@
                                         rname.encode("utf-8")
                                     )
                                 )
-                            )
+                            ),
+                            "UID already exists",
                         ))
 
 
@@ -1047,7 +1057,8 @@
             elif isinstance(err, TooManyInstancesError):
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    NumberOfRecurrencesWithinLimits(PCDATAElement(str(err.max_allowed)))
+                    NumberOfRecurrencesWithinLimits(PCDATAElement(str(err.max_allowed))),
+                    "Too many recurrence instances",
                 ))
             else:
                 # Display the traceback.  Unfortunately this will usually be

Modified: CalendarServer/trunk/twistedcaldav/method/report.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/report.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/report.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -119,7 +119,8 @@
 
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            davxml.SupportedReport()
+            davxml.SupportedReport(),
+            "Report not supported on this resource",
         ))
 
     #

Modified: CalendarServer/trunk/twistedcaldav/method/report_addressbook_query.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/report_addressbook_query.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/report_addressbook_query.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -83,7 +83,8 @@
             log.err(message)
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (carddav_namespace, "supported-address-data")
+                (carddav_namespace, "supported-address-data"),
+                "Invalid address-data",
             ))
         
     else:
@@ -94,7 +95,8 @@
         log.err("Invalid filter element: %r" % (filter,))
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            (carddav_namespace, "valid-filter")
+            (carddav_namespace, "valid-filter"),
+            "Invalid filter element",
         ))
 
     matchcount = [0,]

Modified: CalendarServer/trunk/twistedcaldav/method/report_calendar_query.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/report_calendar_query.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/report_calendar_query.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -76,7 +76,8 @@
         log.err(msg)
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            (caldav_namespace, "valid-calendar-data"), description=msg
+            (caldav_namespace, "valid-calendar-data"),
+            "Invalid calendar-data",
         ))
     if query_tz:
         filter.settimezone(query_tz)
@@ -99,7 +100,8 @@
             log.err(message)
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "supported-calendar-data")
+                (caldav_namespace, "supported-calendar-data"),
+                "Invalid calendar-data",
             ))
         
     else:
@@ -110,7 +112,8 @@
         log.err("Invalid filter element: %r" % (xmlfilter,))
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            (caldav_namespace, "valid-filter")
+            (caldav_namespace, "valid-filter"),
+            "Invalid filter element",
         ))
 
     matchcount = [0]
@@ -241,13 +244,15 @@
         log.err("Too many instances need to be computed in calendar-query report")
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            NumberOfRecurrencesWithinLimits(PCDATAElement(str(ex.max_allowed)))
+            NumberOfRecurrencesWithinLimits(PCDATAElement(str(ex.max_allowed))),
+            "Too many instrances",
         ))
     except NumberOfMatchesWithinLimits:
         log.err("Too many matching components in calendar-query report")
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            davxml.NumberOfMatchesWithinLimits()
+            davxml.NumberOfMatchesWithinLimits(),
+            "Too many components",
         ))
     
     if not hasattr(request, "extendedLogItems"):

Modified: CalendarServer/trunk/twistedcaldav/method/report_freebusy.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/report_freebusy.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/report_freebusy.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -80,7 +80,11 @@
         yield report_common.applyToCalendarCollections(self, request, request.uri, depth, generateFreeBusyInfo, (caldavxml.ReadFreeBusy(),))
     except NumberOfMatchesWithinLimits:
         log.err("Too many matching components in free-busy report")
-        raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, davxml.NumberOfMatchesWithinLimits()))
+        raise HTTPError(ErrorResponse(
+            responsecode.FORBIDDEN,
+            davxml.NumberOfMatchesWithinLimits(),
+            "Too many components"
+        ))
     
     # Now build a new calendar object with the free busy info we have
     fbcalendar = report_common.buildFreeBusyResult(fbinfo, timerange)

Modified: CalendarServer/trunk/twistedcaldav/method/report_multiget_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/report_multiget_common.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/report_multiget_common.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -94,14 +94,22 @@
             result = True
         if not result:
             log.err(message)
-            raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, precondition))
+            raise HTTPError(ErrorResponse(
+                responsecode.FORBIDDEN,
+                precondition,
+                "Invalid object data element",
+            ))
     else:
         raise AssertionError("We shouldn't be here")
 
     # Check size of results is within limit when data property requested
     if hasData and len(resources) > config.MaxMultigetWithDataHrefs:
         log.err("Too many results in multiget report returning data: %d" % len(resources))
-        raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, davxml.NumberOfMatchesWithinLimits()))
+        raise HTTPError(ErrorResponse(
+            responsecode.FORBIDDEN,
+            davxml.NumberOfMatchesWithinLimits(),
+            "Too many resources",
+        ))
 
     """
     Three possibilities exist:
@@ -259,14 +267,22 @@
                     directoryAddressBookLock, limited = (yield  self.directory.cacheVCardsForAddressBookQuery(addressBookFilter, propertyreq, limit) )
                     if limited:
                         log.err("Too many results in multiget report: %d" % len(resources))
-                        raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (dav_namespace, "number-of-matches-within-limits")))
+                        raise HTTPError(ErrorResponse(
+                            responsecode.FORBIDDEN,
+                            (dav_namespace, "number-of-matches-within-limits"),
+                            "Too many results",
+                        ))
                 else:
                     #get vCards and filter
                     limit = config.DirectoryAddressBook.MaxQueryResults
                     vCardRecords, limited = (yield self.directory.vCardRecordsForAddressBookQuery( addressBookFilter, propertyreq, limit ))
                     if limited:
                         log.err("Too many results in multiget report: %d" % len(resources))
-                        raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (dav_namespace, "number-of-matches-within-limits")))
+                        raise HTTPError(ErrorResponse(
+                            responsecode.FORBIDDEN,
+                            (dav_namespace, "number-of-matches-within-limits"),
+                            "Too many results",
+                        ))
                    
                     for href in valid_hrefs:
                         matchingRecord = None

Modified: CalendarServer/trunk/twistedcaldav/method/report_sync_collection.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/report_sync_collection.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/method/report_sync_collection.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -53,7 +53,8 @@
         log.err("sync-collection report is only allowed on calendar/inbox/addressbook/notification collection resources %s" % (self,))
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            davxml.SupportedReport()
+            davxml.SupportedReport(),
+            "Report not supported on this resource",
         ))
    
     responses = []

Modified: CalendarServer/trunk/twistedcaldav/resource.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/resource.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/resource.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -130,7 +130,8 @@
     def http_MKCALENDAR(self, request):
         return ErrorResponse(
             responsecode.FORBIDDEN,
-            (caldav_namespace, "calendar-collection-location-ok")
+            (caldav_namespace, "calendar-collection-location-ok"),
+            "Resource is read-only",
         )
 
 class ReadOnlyNoCopyResourceMixIn (ReadOnlyResourceMixIn):
@@ -1346,7 +1347,8 @@
             except ValueError:
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (dav_namespace, "valid-sync-token")
+                    (dav_namespace, "valid-sync-token"),
+                    "Sync token is invalid",
                 ))
         else:
             revision = 0
@@ -1356,7 +1358,8 @@
         except SyncTokenValidException:
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (dav_namespace, "valid-sync-token")
+                (dav_namespace, "valid-sync-token"),
+                "Sync token not recognized",
             ))
 
         returnValue((changed, removed, notallowed, current_token))
@@ -1454,7 +1457,8 @@
             self.log_error("Cannot create a calendar collection within a calendar collection %s" % (parent,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldavxml.caldav_namespace, "calendar-collection-location-ok")
+                (caldavxml.caldav_namespace, "calendar-collection-location-ok"),
+                "Cannot create a calendar collection inside another calendar collection",
             ))
 
         # Check for any quota limits
@@ -1464,7 +1468,8 @@
                 self.log_error("Cannot create a calendar collection because there are too many already present in %s" % (parent,))
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    customxml.MaxCollections()
+                    customxml.MaxCollections(),
+                    "Too many calendar collections",
                 ))
                 
         returnValue((yield self.createCalendarCollection()))
@@ -1547,7 +1552,8 @@
             self.log_error("Cannot create an address book collection within an address book collection %s" % (parent,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (carddavxml.carddav_namespace, "addressbook-collection-location-ok")
+                (carddavxml.carddav_namespace, "addressbook-collection-location-ok"),
+                "Cannot create an address book collection inside of an address book collection",
             ))
 
         # Check for any quota limits
@@ -1557,7 +1563,8 @@
                 self.log_error("Cannot create a calendar collection because there are too many already present in %s" % (parent,))
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    customxml.MaxCollections()
+                    customxml.MaxCollections(),
+                    "Too many address book collections",
                 ))
                 
         returnValue((yield self.createAddressBookCollection()))

Modified: CalendarServer/trunk/twistedcaldav/schedule.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/schedule.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/schedule.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -210,7 +210,8 @@
                     # Validate that href's point to a valid calendar.
                     raise HTTPError(ErrorResponse(
                         responsecode.CONFLICT,
-                        (caldav_namespace, "valid-calendar-url")
+                        (caldav_namespace, "valid-calendar-url"),
+                        "Invalid URI",
                     ))
 
         elif property.qname() == (caldav_namespace, "schedule-default-calendar-URL"):
@@ -226,7 +227,8 @@
                 # Validate that href's point to a valid calendar.
                 raise HTTPError(ErrorResponse(
                     responsecode.CONFLICT,
-                    (caldav_namespace, "valid-schedule-default-calendar-URL")
+                    (caldav_namespace, "valid-schedule-default-calendar-URL"),
+                    "Invalid URI",
                 ))
             else:
                 # Canonicalize the URL to __uids__ form

Modified: CalendarServer/trunk/twistedcaldav/scheduling/caldav.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/caldav.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/scheduling/caldav.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -114,7 +114,8 @@
                     log.err("Could not access Inbox for recipient: %s" % (recipient.cuaddr,))
                     err = HTTPError(ErrorResponse(
                         responsecode.NOT_FOUND,
-                        (caldav_namespace, "recipient-permissions")
+                        (caldav_namespace, "recipient-permissions"),
+                        "Access to inbox denied",
                     ))
                     self.responses.add(
                         recipient.cuaddr,
@@ -159,7 +160,8 @@
             log.err("Could not store data in Inbox : %s" % (recipient.inbox,))
             err = HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "recipient-permissions")
+                (caldav_namespace, "recipient-permissions"),
+                "Could not store data in inbox",
             ))
             responses.add(recipient.cuaddr, Failure(exc_value=err), reqstatus=e.msg)
             returnValue(False)
@@ -190,7 +192,8 @@
                 log.err("Could not store data in Inbox : %s" % (recipient.inbox,))
                 err = HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "recipient-permissions")
+                    (caldav_namespace, "recipient-permissions"),
+                    "Could not store data in inbox",
                 ))
                 responses.add(recipient.cuaddr, Failure(exc_value=err), reqstatus=iTIPRequestStatus.NO_AUTHORITY)
                 returnValue(False)
@@ -231,7 +234,8 @@
             log.err("Could not determine free busy information: %s" % (recipient.cuaddr,))
             err = HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "recipient-permissions")
+                (caldav_namespace, "recipient-permissions"),
+                "Could not determine free busy information",
             ))
             responses.add(
                 recipient.cuaddr,

Modified: CalendarServer/trunk/twistedcaldav/scheduling/imip.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/imip.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/scheduling/imip.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -68,7 +68,8 @@
                 for recipient in self.recipients:
                     err = HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (caldav_namespace, "recipient-failed")
+                        (caldav_namespace, "recipient-failed"),
+                        "iMIP method not allowed: %s" % (method,),
                     ))
                     self.responses.add(
                         recipient.cuaddr,
@@ -95,7 +96,8 @@
                     log.err("Could not do server-to-imip request : %s %s" % (self, e))
                     err = HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (caldav_namespace, "recipient-failed")
+                        (caldav_namespace, "recipient-failed"),
+                        "iMIP request failed",
                     ))
                     self.responses.add(
                         recipient.cuaddr,
@@ -116,7 +118,8 @@
             for recipient in self.recipients:
                 err = HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "recipient-failed")
+                    (caldav_namespace, "recipient-failed"),
+                    "iMIP request failed",
                 ))
                 self.responses.add(
                     recipient.cuaddr,

Modified: CalendarServer/trunk/twistedcaldav/scheduling/implicit.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/implicit.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/scheduling/implicit.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -96,7 +96,8 @@
         ):
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "valid-attendee-change")
+                (caldav_namespace, "valid-attendee-change"),
+                "Cannot change scheduling object mode",
             ))
 
         returnValue((self.action != "none", new_type == "schedule",))
@@ -120,7 +121,8 @@
                 log.debug("Implicit - cannot MOVE with a scheduling object resource")
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "unique-scheduling-object-resource")
+                    (caldav_namespace, "unique-scheduling-object-resource"),
+                    "Cannot MOVE a scheduling object resource",
                 ))
             else:
                 self.action = "none"
@@ -153,7 +155,8 @@
                 log.debug("Implicit - cannot COPY with a scheduling object resource")
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "unique-scheduling-object-resource")
+                    (caldav_namespace, "unique-scheduling-object-resource"),
+                    "Cannot COPY with a scheduling object resource",
                 ))
             else:
                 self.action = "none"
@@ -330,7 +333,8 @@
                 log.error("Originator '%s' is not enabled for calendaring" % (self.originatorPrincipal,))
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "invalid-originator")
+                    (caldav_namespace, "invalid-originator"),
+                    "Originator not enabled",
                 ))
     
             # Pick the first mailto cu address or the first other type
@@ -349,7 +353,8 @@
             log.error("Only one ORGANIZER is allowed in an iCalendar object:\n%s" % (self.calendar,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "single-organizer")
+                (caldav_namespace, "single-organizer"),
+                "Only one organizer allowed in scheduling object resource",
             ))
         
         # Get the ATTENDEEs
@@ -382,7 +387,8 @@
             log.debug("Implicit - found component with same UID in a different collection: %s" % (check_uri,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "unique-scheduling-object-resource")
+                (caldav_namespace, "unique-scheduling-object-resource"),
+                "Cannot duplicate scheduling object resource",
             ))
 
     @inlineCallbacks
@@ -557,7 +563,8 @@
                     log.error("Cannot change ORGANIZER: UID:%s" % (self.uid,))
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (caldav_namespace, "valid-organizer-change")
+                        (caldav_namespace, "valid-organizer-change"),
+                        "Organizer cannot be changed",
                     ))
         else:
             # Special case of SCHEDULE-FORCE-SEND added to attendees and no other change
@@ -789,7 +796,8 @@
                     log.error("Cannot change ORGANIZER: UID:%s" % (self.uid,))
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (caldav_namespace, "valid-attendee-change")
+                        (caldav_namespace, "valid-attendee-change"),
+                        "Cannot change organizer",
                     ))
             else:
                 self.oldcalendar = None
@@ -803,7 +811,8 @@
                     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")
+                        (caldav_namespace, "valid-attendee-change"),
+                        "Cannot alter organizer",
                     ))
 
                 # Determine whether the current change is allowed
@@ -820,7 +829,8 @@
                         log.error("Attendee '%s' is not allowed to make an unauthorized change to an organized event: UID:%s" % (self.attendeePrincipal, self.uid,))
                         raise HTTPError(ErrorResponse(
                             responsecode.FORBIDDEN,
-                            (caldav_namespace, "valid-attendee-change")
+                            (caldav_namespace, "valid-attendee-change"),
+                            "Attendee changes are not allowed",
                         ))
 
                 if not doITipReply:
@@ -844,7 +854,8 @@
                                 log.error("Attendee '%s' is not allowed to set SCHEDULE-AGENT=SERVER on organizer: UID:%s" % (self.attendeePrincipal, self.uid,))
                                 raise HTTPError(ErrorResponse(
                                     responsecode.FORBIDDEN,
-                                    (caldav_namespace, "valid-attendee-change")
+                                    (caldav_namespace, "valid-attendee-change"),
+                                    "Attendee cannot change organizer state",
                                 ))
 
                         log.debug("Attendee '%s' is not allowed to update UID: '%s' - missing organizer copy - removing entire event" % (self.attendee, self.uid,))

Modified: CalendarServer/trunk/twistedcaldav/scheduling/ischedule.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/ischedule.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/scheduling/ischedule.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -92,7 +92,8 @@
                 # Cannot do server-to-server for this recipient.
                 err = HTTPError(ErrorResponse(
                     responsecode.NOT_FOUND,
-                    (caldav_namespace, "recipient-allowed")
+                    (caldav_namespace, "recipient-allowed"),
+                    "No server for recipient",
                 ))
                 self.responses.add(recipient.cuaddr, Failure(exc_value=err), reqstatus=iTIPRequestStatus.NO_USER_SUPPORT)
             
@@ -103,7 +104,8 @@
                 # Cannot do server-to-server outgoing requests for this server.
                 err = HTTPError(ErrorResponse(
                     responsecode.NOT_FOUND,
-                    (caldav_namespace, "recipient-allowed")
+                    (caldav_namespace, "recipient-allowed"),
+                    "Cannot send to recipient's server",
                 ))
                 self.responses.add(recipient.cuaddr, Failure(exc_value=err), reqstatus=iTIPRequestStatus.SERVICE_UNAVAILABLE)
             
@@ -177,7 +179,8 @@
             for recipient in self.recipients:
                 err = HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "recipient-failed")
+                    (caldav_namespace, "recipient-failed"),
+                    "Server-to-server request failed",
                 ))
                 self.responses.add(recipient.cuaddr, Failure(exc_value=err), reqstatus=iTIPRequestStatus.SERVICE_UNAVAILABLE)
 

Modified: CalendarServer/trunk/twistedcaldav/scheduling/scheduler.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/scheduling/scheduler.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/scheduling/scheduler.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -183,7 +183,8 @@
             log.err("%s request must have Originator" % (self.method,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "originator-specified")
+                (caldav_namespace, "originator-specified"),
+                "Missing originator",
             ))
         else:
             self.originator = originator
@@ -202,7 +203,8 @@
             log.err("%s request must have at least one Recipient" % (self.method,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "recipient-specified")
+                (caldav_namespace, "recipient-specified"),
+                "Must have recipients",
             ))
         else:
             self.recipients = list(attendees)
@@ -221,7 +223,8 @@
             log.err("%s request must have Originator header" % (self.method,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "originator-specified")
+                (caldav_namespace, "originator-specified"),
+                "Missing originator",
             ))
         else:
             self.originator = originator[0]
@@ -233,7 +236,8 @@
             log.err("%s request must have at least one Recipient header" % (self.method,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "recipient-specified")
+                (caldav_namespace, "recipient-specified"),
+                "No recipients",
             ))
     
         # Recipient header may be comma separated list
@@ -252,7 +256,8 @@
             log.err("MIME type %s not allowed in calendar collection" % (contentType,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "supported-calendar-data")
+                (caldav_namespace, "supported-calendar-data"),
+                "Data is not calendar data",
             ))
     
         # Parse the calendar object from the HTTP request stream
@@ -321,7 +326,8 @@
             log.err("X-CALENDARSERVER-ACCESS not allowed in a calendar component %s request: %s" % (self.method, self.calendar,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (calendarserver_namespace, "no-access-restrictions")
+                (calendarserver_namespace, "no-access-restrictions"),
+                "Private events cannot be scheduled",
             ))
     
         # Determine iTIP method mode
@@ -339,7 +345,8 @@
                 log.err("Wrong number of ATTENDEEs in calendar data: %s" % (self.calendardata,))
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "attendee-allowed")
+                    (caldav_namespace, "attendee-allowed"),
+                    "Wrong number of attendees",
                 ))
             self.attendee = attendees[0]
 
@@ -361,7 +368,8 @@
                     log.err("iTIP data is not valid for a VFREEBUSY request: %s" % (self.calendar,))
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (caldav_namespace, "valid-calendar-data"), description="iTIP data is not valid for a VFREEBUSY request"
+                        (caldav_namespace, "valid-calendar-data"),
+                        "iTIP data is not valid for a VFREEBUSY request",
                     ))
                 dtstart = vfreebusies[0].getStartDateUTC()
                 dtend = vfreebusies[0].getEndDateUTC()
@@ -370,7 +378,7 @@
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
                         (caldav_namespace, "valid-calendar-data"),
-                        description="VFREEBUSY start/end not valid"
+                        "VFREEBUSY start/end not valid",
                     ))
 
                 # Some clients send floating instead of UTC - coerce to UTC
@@ -379,7 +387,7 @@
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
                         (caldav_namespace, "valid-calendar-data"),
-                        description="VFREEBUSY start or end not UTC"
+                        "VFREEBUSY start or end not UTC",
                     ))
 
                 self.timeRange = caldavxml.TimeRange(start=iCalendarString(dtstart), end=iCalendarString(dtend))
@@ -452,7 +460,8 @@
             if freebusy and config.Scheduling.Options.LimitFreeBusyAttendees and ctr >= config.Scheduling.Options.LimitFreeBusyAttendees:
                 err = HTTPError(ErrorResponse(
                     responsecode.NOT_FOUND,
-                    (caldav_namespace, "recipient-limit")
+                    (caldav_namespace, "recipient-limit"),
+                    "Too many attendees",
                 ))
                 responses.add(recipient.cuaddr, Failure(exc_value=err), reqstatus=iTIPRequestStatus.SERVICE_UNAVAILABLE)
                 continue
@@ -475,7 +484,8 @@
             else:
                 err = HTTPError(ErrorResponse(
                     responsecode.NOT_FOUND,
-                    (caldav_namespace, "recipient-exists")
+                    (caldav_namespace, "recipient-exists"),
+                    "Unknown recipient",
                 ))
                 responses.add(recipient.cuaddr, Failure(exc_value=err), reqstatus=iTIPRequestStatus.INVALID_CALENDAR_USER)
 
@@ -547,7 +557,8 @@
             log.err("Unauthenticated originators not allowed: %s" % (self.originator,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "originator-allowed")
+                (caldav_namespace, "originator-allowed"),
+                "Invalid originator",
             ))
 
     def checkOriginator(self):
@@ -562,7 +573,8 @@
             log.err("Could not find principal for originator: %s" % (self.originator,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "originator-allowed")
+                (caldav_namespace, "originator-allowed"),
+                "No principal for originator",
             ))
         else:
             # Must have a valid Inbox.
@@ -571,7 +583,8 @@
                 log.err("Could not find inbox for originator: %s" % (self.originator,))
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "originator-allowed")
+                    (caldav_namespace, "originator-allowed"),
+                    "Originator cannot be scheduled",
                 ))
 
             self.originator = LocalCalendarUser(self.originator, originatorPrincipal)
@@ -628,7 +641,8 @@
                         log.err("ORGANIZER not allowed to be an Organizer: %s" % (self.calendar,))
                         raise HTTPError(ErrorResponse(
                             responsecode.FORBIDDEN,
-                            (caldav_namespace, "organizer-allowed")
+                            (caldav_namespace, "organizer-allowed"),
+                            "Organizer cannot schedule",
                         ))
 
                     self.organizer = LocalCalendarUser(organizer, organizerPrincipal)
@@ -636,7 +650,8 @@
                     log.err("No outbox for ORGANIZER in calendar data: %s" % (self.calendar,))
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (caldav_namespace, "organizer-allowed")
+                        (caldav_namespace, "organizer-allowed"),
+                        "Organizer cannot schedule",
                     ))
             else:
                 localUser = (yield addressmapping.mapper.isCalendarUserInMyDomain(organizer))
@@ -644,7 +659,8 @@
                     log.err("No principal for ORGANIZER in calendar data: %s" % (self.calendar,))
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (caldav_namespace, "organizer-allowed")
+                        (caldav_namespace, "organizer-allowed"),
+                        "No principal for organizer",
                     ))
                 else:
                     self.organizer = RemoteCalendarUser(organizer) 
@@ -652,7 +668,8 @@
             log.err("ORGANIZER missing in calendar data: %s" % (self.calendar,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "organizer-allowed")
+                (caldav_namespace, "organizer-allowed"),
+                "Missing organizer",
             ))
 
     def checkOrganizerAsOriginator(self):
@@ -662,7 +679,8 @@
             log.err("ORGANIZER is not local to server in calendar data: %s" % (self.calendar,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "organizer-allowed")
+                (caldav_namespace, "organizer-allowed"),
+                "Organizer is not local to server",
             ))
 
         # Make sure that the ORGANIZER's Outbox is the request URI
@@ -670,7 +688,8 @@
             log.err("Wrong outbox for ORGANIZER in calendar data: %s" % (self.calendar,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "organizer-allowed")
+                (caldav_namespace, "organizer-allowed"),
+                "Outbox does not belong to organizer",
             ))
 
     def checkAttendeeAsOriginator(self):
@@ -686,13 +705,15 @@
                 log.err("ATTENDEE in calendar data does not match owner of Outbox: %s" % (self.calendar,))
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "attendee-allowed")
+                    (caldav_namespace, "attendee-allowed"),
+                    "Outbox does not belong to attendee",
                 ))
         else:
             log.err("Unknown ATTENDEE in calendar data: %s" % (self.calendar,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "attendee-allowed")
+                (caldav_namespace, "attendee-allowed"),
+                "No principal for attendee",
             ))
     
     def securityChecks(self):
@@ -793,7 +814,8 @@
             log.err("Authenticated originators not allowed: %s" % (self.originator,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "originator-allowed")
+                (caldav_namespace, "originator-allowed"),
+                "Authentication not allowed",
             ))
 
     @inlineCallbacks
@@ -810,7 +832,8 @@
                 log.err("Cannot use originator that is on this server: %s" % (self.originator,))
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "originator-allowed")
+                    (caldav_namespace, "originator-allowed"),
+                    "Originator cannot be local to server",
                 ))
             else:
                 self.originator = PartitionedCalendarUser(self.originator, originatorPrincipal)
@@ -831,7 +854,8 @@
             log.err("Originator not on recognized server: %s" % (self.originator,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "originator-allowed")
+                (caldav_namespace, "originator-allowed"),
+                "Originator not recognized by server",
             ))
         else:
             # Get the request IP and map to hostname.
@@ -870,7 +894,8 @@
                 log.err("Originator not on allowed server: %s" % (self.originator,))
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "originator-allowed")
+                    (caldav_namespace, "originator-allowed"),
+                    "Originator not allowed to send to this server",
                 ))
 
     def _validPartitionServer(self, principal):
@@ -905,7 +930,8 @@
             log.err("Originator not on allowed server: %s" % (self.originator,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "originator-allowed")
+                (caldav_namespace, "originator-allowed"),
+                "Originator not allowed to send to this server",
             ))
 
     @inlineCallbacks
@@ -923,7 +949,8 @@
                     log.err("Invalid ORGANIZER in calendar data: %s" % (self.calendar,))
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (caldav_namespace, "organizer-allowed")
+                        (caldav_namespace, "organizer-allowed"),
+                        "Organizer is not local to server",
                     ))
                 else:
                     # Check that the origin server is the correct partition
@@ -935,7 +962,8 @@
                     log.err("Unsupported ORGANIZER in calendar data: %s" % (self.calendar,))
                     raise HTTPError(ErrorResponse(
                         responsecode.FORBIDDEN,
-                        (caldav_namespace, "organizer-allowed")
+                        (caldav_namespace, "organizer-allowed"),
+                        "Organizer not allowed to be originator",
                     ))
                 else:
                     self.organizer = RemoteCalendarUser(organizer)
@@ -943,7 +971,8 @@
             log.err("ORGANIZER missing in calendar data: %s" % (self.calendar,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "organizer-allowed")
+                (caldav_namespace, "organizer-allowed"),
+                "No organizer in calendar data",
             ))
 
     @inlineCallbacks
@@ -960,7 +989,8 @@
                 log.err("Invalid ATTENDEE in calendar data: %s" % (self.calendar,))
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "attendee-allowed")
+                    (caldav_namespace, "attendee-allowed"),
+                    "Local attendee cannot send to this server",
                 ))
             else:
                 self._validPartitionServer(attendeePrincipal)                
@@ -970,7 +1000,8 @@
                 log.err("Unknown ATTENDEE in calendar data: %s" % (self.calendar,))
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (caldav_namespace, "attendee-allowed")
+                    (caldav_namespace, "attendee-allowed"),
+                    "Attendee not allowed to schedule",
                 ))
     
         # TODO: in this case we should check that the ORGANIZER is the sole recipient.
@@ -990,11 +1021,11 @@
             yield self.checkAttendeeAsOriginator()
             
         else:
-            msg = "Unknown iTIP METHOD for security checks: %s" % (self.calendar.propertyValue("METHOD"),)
-            log.err(msg)
+            log.err("Unknown iTIP METHOD for security checks: %s" % (self.calendar.propertyValue("METHOD"),))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "valid-calendar-data"), description=msg
+                (caldav_namespace, "valid-calendar-data"),
+                "Unknown iTIP method",
             ))
 
 
@@ -1042,7 +1073,8 @@
             log.err("Cannot use originator that is on this server: %s" % (self.originator,))
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "originator-allowed")
+                (caldav_namespace, "originator-allowed"),
+                "Originator cannot be local to server",
             ))
         else:
             self.originator = RemoteCalendarUser(self.originator)
@@ -1069,7 +1101,8 @@
             # TODO: verify this is the right response:
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
-                (caldav_namespace, "originator-allowed")
+                (caldav_namespace, "originator-allowed"),
+                "Originator server not allowed to send to this server",
             ))
 
 

Modified: CalendarServer/trunk/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/sharing.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/sharing.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -735,7 +735,8 @@
                 self.log_error("Error parsing doc (%s) Doc:\n %s" % (str(e), data,))
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (customxml.calendarserver_namespace, "valid-request")
+                    (customxml.calendarserver_namespace, "valid-request"),
+                    "Invalid XML",
                 ))
 
             root = doc.root_element
@@ -748,7 +749,8 @@
                 self.log_error("Unsupported XML (%s)" % (root,))
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (customxml.calendarserver_namespace, "valid-request")
+                    (customxml.calendarserver_namespace, "valid-request"),
+                    "Unsupported XML",
                 ))
 
         return allDataFromStream(request.stream).addCallback(_getData)
@@ -761,7 +763,8 @@
                 return succeed(encoding)
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            (customxml.calendarserver_namespace, "valid-request")
+            (customxml.calendarserver_namespace, "valid-request"),
+            "Invalid request content-type",
         ))
 
     def xmlPOSTAuth(self, request):
@@ -1106,7 +1109,7 @@
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
                 (customxml.calendarserver_namespace, "valid-request"),
-                "invalid shared collection",
+                "Invalid shared collection",
             ))
             
         # Change the record
@@ -1174,7 +1177,7 @@
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
                     (customxml.calendarserver_namespace, "valid-request"),
-                    "missing required XML elements",
+                    "Missing required XML elements",
                 ))
             if accepted:
                 return self.acceptInviteShare(request, hostUrl, replytoUID, displayname=summary)
@@ -1198,8 +1201,8 @@
                 self.log_error("Unsupported XML (%s)" % (root,))
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
-                    (customxml.calendarserver_namespace,
-                     "valid-request")
+                    (customxml.calendarserver_namespace, "valid-request"),
+                    "Unsupported XML",
                 ))
 
         return allDataFromStream(request.stream).addCallback(_getData)

Modified: CalendarServer/trunk/twistedcaldav/storebridge.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/storebridge.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/storebridge.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -633,7 +633,8 @@
             log.err("Cannot DELETE default calendar: %s" % (self,))
             raise HTTPError(ErrorResponse(
                 FORBIDDEN,
-                (caldav_namespace, "default-calendar-delete-allowed",)
+                (caldav_namespace, "default-calendar-delete-allowed",),
+                "Cannot delete default calendar",
             ))
 
         response = (

Modified: CalendarServer/trunk/twistedcaldav/timezoneservice.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/timezoneservice.py	2011-03-13 04:31:12 UTC (rev 7187)
+++ CalendarServer/trunk/twistedcaldav/timezoneservice.py	2011-03-13 04:33:13 UTC (rev 7188)
@@ -146,7 +146,8 @@
             if len(method) != 1:
                 raise HTTPError(ErrorResponse(
                     responsecode.BAD_REQUEST,
-                    (calendarserver_namespace, "valid-method")
+                    (calendarserver_namespace, "valid-method"),
+                    "Invalid method query parameter",
                 ))
             method = method[0]
                 
@@ -159,7 +160,8 @@
             if action is None:
                 raise HTTPError(ErrorResponse(
                     responsecode.BAD_REQUEST,
-                    (calendarserver_namespace, "supported-method")
+                    (calendarserver_namespace, "supported-method"),
+                    "Unknown method query parameter",
                 ))
     
             return action(request)
@@ -187,7 +189,8 @@
         if len(tzid) != 1:
             raise HTTPError(ErrorResponse(
                 responsecode.BAD_REQUEST,
-                (calendarserver_namespace, "valid-timezone")
+                (calendarserver_namespace, "valid-timezone"),
+                "Invalid tzid query parameter",
             ))
         tzid = tzid[0]
 
@@ -196,7 +199,8 @@
         except TimezoneException:
             raise HTTPError(ErrorResponse(
                 responsecode.NOT_FOUND,
-                (calendarserver_namespace, "timezone-available")
+                (calendarserver_namespace, "timezone-available"),
+                "Timezone not found",
             ))
 
         response = Response()
@@ -213,7 +217,8 @@
         if len(tzid) != 1:
             raise HTTPError(ErrorResponse(
                 responsecode.BAD_REQUEST,
-                (calendarserver_namespace, "valid-timezone")
+                (calendarserver_namespace, "valid-timezone"),
+                "Invalid tzid query parameter",
             ))
         tzid = tzid[0]
         try:
@@ -221,7 +226,8 @@
         except TimezoneException:
             raise HTTPError(ErrorResponse(
                 responsecode.NOT_FOUND,
-                (calendarserver_namespace, "timezone-available")
+                (calendarserver_namespace, "timezone-available"),
+                "Timezone not found",
             ))
 
         try:
@@ -232,7 +238,8 @@
         except ValueError:
             raise HTTPError(ErrorResponse(
                 responsecode.BAD_REQUEST,
-                (calendarserver_namespace, "valid-start-date")
+                (calendarserver_namespace, "valid-start-date"),
+                "Invalid start query parameter",
             ))
 
         try:
@@ -245,7 +252,8 @@
         except ValueError:
             raise HTTPError(ErrorResponse(
                 responsecode.BAD_REQUEST,
-                (calendarserver_namespace, "valid-end-date")
+                (calendarserver_namespace, "valid-end-date"),
+                "Invalid end query parameter",
             ))
 
         # Now do the expansion (but use a cache to avoid re-calculating TZs)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110312/0c415f2a/attachment-0001.html>


More information about the calendarserver-changes mailing list