From 310e25d0d10fc503f82a32fffcd41d5f870a3d28 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Tue, 29 Oct 2013 14:55:02 +0100 Subject: [PATCH] Fix VALARM parsing: ignore ACTION:NONE blocks; convert to ACTION:DISPLAY for the web client (#2415) --- .../calendar/drivers/kolab/kolab_calendar.php | 4 ++ plugins/libcalendaring/libvcalendar.php | 8 +-- plugins/libcalendaring/tests/libvcalendar.php | 16 ++++++ .../tests/resources/apple-alarms.ics | 50 +++++++++++++++++++ 4 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 plugins/libcalendaring/tests/resources/apple-alarms.ics diff --git a/plugins/calendar/drivers/kolab/kolab_calendar.php b/plugins/calendar/drivers/kolab/kolab_calendar.php index 7caf0d0c..bd42f56f 100644 --- a/plugins/calendar/drivers/kolab/kolab_calendar.php +++ b/plugins/calendar/drivers/kolab/kolab_calendar.php @@ -579,6 +579,10 @@ class kolab_calendar if (is_array($record['categories'])) $record['categories'] = $record['categories'][0]; + // The web client only supports DISPLAY type of alarms + if (!empty($record['alarms'])) + $record['alarms'] = preg_replace('/:[A-Z]+$/', 'DISPLAY', $record['alarms']); + // remove empty recurrence array if (empty($record['recurrence'])) unset($record['recurrence']); diff --git a/plugins/libcalendaring/libvcalendar.php b/plugins/libcalendaring/libvcalendar.php index 49f197e6..f4a32db7 100644 --- a/plugins/libcalendaring/libvcalendar.php +++ b/plugins/libcalendaring/libvcalendar.php @@ -549,15 +549,15 @@ class libvcalendar implements Iterator } // find alarms - if ($valarms = $ve->select('VALARM')) { + foreach ($ve->select('VALARM') as $valarm) { $action = 'DISPLAY'; $trigger = null; - $valarm = reset($valarms); foreach ($valarm->children as $prop) { switch ($prop->name) { case 'TRIGGER': foreach ($prop->parameters as $param) { + console(strval($param->name), strval($param->value)); if ($param->name == 'VALUE' && $param->value == 'DATE-TIME') { $trigger = '@' . $prop->getDateTime()->format('U'); } @@ -573,8 +573,10 @@ class libvcalendar implements Iterator } } - if ($trigger) + if ($trigger && strtoupper($action) != 'NONE') { $event['alarms'] = $trigger . ':' . $action; + break; + } } // assign current timezone to event start/end diff --git a/plugins/libcalendaring/tests/libvcalendar.php b/plugins/libcalendaring/tests/libvcalendar.php index a40ee00e..0726c98a 100644 --- a/plugins/libcalendaring/tests/libvcalendar.php +++ b/plugins/libcalendaring/tests/libvcalendar.php @@ -186,6 +186,22 @@ class libvcalendar_test extends PHPUnit_Framework_TestCase $this->assertEquals('500px-Opensource.svg.png', $event['attachments'][0]['name']); } + /** + * @depends test_import + */ + function test_apple_alarms() + { + $ical = new libvcalendar(); + $events = $ical->import_from_file(__DIR__ . '/resources/apple-alarms.ics', 'UTF-8'); + $event = $events[0]; + + // alarms + $this->assertEquals('-45M:AUDIO', $event['alarms'], "Relative alarm string"); + $alarm = libcalendaring::parse_alaram_value($event['alarms']); + $this->assertEquals('45', $alarm[0], "Alarm value"); + $this->assertEquals('-M', $alarm[1], "Alarm unit"); + } + /** * @depends test_import */ diff --git a/plugins/libcalendaring/tests/resources/apple-alarms.ics b/plugins/libcalendaring/tests/resources/apple-alarms.ics new file mode 100644 index 00000000..435d821c --- /dev/null +++ b/plugins/libcalendaring/tests/resources/apple-alarms.ics @@ -0,0 +1,50 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Apple Inc.//Mac OS X 10.9//EN +CALSCALE:GREGORIAN +BEGIN:VTIMEZONE +TZID:Europe/Zurich +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU +DTSTART:19810329T020000 +TZNAME:MESZ +TZOFFSETTO:+0200 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU +DTSTART:19961027T030000 +TZNAME:MEZ +TZOFFSETTO:+0100 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +TRANSP:OPAQUE +DTEND;TZID=Europe/Zurich:20131106T100000 +UID:EF185A2A-55FA-4FF3-9B02-56B0914FC79A +DTSTAMP:20131029T123927Z +LOCATION: +DESCRIPTION:With alarm +STATUS:CONFIRMED +SEQUENCE:4 +X-APPLE-TRAVEL-DURATION:PT30M +SUMMARY:Testing Bug 2415 +LAST-MODIFIED:20131029T123819Z +DTSTART;TZID=Europe/Zurich:20131106T090000 +CREATED:20131029T123819Z +BEGIN:VALARM +X-WR-ALARMUID:C4A26F1A-A433-4102-82D5-A3347FC126D4 +UID:C4A26F1A-A433-4102-82D5-A3347FC126D4 +TRIGGER;VALUE=DATE-TIME:19760401T005545Z +ACTION:NONE +END:VALARM +BEGIN:VALARM +X-WR-ALARMUID:DEF5F23D-98FC-4510-BC99-F877CD9A9F8B +UID:DEF5F23D-98FC-4510-BC99-F877CD9A9F8B +TRIGGER;X-APPLE-RELATED-TRAVEL=-PT15M:-PT45M +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +END:VCALENDAR \ No newline at end of file