From 2b017b704a4a49801bc09774a1a17cfedca9cc7e Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 11 Dec 2020 14:04:40 +0100 Subject: [PATCH] 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 --- apps/dav/lib/Connector/Sabre/Principal.php | 3 ++- apps/dav/lib/DAV/GroupPrincipalBackend.php | 16 +++++++++--- apps/dav/lib/RootCollection.php | 2 +- .../dav/tests/unit/DAV/GroupPrincipalTest.php | 25 ++++++++++++++++++- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/apps/dav/lib/Connector/Sabre/Principal.php b/apps/dav/lib/Connector/Sabre/Principal.php index 5dedb0a7d7b..12e1d18faa2 100644 --- a/apps/dav/lib/Connector/Sabre/Principal.php +++ b/apps/dav/lib/Connector/Sabre/Principal.php @@ -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) { diff --git a/apps/dav/lib/DAV/GroupPrincipalBackend.php b/apps/dav/lib/DAV/GroupPrincipalBackend.php index 38944317424..747976b6ad3 100644 --- a/apps/dav/lib/DAV/GroupPrincipalBackend.php +++ b/apps/dav/lib/DAV/GroupPrincipalBackend.php @@ -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(); diff --git a/apps/dav/lib/RootCollection.php b/apps/dav/lib/RootCollection.php index 83f3691959b..b08775d80f6 100644 --- a/apps/dav/lib/RootCollection.php +++ b/apps/dav/lib/RootCollection.php @@ -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 diff --git a/apps/dav/tests/unit/DAV/GroupPrincipalTest.php b/apps/dav/tests/unit/DAV/GroupPrincipalTest.php index aaa45e5d715..51b73b3b0a7 100644 --- a/apps/dav/tests/unit/DAV/GroupPrincipalTest.php +++ b/apps/dav/tests/unit/DAV/GroupPrincipalTest.php @@ -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); -- 2.39.5