diff --git a/plugins/libcalendaring/lib/Sabre/VObject/Parameter.php b/plugins/libcalendaring/lib/Sabre/VObject/Parameter.php index 72bf03b4..87445179 100644 --- a/plugins/libcalendaring/lib/Sabre/VObject/Parameter.php +++ b/plugins/libcalendaring/lib/Sabre/VObject/Parameter.php @@ -72,21 +72,19 @@ class Parameter extends Node { $src = array( '\\', "\n", - ';', - ',', ); $out = array( '\\\\', '\n', - '\;', - '\,', ); - $value = str_replace($src, $out, $this->value); - if (strpos($value,":")!==false) { - $value = '"' . $value . '"'; + // quote parameters according to RFC 5545, Section 3.2 + $quotes = ''; + if (preg_match('/[:;,]/', $this->value)) { + $quotes = '"'; } - return $this->name . '=' . $value; + + return $this->name . '=' . $quotes . str_replace($src, $out, $this->value) . $quotes; } diff --git a/plugins/libcalendaring/tests/libvcalendar.php b/plugins/libcalendaring/tests/libvcalendar.php index 1ca81bb7..f5c61f91 100644 --- a/plugins/libcalendaring/tests/libvcalendar.php +++ b/plugins/libcalendaring/tests/libvcalendar.php @@ -263,6 +263,10 @@ class libvcalendar_test extends PHPUnit_Framework_TestCase $this->assertEquals("House, Street, Zip Place", $event['location'], "Decode escaped commas in location value"); $this->assertEquals("Me, meets Them\nThem, meet Me", $event['description'], "Decode description value"); + $this->assertEquals("Kolab, Thomas", $event['attendees'][3]['name'], "Unescaped"); + + $ics = $ical->export($events); + $this->assertContains('ATTENDEE;CN="Kolab, Thomas";PARTSTAT=', $ics, "Quoted attendee parameters"); } /** diff --git a/plugins/libcalendaring/tests/resources/escaped.ics b/plugins/libcalendaring/tests/resources/escaped.ics index eb39a073..013c29b5 100644 --- a/plugins/libcalendaring/tests/resources/escaped.ics +++ b/plugins/libcalendaring/tests/resources/escaped.ics @@ -9,9 +9,9 @@ ORGANIZER;CN="Organizor":MAILTO:organizor@example.org DTSTAMP:20140225T160532Z ATTENDEE;CN="Master of Desaster";RSVP=TRUE;PARTSTAT=NEEDS-ACTION; ROLE=REQ-PARTICIPANT;X-UID=100156408:mailto:master@desaster.com -ATTENDEE;CN="John Doe";RSVP=TRUE;PARTSTAT=NEEDS-ACTION; +ATTENDEE;CN="Doe, John";RSVP=TRUE;PARTSTAT=NEEDS-ACTION; ROLE=REQ-PARTICIPANT;X-UID=115484392:mailto:doe@example.com -ATTENDEE;CN="Thomas Kolab";RSVP=TRUE;PARTSTAT=NEEDS-ACTION; +ATTENDEE;CN="Kolab\, Thomas";RSVP=TRUE;PARTSTAT=NEEDS-ACTION; ROLE=REQ-PARTICIPANT;X-UID=115936264:mailto:thomas@kolab.org CREATED:20140225T160335Z LAST-MODIFIED:20140225T160335Z