summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArthur Schiwon <blizzz@arthur-schiwon.de>2020-12-11 14:04:40 +0100
committerArthur Schiwon <blizzz@arthur-schiwon.de>2020-12-15 11:53:39 +0100
commit2b017b704a4a49801bc09774a1a17cfedca9cc7e (patch)
treefe97cec90a860aee749340c91d3bb373d061fadf
parent8506d0864b3a017baeed2ad5f9a032ae1d7a6734 (diff)
downloadnextcloud-server-2b017b704a4a49801bc09774a1a17cfedca9cc7e.tar.gz
nextcloud-server-2b017b704a4a49801bc09774a1a17cfedca9cc7e.zip
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>
-rw-r--r--apps/dav/lib/Connector/Sabre/Principal.php3
-rw-r--r--apps/dav/lib/DAV/GroupPrincipalBackend.php16
-rw-r--r--apps/dav/lib/RootCollection.php2
-rw-r--r--apps/dav/tests/unit/DAV/GroupPrincipalTest.php25
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);