dav search to honour sharing.maxAutocompleteResults setting

- it is being used on frontend by users
- user and big instances benefit from quicker results and less load

Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
This commit is contained in:
Arthur Schiwon 2020-12-11 14:04:40 +01:00
parent 8506d0864b
commit 2b017b704a
No known key found for this signature in database
GPG Key ID: 7424F1874854DF23
4 changed files with 39 additions and 7 deletions

View File

@ -270,6 +270,7 @@ class Principal implements BackendInterface {
}
}
$searchLimit = $this->config->getSystemValue('sharing.maxAutocompleteResults', null);
foreach ($searchProperties as $prop => $value) {
switch ($prop) {
case '{http://sabredav.org/ns}email-address':
@ -305,7 +306,7 @@ class Principal implements BackendInterface {
break;
case '{DAV:}displayname':
$users = $this->userManager->searchDisplayName($value);
$users = $this->userManager->searchDisplayName($value, $searchLimit);
if (!$allowEnumeration) {
$users = \array_filter($users, static function (IUser $user) use ($value) {

View File

@ -27,6 +27,7 @@
namespace OCA\DAV\DAV;
use OCP\IConfig;
use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IUser;
@ -47,18 +48,24 @@ class GroupPrincipalBackend implements BackendInterface {
/** @var IShareManager */
private $shareManager;
/** @var IConfig */
private $config;
/**
* @param IGroupManager $IGroupManager
* @param IUserSession $userSession
* @param IShareManager $shareManager
*/
public function __construct(IGroupManager $IGroupManager,
IUserSession $userSession,
IShareManager $shareManager) {
public function __construct(
IGroupManager $IGroupManager,
IUserSession $userSession,
IShareManager $shareManager,
IConfig $config
) {
$this->groupManager = $IGroupManager;
$this->userSession = $userSession;
$this->shareManager = $shareManager;
$this->config = $config;
}
/**
@ -205,10 +212,11 @@ class GroupPrincipalBackend implements BackendInterface {
$restrictGroups = $this->groupManager->getUserGroupIds($user);
}
$searchLimit = $this->config->getSystemValue('sharing.maxAutocompleteResults', null);
foreach ($searchProperties as $prop => $value) {
switch ($prop) {
case '{DAV:}displayname':
$groups = $this->groupManager->search($value);
$groups = $this->groupManager->search($value, $searchLimit);
$results[] = array_reduce($groups, function (array $carry, IGroup $group) use ($restrictGroups) {
$gid = $group->getGID();

View File

@ -72,7 +72,7 @@ class RootCollection extends SimpleCollection {
$proxyMapper,
\OC::$server->getConfig()
);
$groupPrincipalBackend = new GroupPrincipalBackend($groupManager, $userSession, $shareManager);
$groupPrincipalBackend = new GroupPrincipalBackend($groupManager, $userSession, $shareManager, $config);
$calendarResourcePrincipalBackend = new ResourcePrincipalBackend($db, $userSession, $groupManager, $logger, $proxyMapper);
$calendarRoomPrincipalBackend = new RoomPrincipalBackend($db, $userSession, $groupManager, $logger, $proxyMapper);
// as soon as debug mode is enabled we allow listing of principals

View File

@ -31,6 +31,7 @@ namespace OCA\DAV\Tests\unit\DAV;
use OC\Group\Group;
use OCA\DAV\DAV\GroupPrincipalBackend;
use OCP\IConfig;
use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IUser;
@ -39,6 +40,8 @@ use OCP\Share\IManager;
use Sabre\DAV\PropPatch;
class GroupPrincipalTest extends \Test\TestCase {
/** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */
private $config;
/** @var IGroupManager | \PHPUnit\Framework\MockObject\MockObject */
private $groupManager;
@ -56,11 +59,14 @@ class GroupPrincipalTest extends \Test\TestCase {
$this->groupManager = $this->createMock(IGroupManager::class);
$this->userSession = $this->createMock(IUserSession::class);
$this->shareManager = $this->createMock(IManager::class);
$this->config = $this->createMock(IConfig::class);
$this->connector = new GroupPrincipalBackend(
$this->groupManager,
$this->userSession,
$this->shareManager);
$this->shareManager,
$this->config
);
parent::setUp();
}
@ -167,6 +173,23 @@ class GroupPrincipalTest extends \Test\TestCase {
$this->assertSame($expectedResponse, $response);
}
public function testGetPrincipalsByPathGroupWithHash() {
$group1 = $this->mockGroup('foo#bar');
$this->groupManager
->expects($this->once())
->method('get')
->with('foo#bar')
->willReturn($group1);
$expectedResponse = [
'uri' => 'principals/groups/foo%23bar',
'{DAV:}displayname' => 'Group foo#bar',
'{urn:ietf:params:xml:ns:caldav}calendar-user-type' => 'GROUP',
];
$response = $this->connector->getPrincipalByPath('principals/groups/foo#bar');
$this->assertSame($expectedResponse, $response);
}
public function testGetGroupMemberSet() {
$response = $this->connector->getGroupMemberSet('principals/groups/foo');
$this->assertSame([], $response);