diff options
author | Christoph Seitz <christoph.seitz@posteo.de> | 2017-10-01 16:03:30 +0200 |
---|---|---|
committer | Roeland Jago Douma <roeland@famdouma.nl> | 2017-12-11 16:04:55 +0100 |
commit | 787e3d51b454c072947ed0df5426ad70b9814b8f (patch) | |
tree | cd1d6f324e0c578bda4b33c72ca57cbf225752df | |
parent | 80b27fdb93ac0c170d0b5e214f67a2eff6c366ad (diff) | |
download | nextcloud-server-787e3d51b454c072947ed0df5426ad70b9814b8f.tar.gz nextcloud-server-787e3d51b454c072947ed0df5426ad70b9814b8f.zip |
Fix functions to search for principals in the backend.
Add a "searchPrincipals" function to the NC principal backend.
Fix the "findByUri" function to respect the prefixPath.
Signed-off-by: Christoph Seitz <christoph.seitz@posteo.de>
-rw-r--r-- | apps/dav/lib/CalDAV/Principal/Collection.php | 45 | ||||
-rw-r--r-- | apps/dav/lib/CalDAV/Principal/User.php | 55 | ||||
-rw-r--r-- | apps/dav/lib/Connector/Sabre/Principal.php | 61 | ||||
-rw-r--r-- | apps/dav/lib/RootCollection.php | 2 |
4 files changed, 157 insertions, 6 deletions
diff --git a/apps/dav/lib/CalDAV/Principal/Collection.php b/apps/dav/lib/CalDAV/Principal/Collection.php new file mode 100644 index 00000000000..cadfc66c26b --- /dev/null +++ b/apps/dav/lib/CalDAV/Principal/Collection.php @@ -0,0 +1,45 @@ +<?php + +/** + * @copyright Copyright (c) 2017, Christoph Seitz <christoph.seitz@posteo.de> + * + * @author Christoph Seitz <christoph.seitz@posteo.de> + * + * @license GNU AGPL version 3 or any later version + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\DAV\CalDAV\Principal; + +use OCA\DAV\CalDAV\Principal\User; + +/** + * Class Collection + * + * @package OCA\DAV\CalDAV\Principal + */ +class Collection extends \Sabre\CalDAV\Principal\Collection { + + /** + * Returns a child object based on principal information + * + * @param array $principalInfo + * @return User + */ + function getChildForPrincipal(array $principalInfo) { + return new User($this->principalBackend, $principalInfo); + } + +} diff --git a/apps/dav/lib/CalDAV/Principal/User.php b/apps/dav/lib/CalDAV/Principal/User.php new file mode 100644 index 00000000000..85b0401e865 --- /dev/null +++ b/apps/dav/lib/CalDAV/Principal/User.php @@ -0,0 +1,55 @@ +<?php + +/** + * @copyright Copyright (c) 2017, Christoph Seitz <christoph.seitz@posteo.de> + * + * @author Christoph Seitz <christoph.seitz@posteo.de> + * + * @license GNU AGPL version 3 or any later version + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\DAV\CalDAV\Principal; + +/** + * Class User + * + * @package OCA\DAV\CalDAV\Principal + */ +class User extends \Sabre\CalDAV\Principal\User { + + /** + * 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 + */ + function getACL() { + $acl = parent::getACL(); + $acl[] = [ + 'privilege' => '{DAV:}read', + 'principal' => '{DAV:}authenticated', + 'protected' => true, + ]; + return $acl; + } + +} diff --git a/apps/dav/lib/Connector/Sabre/Principal.php b/apps/dav/lib/Connector/Sabre/Principal.php index b45807ff82b..17412048352 100644 --- a/apps/dav/lib/Connector/Sabre/Principal.php +++ b/apps/dav/lib/Connector/Sabre/Principal.php @@ -183,13 +183,62 @@ class Principal implements BackendInterface { } /** + * Search user principals + * + * @param array $searchProperties + * @param string $test + * @return array + */ + function searchUserPrincipals(array $searchProperties, $test = 'allof') { + $results = []; + + //TODO: If more properties should be supported, hook this up to a db query + foreach ($searchProperties as $prop => $value) { + switch ($prop) { + case '{http://sabredav.org/ns}email-address': + $users = $this->userManager->getByEmail($value); + $results[] = array_map(function ($user) { + return $this->principalPrefix . '/' . $user->getUID(); + }, $users); + break; + default: + $results[] = []; + break; + } + } + + if (count($results) == 1) { + return $results[0]; + } + + switch ($test) { + case 'allof': + + return array_intersect(...$results); + case 'anyof': + return array_unique(array_merge(...$results)); + } + + return []; + } + + /** * @param string $prefixPath * @param array $searchProperties * @param string $test * @return array */ function searchPrincipals($prefixPath, array $searchProperties, $test = 'allof') { - return []; + if (count($searchProperties) == 0) { + return []; + } + + switch ($prefixPath) { + case 'principals/users': + return $this->searchUserPrincipals($searchProperties, $test); + default: + return []; + } } /** @@ -199,10 +248,12 @@ class Principal implements BackendInterface { */ function findByUri($uri, $principalPrefix) { if (substr($uri, 0, 7) === 'mailto:') { - $email = substr($uri, 7); - $users = $this->userManager->getByEmail($email); - if (count($users) === 1) { - return $this->principalPrefix . '/' . $users[0]->getUID(); + if ($principalPrefix === principals/users) { + $email = substr($uri, 7); + $users = $this->userManager->getByEmail($email); + if (count($users) === 1) { + return $this->principalPrefix . '/' . $users[0]->getUID(); + } } } diff --git a/apps/dav/lib/RootCollection.php b/apps/dav/lib/RootCollection.php index 7af1745cd74..c0f7b1e497b 100644 --- a/apps/dav/lib/RootCollection.php +++ b/apps/dav/lib/RootCollection.php @@ -32,7 +32,7 @@ use OCA\DAV\CardDAV\CardDavBackend; use OCA\DAV\Connector\Sabre\Principal; use OCA\DAV\DAV\GroupPrincipalBackend; use OCA\DAV\DAV\SystemPrincipalBackend; -use Sabre\CalDAV\Principal\Collection; +use OCA\DAV\CalDAV\Principal\Collection; use Sabre\DAV\SimpleCollection; class RootCollection extends SimpleCollection { |