From 50569114acdc64e7c7cae1498635d3f821517c30 Mon Sep 17 00:00:00 2001 From: Daniel Lange Date: Mon, 7 Mar 2016 15:53:16 +0100 Subject: Initial commit of the Faster IT roundcube_calendar plugin distribution This includes: * Kolab plugins 3.2.9 (calendar and libcalendaring) * CalDAV driver 3.2.8 * .htaccess files for at least some security * SabreDAV updated to 1.8.12 (Jan 2015 release) * Support for CURLOPT_SSL_* settings to allow self-signed certificates * Small fixes & improved documentation --- .../CalDAV/Property/AllowedSharingModes.php | 74 +++++++ .../lib/OldSabre/CalDAV/Property/Invite.php | 227 +++++++++++++++++++++ .../CalDAV/Property/ScheduleCalendarTransp.php | 102 +++++++++ .../Property/SupportedCalendarComponentSet.php | 88 ++++++++ .../CalDAV/Property/SupportedCalendarData.php | 40 ++++ .../CalDAV/Property/SupportedCollationSet.php | 45 ++++ 6 files changed, 576 insertions(+) create mode 100644 calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/AllowedSharingModes.php create mode 100644 calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/Invite.php create mode 100644 calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/ScheduleCalendarTransp.php create mode 100644 calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/SupportedCalendarComponentSet.php create mode 100644 calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/SupportedCalendarData.php create mode 100644 calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/SupportedCollationSet.php (limited to 'calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property') diff --git a/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/AllowedSharingModes.php b/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/AllowedSharingModes.php new file mode 100644 index 0000000..918c3d1 --- /dev/null +++ b/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/AllowedSharingModes.php @@ -0,0 +1,74 @@ +canBeShared = $canBeShared; + $this->canBePublished = $canBePublished; + + } + + /** + * Serializes the property in a DOMDocument + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server, \DOMElement $node) { + + $doc = $node->ownerDocument; + if ($this->canBeShared) { + $xcomp = $doc->createElement('cs:can-be-shared'); + $node->appendChild($xcomp); + } + if ($this->canBePublished) { + $xcomp = $doc->createElement('cs:can-be-published'); + $node->appendChild($xcomp); + } + + } + +} diff --git a/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/Invite.php b/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/Invite.php new file mode 100644 index 0000000..0e2f8f1 --- /dev/null +++ b/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/Invite.php @@ -0,0 +1,227 @@ +users = $users; + $this->organizer = $organizer; + + } + + /** + * Returns the list of users, as it was passed to the constructor. + * + * @return array + */ + public function getValue() { + + return $this->users; + + } + + /** + * Serializes the property in a DOMDocument + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $node) { + + $doc = $node->ownerDocument; + + if (!is_null($this->organizer)) { + + $xorganizer = $doc->createElement('cs:organizer'); + + $href = $doc->createElement('d:href'); + $href->appendChild($doc->createTextNode($this->organizer['href'])); + $xorganizer->appendChild($href); + + if (isset($this->organizer['commonName']) && $this->organizer['commonName']) { + $commonName = $doc->createElement('cs:common-name'); + $commonName->appendChild($doc->createTextNode($this->organizer['commonName'])); + $xorganizer->appendChild($commonName); + } + if (isset($this->organizer['firstName']) && $this->organizer['firstName']) { + $firstName = $doc->createElement('cs:first-name'); + $firstName->appendChild($doc->createTextNode($this->organizer['firstName'])); + $xorganizer->appendChild($firstName); + } + if (isset($this->organizer['lastName']) && $this->organizer['lastName']) { + $lastName = $doc->createElement('cs:last-name'); + $lastName->appendChild($doc->createTextNode($this->organizer['lastName'])); + $xorganizer->appendChild($lastName); + } + + $node->appendChild($xorganizer); + + + } + + foreach($this->users as $user) { + + $xuser = $doc->createElement('cs:user'); + + $href = $doc->createElement('d:href'); + $href->appendChild($doc->createTextNode($user['href'])); + $xuser->appendChild($href); + + if (isset($user['commonName']) && $user['commonName']) { + $commonName = $doc->createElement('cs:common-name'); + $commonName->appendChild($doc->createTextNode($user['commonName'])); + $xuser->appendChild($commonName); + } + + switch($user['status']) { + + case SharingPlugin::STATUS_ACCEPTED : + $status = $doc->createElement('cs:invite-accepted'); + $xuser->appendChild($status); + break; + case SharingPlugin::STATUS_DECLINED : + $status = $doc->createElement('cs:invite-declined'); + $xuser->appendChild($status); + break; + case SharingPlugin::STATUS_NORESPONSE : + $status = $doc->createElement('cs:invite-noresponse'); + $xuser->appendChild($status); + break; + case SharingPlugin::STATUS_INVALID : + $status = $doc->createElement('cs:invite-invalid'); + $xuser->appendChild($status); + break; + + } + + $xaccess = $doc->createElement('cs:access'); + + if ($user['readOnly']) { + $xaccess->appendChild( + $doc->createElement('cs:read') + ); + } else { + $xaccess->appendChild( + $doc->createElement('cs:read-write') + ); + } + $xuser->appendChild($xaccess); + + if (isset($user['summary']) && $user['summary']) { + $summary = $doc->createElement('cs:summary'); + $summary->appendChild($doc->createTextNode($user['summary'])); + $xuser->appendChild($summary); + } + + $node->appendChild($xuser); + + } + + + } + + /** + * Unserializes the property. + * + * This static method should return a an instance of this object. + * + * @param \DOMElement $prop + * @return DAV\IProperty + */ + static function unserialize(\DOMElement $prop) { + + $xpath = new \DOMXPath($prop->ownerDocument); + $xpath->registerNamespace('cs', CalDAV\Plugin::NS_CALENDARSERVER); + $xpath->registerNamespace('d', 'urn:DAV'); + + $users = array(); + + foreach($xpath->query('cs:user', $prop) as $user) { + + $status = null; + if ($xpath->evaluate('boolean(cs:invite-accepted)', $user)) { + $status = SharingPlugin::STATUS_ACCEPTED; + } elseif ($xpath->evaluate('boolean(cs:invite-declined)', $user)) { + $status = SharingPlugin::STATUS_DECLINED; + } elseif ($xpath->evaluate('boolean(cs:invite-noresponse)', $user)) { + $status = SharingPlugin::STATUS_NORESPONSE; + } elseif ($xpath->evaluate('boolean(cs:invite-invalid)', $user)) { + $status = SharingPlugin::STATUS_INVALID; + } else { + throw new DAV\Exception('Every cs:user property must have one of cs:invite-accepted, cs:invite-declined, cs:invite-noresponse or cs:invite-invalid'); + } + $users[] = array( + 'href' => $xpath->evaluate('string(d:href)', $user), + 'commonName' => $xpath->evaluate('string(cs:common-name)', $user), + 'readOnly' => $xpath->evaluate('boolean(cs:access/cs:read)', $user), + 'summary' => $xpath->evaluate('string(cs:summary)', $user), + 'status' => $status, + ); + + } + + return new self($users); + + } + +} diff --git a/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/ScheduleCalendarTransp.php b/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/ScheduleCalendarTransp.php new file mode 100644 index 0000000..bf8f78a --- /dev/null +++ b/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/ScheduleCalendarTransp.php @@ -0,0 +1,102 @@ +value = $value; + + } + + /** + * Returns the current value + * + * @return string + */ + public function getValue() { + + return $this->value; + + } + + /** + * Serializes the property in a DOMDocument + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $node) { + + $doc = $node->ownerDocument; + switch($this->value) { + case self::TRANSPARENT : + $xval = $doc->createElement('cal:transparent'); + break; + case self::OPAQUE : + $xval = $doc->createElement('cal:opaque'); + break; + } + + $node->appendChild($xval); + + } + + /** + * Unserializes the DOMElement back into a Property class. + * + * @param \DOMElement $node + * @return ScheduleCalendarTransp + */ + static function unserialize(\DOMElement $node) { + + $value = null; + foreach($node->childNodes as $childNode) { + switch(DAV\XMLUtil::toClarkNotation($childNode)) { + case '{' . CalDAV\Plugin::NS_CALDAV . '}opaque' : + $value = self::OPAQUE; + break; + case '{' . CalDAV\Plugin::NS_CALDAV . '}transparent' : + $value = self::TRANSPARENT; + break; + } + } + if (is_null($value)) + return null; + + return new self($value); + + } +} diff --git a/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/SupportedCalendarComponentSet.php b/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/SupportedCalendarComponentSet.php new file mode 100644 index 0000000..cd4b469 --- /dev/null +++ b/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/SupportedCalendarComponentSet.php @@ -0,0 +1,88 @@ +components = $components; + + } + + /** + * Returns the list of supported components + * + * @return array + */ + public function getValue() { + + return $this->components; + + } + + /** + * Serializes the property in a DOMDocument + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $node) { + + $doc = $node->ownerDocument; + foreach($this->components as $component) { + + $xcomp = $doc->createElement('cal:comp'); + $xcomp->setAttribute('name',$component); + $node->appendChild($xcomp); + + } + + } + + /** + * Unserializes the DOMElement back into a Property class. + * + * @param \DOMElement $node + * @return Property_SupportedCalendarComponentSet + */ + static function unserialize(\DOMElement $node) { + + $components = array(); + foreach($node->childNodes as $childNode) { + if (DAV\XMLUtil::toClarkNotation($childNode)==='{' . CalDAV\Plugin::NS_CALDAV . '}comp') { + $components[] = $childNode->getAttribute('name'); + } + } + return new self($components); + + } + +} diff --git a/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/SupportedCalendarData.php b/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/SupportedCalendarData.php new file mode 100644 index 0000000..fd358c6 --- /dev/null +++ b/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/SupportedCalendarData.php @@ -0,0 +1,40 @@ +ownerDocument; + + $prefix = isset($server->xmlNamespaces[Plugin::NS_CALDAV])?$server->xmlNamespaces[Plugin::NS_CALDAV]:'cal'; + + $caldata = $doc->createElement($prefix . ':calendar-data'); + $caldata->setAttribute('content-type','text/calendar'); + $caldata->setAttribute('version','2.0'); + + $node->appendChild($caldata); + } + +} diff --git a/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/SupportedCollationSet.php b/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/SupportedCollationSet.php new file mode 100644 index 0000000..9a92c7c --- /dev/null +++ b/calendar/lib/SabreDAV/lib/OldSabre/CalDAV/Property/SupportedCollationSet.php @@ -0,0 +1,45 @@ +ownerDocument; + + $prefix = $node->lookupPrefix('urn:ietf:params:xml:ns:caldav'); + if (!$prefix) $prefix = 'cal'; + + $node->appendChild( + $doc->createElement($prefix . ':supported-collation','i;ascii-casemap') + ); + $node->appendChild( + $doc->createElement($prefix . ':supported-collation','i;octet') + ); + $node->appendChild( + $doc->createElement($prefix . ':supported-collation','i;unicode-casemap') + ); + + + } + +} -- cgit v1.2.3