diff options
author | Thomas Tanghus <thomas@tanghus.net> | 2012-08-24 04:54:14 +0200 |
---|---|---|
committer | Thomas Tanghus <thomas@tanghus.net> | 2012-08-24 04:56:21 +0200 |
commit | 953f9d95f803ec32f66301e4cc42ecc77d8dab50 (patch) | |
tree | 2942bd4e3a929b63c12c787f17a1d457642723ec | |
parent | 07a889631eeecfbf6a4c0e94220c4179748eb1ff (diff) | |
download | nextcloud-server-953f9d95f803ec32f66301e4cc42ecc77d8dab50.tar.gz nextcloud-server-953f9d95f803ec32f66301e4cc42ecc77d8dab50.zip |
Implemented sharing api for CardDAV. Next step CalDAV.
-rw-r--r-- | apps/contacts/appinfo/app.php | 8 | ||||
-rw-r--r-- | apps/contacts/appinfo/remote.php | 16 | ||||
-rw-r--r-- | apps/contacts/lib/sabre/addressbook.php | 125 | ||||
-rw-r--r-- | apps/contacts/lib/sabre/addressbookroot.php | 45 | ||||
-rw-r--r-- | apps/contacts/lib/sabre/backend.php (renamed from apps/contacts/lib/connector_sabre.php) | 1 | ||||
-rw-r--r-- | apps/contacts/lib/sabre/card.php | 94 | ||||
-rw-r--r-- | apps/contacts/lib/sabre/useraddressbooks.php | 45 | ||||
-rw-r--r-- | apps/contacts/lib/sabre/vcfexportplugin.php (renamed from apps/contacts/lib/VCFExportPlugin.php) | 0 | ||||
-rw-r--r-- | apps/contacts/lib/vcard.php | 2 |
9 files changed, 325 insertions, 11 deletions
diff --git a/apps/contacts/appinfo/app.php b/apps/contacts/appinfo/app.php index 68163430186..102c04705a4 100644 --- a/apps/contacts/appinfo/app.php +++ b/apps/contacts/appinfo/app.php @@ -5,8 +5,12 @@ OC::$CLASSPATH['OC_Contacts_VCard'] = 'apps/contacts/lib/vcard.php'; OC::$CLASSPATH['OC_Contacts_Hooks'] = 'apps/contacts/lib/hooks.php'; OC::$CLASSPATH['OC_Share_Backend_Contact'] = 'apps/contacts/lib/share/contact.php'; OC::$CLASSPATH['OC_Share_Backend_Addressbook'] = 'apps/contacts/lib/share/addressbook.php'; -OC::$CLASSPATH['OC_Connector_Sabre_CardDAV'] = 'apps/contacts/lib/connector_sabre.php'; -OC::$CLASSPATH['Sabre_CardDAV_VCFExportPlugin'] = 'apps/contacts/lib/VCFExportPlugin.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV'] = 'apps/contacts/lib/sabre/backend.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_AddressBookRoot'] = 'apps/contacts/lib/sabre/addressbookroot.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_UserAddressBooks'] = 'apps/contacts/lib/sabre/useraddressbooks.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_AddressBook'] = 'apps/contacts/lib/sabre/addressbook.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_Card'] = 'apps/contacts/lib/sabre/card.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_VCFExportPlugin'] = 'apps/contacts/lib/sabre/vcfexportplugin.php'; OC::$CLASSPATH['OC_Search_Provider_Contacts'] = 'apps/contacts/lib/search.php'; OCP\Util::connectHook('OC_User', 'post_createUser', 'OC_Contacts_Hooks', 'createUser'); OCP\Util::connectHook('OC_User', 'post_deleteUser', 'OC_Contacts_Hooks', 'deleteUser'); diff --git a/apps/contacts/appinfo/remote.php b/apps/contacts/appinfo/remote.php index 6cb5b59525c..00851037a6c 100644 --- a/apps/contacts/appinfo/remote.php +++ b/apps/contacts/appinfo/remote.php @@ -36,15 +36,15 @@ $principalBackend = new OC_Connector_Sabre_Principal(); $carddavBackend = new OC_Connector_Sabre_CardDAV(); // Root nodes -$Sabre_CalDAV_Principal_Collection = new Sabre_CalDAV_Principal_Collection($principalBackend); -$Sabre_CalDAV_Principal_Collection->disableListing = true; // Disable listening +$principalCollection = new Sabre_CalDAV_Principal_Collection($principalBackend); +$principalCollection->disableListing = true; // Disable listening -$Sabre_CardDAV_AddressBookRoot = new Sabre_CardDAV_AddressBookRoot($principalBackend, $carddavBackend); -$Sabre_CardDAV_AddressBookRoot->disableListing = true; // Disable listening +$addressBookRoot = new OC_Connector_Sabre_CardDAV_AddressBookRoot($principalBackend, $carddavBackend); +$addressBookRoot->disableListing = true; // Disable listening -$nodes = array( - $Sabre_CalDAV_Principal_Collection, - $Sabre_CardDAV_AddressBookRoot, +$nodes = array( + $principalCollection, + $addressBookRoot, ); // Fire up server @@ -55,7 +55,7 @@ $server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, 'ownCloud')); $server->addPlugin(new Sabre_CardDAV_Plugin()); $server->addPlugin(new Sabre_DAVACL_Plugin()); $server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload -$server->addPlugin(new Sabre_CardDAV_VCFExportPlugin()); +//$server->addPlugin(new OC_Connector_Sabre_CardDAV_VCFExportPlugin()); // And off we go! $server->exec(); diff --git a/apps/contacts/lib/sabre/addressbook.php b/apps/contacts/lib/sabre/addressbook.php new file mode 100644 index 00000000000..daaaa943398 --- /dev/null +++ b/apps/contacts/lib/sabre/addressbook.php @@ -0,0 +1,125 @@ +<?php +/** + * ownCloud - Addressbook + * + * @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 __construct to get access to $addressBookInfo and + * $carddavBackend, Sabre_CardDAV_AddressBook::getACL() to return read/write + * permissions based on user and shared state and it overrides + * Sabre_CardDAV_AddressBook::getChild() and Sabre_CardDAV_AddressBook::getChildren() + * to instantiate OC_Connector_Sabre_CardDAV_Cards. +*/ +class OC_Connector_Sabre_CardDAV_AddressBook extends Sabre_CardDAV_AddressBook { + + /** + * CardDAV backend + * + * @var Sabre_CardDAV_Backend_Abstract + */ + private $carddavBackend; + + /** + * Constructor + * + * @param Sabre_CardDAV_Backend_Abstract $carddavBackend + * @param array $addressBookInfo + */ + public function __construct(Sabre_CardDAV_Backend_Abstract $carddavBackend, array $addressBookInfo) { + + $this->carddavBackend = $carddavBackend; + $this->addressBookInfo = $addressBookInfo; + parent::__construct($carddavBackend, $addressBookInfo); + + } + /** + * 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_Contacts_Addressbook::extractUserID($this->getOwner()); + + if($uid != OCP\USER::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $this->addressBookInfo['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, + ), + + ); + + } + + /** + * Returns a card + * + * @param string $name + * @return OC_Connector_Sabre_DAV_Card + */ + public function getChild($name) { + + $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'],$name); + if (!$obj) throw new Sabre_DAV_Exception_NotFound('Card not found'); + return new OC_Connector_Sabre_CardDAV_Card($this->carddavBackend,$this->addressBookInfo,$obj); + + } + + /** + * Returns the full list of cards + * + * @return array + */ + public function getChildren() { + + $objs = $this->carddavBackend->getCards($this->addressBookInfo['id']); + $children = array(); + foreach($objs as $obj) { + $children[] = new OC_Connector_Sabre_CardDAV_Card($this->carddavBackend,$this->addressBookInfo,$obj); + } + return $children; + + } +}
\ No newline at end of file diff --git a/apps/contacts/lib/sabre/addressbookroot.php b/apps/contacts/lib/sabre/addressbookroot.php new file mode 100644 index 00000000000..69cd6021284 --- /dev/null +++ b/apps/contacts/lib/sabre/addressbookroot.php @@ -0,0 +1,45 @@ +<?php +/** + * ownCloud - Addressbook + * + * @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_CardDAV_AddressBookRoot::getChildForPrincipal() + * to instantiate OC_Connector_CardDAV_UserAddressBooks. +*/ +class OC_Connector_Sabre_CardDAV_AddressBookRoot extends Sabre_CardDAV_AddressBookRoot { + + /** + * 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_CardDAV_UserAddressBooks($this->carddavBackend, $principal['uri']); + + } + +}
\ No newline at end of file diff --git a/apps/contacts/lib/connector_sabre.php b/apps/contacts/lib/sabre/backend.php index 2bc6c9a28ca..04737eb3ab4 100644 --- a/apps/contacts/lib/connector_sabre.php +++ b/apps/contacts/lib/sabre/backend.php @@ -145,6 +145,7 @@ class OC_Connector_Sabre_CardDAV extends Sabre_CardDAV_Backend_Abstract { $data = OC_Contacts_VCard::all($addressbookid); $cards = array(); foreach($data as $i){ + //OCP\Util::writeLog('contacts', __METHOD__.', uri: ' . $i['uri'], OCP\Util::DEBUG); $cards[] = array( 'id' => $i['id'], //'carddata' => $i['carddata'], diff --git a/apps/contacts/lib/sabre/card.php b/apps/contacts/lib/sabre/card.php new file mode 100644 index 00000000000..f4414a25f7c --- /dev/null +++ b/apps/contacts/lib/sabre/card.php @@ -0,0 +1,94 @@ +<?php +/** + * ownCloud - Addressbook + * + * @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_CardDAV_Card::getACL() + * to return read/write permissions based on user and shared state. +*/ +class OC_Connector_Sabre_CardDAV_Card extends Sabre_CardDAV_Card { + + /** + * Array with information about the containing addressbook + * + * @var array + */ + private $addressBookInfo; + + /** + * Constructor + * + * @param Sabre_CardDAV_Backend_Abstract $carddavBackend + * @param array $addressBookInfo + * @param array $cardData + */ + public function __construct(Sabre_CardDAV_Backend_Abstract $carddavBackend, array $addressBookInfo, array $cardData) { + + $this->addressBookInfo = $addressBookInfo; + parent::__construct($carddavBackend, $addressBookInfo, $cardData); + + } + + /** + * 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_Contacts_Addressbook::extractUserID($this->getOwner()); + + if($uid != OCP\USER::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $this->addressBookInfo['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, + ), + + ); + + } + +}
\ No newline at end of file diff --git a/apps/contacts/lib/sabre/useraddressbooks.php b/apps/contacts/lib/sabre/useraddressbooks.php new file mode 100644 index 00000000000..328b433bd6e --- /dev/null +++ b/apps/contacts/lib/sabre/useraddressbooks.php @@ -0,0 +1,45 @@ +<?php +/** + * ownCloud - Addressbook + * + * @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_CardDAV_UserAddressBooks::getChildren() + * to instantiate OC_Connector_Sabre_CardDAV_AddressBooks. +*/ +class OC_Connector_Sabre_CardDAV_UserAddressBooks extends Sabre_CardDAV_UserAddressBooks { + + /** + * Returns a list of addressbooks + * + * @return array + */ + public function getChildren() { + + $addressbooks = $this->carddavBackend->getAddressbooksForUser($this->principalUri); + $objs = array(); + foreach($addressbooks as $addressbook) { + $objs[] = new OC_Connector_Sabre_CardDAV_AddressBook($this->carddavBackend, $addressbook); + } + return $objs; + + } + +}
\ No newline at end of file diff --git a/apps/contacts/lib/VCFExportPlugin.php b/apps/contacts/lib/sabre/vcfexportplugin.php index 9a64c964b06..9a64c964b06 100644 --- a/apps/contacts/lib/VCFExportPlugin.php +++ b/apps/contacts/lib/sabre/vcfexportplugin.php diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php index cee9c640cf6..4c66a538a27 100644 --- a/apps/contacts/lib/vcard.php +++ b/apps/contacts/lib/vcard.php @@ -38,7 +38,7 @@ /** * This class manages our vCards */ -class OC_Contacts_VCard{ +class OC_Contacts_VCard { /** * @brief Returns all cards of an address book * @param integer $id |