5. Calendar Access Feature
5.1. Calendar Access Support
A server supporting the features described in this document MUST include "calendar-access" as a field in the DAV response header from an OPTIONS request on any resource that supports any calendar properties, reports, method, or privilege. A value of "calendar- access" in the DAV response header MUST indicate that the server supports all MUST level requirements specified in this document.
5.1.1. Example: Using OPTIONS for the Discovery of Calendar Access Support
>> Request << OPTIONS /home/bernard/calendars/ HTTP/1.1 Host: cal.example.com >> Response << HTTP/1.1 200 OK Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE Allow: PROPFIND, PROPPATCH, LOCK, UNLOCK, REPORT, ACL DAV: 1, 2, access-control, calendar-access Date: Sat, 11 Nov 2006 09:32:12 GMT Content-Length: 0 In this example, the OPTIONS method returns the value "calendar- access" in the DAV response header to indicate that the collection "/home/bernard/calendars/" supports the properties, reports, method, or privilege defined in this specification.5.2. Calendar Collection Properties
This section defines properties for calendar collections.5.2.1. CALDAV:calendar-description Property
Name: calendar-description Namespace: urn:ietf:params:xml:ns:caldav Purpose: Provides a human-readable description of the calendar collection. Conformance: This property MAY be defined on any calendar collection. If defined, it MAY be protected and SHOULD NOT be returned by a PROPFIND DAV:allprop request (as defined in Section 12.14.1 of [RFC2518]). An xml:lang attribute indicating the human language of the description SHOULD be set for this property by clients or through server provisioning. Servers MUST return any xml:lang attribute if set for the property. Description: If present, the property contains a description of the calendar collection that is suitable for presentation to a user. If not present, the client should assume no description for the calendar collection.
Definition: <!ELEMENT calendar-description (#PCDATA)> PCDATA value: string Example: <C:calendar-description xml:lang="fr-CA" xmlns:C="urn:ietf:params:xml:ns:caldav" >Calendrier de Mathilde Desruisseaux</C:calendar-description>5.2.2. CALDAV:calendar-timezone Property
Name: calendar-timezone Namespace: urn:ietf:params:xml:ns:caldav Purpose: Specifies a time zone on a calendar collection. Conformance: This property SHOULD be defined on all calendar collections. If defined, it SHOULD NOT be returned by a PROPFIND DAV:allprop request (as defined in Section 12.14.1 of [RFC2518]). Description: The CALDAV:calendar-timezone property is used to specify the time zone the server should rely on to resolve "date" values and "date with local time" values (i.e., floating time) to "date with UTC time" values. The server will require this information to determine if a calendar component scheduled with "date" values or "date with local time" values overlaps a CALDAV: time-range specified in a CALDAV:calendar-query REPORT. The server will also require this information to compute the proper FREEBUSY time period as "date with UTC time" in the VFREEBUSY component returned in a response to a CALDAV:free-busy-query REPORT request that takes into account calendar components scheduled with "date" values or "date with local time" values. In the absence of this property, the server MAY rely on the time zone of their choice. Note: The iCalendar data embedded within the CALDAV:calendar- timezone XML element MUST follow the standard XML character data encoding rules, including use of <, >, & etc. entity encoding or the use of a <![CDATA[ ... ]]> construct. In the later case, the iCalendar data cannot contain the character sequence "]]>", which is the end delimiter for the CDATA section.
Definition: <!ELEMENT calendar-timezone (#PCDATA)> PCDATA value: an iCalendar object with exactly one VTIMEZONE component. Example: <C:calendar-timezone xmlns:C="urn:ietf:params:xml:ns:caldav">BEGIN:VCALENDAR PRODID:-//Example Corp.//CalDAV Client//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:US-Eastern LAST-MODIFIED:19870101T000000Z BEGIN:STANDARD DTSTART:19671029T020000 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 TZNAME:Eastern Standard Time (US & Canada) END:STANDARD BEGIN:DAYLIGHT DTSTART:19870405T020000 RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 TZNAME:Eastern Daylight Time (US & Canada) END:DAYLIGHT END:VTIMEZONE END:VCALENDAR </C:calendar-timezone>5.2.3. CALDAV:supported-calendar-component-set Property
Name: supported-calendar-component-set Namespace: urn:ietf:params:xml:ns:caldav Purpose: Specifies the calendar component types (e.g., VEVENT, VTODO, etc.) that calendar object resources can contain in the calendar collection. Conformance: This property MAY be defined on any calendar collection. If defined, it MUST be protected and SHOULD NOT be returned by a PROPFIND DAV:allprop request (as defined in Section 12.14.1 of [RFC2518]).
Description: The CALDAV:supported-calendar-component-set property is used to specify restrictions on the calendar component types that calendar object resources may contain in a calendar collection. Any attempt by the client to store calendar object resources with component types not listed in this property, if it exists, MUST result in an error, with the CALDAV:supported-calendar-component precondition (Section 5.3.2.1) being violated. Since this property is protected, it cannot be changed by clients using a PROPPATCH request. However, clients can initialize the value of this property when creating a new calendar collection with MKCALENDAR. The empty-element tag <C:comp name="VTIMEZONE"/> MUST only be specified if support for calendar object resources that only contain VTIMEZONE components is provided or desired. Support for VTIMEZONE components in calendar object resources that contain VEVENT or VTODO components is always assumed. In the absence of this property, the server MUST accept all component types, and the client can assume that all component types are accepted. Definition: <!ELEMENT supported-calendar-component-set (comp+)> Example: <C:supported-calendar-component-set xmlns:C="urn:ietf:params:xml:ns:caldav"> <C:comp name="VEVENT"/> <C:comp name="VTODO"/> </C:supported-calendar-component-set>5.2.4. CALDAV:supported-calendar-data Property
Name: supported-calendar-data Namespace: urn:ietf:params:xml:ns:caldav Purpose: Specifies what media types are allowed for calendar object resources in a calendar collection. Conformance: This property MAY be defined on any calendar collection. If defined, it MUST be protected and SHOULD NOT be returned by a PROPFIND DAV:allprop request (as defined in Section 12.14.1 of [RFC2518]). Description: The CALDAV:supported-calendar-data property is used to specify the media type supported for the calendar object resources contained in a given calendar collection (e.g., iCalendar version 2.0). Any attempt by the client to store calendar object
resources with a media type not listed in this property MUST result in an error, with the CALDAV:supported-calendar-data precondition (Section 5.3.2.1) being violated. In the absence of this property, the server MUST only accept data with the media type "text/calendar" and iCalendar version 2.0, and clients can assume that the server will only accept this data. Definition: <!ELEMENT supported-calendar-data (calendar-data+)> Example: <C:supported-calendar-data xmlns:C="urn:ietf:params:xml:ns:caldav"> <C:calendar-data content-type="text/calendar" version="2.0"/> </C:supported-calendar-data>5.2.5. CALDAV:max-resource-size Property
Name: max-resource-size Namespace: urn:ietf:params:xml:ns:caldav Purpose: Provides a numeric value indicating the maximum size of a resource in octets that the server is willing to accept when a calendar object resource is stored in a calendar collection. Conformance: This property MAY be defined on any calendar collection. If defined, it MUST be protected and SHOULD NOT be returned by a PROPFIND DAV:allprop request (as defined in Section 12.14.1 of [RFC2518]). Description: The CALDAV:max-resource-size is used to specify a numeric value that represents the maximum size in octets that the server is willing to accept when a calendar object resource is stored in a calendar collection. Any attempt to store a calendar object resource exceeding this size MUST result in an error, with the CALDAV:max-resource-size precondition (Section 5.3.2.1) being violated. In the absence of this property, the client can assume that the server will allow storing a resource of any reasonable size. Definition: <!ELEMENT max-resource-size (#PCDATA)> PCDATA value: a numeric value (positive integer)
Example: <C:max-resource-size xmlns:C="urn:ietf:params:xml:ns:caldav" >102400</C:max-resource-size>5.2.6. CALDAV:min-date-time Property
Name: min-date-time Namespace: urn:ietf:params:xml:ns:caldav Purpose: Provides a DATE-TIME value indicating the earliest date and time (in UTC) that the server is willing to accept for any DATE or DATE-TIME value in a calendar object resource stored in a calendar collection. Conformance: This property MAY be defined on any calendar collection. If defined, it MUST be protected and SHOULD NOT be returned by a PROPFIND DAV:allprop request (as defined in Section 12.14.1 of [RFC2518]). Description: The CALDAV:min-date-time is used to specify an iCalendar DATE-TIME value in UTC that indicates the earliest inclusive date that the server is willing to accept for any explicit DATE or DATE-TIME value in a calendar object resource stored in a calendar collection. Any attempt to store a calendar object resource using a DATE or DATE-TIME value earlier than this value MUST result in an error, with the CALDAV:min-date-time precondition (Section 5.3.2.1) being violated. Note that servers MUST accept recurring components that specify instances beyond this limit, provided none of those instances have been overridden. In that case, the server MAY simply ignore those instances outside of the acceptable range when processing reports on the calendar object resource. In the absence of this property, the client can assume any valid iCalendar date may be used at least up to the CALDAV:max-date-time value, if that is defined. Definition: <!ELEMENT min-date-time (#PCDATA)> PCDATA value: an iCalendar format DATE-TIME value in UTC Example: <C:min-date-time xmlns:C="urn:ietf:params:xml:ns:caldav" >19000101T000000Z</C:min-date-time>
5.2.7. CALDAV:max-date-time Property
Name: max-date-time Namespace: urn:ietf:params:xml:ns:caldav Purpose: Provides a DATE-TIME value indicating the latest date and time (in UTC) that the server is willing to accept for any DATE or DATE-TIME value in a calendar object resource stored in a calendar collection. Conformance: This property MAY be defined on any calendar collection. If defined, it MUST be protected and SHOULD NOT be returned by a PROPFIND DAV:allprop request (as defined in Section 12.14.1 of [RFC2518]). Description: The CALDAV:max-date-time is used to specify an iCalendar DATE-TIME value in UTC that indicates the inclusive latest date that the server is willing to accept for any date or time value in a calendar object resource stored in a calendar collection. Any attempt to store a calendar object resource using a DATE or DATE-TIME value later than this value MUST result in an error, with the CALDAV:max-date-time precondition (Section 5.3.2.1) being violated. Note that servers MUST accept recurring components that specify instances beyond this limit, provided none of those instances have been overridden. In that case, the server MAY simply ignore those instances outside of the acceptable range when processing reports on the calendar object resource. In the absence of this property, the client can assume any valid iCalendar date may be used at least down to the CALDAV: min-date-time value, if that is defined. Definition: <!ELEMENT max-date-time (#PCDATA)> PCDATA value: an iCalendar format DATE-TIME value in UTC Example: <C:max-date-time xmlns:C="urn:ietf:params:xml:ns:caldav" >20491231T235959Z</C:max-date-time>
5.2.8. CALDAV:max-instances Property
Name: max-instances Namespace: urn:ietf:params:xml:ns:caldav Purpose: Provides a numeric value indicating the maximum number of recurrence instances that a calendar object resource stored in a calendar collection can generate. Conformance: This property MAY be defined on any calendar collection. If defined, it MUST be protected and SHOULD NOT be returned by a PROPFIND DAV:allprop request (as defined in Section 12.14.1 of [RFC2518]). Description: The CALDAV:max-instances is used to specify a numeric value that indicates the maximum number of recurrence instances that a calendar object resource stored in a calendar collection can generate. Any attempt to store a calendar object resource with a recurrence pattern that generates more instances than this value MUST result in an error, with the CALDAV:max-instances precondition (Section 5.3.2.1) being violated. In the absence of this property, the client can assume that the server has no limits on the number of recurrence instances it can handle or expand. Definition: <!ELEMENT max-instances (#PCDATA)> PCDATA value: a numeric value (integer greater than zero) Example: <C:max-instances xmlns:C="urn:ietf:params:xml:ns:caldav" >100</C:max-instances>5.2.9. CALDAV:max-attendees-per-instance Property
Name: max-attendees-per-instance Namespace: urn:ietf:params:xml:ns:caldav Purpose: Provides a numeric value indicating the maximum number of ATTENDEE properties in any instance of a calendar object resource stored in a calendar collection. Conformance: This property MAY be defined on any calendar collection. If defined, it MUST be protected and SHOULD NOT be
returned by a PROPFIND DAV:allprop request (as defined in Section 12.14.1 of [RFC2518]). Description: The CALDAV:max-attendees-per-instance is used to specify a numeric value that indicates the maximum number of iCalendar ATTENDEE properties on any one instance of a calendar object resource stored in a calendar collection. Any attempt to store a calendar object resource with more ATTENDEE properties per instance than this value MUST result in an error, with the CALDAV: max-attendees-per-instance precondition (Section 5.3.2.1) being violated. In the absence of this property, the client can assume that the server can handle any number of ATTENDEE properties in a calendar component. Definition: <!ELEMENT max-attendees-per-instance (#PCDATA)> PCDATA value: a numeric value (integer greater than zero) Example: <C:max-attendees-per-instance xmlns:C="urn:ietf:params:xml:ns:caldav" >25</C:max-attendees-per-instance>5.2.10. Additional Precondition for PROPPATCH
This specification requires an additional Precondition for the PROPPATCH method. The precondition is: (CALDAV:valid-calendar-data): The time zone specified in CALDAV: calendar-timezone property MUST be a valid iCalendar object containing a single valid VTIMEZONE component.5.3. Creating Resources
Calendar collections and calendar object resources may be created by either a CalDAV client or by the CalDAV server. This specification defines restrictions and a data model that both clients and servers MUST adhere to when manipulating such calendar data.5.3.1. MKCALENDAR Method
An HTTP request using the MKCALENDAR method creates a new calendar collection resource. A server MAY restrict calendar collection creation to particular collections.
Support for MKCALENDAR on the server is only RECOMMENDED and not REQUIRED because some calendar stores only support one calendar per user (or principal), and those are typically pre-created for each account. However, servers and clients are strongly encouraged to support MKCALENDAR whenever possible to allow users to create multiple calendar collections to help organize their data better. Clients SHOULD use the DAV:displayname property for a human-readable name of the calendar. Clients can either specify the value of the DAV:displayname property in the request body of the MKCALENDAR request, or alternatively issue a PROPPATCH request to change the DAV:displayname property to the appropriate value immediately after issuing the MKCALENDAR request. Clients SHOULD NOT set the DAV: displayname property to be the same as any other calendar collection at the same URI "level". When displaying calendar collections to users, clients SHOULD check the DAV:displayname property and use that value as the name of the calendar. In the event that the DAV: displayname property is empty, the client MAY use the last part of the calendar collection URI as the name; however, that path segment may be "opaque" and not represent any meaningful human-readable text. If a MKCALENDAR request fails, the server state preceding the request MUST be restored. Marshalling: If a request body is included, it MUST be a CALDAV:mkcalendar XML element. Instruction processing MUST occur in the order instructions are received (i.e., from top to bottom). Instructions MUST either all be executed or none executed. Thus, if any error occurs during processing, all executed instructions MUST be undone and a proper error result returned. Instruction processing details can be found in the definition of the DAV:set instruction in Section 12.13.2 of [RFC2518]. <!ELEMENT mkcalendar (DAV:set)> If a response body for a successful request is included, it MUST be a CALDAV:mkcalendar-response XML element. <!ELEMENT mkcalendar-response ANY> The response MUST include a Cache-Control:no-cache header. Preconditions: (DAV:resource-must-be-null): A resource MUST NOT exist at the Request-URI;
(CALDAV:calendar-collection-location-ok): The Request-URI MUST identify a location where a calendar collection can be created; (CALDAV:valid-calendar-data): The time zone specified in the CALDAV:calendar-timezone property MUST be a valid iCalendar object containing a single valid VTIMEZONE component; (DAV:needs-privilege): The DAV:bind privilege MUST be granted to the current user on the parent collection of the Request-URI. Postconditions: (CALDAV:initialize-calendar-collection): A new calendar collection exists at the Request-URI. The DAV:resourcetype of the calendar collection MUST contain both DAV:collection and CALDAV:calendar XML elements.5.3.1.1. Status Codes
The following are examples of response codes one would expect to get in a response to a MKCALENDAR request. Note that this list is by no means exhaustive. 201 (Created) - The calendar collection resource was created in its entirety; 207 (Multi-Status) - The calendar collection resource was not created since one or more DAV:set instructions specified in the request body could not be processed successfully. The following are examples of response codes one would expect to be used in a 207 (Multi-Status) response in this situation: 403 (Forbidden) - The client, for reasons the server chooses not to specify, cannot alter one of the properties; 409 (Conflict) - The client has provided a value whose semantics are not appropriate for the property. This includes trying to set read-only properties; 424 (Failed Dependency) - The DAV:set instruction on the specified resource would have succeeded if it were not for the failure of another DAV:set instruction specified in the request body; 423 (Locked) - The specified resource is locked and the client either is not a lock owner or the lock type requires a lock token to be submitted and the client did not submit it; and
507 (Insufficient Storage) - The server did not have sufficient space to record the property; 403 (Forbidden) - This indicates at least one of two conditions: 1) the server does not allow the creation of calendar collections at the given location in its namespace, or 2) the parent collection of the Request-URI exists but cannot accept members; 409 (Conflict) - A collection cannot be made at the Request-URI until one or more intermediate collections have been created; 415 (Unsupported Media Type) - The server does not support the request type of the body; and 507 (Insufficient Storage) - The resource does not have sufficient space to record the state of the resource after the execution of this method.5.3.1.2. Example: Successful MKCALENDAR Request
This example creates a calendar collection called /home/lisa/ calendars/events/ on the server cal.example.com with specific values for the properties DAV:displayname, CALDAV:calendar-description, CALDAV:supported-calendar-component-set, and CALDAV:calendar- timezone.
>> Request << MKCALENDAR /home/lisa/calendars/events/ HTTP/1.1 Host: cal.example.com Content-Type: application/xml; charset="utf-8" Content-Length: xxxx <?xml version="1.0" encoding="utf-8" ?> <C:mkcalendar xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav"> <D:set> <D:prop> <D:displayname>Lisa's Events</D:displayname> <C:calendar-description xml:lang="en" >Calendar restricted to events.</C:calendar-description> <C:supported-calendar-component-set> <C:comp name="VEVENT"/> </C:supported-calendar-component-set> <C:calendar-timezone><![CDATA[BEGIN:VCALENDAR PRODID:-//Example Corp.//CalDAV Client//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:US-Eastern LAST-MODIFIED:19870101T000000Z BEGIN:STANDARD DTSTART:19671029T020000 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 TZNAME:Eastern Standard Time (US & Canada) END:STANDARD BEGIN:DAYLIGHT DTSTART:19870405T020000 RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 TZNAME:Eastern Daylight Time (US & Canada) END:DAYLIGHT END:VTIMEZONE END:VCALENDAR ]]></C:calendar-timezone> </D:prop> </D:set> </C:mkcalendar>
>> Response << HTTP/1.1 201 Created Cache-Control: no-cache Date: Sat, 11 Nov 2006 09:32:12 GMT Content-Length: 05.3.2. Creating Calendar Object Resources
Clients populate calendar collections with calendar object resources. The URL for each calendar object resource is entirely arbitrary and does not need to bear a specific relationship to the calendar object resource's iCalendar properties or other metadata. New calendar object resources MUST be created with a PUT request targeted at an unmapped URI. A PUT request targeted at a mapped URI updates an existing calendar object resource. When servers create new resources, it's not hard for the server to choose an unmapped URI. It's slightly tougher for clients, because a client might not want to examine all resources in the collection and might not want to lock the entire collection to ensure that a new resource isn't created with a name collision. However, there is an HTTP feature to mitigate this. If the client intends to create a new non-collection resource, such as a new VEVENT, the client SHOULD use the HTTP request header "If-None-Match: *" on the PUT request. The Request-URI on the PUT request MUST include the target collection, where the resource is to be created, plus the name of the resource in the last path segment. The "If-None-Match: *" request header ensures that the client will not inadvertently overwrite an existing resource if the last path segment turned out to already be used.
>> Request << PUT /home/lisa/calendars/events/qwue23489.ics HTTP/1.1 If-None-Match: * Host: cal.example.com Content-Type: text/calendar Content-Length: xxxx BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Example Corp.//CalDAV Client//EN BEGIN:VEVENT UID:20010712T182145Z-123401@example.com DTSTAMP:20060712T182145Z DTSTART:20060714T170000Z DTEND:20060715T040000Z SUMMARY:Bastille Day Party END:VEVENT END:VCALENDAR >> Response << HTTP/1.1 201 Created Content-Length: 0 Date: Sat, 11 Nov 2006 09:32:12 GMT ETag: "123456789-000-111" The request to change an existing event is the same, but with a specific ETag in the "If-Match" header, rather than the "If-None- Match" header. As indicated in Section 3.10 of [RFC2445], the URL of calendar object resources containing (an arbitrary set of) calendaring and scheduling information may be suffixed by ".ics", and the URL of calendar object resources containing free or busy time information may be suffixed by ".ifb".5.3.2.1. Additional Preconditions for PUT, COPY, and MOVE
This specification creates additional Preconditions for PUT, COPY, and MOVE methods. These preconditions apply when a PUT operation of a calendar object resource into a calendar collection occurs, or when a COPY or MOVE operation of a calendar object resource into a calendar collection occurs, or when a COPY or MOVE operation occurs on a calendar collection.
The new preconditions are: (CALDAV:supported-calendar-data): The resource submitted in the PUT request, or targeted by a COPY or MOVE request, MUST be a supported media type (i.e., iCalendar) for calendar object resources; (CALDAV:valid-calendar-data): The resource submitted in the PUT request, or targeted by a COPY or MOVE request, MUST be valid data for the media type being specified (i.e., MUST contain valid iCalendar data); (CALDAV:valid-calendar-object-resource): The resource submitted in the PUT request, or targeted by a COPY or MOVE request, MUST obey all restrictions specified in Section 4.1 (e.g., calendar object resources MUST NOT contain more than one type of calendar component, calendar object resources MUST NOT specify the iCalendar METHOD property, etc.); (CALDAV:supported-calendar-component): The resource submitted in the PUT request, or targeted by a COPY or MOVE request, MUST contain a type of calendar component that is supported in the targeted calendar collection; (CALDAV:no-uid-conflict): The resource submitted in the PUT request, or targeted by a COPY or MOVE request, MUST NOT specify an iCalendar UID property value already in use in the targeted calendar collection or overwrite an existing calendar object resource with one that has a different UID property value. Servers SHOULD report the URL of the resource that is already making use of the same UID property value in the DAV:href element; <!ELEMENT no-uid-conflict (DAV:href)> (CALDAV:calendar-collection-location-ok): In a COPY or MOVE request, when the Request-URI is a calendar collection, the Destination-URI MUST identify a location where a calendar collection can be created; (CALDAV:max-resource-size): The resource submitted in the PUT request, or targeted by a COPY or MOVE request, MUST have an octet size less than or equal to the value of the CALDAV:max-resource- size property value (Section 5.2.5) on the calendar collection where the resource will be stored; (CALDAV:min-date-time): The resource submitted in the PUT request, or targeted by a COPY or MOVE request, MUST have all of its iCalendar DATE or DATE-TIME property values (for each recurring
instance) greater than or equal to the value of the CALDAV:min- date-time property value (Section 5.2.6) on the calendar collection where the resource will be stored; (CALDAV:max-date-time): The resource submitted in the PUT request, or targeted by a COPY or MOVE request, MUST have all of its iCalendar DATE or DATE-TIME property values (for each recurring instance) less than the value of the CALDAV:max-date-time property value (Section 5.2.7) on the calendar collection where the resource will be stored; (CALDAV:max-instances): The resource submitted in the PUT request, or targeted by a COPY or MOVE request, MUST generate a number of recurring instances less than or equal to the value of the CALDAV: max-instances property value (Section 5.2.8) on the calendar collection where the resource will be stored; (CALDAV:max-attendees-per-instance): The resource submitted in the PUT request, or targeted by a COPY or MOVE request, MUST have a number of ATTENDEE properties on any one instance less than or equal to the value of the CALDAV:max-attendees-per-instance property value (Section 5.2.9) on the calendar collection where the resource will be stored;5.3.3. Non-Standard Components, Properties, and Parameters
iCalendar provides a "standard mechanism for doing non-standard things". This extension support allows implementers to make use of non-standard components, properties, and parameters whose names are prefixed with the text "X-". Servers MUST support the use of non-standard components, properties, and parameters in calendar object resources stored via the PUT method. Servers may need to enforce rules for their own "private" components, properties, or parameters, so servers MAY reject any attempt by the client to change those or use values for those outside of any restrictions the server may have. Servers SHOULD ensure that any "private" components, properties, or parameters it uses follow the convention of including a vendor id in the "X-" name, as described in Section 4.2 of [RFC2445], e.g., "X-ABC-PRIVATE".5.3.4. Calendar Object Resource Entity Tag
The DAV:getetag property MUST be defined and set to a strong entity tag on all calendar object resources.
A response to a GET request targeted at a calendar object resource MUST contain an ETag response header field indicating the current value of the strong entity tag of the calendar object resource. Servers SHOULD return a strong entity tag (ETag header) in a PUT response when the stored calendar object resource is equivalent by octet equality to the calendar object resource submitted in the body of the PUT request. This allows clients to reliably use the returned strong entity tag for data synchronization purposes. For instance, the client can do a PROPFIND request on the stored calendar object resource and have the DAV:getetag property returned, and compare that value with the strong entity tag it received on the PUT response, and know that if they are equal, then the calendar object resource on the server has not been changed. In the case where the data stored by a server as a result of a PUT request is not equivalent by octet equality to the submitted calendar object resource, the behavior of the ETag response header is not specified here, with the exception that a strong entity tag MUST NOT be returned in the response. As a result, clients may need to retrieve the modified calendar object resource (and ETag) as a basis for further changes, rather than use the calendar object resource it had sent with the PUT request.6. Calendaring Access Control
6.1. Calendaring Privilege
CalDAV servers MUST support and adhere to the requirements of WebDAV ACL [RFC3744]. WebDAV ACL provides a framework for an extensible set of privileges that can be applied to WebDAV collections and ordinary resources. CalDAV servers MUST also support the calendaring privilege defined in this section.6.1.1. CALDAV:read-free-busy Privilege
Calendar users often wish to allow other users to see their busy time information, without viewing the other details of the calendar components (e.g., location, summary, attendees). This allows a significant amount of privacy while still allowing other users to schedule meetings at times when the user is likely to be free. The CALDAV:read-free-busy privilege controls which calendar collections, regular collections, and calendar object resources are examined when a CALDAV:free-busy-query REPORT request is processed (see Section 7.10). This privilege can be granted on calendar collections, regular collections, or calendar object resources.
Servers MUST support this privilege on all calendar collections, regular collections, and calendar object resources. <!ELEMENT read-free-busy EMPTY> The CALDAV:read-free-busy privilege MUST be aggregated in the DAV: read privilege. Servers MUST allow the CALDAV:read-free-busy to be granted without the DAV:read privilege being granted. Clients should note that when only the CALDAV:read-free-busy privilege has been granted on a resource, access to GET, HEAD, OPTIONS, and PROPFIND on the resource is not implied (those operations are governed by the DAV:read privilege).6.2. Additional Principal Property
This section defines an additional property for WebDAV principal resources, as defined in [RFC3744].6.2.1. CALDAV:calendar-home-set Property
Name: calendar-home-set Namespace: urn:ietf:params:xml:ns:caldav Purpose: Identifies the URL of any WebDAV collections that contain calendar collections owned by the associated principal resource. Conformance: This property SHOULD be defined on a principal resource. If defined, it MAY be protected and SHOULD NOT be returned by a PROPFIND DAV:allprop request (as defined in Section 12.14.1 of [RFC2518]). Description: The CALDAV:calendar-home-set property is meant to allow users to easily find the calendar collections owned by the principal. Typically, users will group all the calendar collections that they own under a common collection. This property specifies the URL of collections that are either calendar collections or ordinary collections that have child or descendant calendar collections owned by the principal. Definition: <!ELEMENT calendar-home-set (DAV:href*)>
Example: <C:calendar-home-set xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav"> <D:href>http://cal.example.com/home/bernard/calendars/</D:href> </C:calendar-home-set>