summaryrefslogtreecommitdiffstats
path: root/apps/dav/lib/Connector
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 /apps/dav/lib/Connector
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>
Diffstat (limited to 'apps/dav/lib/Connector')
-rw-r--r--apps/dav/lib/Connector/Sabre/Principal.php61
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();
+ }
}
}