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 /apps/dav/lib/Connector | |
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>
Diffstat (limited to 'apps/dav/lib/Connector')
-rw-r--r-- | apps/dav/lib/Connector/Sabre/Principal.php | 61 |
1 files changed, 56 insertions, 5 deletions
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(); + } } } |