<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../rfc2629.xslt"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
  <!ENTITY rfc2119 PUBLIC "" "bibxml/reference.RFC.2119.xml">
  <!ENTITY rfc2616 PUBLIC "" "bibxml/reference.RFC.2616.xml">
  <!ENTITY rfc2617 PUBLIC "" "bibxml/reference.RFC.2617.xml">
  <!ENTITY rfc2782 PUBLIC "" "bibxml/reference.RFC.2782.xml">
  <!ENTITY rfc2818 PUBLIC "" "bibxml/reference.RFC.2818.xml">
  <!ENTITY rfc3688 PUBLIC "" "bibxml/reference.RFC.3688.xml">
  <!ENTITY rfc3864 PUBLIC "" "bibxml/reference.RFC.3864.xml">
  <!ENTITY rfc3986 PUBLIC "" "bibxml/reference.RFC.3986.xml">
  <!ENTITY rfc4033 PUBLIC "" "bibxml/reference.RFC.4033.xml">
  <!ENTITY rfc4398 PUBLIC "" "bibxml/reference.RFC.4398.xml">
  <!ENTITY rfc5234 PUBLIC "" "bibxml/reference.RFC.5234.xml">
  <!ENTITY rfc5246 PUBLIC "" "bibxml/reference.RFC.5246.xml">
  <!ENTITY rfc4791 PUBLIC "" "bibxml/reference.RFC.4791.xml">
  <!ENTITY rfc5545 PUBLIC "" "bibxml/reference.RFC.5545.xml">
  <!ENTITY rfc5546 PUBLIC "" "bibxml/reference.RFC.5546.xml">
  <!ENTITY rfc5585 PUBLIC "" "bibxml/reference.RFC.5585.xml">
  <!ENTITY rfc5785 PUBLIC "" "bibxml/reference.RFC.5785.xml">
  <!ENTITY rfc6047 PUBLIC "" "bibxml/reference.RFC.6047.xml">
  <!ENTITY rfc6125 PUBLIC "" "bibxml/reference.RFC.6125.xml">
  <!ENTITY rfc6376 PUBLIC "" "bibxml/reference.RFC.6376.xml">
  <!ENTITY rfc6541 PUBLIC "" "bibxml/reference.RFC.6541.xml">
  <!ENTITY rfc6638 PUBLIC "" "bibxml/reference.RFC.6638.xml">
  <!ENTITY rfc6763 PUBLIC "" "bibxml/reference.RFC.6763.xml">
  <!ENTITY W3C.REC-xml-20081126 PUBLIC "" "bibxml4/reference.W3C.REC-xml-20081126.xml">
]>

<?rfc rfcedstyle="yes" ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?><!-- default = 3 -->
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>

<rfc category="std"
     ipr="trust200902"
     docName="draft-desruisseaux-ischedule-05"
     updates="6376">
<front>
  <title abbrev="iSchedule">Internet Calendar Scheduling Protocol (iSchedule)</title>
  <author initials="C." surname="Daboo" fullname="Cyrus Daboo">
    <organization abbrev="Apple">Apple Inc.</organization>
    <address>
      <postal>
        <street>1 Infinite Loop</street>
        <city>Cupertino</city>
        <region>CA</region>
        <code>95014</code>
        <country>USA</country>
      </postal>
      <email>cyrus@daboo.name</email>
      <uri>http://www.apple.com/</uri>
    </address>
  </author>
  <author initials="B." surname="Desruisseaux" 
    fullname="Bernard Desruisseaux">
    <organization abbrev="Oracle">Oracle Corporation</organization>
    <address>
      <postal>
        <street>600 Blvd. de Maisonneuve West</street>
        <street>Suite 1900</street>
        <city>Montreal</city>
        <region>QC</region>
        <code>H3A 3J2</code>
        <country>CANADA</country>
      </postal>
      <email>bernard.desruisseaux@oracle.com</email>
      <uri>http://www.oracle.com/</uri>
    </address>
  </author>
  <date />
  <area>Applications</area>
  <keyword>calsched</keyword>
  <keyword>calsch</keyword>
  <keyword>caldav</keyword>
  <keyword>calendar</keyword>
  <keyword>calendaring</keyword>
  <keyword>calsify</keyword>
  <keyword>HTTP</keyword>
  <keyword>iCal</keyword>
  <keyword>iCalendar</keyword>
  <keyword>iMIP</keyword>
  <keyword>iTIP</keyword>
  <keyword>iRIP</keyword>
  <keyword>iSchedule</keyword>
  <keyword>scheduling</keyword>
  <keyword>text/calendar</keyword>
  <keyword>DKIM</keyword>
  <keyword>DomainKeys Identified Mail</keyword>
  <abstract>
    <t>
      This document defines the Internet Calendar Scheduling
      Protocol (iSchedule), which is a binding from the iCalendar
      Transport-independent Interoperability Protocol (iTIP) to the
      Hypertext Transfer Protocol (HTTP) to enable interoperability
      between calendaring and scheduling systems over the Internet.
    </t>
  </abstract>
</front>
<middle>
<section anchor="intro" title="Introduction">
  <t>
    This binding document provides the transport specific information
    necessary to convey iCalendar Transport-independent Interoperability
    Protocol <xref target="RFC5546">(iTIP)</xref>
    messages over the Hypertext Transfer Protocol
    <xref target="RFC2616">(HTTP)</xref>.
  </t>
  <t>
    The Internet Calendar Scheduling Protocol (iSchedule) enables
    interoperability between different calendaring and scheduling
    systems. Calendaring and scheduling systems that provide support for
    iSchedule allow their users to perform scheduling transactions such as
    schedule, reschedule, respond to scheduling request or cancel scheduled
    calendar components, as well as search for busy time information with
    users of other calendaring and scheduling systems on the Internet.
  </t>
  <t>
    iSchedule leverages the DomainKeys Identified Mail (DKIM) service
    <xref target="RFC6376"/> to provide end-to-end domain-level
    authentication based on message content that is transparent to end users.
  </t>
  <t>
    Discussion of this Internet-Draft is taking place on the mailing list
    &lt;https://www.ietf.org/mailman/listinfo/ischedule&gt;.
  </t>
  <section title="Motivations">
    <t>
      The iCalendar Message-Based Interoperability Protocol
      <xref target="RFC6047">(iMIP)</xref>, has
      proven to be insufficient to allow users to seamlessly perform the
      same scheduling operations with users of other calendaring and
      scheduling systems on the Internet as with users of their own
      system. This section clarifies the motivations for a binding from
      the iCalendar Transport-independent Interoperability Protocol
      <xref target="RFC5546">(iTIP)</xref> to a transport that allows
      synchronous end-to-end connectivity.
    </t>
    <t>
      A binding to an email-based transport is clearly inadequate to
      search for busy time information  since users need and expect to
      get an immediate response. As such, some calendaring and scheduling
      systems allow users to publish their free busy information in a
      resource accessible to others on the Internet. In the absence of a
      standardized mechanism to locate the resource that provides the free
      busy information of a user, one thus needs to know the location of
      this resource in addition to the calendar user address of the users
      one wishes to schedule with.
    </t>
    <t>
      With an email-based transport, the transparent processing of
      incoming scheduling messages on the server is only possible when
      the calendaring and scheduling system is integrated with the email
      system. Commonly, the processing of incoming scheduling messages
      occurs on the client and requires user intervention, which yields
      the following consequences:
      <list style="numbers">
        <t>
          The processing of incoming scheduling messages and the
          corresponding updates to the calendar only occur when the client
          is active. As a result, free busy information may be inaccurate
          (e.g., user still appears busy when the organizer actually
          rescheduled or canceled the meeting).
        </t>
        <t>
          Calendaring and scheduling systems generally restrain the number
          of updates sent to users to reduce the number of messages that
          will clutter their email inbox. As a result, attendees rarely
          obtain up to date participation status of other attendees.
        </t>
        <t>
          The client becomes responsible for verification of the
          authenticity and integrity of the scheduling message.
        </t>
      </list>
    </t>
    <!--
      Other motivations:
       * Synchronous delivery status.
       * Synchronous resource booking (first come first server).
    -->
  </section><!-- Motivations -->

  <section title="Related Memos">
    <t>
      Implementers will need to be familiar with other documents that,
      along with this document, form a framework for Internet calendaring
      and scheduling standards.
    </t>
    <t>
      This document specifies a binding from iTIP to HTTP.
    </t>
    <t>
      <list style="symbols">
        <t>
          <xref target="RFC5545">iCalendar</xref>
          specifies a core specification of objects, data types,
          properties and property parameters;
        </t>
        <t>
          <xref target="RFC5546">iTIP</xref>
          specifies an interoperability protocol for scheduling
          between different implementations.
        </t>
      </list>
    </t>
    <t>
      Furthermore, implementers will need to be familiar with the
      DomainKeys Identified Mail (DKIM) service defined in
      <xref target="RFC6376"/>. An overview of DKIM can be found
      in <xref target="RFC5585"/>.
    </t>
    <t>
      This document does not attempt to repeat the specification of
      concepts or definitions from these other documents. Where possible,
      references are made to the document that provides the
      specification of these concepts or definitions.
    </t>
  </section>
    <section title="Terminology">
      <t>
        This specification reuses much of the same terminology as
        <xref target="RFC5545">iCalendar</xref>,
        <xref target="RFC5546">iTIP</xref>,
        <xref target="RFC2616">HTTP</xref>, and
        <xref target="RFC6376">DKIM</xref>.
        Additional terms used by this specification are:
      </t>
      <t>
        <list style="hanging">
          <t hangText="Scheduling message:">
            An <xref target="RFC5545">iCalendar</xref> object conforming to the requirements of <xref target="RFC5546">iTIP</xref>.
          </t>
          <t hangText="Originator:">
            The calendar user who is sending a scheduling message to one or more other calendar users.
          </t>
          <t hangText="Recipient:">
            A calendar user to whom a scheduling message is being sent.
          </t>
          <t hangText="iSchedule Sender:">
            The iSchedule service responsible for sending scheduling messages.
          </t>
          <t hangText="iSchedule Receiver:">
            The iSchedule service responsible for receiving scheduling messages.
          </t>
        </list>
      </t>
    </section>

  <section title="Notational Conventions">
    <t>
      The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL"
      in this document are to be interpreted as described in
      <xref target="RFC2119"/>.
    </t>
    <t>
      The Augmented BNF (ABNF) syntax used by this document to describe
      protocol elements is defined in <xref target="RFC5234"/>.
    </t>
<!--
    <t>
      The Augmented BNF used by this document to describe protocol
      elements is described in Section 2.1 of <xref target="RFC2616"/>.
      Because this augmented BNF uses the basic production rules provided
      in Section 2.2 of <xref target="RFC2616"/>, those rules apply to
      this document as well.
    </t>
-->
    <t>
      Definitions of XML elements in this document use XML element
      type declarations (as found in XML Document Type Declarations),
      described in Section 3.2 of <xref target="W3C.REC-xml-20081126"/>.
    </t>
    <t>
      The namespace "urn:ietf:params:xml:ns:ischedule" is reserved for the XML elements defined in this specification, or in other Standards Track IETF RFCs written to extend iSchedule. It MUST NOT be used for proprietary extensions. When XML element types in this namespace are referenced in this document outside of the context of an XML fragment, the string "IS:" will be prefixed to the element type names.
    </t>
    <t>
      Note that the XML declarations used in this document are
      incomplete, in that they do not include namespace information.
      Thus, the reader MUST NOT use these declarations as the only way
      to validate iSchedule XML element types.
    </t>
  </section><!-- Notational Conventions -->
