Skip to content

fix(dav): only notify attendees affected by a change to a recurring e… - #65971

Open
Rikdekker wants to merge 1 commit into
nextcloud:masterfrom
Rikdekker:fix/60452-itip-significance-per-attendee
Open

Rikdekker wants to merge 1 commit into
nextcloud:masterfrom
Rikdekker:fix/60452-itip-significance-per-attendee

Conversation

@Rikdekker

@Rikdekker Rikdekker commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Summary

When something changes for a single occurrence of a recurring event, every attendee gets an iMIP mail, even when nothing changed for them. This happens when an attendee declines one occurrence (processing the REPLY adds an override to the organizer's copy), and when the organizer adds or removes someone on one occurrence.

TipBroker::parseEventForOrganizer decides significance for the event as a whole, for two reasons:

  • a new override grows every attendee's set of instance keys;
  • significantChangeHash is computed over all components, so any new override changes it for everyone.

This PR decides significance per attendee instead, over the occurrences they take part in before or after the change. A new override that matches the occurrence it replaces, such as one that only stores another attendee's PARTSTAT, is not significant. Attendees' calendar copies are still updated; they just don't get a mail for it.

Testing

  • 7 new unit tests in TipBrokerTest; 5 of them fail on master. The CalDAV unit suite passes (776 tests), and psalm and php-cs-fixer are clean.
  • Tested manually on a 35.0.2 instance: CalDAV steps with three attendees, all mail captured in Mailpit. Recipients per step:
Step 35.0.2 This PR + #64635
Add attendee C to the series nobody C
Remove C from the series nobody C
Add C to one occurrence A, B, C C
Remove B from one occurrence A B
A declines one occurrence organizer, B organizer
A declines the first occurrence organizer, B organizer

This complements #64635: that PR makes sure the added or removed attendee gets a mail at all, and this one stops the mails to everyone else. With both applied, only the affected attendee is notified. It builds on #64317, which handled the series-level case.

Checklist

AI (if applicable)

  • The content of this PR was partly or fully generated using AI

The analysis, fix and tests were made with the help of Claude Code (Anthropic). I verified the results myself on a 35.0.2 instance.

…vent

Whether an attendee gets an iMIP mail was decided on the event as a whole:
any new recurrence exception grew every attendee's set of instances, and
the significant-change hash covered all components. Processing a REPLY for
a single occurrence, or adding or removing an attendee on one occurrence,
therefore mailed every attendee.

Decide significance per attendee instead, over the occurrences they take
part in before or after the change. A new exception that matches the
occurrence it replaces, such as one storing another attendee's
participation status, is not significant. The attendee's calendar copy is
still updated.

Fixes nextcloud#60452

Assisted-by: ClaudeCode:claude-opus-5-5
Signed-off-by: Rikdekker <Rikdekker@users.noreply.github.com>
@Rikdekker

Copy link
Copy Markdown
Contributor Author

/backport to stable35

@Rikdekker

Copy link
Copy Markdown
Contributor Author

/backport to stable34

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PARTSTAT change on a single occurrence of a recurring event triggers METHOD:REQUEST re-invite to all other attendees

1 participant