From 787e3d51b454c072947ed0df5426ad70b9814b8f Mon Sep 17 00:00:00 2001 From: Christoph Seitz Date: Sun, 1 Oct 2017 16:03:30 +0200 Subject: 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 --- apps/dav/lib/CalDAV/Principal/Collection.php | 45 ++++++++++++++++++++ apps/dav/lib/CalDAV/Principal/User.php | 55 +++++++++++++++++++++++++ apps/dav/lib/Connector/Sabre/Principal.php | 61 +++++++++++++++++++++++++--- apps/dav/lib/RootCollection.php | 2 +- 4 files changed, 157 insertions(+), 6 deletions(-) create mode 100644 apps/dav/lib/CalDAV/Principal/Collection.php create mode 100644 apps/dav/lib/CalDAV/Principal/User.php 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 @@ + + * + * @author Christoph Seitz + * + * @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 + * + */ + +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 @@ + + * + * @author Christoph Seitz + * + * @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 + * + */ + +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 @@ -182,6 +182,46 @@ class Principal implements BackendInterface { return 0; } + /** + * 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 @@ -189,7 +229,16 @@ class Principal implements BackendInterface { * @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 { -- cgit v1.2.3