</section><!-- Introduction -->

<section title="iSchedule Model">
  <t>
    The iSchedule design can be pictured as:
    <figure><artwork><![CDATA[
+----------+   +-----------+            +-----------+   +----------+
| Calendar |   | Calendar  |            | Calendar  |   | Calendar |
| Store    |   | Service   | iSchedule  | Service   |   | Store    |
|  or      |-->|===========|----------->|===========|-->|  or      |
| User     |   | iSchedule |            | iSchedule |   | User     |
| Agent    |   | Sender    |            | Receiver  |   | Agent    |
+----------+   +-----------+            +-----------+   +----------+
                    |                          |
                    <-------------------------->
                     DKIM Signature/Verification
]]></artwork></figure>
    When an iSchedule Sender has a scheduling message to transmit, it determines the iSchedule Receivers to which to deliver the message and sends the appropriate iSchedule message. The iSchedule Receiver verifies the authenticity and content of the iSchedule message and delivers it to the Calendar Service.
  </t>
  <t>
    The means by which a Calendar Store or User Agent instructs a Calendar Service, acting as an iSchedule Sender, to transmit scheduling messages is outside the scope of this document. A Calendar Service could provide support for a standard calendar access protocol, such as CalDAV <xref target="RFC4791"/>, <xref target="RFC6638"/> or any other protocol, to allow a Calendar User Agent to perform scheduling operations with users of other Calendar Services.
  </t>
  <t>
    Likewise, the actual processing of scheduling messages received by a
    Calendar Service, acting as an iSchedule Receiver, is also outside
    the scope of this document. Some Calendar Service implementations
    may decide to process some or all received scheduling messages, while
    other implementations may decide to leave that work to Calendar User
    Agent implementations.
  </t>
</section>

<section title="iSchedule Overview">
  <t>
    This section provides an overview of the various steps involved for iSchedule Senders and Receivers to transmit scheduling messages between Calendar Services. It references later sections describing the precise details of each step.
  </t>
  <section title="iSchedule Sender Actions">
    <t>
      A Calendar Service will generate an <xref target='RFC5546'>iTIP</xref> scheduling message for transmission. It will additionally provide details of the Originator and Recipients. The Calendar Service will "submit" the scheduling message and details to the iSchedule Sender, through a process that is outside the scope of this document.
    </t>
    <t>
      The iSchedule Sender MUST verify the authenticity of the Originator and the Originator's authorization to send the scheduling message. In particular the "ORGANIZER" iCalendar property value MUST match the Originator calendar user address. The process by which this authentication and authorization is done is outside the scope of this document.
    </t>
    <t>
      For each Recipient, the iSchedule Sender will attempt to lookup a matching iSchedule Receiver to which the iSchedule message can be sent, following the rules in <xref target="discovery"/>. After determining the iSchedule Receiver to use, the iSchedule Sender MUST check the capabilities of the iSchedule Receiver to ensure it will be able to accept the scheduling message that needs to be sent, as per <xref target="capabilities"/>.
    </t>
    <t>
      The iSchedule Sender MUST group together Recipients for whom the iSchedule Receiver is the same, so that a single scheduling message is sent for multiple Recipients, within the limits of the <xref target="max-recipients">IS:max-recipients</xref> value specified in the iSchedule Receiver's capabilities.
    </t>
    <t>
      For each group of Recipients handled by the same iSchedule Receiver, the iSchedule Sender will construct an HTTP request, as per <xref target="scheduling"/>, with the body of the HTTP request containing the iSchedule message. Note, in the case of a "VFREEBUSY" iSchedule message, the iSchedule Sender MUST ensure that iCalendar "ATTENDEE" properties in the iSchedule message match one-for-one with the Recipients listed in the HTTP request header.
    </t>
    <t>
      After constructing the HTTP request, the iSchedule Sender MUST generate a DKIM signature for the request and include a <xref target="dkim-signature.header">"DKIM-Signature"</xref> request header, as per <xref target="dkim"/>.
    </t>
    <t>
      The iSchedule Sender then sends the HTTP request to the iSchedule Receiver handling the Recipient group, and receives the HTTP response, which will be an XML document with either an IS:schedule-response or IS:error element as the root element.
    </t>
    <t>
      The iSchedule Sender aggregates the results for each Recipient group receiving an iSchedule message, and returns the resulting status information for each Recipient to the Calendar Service that generated the schedule message. The process by which this is done is outside the scope of this document.
    </t>
  </section>
  <section title="iSchedule Receiver Actions">
    <t>
      iSchedule Receivers MUST provide a capabilities document to Senders, as per <xref target="capabilities"/>.
    </t>
    <t>
      Upon receipt of an iSchedule HTTP request, the iSchedule Receiver verifies the message as per <xref target="verification"/>.
    </t>
    <t>
      Once the authenticity of the message is confirmed, the iSchedule Receiver delivers the scheduling message to the indicated recipients, collects and aggregates the delivery status for each recipient, and returns the result in the HTTP response body.
    </t>
    <t>
      In the event of a processing error related to the overall request, iSchedule Receivers MUST return an error response as per <xref target="schedule-status-codes"/>.
    </t>
  </section>
</section>

<section title="iSchedule Receiver Discovery" anchor="discovery">
  <t>
    This section describes how an iSchedule Sender can discover
    the host name, port, and the path to use
    to submit an HTTP request to an iSchedule Receiver.
  </t>
  <t>
    For each Recipient to whom a scheduling message is being sent, the iSchedule Sender will "resolve" the associated calendar user address into a domain name, as per <xref target="cu-address-resolve"/>.
  </t>
  <t>
    The iSchedule Sender then uses the extracted domain name to issue a DNS SRV query for the <xref target="srv-type">iSchedule service</xref> expected to be hosted at the domain.
  </t>

    <t>
      The result of an SRV record lookup will be a target host name and a port, as per <xref target="RFC2782"/>. An iSchedule Sender uses these to contact the iSchedule Receiver.  iSchedule Senders MUST honor the full behavior of SRV records, in particular the TTL, Priority and Weight options in the record, as well as handling multiple records being returned, as per <xref target="RFC2782"/>.
    </t>
    <t>
      Since an iSchedule Receiver is an HTTP server, an iSchedule Sender needs to supply a Request-URI in the HTTP request it makes to the iSchedule Receiver, in addition to the host name and port information. iSchedule Senders MUST use the path specified in any TXT records accompanying the SRV record (as per <xref target="TXT"/>), or in the absence of a matching TXT record, MUST use the .well-known URI (as per  <xref target="well-known"/>).
    </t>

  <section title='Resolving Calendar User Addresses' anchor="cu-address-resolve">
    <t>
      To deliver a scheduling message via the iSchedule protocol, an iSchedule Sender needs to determine which iSchedule Receiver to use for a particular recipient. Each recipient's calendar user address is specified in one or more Recipient request headers.
    </t>
    <t>
       A calendar user address as defined by iCalendar is simply a URI. This is typically a mailto URI, but could potentially be any URI type. However, only URIs containing a "host" element can be used to extract the necessary information to locate an iSchedule Receiver.
    </t>
    <t>
      To get the SRV record name to query for a given mailto URI,
      the "domain" portion of the mailto URI is extracted
      and appended to the service label "_ischedules._tcp.".
    </t>
    <t>
      Example: 
      <figure><artwork><![CDATA[
  Calendar User Address:  mailto:cyrus@example.com
  
  Query SRV Record Name: _ischedules._tcp.example.com
]]></artwork></figure>
    </t>
    <t>
      In cases where the "domain" portion of the mailto URI contains
      one or more levels of sub-domain, iSchedule Senders MAY choose to remove
      successive levels of "sub-domain" if queries for that sub-domain
      fail to return any SRV records. For example, a mailto URI with
      the full domain "host.calendar.example.com" would first trigger
      a query using the domain "host.calendar.example.com", then if
      that failed, the domain "calendar.example.com" would be tried,
      then if that failed the domain "example.com" would be tried.
    </t>
  </section>

  <section title='iSchedule SRV Service Type' anchor="srv-type">
    <t>
      This specification adds an SRV service label for use with iSchedule:
    </t>
    <t>
      <list style="hanging">
        <t hangText="ischedules:">
          Identifies an iSchedule Receiver that uses HTTP with
          transport layer security (<xref target="RFC2818"/>).
        </t>
      </list>
    </t>
    <t>
      Example: service record for iSchedule Receiver with transport layer security
      <figure><artwork>
_ischedules._tcp.example.com. IN SRV 0 1 443 ischedule.example.com.
      </artwork></figure>
    </t>
  </section>

    <section title='iSchedule Service TXT Records' anchor='TXT'>
    	<t>
    		When SRV RRs are used to advertise iSchedule services, it is also convenient to be able to specify a "context path" in the DNS to be retrieved at the same time. To enable that, this specification uses a TXT RR that follows the syntax defined in Section 6 of <xref target="RFC6763"/> and defines a "path" key for use in that record. The value of the key MUST be the actual "context path" to the corresponding service on the iSchedule Receiver.
    	</t>
    	<t>
    		A site might provide TXT records in addition to SRV records for the service. When present, iSchedule Senders MUST use the "path" value as the "context path" for the service in HTTP requests. When not present, iSchedule Senders use the ".well-known" URI approach described next.
    	</t>
		<figure>
			<preamble>
				Example: text record for service with TLS
			</preamble>
			<artwork>
_ischedules._tcp    TXT path=/ischedule
      </artwork>
		</figure>
    </section>

  <section title="iSchedule Receiver Request-URI" anchor='well-known'>
    <t>
      This specification registers a well-known URI
      <xref target="RFC5785"/>
      for the iSchedule service, namely, "ischedule"
      (see <xref target="IANA.WELL-KNOWN-URI"/>).
      iSchedule Receivers MUST support requests targeted
      at this well-known URI. iSchedule Senders MUST
      handle HTTP redirects on this well-known URI.
    </t>
  </section>
