From e45c2b07b531e7a0701f0a92b7d2ef6b3a69e578 Mon Sep 17 00:00:00 2001 From: Joshua Chumbley Date: Sat, 19 Mar 2022 14:03:53 -0500 Subject: [PATCH 1/2] Interpret unknown timezones as UTC --- lib/icalendar/util/deserialize.ex | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/icalendar/util/deserialize.ex b/lib/icalendar/util/deserialize.ex index ec65ea4..4f17212 100644 --- a/lib/icalendar/util/deserialize.ex +++ b/lib/icalendar/util/deserialize.ex @@ -236,12 +236,7 @@ defmodule ICalendar.Util.Deserialize do def to_date(date_string, %{"TZID" => timezone}) do # Microsoft Outlook calendar .ICS files report times in Greenwich Standard Time (UTC +0) # so just convert this to UTC - timezone = - if Regex.match?(~r/\//, timezone) do - timezone - else - Timex.Timezone.Utils.to_olson(timezone) - end + timezone = parse_timezone(timezone) date_string = case String.last(date_string) do @@ -264,6 +259,21 @@ defmodule ICalendar.Util.Deserialize do to_date(date_string, %{"TZID" => "Etc/UTC"}) end + defp parse_timezone(timezone) do + tz = + if Regex.match?(~r/\//, timezone) do + timezone + else + Timex.Timezone.Utils.to_olson(timezone) + end + + if is_nil(tz) do + "Etc/UTC" + else + tz + end + end + defp to_geo(geo) do geo |> desanitized() From 545250f61cbc7452e8304e5baecef417310b19a9 Mon Sep 17 00:00:00 2001 From: Joshua Chumbley Date: Sat, 19 Mar 2022 14:08:10 -0500 Subject: [PATCH 2/2] Add test for unrecognized timezone parsing --- test/icalendar/deserialize_test.exs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/icalendar/deserialize_test.exs b/test/icalendar/deserialize_test.exs index 5fcd87d..4bf8ded 100644 --- a/test/icalendar/deserialize_test.exs +++ b/test/icalendar/deserialize_test.exs @@ -85,6 +85,19 @@ defmodule ICalendar.DeserializeTest do assert event.dtend.time_zone == "America/Chicago" end + test "with unrecognized Timezone" do + ics = """ + BEGIN:VEVENT + DTEND;TZID=GMT-0500:22221224T084500 + DTSTART;TZID=GMT-0500:22221224T083000 + END:VEVENT + """ + + [event] = ICalendar.from_ics(ics) + assert event.dtstart.time_zone == "Etc/UTC" + assert event.dtend.time_zone == "Etc/UTC" + end + test "with CR+LF line endings" do ics = """ BEGIN:VEVENT