From 8196f9b9002c69f9c75927c123ac91760e8ffeba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20H=C3=B6=C3=9Fl?= Date: Mon, 23 Jul 2012 21:15:47 +0000 Subject: [PATCH] Set notifications of events; the actual notification routine is not yet implemented --- dav/SabreDAV/ChangeLog | 5 + .../lib/Sabre/CalDAV/CalendarQueryParser.php | 2 +- dav/SabreDAV/lib/Sabre/CalDAV/Plugin.php | 4 +- dav/SabreDAV/lib/Sabre/CardDAV/Plugin.php | 2 +- dav/SabreDAV/lib/Sabre/DAV/Client.php | 8 +- dav/SabreDAV/lib/Sabre/DAV/Server.php | 2 +- dav/SabreDAV/lib/Sabre/DAV/XMLUtil.php | 29 +-- .../lib/Sabre/DAVACL/Property/Acl.php | 10 +- dav/SabreDAV/lib/Sabre/VObject/Component.php | 48 +++-- .../tests/Sabre/CalDAV/PluginTest.php | 24 +-- .../tests/Sabre/DAV/Locks/PluginTest.php | 4 +- .../tests/Sabre/DAV/Property/HrefListTest.php | 4 +- .../tests/Sabre/DAV/Property/HrefTest.php | 4 +- .../DAV/Property/SupportedReportSetTest.php | 8 +- .../tests/Sabre/DAV/ServerMKCOLTest.php | 33 ++- .../tests/Sabre/DAV/ServerPropsTest.php | 24 +-- .../Sabre/DAV/TemporaryFileFilterTest.php | 4 +- dav/SabreDAV/tests/Sabre/DAV/XMLUtilTest.php | 58 +----- .../tests/Sabre/VObject/ComponentTest.php | 33 ++- .../tests/Sabre/VObject/Issue154Test.php | 2 +- dav/common/calendar.fnk.php | 2 +- dav/common/calendar_rendering.fnk.php | 2 +- dav/common/wdcal.js | 7 + dav/common/wdcal_edit.inc.php | 194 ++++++++++++++---- dav/layout.fnk.php | 10 +- dav/main.php | 13 +- 26 files changed, 324 insertions(+), 212 deletions(-) diff --git a/dav/SabreDAV/ChangeLog b/dav/SabreDAV/ChangeLog index 0fe7758f5..8798f9b0e 100644 --- a/dav/SabreDAV/ChangeLog +++ b/dav/SabreDAV/ChangeLog @@ -12,6 +12,8 @@ * BC Break: Sabre_CalDAV_Schedule_IMip::sendMessage now has an extra argument. If you extended this class, you should fix this method. It's only used for informational purposes. + * BC Break: The DAV: namespace is no longer converted to urn:DAV. This was + a workaround for a bug in older PHP versions (pre-5.3). * New feature: Support for caldav notifications! * Changed: Responsibility for dealing with the calendar-query is now moved from the CalDAV plugin to the CalDAV backends. This allows for @@ -33,6 +35,9 @@ supported-calendar-component list. (thanks Armin!) * Fixed: Workaround for 10.8 Mountain Lion vCards, as it needs \r line endings to parse them correctly. + * Fixed: Issue 219: serialize() now reorders correctly. + * Fixed: Sabre_DAV_XMLUtil no longer returns empty $dom->childNodes + if there is whitespace in $dom. 1.6.4-stable (2012-??-??) * Fixed: Issue 220: Calendar-query filters may fail when filtering on diff --git a/dav/SabreDAV/lib/Sabre/CalDAV/CalendarQueryParser.php b/dav/SabreDAV/lib/Sabre/CalDAV/CalendarQueryParser.php index bd0d34338..098edccca 100644 --- a/dav/SabreDAV/lib/Sabre/CalDAV/CalendarQueryParser.php +++ b/dav/SabreDAV/lib/Sabre/CalDAV/CalendarQueryParser.php @@ -68,7 +68,7 @@ class Sabre_CalDAV_CalendarQueryParser { $this->xpath = new DOMXPath($dom); $this->xpath->registerNameSpace('cal',Sabre_CalDAV_Plugin::NS_CALDAV); - $this->xpath->registerNameSpace('dav','urn:DAV'); + $this->xpath->registerNameSpace('dav','DAV:'); } diff --git a/dav/SabreDAV/lib/Sabre/CalDAV/Plugin.php b/dav/SabreDAV/lib/Sabre/CalDAV/Plugin.php index 97aea2d98..0b0978f14 100644 --- a/dav/SabreDAV/lib/Sabre/CalDAV/Plugin.php +++ b/dav/SabreDAV/lib/Sabre/CalDAV/Plugin.php @@ -442,11 +442,11 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { public function calendarMultiGetReport($dom) { $properties = array_keys(Sabre_DAV_XMLUtil::parseProperties($dom->firstChild)); - $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href'); + $hrefElems = $dom->getElementsByTagNameNS('DAV:','href'); $xpath = new DOMXPath($dom); $xpath->registerNameSpace('cal',Sabre_CalDAV_Plugin::NS_CALDAV); - $xpath->registerNameSpace('dav','urn:DAV'); + $xpath->registerNameSpace('dav','DAV:'); $expand = $xpath->query('/cal:calendar-multiget/dav:prop/cal:calendar-data/cal:expand'); if ($expand->length>0) { diff --git a/dav/SabreDAV/lib/Sabre/CardDAV/Plugin.php b/dav/SabreDAV/lib/Sabre/CardDAV/Plugin.php index c31d0b1be..6335e2f27 100644 --- a/dav/SabreDAV/lib/Sabre/CardDAV/Plugin.php +++ b/dav/SabreDAV/lib/Sabre/CardDAV/Plugin.php @@ -269,7 +269,7 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { $properties = array_keys(Sabre_DAV_XMLUtil::parseProperties($dom->firstChild)); - $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href'); + $hrefElems = $dom->getElementsByTagNameNS('DAV:','href'); $propertyList = array(); foreach($hrefElems as $elem) { diff --git a/dav/SabreDAV/lib/Sabre/DAV/Client.php b/dav/SabreDAV/lib/Sabre/DAV/Client.php index 98126f8e5..8f3dcc78f 100644 --- a/dav/SabreDAV/lib/Sabre/DAV/Client.php +++ b/dav/SabreDAV/lib/Sabre/DAV/Client.php @@ -485,19 +485,17 @@ class Sabre_DAV_Client { */ public function parseMultiStatus($body) { - $body = Sabre_DAV_XMLUtil::convertDAVNamespace($body); - $responseXML = simplexml_load_string($body, null, LIBXML_NOBLANKS | LIBXML_NOCDATA); if ($responseXML===false) { throw new InvalidArgumentException('The passed data is not valid XML'); } - $responseXML->registerXPathNamespace('d', 'urn:DAV'); + $responseXML->registerXPathNamespace('d', 'DAV:'); $propResult = array(); foreach($responseXML->xpath('d:response') as $response) { - $response->registerXPathNamespace('d', 'urn:DAV'); + $response->registerXPathNamespace('d', 'DAV:'); $href = $response->xpath('d:href'); $href = (string)$href[0]; @@ -505,7 +503,7 @@ class Sabre_DAV_Client { foreach($response->xpath('d:propstat') as $propStat) { - $propStat->registerXPathNamespace('d', 'urn:DAV'); + $propStat->registerXPathNamespace('d', 'DAV:'); $status = $propStat->xpath('d:status'); list($httpVersion, $statusCode, $message) = explode(' ', (string)$status[0],3); diff --git a/dav/SabreDAV/lib/Sabre/DAV/Server.php b/dav/SabreDAV/lib/Sabre/DAV/Server.php index b5ce61efe..aa586ae35 100644 --- a/dav/SabreDAV/lib/Sabre/DAV/Server.php +++ b/dav/SabreDAV/lib/Sabre/DAV/Server.php @@ -1999,7 +1999,7 @@ class Sabre_DAV_Server { if (!$body) return array(); $dom = Sabre_DAV_XMLUtil::loadDOMDocument($body); - $elem = $dom->getElementsByTagNameNS('urn:DAV','propfind')->item(0); + $elem = $dom->getElementsByTagNameNS('DAV:','propfind')->item(0); return array_keys(Sabre_DAV_XMLUtil::parseProperties($elem)); } diff --git a/dav/SabreDAV/lib/Sabre/DAV/XMLUtil.php b/dav/SabreDAV/lib/Sabre/DAV/XMLUtil.php index 60eff3b15..712fa3fc0 100644 --- a/dav/SabreDAV/lib/Sabre/DAV/XMLUtil.php +++ b/dav/SabreDAV/lib/Sabre/DAV/XMLUtil.php @@ -20,9 +20,6 @@ class Sabre_DAV_XMLUtil { * {http://www.example.org}myelem * * This format is used throughout the SabreDAV sourcecode. - * Elements encoded with the urn:DAV namespace will - * be returned as if they were in the DAV: namespace. This is to avoid - * compatibility problems. * * This function will return null if a nodetype other than an Element is passed. * @@ -33,8 +30,7 @@ class Sabre_DAV_XMLUtil { if ($dom->nodeType !== XML_ELEMENT_NODE) return null; - // Mapping back to the real namespace, in case it was dav - if ($dom->namespaceURI=='urn:DAV') $ns = 'DAV:'; else $ns = $dom->namespaceURI; + $ns = $dom->namespaceURI; // Mapping to clark notation return '{' . $ns . '}' . $dom->localName; @@ -64,29 +60,11 @@ class Sabre_DAV_XMLUtil { } - /** - * This method takes an XML document (as string) and converts all instances of the - * DAV: namespace to urn:DAV - * - * This is unfortunately needed, because the DAV: namespace violates the xml namespaces - * spec, and causes the DOM to throw errors - * - * @param string $xmlDocument - * @return array|string|null - */ - static function convertDAVNamespace($xmlDocument) { - - // This is used to map the DAV: namespace to urn:DAV. This is needed, because the DAV: - // namespace is actually a violation of the XML namespaces specification, and will cause errors - return preg_replace("/xmlns(:[A-Za-z0-9_]*)?=(\"|\')DAV:(\\2)/","xmlns\\1=\\2urn:DAV\\2",$xmlDocument); - - } - /** * This method provides a generic way to load a DOMDocument for WebDAV use. * * This method throws a Sabre_DAV_Exception_BadRequest exception for any xml errors. - * It does not preserve whitespace, and it converts the DAV: namespace to urn:DAV. + * It does not preserve whitespace. * * @param string $xml * @throws Sabre_DAV_Exception_BadRequest @@ -118,10 +96,11 @@ class Sabre_DAV_XMLUtil { libxml_clear_errors(); $dom = new DOMDocument(); - $dom->loadXML(self::convertDAVNamespace($xml),LIBXML_NOWARNING | LIBXML_NOERROR); // We don't generally care about any whitespace $dom->preserveWhiteSpace = false; + + $dom->loadXML($xml,LIBXML_NOWARNING | LIBXML_NOERROR); if ($error = libxml_get_last_error()) { libxml_clear_errors(); diff --git a/dav/SabreDAV/lib/Sabre/DAVACL/Property/Acl.php b/dav/SabreDAV/lib/Sabre/DAVACL/Property/Acl.php index 05e1a690b..3f79a8d53 100644 --- a/dav/SabreDAV/lib/Sabre/DAVACL/Property/Acl.php +++ b/dav/SabreDAV/lib/Sabre/DAVACL/Property/Acl.php @@ -88,11 +88,11 @@ class Sabre_DAVACL_Property_Acl extends Sabre_DAV_Property { static public function unserialize(DOMElement $dom) { $privileges = array(); - $xaces = $dom->getElementsByTagNameNS('urn:DAV','ace'); + $xaces = $dom->getElementsByTagNameNS('DAV:','ace'); for($ii=0; $ii < $xaces->length; $ii++) { $xace = $xaces->item($ii); - $principal = $xace->getElementsByTagNameNS('urn:DAV','principal'); + $principal = $xace->getElementsByTagNameNS('DAV:','principal'); if ($principal->length !== 1) { throw new Sabre_DAV_Exception_BadRequest('Each {DAV:}ace element must have one {DAV:}principal element'); } @@ -116,17 +116,17 @@ class Sabre_DAVACL_Property_Acl extends Sabre_DAV_Property { $protected = false; - if ($xace->getElementsByTagNameNS('urn:DAV','protected')->length > 0) { + if ($xace->getElementsByTagNameNS('DAV:','protected')->length > 0) { $protected = true; } - $grants = $xace->getElementsByTagNameNS('urn:DAV','grant'); + $grants = $xace->getElementsByTagNameNS('DAV:','grant'); if ($grants->length < 1) { throw new Sabre_DAV_Exception_NotImplemented('Every {DAV:}ace element must have a {DAV:}grant element. {DAV:}deny is not yet supported'); } $grant = $grants->item(0); - $xprivs = $grant->getElementsByTagNameNS('urn:DAV','privilege'); + $xprivs = $grant->getElementsByTagNameNS('DAV:','privilege'); for($jj=0; $jj<$xprivs->length; $jj++) { $xpriv = $xprivs->item($jj); diff --git a/dav/SabreDAV/lib/Sabre/VObject/Component.php b/dav/SabreDAV/lib/Sabre/VObject/Component.php index b78a26133..6d4b28ac8 100644 --- a/dav/SabreDAV/lib/Sabre/VObject/Component.php +++ b/dav/SabreDAV/lib/Sabre/VObject/Component.php @@ -30,7 +30,7 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { public $children = array(); /** - * If coponents are added to this map, they will be automatically mapped + * If components are added to this map, they will be automatically mapped * to their respective classes, if parsed by the reader or constructed with * the 'create' method. * @@ -94,40 +94,54 @@ class Sabre_VObject_Component extends Sabre_VObject_Element { * * This is solely used by the childrenSort method. * - * A higher score means the item will be higher in the list + * A higher score means the item will be lower in the list. + * To avoid score collisions, each "score category" has a reasonable + * space to accomodate elements. The $key is added to the $score to + * preserve the original relative order of elements. * - * @param Sabre_VObject_Node $n + * @param int $key + * @param Sabre_VObject $array * @return int */ - $sortScore = function($n) { - - if ($n instanceof Sabre_VObject_Component) { + $sortScore = function($key, $array) { + + if ($array[$key] instanceof Sabre_VObject_Component) { // We want to encode VTIMEZONE first, this is a personal // preference. - if ($n->name === 'VTIMEZONE') { - return 1; + if ($array[$key]->name === 'VTIMEZONE') { + $score=300000000; + return $score+$key; } else { - return 0; + $score=400000000; + return $score+$key; } } else { + // Properties get encoded first // VCARD version 4.0 wants the VERSION property to appear first - if ($n->name === 'VERSION') { - return 3; - } else { - return 2; + if ($array[$key] instanceof Sabre_VObject_Property) { + if ($array[$key]->name === 'VERSION') { + $score=100000000; + return $score+$key; + } else { + // All other properties + $score=200000000; + return $score+$key; + } } } + next($children); }; - usort($this->children, function($a, $b) use ($sortScore) { + $tmp = $this->children; + uksort($this->children, function($a, $b) use ($sortScore, $tmp) { - $sA = $sortScore($a); - $sB = $sortScore($b); + $sA = $sortScore($a, $tmp); + $sB = $sortScore($b, $tmp); if ($sA === $sB) return 0; - return ($sA > $sB) ? -1 : 1; + return ($sA < $sB) ? -1 : 1; }); diff --git a/dav/SabreDAV/tests/Sabre/CalDAV/PluginTest.php b/dav/SabreDAV/tests/Sabre/CalDAV/PluginTest.php index cac4049f2..6ff57285d 100644 --- a/dav/SabreDAV/tests/Sabre/CalDAV/PluginTest.php +++ b/dav/SabreDAV/tests/Sabre/CalDAV/PluginTest.php @@ -536,9 +536,9 @@ END:VCALENDAR'; $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Invalid HTTP status received. Full response body: ' . $this->response->body); - $xml = simplexml_load_string(Sabre_DAV_XMLUtil::convertDAVNamespace($this->response->body)); + $xml = simplexml_load_string($this->response->body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav'); $check = array( @@ -598,9 +598,9 @@ END:VCALENDAR'; $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Invalid HTTP status received. Full response body: ' . $this->response->body); - $xml = simplexml_load_string(Sabre_DAV_XMLUtil::convertDAVNamespace($this->response->body)); + $xml = simplexml_load_string($this->response->body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav'); $check = array( @@ -663,9 +663,9 @@ END:VCALENDAR'; $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Received an unexpected status. Full response body: ' . $this->response->body); - $xml = simplexml_load_string(Sabre_DAV_XMLUtil::convertDAVNamespace($this->response->body)); + $xml = simplexml_load_string($this->response->body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav'); $check = array( @@ -722,9 +722,9 @@ END:VCALENDAR'; $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Received an unexpected status. Full response body: ' . $this->response->body); - $xml = simplexml_load_string(Sabre_DAV_XMLUtil::convertDAVNamespace($this->response->body)); + $xml = simplexml_load_string($this->response->body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav'); $check = array( @@ -811,9 +811,9 @@ END:VCALENDAR'; $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Received an unexpected status. Full response body: ' . $this->response->body); - $xml = simplexml_load_string(Sabre_DAV_XMLUtil::convertDAVNamespace($this->response->body)); + $xml = simplexml_load_string($this->response->body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav'); $check = array( @@ -871,9 +871,9 @@ END:VCALENDAR'; $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Received an unexpected status. Full response body: ' . $this->response->body); - $xml = simplexml_load_string(Sabre_DAV_XMLUtil::convertDAVNamespace($this->response->body)); + $xml = simplexml_load_string($this->response->body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav'); $check = array( diff --git a/dav/SabreDAV/tests/Sabre/DAV/Locks/PluginTest.php b/dav/SabreDAV/tests/Sabre/DAV/Locks/PluginTest.php index 758a492bf..0ce0eb3a0 100644 --- a/dav/SabreDAV/tests/Sabre/DAV/Locks/PluginTest.php +++ b/dav/SabreDAV/tests/Sabre/DAV/Locks/PluginTest.php @@ -92,9 +92,9 @@ class Sabre_DAV_Locks_PluginTest extends Sabre_DAV_AbstractServer { $this->assertEquals('HTTP/1.1 200 OK',$this->response->status,'Got an incorrect status back. Response body: ' . $this->response->body); - $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body); + $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"DAV:\"",$this->response->body); $xml = simplexml_load_string($body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); $elements = array( '/d:prop', diff --git a/dav/SabreDAV/tests/Sabre/DAV/Property/HrefListTest.php b/dav/SabreDAV/tests/Sabre/DAV/Property/HrefListTest.php index ef8c1a093..c420f22df 100644 --- a/dav/SabreDAV/tests/Sabre/DAV/Property/HrefListTest.php +++ b/dav/SabreDAV/tests/Sabre/DAV/Property/HrefListTest.php @@ -60,7 +60,7 @@ class Sabre_DAV_Property_HrefListTest extends PHPUnit_Framework_TestCase { function testUnserialize() { $xml = ' -/bla/foo/bla/bar +/bla/foo/bla/bar '; $dom = new DOMDocument(); @@ -74,7 +74,7 @@ class Sabre_DAV_Property_HrefListTest extends PHPUnit_Framework_TestCase { function testUnserializeIncompatible() { $xml = ' -/bla/foo +/bla/foo '; $dom = new DOMDocument(); diff --git a/dav/SabreDAV/tests/Sabre/DAV/Property/HrefTest.php b/dav/SabreDAV/tests/Sabre/DAV/Property/HrefTest.php index 8dcec751e..12f0a5943 100644 --- a/dav/SabreDAV/tests/Sabre/DAV/Property/HrefTest.php +++ b/dav/SabreDAV/tests/Sabre/DAV/Property/HrefTest.php @@ -60,7 +60,7 @@ class Sabre_DAV_Property_HrefTest extends PHPUnit_Framework_TestCase { function testUnserialize() { $xml = ' -/bla/path +/bla/path '; $dom = new DOMDocument(); @@ -74,7 +74,7 @@ class Sabre_DAV_Property_HrefTest extends PHPUnit_Framework_TestCase { function testUnserializeIncompatible() { $xml = ' -/bla/path +/bla/path '; $dom = new DOMDocument(); diff --git a/dav/SabreDAV/tests/Sabre/DAV/Property/SupportedReportSetTest.php b/dav/SabreDAV/tests/Sabre/DAV/Property/SupportedReportSetTest.php index 27d5825e6..086d59a9c 100644 --- a/dav/SabreDAV/tests/Sabre/DAV/Property/SupportedReportSetTest.php +++ b/dav/SabreDAV/tests/Sabre/DAV/Property/SupportedReportSetTest.php @@ -37,9 +37,9 @@ class Sabre_DAV_Property_SupportedReportSetTest extends Sabre_DAV_AbstractServer $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'We expected a multi-status response. Full response body: ' . $this->response->body); - $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body); + $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"DAV:\"",$this->response->body); $xml = simplexml_load_string($body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop'); $this->assertEquals(1,count($data),'We expected 1 \'d:prop\' element'); @@ -74,9 +74,9 @@ class Sabre_DAV_Property_SupportedReportSetTest extends Sabre_DAV_AbstractServer $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'We expected a multi-status response. Full response body: ' . $this->response->body); - $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body); + $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"DAV:\"",$this->response->body); $xml = simplexml_load_string($body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); $xml->registerXPathNamespace('x','http://www.rooftopsolutions.nl/testnamespace'); $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop'); diff --git a/dav/SabreDAV/tests/Sabre/DAV/ServerMKCOLTest.php b/dav/SabreDAV/tests/Sabre/DAV/ServerMKCOLTest.php index 0a181dd70..a9abc1814 100644 --- a/dav/SabreDAV/tests/Sabre/DAV/ServerMKCOLTest.php +++ b/dav/SabreDAV/tests/Sabre/DAV/ServerMKCOLTest.php @@ -192,7 +192,6 @@ class Sabre_DAV_ServerMKCOLTest extends Sabre_DAV_AbstractServer { } - /** * @depends testMKCOLIncorrectResourceType2 */ @@ -224,6 +223,38 @@ class Sabre_DAV_ServerMKCOLTest extends Sabre_DAV_AbstractServer { } + /** + * @depends testMKCOLIncorrectResourceType2 + */ + function testMKCOLWhiteSpaceResourceType() { + + $serverVars = array( + 'REQUEST_URI' => '/testcol', + 'REQUEST_METHOD' => 'MKCOL', + 'HTTP_CONTENT_TYPE' => 'application/xml', + ); + + $request = new Sabre_HTTP_Request($serverVars); + $request->setBody(' + + + + + + + + +'); + $this->server->httpRequest = ($request); + $this->server->exec(); + + $this->assertEquals(array( + 'Content-Length' => '0', + ),$this->response->headers); + + $this->assertEquals('HTTP/1.1 201 Created',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body); + + } /** * @depends testMKCOLIncorrectResourceType2 diff --git a/dav/SabreDAV/tests/Sabre/DAV/ServerPropsTest.php b/dav/SabreDAV/tests/Sabre/DAV/ServerPropsTest.php index 484b038d3..63a204cf9 100644 --- a/dav/SabreDAV/tests/Sabre/DAV/ServerPropsTest.php +++ b/dav/SabreDAV/tests/Sabre/DAV/ServerPropsTest.php @@ -58,9 +58,9 @@ class Sabre_DAV_ServerPropsTest extends Sabre_DAV_AbstractServer { $this->response->headers ); - $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body); + $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"DAV:\"",$this->response->body); $xml = simplexml_load_string($body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); list($data) = $xml->xpath('/d:multistatus/d:response/d:href'); $this->assertEquals('/',(string)$data,'href element should have been /'); @@ -81,9 +81,9 @@ class Sabre_DAV_ServerPropsTest extends Sabre_DAV_AbstractServer { $this->sendRequest($xml); - $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body); + $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"DAV:\"",$this->response->body); $xml = simplexml_load_string($body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry'); $this->assertEquals(2,count($data),'We expected two \'d:lockentry\' tags'); @@ -115,9 +115,9 @@ class Sabre_DAV_ServerPropsTest extends Sabre_DAV_AbstractServer { $this->sendRequest($xml); - $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body); + $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"DAV:\"",$this->response->body); $xml = simplexml_load_string($body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:lockdiscovery'); $this->assertEquals(1,count($data),'We expected a \'d:lockdiscovery\' tag'); @@ -134,9 +134,9 @@ class Sabre_DAV_ServerPropsTest extends Sabre_DAV_AbstractServer { '; $this->sendRequest($xml); - $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body); + $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"DAV:\"",$this->response->body); $xml = simplexml_load_string($body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); $pathTests = array( '/d:multistatus', '/d:multistatus/d:response', @@ -312,9 +312,9 @@ class Sabre_DAV_ServerPropsTest extends Sabre_DAV_AbstractServer { $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'We got the wrong status. Full XML response: ' . $this->response->body); - $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body); + $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"DAV:\"",$this->response->body); $xml = simplexml_load_string($body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); $xml->registerXPathNamespace('bla','http://www.rooftopsolutions.nl/testnamespace'); $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop'); @@ -345,9 +345,9 @@ class Sabre_DAV_ServerPropsTest extends Sabre_DAV_AbstractServer { $this->sendRequest($xml); - $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body); + $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"DAV:\"",$this->response->body); $xml = simplexml_load_string($body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); $xml->registerXPathNamespace('bla','http://www.rooftopsolutions.nl/testnamespace'); $xpath='//bla:someprop'; diff --git a/dav/SabreDAV/tests/Sabre/DAV/TemporaryFileFilterTest.php b/dav/SabreDAV/tests/Sabre/DAV/TemporaryFileFilterTest.php index 4ac0b1ae0..acd64380f 100644 --- a/dav/SabreDAV/tests/Sabre/DAV/TemporaryFileFilterTest.php +++ b/dav/SabreDAV/tests/Sabre/DAV/TemporaryFileFilterTest.php @@ -233,9 +233,9 @@ class Sabre_DAV_TemporaryFileFilterTest extends Sabre_DAV_AbstractServer { 'Content-Type' => 'application/xml; charset=utf-8', ),$this->response->headers); - $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body); + $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"DAV:\"",$this->response->body); $xml = simplexml_load_string($body); - $xml->registerXPathNamespace('d','urn:DAV'); + $xml->registerXPathNamespace('d','DAV:'); list($data) = $xml->xpath('/d:multistatus/d:response/d:href'); $this->assertEquals('/._testput.txt',(string)$data,'href element should have been /._testput.txt'); diff --git a/dav/SabreDAV/tests/Sabre/DAV/XMLUtilTest.php b/dav/SabreDAV/tests/Sabre/DAV/XMLUtilTest.php index d70fe9136..f7fcbb681 100644 --- a/dav/SabreDAV/tests/Sabre/DAV/XMLUtilTest.php +++ b/dav/SabreDAV/tests/Sabre/DAV/XMLUtilTest.php @@ -29,7 +29,7 @@ class Sabre_DAV_XMLUtilTest extends PHPUnit_Framework_TestCase { function testToClarkNotationDAVNamespace() { $dom = new DOMDocument(); - $dom->loadXML('Testdoc'); + $dom->loadXML('Testdoc'); $this->assertEquals( '{DAV:}test1', @@ -41,7 +41,7 @@ class Sabre_DAV_XMLUtilTest extends PHPUnit_Framework_TestCase { function testToClarkNotationNoElem() { $dom = new DOMDocument(); - $dom->loadXML('Testdoc'); + $dom->loadXML('Testdoc'); $this->assertNull( Sabre_DAV_XMLUtil::toClarkNotation($dom->firstChild->firstChild) @@ -49,59 +49,6 @@ class Sabre_DAV_XMLUtilTest extends PHPUnit_Framework_TestCase { } - function testConvertDAVNamespace() { - - $xml='blablabla'; - $this->assertEquals( - 'blablabla', - Sabre_DAV_XMLUtil::convertDAVNamespace($xml) - ); - - } - - function testConvertDAVNamespace2() { - - $xml='blablabla'; - $this->assertEquals( - 'blablabla', - Sabre_DAV_XMLUtil::convertDAVNamespace($xml) - ); - - } - - function testConvertDAVNamespace3() { - - $xml='blablabla'; - $this->assertEquals( - 'blablabla', - Sabre_DAV_XMLUtil::convertDAVNamespace($xml) - ); - - } - - function testConvertDAVNamespace4() { - - $xml='blablabla'; - $this->assertEquals( - 'blablabla', - Sabre_DAV_XMLUtil::convertDAVNamespace($xml) - ); - - } - - function testConvertDAVNamespaceMixedQuotes() { - - $xml=''; @@ -121,7 +68,6 @@ class Sabre_DAV_XMLUtilTest extends PHPUnit_Framework_TestCase { } /** - * @depends testConvertDAVNamespace * @expectedException Sabre_DAV_Exception_BadRequest */ function testLoadDOMDocumentInvalid() { diff --git a/dav/SabreDAV/tests/Sabre/VObject/ComponentTest.php b/dav/SabreDAV/tests/Sabre/VObject/ComponentTest.php index 71b33c079..42f836dbd 100644 --- a/dav/SabreDAV/tests/Sabre/VObject/ComponentTest.php +++ b/dav/SabreDAV/tests/Sabre/VObject/ComponentTest.php @@ -340,11 +340,14 @@ class Sabre_VObject_ComponentTest extends PHPUnit_Framework_TestCase { new Sabre_VObject_Component('VEVENT'), new Sabre_VObject_Component('VTODO') ); - $this->assertEquals("BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", $comp->serialize()); + + $str = $comp->serialize(); + + $this->assertEquals("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n", $str); } - function testSerializeOrder() { + function testSerializeOrderCompAndProp() { $comp = new Sabre_VObject_Component('VCALENDAR'); $comp->add(new Sabre_VObject_Component('VEVENT')); @@ -358,4 +361,30 @@ class Sabre_VObject_ComponentTest extends PHPUnit_Framework_TestCase { } + function testAnotherSerializeOrderProp() { + + $prop4s=array('1', '2', '3', '4', '5', '6', '7', '8', '9', '10'); + + $comp = new Sabre_VObject_Component('VCARD'); + $comp->__set('SOMEPROP','FOO'); + $comp->__set('ANOTHERPROP','FOO'); + $comp->__set('THIRDPROP','FOO'); + foreach ($prop4s as $prop4) { + $comp->add('PROP4', 'FOO '.$prop4); + } + $comp->__set('PROPNUMBERFIVE', 'FOO'); + $comp->__set('PROPNUMBERSIX', 'FOO'); + $comp->__set('PROPNUMBERSEVEN', 'FOO'); + $comp->__set('PROPNUMBEREIGHT', 'FOO'); + $comp->__set('PROPNUMBERNINE', 'FOO'); + $comp->__set('PROPNUMBERTEN', 'FOO'); + $comp->__set('VERSION','2.0'); + $comp->__set('UID', 'FOO'); + + $str = $comp->serialize(); + + $this->assertEquals("BEGIN:VCARD\r\nVERSION:2.0\r\nSOMEPROP:FOO\r\nANOTHERPROP:FOO\r\nTHIRDPROP:FOO\r\nPROP4:FOO 1\r\nPROP4:FOO 2\r\nPROP4:FOO 3\r\nPROP4:FOO 4\r\nPROP4:FOO 5\r\nPROP4:FOO 6\r\nPROP4:FOO 7\r\nPROP4:FOO 8\r\nPROP4:FOO 9\r\nPROP4:FOO 10\r\nPROPNUMBERFIVE:FOO\r\nPROPNUMBERSIX:FOO\r\nPROPNUMBERSEVEN:FOO\r\nPROPNUMBEREIGHT:FOO\r\nPROPNUMBERNINE:FOO\r\nPROPNUMBERTEN:FOO\r\nUID:FOO\r\nEND:VCARD\r\n", $str); + + } + } diff --git a/dav/SabreDAV/tests/Sabre/VObject/Issue154Test.php b/dav/SabreDAV/tests/Sabre/VObject/Issue154Test.php index a004eb081..f5136be12 100644 --- a/dav/SabreDAV/tests/Sabre/VObject/Issue154Test.php +++ b/dav/SabreDAV/tests/Sabre/VObject/Issue154Test.php @@ -6,9 +6,9 @@ class Sabre_VObject_Issue154Test extends PHPUnit_Framework_TestCase { $vcard = new Sabre_VObject_Component('VCARD'); $vcard->VERSION = '3.0'; - $vcard->UID = 'foo-bar'; $vcard->PHOTO = base64_encode('random_stuff'); $vcard->PHOTO->add('BASE64',null); + $vcard->UID = 'foo-bar'; $result = $vcard->serialize(); $expected = array( diff --git a/dav/common/calendar.fnk.php b/dav/common/calendar.fnk.php index 22f1d18c5..01af64fb2 100644 --- a/dav/common/calendar.fnk.php +++ b/dav/common/calendar.fnk.php @@ -301,7 +301,7 @@ function dav_get_current_user_calendars(&$server, $with_privilege = "") * @param Sabre_CalDAV_Calendar $calendar * @param string $calendarobject_uri * @param string $with_privilege - * @return null|Sabre_VObject_Component_VEvent + * @return null|Sabre_VObject_Component_VCalendar */ function dav_get_current_user_calendarobject(&$server, &$calendar, $calendarobject_uri, $with_privilege = "") { diff --git a/dav/common/calendar_rendering.fnk.php b/dav/common/calendar_rendering.fnk.php index b6c009dbb..e97de36b5 100644 --- a/dav/common/calendar_rendering.fnk.php +++ b/dav/common/calendar_rendering.fnk.php @@ -12,7 +12,7 @@ function renderCalDavEntry_calcalarm(&$alarm, &$parent) { $trigger = $alarm->__get("TRIGGER"); if (!isset($trigger['VALUE']) || strtoupper($trigger['VALUE']) === 'DURATION') { - $triggerDuration = Sabre_VObject_DateTimeParser::parseDuration($trigger); + $triggerDuration = Sabre_VObject_DateTimeParser::parseDuration($trigger->value); $related = (isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END') ? 'END' : 'START'; diff --git a/dav/common/wdcal.js b/dav/common/wdcal.js index 58e362439..adcaf15f5 100644 --- a/dav/common/wdcal.js +++ b/dav/common/wdcal.js @@ -120,6 +120,13 @@ function wdcal_edit_init(dateFormat, base_path) { $(this).data("orig", $(this).text()); }); + $("#new_alarm_adder a").click(function(ev) { + $("#new_alarm").val("1"); + $("#noti_new_row").show(); + $("#new_alarm_adder").hide(); + ev.preventDefault(); + }); + wdcal_edit_recur_recalc(); $(document).on("click", ".exception_remover", function(ev) { diff --git a/dav/common/wdcal_edit.inc.php b/dav/common/wdcal_edit.inc.php index c652d9749..5595369f6 100644 --- a/dav/common/wdcal_edit.inc.php +++ b/dav/common/wdcal_edit.inc.php @@ -3,13 +3,11 @@ /** * @param wdcal_local $localization * @param string $baseurl - * @param int $uid * @param int $calendar_id * @param int $uri - * @param string $recurr_uri * @return string */ -function wdcal_getEditPage_str(&$localization, $baseurl, $uid, $calendar_id, $uri, $recurr_uri = "") +function wdcal_getEditPage_str(&$localization, $baseurl, $calendar_id, $uri) { $server = dav_create_server(true, true, false); @@ -53,12 +51,53 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $uid, $calendar_id, $ur foreach ($z as $y) $recurrentce_exdates[] = $y->getTimeStamp(); } + $notifications = array(); + $alarms = $component->select("VALARM"); + foreach ($alarms as $alarm) { + /** @var Sabre_VObject_Component_VAlarm $alarm */ + $action = $alarm->__get("ACTION")->value; + $trigger = $alarm->__get("TRIGGER"); + + if(isset($trigger['VALUE']) && strtoupper($trigger['VALUE']) !== 'DURATION') { + notice("The notification of this event cannot be parsed"); + continue; + } + + /** @var DateInterval $triggerDuration */ + $triggerDuration = Sabre_VObject_DateTimeParser::parseDuration($trigger); + $unit = "hour"; + $value = 1; + if ($triggerDuration->s > 0) { + $unit = "second"; + $value = $triggerDuration->s + $triggerDuration->i * 60 + $triggerDuration->h * 3600 + $triggerDuration->d * 3600 * 24; // @TODO support more than days? + } elseif ($triggerDuration->m) { + $unit = "minute"; + $value = $triggerDuration->i + $triggerDuration->h * 60 + $triggerDuration->d * 60 * 24; + } elseif ($triggerDuration->h) { + $unit = "hour"; + $value = $triggerDuration->h + $triggerDuration->d * 24; + } elseif ($triggerDuration->d > 0) { + $unit = "day"; + $value = $triggerDuration->d; + } + + $rel = (isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END') ? 'end' : 'start'; + + + $notifications[] = array( + "action" => strtolower($action), + "rel" => $rel, + "trigger_unit" => $unit, + "trigger_value" => $value, + ); + } + if ($component->select("RRULE")) $recurrence = new Sabre_VObject_RecurrenceIterator($vObject, (string)$component->__get("UID")); else $recurrence = null; } elseif (isset($_REQUEST["start"]) && $_REQUEST["start"] > 0) { $calendars = dav_get_current_user_calendars($server, DAV_ACL_WRITE); - $calendar = dav_get_current_user_calendar_by_id($server, $calendar_id, DAV_ACL_WRITE); + //$calendar = dav_get_current_user_calendar_by_id($server, $calendar_id, DAV_ACL_WRITE); $event = array( "id" => 0, @@ -71,15 +110,15 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $uid, $calendar_id, $ur "Color" => null, ); if ($_REQUEST["isallday"]) { - $notifications = array(array("rel" => "start", "type" => "duration", "period" => "hour", "period_val" => 24)); + $notifications = array(); } else { - $notifications = array(array("rel" => "start", "type" => "duration", "period" => "hour", "period_val" => 1)); + $notifications = array(array("action" => "email", "rel" => "start", "trigger_unit" => "hour", "trigger_value" => 1)); } $recurrence = null; $recurrentce_exdates = array(); } else { $calendars = dav_get_current_user_calendars($server, DAV_ACL_WRITE); - $calendar = dav_get_current_user_calendar_by_id($server, $calendar_id, DAV_ACL_WRITE); + //$calendar = dav_get_current_user_calendar_by_id($server, $calendar_id, DAV_ACL_WRITE); $event = array( "id" => 0, @@ -91,7 +130,7 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $uid, $calendar_id, $ur "Location" => "", "Color" => null, ); - $notifications = array(array("rel" => "start", "type" => "duration", "period" => "hour", "period_val" => 1)); + $notifications = array(array("action" => "email", "rel" => "start", "trigger_unit" => "hour", "trigger_value" => 1)); $recurrence = null; $recurrentce_exdates = array(); } @@ -270,7 +309,7 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $uid, $calendar_id, $ur $out .= ""; $monthly_rule = ""; - if ($recurrence->frequency == "monthly" || $recurrence->frequency == "yearly") { + if ($recurrence && ($recurrence->frequency == "monthly" || $recurrence->frequency == "yearly")) { if (is_null($recurrence->byDay) && !is_null($recurrence->byMonthDay) && count($recurrence->byMonthDay) == 1) { $day = date("j", $event["StartTime"]); if ($recurrence->byMonthDay[0] == $day) $monthly_rule = "bymonthday"; @@ -324,7 +363,7 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $uid, $calendar_id, $ur $out .= ""; $out .= "\n"; - if ($recurrence->frequency == "yearly") { + if ($recurrence && $recurrence->frequency == "yearly") { if (count($recurrence->byMonth) != 1 || $recurrence->byMonth[0] != date("n", $event["StartTime"])) notice("The recurrence of this event cannot be parsed!"); } @@ -408,31 +447,53 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $uid, $calendar_id, $ur $out .= "

" . t("Notification") . "

"; - /* - $out .= ' - ' . t('before') . ' -

'; - */ + if (!$notifications) $notifications = array(); + $notifications["new"] = array( + "action" => "email", + "trigger_value" => 60, + "trigger_unit" => "minute", + "rel" => "start", + ); + + foreach ($notifications as $index => $noti) { + + $unparsable = false; + if (!in_array($noti["action"], array("email", "display"))) $unparsable = true; + + $out .= "
\n"; + $out .= "
"; + } + $out .= ""; $out .= ""; - $out .= ""; + $out .= "
"; return $out; } @@ -441,6 +502,7 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $uid, $calendar_id, $ur /** * @param Sabre_VObject_Component_VEvent $component * @param wdcal_local $localization + * @return int */ function wdcal_set_component_date(&$component, &$localization) { @@ -462,6 +524,8 @@ function wdcal_set_component_date(&$component, &$localization) $component->__unset("DTEND"); $component->add($datetime_start); $component->add($datetime_end); + + return $ts_start; } /** @@ -569,13 +633,6 @@ function wdcal_set_component_recurrence(&$component, &$localization) default: $part_freq = ""; } -/* - echo "
!";
-	 echo $part_freq . "\n";
-	 var_dump($_REQUEST);
-	 echo "
"; - die(); -*/ if ($part_freq == "") return; @@ -598,15 +655,69 @@ function wdcal_set_component_recurrence(&$component, &$localization) } -/** + /** + * @param Sabre_VObject_Component_VEvent $component + * @param wdcal_local $localization + * @param string $summary + * @param int $dtstart + */ +function wdcal_set_component_alerts(&$component, &$localization, $summary, $dtstart) +{ + $a = get_app(); + + $prev_alarms = $component->select("VALARM"); + $component->__unset("VALARM"); + + foreach ($prev_alarms as $al) { + /** @var Sabre_VObject_Component_VAlarm $al */ + } + + foreach (array_keys($_REQUEST["noti_type"]) as $key) if (is_numeric($key) || ($key == "new" && $_REQUEST["new_alarm"] == 1)) { + $alarm = new Sabre_VObject_Component_VAlarm("VALARM"); + + switch ($_REQUEST["noti_type"][$key]) { + case "email": + $mailtext = str_replace(array( + "#date#", "#name", + ), array( + $localization->date_timestamp2local($dtstart), $summary, + ), t("The event #name# will start at #date")); + + $alarm->add(new Sabre_VObject_Property("ACTION", "EMAIL")); + $alarm->add(new Sabre_VObject_Property("SUMMARY", $summary)); + $alarm->add(new Sabre_VObject_Property("DESCRIPTION", $mailtext)); + $alarm->add(new Sabre_VObject_Property("ATTENDEE", "MAILTO:" . $a->user["email"])); + break; + case "display": + $alarm->add(new Sabre_VObject_Property("ACTION", "DISPLAY")); + $text = str_replace("#name#", $summary, t("#name# is about to begin.")); + $alarm->add(new Sabre_VObject_Property("DESCRIPTION", $text)); + break; + default: + continue; + } + + $trigger_name = "TRIGGER"; + $trigger_val = ""; // @TODO Bugfix : und ; sind evtl. vertauscht vgl. http://www.kanzaki.com/docs/ical/trigger.html + if ($_REQUEST["noti_ref"][$key] == "end") $trigger_name .= ";RELATED=END"; + $trigger_val .= "-P"; + if (in_array($_REQUEST["noti_unit"][$key], array("H", "M", "S"))) $trigger_val .= "T"; + $trigger_val .= IntVal($_REQUEST["noti_value"][$key]) . $_REQUEST["noti_unit"][$key]; + $alarm->add(new Sabre_VObject_Property($trigger_name, $trigger_val)); + + $component->add($alarm); + } + +} + + /** * @param string $uri - * @param string $recurr_uri * @param int $uid * @param string $timezone * @param string $goaway_url * @return array */ -function wdcal_postEditPage($uri, $recurr_uri = "", $uid = 0, $timezone = "", $goaway_url = "") +function wdcal_postEditPage($uri, $uid = 0, $timezone = "", $goaway_url = "") { $uid = IntVal($uid); $localization = wdcal_local::getInstanceByUser($uid); @@ -629,8 +740,9 @@ function wdcal_postEditPage($uri, $recurr_uri = "", $uid = 0, $timezone = "", $g $obj_uri = $component->__get("UID"); } - wdcal_set_component_date($component, $localization); + $ts_start = wdcal_set_component_date($component, $localization); wdcal_set_component_recurrence($component, $localization); + wdcal_set_component_alerts($component, $localization, icalendar_sanitize_string(dav_compat_parse_text_serverside("summary")), $ts_start); $component->__unset("LOCATION"); $component->__unset("SUMMARY"); diff --git a/dav/layout.fnk.php b/dav/layout.fnk.php index 6f59d7456..597e773d2 100644 --- a/dav/layout.fnk.php +++ b/dav/layout.fnk.php @@ -290,10 +290,9 @@ function wdcal_printCalendar($calendars, $calendars_selected, $data_feed_url, $v /** * @param int $calendar_id * @param int $calendarobject_id - * @param string $recurr_uri * @return string */ -function wdcal_getDetailPage($calendar_id, $calendarobject_id, $recurr_uri) +function wdcal_getDetailPage($calendar_id, $calendarobject_id) { $a = get_app(); @@ -322,15 +321,14 @@ function wdcal_getDetailPage($calendar_id, $calendarobject_id, $recurr_uri) /** * @param int $calendar_id * @param int $uri - * @param string $recurr_uri * @return string */ -function wdcal_getEditPage($calendar_id, $uri, $recurr_uri = "") +function wdcal_getEditPage($calendar_id, $uri) { $a = get_app(); $localization = wdcal_local::getInstanceByUser($a->user["uid"]); - return wdcal_getEditPage_str($localization, $a->get_baseurl(), $a->user["uid"], $calendar_id, $uri, $recurr_uri); + return wdcal_getEditPage_str($localization, $a->get_baseurl(), $calendar_id, $uri); } /** @@ -341,7 +339,7 @@ function wdcal_getNewPage() $a = get_app(); $localization = wdcal_local::getInstanceByUser($a->user["uid"]); - return wdcal_getEditPage_str($localization, $a->get_baseurl(), $a->user["uid"], 0, 0); + return wdcal_getEditPage_str($localization, $a->get_baseurl(), 0, 0); } diff --git a/dav/main.php b/dav/main.php index 2a0092aca..14c987242 100644 --- a/dav/main.php +++ b/dav/main.php @@ -24,12 +24,6 @@ function dav_module() function dav_include_files() { - /* - require_once (__DIR__ . "/SabreDAV/lib/Sabre.includes.php"); - require_once (__DIR__ . "/SabreDAV/lib/Sabre/VObject/includes.php"); - require_once (__DIR__ . "/SabreDAV/lib/Sabre/DAVACL/includes.php"); - require_once (__DIR__ . "/SabreDAV/lib/Sabre/CalDAV/includes.php"); - */ require_once (__DIR__ . "/SabreDAV/lib/Sabre/autoload.php"); require_once (__DIR__ . "/common/calendar.fnk.php"); @@ -145,20 +139,19 @@ function dav_content() } elseif (isset($a->argv[3]) && $a->argv[3] == "ics-import") { return wdcal_import_user_ics($calendar_id); } elseif (isset($a->argv[3]) && $a->argv[3] > 0) { - $recurr_uri = ""; // @TODO if (isset($a->argv[4]) && $a->argv[4] == "edit") { $o = ""; if (isset($_REQUEST["save"])) { check_form_security_token_redirectOnErr($a->get_baseurl() . "/dav/wdcal/", "caledit"); - $ret = wdcal_postEditPage($a->argv[3], $recurr_uri, $a->user["uid"], $a->timezone, $a->get_baseurl() . "/dav/wdcal/"); + $ret = wdcal_postEditPage($a->argv[3], $a->user["uid"], $a->timezone, $a->get_baseurl() . "/dav/wdcal/"); if ($ret["ok"]) notice($ret["msg"]); else info($ret["msg"]); goaway($a->get_baseurl() . "/dav/wdcal/"); } - $o .= wdcal_getEditPage($calendar_id, $a->argv[3], $recurr_uri); + $o .= wdcal_getEditPage($calendar_id, $a->argv[3]); return $o; } else { - return wdcal_getDetailPage($calendar_id, $a->argv[3], $recurr_uri); + return wdcal_getDetailPage($calendar_id, $a->argv[3]); } } else { // @TODO Edit Calendar