</section>

  <section title="iSchedule Receiver Capabilities"
           anchor="capabilities">
    <t>
       iSchedule Receivers supporting the features described in this document MUST allow iSchedule Senders to query their capabilities by accepting GET requests targeted at the Request-URI found during discovery (<xref target="discovery"/>). The response body for a successful GET request targeted at this URI MUST be an XML document with IS:query-result as its root element.
    </t>
    <t>
      <list>
        <t>
          Informative rationale: The GET method was favored over
          the POST method to allow iSchedule Senders to query
          capabilities with "conditional GET" requests
          (see Section 9.3 of <xref target="RFC2616"/>).
        </t>
      </list>
    </t>
    <t>
      iSchedule Receivers SHOULD use normal HTTP expiration mechanisms (as per Section 13.1.3 of <xref target="RFC2616"/>) to ensure caches do not cache the capabilities response for too long. iSchedule Senders SHOULD use normal HTTP conditional GET requests when re-checking capabilities to avoid re-transferring already cached data.
    </t>
    <t>
      iSchedule Senders SHOULD use the information in the capabilities to determine whether the iSchedule Receiver supports a version of the protocol that the iSchedule Sender can use, and if not, not issue any iSchedule requests with scheduling messages to the iSchedule Receiver. iSchedule Senders SHOULD verify that the scheduling message to be sent to the iSchedule Receiver is in line with the restrictions on scheduling messages indicated by the capabilities before sending the scheduling message.
    </t>

    <section title="Example: Querying iSchedule Receiver Capabilities"
             anchor="ISCHEDULE_RECEIVER_CAPABILITIES_EXAMPLE">
      <figure>
        <preamble>&gt;&gt; Request &lt;&lt;</preamble>
        <artwork><![CDATA[
GET /.well-known/ischedule?action=capabilities HTTP/1.1
Host: cal.example.com
]]></artwork>
      </figure>
      <figure>
        <preamble>&gt;&gt; Response &lt;&lt;</preamble>
        <artwork><![CDATA[
HTTP/1.1 200 OK
Date: Mon, 15 Dec 2008 09:32:12 GMT
Content-Type: application/xml; charset=utf-8
Content-Length: xxxx
iSchedule-Version: 1.0
iSchedule-Capabilities: 123
ETag: "afasdf-132afds"

<?xml version="1.0" encoding="utf-8" ?>
<query-result xmlns="urn:ietf:params:xml:ns:ischedule">
  <capabilities>
    <serial-number>123</serial-number>
    <versions>
      <version>1.0</version>
    </versions>
    <scheduling-messages>
      <component name="VEVENT">
        <method name="REQUEST"/>
        <method name="ADD"/>
        <method name="REPLY"/>
        <method name="CANCEL"/>
      </component>
      <component name="VTODO">
        <method name="REQUEST"/>
        <method name="ADD"/>
        <method name="REPLY"/>
        <method name="CANCEL"/>
      </component>
      <component name="VFREEBUSY">
        <method name="REQUEST"/>
      </component>
    </scheduling-messages>
    <calendar-data-types>
      <calendar-data-type
       content-type="text/calendar" version="2.0"/>
    </calendar-data-types>
    <attachments>
      <inline/>
      <external/>
    </attachments>
    <max-content-length>102400</max-content-length>
    <min-date-time>19910101T000000Z</min-date-time>
    <max-date-time>20381231T000000Z</max-date-time>
    <max-instances>150</max-instances>
    <max-recipients>250</max-recipients>
    <administrator>mailto:ischedule-admin@example.com<
    /administrator>
  </capabilities>
</query-result>
]]></artwork>
      </figure>
    </section>
  </section>

  <section title="Scheduling" anchor="scheduling">
    <t>
      This section defines how an iSchedule Sender can use the HTTP POST method to submit a scheduling message to an iSchedule Receiver. Note, this describes the HTTP request prior to generating a DKIM signature as per <xref target="dkim"/>.
    </t>

    <section anchor="schedule" title="POST Method">
      <t>
        The POST method submits a scheduling message to one or more Recipients by targeting the request at the Request-URI of an iSchedule Receiver.  The request body of a POST method MUST contain a scheduling message (i.e., an iCalendar object that follows the iTIP semantic).
      </t>
      <t>
        The submitted scheduling message will be delivered to the Recipients, with status information about per-recipient delivery returned in the HTTP response. However, when the scheduling message is a request for free-busy time, the iSchedule Receiver will immediately execute the free-busy request for the Recipients and return per-recipient iCalendar data in the response for successful free-busy queries.
      </t>
      <t>
        Every POST request MUST include the <xref target="IANA_HTTP_ISCHEDULE_VERSION">"iSchedule-Version"</xref> general
        header.
      </t>
      <t>
        Every POST request SHOULD include the <xref target="IANA_HTTP_ISCHEDULE_MESSAGE_ID">"iSchedule-Message-ID"</xref> request
        header.
      </t>
      <t>
        Every POST request MUST include the "Cache-Control" HTTP general header containing the cache-directives "no-cache" and "no-transform" to prevent intermediary caches from caching or transforming responses.
      </t>
      <t>
        Every POST request MUST include a single <xref target="IANA_HTTP_ORIGINATOR">"Originator"</xref> request header that specifies the calendar user address of the Originator of the scheduling message. The value of the "Originator" request header MUST match the value of the "ORGANIZER" iCalendar property or one of the specified "ATTENDEE" iCalendar properties in the scheduling message, depending on the specified "METHOD" iCalendar property value as summarized in the following table:
      </t>
      <texttable anchor="originator_table">
        <ttcol>Method</ttcol>  <ttcol>Originator Requirement</ttcol>
        <c>PUBLISH</c>         <c>MUST match ORGANIZER</c>
        <c>REQUEST</c>         <c>MUST match ORGANIZER (see Note 1)</c>
        <c>REPLY</c>           <c>MUST match ATTENDEE</c>
        <c>ADD</c>             <c>MUST match ORGANIZER</c>
        <c>CANCEL</c>          <c>MUST match ORGANIZER</c>
        <c>REFRESH</c>         <c>MUST match ATTENDEE</c>
        <c>COUNTER</c>         <c>MUST match ATTENDEE</c>
        <c>DECLINECOUNTER</c>  <c>MUST match ORGANIZER</c>
      </texttable>
      <t>
        Note 1: iTIP does allow an Attendee to forward a "METHOD:REQUEST" scheduling message to another attendee. However, due to complexity of managing the authorization of such requests, this specification does not allow scheduling message forwarding.
      </t>
      <t>
        Every POST request MUST include one or more <xref target="IANA_HTTP_RECIPIENT">"Recipient"</xref> request headers. The value of this header is a list of one or more calendar user addresses and corresponds to the set of calendar users who will have the scheduling message delivered to them. The value of the "Recipient" request header MUST match the value of the "ORGANIZER" iCalendar property or one of the specified "ATTENDEE" iCalendar properties in the scheduling message, depending on the specified "METHOD" iCalendar property value as summarized in the following table:
      </t>
      <texttable anchor="recipient_table">
        <ttcol>Method</ttcol>  <ttcol>Recipient Requirement</ttcol>
        <c>PUBLISH</c>         <c>None (see Note 1)</c>
        <c>REQUEST</c>         <c>MUST match ATTENDEE (see Note 1)</c>
        <c>REPLY</c>           <c>MUST match ORGANIZER</c>
        <c>ADD</c>             <c>MUST match ATTENDEE (see Note 1)</c>
        <c>CANCEL</c>          <c>MUST match ATTENDEE (see Note 1)</c>
        <c>REFRESH</c>         <c>MUST match ORGANIZER</c>
        <c>COUNTER</c>         <c>MUST match ORGANIZER</c>
        <c>DECLINECOUNTER</c>  <c>MUST match ATTENDEE</c>
      </texttable>
      <t>
        Note 1: iTIP does allow an Organizer to send scheduling message to calendar users who are not listed as Attendees, e.g., to inform other calendar users of an event taking place. However, due to complexity of managing the authorization of such requests, this specification does not allow such scheduling messages.
      </t>
      <t>
        The Content-Type general header MUST include the type parameters "component" and "method" defined in <xref target="RFC5545"/>. The value of the "component" MUST correspond to the iCalendar component type (e.g., "VEVENT") specified in the scheduling message.  The value of the "method" parameter MUST be the same as the value of the "METHOD" iCalendar property in the scheduling message.
      </t>

      <section anchor="schedule-response" title="Schedule Response">
        <t>
          A POST request may deliver a scheduling message to one or
          more calendar users specified in the Recipient request header.
          Since the behavior of each recipient may vary, it is useful
          to get response status information for each recipient in the
          overall POST response. This specification defines a new
          XML response to convey multiple recipient status.  
        </t>
        <t>
          A response to a POST method that indicates status for one or more recipients MUST be an XML document with IS:schedule-response as its root element. This MUST contain one or more response elements for each recipient, with each of those containing elements that indicate which recipient they correspond to, the scheduling status of the request for that recipient, any error codes and an optional description.
        </t>
        <t>
          In the case of a free-busy request, the response elements
          can also contain calendar-data elements which contain
          free busy information (e.g., an iCalendar VFREEBUSY component)
          indicating the busy state of the corresponding recipient,
          assuming that the free-busy request for that recipient succeeded.
        </t>
        <t>
          Every POST response MUST include the "Cache-Control" HTTP general header containing the cache-directives "no-cache" and "no-transform" to prevent intermediary caches from caching or transforming responses.
        </t>

      </section>

      <section anchor="schedule-status-codes" title="Failed Schedule Response">
        <t>
          When there is an overall, as opposed to per-recipient, failure of the POST request, the iSchedule Receiver SHOULD return an XML document with IS:error as its root element. The child elements of the IS:error element are used to indicate an error code and description, primarily meant for service administrators.
        </t>
        <t>
          The following XML elements are error codes which can be used within an IS:error element to represent errors:
<?rfc compact="no" ?>
          <list>
            <t>
              IS:version-not-supported: The POST request was either missing an "iSchedule-Version" header, or had an "iSchedule-Version" header value for a version not supported by the iSchedule Receiver, as advertised in the IS:versions capability.
            </t>
            <t>
              IS:invalid-calendar-data-type: The resource submitted in
              the POST request was not a supported media type (i.e.
              text/calendar) for scheduling or free-busy messages;
            </t>
            <t>
              IS:invalid-calendar-data: The resource submitted in the
              POST request was not valid data for the media type being
              specified;
            </t>
            <t>
              IS:invalid-scheduling-message: The resource submitted in the POST request did not obey all restrictions specified for the POST request, violating the IS:scheduling-message capability element, or the requirements of iTIP;
            </t>
            <t>
              IS:verification-failed: The POST request failed DKIM verification;
            </t>
            <t>
              IS:originator-missing: The POST request did not include an
              "Originator" request header specifying the calendar
              user address of the Originator of the scheduling message.
            </t>
            <t>
              IS:too-many-originators: The POST request contained more than one
              "Originator" request header.
            </t>
            <t>
              IS:originator-invalid: The "Originator" header in the POST request did not include a valid calendar user address for the Originator of the scheduling message.
            </t>
            <t>
              IS:originator-denied: The calendar user identified by the "Originator" header in the POST request is not allowed to use this service.
            </t>
            <t>
              IS:recipient-missing: The POST request did not include
              one or more valid "Recipient" request headers specifying the
              calendar user address of users to whom the scheduling message
              will be delivered.
            </t>
            <t>
              IS:recipient-mismatch: The POST request did not include
              "Recipient" request header values which exactly match the list of "ATTENDEE" property values in a "VFREEBUSY" request.
            </t>
            <t>
              IS:max-recipients: The POST request had too many calendar user addresses specified in "Recipient" request headers, violating the IS:max-recipients capability.
            </t>
            <t>
              IS:attachment-type-not-supported: The scheduling message submitted in the POST request had iCalendar data with "ATTACH" properties whose value type is not supported, violating the IS:attachments capability.
            </t>
            <t>
              IS:max-content-length: The scheduling message submitted in the POST request had iCalendar data violating the IS:max-content-length capability.
            </t>
            <t>
              IS:min-date-time: The scheduling message submitted in the POST request had iCalendar data violating the IS:min-date-time capability.
            </t>
            <t>
              IS:max-date-time: The scheduling message submitted in the POST request had iCalendar data violating the IS:max-date-time capability.
            </t>
            <t>
              IS:max-instances: The scheduling message submitted in the POST request had iCalendar data violating the IS:max-instances capability.
            </t>
          </list>
<?rfc compact="yes" ?>
        </t>
        <t>The following are examples of response codes one would expect to be
           used for this method. Note, however, that unless explicitly
           prohibited any 2/3/4/5xx series response code may be used in a
           response. Typically a 403 response code would be used when an XML document with an IS:error element as its root is also returned.</t>
           <t>
<?rfc compact="no" ?>
			<list>
				<t>
					200 (OK) - The command succeeded.
				</t>
				<t>
					400 (Bad Request) - The Sender has provided an invalid scheduling message, or invalid iSchedule request headers.
				</t>
				<t>
					403 (Forbidden) - The Sender cannot submit a scheduling message to the specified Request-URI.
				</t>
				<t>
					404 (Not Found) - The URL in the Request-URI was not present.
				</t>
				<t>
					507 (Insufficient Storage) - The server did not have sufficient space to record the scheduling message.
				</t>
			</list>
<?rfc compact="yes" ?>
           </t>
      </section><!-- schedule-status-codes -->

    </section>
  </section>

  <section title="iSchedule Domain-Level Authentication" anchor="dkim">
    <t>
      iSchedule uses and extends the mechanism defined by
      DomainKeys Identified Mail (DKIM) <xref target="RFC6376"/>.
      DKIM defines a domain-level digital signature authentication
      framework for email, using public-key cryptography, with
      the domain name service (DNS) as one possible key server technology.
    </t>
    <t>
      This specification extends the applicability of DKIM to the HTTP protocol, with a specific "profile" for use with iSchedule messages. Additionally, DKIM support is REQUIRED for all iSchedule requests, and iSchedule Receivers MUST reject any messages which cannot be verified according to the requirements of DKIM. This is a much stronger requirement than the email use of DKIM, which has to deal with legacy systems.
    </t>
    <t>
      iSchedule Senders MUST only send iSchedule messages for Originators whose authenticity they have verified. iSchedule Receivers that verify a DKIM signature on an iSchedule request can assume that the iSchedule Sender is not only taking responsibility for sending the message, but has also verified the authenticity of the Originator. As such, iSchedule Receivers can reliably use the Originator information to perform their own authorization based on that value. e.g., the Calendar Service to which an iSchedule Receiver delivers a scheduling message, can apply "filtering" rules to such messages based on the guarantee that the Originator calendar user address has been verified at both the iSchedule Sender and Receiver ends.
    </t>
    <t>
      This specification uses the syntactic elements of <xref target="RFC6376">DKIM</xref>, but modified for use with HTTP. Where definitions of syntactic elements of <xref target="RFC6376">DKIM</xref> are applicable to HTTP, they will be used by reference. In cases where the HTTP definition is different, the same ABNF rule name will be used, but the value modified as appropriate.
    </t>
    <t>
      The following sections describe how the DomainKeys Identified
      Mail (DKIM) service can fit into a scheduling service.
    </t>

    <section title="Signature Content">
      <t>
        The following HTTP headers MUST be included in the
        signature of a message:
        <list style="symbols">
          <t>Content-Type</t>
          <t>iSchedule-Version</t>
          <t>Originator</t>
          <t>Recipient</t>
        </list>
      </t>
      <t>
        The iSchedule Receiver MUST verify that the above HTTP headers are included in the signature.
      </t>
      
      <t>
        iSchedule Senders and Receivers might use <xref target="RFC2617">HTTP authentication</xref> in requests, though the process through which credentials are managed are out of scope for this document. If HTTP authentication is used, then the "Authorization" HTTP request header MUST be included in the signature of the message. 
      </t>
      
      <t>
        The following HTTP headers, if present, SHOULD be included in the
        signature of a message:
        <list style="symbols">
          <t>iSchedule-Message-ID</t>
          <t>User-Agent</t>
        </list>
      </t>
      <t>
        To allow iSchedule messages to transit via HTTP intermediaries,
        hop-by-hop headers, such as the following HTTP/1.1 headers
        MUST NOT be included in the signature of a message:
        <list style="symbols">
          <t>Cache-Control</t>
          <t>Connection</t>
          <t>Host</t>
          <t>Keep-Alive</t>
          <t>Proxy-Authenticate</t>
          <t>Proxy-Authorization</t>
          <t>TE</t>
          <t>Trailer</t>
          <t>Transfer-Encoding</t>
          <t>Upgrade</t>
        </list>
      </t>
      <t>
        The "Content-Length" header MUST NOT be signed, since the DKIM signature is generated prior to transfer encoding, and the header value represents the length after any transfer encodings have been applied. 
      </t>
      
      <t>
        iSchedule Senders MAY include an "x=" DKIM signature tag in the "DKIM-Signature" header to indicate an expiration time for the signature. When doing so, the "x=" value SHOULD be set to at least 1 minute ahead of the "t=" DKIM signature tag value, to account for processing time between the iSchedule Sender and Receiver.
      </t>
    </section>

    <section title="Canonicalization">
      <t>
        iSchedule Senders and Receivers MUST use the "simple" body canonicalization algorithm defined in Section 3.4.3 of <xref target="RFC6376">DKIM</xref> to canonicalize the HTTP request message body used for the body hash computation. The iSchedule Sender MUST calculate the body hash prior to any HTTP transfer encodings being applied to the request message body. The iSchedule Receiver MUST calculate the body hash after any HTTP transfer encoding have been removed from the request message body.
      </t>
      <t>
        iSchedule Senders and Receivers MUST use the new "ischedule-relaxed" header canonicalization algorithm defined below to canonicalize the HTTP request headers used for the signature computation.
      </t>
      <section title='The "ischedule-relaxed"  Header Canonicalization Algorithm'>
        <t>The "ischedule-relaxed" header canonicalization algorithm is used to canonicalize HTTP header fields where multiple headers fields with the same name might be combined by an HTTP intermediary. The following steps MUST be applied in order:
        <list style='numbers'>
          <t>Convert all header field names (not the header field values) to lowercase. For example, convert "SUBJect: AbC" to "subject: AbC".</t>
          <t>Unfold all header field continuation lines; in particular, lines with terminators embedded in continued header field values (that is, CRLF sequences followed by LWS) MUST be interpreted without the CRLF. Implementations MUST NOT remove the CRLF at the end of the header field value.</t>
          <t>Combine multiple header fields with the same field name into one one header field value; specifically, append each subsequent field value to the combined field value in order, separated by a comma. For example, combine "recipient:mailto:cyrus@example.com,mailto:mike@example.com" and "recipient:mailto:ken@example.org" into "recipient:mailto:cyrus@example.com,mailto:mike@example.com,mailto:ken@example.org"</t>
          <t>Convert all sequences of one or more LWS characters to a single SP character. LWS characters here include those before and after a line folding boundary.</t>
          <t>Delete all WS characters at the end of each unfolded header field value.</t>
          <t>Delete any LWS characters remaining before and after the colon separating the header field name from the header field value. The colon separator MUST be retained.</t>
          <t>Delete any LWS characters remaining before and after any commas in the header field value.</t>
        </list>
        </t>
        <t>
          Since this canonicalization algorithm "collapses" multiple HTTP header fields into a single header field, the h= tag used in the "DKIM-Signature" request header MUST contain only a single value for each different header field name being signed.
        </t>
      </section>
    </section>

    <section title="Key Management" anchor="keys">
      <section title="DNS-based Public Key Management" anchor="dkim-q-dns">
        <t>
          Section 3.6.2 of <xref target="RFC6376">DKIM</xref> defines a DNS-based key-binding for public key retrieval. iSchedule Senders and Receivers MUST support this method of public key retrieval. To allow public keys to be restricted to just an iSchedule service, this specification defines a new service type "ischedule" to constrain the use of a key to iSchedule:
          <list>
          <t>ABNF:</t>
          <t><figure><artwork><![CDATA[
key-s-tag-type /= "ischedule"
]]></artwork></figure>
          </t>
          </list>
        </t>
      </section>
      <section title="HTTP-based Public Key Management" anchor="dkim-q-http">
        <t>
          This specification defines a new HTTP-based public key management method for use with <xref target="RFC6376">DKIM</xref>. The "DKIM-Signature" header "q" tag value associated with this method is "http/well-known":
          <list>
          <t>ABNF:</t>
          <t><figure><artwork><![CDATA[
sig-q-tag-method /= "http/well-known"
]]></artwork></figure>
          </t>
          </list>
        </t>
        <t>
          Key lookup first involves retrieving an SRV record that will provide the HTTP server host name and port to use for actual key retrieval. Then the key retrieval is done via an HTTP GET request on a .well-known resource. This new key management approach off-loads the key handling from DNS to an HTTP server, only requiring the DNS administrator to provide the SRV records for authorized HTTP key management servers.
        </t>
  <section title='SRV Service Type' anchor="pk-srv-type">
    <t>
      This specification adds one SRV service label for use with HTTP key management:
    </t>
    <t>
      <list style="hanging">
        <t hangText="domainkey_lookup:">
          Identifies an HTTP server from which public keys for DKIM signatures can be retrieved. The HTTP server MUST support transport layer security (<xref target="RFC2818"/>).
        </t>
      </list>
    </t>
    <t>
      The iSchedule Receiver determines the appropriate SRV name using the "d=" DKIM signature tag value in the "DKIM-signature" header being verified:
      <figure><artwork><![CDATA[
_domainkey_lookup._tcp.{d}.

; {d} is the d= value from the "DKIM-Signature" header.
]]></artwork></figure>
    </t>
    
  </section>
  <section title="Well-known Request-URI" anchor='pk-well-known'>
        <t>
          This specification registers a well-known URI <xref target="RFC5785"/> for the DKIM HTTP-based public key management information, "domainkey" (see <xref target="IANA.WELL-KNOWN-URI-DKIM"/>). To retrieve information about the public key used to sign an iSchedule message, the iSchedule Sender constructs a URI of the form:
          <figure><artwork><![CDATA[
https://{srv-host}:{srv-port}/.well-known/domainkey/{d}/{s}

; {srv-host} is the host name from the _domainkey_lookup SRV record
; {srv-port} is the port number from the _domainkey_lookup SRV record
; {d} is the d= value from the "DKIM-Signature" header.
; {s} is the s= value from the "DKIM-Signature" header.
]]></artwork></figure>
        </t>
        <t>
          Documents retrieved from the well-known URI MUST be text documents with a media-type of "text/plain". The format of the text document is:
          <figure><artwork><![CDATA[
key-doc = 1*(tag-list CRLF)
; tag-list is defined in Section 3.2 of <xref target="RFC6376"/>
]]></artwork></figure>
          where tag-list is the unstructured textual form defined in Section 3.6.1. of <xref target="RFC6376"/> - i.e., the same data that would be placed in a DNS TXT record for DNS-based public key management. Note that this allows information for multiple keys to be returned for each {domain-name}, {selector} pair. iSchedule Receivers must use HTTP+TLS (https:) to retrieve the public key information document, and follow the certificate-verification process specified in <xref target='RFC6125'/>.
        </t>
      </section>
      <section title="Example Lookup Procedure">
        <t>
          Given the following (partial) DKIM-Signature header, the steps below describe how a public key is retrieved from the HTTP pubic key management system.
          <figure><artwork><![CDATA[
DKIM-Signature:q=http/well-known;d=cal.example.com;s=isched; ...
]]></artwork></figure>
        <list style="numbers">
          <t>The iSchedule Receiver first does an SRV record lookup for "_domainkey_lookup._tcp.cal.example.com", and gets back the following example record:
      <figure><artwork><![CDATA[
_domainkey_lookup._tcp.cal.example.com. IN SRV 0 1 443 is.example.com.
]]></artwork></figure>
          </t>
          <t>
            the iSchedule Receiver then makes an HTTP request:
          <figure><artwork><![CDATA[
https://is.example.com:443/.well-known/domainkey/cal.example.com/isched
]]></artwork></figure>
          </t>
          <t>
            It parses the returned document to determine the appropriate public key to use to verify the DKIM signature.
          </t>
        </list>
        </t>
      </section>
      </section>

      <section title="Private Exchange Public Key Management" anchor="dkim-q-private">
        <t>
          This specification defines a new public key management method for use with <xref target="RFC6376">DKIM</xref>. This method is used to indicate that the associated public key has been transferred to the recipient through some (unspecified, secure) private exchange. The "DKIM-Signature" header "q" tag value associated with this method is "private-exchange":
          <list>
          <t>ABNF:</t>
          <t><figure><artwork><![CDATA[
sig-q-tag-method /= "private-exchange"
]]></artwork></figure>
          </t>
          </list>
        </t>
        <t>
          This method is useful, for example, in situations where an "internal" deployment of iSchedule is being used to connect different calendar systems within an organization. It avoids the need to setup other public key discovery mechanisms when a simple, secure public key exchange can be accomplished between the system administrators.
        </t>
      </section>
    </section>

    <section title="Verification Requirements" anchor="verification">
      <t>iSchedule Receivers MUST verify the follow details:
        <list>
          <t>The HTTP request contains an "iSchedule-Version" header that matches a version of the iSchedule protocol that the iSchedule Receiver supports.</t>
          <t>Only one Originator HTTP request header is present in the request and it matches the appropriate iCalendar property as per <xref target="originator_table"/>.</t>
          <t>One or more Recipient HTTP request headers are present in the request and they match the appropriate iCalendar properties as per <xref target="recipient_table"/>.</t>
          <t>The "DKIM-Signature" header contains valid information and the signature and body hash values can be verified correctly. Note, for the t= value in the "DKIM-Signature", iSchedule Receivers SHOULD accept values that are no more than 5 minutes in the future, to account for possible clock skew between iSchedule Sender and Receiver.</t>
        </list>
      </t>
      <t>
        If the signature cannot be verified, the iSchedule Receiver MUST reject the iSchedule message outright.
      </t>
      <t>
        If the signature is valid, then iSchedule Receivers have a guarantee that the iSchedule Sender has verified the authenticity of the Originator and determined they are authorized to send the enclosed iTIP message. This allows iSchedule Receivers to use the Originator calendar user address value for access control purposes.
      </t>
    </section>
    
    <section title="Authorized Third-Party Signatures">
      <t>
        The third-party signature authorization protocol defined in <xref target="RFC6541"/> MAY be used by iSchedule Senders and Receivers.
      </t>
    </section>

  </section>

  <section title="HTTP Headers" anchor="http.headers">
    <t>
      This section defines the syntax and semantics of additional
      HTTP/1.1 header fields.
    </t>
    <t>
      The header's syntax uses the optional whitespace (OWS) rule
      defined as follows:
      <figure><artwork><![CDATA[
   OWS = *( [ CRLF ] WSP )
]]></artwork></figure>
    </t>
    <section title="DKIM-Signature Request Header" anchor="dkim-signature.header">
      <t>
        The "DKIM-Signature" request header MUST be specified by the
        iSchedule Sender on all scheduling requests to specify all
        of the signature and key-fetching data.
      </t>
      <figure><artwork><![CDATA[
   DKIM-Signature   = "DKIM-Signature" ":" OWS DKIM-Signature-v
   DKIM-Signature-v = tag-list
   ; tag-list is defined in Section 3.2 of <xref target="RFC6376"/>
]]></artwork></figure>
    </section>

    <section title="iSchedule-Version General Header" anchor="ischedule-version.header">
      <t>
        The "iSchedule-Version" general header field MUST be specified by
        the iSchedule Sender on requests, and by the iSchedule Receiver
        on responses. It SHOULD be included in a response to any "OPTIONS *" HTTP request targeting the iSchedule Receiver, or any "OPTIONS" request on a resource supporting the iSchedule behaviors described in this specification (e.g., the .well-known resource or any resource that .well-known redirects to).
      </t>
      <figure><artwork><![CDATA[
   iSchedule-Version      = "iSchedule-Version" ":" OWS
                            iSchedule-Version-v
   iSchedule-Version-v    = iSchedule-Version-elem
                            *( OWS "," OWS iSchedule-Version-elem )
   iSchedule-Version-elem =  1*DIGIT "." 1*DIGIT
]]></artwork></figure>
    </section>


    <section title="iSchedule-Capabilities Response Header" anchor="ischedule-capabilities.header">
      <t>
        The "iSchedule-Capabilities" response header field MUST be specified by the iSchedule Receiver on all responses. iSchedule Senders SHOULD cache this value and use it to detect a change in the iSchedule Receiver capabilities that cause the iSchedule Sender to reload capabilities. The value of this header is maintained by the iSchedule Receiver as described in <xref target="capabilities_serial_number"/>.
      </t>
      <figure><artwork><![CDATA[
   iSchedule-Capabilities = "iSchedule-Capabilities" ":" OWS 1*DIGIT
]]></artwork></figure>
    </section>


    <section title="iSchedule-Message-ID Request Header" anchor="ischedule-message-id.header">
      <t>
        The "iSchedule-Message-ID" request header field SHOULD be specified by the iSchedule Sender on requests. This header provides a unique identifier that refers to the specific iSchedule request in which it is included.  The uniqueness of this identifier is guaranteed by the iSchedule Sender that generates it.  This identifier is intended to be machine readable and not necessarily meaningful to humans.
      </t>
      <figure><artwork><![CDATA[
   iSchedule-Message-ID   = "iSchedule-Message-ID" ":" OWS token
]]></artwork></figure>
    </section>


    <section title="Originator Request Header" anchor="originator.header">
      <t>
        The "Originator" request header value is a URI which specifies the
        calendar user address of the originator of the scheduling message.
        Note that the absoluteURI rule is defined in
        <xref target="RFC3986"/>.
        <figure><artwork><![CDATA[
   Originator   = "Originator" ":" OWS Originator-v
   Originator-v = absoluteURI
]]></artwork></figure>
      </t>
    </section>

    <section title="Recipient Request Header" anchor="recipient.header">
      <t>
        The "Recipient" request header value is a URI which specifies the
        calendar user address of the recipients to which the POST method
        should deliver the submitted scheduling message.
        Note that the absoluteURI rule is defined in
        <xref target="RFC3986"/>.
      </t>
      <figure>
        <artwork><![CDATA[
   Recipient      = "Recipient" ":" OWS Recipient-v
   Recipient-v    = Recipient-elem *( OWS "," OWS Recipient-elem )
   Recipient-elem = absoluteURI
]]></artwork>
      </figure>
    </section>

  </section><!-- http.headers -->

  <section title="XML Element Definitions">
    <section anchor="schedule_response_element" title="schedule-response XML Element">
      <t>
<?rfc compact="no" ?>
        <list style="hanging">
          <t hangText="Name:">schedule-response</t>
          <t hangText="Namespace:">urn:ietf:params:xml:ns:ischedule</t>
          <t hangText="Purpose:">Contains the set of responses for a POST
                                 method request.</t>
          <t hangText="Description:">
            See <xref target="schedule-response"/>.
          </t>
          <t hangText="Definition:">
            <figure><artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT schedule-response (response*)>
]]></artwork>
            </figure>
          </t>
        </list>
<?rfc compact="yes" ?>
      </t>
      <section anchor="response_element" title="response XML Element">
        <t>
<?rfc compact="no" ?>
          <list style="hanging">
            <t hangText="Name:">response</t>
            <t hangText="Namespace:">urn:ietf:params:xml:ns:ischedule</t>
            <t hangText="Purpose:">Contains a single response for a POST
                                   method request.</t>
            <t hangText="Description:">
              See <xref target="schedule-response"/>.
            </t>
            <t hangText="Definition:">
              <figure>
                <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT response (recipient,
                   request-status,
                   calendar-data?,
                   error?,
                   response-description?)>
]]></artwork>
              </figure>
            </t>
          </list>
<?rfc compact="no" ?>
        </t>
        <section anchor="recipient_element" title="recipient XML Element">
          <t>
<?rfc compact="no" ?>
            <list style="hanging">
              <t hangText="Name:">recipient</t>
              <t hangText="Namespace:">urn:ietf:params:xml:ns:ischedule</t>
              <t hangText="Purpose:">The calendar user address (recipient header
                                     value) that the enclosing response for a
                                     POST method request is for.</t>
              <t hangText="Description:">
                See <xref target="schedule-response"/>.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT recipient (#PCDATA)>
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc compact="yes" ?>
          </t>
        </section>
        <section anchor="response_status_element" title="request-status XML Element">
          <t>
<?rfc compact="no" ?>
            <list style="hanging">
              <t hangText="Name:">request-status</t>
              <t hangText="Namespace:">urn:ietf:params:xml:ns:ischedule</t>
              <t hangText="Purpose:">The iTIP REQUEST-STATUS property value for
                                     this response.</t>
              <t hangText="Description:">
                See <xref target="schedule-response"/>.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT request-status (#PCDATA)>
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc compact="yes" ?>
          </t>
        </section>

        <section title="calendar-data XML Element">
          <t>
<?rfc compact="no" ?>
            <list style="hanging">
              <t hangText="Name:">calendar-data</t>
              <t hangText="Namespace:">urn:ietf:params:xml:ns:ischedule</t>
              <t hangText="Purpose:">An iCalendar object in a response to a
                                     search for busy time information.</t>
              <t hangText="Description:">
                See <xref target="schedule-response"/>.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT calendar-data (#PCDATA)>
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc compact="yes" ?>
          </t>
        </section>

        <section title="error XML Element">
          <t>
<?rfc compact="no" ?>
            <list style="hanging">
              <t hangText="Name:">error</t>
              <t hangText="Namespace:">urn:ietf:params:xml:ns:ischedule</t>
              <t hangText="Purpose:">Error responses sometimes need more
                information to indicate what went wrong.</t>
              <t hangText="Description:">
                See <xref target="schedule-response"/>.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT error ANY>
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc compact="yes" ?>
          </t>
        </section>
        <section title="response-description XML Element">
          <t>
<?rfc compact="no" ?>
            <list style="hanging">
              <t hangText="Name:">response-description</t>
              <t hangText="Namespace:">urn:ietf:params:xml:ns:ischedule</t>
              <t hangText="Purpose:">Contains information about a status
                                    response</t>
              <t hangText="Description:">
                See <xref target="schedule-response"/>.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT response-description (#PCDATA)>
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc compact="yes" ?>
          </t>
        </section>
      </section>
    </section>
    <section title="query-result XML Element">
      <t>
<?rfc subcompact="no" ?>
        <list style="hanging">
          <t hangText="Name:">
            query-result
          </t>
          <t hangText="Namespace:">
            urn:ietf:params:xml:ns:ischedule
          </t>
          <t hangText="Purpose:">
            Contains result of a query request.
          </t>
          <t hangText="Description:">
            A generic container for the result of a query request, such as
            a query of the capabilities of an iSchedule Receiver.
          </t>
          <t hangText="Definition:">
            <figure>
              <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT query-result (capabilities)>
]]></artwork>
            </figure>
          </t>
        </list>
<?rfc subcompact="yes" ?>
      </t>

      <section title="capabilities XML Element">
        <t>
<?rfc subcompact="no" ?>
          <list style="hanging">
            <t hangText="Name:">
              capabilities
            </t>
            <t hangText="Namespace:">
              urn:ietf:params:xml:ns:ischedule
            </t>
            <t hangText="Purpose:">
              Contains iSchedule Receiver capabilities.
            </t>
            <t hangText="Description:">
              The capabilities element contains capabilities
              of the iSchedule Receiver.
            </t>
            <t hangText="Definition:">
              <figure>
                <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT capabilities (
    serial-number,
    versions,
    scheduling-messages,
    calendar-data-types,
    attachments,
    max-content-length,
    min-date-time,
    max-date-time,
    max-instances,
    max-recipients,
    administrator) >
]]></artwork>
              </figure>
            </t>
          </list>
