SEQUENCE:0
RRULE:FREQ=MONTHLY;BYMONTHDAY=1;UNTIL=19980901T210000Z
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE:Mailto:B@example.com
ATTENDEE:Mailto:C@example.com
ATTENDEE:Mailto:D@example.com
DESCRIPTION:IETF-C&S Conference Call
CLASS:PUBLIC
SUMMARY:IETF Calendaring Working Group Meeting
DTSTART:19970601T210000Z
DTEND:19970601T220000Z
LOCATION:Conference Call
DTSTAMP:19970526T083000Z
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
The event request below is to change the time of a specific instance.
This changes the July 1st instance to July 3rd.
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:guid-1@host1com
RECURRENCE-ID:19970701T210000Z
SEQUENCE:1
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE:Mailto:B@example.com
ATTENDEE:Mailto:C@example.com
ATTENDEE:Mailto:D@example.com
DESCRIPTION:IETF-C&S Conference Call
CLASS:PUBLIC
SUMMARY:IETF Calendaring Working Group Meeting
DTSTART:19970703T210000Z
DTEND:19970703T220000Z
LOCATION:Conference Call
DTSTAMP:19970626T093000Z
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
4.4.3 Cancel an Instance
In this example the "Organizer" of a recurring event deletes the
August 1st instance.
BEGIN:VCALENDAR
METHOD:CANCEL
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:guid-1@host1.com
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE:Mailto:B@example.com
ATTENDEE:Mailto:C@example.com
ATTENDEE:Mailto:D@example.com
RECURRENCE-ID:19970801T210000Z
SEQUENCE:2
STATUS:CANCELLED
DTSTAMP:19970721T093000Z
END:VEVENT
END:VCALENDAR
4.4.4 Cancel Recurring Event
In this example the "Organizer" wishes to cancel the entire recurring
event and any exceptions.
BEGIN:VCALENDAR
METHOD:CANCEL
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:guid-1@host1.com
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE:Mailto:B@example.com
ATTENDEE:Mailto:C@example.com
ATTENDEE:Mailto:D@example.com
DTSTAMP:19970721T103000Z
STATUS:CANCELLED
SEQUENCE:3
END:VEVENT
END:VCALENDAR
4.4.5 Change All Future Instances
This example changes the meeting location from a conference call to
Seattle starting September 1 and extends to all future instances.
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:guid-1@host1.com
RECURRENCE-ID;THISANDFUTURE:19970901T210000Z
SEQUENCE:3
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE;RSVP=TRUE:Mailto:B@example.com
ATTENDEE;RSVP=TRUE:Mailto:C@example.com
ATTENDEE;RSVP=TRUE:Mailto:D@example.com
DESCRIPTION:IETF-C&S Discussion
CLASS:PUBLIC
SUMMARY:IETF Calendaring Working Group Meeting
DTSTART:19970901T210000Z
DTEND:19970901T220000Z
LOCATION:Building 32, Microsoft, Seattle, WA
DTSTAMP:19970526T083000Z
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
4.4.6 Add A New Instance To A Recurring Event
This example adds a one-time additional instance to the recurring
event. "Organizer" adds a second July meeting on the 15th.
BEGIN:VCALENDAR
METHOD:ADD
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:123456789@host1.com
SEQUENCE:4
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE;RSVP=TRUE:Mailto:B@example.com
ATTENDEE;RSVP=TRUE:Mailto:C@example.com
ATTENDEE;RSVP=TRUE:Mailto:D@example.com
DESCRIPTION:IETF-C&S Conference Call
CLASS:PUBLIC
SUMMARY:IETF Calendaring Working Group Meeting
DTSTART:19970715T210000Z
DTEND:19970715T220000Z
LOCATION:Conference Call
DTSTAMP:19970629T093000Z
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
4.4.7 Add A New Series of Instances To A Recurring Event
The scenario for this example involves an ongoing meeting, originally
set up to occur every Tuesday. The "Organizer" later decides that
the meetings need to be on Tuesdays and Thursdays, but does not want
to reschedule the entire meeting or lose any of the per-instance
information already collected.
The original event:
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:123456789@host1.com
SEQUENCE:0
RRULE:WKST=SU;BYDAY=TU;FREQ=WEEKLY
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE;RSVP=TRUE:Mailto:B@example.com
SUMMARY:Review Accounts
DTSTART:19980303T210000Z
DTEND:19980303T220000Z
LOCATION:The White Room
DTSTAMP:19980301T093000Z
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
Assume that many other updates happen to this event and that a lot of
instance-specific information exists in the recurring series. The
"SEQUENCE" property value is 7 for the next update. Now the
"Organizer" wants to add Thursdays to the event:
BEGIN:VCALENDAR
METHOD:ADD
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:123456789@host1.com
SEQUENCE:7
RRULE:WKST=SU;BYDAY=TH;FREQ=WEEKLY
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE;RSVP=TRUE:Mailto:B@example.com
SUMMARY:Review Accounts
DTSTART:19980303T210000Z
DTEND:19980303T220000Z
DTSTAMP:19980303T193000Z
LOCATION:The Usual conference room
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
Alternatively, if the "Organizer" is not concerned with per-instance
updates, the entire event can be rescheduled using a "REQUEST". This
is done by using the "UID" of the event to reschedule and including
the modified "RRULE". Note, that since this is an entire rescheduling
of the event, any instance-specific information will be lost.
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:123456789@host1.com
SEQUENCE:7
RRULE:WKST=SU;BYDAY=TU,TH;FREQ=WEEKLY
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE;RSVP=TRUE:Mailto:B@example.com
SUMMARY:Review Accounts
DTSTART:19980303T210000Z
DTEND:19980303T220000Z
DTSTAMP:19980303T193000Z
LOCATION:The White Room
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
The next series of examples illustrate how an "Organizer" would
respond to a "REFRESH" submitted by an "Attendee" after a series of
instance-specific modifications. To convey all instance-specific
changes, the "Organizer" must provide the latest event description
and the relevant instances. The first three examples show the history
including the initial "VEVENT" request and subsequent instance
changes and finally the "REFRESH".
Original Request:
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:123456789@host1.com
SEQUENCE:0
RDATE:19980304T180000Z
RDATE:19980311T180000Z
RDATE:19980318T180000Z
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE;RSVP=TRUE:Mailto:B@example.com
SUMMARY:Review Accounts
DTSTART:19980304T180000Z
DTEND:19980304T200000Z
DTSTAMP:19980303T193000Z
LOCATION:Conference Room A
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
Organizer changes 2nd instance Location and Time:
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:123456789@host1.com
SEQUENCE:1
RECURRENCE-ID:19980311T180000Z
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE;RSVP=TRUE:Mailto:B@example.com
SUMMARY:Review Accounts
DTSTART:19980311T160000Z
DTEND:19980311T180000Z
DTSTAMP:19980306T193000Z
LOCATION:The Small conference room
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
Organizer adds a 4th instance of the meeting using the "ADD" method
BEGIN:VCALENDAR
METHOD:ADD
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:123456789@host1.com
SEQUENCE:2
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE;RSVP=TRUE:Mailto:B@example.com
SUMMARY:Review Accounts
DTSTART:19980315T180000Z
DTEND:19980315T200000Z
DTSTAMP:19980307T193000Z
LOCATION:Conference Room A
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
If "B" requests a "REFRESH", "A" responds with the following to
capture all instance-specific data. In this case both the initial
request and an additional "VEVENT" that specifies the instance-
specific data are included. Because these are both of the same type
(they are both "VEVENTS"), they can be conveyed in the same iCalendar
object.
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:123456789@host1.com
SEQUENCE:2
RDATE:19980304T180000Z
RDATE:19980311T160000Z
RDATE:19980315T180000Z
Error! Bookmark not defined.
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE;RSVP=TRUE:Mailto:B@example.com
SUMMARY:Review Accounts
DTSTART:19980304T180000Z
DTEND:19980304T200000Z
DTSTAMP:19980303T193000Z
LOCATION:Conference Room A
STATUS:CONFIRMED
END:VEVENT
BEGIN:VEVENT
Error! Bookmark not defined.
SEQUENCE:2
RECURRENCE-ID:19980311T160000Z
Error! Bookmark not defined.
ATTENDEE;ROLE=CHAIR;Error! Bookmark not defined.
ATTENDEE;Error! Bookmark not defined.
SUMMARY:Review Accounts
DTSTART:19980311T160000Z
DTEND:19980304T180000Z
DTSTAMP:19980306T193000Z
LOCATION:The Small conference room
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
4.4.8 Counter An Instance Of A Recurring Event
In this example one of the "Attendees" counters the "DTSTART"
property of the proposed second July meeting.
BEGIN:VCALENDAR
METHOD:COUNTER
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:guid-1@host1.com
RECURRENCE-ID:19970715T210000Z
SEQUENCE:4
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;RSVP=TRUE:Mailto:A@example.com
ATTENDEE;RSVP=TRUE:Mailto:B@example.com
ATTENDEE;RSVP=TRUE:Mailto:C@example.com
ATTENDEE;RSVP=TRUE:Mailto:D@example.com
DESCRIPTION:IETF-C&S Conference Call
CLASS:PUBLIC
SUMMARY:IETF Calendaring Working Group Meeting
DTSTART:19970715T220000Z
DTEND:19970715T230000Z
LOCATION:Conference Call
COMMENT:May we bump this by an hour? I have a conflict
DTSTAMP:19970629T094000Z
END:VEVENT
END:VCALENDAR
4.4.9 Error Reply To A Request
The following example illustrates a scenario where a meeting is
proposed containing an unsupported property and a bad property.
Original Request
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:guid-1@host1.com
SEQUENCE:0
RRULE:FREQ=MONTHLY;BYMONTHDAY=1
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
ATTENDEE;RSVP=TRUE:Mailto:B@example.com
ATTENDEE;RSVP=TRUE:Mailto:C@example.com
ATTENDEE;RSVP=TRUE:Mailto:D@example.com
DESCRIPTION:IETF-C&S Conference Call
CLASS:PUBLIC
SUMMARY:IETF Calendaring Working Group Meeting
DTSTART:19970601T210000Z
DTEND:19970601T220000Z
DTSTAMP:19970602T094000Z
LOCATION:Conference Call
STATUS:CONFIRMED
FOO:BAR
END:VEVENT
END:VCALENDAR
Response from "B" to indicate that RRULE is not supported and an
unrecognized property was encountered
BEGIN:VCALENDAR
PRODID:-//RDU Software//NONSGML HandCal//EN
METHOD:REPLY
VERSION:2.0
BEGIN:VEVENT
ORGANIZER:Mailto:A@example.com
ATTENDEE:Mailto:B@example.com
REQUEST-STATUS:2.8;Repeating event ignored. Scheduled as a single
event;RRULE
REQUEST-STATUS:3.0;Invalid Property Name;FOO
UID:guid-1@host1.com
SEQUENCE:0
DTSTAMP:19970603T094000Z
END:VEVENT
END:VCALENDAR
4.5 Group To-do Examples
Individual "A" creates a group task in which individuals "A", "B",
"C" and "D" will participate. Individual "B" confirms acceptance of
the task. Individual "C" declines the task. Individual "D"
tentatively accepts the task. The following table illustrates the
sequence of messages that would be exchanged between these
individuals. Individual "A" then issues a "REQUEST" method to obtain
the status of the to-do from each participant. The response indicates
the individual "Attendee's" completion status. The table below
illustrates the message flow.
+--------------------------------------------------------------------+
| Action | "Organizer" | Attendee |
+--------------------------------------------------------------------+
| Initiate a to-do | "A" sends a REQUEST | |
| request | message to "B", "C",| |
| | and "D" | |
+--------------------------------------------------------------------+
| Accept the to-do | | "B" sends a "REPLY" |
| request | | message to "A" with its |
| | | "partstat" paramater |
| | | set to "accepted". |
+--------------------------------------------------------------------+
| Decline the to-do | | "C" sends a REPLY |
| request | | message to "A" with its |
| | | "partstat" parameter |
| | | set to "declined". |
+--------------------------------------------------------------------+
| Tentatively accept | | "D" sends a REPLY |
| the to-do request | | message to "A" with its |
| | | "partstat" parameter |
| | | set to "tentative". |
+--------------------------------------------------------------------+
| Check attendee | "A" sends a REQUEST | |
| completion status | message to "B" and | |
| | "D" with current | |
| | information. | |
+--------------------------------------------------------------------+
| Attendee indicates | | "B" sends a "REPLY" |
| percent complete | | message indicating |
| | | percent complete |
+--------------------------------------------------------------------+
| Attendee indicates | | "D" sends a "REPLY" |
| completion | | message indicating |
| | | completion |
+--------------------------------------------------------------------+
4.5.1 A VTODO Request
A sample "REQUEST" for a "VTODO" calendar component that "A" sends to
"B", "C", and "D".
BEGIN:VCALENDAR
PRODID:-//ACME/DesktopCalendar//EN
METHOD:REQUEST
VERSION:2.0
BEGIN:VTODO
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
ATTENDEE;RSVP=TRUE:Mailto:B@example.com
ATTENDEE;RSVP=TRUE:Mailto:C@example.com
ATTENDEE;RSVP=TRUE:Mailto:D@example.com
DTSTART:19970701T170000Z
DUE:19970722T170000Z
PRIORITY:1
SUMMARY:Create the requirements document
UID:calsrv.example.com-873970198738777-00@example.com
SEQUENCE:0
DTSTAMP:19970717T200000Z
STATUS:Needs Action
END:VTODO
END:VCALENDAR
4.5.2 A VTODO Reply
"B" accepts the to-do.
BEGIN:VCALENDAR
PRODID:-//ACME/DesktopCalendar//EN
METHOD:REPLY
VERSION:2.0
BEGIN:VTODO
ORGANIZER:Mailto:A@example.com
ATTENDEE;PARTSTAT=ACCEPTED:Mailto:B@example.com
UID:calsrv.example.com-873970198738777-00@example.com
COMMENT:I'll send you my input by e-mail
SEQUENCE:0
DTSTAMP:19970717T203000Z
REQUEST-STATUS:2.0;Success
END:VTODO
END:VCALENDAR
"B" could have declined the TODO or indicated tentative acceptance by
setting the "partstat" property parameter sequence to "declined" or
"tentative", respectively.
4.5.3 A VTODO Request for Updated Status
"A" requests status from all "Attendees".
BEGIN:VCALENDAR
PRODID:-//ACME/DesktopCalendar//EN
METHOD:REQUEST
VERSION:2.0
BEGIN:VTODO
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
ATTENDEE;RSVP=TRUE;TYPE=INDIVIDUAL:Mailto:B@example.com
ATTENDEE;RSVP=TRUE;TYPE=INDIVIDUAL:Mailto:D@example.com
UID:calsrv.example.com-873970198738777-00@example.com
SUMMARY:Create the requirements document
PRIORITY:1
SEQUENCE:0
STATUS:IN-PROCESS
DTSTART:19970701T170000Z
DTSTAMP:19970717T230000Z
END:VTODO
END:VCALENDAR
4.5.4 A Reply: Percent-Complete
A reply indicating the task being worked on and that "B" is 75%
complete with "B's" part of the assignment.
BEGIN:VCALENDAR
PRODID:-//ACME/DesktopCalendar//EN
METHOD:REPLY
VERSION:2.0
BEGIN:VTODO
ORGANIZER:MAILTO:A@example.com
ATTENDEE;PARTSTAT=IN-PROCESS:Mailto:B@example.com
PERCENT-COMPLETE:75
UID:calsrv.example.com-873970198738777-00@example.com
DTSTAMP:19970717T233000Z
SEQUENCE:0
END:VTODO
END:VCALENDAR
4.5.5 A Reply: Completed
A reply indicating that "D" completed "D's" part of the assignment.
BEGIN:VCALENDAR
PRODID:-//ACME/DesktopCalendar//EN
METHOD:REPLY
VERSION:2.0
BEGIN:VTODO
ORGANIZER:MAILTO:A@example.com
ATTENDEE;PARTSTAT=COMPLETED:Mailto:D@example.com
UID:calsrv.example.com-873970198738777-00@example.com
DTSTAMP:19970717T233000Z
SEQUENCE:0
END:VTODO
END:VCALENDAR
4.5.6 An Updated VTODO Request
Organizer "A" resends the "VTODO" calendar component. "A" sets the
overall completion for the to-do at 40%.
BEGIN:VCALENDAR
PRODID:-//ACME/DesktopCalendar//EN
METHOD:REQUEST
VERSION:2.0
BEGIN:VTODO
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE;PARTSTAT=ACCEPTED;TYPE=INDIVIDUAL:Mailto:B@example.com
ATTENDEE;PARTSTAT=IN-PROCESS;TYPE=INDIVIDUAL:Mailto:D@example.com
DTSTART:19970701T170000Z
DUE:19970722T170000Z
PRIORITY:1
SUMMARY:Create the requirements document
UID:calsrv.example.com-873970198738777-00@example.com
SEQUENCE:1
DTSTAMP:19970718T100000Z
STATUS:IN-PROGRESS
PERCENT-COMPLETE:40
END:VTODO
END:VCALENDAR
4.5.7 Recurring VTODOs
The following examples relate to recurring "VTODO" calendar
components.
4.5.7.1 Request for a Recurring VTODO
In this example "A" sends a recurring "VTODO" calendar component to
"B" and "D".
BEGIN:VCALENDAR
PRODID:-//ACME/DesktopCalendar//EN
METHOD:REQUEST
VERSION:2.0
BEGIN:VTODO
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR:Mailto:A@example.com
ATTENDEE;RSVP=TRUE;TYPE=INDIVIDUAL:Mailto:B@example.com
ATTENDEE;RSVP=TRUE;TYPE=INDIVIDUAL:Mailto:D@example.com
RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
DTSTART:19980101T100000-0700
DUE:19980103T100000-0700
SUMMARY:Send Status Reports to Area Managers
UID:calsrv.example.com-873970198738777-00@example.com
SEQUENCE:0
DTSTAMP:19970717T200000Z
STATUS:NEEDS ACTION
PRIORITY:1
END:VTODO
END:VCALENDAR
4.5.7.2 Calculating due dates in recurring VTODOs
The due date in a recurring "VTODO" calendar component is either a
fixed interval specified in the "REQUEST" method or specified using
the "RECURRENCE-ID" property. The former is calculated by applying
the difference between "DTSTART" and "DUE" properties and applying it
to each of the start of each recurring instance. Hence, if the
initial "VTODO" calendar component specifies a "DTSTART" property
value of "19970701T190000Z" and a "DUE" property value of
"19970801T190000Z" the interval of one day which is applied to each
recurring instance of the "VTODO" calendar component to determine the
"DUE" date of the instance.
4.5.7.3 Replying to an instance of a recurring VTODO
In this example "B" updates "A" on a single instance of the "VTODO"
calendar component.
BEGIN:VCALENDAR
PRODID:-//ACME/DesktopCalendar//EN
METHOD:REPLY
VERSION:2.0
BEGIN:VTODO
ATTENDEE;PARTSTAT=IN-PROCESS:Mailto:B@example.com
PERCENT-COMPLETE:75
UID:calsrv.example.com-873970198738777-00@example.com
DTSTAMP:19970717T233000Z
RECURRENCE-ID:19980101T170000Z
SEQUENCE:1
END:VTODO
END:VCALENDAR
4.6 Journal Examples
The iCalendar object below describes a single journal entry for
October 2, 1997. The "RELATED-TO" property references the phone
conference event for which minutes were taken.
BEGIN:VCALENDAR
METHOD:PUBLISH
PRODID:-//ACME/DesktopCalendar//EN
VERSION:2.0
BEGIN:VJOURNAL
DTSTART:19971002T200000Z
ORGANIZER:MAILTO:A@Example.com
SUMMARY:Phone conference minutes
DESCRIPTION:The editors meeting was held on October 1, 1997.
Details are in the attached document.
UID:0981234-1234234-2410@example.com
RELATED-TO:0981234-1234234-2402-35@example.com
ATTACH:ftp://ftp.example.com/pub/ed/minutes100197.txt
END:VJOURNAL
END:VCALENDAR
4.7 Other Examples
4.7.1 Event Refresh
Refresh the event with "UID" property value of "guid-1-
12345@host1.com":
BEGIN:VCALENDAR
PRODID:-//RDU Software//NONSGML HandCal//EN
METHOD:REFRESH
VERSION:2.0
BEGIN:VEVENT
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE:Mailto:B@example.com
ATTENDEE:Mailto:C@example.com
ATTENDEE:Mailto:D@example.com
UID: guid-1-12345@host1.com
DTSTAMP:19970603T094000
END:VEVENT
END:VCALENDAR
4.7.2 Bad RECURRENCE-ID
Component instances are identified by the combination of "UID",
"RECURRENCE-ID", and "SEQUENCE". When an "Organizer" sends a request
to an "Attendee", there are three cases in which an instance cannot
be found. They are:
1. The component with the referenced "UID" and "RECURRENCE-ID" has
been found but the "SEQUENCE" number in the calendar store does
not match that of the ITIP message.
2. The component with the referenced "UID" has been found, the
"SEQUENCE" numbers match, but the "RECURRENCE-ID" cannot be
found.
3. The "UID" and "SEQUENCE" numbers are found but the CUA does not
support recurrences.
In case (1), two things can happen. If the "SEQUENCE" number of the
"Attendee's" instance is larger than that in the "Organizer's"
message then the "Attendee" is receiving an out-of-sequence message
and MUST ignore it. If the "SEQUENCE" number of the "Attendee's"
instance is smaller, then the "Organizer" is sending out a newer
version of the component and the "Attendee's" version needs to be
updated. Since one or more updates have been missed, the "Attendee"
SHOULD send a "REFRESH" message to the "Organizer" to get an updated
version of the event.
In case (2), something has gone wrong. Both the "Organizer" and the
"Attendee" should have the same instances, but the "Attendee" does
not have the referenced instance. In this case the "Attendee" SHOULD
send a "REFRESH" to the "Organizer" to get an updated version of the
event.
In case (3), the limitations of the "Attendee's" CUA makes it
impossible to match an instance other than the single instance
scheduled. In this case, the "Attendee" need not send a "REFRESH" to
the "Organizer".
The example below shows a sequence in which an "Attendee" sends a
"REFRESH" to the "Organizer".
+--------------------------------------------------------------------+
| Action | "Organizer" | Attendee |
+--------------------------------------------------------------------+
| Update an instance | "A" sends "REQUEST"| |
| request | message to "B" | |
+--------------------------------------------------------------------+
| Attendee requests | | "B" sends a "REFRESH" |
| refresh because | | message to "A" |
| "RECURRENCE-ID" was| | |
| not found | | |
+--------------------------------------------------------------------+
| Refresh the entire | "A" sends the | |
| Event | latest copy of the | |
| | Event to "B" | |
+--------------------------------------------------------------------+
| Attendee handles | | "B" updates to the |
| the request and | | latest copy of the |
| updates the | | meeting. |
| instance | | |
+--------------------------------------------------------------------+
Request from "A":
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//RDU Software//NONSGML HandCal//EN
VERSION:2.0
BEGIN:VEVENT
UID:acme-12345@host1.com
SEQUENCE:3
RRULE:FREQ=WEEKLY
RDATE;VALUE=PERIOD:19970819T210000Z/199700819T220000Z
ORGANIZER:Mailto:A@example.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com
ATTENDEE:Mailto:B@example.com
DESCRIPTION:IETF-C&S Conference Call
SUMMARY:IETF Calendaring Working Group Meeting
DTSTART:19970801T210000Z
DTEND:19970801T220000Z
RECURRENCE-ID:19970809T210000Z
DTSTAMP:19970726T083000
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
"B" has the event with "UID" property "acme-12345@host1.com" but
"B's" "SEQUENCE" property value is "1" and the event does not have an
instance at the specified recurrence time. This means that "B" has
missed at least one update and needs a new copy of the event. "B"
requests the latest copy of the event with the following refresh
message:
BEGIN:VCALENDAR
PRODID:-//RDU Software//NONSGML HandCal//EN
METHOD:REFRESH
VERSION:2.0
BEGIN:VEVENT
ORGANIZER:Mailto:A@example.com
ATTENDEE:Mailto:B@example.com
UID:acme-12345@host1.com
DTSTAMP:19970603T094000
END:VEVENT
END:VCALENDAR
5 Application Protocol Fallbacks
5.1 Partial Implementation
Applications that support this memo are not required to support the
entire protocol. The following describes how methods and properties
SHOULD "fallback" in applications that do not support the complete
protocol. If a method or property is not addressed in this section,
it may be ignored.
5.1.1 Event-Related Fallbacks
Method Fallback
-------------- -----------------------------------------------------
PUBLISH Required
REQUEST PUBLISH
REPLY Required
ADD Required
CANCEL Required
REFRESH Required
COUNTER Reply with Not Supported
DECLINECOUNTER Required if EVENT-COUNTER is implemented; otherwise
reply with Not Supported
iCalendar
Property Fallback
-------------- -----------------------------------------------------
CALSCALE Ignore; assume GREGORIAN
PRODID Ignore
METHOD Required as described in the Method list above
VERSION Ignore
Event-Related
Components Fallback
-------------- -----------------------------------------------------
VALARM Reply with Not Supported
VTIMEZONE Required if any DateTime value refers to a time zone.
Component
Property Fallback
-------------- -----------------------------------------------------
ATTACH Ignore
ATTENDEE Required if EVENT-REQUEST is not implemented;
otherwise reply with Not Supported
CATEGORIES Ignore
CLASS Ignore
COMMENT Ignore
COMPLETED Ignore
nCONTACT Ignore
CREATED Ignore
DESCRIPTION Required
DURATION Reply with Not Supported
DTSTAMP Required
DTSTART Required
DTEND Required
EXDATE Ignore
EXRULE Ignore Reply with Not Supported. If implemented,
VTIMEZONE MUST also be implemented.
GEO Ignore
LAST-MODIFIED Ignore
LOCATION Required
ORGANIZER Ignore
PRIORITY Ignore
RELATED-TO Ignore
RDATE Ignore
RRULE Ignore. The first instance occurs on the DTStart
property. If implemented, VTIMEZONE MUST also be
implemented.
RECURRENCE-ID Required if RRULE is implemented; otherwise Ignore
REQUEST-STATUS Required
RESOURCES Ignore
SEQUENCE Required
STATUS Ignore
SUMMARY Ignore
TRANSP Required if FREEBUSY is implemented; otherwise Ignore
URL Ignore
UID Required
X- Ignore
5.1.2 Free/Busy-Related Fallbacks
Method Fallback
-------------- -----------------------------------------------------
PUBLISH Implementations MAY ignore the METHOD type. The
REQUEST-STATUS "3.14;Unsupported capability" MUST be
returned.
REQUEST Implementations MAY ignore the METHOD type. The
REQUEST-STATUS "3.14;Unsupported capability" MUST be
returned.
REPLY Implementations MAY ignore the METHOD type. The
REQUEST-STATUS "3.14;Unsupported capability" MUST be
returned.
iCalendar
Property Fallback
-------------- -----------------------------------------------------
CALSCALE Ignore; assume GREGORIAN.
PRODID Ignore
METHOD Required as described in the Method list above.
VERSION Ignore
Component
Property Fallback
-------------- -----------------------------------------------------
COMMENT Ignore
CONTACT Ignore
DTEND Required
DTSTAMP Required
DTSTART Required
DURATION Required
FREEBUSY Required
ORGANIZER Ignore
REQUEST-STATUS Ignore
UID Required
URL Ignore
X- Ignore
5.1.3 To-Do-Related Fallbacks
Method Fallback
-------------- -----------------------------------------------------
PUBLISH Required
REQUEST PUBLISH
REPLY Required
ADD Required
CANCEL Required
REFRESH Required
COUNTER Reply with Not Supported
DECLINECOUNTER Required if VTODO - COUNTER is implemented; otherwise
reply with Not Supported
iCalendar
Property Fallback
-------------- -----------------------------------------------------
CALSCALE Ignore; assume GREGORIAN.
PRODID Ignore
METHOD Required as described in the Method list above.
VERSION Ignore
To-Do-Related
Components Fallback
-------------- -----------------------------------------------------
VALARM Reply with Not Supported
VTIMEZONE Required if any DateTime value refers to a time zone.
Component
Property Fallback
-------------- -----------------------------------------------------
ATTACH Ignore
ATTENDEE Required if REQUEST is not implemented; otherwise
ignore
CATEGORIES Ignore
CLASS Ignore
COMMENT Ignore
COMPLETED Required
CONTACT Ignore
CREATED Ignore
DESCRIPTION Required
DUE Required
DURATION Ignore Reply with Not Supported
DTSTAMP Required
DTSTART Required
EXDATE Ignore Reply with Not Supported
EXRULE Ignore Reply with Not Supported. If implemented,
VTIMEZONE MUST also be implemented.
LAST-MODIFIED Ignore
LOCATION Ignore
ORGANIZER Ignore
PERCENT-COMPLETE Ignore
PRIORITY Required
RECURRENCE-ID Ignore
RELATED-TO Ignore
REQUEST-STATUS Ignore
RDATE Ignore
RRULE Ignore. The first instance occurs on the DTSTART
property. If implemented, VTIMEZONE MUST also be
implemented.
RESOURCES Ignore
SEQUENCE Required
STATUS Required
SUMMARY Ignore
URL Ignore
UID Required
X- Ignore
5.1.4 Journal-Related Fallbacks
Method Fallback
-------------- -----------------------------------------------------
PUBLISH Implementations MAY ignore the METHOD type. The
REQUEST-STATUS "3.14;Unsupported capability" MUST be
returned.
ADD Implementations MAY ignore the METHOD type. The
REQUEST-STATUS "3.14;Unsupported capability" MUST be
returned.
CANCEL Implementations MAY ignore the METHOD type. The
REQUEST-STATUS "3.14;Unsupported capability" MUST be
returned.
iCalendar
Property Fallback
-------------- -----------------------------------------------------
CALSCALE Ignore; assume GREGORIAN.
PRODID Ignore
METHOD Required as described in the Method list above.
VERSION Ignore
Journal-Related
Components Fallback
-------------- -----------------------------------------------------
VTIMEZONE Required if any DateTime value refers to a time zone.
Component
Property Fallback
-------------- -----------------------------------------------------
ATTACH Ignore
ATTENDEE Required if JOURNAL-REQUEST is implemented; otherwise
ignore
CATEGORIES Ignore
CLASS Ignore
COMMENT Ignore
CONTACT Ignore
CREATED Ignore
DESCRIPTION Required
DTSTAMP Required
DTSTART Required
EXDATE Ignore
EXRULE Ignore Reply with Not Supported. If implemented,
VTIMEZONE MUST also be implemented.
LAST-MODIFIED Ignore
ORGANIZER Ignore
RECURRENCE-ID Ignore
RELATED-TO Ignore
RDATE Ignore.
RRULE Ignore. The first instance occurs on the DTSTART
property. If implemented, VTIMEZONE MUST also be
implemented.
SEQUENCE Required
STATUS Ignore
SUMMARY Required
URL Ignore
UID Required
X- Ignore
5.2 Latency Issues
With a store-and-forward transport, it is possible for events to
arrive out of sequence. That is, a "CANCEL" method may be received
prior to receiving the associated "REQUEST" for the calendar
component. This section discusses a few of these scenarios.
5.2.1 Cancellation of an Unknown Calendar Component.
When a "CANCEL" method is received before the original "REQUEST"
method the calendar will be unable to correlate the "UID" property of
the cancellation with an existing calendar component. It is suggested
that messages that can not be correlated that also contain non-zero
sequence numbers be held and not discarded. Implementations MAY age
them out if no other messages arrive with the same "UID" property
value and a lower sequence number.
5.2.2 Unexpected Reply from an Unknown Delegate
When an "Attendee" delegates an item to another CU they MUST send a
"REPLY" method to the "Organizer" using the "ATTENDEE" properties to
indicate that the request was delegated and to whom. Hence, it is
possible for an "Organizer" to receive an "REPLY" from a CU not
listed as one of the original "Attendees". The resolution is left to
the implementation but it is expected that the calendaring software
will either accept the reply or hold it until the related "REPLY"
method is received from the "Delegator". If the version of the
"REPLY" method is out of date the "Organizer" SHOULD treat the
message as a "REFRESH" message and update the delegate with the
correct version.
5.3 Sequence Number
Under some conditions, a CUA may receive requests and replies with
the same "SEQUENCE" property value. The "DTSTAMP" property is
utilized as a tie-breaker when two items with the same "SEQUENCE"
property value are evaluated.
6 Security Considerations
ITIP is an abstract transport protocol which will be bound to a
real-time transport, a store-and-forward transport, and perhaps other
transports. The transport protocol will be responsible for providing
facilities for authentication and encryption using standard Internet
mechanisms that are mutually understood between the sender and
receiver.
6.1 Security Threats
6.1.1 Spoofing the "Organizer"
In iTIP, the "Organizer" (or someone working on the "Organizer's"
behalf) is the only person authorized to make changes to an existing
"VEVENT", "VTODO", "VJOURNAL" calendar component and republish it or
redistribute updates to the "Attendees". An iCalendar object that
maliciously changes or cancels an existing "VEVENT", "VTODO" or
"VJOURNAL" calendar component may be constructed by someone other
than the "Organizer" and republished or sent to the "Attendees".
6.1.2 Spoofing the "Attendee"
In iTIP, an "Attendee" of a "VEVENT" or "VTODO" calendar component
(or someone working on the "Attendee's" behalf) is the only person
authorized to update any parameter associated with their "ATTENDEE"
property and send it to the "Organizer". An iCalendar object that
maliciously changes the "ATTENDEE" parameters may be constructed by
someone other than the real "Attendee" and sent to the "Organizer".
6.1.3 Unauthorized Replacement of the Organizer
There will be circumstances when "Attendees" of an event or to-do
decide, using out-of-band mechanisms, that the "Organizer" must be
replaced. When the new "Organizer" sends out the updated "VEVENT" or
"VTODO" the "Attendee's" CUA will detect that the "Organizer" has
been changed, but it has no way of knowing whether or not the change
was mutually agreed upon.
6.1.4 Eavesdropping
The iCalendar object is constructed with human-readable clear text.
Any information contained in an iCalendar object may be read and/or
changed by unauthorized persons while the object is in transit.
6.1.5 Flooding a Calendar
Implementations MAY provide a means to automatically incorporate
"REQUEST" methods into a calendar. This presents the opportunity for
a calendar to be flooded with requests, which effectively block all
the calendar's free time.
6.1.6 Procedural Alarms
The "REQUEST" methods for "VEVENT" and "VTODO" calendar components
MAY contain "VALARM" calendar components. The "VALARM" calendar
component may be of type "PROCEDURE" and MAY have an attachment
containing an executable program. Implementations that incorporate
these types of alarms are subject to any virus or malicious attack
that may occur as a result of executing the attachment.
6.1.7 Unauthorized REFRESH Requests
It is possible for an "Organizer" to receive a "REFRESH" request from
someone who is not an "Attendee" of an event or to-do. Only
"Attendee's" of an event or to-do are authorized to receive replies
to "REFRESH" requests. Replying to such requests to anyone who is not
an "Attendee" may be a security problem.
6.2 Recommendations
For an application where the information is sensitive or critical and
the network is subject is subject to a high probability of attack,
iTIP transactions SHOULD be encrypted. This may be accomplished using
public key technology, specifically Security Multiparts for MIME
[RFC-1847] in the iTIP transport binding. This helps mitigate the
threats of spoofing, eavesdropping and malicious changes in transit.
6.2.1 Use of [RFC-1847] to secure iTIP transactions
iTIP transport bindings MUST provide a mechanism based on Security
Multiparts for MIME [RFC-1847] to enable authentication of the
sender's identity, and privacy and integrity of the data being
transmitted. This allows the receiver of a signed iCalendar object to
verify the identity of the sender. This sender may then be correlated
to an "ATTENDEE" property in the iCalendar object. If the correlation
is made and the sender is authorized to make the requested change or
update then the operation may proceed. It also allows the message to
be encrypted to prevent unauthorized reading of the message contents
in transit. iTIP transport binding documents describe this process in
detail.
Implementations MAY provide controls for users to disable this
capability.
6.2.2 Implementation Controls
The threat of unauthorized replacement of the "Organizer" SHOULD be
mitigated by a calendar system that uses this protocol by providing
controls or alerts that make "Calendar Users" aware of such
"Organizer" changes and allowing them to decide whether or not the
request should be honored.
The threat of flooding a calendar SHOULD be mitigated by a calendar
system that uses this protocol by providing controls that may be used
to limit the acceptable sources for iTIP transactions, and perhaps
the size of messages and volume of traffic, by source.
The threat of malicious procedural alarms SHOULD be mitigated by a
calendar system that uses this protocol by providing controls that
may be used to disallow procedural alarms in iTIP transactions and/or
remove all alarms from the object before delivery to the recipient.
The threat of unauthorized "REFRESH" requests SHOULD be mitigated by
a calendar system that uses this protocol by providing controls or
alerts that allow "Calendar User" to decide whether or not the
request should be honored. An implementation MAY decide to maintain,
for audit or historical purposes, "Calendar Users" who were part of
an attendee list and who were subsequently uninvited. Similar
controls or alerts should be provided when a "REFRESH" request is
received from these "Calendar Users" as well.
7 Acknowledgments