diff --git a/radicale/item/__init__.py b/radicale/item/__init__.py index 17cb66fb..7a33ce03 100644 --- a/radicale/item/__init__.py +++ b/radicale/item/__init__.py @@ -69,6 +69,9 @@ def read_components(s: str) -> List[vobject.base.Component]: s = re.sub(r'[\x00-\x08\x0B\x0C\x0E-\x1F]', '', s) # Workaround delete all empty lines to avoid vobject parsing errors s = re.sub(r'(?m)^[ \t]*\r?\n', '', s) + # Delete trailing space on TZID and TZNAME (Microsoft Outlook bug) + s = re.sub(r'(TZID|TZNAME)(:[^\r\n]+) (\r?\n)', r"\1\2\3", s) # fix VTIMEZONE + s = re.sub(r'(TZID=[^:]+) (:)', r"\1\2", s) # fix DTSTART/DTEND return list(vobject.readComponents(s, allowQP=True)) diff --git a/radicale/tests/static/event_issue2172.ics b/radicale/tests/static/event_issue2172.ics new file mode 100644 index 00000000..a4a9cd16 --- /dev/null +++ b/radicale/tests/static/event_issue2172.ics @@ -0,0 +1,44 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +BEGIN:VTIMEZONE +TZID:Mitteleuropäische Zeit +BEGIN:STANDARD +DTSTART:20001025T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +TZNAME:Mitteleuropäische Zeit +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:20000329T010000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +TZNAME:Mitteleuropäische Sommerzeit +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +END:DAYLIGHT +END:VTIMEZONE +BEGIN:VEVENT +UID:20260619T141049Z_FED000F14A0 +DTSTART;TZID=Mitteleuropäische Zeit :20260701T170000 +DTEND;TZID=Mitteleuropäische Zeit :20260701T183000 +ATTENDEE;CN=Mario Voigt;CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:mailto:REDACTED@REDACTED +CLASS:PUBLIC +DESCRIPTION:REDACTED +DTSTAMP:20260621T173336Z +LAST-MODIFIED:20260621T173336Z +LOCATION:Stadtwerkstatt +ORGANIZER;CN=REDACTED;ROLE=CHAIR:mailto:REDACTED +PRIORITY:5 +SUMMARY:REDACTED +TRANSP:OPAQUE +X-GWBOX-TYPE:SENT +X-GWCLASS:NORMAL +X-GWITEM-TYPE:APPOINTMENT +X-GWSHOW-AS:BUSY +X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY +X-MOZ-INVITED-ATTENDEE:mailto:REDACTED@REDACTED +X-MOZ-RECEIVED-DTSTAMP:20260621T173336Z +X-MOZ-RECEIVED-SEQUENCE:0 +END:VEVENT +END:VCALENDAR