<?rfc subcompact="yes" ?>
        </t>

        <section title="serial-number XML Element" anchor="capabilities_serial_number">
          <t>
<?rfc subcompact="no" ?>
            <list style="hanging">
              <t hangText="Name:">
                serial-number
              </t>
              <t hangText="Namespace:">
                urn:ietf:params:xml:ns:ischedule
              </t>
              <t hangText="Purpose:">
                Identifies the version of the capabilities information.
              </t>
              <t hangText="Description:">
                This is a numeric value maintained by the iSchedule Receiver. The value is incremented by the iSchedule Receiver each time there has been a substantive change to the capabilities that would require an iSchedule Sender to reload the capabilities to adjust its behavior. The value of this element MUST be returned by the iSchedule Receiver in all HTTP requests via the <xref target="ischedule-capabilities.header">"iSchedule-Capabilities" response header</xref>. This allows iSchedule Senders to detect changes to the iSchedule Receiver's capabilities during the normal course of making requests, without the need to poll the iSchedule Receiver for such changes.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT serial-number (#PCDATA)>
<!-- PCDATA value: a numeric value (positive integer) -->
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc subcompact="yes" ?>
          </t>
        </section><!-- serial-number -->
        <section title="versions XML Element">
          <t>
<?rfc subcompact="no" ?>
            <list style="hanging">
              <t hangText="Name:">
                versions
              </t>
              <t hangText="Namespace:">
                urn:ietf:params:xml:ns:ischedule
              </t>
              <t hangText="Purpose:">
                Identifies the iSchedule versions supported by the
                iSchedule Receiver.
              </t>
              <t hangText="Description:">
                An iSchedule Receiver MAY advertise support for multiple versions of the iSchedule protocol. iSchedule Senders check this value to ensure they can send iSchedule messages with a matching version.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT versions (version)+>
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc subcompact="yes" ?>
          </t>
          <section title="version XML Element">
            <t>
  <?rfc subcompact="no" ?>
              <list style="hanging">
                <t hangText="Name:">
                  version
                </t>
                <t hangText="Namespace:">
                  urn:ietf:params:xml:ns:ischedule
                </t>
                <t hangText="Purpose:">
                  Identifies an iSchedule protocol version.
                </t>
                <t hangText="Definition:">
                  <figure>
                    <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT version (#PCDATA)>
<!-- PCDATA value: version number -->
]]></artwork>
                  </figure>
                </t>
              </list>
  <?rfc subcompact="yes" ?>
            </t>
          </section><!-- version -->
        </section><!-- versions -->

        <section title="scheduling-messages XML Element">
          <t>
<?rfc subcompact="no" ?>
            <list style="hanging">
              <t hangText="Name:">
                scheduling-messages
              </t>
              <t hangText="Namespace:">
                urn:ietf:params:xml:ns:ischedule
              </t>
              <t hangText="Purpose:">
                Identifies the type of supported scheduling messages.
              </t>
              <t hangText="Description:">
                An iSchedule Receiver advertises which iCalendar component types it will accept for iTIP messages sent to it. In addition, for each component, it can specify the allowed iTIP "METHOD" property values.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT scheduling-messages (component)+>
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc subcompact="yes" ?>
          </t>
          <section title="component XML Element">
            <t>
<?rfc subcompact="no" ?>
              <list style="hanging">
                <t hangText="Name:">
                  component
                </t>
                <t hangText="Namespace:">
                  urn:ietf:params:xml:ns:ischedule
                </t>
                <t hangText="Purpose:">
                  Identifies a calendar component type.
                </t>
                <t hangText="Description:">
                  Used to specify a supported iCalendar component type for scheduling messages. If a IS:method child element is not present, then any iTIP "METHOD" property value can be used in iTIP messages sent to the iSchedule Receiver. If one or more IS:method elements are present, then those indicate the allowed set of iTIP "METHOD" property values.
                </t>
                <t hangText="Definition:">
                  <figure>
                    <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT component (method)*>

<!ATTLIST component name CDATA #REQUIRED>
<!-- name value: a calendar component name -->
]]></artwork>
                  </figure>
                </t>
              </list>
<?rfc subcompact="yes" ?>
            </t>
            <section title="method XML Element">
              <t>
<?rfc subcompact="no" ?>
                <list style="hanging">
                  <t hangText="Name:">
                    method
                  </t>
                  <t hangText="Namespace:">
                    urn:ietf:params:xml:ns:ischedule
                  </t>
                  <t hangText="Purpose:">
                    Identifies an iCalendar method type.
                  </t>
                  <t hangText="Description:">
                    See IS:component.
                  </t>
                  <t hangText="Definition:">
                    <figure>
                      <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT method EMPTY>

<!ATTLIST method name CDATA #REQUIRED>
<!-- name value: a method type -->
]]></artwork>
                    </figure>
                  </t>
                </list>
<?rfc subcompact="yes" ?>
              </t>
            </section><!-- method -->
          </section><!-- component -->
        </section><!-- scheduling-messages -->

        <section title="calendar-data-types XML Element">
          <t>
<?rfc subcompact="no" ?>
            <list style="hanging">
              <t hangText="Name:">
                calendar-data-types
              </t>
              <t hangText="Namespace:">
                urn:ietf:params:xml:ns:ischedule
              </t>
              <t hangText="Purpose:">
                Identifies what formats of iCalendar data are acceptable.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT calendar-data-types (calendar-data-type)+>
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc subcompact="yes" ?>
          </t>
          <section title="calendar-data-type XML Element">
            <t>
<?rfc subcompact="no" ?>
              <list style="hanging">
                <t hangText="Name:">
                  calendar-data-type
                </t>
                <t hangText="Namespace:">
                  urn:ietf:params:xml:ns:ischedule
                </t>
                <t hangText="Purpose:">
                  Identifies a supported media type and version for iTIP messages.
                </t>
                <t hangText="Definition:">
                  <figure>
                    <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT calendar-data-type EMPTY>

<!ATTLIST calendar-data-type content-type CDATA "text/calendar"
                             version CDATA "2.0">
<!-- content-type value: a MIME media type -->
<!-- version value: a version string -->
]]></artwork>
                  </figure>
                </t>
              </list>
<?rfc subcompact="yes" ?>
            </t>
          </section><!-- calendar-data-type -->
        </section><!-- calendar-data-types -->
        <section title="attachments XML Element">
          <t>
<?rfc subcompact="no" ?>
            <list style="hanging">
              <t hangText="Name:">
                attachments 
              </t>
              <t hangText="Namespace:">
                urn:ietf:params:xml:ns:ischedule
              </t>
              <t hangText="Purpose:">
                Identifies the attachment values supported.
              </t>
              <t hangText="Description:">
                iSchedule Receivers might restrict what form of attachments are allowed in iTIP messages that are sent to it, for performance, or security reasons. In iCalendar data, attachments can either be specified using "inline" data in the form of a base64 encoded property value, or "external" data in the form of a URI property value. With this capability, an iSchedule Receiver can specify which of "inline" or "external" values it will accept in iTIP messages. See <xref target="security_attachments"/> for additional details.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT attachments (inline?, external?)>
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc subcompact="yes" ?>
          </t>
          <section title="inline XML Element">
            <t>
<?rfc subcompact="no" ?>
              <list style="hanging">
                <t hangText="Name:">
                  inline
                </t>
                <t hangText="Namespace:">
                  urn:ietf:params:xml:ns:ischedule
                </t>
                <t hangText="Purpose:">
                  Identifies "inline" attachments as a supported attachment value.
                </t>
                <t hangText="Definition:">
                  <figure>
                    <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT inline EMPTY>
]]></artwork>
                  </figure>
                </t>
              </list>
<?rfc subcompact="yes" ?>
            </t>
          </section><!-- inline -->
          <section title="external XML Element">
            <t>
<?rfc subcompact="no" ?>
              <list style="hanging">
                <t hangText="Name:">
                  external
                </t>
                <t hangText="Namespace:">
                  urn:ietf:params:xml:ns:ischedule
                </t>
                <t hangText="Purpose:">
                  Identifies "external" attachments as a supported attachment value.
                </t>
                <t hangText="Definition:">
                  <figure>
                    <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT external EMPTY>
]]></artwork>
                  </figure>
                </t>
              </list>
<?rfc subcompact="yes" ?>
            </t>
          </section><!-- external -->
        </section><!-- attachments -->
        <section title="max-content-length XML Element">
          <t>
