|
|
@@ -719,23 +719,36 @@ class Group_LDAPTest extends TestCase { |
|
|
|
$groupBackend->getUserGroups('userX'); |
|
|
|
} |
|
|
|
|
|
|
|
public function testGetGroupsByMember() { |
|
|
|
public function nestedGroupsProvider(): array { |
|
|
|
return [ |
|
|
|
[ true ], |
|
|
|
[ false ], |
|
|
|
]; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @dataProvider nestedGroupsProvider |
|
|
|
*/ |
|
|
|
public function testGetGroupsByMember(bool $nestedGroups) { |
|
|
|
$access = $this->getAccessMock(); |
|
|
|
$pluginManager = $this->getPluginManagerMock(); |
|
|
|
|
|
|
|
$groupFilter = '(&(objectclass=nextcloudGroup)(nextcloudEnabled=TRUE))'; |
|
|
|
$access->connection = $this->createMock(Connection::class); |
|
|
|
$access->connection->expects($this->any()) |
|
|
|
->method('__get') |
|
|
|
->willReturnCallback(function ($name) { |
|
|
|
->willReturnCallback(function ($name) use ($nestedGroups, $groupFilter) { |
|
|
|
switch ($name) { |
|
|
|
case 'useMemberOfToDetectMembership': |
|
|
|
return 0; |
|
|
|
case 'ldapDynamicGroupMemberURL': |
|
|
|
return ''; |
|
|
|
case 'ldapNestedGroups': |
|
|
|
return false; |
|
|
|
return $nestedGroups; |
|
|
|
case 'ldapGroupMemberAssocAttr': |
|
|
|
return 'member'; |
|
|
|
case 'ldapGroupFilter': |
|
|
|
return $groupFilter; |
|
|
|
} |
|
|
|
return 1; |
|
|
|
}); |
|
|
@@ -748,10 +761,15 @@ class Group_LDAPTest extends TestCase { |
|
|
|
$access->expects($this->exactly(2)) |
|
|
|
->method('username2dn') |
|
|
|
->willReturn($dn); |
|
|
|
|
|
|
|
$access->expects($this->any()) |
|
|
|
->method('readAttribute') |
|
|
|
->willReturn([]); |
|
|
|
$access->expects($this->any()) |
|
|
|
->method('combineFilterWithAnd') |
|
|
|
->willReturnCallback(function (array $filterParts) { |
|
|
|
// ⚠ returns a pseudo-filter only, not real LDAP Filter syntax |
|
|
|
return implode('&', $filterParts); |
|
|
|
}); |
|
|
|
|
|
|
|
$group1 = [ |
|
|
|
'cn' => 'group1', |
|
|
@@ -766,9 +784,21 @@ class Group_LDAPTest extends TestCase { |
|
|
|
->method('nextcloudGroupNames') |
|
|
|
->with([$group1, $group2]) |
|
|
|
->willReturn(['group1', 'group2']); |
|
|
|
$access->expects($this->once()) |
|
|
|
$access->expects($nestedGroups ? $this->atLeastOnce() : $this->once()) |
|
|
|
->method('fetchListOfGroups') |
|
|
|
->willReturn([$group1, $group2]); |
|
|
|
->willReturnCallback(function ($filter, $attr, $limit, $offset) use ($nestedGroups, $groupFilter, $group1, $group2) { |
|
|
|
static $firstRun = true; |
|
|
|
if (!$nestedGroups) { |
|
|
|
// When nested groups are enabled, groups cannot be filtered early as it would |
|
|
|
// exclude intermediate groups. But we can, and should, when working with flat groups. |
|
|
|
$this->assertTrue(strpos($filter, $groupFilter) !== false); |
|
|
|
} |
|
|
|
if ($firstRun) { |
|
|
|
$firstRun = false; |
|
|
|
return [$group1, $group2]; |
|
|
|
} |
|
|
|
return []; |
|
|
|
}); |
|
|
|
$access->expects($this->any()) |
|
|
|
->method('dn2groupname') |
|
|
|
->willReturnCallback(function (string $dn) { |