diff options
author | Thomas Tanghus <thomas@tanghus.net> | 2012-08-24 16:26:06 +0400 |
---|---|---|
committer | Thomas Tanghus <thomas@tanghus.net> | 2012-08-24 16:26:06 +0400 |
commit | 46d6fd15e4cc02d45079ffc688be0684e61f1434 (patch) | |
tree | f9f3b34f17fedb34821c4a00b8945f74fcc01a25 /apps/calendar | |
parent | d1421ca5ab089d211b594d868d711a6f03527f91 (diff) |
Implemented sharing api for CalDAV.
Diffstat (limited to 'apps/calendar')
-rw-r--r-- | apps/calendar/appinfo/app.php | 6 | ||||
-rw-r--r-- | apps/calendar/appinfo/remote.php | 12 | ||||
-rw-r--r-- | apps/calendar/lib/sabre/backend.php (renamed from apps/calendar/lib/connector_sabre.php) | 0 | ||||
-rw-r--r-- | apps/calendar/lib/sabre/calendar.php | 127 | ||||
-rw-r--r-- | apps/calendar/lib/sabre/calendarroot.php | 45 | ||||
-rw-r--r-- | apps/calendar/lib/sabre/object.php | 87 | ||||
-rw-r--r-- | apps/calendar/lib/sabre/usercalendars.php | 46 |
7 files changed, 316 insertions, 7 deletions
diff --git a/apps/calendar/appinfo/app.php b/apps/calendar/appinfo/app.php index 9ae255853d5..00787055787 100644 --- a/apps/calendar/appinfo/app.php +++ b/apps/calendar/appinfo/app.php @@ -4,7 +4,11 @@ OC::$CLASSPATH['OC_Calendar_App'] = 'apps/calendar/lib/app.php'; OC::$CLASSPATH['OC_Calendar_Calendar'] = 'apps/calendar/lib/calendar.php'; OC::$CLASSPATH['OC_Calendar_Object'] = 'apps/calendar/lib/object.php'; OC::$CLASSPATH['OC_Calendar_Hooks'] = 'apps/calendar/lib/hooks.php'; -OC::$CLASSPATH['OC_Connector_Sabre_CalDAV'] = 'apps/calendar/lib/connector_sabre.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CalDAV'] = 'apps/calendar/lib/sabre/backend.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CalDAV_CalendarRoot'] = 'apps/calendar/lib/sabre/calendarroot.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CalDAV_UserCalendars'] = 'apps/calendar/lib/sabre/usercalendars.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CalDAV_Calendar'] = 'apps/calendar/lib/sabre/calendar.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CalDAV_CalendarObject'] = 'apps/calendar/lib/sabre/object.php'; OC::$CLASSPATH['OC_Calendar_Repeat'] = 'apps/calendar/lib/repeat.php'; OC::$CLASSPATH['OC_Calendar_Share'] = 'apps/calendar/lib/share.php'; OC::$CLASSPATH['OC_Search_Provider_Calendar'] = 'apps/calendar/lib/search.php'; diff --git a/apps/calendar/appinfo/remote.php b/apps/calendar/appinfo/remote.php index dd605072ce7..f499d909666 100644 --- a/apps/calendar/appinfo/remote.php +++ b/apps/calendar/appinfo/remote.php @@ -21,15 +21,15 @@ $principalBackend = new OC_Connector_Sabre_Principal(); $caldavBackend = new OC_Connector_Sabre_CalDAV(); // Root nodes -$Sabre_CalDAV_Principal_Collection = new Sabre_CalDAV_Principal_Collection($principalBackend); +$Sabre_CalDAV_Principal_Collection = new Sabre_CalDAV_Principal_Collection($principalBackend); $Sabre_CalDAV_Principal_Collection->disableListing = true; // Disable listening -$Sabre_CalDAV_CalendarRootNode = new Sabre_CalDAV_CalendarRootNode($principalBackend, $caldavBackend); -$Sabre_CalDAV_CalendarRootNode->disableListing = true; // Disable listening +$calendarRoot = new OC_Connector_Sabre_CalDAV_CalendarRoot($principalBackend, $caldavBackend); +$calendarRoot->disableListing = true; // Disable listening -$nodes = array( - $Sabre_CalDAV_Principal_Collection, - $Sabre_CalDAV_CalendarRootNode, +$nodes = array( + $Sabre_CalDAV_Principal_Collection, + $calendarRoot, ); // Fire up server diff --git a/apps/calendar/lib/connector_sabre.php b/apps/calendar/lib/sabre/backend.php index ac3b26ceb33..ac3b26ceb33 100644 --- a/apps/calendar/lib/connector_sabre.php +++ b/apps/calendar/lib/sabre/backend.php diff --git a/apps/calendar/lib/sabre/calendar.php b/apps/calendar/lib/sabre/calendar.php new file mode 100644 index 00000000000..179be1b2813 --- /dev/null +++ b/apps/calendar/lib/sabre/calendar.php @@ -0,0 +1,127 @@ +<?php +/** + * ownCloud - OC_Connector_Sabre_Sabre_CalDAV_Calendar + * + * @author Thomas Tanghus + * @copyright 2012 Thomas Tanghus (thomas@tanghus.net) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +/** + * This class overrides Sabre_CalDAV_Calendar::getACL() to return read/write + * permissions based on user and shared state and it overrides + * Sabre_CalDAV_Calendar::getChild() and Sabre_CalDAV_Calendar::getChildren() + * to instantiate OC_Connector_Sabre_CalDAV_CalendarObjects. +*/ +class OC_Connector_Sabre_CalDAV_Calendar extends Sabre_CalDAV_Calendar { + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + $readprincipal = $this->getOwner(); + $writeprincipal = $this->getOwner(); + $uid = OC_Calendar_Calendar::extractUserID($this->getOwner()); + + if($uid != OCP\USER::getUser()) { + $sharedCalendar = OCP\Share::getItemSharedWithBySource('calendar', $this->$calendarInfo['id']); + if ($sharedCalendar && ($sharedCalendar['permissions'] & OCP\Share::PERMISSION_READ)) { + $readprincipal = 'principals/' . OCP\USER::getUser(); + } + if ($sharedCalendar && ($sharedCalendar['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + $writeprincipal = 'principals/' . OCP\USER::getUser(); + } + } + + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal, + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $writeprincipal, + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal . '/calendar-proxy-write', + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $writeprincipal . '/calendar-proxy-write', + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal . '/calendar-proxy-read', + 'protected' => true, + ), + array( + 'privilege' => '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}read-free-busy', + 'principal' => '{DAV:}authenticated', + 'protected' => true, + ), + + ); + + } + + /** + * Returns a calendar object + * + * The contained calendar objects are for example Events or Todo's. + * + * @param string $name + * @return Sabre_DAV_ICalendarObject + */ + public function getChild($name) { + + $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); + if (!$obj) throw new Sabre_DAV_Exception_NotFound('Calendar object not found'); + return new OC_Connector_Sabre_CalDAV_CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); + + } + + /** + * Returns the full list of calendar objects + * + * @return array + */ + public function getChildren() { + + $objs = $this->caldavBackend->getCalendarObjects($this->calendarInfo['id']); + $children = array(); + foreach($objs as $obj) { + $children[] = new OC_Connector_Sabre_CalDAV_CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); + } + return $children; + + } + +}
\ No newline at end of file diff --git a/apps/calendar/lib/sabre/calendarroot.php b/apps/calendar/lib/sabre/calendarroot.php new file mode 100644 index 00000000000..e09731c95b7 --- /dev/null +++ b/apps/calendar/lib/sabre/calendarroot.php @@ -0,0 +1,45 @@ +<?php +/** + * ownCloud - OC_Connector_Sabre_CalDAV_CalendarRoot + * + * @author Thomas Tanghus + * @copyright 2012 Thomas Tanghus (thomas@tanghus.net) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +/** + * This class overrides Sabre_CalDAV_CalendarRootNode::getChildForPrincipal() + * to instantiate OC_Connector_Sabre_CalDAV_UserCalendars. +*/ +class OC_Connector_Sabre_CalDAV_CalendarRoot extends Sabre_CalDAV_CalendarRootNode { + + /** + * This method returns a node for a principal. + * + * The passed array contains principal information, and is guaranteed to + * at least contain a uri item. Other properties may or may not be + * supplied by the authentication backend. + * + * @param array $principal + * @return Sabre_DAV_INode + */ + public function getChildForPrincipal(array $principal) { + + return new OC_Connector_Sabre_CalDAV_UserCalendars($this->principalBackend, $this->caldavBackend, $principal['uri']); + + } + +}
\ No newline at end of file diff --git a/apps/calendar/lib/sabre/object.php b/apps/calendar/lib/sabre/object.php new file mode 100644 index 00000000000..25954e6ee55 --- /dev/null +++ b/apps/calendar/lib/sabre/object.php @@ -0,0 +1,87 @@ +<?php +/** + * ownCloud - OC_Connector_Sabre_CalDAV_CalendarObject + * + * @author Thomas Tanghus + * @copyright 2012 Thomas Tanghus (thomas@tanghus.net) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +/** + * This class overrides Sabre_CalDAV_CalendarObject::getACL() + * to return read/write permissions based on user and shared state. +*/ +class OC_Connector_Sabre_CalDAV_CalendarObject extends Sabre_CalDAV_CalendarObject { + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + $readprincipal = $this->getOwner(); + $writeprincipal = $this->getOwner(); + $uid = OC_Calendar_Calendar::extractUserID($this->getOwner()); + + if($uid != OCP\USER::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('calendar', $this->$calendarInfo['id']); + if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_READ)) { + $readprincipal = 'principals/' . OCP\USER::getUser(); + } + if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + $writeprincipal = 'principals/' . OCP\USER::getUser(); + } + } + + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal, + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $writeprincipal, + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal . '/calendar-proxy-write', + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $writeprincipal . '/calendar-proxy-write', + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal . '/calendar-proxy-read', + 'protected' => true, + ), + ); + + } + +}
\ No newline at end of file diff --git a/apps/calendar/lib/sabre/usercalendars.php b/apps/calendar/lib/sabre/usercalendars.php new file mode 100644 index 00000000000..919f6b27e18 --- /dev/null +++ b/apps/calendar/lib/sabre/usercalendars.php @@ -0,0 +1,46 @@ +<?php +/** + * ownCloud - OC_Connector_Sabre_CalDAV_UserCalendars + * + * @author Thomas Tanghus + * @copyright 2012 Thomas Tanghus (thomas@tanghus.net) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +/** + * This class overrides Sabre_CalDAV_UserCalendars::getChildren() + * to instantiate OC_Connector_Sabre_CalDAV_Calendars. +*/ +class OC_Connector_Sabre_CalDAV_UserCalendars extends Sabre_CalDAV_UserCalendars { + + /** + * Returns a list of calendars + * + * @return array + */ + public function getChildren() { + + $calendars = $this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']); + $objs = array(); + foreach($calendars as $calendar) { + $objs[] = new OC_Connector_Sabre_CalDAV_Calendar($this->principalBackend, $this->caldavBackend, $calendar); + } + $objs[] = new Sabre_CalDAV_Schedule_Outbox($this->principalInfo['uri']); + return $objs; + + } + +}
\ No newline at end of file |