<?rfc subcompact="no" ?>
            <list style="hanging">
              <t hangText="Name:">
                max-content-length
              </t>
              <t hangText="Namespace:">
                urn:ietf:params:xml:ns:ischedule
              </t>
              <t hangText="Purpose:">
                Identifies the maximum size allowed for a scheduling
                message in octets.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT max-content-length (#PCDATA)>
<!-- PCDATA value: a numeric value (positive integer) -->
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc subcompact="yes" ?>
          </t>
        </section><!-- max-content-length -->
        <section title="min-date-time XML Element">
          <t>
<?rfc subcompact="no" ?>
            <list style="hanging">
              <t hangText="Name:">
                min-date-time
              </t>
              <t hangText="Namespace:">
                urn:ietf:params:xml:ns:ischedule
              </t>
              <t hangText="Purpose:">
                A DATE-TIME value indicating the earliest date and
                time in UTC that the iSchedule Receiver is willing to accept for any DATE
                or DATE-TIME value in a scheduling message.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT min-date-time (#PCDATA)>
<!-- PCDATA value: an iCalendar format DATE-TIME value in UTC -->
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc subcompact="yes" ?>
          </t>
        </section><!-- min-date-time -->
        <section title="max-date-time XML Element">
          <t>
<?rfc subcompact="no" ?>
            <list style="hanging">
              <t hangText="Name:">
                max-date-time
              </t>
              <t hangText="Namespace:">
                urn:ietf:params:xml:ns:ischedule
              </t>
              <t hangText="Purpose:">
                A DATE-TIME value indicating the latest date and
                time in UTC that the iSchedule Receiver is willing to accept for any DATE
                or DATE-TIME value in a scheduling message.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT max-date-time (#PCDATA)>
<!-- PCDATA value: an iCalendar format DATE-TIME value in UTC -->
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc subcompact="yes" ?>
          </t>
        </section><!-- max-date-time -->
        <section title="max-instances XML Element">
          <t>
<?rfc subcompact="no" ?>
            <list style="hanging">
              <t hangText="Name:">
                max-instances
              </t>
              <t hangText="Namespace:">
                urn:ietf:params:xml:ns:ischedule
              </t>
              <t hangText="Purpose:">
                The maximum number of recurrence instances
                allowed in a scheduling message.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT max-instances (#PCDATA)>
<!-- PCDATA value: a numeric value (positive integer) -->
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc subcompact="yes" ?>
          </t>
        </section><!-- max-instances -->
        <section title="max-recipients XML Element" anchor="max-recipients">
          <t>
<?rfc subcompact="no" ?>
            <list style="hanging">
              <t hangText="Name:">
                max-recipients
              </t>
              <t hangText="Namespace:">
                urn:ietf:params:xml:ns:ischedule
              </t>
              <t hangText="Purpose:">
                The maximum number of recipients allowed
                for a scheduling message.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT max-recipients (#PCDATA)>
<!-- PCDATA value: a numeric value (positive integer) -->
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc subcompact="yes" ?>
          </t>
        </section><!-- max-recipients -->
        <section title="administrator XML Element">
          <t>
<?rfc subcompact="no" ?>
            <list style="hanging">
              <t hangText="Name:">
                administrator
              </t>
              <t hangText="Namespace:">
                urn:ietf:params:xml:ns:ischedule
              </t>
              <t hangText="Purpose:">
                Provides contact information for the administrator
                of the iSchedule Receiver.
              </t>
              <t hangText="Definition:">
                <figure>
                  <artwork type="application/xml-dtd"><![CDATA[
<!ELEMENT administrator (#PCDATA)>
<!-- PCDATA value: URI to contact administrator -->
]]></artwork>
                </figure>
              </t>
            </list>
<?rfc subcompact="yes" ?>
          </t>
        </section><!-- administrator -->
      </section><!-- capabilities -->
    </section><!-- query-result -->
  </section>

  <section title="Security Considerations">
    <t>
      The process of scheduling involves the sending and receiving of
      scheduling messages. As a result, the security problems related
      to messaging in general are relevant here. In particular the
      authenticity of the scheduling messages needs to be verified.
    </t>
    <t>
      Potential attacks described in the security considerations of
      DKIM <xref target="RFC6376"/> are also applicable to iSchedule.
    </t>
    <section title="Privacy">
      <t>
        iSchedule Senders and iSchedule Receivers MUST use an
        HTTP connection protected with TLS <xref target="RFC5246"/>
        as defined in <xref target="RFC2818"/> for all transactions.
      </t>
    </section>

    <section title="Authentication">
      <t>
        iSchedule uses and extends the mechanism defined by
        DomainKeys Identified Mail (DKIM) <xref target="RFC6376"/>.
        DKIM defines a domain-level digital signature authentication
        framework for email, using public-key cryptography, with
        the domain name service as its key server technology.
      </t>
    </section>

    <section title="DNS Considerations">
      <t>
        DNS security issues are addressed by DNSSEC
        <xref target="RFC4033"/>.
      </t>
    </section>

    <section title="Attachment Considerations" anchor="security_attachments">
      <t>
        iCalendar data can include "inline" attachment data in the form of a base64-encoded "ATTACH" property value. iSchedule Receivers MUST take care when allowing "inline" attachments in scheduling messages as such data might contain malicious content, and SHOULD use some form of content scanner on the attachment data to verify its safety (e.g., a content scanner used for email messages). In addition, "inline" attachment data is likely to be much larger than the actual calendar-related data in a scheduling message, and thus could adversely affect the performance of an iSchedule Receiver processing it. If an iSchedule Receiver allows "inline" attachment data, it MUST apply a limit on the size of acceptable scheduling messages to prevent possible denial-of-service attacks using large "inline" attachment data. In general, it is best for iSchedule Receivers to simply disable the ability for scheduling messages to contain "inline" attachment data, and instead rely solely on "external" attachments in the form of URI attachment values.
      </t>
    </section>

  </section>

  <section title="IANA Considerations" anchor="IANA">
    <section title="Namespace Registration" anchor="IANA_NS">
      <t>
        This specification registers a new URN to identify a new
        XML namespace as per <xref target="RFC3688"/>.
      </t>
      <section title="iSchedule Namespace Registration"
        anchor="IANA_NS_ISCHEDULE">  
        <t>
          Registration request for the iSchedule namespace:
        </t>  
        <t>
          URI: urn:ietf:params:xml:ns:ischedule
        </t>  
        <t>
          Registrant Contact: See the "Authors' Addresses" section of   
          this document.
        </t>  
        <t>
          XML: None. Namespace URIs do not represent an XML   
          specification.
        </t>  
      </section>
    </section>
    <section title="HTTP Headers Registration" anchor="IANA_HTTP">
      <t>
        This specification registers new headers for use with
        HTTP as per <xref target="RFC3864"/>.
      </t>
      <section title="DKIM-Signature Request Header Registration"
        anchor="IANA_HTTP_DKIM_SIGNATURE">
        <t>
          Header field name: DKIM-Signature
        </t>
        <t>
          Applicable protocol: http
        </t>
        <t>
          Status: standard
        </t>
        <t>
          Author/Change controller: IETF
        </t>
        <t>
          Specification document(s): this specification
        </t>
        <t>
          Related information: none
        </t>
      </section>
      <section title="iSchedule-Version General Header Registration"
        anchor="IANA_HTTP_ISCHEDULE_VERSION">
        <t>
          Header field name: iSchedule-Version
        </t>
        <t>
          Applicable protocol: http
        </t>
        <t>
          Status: standard
        </t>
        <t>
          Author/Change controller: IETF
        </t>
        <t>
          Specification document(s): this specification
        </t>
        <t>
          Related information: none
        </t>
      </section>
      <section title="iSchedule-Capabilities Response Header Registration"
        anchor="IANA_HTTP_ISCHEDULE_CAPABILITIES">
        <t>
          Header field name: iSchedule-Capabilities
        </t>
        <t>
          Applicable protocol: http
        </t>
        <t>
          Status: standard
        </t>
        <t>
          Author/Change controller: IETF
        </t>
        <t>
          Specification document(s): this specification
        </t>
        <t>
          Related information: none
        </t>
      </section>
      <section title="iSchedule-Message-ID Request Header Registration"
        anchor="IANA_HTTP_ISCHEDULE_MESSAGE_ID">
        <t>
          Header field name: iSchedule-Message-ID
        </t>
        <t>
          Applicable protocol: http
        </t>
        <t>
          Status: standard
        </t>
        <t>
          Author/Change controller: IETF
        </t>
        <t>
          Specification document(s): this specification
        </t>
        <t>
          Related information: none
        </t>
      </section>
      <section title="Originator Request Header Registration"
        anchor="IANA_HTTP_ORIGINATOR">
        <t>
          Header field name: Originator
        </t>
        <t>
          Applicable protocol: http
        </t>
        <t>
          Status: standard
        </t>
        <t>
          Author/Change controller: IETF
        </t>
        <t>
          Specification document(s): this specification
        </t>
        <t>
          Related information: none
        </t>
      </section>
      <section title="Recipient Request Header Registration"
        anchor="IANA_HTTP_RECIPIENT">
        <t>
          Header field name: Recipient
        </t>
        <t>
          Applicable protocol: http
        </t>
        <t>
          Status: standard
        </t>
        <t>
          Author/Change controller: IETF
        </t>
        <t>
          Specification document(s): this specification
        </t>
        <t>
          Related information: none
        </t>
      </section>
    </section>

    <section title="Well-Known URI Registration">
      <t>
        This specification registers a new well-known URI
        as per <xref target="RFC5785"/>.
      </t>
      <section title="iSchedule Well-Known URI Registration" anchor="IANA.WELL-KNOWN-URI">
        <t>
          URI suffix: ischedule
        </t>
        <t>
          Change controller:  IETF.
        </t>
        <t>
          Specification document(s): this specification
        </t>
        <t>
          Related information: none
        </t>
      </section>
      <section title="DKIM Well-Known URI Registration" anchor="IANA.WELL-KNOWN-URI-DKIM">
        <t>
          URI suffix: domainkey
        </t>
        <t>
          Change controller:  IETF.
        </t>
        <t>
          Specification document(s): this specification
        </t>
        <t>
          Related information: none
        </t>
      </section>
    </section>

    <section title="DKIM Parameters Registration">
      <!-- See: http://www.iana.org/assignments/dkim-parameters/dkim-parameters.xhtml -->

      <section title="DKIM-Signature Query Method Registry">
        <t>
          This specification registers two new query mechanisms that can be used in DKIM-Signature fields. The following values should be added to the DKIM-Signature Query Method Registry established in Section 7.3 of <xref target="RFC6376"/>:
        </t>
        <texttable>
          <ttcol>Type</ttcol>
          <ttcol>Option</ttcol>
          <ttcol>Reference</ttcol>
          <ttcol>Status</ttcol>

          <c>http</c>
          <c>well-known</c>
          <c>(this document <xref target="dkim-q-http"/>)</c>
          <c>active</c>

          <c>private-exchange</c>
          <c></c>
          <c>(this document <xref target="dkim-q-private"/>)</c>
          <c>active</c>

        </texttable>
      </section>

      <section title="DKIM Service Type Registration">
        <t>
          This specification registers a new DKIM service type to specify
          that a given public key MUST only be used to verify messages
          of iSchedule services.
          The following value should be added to the DKIM Service Type
          Registry established in Section 7.8 of <xref target="RFC6376"/>:
        </t>
        <texttable>
          <ttcol>Type</ttcol>
          <ttcol>Reference</ttcol>
          <ttcol>Status</ttcol>

          <c>ischedule</c>
          <c>(this document <xref target="dkim-q-dns"/>)</c>
          <c>active</c>

        </texttable>
      </section>
    </section>

  </section><!-- IANA -->

  <section title="Acknowledgments">
    <t>
      The authors would like to thank the following individuals for
      contributing their ideas and support for writing this specification:
      Mattias Amnefelt,
      Mike Douglass,
      Tomas Hnetila,
      Ciny Joy,
      Barry Leiba,
      Ken Murchison,
      Simon Pilette,
      Arnaud Quillaud,
      Simon Vaillancourt, and
      Wilfredo Sanchez Vega.
    </t>
    <t>
      The authors would also like to thank CalConnect,
      The Calendaring and Scheduling Consortium,
      for advice with this specification, and for organizing
      interoperability testing events to help refine it.
    </t>
  </section>
</middle>
<back>

  <references title="Normative References">
    &rfc2119;
    &rfc2616;
    &rfc2617;
    &rfc2782;
    &rfc2818;
    &rfc3688;
    &rfc3986;
    &rfc4033;
    &rfc5234;
    &rfc5246;
    &rfc5545;
    &rfc5546;
    &rfc5785;
    &rfc6125;
    &rfc6376;
    &rfc6763;
    &W3C.REC-xml-20081126;
  </references>

  <references title="Informative References">
    &rfc3864;
    <!-- &rfc4398; -->
    &rfc4791;
    &rfc5585;
    &rfc6047;
    &rfc6638;
    &rfc6541;
  </references>

  <section title="Example Scheduling Transactions" anchor="examples">
    <t>
      This section describes some example scheduling transactions that
      give a general idea of how scheduling is carried out between an
      iSchedule Sender and an iSchedule Receiver.
    </t>
    <section anchor="schedule-example" title="Example: Simple Meeting Invitation">
      <t>
        In the following example, the iSchedule Sender requests the iSchedule
        Receiver to deliver a meeting invitation (scheduling REQUEST)
        to the calendar user mailto:cyrus@example.org.
        The response indicates that delivery of the scheduling message
        was successful.
      </t>
      <figure>
        <preamble>&gt;&gt; Request &lt;&lt;</preamble>
        <artwork><![CDATA[
POST /.well-known/ischedule HTTP/1.1
DKIM-Signature: a=rsa-sha256; d=example.com; s=jupiter;
 c=ischedule-relaxed/simple; q=dns/txt:http/well-known;
 t=1268069852; x=1283918400;
 h=Originator:Recipient:Content-Type:
 iSchedule-Version:iSchedule-Message-ID;
 bh=XXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxx;
 b=XXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxx
Host: cal.example.org
iSchedule-Version: 1.0
iSchedule-Message-ID: 798F00BB-5B45-4634-B083-0D0CD3A2BB39
Originator: mailto:bernard@example.com
Recipient: mailto:cyrus@example.org
Cache-Control: no-cache, no-transform
Content-Type: text/calendar; component=VEVENT; method=REQUEST
Content-Length: xxxx

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//EN
METHOD:REQUEST
BEGIN:VEVENT
DTSTAMP:20040901T200200Z
ORGANIZER:mailto:bernard@example.com
DTSTART:20040902T130000Z
DTEND:20040902T140000Z
SUMMARY:Design meeting
UID:34222-232@example.com
ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR;CUTYPE=IND
 IVIDUAL;CN=Bernard Desruisseaux:mailto:bernard@
 example.com
ATTENDEE;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;ROLE=RE
 Q-PARTICIPANT;CUTYPE=INDIVIDUAL;CN=Cyrus Daboo:
 mailto:cyrus@example.org
END:VEVENT
END:VCALENDAR
]]>
        </artwork>
      </figure>
      <figure>
        <preamble>&gt;&gt; Response &lt;&lt;</preamble>
        <artwork><![CDATA[
HTTP/1.1 200 OK
Date: Thu, 02 Sep 2004 16:53:32 GMT
Content-Type: application/xml; charset=utf-8
Content-Length: xxxx
Cache-Control: no-cache, no-transform
iSchedule-Version: 1.0
iSchedule-Capabilities: 123

<?xml version="1.0" encoding="utf-8" ?>
<schedule-response xmlns="urn:ietf:params:xml:ns:ischedule">
  <response>
    <recipient>mailto:cyrus@example.org</recipient>
    <request-status>2.0;Success</request-status>
    <response-description>Delivered to recipient<
    /response-description>
  </response>
</schedule-response>
]]>
        </artwork>
      </figure>
    </section>

    <section anchor="schedule-fb-example" title="Example: Search for Busy Time Information">
      <t>
        In the following example, the iSchedule Sender requests the iSchedule Receiver to determine the busy information of the calendar users mailto:cyrus@example.org and mailto:mike@example.org, over the time range specified by the scheduling message sent in the request. The response includes VFREEBUSY components with the busy time for one calendar user, and an error for the other calendar user.
      </t>
      <figure>
        <preamble>&gt;&gt; Request &lt;&lt;</preamble>
        <artwork><![CDATA[
POST /.well-known/ischedule HTTP/1.1
DKIM-Signature: a=rsa-sha256; d=example.com; s=jupiter;
 c=ischedule-relaxed/simple; q=dns/txt:http/well-known;
 t=1268069852; x=1283918400;
 h=Originator:Recipient:Content-Type:
 iSchedule-Version:iSchedule-Message-ID;
 bh=XXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxx;
 b=XXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxx
Host: cal.example.org
iSchedule-Version: 1.0
iSchedule-Message-ID: A98ADF24-9490-4F01-81C8-FE924F86A9FD
Originator: mailto:bernard@example.com
Recipient: mailto:cyrus@example.org
Recipient: mailto:mike@example.org
Cache-Control: no-cache, no-transform
Content-Type: text/calendar; component=VFREEBUSY; method=REQUEST
Content-Length: xxxx

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//EN
METHOD:REQUEST
BEGIN:VFREEBUSY
DTSTAMP:20040901T200200Z
ORGANIZER:mailto:bernard@example.com
DTSTART:20040902T000000Z
DTEND:20040903T000000Z
UID:34222-232@example.com
ATTENDEE;CN=Cyrus Daboo:mailto:cyrus@example.org
ATTENDEE;CN=Mike Douglass:mailto:mike@example.org
END:VFREEBUSY
END:VCALENDAR
]]>
        </artwork>
      </figure>
      <figure>
        <preamble>&gt;&gt; Response &lt;&lt;</preamble>
        <artwork><![CDATA[
HTTP/1.1 200 OK
Date: Thu, 02 Sep 2004 16:53:32 GMT
Content-Type: application/xml; charset=utf-8
Content-Length: xxxx
Cache-Control: no-cache, no-transform
iSchedule-Version: 1.0
iSchedule-Capabilities: 123

<?xml version="1.0" encoding="utf-8" ?>
<schedule-response xmlns="urn:ietf:params:xml:ns:ischedule">
  <response>
    <recipient>mailto:cyrus@example.org</recipient>
    <request-status>2.0;Success</request-status>
    <calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//EN
METHOD:REPLY
BEGIN:VFREEBUSY
DTSTAMP:20040901T200200Z
ORGANIZER:mailto:bernard@example.com
DTSTART:20040902T000000Z
DTEND:20040903T000000Z
UID:34222-232@example.com
ATTENDEE;CN=Cyrus Daboo:mailto:cyrus@example.org
FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:20040902T000000Z/
 20040902T090000Z,20040902T170000Z/20040903T000000Z
FREEBUSY;FBTYPE=BUSY:20040902T120000Z/20040902T130000Z
END:VFREEBUSY
END:VCALENDAR
    </calendar-data>
  </response>
  <response>
    <recipient>mailto:mike@example.org</recipient>
    <request-status>5.3;No scheduling support for user<
    /request-status>
    <response-description>Unknown calendar user<
    /response-description>
  </response>
</schedule-response>
]]>
        </artwork>
      </figure>
    </section>

    <section anchor="schedule-example-task" title="Example: Failed Request">
      <t>
        In the following example, the iSchedule Sender requests the iSchedule
        Sender to deliver a task assignment (scheduling REQUEST) to
        the calendar user mailto:cyrus@example.org.
        For some reason the verification of the request fails as is indicated
        by the error response.
      </t>
      <figure>
        <preamble>&gt;&gt; Request &lt;&lt;</preamble>
        <artwork><![CDATA[
POST /.well-known/ischedule HTTP/1.1
DKIM-Signature: a=rsa-sha256; d=example.com; s=jupiter;
 c=ischedule-relaxed/simple; q=dns/txt:http/well-known;
 t=1268069852; x=1283918400;
 h=Originator:Recipient:Content-Type:
 iSchedule-Version:iSchedule-Message-ID;
 bh=XXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxx;
 b=XXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxxXXXxxx
Host: cal.example.org
iSchedule-Version: 1.0
Originator: mailto:bernard@example.com
Recipient: mailto:cyrus@example.org
Cache-Control: no-cache, no-transform
Content-Type: text/calendar; component=VTODO; method=REQUEST
Content-Length: xxxx

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
METHOD:REQUEST
BEGIN:VTODO
DTSTAMP:20040901T200200Z
ORGANIZER:mailto:bernard@example.com
DUE:20070505
SUMMARY:Review Internet-Draft
UID:34222-456@example.com
ATTENDEE;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;ROLE=RE
 Q-PARTICIPANT;CUTYPE=INDIVIDUAL;CN=Cyrus Daboo:
 mailto:cyrus@example.org
END:VEVENT
END:VCALENDAR
]]>
        </artwork>
      </figure>
      <figure>
        <preamble>&gt;&gt; Response &lt;&lt;</preamble>
        <artwork><![CDATA[
HTTP/1.1 403 FORBIDDEN
Date: Thu, 02 Sep 2004 16:53:32 GMT
Content-Type: application/xml; charset=utf-8
Content-Length: xxxx
iSchedule-Version: 1.0
iSchedule-Capabilities: 123

<?xml version="1.0" encoding="utf-8" ?>
<error xmlns="urn:ietf:params:xml:ns:ischedule">
  <verification-failed />
  <response-description>Unable to verify request<
  /response-description>
</error>
]]>
        </artwork>
      </figure>
    </section>
  </section>

  <section title="Change Log (to be removed by RFC Editor prior to publication)">
    <section title="Changes in -05">
      <t>
        <list style="letters">
          <t>
            Fixed missing Recipient header in example.
          </t>
          <t>
            Added statements about what happens when a signature is or is not valid.
          </t>
          <t>
            Removed _ischedule SRV record type as we only support HTTPS.
          </t>
          <t>
            Removed text about adding an extra Recipient header as we no longer need that.
          </t>
        </list>
      </t>
    </section>
    <section title="Changes in -04">
      <t>
        <list style="letters">
          <t>
            Added some addition error codes to match MUST requirements.
          </t>
          <t>
            Free busy example now shows a failed calendar user response.
          </t>
          <t>
            Fixed capabilities response example to add method elements for VTODO and VFREEBUSY.
          </t>
          <t>
            More details added to XML element definitions.
          </t>
        </list>
      </t>
    </section>
    <section title="Changes in -03">
      <t>
        <list style="letters">
          <t>
            Removed http= tag from DKIM header.
          </t>
          <t>
            Updated lists of must and must not sign headers.
          </t>
          <t>
            Stated that Recipient list must match ATTENDEE list for VFREEBUSY requests.
          </t>
          <t>
            Recommend 5 minute skew for t=.
          </t>
          <t>
            Added serial-number to capabilities and iSchedule-Capabilities response header.
          </t>
          <t>
            Added "ischedule-relaxed" header canonicalization.
          </t>
          <t>
            Fixed examples.
          </t>
        </list>
      </t>
    </section>
    <section title="Changes in -02">
      <t>
        <list style="letters">
          <t>
            Major structural changes as well as addition of new sections, including an Overview.
          </t>
          <t>
            Changed capabilities XML schema.
          </t>
          <t>
            XML error elements are now named for the actual error as opposed to WebDAV style pre-conditions.
          </t>
          <t>
            Removed intermediary support and iSchedule-Via header.
          </t>
          <t>
            Added TXT path= lookup to accompany SRV lookup.
          </t>
          <t>
            Added http/well-known public key lookup mechanism.
          </t>
          <t>
            Added iSchedule-Message-ID header.
          </t>
          <t>
            Provided suggested values for t= and x= to cope with clock skew and processing time issues.
          </t>
          <t>
            Indicated that iSchedule-Version header can be returned in OPTIONS responses.
          </t>
          <t>
            Clarified that Attendee list for VFREEBUSY has to be the same as the Recipient list.
          </t>
        </list>
      </t>
    </section>
    <section title="Changes in -01">
      <t>
        <list style="letters">
          <t>
            Introduced use of DKIM for calendaring and scheduling services.
          </t>
          <t>
            The XML elements "supported-calendar-data" and "calendar-data"
            were renamed to "supported-calendar-data-type" and
            "calendar-data-type" respectively to avoid confusion with
            the "calendar-data" XML element being used in the
            "response" XML element.
          </t>
          <t>
            The "recipient" XML element was redefined to accept
            (#PCDATA) instead of an "href" XML element.
          </t>
          <t>
            The grammar of new HTTP headers is now using the ABNF
            syntax defined in <xref target="RFC5234"/>.
          </t>
          <t>
            Fixed various typos.
          </t>
        </list>
      </t>
    </section>
  </section>
</back>
</rfc>
