mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-06-17 02:05:22 -04:00
fix: ICS export — escape X-WR-CALNAME and honour is_utc on DTSTART/DTEND (#1174)
Two bugs in the export_ics path: 1. X-WR-CALNAME was written raw: calendar names containing commas, semicolons or backslashes produced invalid ICS (RFC 5545 §3.3.11 requires those characters to be escaped as \, \; and \\). Fix: wrap cal.name in the existing _ics_escape() helper, which is already used for SUMMARY, DESCRIPTION, and LOCATION on the lines immediately below. 2. DTSTART and DTEND on non-all-day events always emitted the naive ISO string (e.g. 20260602T100000) regardless of CalendarEvent.is_utc. Consumers treat a naive datetime as floating/local time, so UTC events imported into Google Calendar or Apple Calendar shifted by the user's timezone offset. Fix: append 'Z' when is_utc is True, matching the pattern already used by the serialise_event() helper at line 408.
This commit is contained in:
@@ -1051,7 +1051,7 @@ def setup_calendar_routes() -> APIRouter:
|
||||
"BEGIN:VCALENDAR",
|
||||
"VERSION:2.0",
|
||||
"PRODID:-//Odysseus//Calendar//EN",
|
||||
f"X-WR-CALNAME:{cal.name}",
|
||||
f"X-WR-CALNAME:{_ics_escape(cal.name)}",
|
||||
]
|
||||
for ev in events:
|
||||
lines.append("BEGIN:VEVENT")
|
||||
@@ -1061,8 +1061,9 @@ def setup_calendar_routes() -> APIRouter:
|
||||
lines.append(f"DTSTART;VALUE=DATE:{ev.dtstart.strftime('%Y%m%d')}")
|
||||
lines.append(f"DTEND;VALUE=DATE:{ev.dtend.strftime('%Y%m%d')}")
|
||||
else:
|
||||
lines.append(f"DTSTART:{ev.dtstart.strftime('%Y%m%dT%H%M%S')}")
|
||||
lines.append(f"DTEND:{ev.dtend.strftime('%Y%m%dT%H%M%S')}")
|
||||
_dt_suffix = "Z" if getattr(ev, "is_utc", False) else ""
|
||||
lines.append(f"DTSTART:{ev.dtstart.strftime('%Y%m%dT%H%M%S')}{_dt_suffix}")
|
||||
lines.append(f"DTEND:{ev.dtend.strftime('%Y%m%dT%H%M%S')}{_dt_suffix}")
|
||||
if ev.description:
|
||||
lines.append(f"DESCRIPTION:{_ics_escape(ev.description)}")
|
||||
if ev.location:
|
||||
|
||||
Reference in New Issue
Block a user