Merge pull request #21538 from nextcloud/backport/21452/stable19
[stable19] Fix autocomplete for LDAP with `shareapi_only_share_with_group_members` on
This commit is contained in:
commit
9e9e74736d
|
@ -72,6 +72,23 @@ Feature: sharees
|
|||
And "exact remotes" sharees returned is empty
|
||||
And "remotes" sharees returned is empty
|
||||
|
||||
Scenario: Search only with group members - allowed with exact match
|
||||
Given As an "test"
|
||||
And parameter "shareapi_only_share_with_group_members" of app "core" is set to "yes"
|
||||
And user "Sharee1" belongs to group "ShareeGroup"
|
||||
When getting sharees for
|
||||
| search | Sharee1 |
|
||||
| itemType | file |
|
||||
Then the OCS status code should be "100"
|
||||
And the HTTP status code should be "200"
|
||||
And "exact users" sharees returned are
|
||||
| Sharee1 | 0 | Sharee1 |
|
||||
And "users" sharees returned is empty
|
||||
And "exact groups" sharees returned is empty
|
||||
And "groups" sharees returned is empty
|
||||
And "exact remotes" sharees returned is empty
|
||||
And "remotes" sharees returned is empty
|
||||
|
||||
Scenario: Search only with group members - no group as non-member
|
||||
Given As an "Sharee1"
|
||||
And parameter "shareapi_only_share_with_group_members" of app "core" is set to "yes"
|
||||
|
|
|
@ -33,7 +33,6 @@ use OCP\Collaboration\Collaborators\ISearchPlugin;
|
|||
use OCP\Collaboration\Collaborators\ISearchResult;
|
||||
use OCP\Collaboration\Collaborators\SearchResultType;
|
||||
use OCP\IConfig;
|
||||
use OCP\IGroup;
|
||||
use OCP\IGroupManager;
|
||||
use OCP\IUser;
|
||||
use OCP\IUserManager;
|
||||
|
@ -73,20 +72,19 @@ class UserPlugin implements ISearchPlugin {
|
|||
$users = [];
|
||||
$hasMoreResults = false;
|
||||
|
||||
$userGroups = [];
|
||||
$currentUserGroups = $this->groupManager->getUserGroupIds($this->userSession->getUser());
|
||||
if ($this->shareWithGroupOnly) {
|
||||
// Search in all the groups this user is part of
|
||||
$userGroups = $this->groupManager->getUserGroups($this->userSession->getUser());
|
||||
foreach ($userGroups as $userGroup) {
|
||||
$usersInGroup = $userGroup->searchDisplayName($search, $limit, $offset);
|
||||
foreach ($usersInGroup as $user) {
|
||||
$users[$user->getUID()] = $user;
|
||||
foreach ($currentUserGroups as $userGroupId) {
|
||||
$usersInGroup = $this->groupManager->displayNamesInGroup($userGroupId, $search, $limit, $offset);
|
||||
foreach ($usersInGroup as $userId => $displayName) {
|
||||
$userId = (string) $userId;
|
||||
$users[$userId] = $this->userManager->get($userId);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Search in all users
|
||||
$usersTmp = $this->userManager->searchDisplayName($search, $limit, $offset);
|
||||
$currentUserGroups = $this->groupManager->getUserGroupIds($this->userSession->getUser());
|
||||
foreach ($usersTmp as $user) {
|
||||
if ($user->isEnabled()) { // Don't keep deactivated users
|
||||
$users[$user->getUID()] = $user;
|
||||
|
@ -155,10 +153,7 @@ class UserPlugin implements ISearchPlugin {
|
|||
|
||||
if ($this->shareWithGroupOnly) {
|
||||
// Only add, if we have a common group
|
||||
$userGroupIds = array_map(function (IGroup $group) {
|
||||
return $group->getGID();
|
||||
}, $userGroups);
|
||||
$commonGroups = array_intersect($userGroupIds, $this->groupManager->getUserGroupIds($user));
|
||||
$commonGroups = array_intersect($currentUserGroups, $this->groupManager->getUserGroupIds($user));
|
||||
$addUser = !empty($commonGroups);
|
||||
}
|
||||
|
||||
|
|
|
@ -275,7 +275,7 @@ class UserPluginTest extends TestCase {
|
|||
true,
|
||||
['abc', 'xyz'],
|
||||
[
|
||||
['abc', 'test', 2, 0, [$this->getUserMock('test1', 'Test One')]],
|
||||
['abc', 'test', 2, 0, ['test1' => 'Test One']],
|
||||
['xyz', 'test', 2, 0, []],
|
||||
],
|
||||
[],
|
||||
|
@ -284,6 +284,7 @@ class UserPluginTest extends TestCase {
|
|||
],
|
||||
true,
|
||||
false,
|
||||
[['test1', $this->getUserMock('test1', 'Test One')]],
|
||||
],
|
||||
[
|
||||
'test',
|
||||
|
@ -291,13 +292,14 @@ class UserPluginTest extends TestCase {
|
|||
false,
|
||||
['abc', 'xyz'],
|
||||
[
|
||||
['abc', 'test', 2, 0, [$this->getUserMock('test1', 'Test One')]],
|
||||
['abc', 'test', 2, 0, ['test1' => 'Test One']],
|
||||
['xyz', 'test', 2, 0, []],
|
||||
],
|
||||
[],
|
||||
[],
|
||||
true,
|
||||
false,
|
||||
[['test1', $this->getUserMock('test1', 'Test One')]],
|
||||
],
|
||||
[
|
||||
'test',
|
||||
|
@ -306,12 +308,12 @@ class UserPluginTest extends TestCase {
|
|||
['abc', 'xyz'],
|
||||
[
|
||||
['abc', 'test', 2, 0, [
|
||||
$this->getUserMock('test1', 'Test One'),
|
||||
$this->getUserMock('test2', 'Test Two'),
|
||||
'test1' => 'Test One',
|
||||
'test2' => 'Test Two',
|
||||
]],
|
||||
['xyz', 'test', 2, 0, [
|
||||
$this->getUserMock('test1', 'Test One'),
|
||||
$this->getUserMock('test2', 'Test Two'),
|
||||
'test1' => 'Test One',
|
||||
'test2' => 'Test Two',
|
||||
]],
|
||||
],
|
||||
[],
|
||||
|
@ -321,6 +323,10 @@ class UserPluginTest extends TestCase {
|
|||
],
|
||||
false,
|
||||
false,
|
||||
[
|
||||
['test1', $this->getUserMock('test1', 'Test One')],
|
||||
['test2', $this->getUserMock('test2', 'Test Two')],
|
||||
],
|
||||
],
|
||||
[
|
||||
'test',
|
||||
|
@ -329,18 +335,22 @@ class UserPluginTest extends TestCase {
|
|||
['abc', 'xyz'],
|
||||
[
|
||||
['abc', 'test', 2, 0, [
|
||||
$this->getUserMock('test1', 'Test One'),
|
||||
$this->getUserMock('test2', 'Test Two'),
|
||||
'test1' => 'Test One',
|
||||
'test2' => 'Test Two',
|
||||
]],
|
||||
['xyz', 'test', 2, 0, [
|
||||
$this->getUserMock('test1', 'Test One'),
|
||||
$this->getUserMock('test2', 'Test Two'),
|
||||
'test1' => 'Test One',
|
||||
'test2' => 'Test Two',
|
||||
]],
|
||||
],
|
||||
[],
|
||||
[],
|
||||
true,
|
||||
false,
|
||||
[
|
||||
['test1', $this->getUserMock('test1', 'Test One')],
|
||||
['test2', $this->getUserMock('test2', 'Test Two')],
|
||||
],
|
||||
],
|
||||
[
|
||||
'test',
|
||||
|
@ -349,10 +359,10 @@ class UserPluginTest extends TestCase {
|
|||
['abc', 'xyz'],
|
||||
[
|
||||
['abc', 'test', 2, 0, [
|
||||
$this->getUserMock('test', 'Test One'),
|
||||
'test' => 'Test One',
|
||||
]],
|
||||
['xyz', 'test', 2, 0, [
|
||||
$this->getUserMock('test2', 'Test Two'),
|
||||
'test2' => 'Test Two',
|
||||
]],
|
||||
],
|
||||
[
|
||||
|
@ -363,6 +373,10 @@ class UserPluginTest extends TestCase {
|
|||
],
|
||||
false,
|
||||
false,
|
||||
[
|
||||
['test', $this->getUserMock('test', 'Test One')],
|
||||
['test2', $this->getUserMock('test2', 'Test Two')],
|
||||
],
|
||||
],
|
||||
[
|
||||
'test',
|
||||
|
@ -371,10 +385,10 @@ class UserPluginTest extends TestCase {
|
|||
['abc', 'xyz'],
|
||||
[
|
||||
['abc', 'test', 2, 0, [
|
||||
$this->getUserMock('test', 'Test One'),
|
||||
'test' => 'Test One',
|
||||
]],
|
||||
['xyz', 'test', 2, 0, [
|
||||
$this->getUserMock('test2', 'Test Two'),
|
||||
'test2' => 'Test Two',
|
||||
]],
|
||||
],
|
||||
[
|
||||
|
@ -383,6 +397,10 @@ class UserPluginTest extends TestCase {
|
|||
[],
|
||||
true,
|
||||
false,
|
||||
[
|
||||
['test', $this->getUserMock('test', 'Test One')],
|
||||
['test2', $this->getUserMock('test2', 'Test Two')],
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
@ -399,6 +417,7 @@ class UserPluginTest extends TestCase {
|
|||
* @param array $expected
|
||||
* @param bool $reachedEnd
|
||||
* @param bool|IUser $singleUser
|
||||
* @param array $users
|
||||
*/
|
||||
public function testSearch(
|
||||
$searchTerm,
|
||||
|
@ -409,7 +428,8 @@ class UserPluginTest extends TestCase {
|
|||
array $exactExpected,
|
||||
array $expected,
|
||||
$reachedEnd,
|
||||
$singleUser
|
||||
$singleUser,
|
||||
array $users = []
|
||||
) {
|
||||
$this->mockConfig($shareWithGroupOnly, $shareeEnumeration, false);
|
||||
$this->instantiatePlugin();
|
||||
|
@ -424,39 +444,29 @@ class UserPluginTest extends TestCase {
|
|||
->with($searchTerm, $this->limit, $this->offset)
|
||||
->willReturn($userResponse);
|
||||
} else {
|
||||
$groups = array_combine($groupResponse, array_map(function ($gid) {
|
||||
return $this->getGroupMock($gid);
|
||||
}, $groupResponse));
|
||||
if ($singleUser !== false) {
|
||||
$this->groupManager->method('getUserGroups')
|
||||
$this->groupManager->method('getUserGroupIds')
|
||||
->with($this->user)
|
||||
->willReturn($groups);
|
||||
->willReturn($groupResponse);
|
||||
|
||||
if ($singleUser !== false) {
|
||||
$this->groupManager->method('getUserGroupIds')
|
||||
->with($singleUser)
|
||||
->willReturn($groupResponse);
|
||||
} else {
|
||||
$this->groupManager->expects($this->once())
|
||||
->method('getUserGroups')
|
||||
->with($this->user)
|
||||
->willReturn($groups);
|
||||
}
|
||||
|
||||
foreach ($userResponse as $groupDefinition) {
|
||||
[$gid, $search, $limit, $offset, $users] = $groupDefinition;
|
||||
$groups[$gid]->method('searchDisplayName')
|
||||
->with($search, $limit, $offset)
|
||||
->willReturn($users);
|
||||
}
|
||||
$this->groupManager->method('displayNamesInGroup')
|
||||
->willReturnMap($userResponse);
|
||||
}
|
||||
|
||||
if ($singleUser !== false) {
|
||||
$this->userManager->expects($this->once())
|
||||
->method('get')
|
||||
->with($searchTerm)
|
||||
->willReturn($singleUser);
|
||||
$users[] = [$searchTerm, $singleUser];
|
||||
}
|
||||
|
||||
if (!empty($users)) {
|
||||
$this->userManager->expects($this->atLeastOnce())
|
||||
->method('get')
|
||||
->willReturnMap($users);
|
||||
}
|
||||
|
||||
$moreResults = $this->plugin->search($searchTerm, $this->limit, $this->offset, $this->searchResult);
|
||||
$result = $this->searchResult->asArray();
|
||||
|
|
Loading…
Reference in New Issue