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>
This commit is contained in:
parent
80b27fdb93
commit
787e3d51b4
4 changed files with 157 additions and 6 deletions
45
apps/dav/lib/CalDAV/Principal/Collection.php
Normal file
45
apps/dav/lib/CalDAV/Principal/Collection.php
Normal file
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
55
apps/dav/lib/CalDAV/Principal/User.php
Normal file
55
apps/dav/lib/CalDAV/Principal/User.php
Normal file
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue