Next major version 2 with PHP 8.1, Symfony 6, Tabler UI, 2FA ... (#2902)
This commit is contained in:
@@ -10,14 +10,13 @@
|
||||
namespace App\Tests\Ldap;
|
||||
|
||||
use App\Configuration\LdapConfiguration;
|
||||
use App\Configuration\SystemConfiguration;
|
||||
use App\Entity\User;
|
||||
use App\Ldap\LdapDriver;
|
||||
use App\Ldap\LdapDriverException;
|
||||
use App\Ldap\LdapManager;
|
||||
use App\Ldap\LdapUserHydrator;
|
||||
use App\Tests\Configuration\TestConfigLoader;
|
||||
use App\Tests\Mocks\Security\RoleServiceFactory;
|
||||
use App\Tests\Mocks\SystemConfigurationFactory;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
@@ -51,18 +50,17 @@ class LdapManagerTest extends TestCase
|
||||
],
|
||||
'role' => $roleConfig,
|
||||
];
|
||||
$systemConfig = new SystemConfiguration(new TestConfigLoader([]), ['ldap' => $conf]);
|
||||
$systemConfig = SystemConfigurationFactory::create(new TestConfigLoader([]), ['ldap' => $conf]);
|
||||
$config = new LdapConfiguration($systemConfig);
|
||||
|
||||
$roles = [
|
||||
'ROLE_TEAMLEAD' => ['ROLE_USER'],
|
||||
'ROLE_ADMIN' => ['ROLE_TEAMLEAD'],
|
||||
'ROLE_SUPER_ADMIN' => ['ROLE_ADMIN']
|
||||
'ROLE_USER',
|
||||
'ROLE_TEAMLEAD',
|
||||
'ROLE_ADMIN',
|
||||
'ROLE_SUPER_ADMIN',
|
||||
];
|
||||
|
||||
$hydrator = new LdapUserHydrator($config, (new RoleServiceFactory($this))->create($roles));
|
||||
|
||||
return new LdapManager($driver, $hydrator, $config);
|
||||
return new LdapManager($driver, $config, (new RoleServiceFactory($this))->create($roles));
|
||||
}
|
||||
|
||||
public function testFindUserByUsernameOnZeroResults()
|
||||
@@ -108,7 +106,7 @@ class LdapManagerTest extends TestCase
|
||||
public function testFindUserByUsernameOnValidResult()
|
||||
{
|
||||
$expected = [
|
||||
0 => ['dn' => 'foo'],
|
||||
0 => ['dn' => 'foo', 'uid' => ['foo']],
|
||||
'count' => 1,
|
||||
];
|
||||
|
||||
@@ -140,7 +138,7 @@ class LdapManagerTest extends TestCase
|
||||
});
|
||||
|
||||
$sut = $this->getLdapManager($driver);
|
||||
$actual = $sut->findUserBy(['uid' => 'foo']);
|
||||
$actual = $sut->findUserByUsername('foo');
|
||||
self::assertNull($actual);
|
||||
}
|
||||
|
||||
@@ -162,53 +160,56 @@ class LdapManagerTest extends TestCase
|
||||
});
|
||||
|
||||
$sut = $this->getLdapManager($driver);
|
||||
$sut->findUserBy(['uid' => 'foo']);
|
||||
$sut->findUserByUsername('foo');
|
||||
}
|
||||
|
||||
public function testFindUserByOnValidResult()
|
||||
{
|
||||
$expected = [
|
||||
0 => ['dn' => 'foo'],
|
||||
0 => ['dn' => 'foo', 'uid' => ['foo']],
|
||||
'count' => 1,
|
||||
];
|
||||
|
||||
$driver = $this->getMockBuilder(LdapDriver::class)->disableOriginalConstructor()->onlyMethods(['search'])->getMock();
|
||||
$driver->expects($this->once())->method('search')->willReturnCallback(function ($baseDn, $filter) use ($expected) {
|
||||
self::assertEquals('ou=users, dc=kimai, dc=org', $baseDn);
|
||||
self::assertEquals('(&(&(objectClass=inetOrgPerson))(träl=alß#\\\aa=XY\5cZ0)(test=fu=n))', $filter);
|
||||
self::assertEquals('(&(&(objectClass=inetOrgPerson))(uid=trä\5cl=alß#aa=XY\5cZ0))', $filter);
|
||||
|
||||
return $expected;
|
||||
});
|
||||
|
||||
$sut = $this->getLdapManager($driver);
|
||||
$actual = $sut->findUserBy(['träl=alß#\\\aa' => 'XY\Z0', 'test' => 'fu=n']);
|
||||
$actual = $sut->findUserByUsername('trä\l=alß#aa=XY\Z0');
|
||||
self::assertInstanceOf(User::class, $actual);
|
||||
}
|
||||
|
||||
public function testBind()
|
||||
{
|
||||
$user = (new User())->setUsername('foobar');
|
||||
$user = new User();
|
||||
$user->setUserIdentifier('foobar');
|
||||
|
||||
$driver = $this->getMockBuilder(LdapDriver::class)->disableOriginalConstructor()->onlyMethods(['bind'])->getMock();
|
||||
$driver->expects($this->once())->method('bind')->willReturnCallback(function ($bindUser, $password) use ($user) {
|
||||
self::assertSame($user, $bindUser);
|
||||
$driver->expects($this->once())->method('bind')->willReturnCallback(function ($bindUser, $password) {
|
||||
self::assertEquals('foobar', $bindUser);
|
||||
self::assertEquals('a-very-secret-secret', $password);
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
$sut = $this->getLdapManager($driver);
|
||||
$actual = $sut->bind($user, 'a-very-secret-secret');
|
||||
$actual = $sut->bind($user->getUserIdentifier(), 'a-very-secret-secret');
|
||||
self::assertTrue($actual);
|
||||
}
|
||||
|
||||
public function testUpdateUserOnZeroResults()
|
||||
{
|
||||
$user = (new User())->setUsername('foobar');
|
||||
$user = new User();
|
||||
$user->setUserIdentifier('foobar');
|
||||
|
||||
$user->setPreferenceValue('ldap.dn', 'fooooooooooo');
|
||||
$expected = [
|
||||
[
|
||||
0 => ['dn' => 'blub'],
|
||||
0 => ['dn' => 'blub', 'uid' => ['blub']],
|
||||
'count' => 1,
|
||||
],
|
||||
[
|
||||
@@ -242,12 +243,13 @@ class LdapManagerTest extends TestCase
|
||||
$this->expectException(LdapDriverException::class);
|
||||
$this->expectExceptionMessage('This search must only return a single user');
|
||||
|
||||
$user = (new User())->setUsername('foobar');
|
||||
$user = new User();
|
||||
$user->setUserIdentifier('foobar');
|
||||
$user->setPreferenceValue('ldap.dn', 'xxxxxxx');
|
||||
|
||||
$expected = [
|
||||
[
|
||||
0 => ['dn' => 'blub'],
|
||||
0 => ['dn' => 'blub', 'uid' => ['blub']],
|
||||
'count' => 1,
|
||||
],
|
||||
[
|
||||
@@ -276,16 +278,17 @@ class LdapManagerTest extends TestCase
|
||||
|
||||
public function testUpdateUserOnValidResultWithEmptyRoleBaseDn()
|
||||
{
|
||||
$user = (new User())->setUsername('foobar');
|
||||
$user = new User();
|
||||
$user->setUserIdentifier('foobar');
|
||||
$user->setPreferenceValue('ldap.dn', 'sssssss');
|
||||
|
||||
$expected = [
|
||||
[
|
||||
0 => ['dn' => 'blub'],
|
||||
0 => ['dn' => 'blub', 'uid' => ['blub']],
|
||||
'count' => 1,
|
||||
],
|
||||
[
|
||||
0 => ['dn' => 'blub-updated'],
|
||||
0 => ['dn' => 'blub-updated', 'uid' => ['foobar']],
|
||||
'count' => 1,
|
||||
],
|
||||
];
|
||||
@@ -391,7 +394,7 @@ class LdapManagerTest extends TestCase
|
||||
public function testUpdateUserOnValidResultWithRolesResult(array $expectedUsers, array $groupConfig, string $expectedGroupQuery)
|
||||
{
|
||||
$expected = [
|
||||
0 => ['dn' => 'blub'],
|
||||
0 => ['dn' => 'blub', 'uid' => ['blub']],
|
||||
'count' => 1,
|
||||
];
|
||||
|
||||
@@ -447,7 +450,8 @@ class LdapManagerTest extends TestCase
|
||||
|
||||
$sut = $this->getLdapManager($driver, $groupConfig);
|
||||
|
||||
$user = (new User())->setUsername('Karl-Heinz');
|
||||
$user = new User();
|
||||
$user->setUserIdentifier('Karl-Heinz');
|
||||
$user->setPreferenceValue('ldap.dn', 'blub');
|
||||
$userOrig = clone $user;
|
||||
$userOrig->setEmail('Karl-Heinz')->setRoles(['ROLE_TEAMLEAD', 'ROLE_ADMIN'])->setAuth(User::AUTH_LDAP);
|
||||
@@ -456,4 +460,286 @@ class LdapManagerTest extends TestCase
|
||||
self::assertEquals($userOrig, $user);
|
||||
self::assertEquals(['ROLE_TEAMLEAD', 'ROLE_ADMIN', 'ROLE_USER'], $user->getRoles());
|
||||
}
|
||||
|
||||
public function testEmptyHydrate()
|
||||
{
|
||||
$ldapConfig = [
|
||||
'activate' => true,
|
||||
'connection' => [
|
||||
'host' => '1.1.1.1'
|
||||
],
|
||||
'user' => [
|
||||
'usernameAttribute' => 'foo',
|
||||
'attributes' => []
|
||||
],
|
||||
'role' => [],
|
||||
];
|
||||
$systemConfig = SystemConfigurationFactory::create(new TestConfigLoader([]), ['ldap' => $ldapConfig]);
|
||||
|
||||
$config = new LdapConfiguration($systemConfig);
|
||||
|
||||
$sut = new LdapManager($this->createMock(LdapDriver::class), $config, (new RoleServiceFactory($this))->create([]));
|
||||
$user = $sut->hydrate(['dn' => 'blub', 'foo' => ['blub']]);
|
||||
self::assertInstanceOf(User::class, $user);
|
||||
self::assertEquals('blub', $user->getUserIdentifier());
|
||||
self::assertEquals('blub', $user->getUserIdentifier());
|
||||
self::assertEquals('blub', $user->getEmail());
|
||||
}
|
||||
|
||||
public function testEmptyHydrateThrowsException()
|
||||
{
|
||||
$this->expectException(LdapDriverException::class);
|
||||
$this->expectExceptionMessage('Missing username in LDAP hydration');
|
||||
|
||||
$ldapConfig = [
|
||||
'activate' => true,
|
||||
'connection' => [
|
||||
'host' => '1.1.1.1'
|
||||
],
|
||||
'user' => [
|
||||
'usernameAttribute' => 'foo',
|
||||
'attributes' => []
|
||||
],
|
||||
'role' => [],
|
||||
];
|
||||
$systemConfig = SystemConfigurationFactory::create(new TestConfigLoader([]), ['ldap' => $ldapConfig]);
|
||||
|
||||
$config = new LdapConfiguration($systemConfig);
|
||||
|
||||
$sut = new LdapManager($this->createMock(LdapDriver::class), $config, (new RoleServiceFactory($this))->create([]));
|
||||
$user = $sut->hydrate(['dn' => 'blub']);
|
||||
self::assertInstanceOf(User::class, $user);
|
||||
}
|
||||
|
||||
public function testHydrate()
|
||||
{
|
||||
$ldapConfig = [
|
||||
'connection' => [
|
||||
'host' => '1.1.1.1'
|
||||
],
|
||||
'user' => [
|
||||
'usernameAttribute' => 'foo',
|
||||
'attributes' => [
|
||||
['ldap_attr' => 'uid', 'user_method' => 'setUserIdentifier'],
|
||||
['ldap_attr' => 'foo', 'user_method' => 'setAlias'],
|
||||
['ldap_attr' => 'bar', 'user_method' => 'setTitle'],
|
||||
['ldap_attr' => 'roles', 'user_method' => 'setRoles'],
|
||||
['ldap_attr' => 'xxxxxxxx', 'user_method' => 'setAvatar'],
|
||||
['ldap_attr' => 'blubXX', 'user_method' => 'setAvatar'],
|
||||
]
|
||||
],
|
||||
'role' => [],
|
||||
];
|
||||
$systemConfig = SystemConfigurationFactory::create(new TestConfigLoader([]), ['ldap' => $ldapConfig]);
|
||||
$config = new LdapConfiguration($systemConfig);
|
||||
|
||||
$ldapEntry = [
|
||||
'uid' => ['Karl-Heinz'],
|
||||
'blub' => ['dfsdfsdf'],
|
||||
'foo' => ['count' => 1, 0 => 'bar'],
|
||||
'bar' => ['foo'],
|
||||
'roles' => ['count' => 2, 0 => 'ROLE_TEAMLEAD', 1 => 'ROLE_ADMIN'],
|
||||
'xxxxxxxx' => ['https://www.example.com'],
|
||||
'blub1' => ['dfsdfsdf'],
|
||||
'dn' => 'blub',
|
||||
];
|
||||
|
||||
$sut = new LdapManager($this->createMock(LdapDriver::class), $config, (new RoleServiceFactory($this))->create([]));
|
||||
$user = $sut->hydrate($ldapEntry);
|
||||
|
||||
self::assertInstanceOf(User::class, $user);
|
||||
self::assertEquals('Karl-Heinz', $user->getUserIdentifier());
|
||||
self::assertEquals('bar', $user->getAlias());
|
||||
self::assertEquals('foo', $user->getTitle());
|
||||
self::assertEquals(['ROLE_TEAMLEAD', 'ROLE_ADMIN', 'ROLE_USER'], $user->getRoles());
|
||||
self::assertEquals('https://www.example.com', $user->getAvatar());
|
||||
self::assertEquals('Karl-Heinz', $user->getEmail());
|
||||
}
|
||||
|
||||
public function testThrowsOnMissingMethod(): void
|
||||
{
|
||||
$this->expectException(\Exception::class);
|
||||
$this->expectExceptionMessage('Unknown mapping method: setAlias2');
|
||||
$ldapConfig = [
|
||||
'connection' => [
|
||||
'host' => '1.1.1.1'
|
||||
],
|
||||
'user' => [
|
||||
'usernameAttribute' => 'foo',
|
||||
'attributes' => [
|
||||
['ldap_attr' => 'foo', 'user_method' => 'setAlias2'],
|
||||
]
|
||||
],
|
||||
'role' => [],
|
||||
];
|
||||
$systemConfig = SystemConfigurationFactory::create(new TestConfigLoader([]), ['ldap' => $ldapConfig]);
|
||||
$config = new LdapConfiguration($systemConfig);
|
||||
|
||||
$ldapEntry = [
|
||||
'foo' => ['count' => 1, 0 => 'bar'],
|
||||
];
|
||||
|
||||
$sut = new LdapManager($this->createMock(LdapDriver::class), $config, (new RoleServiceFactory($this))->create([]));
|
||||
$user = $sut->hydrate($ldapEntry);
|
||||
}
|
||||
|
||||
/**
|
||||
* @group legacy
|
||||
*/
|
||||
public function testHydrateWithDepercatedSetter()
|
||||
{
|
||||
$ldapConfig = [
|
||||
'connection' => [
|
||||
'host' => '1.1.1.1'
|
||||
],
|
||||
'user' => [
|
||||
'usernameAttribute' => 'foo',
|
||||
'attributes' => [
|
||||
['ldap_attr' => 'uid', 'user_method' => 'setUsername'], // use setUsername here for BC reasons!
|
||||
['ldap_attr' => 'foo', 'user_method' => 'setAlias'],
|
||||
['ldap_attr' => 'bar', 'user_method' => 'setTitle'],
|
||||
['ldap_attr' => 'roles', 'user_method' => 'setRoles'],
|
||||
['ldap_attr' => 'xxxxxxxx', 'user_method' => 'setAvatar'],
|
||||
['ldap_attr' => 'blubXX', 'user_method' => 'setAvatar'],
|
||||
]
|
||||
],
|
||||
'role' => [],
|
||||
];
|
||||
$systemConfig = SystemConfigurationFactory::create(new TestConfigLoader([]), ['ldap' => $ldapConfig]);
|
||||
$config = new LdapConfiguration($systemConfig);
|
||||
|
||||
$ldapEntry = [
|
||||
'uid' => ['Karl-Heinz'],
|
||||
'blub' => ['dfsdfsdf'],
|
||||
'foo' => ['count' => 1, 0 => 'bar'],
|
||||
'bar' => ['foo'],
|
||||
'roles' => ['count' => 2, 0 => 'ROLE_TEAMLEAD', 1 => 'ROLE_ADMIN'],
|
||||
'xxxxxxxx' => ['https://www.example.com'],
|
||||
'blub1' => ['dfsdfsdf'],
|
||||
'dn' => 'blub',
|
||||
];
|
||||
|
||||
$sut = new LdapManager($this->createMock(LdapDriver::class), $config, (new RoleServiceFactory($this))->create([]));
|
||||
$user = $sut->hydrate($ldapEntry);
|
||||
|
||||
self::assertInstanceOf(User::class, $user);
|
||||
self::assertEquals('Karl-Heinz', $user->getUserIdentifier());
|
||||
self::assertEquals('bar', $user->getAlias());
|
||||
self::assertEquals('foo', $user->getTitle());
|
||||
self::assertEquals(['ROLE_TEAMLEAD', 'ROLE_ADMIN', 'ROLE_USER'], $user->getRoles());
|
||||
self::assertEquals('https://www.example.com', $user->getAvatar());
|
||||
self::assertEquals('Karl-Heinz', $user->getEmail());
|
||||
}
|
||||
|
||||
public function testHydrateUser()
|
||||
{
|
||||
$ldapConfig = [
|
||||
'connection' => [
|
||||
'host' => '1.1.1.1'
|
||||
],
|
||||
'user' => [
|
||||
'usernameAttribute' => 'foo',
|
||||
'attributes' => [
|
||||
['ldap_attr' => 'uid', 'user_method' => 'setUserIdentifier'],
|
||||
['ldap_attr' => 'email', 'user_method' => 'setEmail'],
|
||||
['ldap_attr' => 'foo', 'user_method' => 'setAlias'],
|
||||
['ldap_attr' => 'bar', 'user_method' => 'setTitle'],
|
||||
['ldap_attr' => 'xxxxxxxx', 'user_method' => 'setAvatar'],
|
||||
]
|
||||
],
|
||||
'role' => [],
|
||||
];
|
||||
$systemConfig = SystemConfigurationFactory::create(new TestConfigLoader([]), ['ldap' => $ldapConfig]);
|
||||
$config = new LdapConfiguration($systemConfig);
|
||||
|
||||
$ldapEntry = [
|
||||
'uid' => ['Karl-Heinz'],
|
||||
'email' => [['karl-heinz@example.com', 'foo@example.com', 'bar@example.com']],
|
||||
'blub' => ['dfsdfsdf'],
|
||||
'foo' => ['bar'],
|
||||
'bar' => ['foo'],
|
||||
'xxxxxxxx' => ['https://www.example.com'],
|
||||
'blub1' => ['dfsdfsdf'],
|
||||
'dn' => 'blub',
|
||||
];
|
||||
|
||||
$sut = new LdapManager($this->createMock(LdapDriver::class), $config, (new RoleServiceFactory($this))->create([]));
|
||||
|
||||
$user = new User();
|
||||
$user->setPassword('foobar');
|
||||
$sut->hydrateUser($user, $ldapEntry);
|
||||
self::assertEquals('Karl-Heinz', $user->getUserIdentifier());
|
||||
self::assertEquals('bar', $user->getAlias());
|
||||
self::assertEquals('foo', $user->getTitle());
|
||||
self::assertEquals('https://www.example.com', $user->getAvatar());
|
||||
self::assertEquals('karl-heinz@example.com', $user->getEmail());
|
||||
|
||||
// make sure that the password was resetted in hydrate
|
||||
$pwdCheck = clone $user;
|
||||
$pwdCheck->setPassword('');
|
||||
self::assertEquals($pwdCheck, $user);
|
||||
}
|
||||
|
||||
public function testHydrateRoles()
|
||||
{
|
||||
$ldapConfig = [
|
||||
'user' => [
|
||||
'attributes' => []
|
||||
],
|
||||
'role' => [
|
||||
'nameAttribute' => 'cn',
|
||||
'userDnAttribute' => 'member',
|
||||
'groups' => [
|
||||
['ldap_value' => 'group1', 'role' => 'ROLE_TEAMLEAD'],
|
||||
['ldap_value' => 'group2', 'role' => 'ROLE_ADMIN'],
|
||||
['ldap_value' => 'group3', 'role' => 'ROLE_CUSTOMER'], // not existing!
|
||||
['ldap_value' => 'group4', 'role' => 'ROLE_SUPER_ADMIN'],
|
||||
],
|
||||
],
|
||||
];
|
||||
$systemConfig = SystemConfigurationFactory::create(new TestConfigLoader([]), ['ldap' => $ldapConfig]);
|
||||
$config = new LdapConfiguration($systemConfig);
|
||||
|
||||
$ldapGroups = [
|
||||
// ROLE_TEAMLEAD
|
||||
0 => [
|
||||
'cn' => [0 => 'group1'],
|
||||
'member' => [0 => 'uid=user1,ou=users,dc=kimai,dc=org', 1 => 'uid=user2,ou=users,dc=kimai,dc=org'],
|
||||
],
|
||||
// ROLE_ADMIN
|
||||
1 => [
|
||||
'cn' => [0 => 'admin'],
|
||||
'member' => [0 => 'uid=user2,ou=users,dc=kimai,dc=org', 1 => 'uid=user3,ou=users,dc=kimai,dc=org'],
|
||||
],
|
||||
// will be ignored: unknown group
|
||||
2 => [
|
||||
'cn' => [0 => 'kimai_admin'],
|
||||
'member' => [0 => 'uid=user2,ou=users,dc=kimai,dc=org', 1 => 'uid=user3,ou=users,dc=kimai,dc=org'],
|
||||
],
|
||||
// will be ignored: unknown group
|
||||
3 => [
|
||||
'cn' => [0 => 'group3'],
|
||||
'member' => [0 => 'uid=user2,ou=users,dc=kimai,dc=org', 1 => 'uid=user3,ou=users,dc=kimai,dc=org'],
|
||||
],
|
||||
// will be ignored: the counter below does not announce this group!
|
||||
4 => [
|
||||
'cn' => [0 => 'group4'],
|
||||
'member' => [0 => 'uid=user2,ou=users,dc=kimai,dc=org', 1 => 'uid=user3,ou=users,dc=kimai,dc=org'],
|
||||
],
|
||||
'count' => 4
|
||||
];
|
||||
|
||||
$roles = [
|
||||
'ROLE_USER',
|
||||
'ROLE_TEAMLEAD',
|
||||
'ROLE_ADMIN',
|
||||
'ROLE_SUPER_ADMIN',
|
||||
];
|
||||
|
||||
$sut = new LdapManager($this->createMock(LdapDriver::class), $config, (new RoleServiceFactory($this))->create($roles));
|
||||
|
||||
$user = new User();
|
||||
$sut->hydrateRoles($user, $ldapGroups);
|
||||
self::assertEquals(['ROLE_TEAMLEAD', 'ROLE_ADMIN', 'ROLE_USER'], $user->getRoles());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user