summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Seitz <christoph.seitz@posteo.de>2017-10-01 16:03:30 +0200
committerRoeland Jago Douma <roeland@famdouma.nl>2017-12-11 16:04:55 +0100
commit787e3d51b454c072947ed0df5426ad70b9814b8f (patch)
treecd1d6f324e0c578bda4b33c72ca57cbf225752df
parent80b27fdb93ac0c170d0b5e214f67a2eff6c366ad (diff)
downloadnextcloud-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.php45
-rw-r--r--apps/dav/lib/CalDAV/Principal/User.php55
-rw-r--r--apps/dav/lib/Connector/Sabre/Principal.php61
-rw-r--r--apps/dav/lib/RootCollection.php2
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 {