Merge pull request #2173 from pbiering/fix-trailing-space-on-timezone
Fix trailing space on timezone
This commit is contained in:
@@ -4,6 +4,7 @@
|
|||||||
* Extension: item verification on commandline
|
* Extension: item verification on commandline
|
||||||
* Improvement: catch lack of support of PERIOD in vobject <= 0.9.9
|
* Improvement: catch lack of support of PERIOD in vobject <= 0.9.9
|
||||||
* Fix: sharing: backmap of REPORT/PROPPATCH hrefs is now URL-encode-aware (edit of a shared collection failed when the principal contains '@')
|
* Fix: sharing: backmap of REPORT/PROPPATCH hrefs is now URL-encode-aware (edit of a shared collection failed when the principal contains '@')
|
||||||
|
* Workaround: remove trailing spaces on TZID and TZNAME appended by buggy Microsoft clients
|
||||||
|
|
||||||
## 3.7.5
|
## 3.7.5
|
||||||
* Add: [sharing] conversion_bday_summary_template (customize summary)
|
* Add: [sharing] conversion_bday_summary_template (customize summary)
|
||||||
|
|||||||
@@ -69,6 +69,9 @@ def read_components(s: str) -> List[vobject.base.Component]:
|
|||||||
s = re.sub(r'[\x00-\x08\x0B\x0C\x0E-\x1F]', '', s)
|
s = re.sub(r'[\x00-\x08\x0B\x0C\x0E-\x1F]', '', s)
|
||||||
# Workaround delete all empty lines to avoid vobject parsing errors
|
# Workaround delete all empty lines to avoid vobject parsing errors
|
||||||
s = re.sub(r'(?m)^[ \t]*\r?\n', '', s)
|
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))
|
return list(vobject.readComponents(s, allowQP=True))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
44
radicale/tests/static/event_issue2172.ics
Normal file
44
radicale/tests/static/event_issue2172.ics
Normal file
@@ -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
|
||||||
@@ -193,6 +193,25 @@ permissions: RrWw""")
|
|||||||
assert "RDATE;VALUE=PERIOD:20000102T000000Z/20000402T000000Z,20010102T000000Z/20010" in answer
|
assert "RDATE;VALUE=PERIOD:20000102T000000Z/20000402T000000Z,20010102T000000Z/20010" in answer
|
||||||
assert " 402T000000Z" in answer
|
assert " 402T000000Z" in answer
|
||||||
|
|
||||||
|
def test_add_event_with_tz_trailing_space(self) -> None:
|
||||||
|
"""Add an event."""
|
||||||
|
self.mkcalendar("/calendar.ics/")
|
||||||
|
event = get_file_content("event_issue2172.ics")
|
||||||
|
path = "/calendar.ics/event_issue2172.ics"
|
||||||
|
self.put(path, event)
|
||||||
|
_, headers, answer = self.request("GET", path, check=200)
|
||||||
|
assert "ETag" in headers
|
||||||
|
assert headers["Content-Type"] == "text/calendar; charset=utf-8"
|
||||||
|
assert "DESCRIPTION" in answer
|
||||||
|
assert "TZID:Mitteleuropäische Zeit " not in answer
|
||||||
|
assert "TZID:Mitteleuropäische Zeit" in answer
|
||||||
|
assert "TZNAME:Mitteleuropäische Zeit " not in answer
|
||||||
|
assert "TZNAME:Mitteleuropäische Zeit" in answer
|
||||||
|
assert "DTSTART;TZID=Mitteleuropäische Zeit :20260701T170000" not in answer
|
||||||
|
assert "DTSTART;TZID=Mitteleuropäische Zeit:20260701T170000" in answer
|
||||||
|
assert "DTEND;TZID=Mitteleuropäische Zeit :20260701T183000" not in answer
|
||||||
|
assert "DTEND;TZID=Mitteleuropäische Zeit:20260701T183000" in answer
|
||||||
|
|
||||||
def test_add_event_with_desc_ok(self) -> None:
|
def test_add_event_with_desc_ok(self) -> None:
|
||||||
"""Add an event."""
|
"""Add an event."""
|
||||||
self.mkcalendar("/calendar.ics/")
|
self.mkcalendar("/calendar.ics/")
|
||||||
|
|||||||
Reference in New Issue
Block a user