Files
inbuxa-server/tests/resources/itip/itip_attendee_checks.txt
jcoffey-dev 6efa90cfc1 Calendar: answer iTIP REFRESH and REPLY only from the event's attendees
An organizer's server sent the whole event, with every attendee, the
description and the location, to anyone who sent a REFRESH with the
event's UID, including attendees who had been removed and people who
were never invited. A REPLY for an instance the organizer hadn't
changed was stored as a new instance as long as the sender listed
itself as an attendee of the reply, so a removed attendee or a
stranger could add instances on any date, with any ORGANIZER parameters
and any other ATTENDEE lines; those attendees would then get the
organizer's next update.

A REFRESH is now answered only when the sender is an attendee of the
stored event. A REPLY for an unchanged instance needs the sender to be
an attendee of the series and the date to be one of the series' own
dates. The new instance takes its ORGANIZER, UID and SEQUENCE from the
organizer's copy and the sender's own ATTENDEE line with the answer
applied; only the people the sender delegated to are added from the
reply.

The recurring to-do test used a RECURRENCE-ID that is not a date of
its series; it now uses the series' second date.

Test: a REFRESH from someone never invited returned the full event on
main, and a removed attendee's REPLY created an instance; a REPLY that
added another attendee stored that attendee, and one for a date outside
the series stored it. Now each is refused or ignored and the
organizer's copy holds only the attendee's own answer.
2026-10-28 21:54:34 -07:00

168 lines
4.0 KiB
Plaintext

# iTIP: REFRESH and REPLY are accepted only from the event's attendees
# Organizer invites two attendees to a three-day series (1)
> put [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//Example/ExampleCalendarClient//EN
VERSION:2.0
BEGIN:VEVENT
UID:[email protected]
SEQUENCE:0
ORGANIZER:mailto:[email protected]
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:[email protected]
ATTENDEE;RSVP=TRUE:mailto:[email protected]
ATTENDEE;RSVP=TRUE:mailto:[email protected]
SUMMARY:Standup
DTSTART:20270104T180000Z
DTEND:20270104T183000Z
RRULE:FREQ=DAILY;COUNT=3
DTSTAMP:20261027T120000Z
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
# Organizer invites two attendees to a three-day series (2)
> send
# Someone who was never invited asks for the event
> itip [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//Example/ExampleCalendarClient//EN
METHOD:REFRESH
VERSION:2.0
BEGIN:VEVENT
UID:[email protected]
ORGANIZER:mailto:[email protected]
ATTENDEE:mailto:[email protected]
DTSTAMP:20261027T130000Z
END:VEVENT
END:VCALENDAR
> send
SenderIsNotParticipant("[email protected]")
# Organizer removes the second attendee (1)
> put [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//Example/ExampleCalendarClient//EN
VERSION:2.0
BEGIN:VEVENT
UID:[email protected]
SEQUENCE:1
ORGANIZER:mailto:[email protected]
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:[email protected]
ATTENDEE;RSVP=TRUE:mailto:[email protected]
SUMMARY:Standup
DTSTART:20270104T180000Z
DTEND:20270104T183000Z
RRULE:FREQ=DAILY;COUNT=3
DTSTAMP:20261027T130000Z
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
# Organizer removes the second attendee (2)
> send
# The removed attendee asks for the event again
> itip [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//Example/ExampleCalendarClient//EN
METHOD:REFRESH
VERSION:2.0
BEGIN:VEVENT
UID:[email protected]
ORGANIZER:mailto:[email protected]
ATTENDEE:mailto:[email protected]
DTSTAMP:20261027T140000Z
END:VEVENT
END:VCALENDAR
> send
SenderIsNotParticipant("[email protected]")
# The removed attendee replies to an instance the organizer hasn't changed
> itip [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//Example/ExampleCalendarClient//EN
METHOD:REPLY
VERSION:2.0
BEGIN:VEVENT
UID:[email protected]
SEQUENCE:1
RECURRENCE-ID:20270105T180000Z
ORGANIZER:mailto:[email protected]
ATTENDEE;PARTSTAT=ACCEPTED:mailto:[email protected]
DTSTAMP:20261027T150000Z
END:VEVENT
END:VCALENDAR
> send
SenderIsNotParticipant("[email protected]")
# An attendee replies to one instance and adds a stranger to it
> itip [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//Example/ExampleCalendarClient//EN
METHOD:REPLY
VERSION:2.0
BEGIN:VEVENT
UID:[email protected]
SEQUENCE:1
RECURRENCE-ID:20270105T180000Z
ORGANIZER;CN="Not A":mailto:[email protected]
ATTENDEE;PARTSTAT=DECLINED:mailto:[email protected]
ATTENDEE;PARTSTAT=ACCEPTED:mailto:[email protected]
DTSTAMP:20261027T160000Z
END:VEVENT
END:VCALENDAR
> send
# An attendee replies to a date the series doesn't have
> itip [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//Example/ExampleCalendarClient//EN
METHOD:REPLY
VERSION:2.0
BEGIN:VEVENT
UID:[email protected]
SEQUENCE:1
RECURRENCE-ID:20270110T180000Z
ORGANIZER:mailto:[email protected]
ATTENDEE;PARTSTAT=DECLINED:mailto:[email protected]
DTSTAMP:20261027T170000Z
END:VEVENT
END:VCALENDAR
> send
# Only the attendee's own answer reaches the organizer's copy
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//Example/ExampleCalendarClient//EN
VERSION:2.0
BEGIN:VEVENT
ATTENDEE;PARTSTAT=DECLINED;SCHEDULE-STATUS=2.0:mailto:[email protected]
ORGANIZER:mailto:[email protected]
RECURRENCE-ID:20270105T180000Z
UID:[email protected]
DTSTAMP:1
SEQUENCE:2
END:VEVENT
BEGIN:VEVENT
STATUS:CONFIRMED
SUMMARY:Standup
DTEND:20270104T183000Z
DTSTART:20270104T180000Z
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:[email protected]
ATTENDEE;RSVP=TRUE:mailto:[email protected]
ORGANIZER:mailto:[email protected]
UID:[email protected]
RRULE:FREQ=DAILY;COUNT=3
DTSTAMP:0
SEQUENCE:2
END:VEVENT
END:VCALENDAR