Skip to content

Event recurrence exception IMip sent by thunderbird deletes all other occurrences #12845

@Mer0me

Description

@Mer0me

Steps to reproduce

  1. User A uses Thunderbird to invite User B to a recurring event (like "each day at 3.00 pm" until sunday)
  2. User B accepts the invitation and can see the recurring event on his Nextcloud calendar
  3. User A changes the time of the meeting only for one day (like "Friday it's 4.00 pm instead of 3.00 pm")
  4. When OCA\Mail\BackgroundJob\IMipMessageJob is executed, all occurrences are trashed except the modified one on the User B calendar. Now he can only see the Friday standalone event.

Expected behavior

IMip background job should preserve recurrence and update only the Friday instance of the event.

Actual behavior

Data loss.

Mail app version

5.7.14

Nextcloud version

32.0.2

Mailserver or service

Dovecot

Operating system

Debian

PHP engine version

PHP 8.3

Nextcloud memory caching

APCu Redis

Web server

Apache (supported)

Database

MariaDB

Additional info

The .ics sent by Thunderbird when modifying a unique occurrence does not contains (anymore ?) the master event. I think it's a recent behavior of the Mozilla product (since several months)
Here is an exemple of a recurring event update sent by thunderbird 140.9.0 esr :

BEGIN:VCALENDAR
PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
VERSION:2.0
METHOD:REQUEST
BEGIN:VTIMEZONE
TZID:Europe/Paris
X-TZINFO:Europe/Paris[2025b]
BEGIN:STANDARD
TZOFFSETTO:+000000
TZOFFSETFROM:+000921
TZNAME:Europe/Paris(STD)
DTSTART:19110311T000000
RDATE:19110311T000000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19160614T230000
RDATE:19160614T230000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+000000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(STD)
DTSTART:19161002T000000
RDATE:19161002T000000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19170324T230000
RDATE:19170324T230000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+000000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(STD)
DTSTART:19171008T000000
RDATE:19171008T000000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19180309T230000
RDATE:19180309T230000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19190301T230000
RDATE:19190301T230000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+000000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(STD)
DTSTART:19181007T000000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1MO;UNTIL=19191006T000000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19200214T230000
RDATE:19200214T230000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+000000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(STD)
DTSTART:19201024T000000
RDATE:19201024T000000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19210314T230000
RDATE:19210314T230000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+000000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(STD)
DTSTART:19211026T000000
RDATE:19211026T000000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19220325T230000
RDATE:19220325T230000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+000000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(STD)
DTSTART:19221008T000000
RDATE:19221008T000000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19230526T230000
RDATE:19230526T230000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19240329T230000
RDATE:19240329T230000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19250404T230000
RDATE:19250404T230000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19260417T230000
RDATE:19260417T230000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19270409T230000
RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=2SA;UNTIL=19280414T230000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19290420T230000
RDATE:19290420T230000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19300412T230000
RDATE:19300412T230000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19310418T230000
RDATE:19310418T230000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19320402T230000
RDATE:19320402T230000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+000000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(STD)
DTSTART:19231007T000000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19321002T000000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19330325T230000
RDATE:19330325T230000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+000000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(STD)
DTSTART:19331008T000000
RDATE:19331008T000000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19340407T230000
RDATE:19340407T230000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19350330T230000
RDATE:19350330T230000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19360418T230000
RDATE:19360418T230000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19370403T230000
RDATE:19370403T230000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19380326T230000
RDATE:19380326T230000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+000000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(STD)
DTSTART:19341007T000000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19381002T000000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19390415T230000
RDATE:19390415T230000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/Paris(DST)
DTSTART:19400225T020000
RDATE:19400225T020000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+000000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(STD)
DTSTART:19391119T000000
RDATE:19391119T000000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+020000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(DST)
DTSTART:19400614T230000
RDATE:19400614T230000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+010000
TZOFFSETFROM:+020000
TZNAME:Europe/Paris(STD)
DTSTART:19421102T030000
RDATE:19421102T030000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+020000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(DST)
DTSTART:19430329T020000
RDATE:19430329T020000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+020000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(DST)
DTSTART:19440403T020000
RDATE:19440403T020000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+020000
TZOFFSETFROM:+020000
TZNAME:Europe/Paris(DST)
DTSTART:19440825T000000
RDATE:19440825T000000
END:DAYLIGHT
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+020000
TZNAME:Europe/Paris(DST)
DTSTART:19441008T010000
RDATE:19441008T010000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+010000
TZOFFSETFROM:+020000
TZNAME:Europe/Paris(STD)
DTSTART:19431004T030000
RDATE:19431004T030000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+020000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(DST)
DTSTART:19450402T020000
RDATE:19450402T020000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+010000
TZOFFSETFROM:+020000
TZNAME:Europe/Paris(STD)
DTSTART:19450916T030000
RDATE:19450916T030000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+020000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(DST)
DTSTART:19760328T010000
RDATE:19760328T010000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+010000
TZOFFSETFROM:+020000
TZNAME:Europe/Paris(STD)
DTSTART:19760926T010000
RDATE:19760926T010000
END:STANDARD
BEGIN:STANDARD
TZOFFSETTO:+010000
TZOFFSETFROM:+020000
TZNAME:Europe/Paris(STD)
DTSTART:19770925T030000
RDATE:19770925T030000
END:STANDARD
BEGIN:STANDARD
TZOFFSETTO:+010000
TZOFFSETFROM:+020000
TZNAME:Europe/Paris(STD)
DTSTART:19781001T030000
RDATE:19781001T030000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+020000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(DST)
DTSTART:19770403T020000
RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU;UNTIL=19800406T020000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+010000
TZOFFSETFROM:+020000
TZNAME:Europe/Paris(STD)
DTSTART:19790930T030000
RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU;UNTIL=19950924T030000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+020000
TZOFFSETFROM:+010000
TZNAME:Europe/Paris(DST)
DTSTART:19810329T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=19960331T020000
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+010000
TZOFFSETFROM:+020000
TZNAME:Europe/Paris(STD)
DTSTART:19961027T030000
RDATE:19961027T030000
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETTO:+020000
TZOFFSETFROM:+010000
TZNAME:(DST)
DTSTART:19970330T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+010000
TZOFFSETFROM:+020000
TZNAME:(STD)
DTSTART:19971026T030000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
CREATED:20260429T133841Z
LAST-MODIFIED:20260429T134156Z
DTSTAMP:20260429T134156Z
UID:203b094e-71b1-46a5-a28f-0aff730f9225
SUMMARY:Test IMip bug
RECURRENCE-ID;TZID=Europe/Paris:20260429T160000
ORGANIZER;PARTSTAT=NEEDS-ACTION;CUTYPE=INDIVIDUAL:mailto:john.smith@m
 ydomain.com
ATTENDEE;RSVP=TRUE;PARTSTAT=NEEDS-ACTION;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICI
 PANT:mailto:john.smith@mydomain.com
ATTENDEE;RSVP=TRUE;CN=Wargang;PARTSTAT=NEEDS-ACTION;CUTYPE=INDIVIDUAL;ROLE=
 REQ-PARTICIPANT:mailto:wargang@mydomain2.com
DTSTART;TZID=Europe/Paris:20260429T170000
DTEND;TZID=Europe/Paris:20260429T180000
TRANSP:OPAQUE
SEQUENCE:1
END:VEVENT
END:VCALENDAR

Metadata

Metadata

Assignees

No one assigned

    Type

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions