Next major version 2 with PHP 8.1, Symfony 6, Tabler UI, 2FA ... (#2902)
This commit is contained in:
@@ -1,69 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Kimai time-tracking app.
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace App\Tests\Security;
|
||||
|
||||
use App\Security\ApiAuthenticator;
|
||||
use App\Security\TokenAuthenticator;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
|
||||
|
||||
/**
|
||||
* @covers \App\Security\ApiAuthenticator
|
||||
*/
|
||||
class ApiAuthenticatorTest extends TestCase
|
||||
{
|
||||
public function testRememberMe()
|
||||
{
|
||||
$factory = $this->createMock(EncoderFactoryInterface::class);
|
||||
$token = new TokenAuthenticator($factory);
|
||||
$sut = new ApiAuthenticator($token);
|
||||
|
||||
self::assertFalse($sut->supportsRememberMe());
|
||||
}
|
||||
|
||||
public function testSupports()
|
||||
{
|
||||
$factory = $this->createMock(EncoderFactoryInterface::class);
|
||||
$token = new TokenAuthenticator($factory);
|
||||
$sut = new ApiAuthenticator($token);
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => 'dfghj/api/doc/dfghj']);
|
||||
self::assertFalse($sut->supports($request));
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => '/api/fooo']);
|
||||
self::assertTrue($sut->supports($request));
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => '/api/fooo', 'HTTP_X-AUTH-SESSION' => true]);
|
||||
self::assertFalse($sut->supports($request));
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => '/api/fooo', 'HTTP_X-AUTH-USER' => 'foo', 'HTTP_X-AUTH-TOKEN' => 'bar']);
|
||||
self::assertTrue($sut->supports($request));
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => '/api/fooo', 'HTTP_X-AUTH-USER' => 'foo', 'HTTP_X-AUTH-TOKEN' => 'bar', 'HTTP_X-AUTH-SESSION' => true]);
|
||||
self::assertFalse($sut->supports($request));
|
||||
}
|
||||
|
||||
public function testGetCredentials()
|
||||
{
|
||||
$factory = $this->createMock(EncoderFactoryInterface::class);
|
||||
$token = new TokenAuthenticator($factory);
|
||||
$sut = new ApiAuthenticator($token);
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => '/api/fooo', 'HTTP_X-AUTH-SESSION' => true]);
|
||||
self::assertEquals(['user' => null, 'token' => null], $sut->getCredentials($request));
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => '/api/fooo', 'HTTP_X-AUTH-USER' => 'foo']);
|
||||
self::assertEquals(['user' => 'foo', 'token' => null], $sut->getCredentials($request));
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => '/api/fooo', 'HTTP_X-AUTH-USER' => 'foo', 'HTTP_X-AUTH-TOKEN' => 'bar']);
|
||||
self::assertEquals(['user' => 'foo', 'token' => 'bar'], $sut->getCredentials($request));
|
||||
}
|
||||
}
|
||||
@@ -1,122 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Kimai time-tracking app.
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace App\Tests\Security;
|
||||
|
||||
use App\Entity\User;
|
||||
use App\Repository\UserRepository;
|
||||
use App\Security\DoctrineUserProvider;
|
||||
use KevinPapst\AdminLTEBundle\Model\UserInterface;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
|
||||
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
|
||||
|
||||
/**
|
||||
* @covers \App\Security\DoctrineUserProvider
|
||||
*/
|
||||
class DoctrineUserProviderTest extends TestCase
|
||||
{
|
||||
public function testLoadUserByUsernameReturnsNullThrowsException()
|
||||
{
|
||||
$this->expectException(UsernameNotFoundException::class);
|
||||
$this->expectExceptionMessage('User "test" not found.');
|
||||
|
||||
$repository = $this->getMockBuilder(UserRepository::class)->disableOriginalConstructor()->getMock();
|
||||
$repository->expects($this->once())->method('loadUserByUsername')->willReturn(null);
|
||||
|
||||
$sut = new DoctrineUserProvider($repository);
|
||||
$sut->loadUserByUsername('test');
|
||||
}
|
||||
|
||||
public function testLoadUserByUsernameReturnsUser()
|
||||
{
|
||||
$user = new User();
|
||||
$user->setUsername('foobar');
|
||||
|
||||
$repository = $this->getMockBuilder(UserRepository::class)->disableOriginalConstructor()->getMock();
|
||||
$repository->expects($this->once())->method('loadUserByUsername')->willReturn($user);
|
||||
|
||||
$sut = new DoctrineUserProvider($repository);
|
||||
$actual = $sut->loadUserByUsername('test');
|
||||
|
||||
self::assertInstanceOf(User::class, $actual);
|
||||
self::assertSame($user, $actual);
|
||||
}
|
||||
|
||||
public function testSupportsClass()
|
||||
{
|
||||
$repository = $this->getMockBuilder(UserRepository::class)->disableOriginalConstructor()->getMock();
|
||||
|
||||
$sut = new DoctrineUserProvider($repository);
|
||||
|
||||
self::assertTrue($sut->supportsClass(User::class));
|
||||
self::assertTrue($sut->supportsClass('App\Entity\User'));
|
||||
self::assertFalse($sut->supportsClass(UserInterface::class));
|
||||
self::assertFalse($sut->supportsClass(TestUserEntity::class));
|
||||
}
|
||||
|
||||
public function testRefreshUserThrowsExceptionOnUnsupportedUserClass()
|
||||
{
|
||||
$this->expectException(UnsupportedUserException::class);
|
||||
$this->expectExceptionMessage('Expected an instance of App\Entity\User, but got "App\Tests\Security\TestUserEntity".');
|
||||
|
||||
$user = new TestUserEntity();
|
||||
|
||||
$repository = $this->getMockBuilder(UserRepository::class)->disableOriginalConstructor()->getMock();
|
||||
|
||||
$sut = new DoctrineUserProvider($repository);
|
||||
$actual = $sut->refreshUser($user);
|
||||
}
|
||||
|
||||
public function testRefreshUserThrowsExceptionOnNonFoundUser()
|
||||
{
|
||||
$this->expectException(UsernameNotFoundException::class);
|
||||
$this->expectExceptionMessage('User with ID "" could not be reloaded');
|
||||
|
||||
$user = new User();
|
||||
$user->setUsername('foobar');
|
||||
|
||||
$repository = $this->getMockBuilder(UserRepository::class)->disableOriginalConstructor()->getMock();
|
||||
$repository->expects($this->once())->method('getUserById')->willReturn(null);
|
||||
|
||||
$sut = new DoctrineUserProvider($repository);
|
||||
$actual = $sut->refreshUser($user);
|
||||
}
|
||||
|
||||
public function testRefreshUserThrowsNoExceptionOnLdapUser()
|
||||
{
|
||||
$user = new User();
|
||||
$user->setUsername('foobar');
|
||||
$user->setAuth(User::AUTH_LDAP);
|
||||
|
||||
$repository = $this->getMockBuilder(UserRepository::class)->disableOriginalConstructor()->getMock();
|
||||
$repository->expects($this->once())->method('getUserById')->willReturn($user);
|
||||
|
||||
$sut = new DoctrineUserProvider($repository);
|
||||
$actual = $sut->refreshUser($user);
|
||||
|
||||
self::assertSame($user, $actual);
|
||||
}
|
||||
|
||||
public function testRefreshUserReturnsUser()
|
||||
{
|
||||
$user = new User();
|
||||
$user->setUsername('foobar');
|
||||
|
||||
$repository = $this->getMockBuilder(UserRepository::class)->disableOriginalConstructor()->getMock();
|
||||
$repository->expects($this->once())->method('getUserById')->willReturn($user);
|
||||
|
||||
$sut = new DoctrineUserProvider($repository);
|
||||
$actual = $sut->refreshUser($user);
|
||||
|
||||
self::assertInstanceOf(User::class, $actual);
|
||||
self::assertSame($user, $actual);
|
||||
self::assertTrue($user->isInternalUser());
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,7 @@ class RolePermissionManagerTest extends TestCase
|
||||
$repository->method('getAllAsArray')->willReturn([]);
|
||||
|
||||
/** @var RolePermissionRepository $repository */
|
||||
$sut = new RolePermissionManager($repository, []);
|
||||
$sut = new RolePermissionManager($repository, [], []);
|
||||
self::assertFalse($sut->isRegisteredPermission('foo'));
|
||||
self::assertEquals([], $sut->getPermissions());
|
||||
self::assertFalse($sut->hasPermission('TEST_ROLE', 'foo'));
|
||||
@@ -41,7 +41,7 @@ class RolePermissionManagerTest extends TestCase
|
||||
]);
|
||||
|
||||
/** @var RolePermissionRepository $repository */
|
||||
$sut = new RolePermissionManager($repository, []);
|
||||
$sut = new RolePermissionManager($repository, [], []);
|
||||
|
||||
// only data injected through the config will be registered as "known"
|
||||
self::assertFalse($sut->isRegisteredPermission('foo'));
|
||||
@@ -59,7 +59,7 @@ class RolePermissionManagerTest extends TestCase
|
||||
$repository->method('getAllAsArray')->willReturn([]);
|
||||
|
||||
/** @var RolePermissionRepository $repository */
|
||||
$sut = new RolePermissionManager($repository, ['TEST_ROLE' => ['foo'], 'USER_ROLE' => ['bar']]);
|
||||
$sut = new RolePermissionManager($repository, ['TEST_ROLE' => ['foo' => true], 'USER_ROLE' => ['bar' => true]], ['foo' => true, 'bar' => true]);
|
||||
|
||||
self::assertTrue($sut->isRegisteredPermission('foo'));
|
||||
self::assertTrue($sut->isRegisteredPermission('bar'));
|
||||
@@ -85,10 +85,10 @@ class RolePermissionManagerTest extends TestCase
|
||||
|
||||
/** @var RolePermissionRepository $repository */
|
||||
$sut = new RolePermissionManager($repository, [
|
||||
'ROLE_SUPER_ADMIN' => ['role_permissions', 'view_user', 'create_user'],
|
||||
'TEST_ROLE' => ['foo2', 'foo'],
|
||||
'USER_ROLE' => ['foo', 'bar']
|
||||
]);
|
||||
'ROLE_SUPER_ADMIN' => ['role_permissions' => true, 'view_user' => true, 'create_user' => true],
|
||||
'TEST_ROLE' => ['foo2' => true, 'foo' => true],
|
||||
'USER_ROLE' => ['foo' => true, 'bar' => true]
|
||||
], ['role_permissions' => true, 'view_user' => true, 'create_user' => true, 'foo2' => true, 'foo' => true, 'bar' => true]);
|
||||
|
||||
$user = new User();
|
||||
$user->addRole('TEST_ROLE');
|
||||
|
||||
@@ -21,14 +21,15 @@ class RoleServiceTest extends TestCase
|
||||
public function testWithEmptyRepository()
|
||||
{
|
||||
$real = [
|
||||
'ROLE_TEAMLEAD' => ['ROLE_USER'],
|
||||
'ROLE_ADMIN' => ['ROLE_TEAMLEAD'],
|
||||
'ROLE_SUPER_ADMIN' => ['ROLE_ADMIN']
|
||||
'ROLE_USER',
|
||||
'ROLE_TEAMLEAD',
|
||||
'ROLE_ADMIN',
|
||||
'ROLE_SUPER_ADMIN',
|
||||
];
|
||||
|
||||
$sut = (new RoleServiceFactory($this))->create($real);
|
||||
|
||||
$expected = ['ROLE_TEAMLEAD', 'ROLE_USER', 'ROLE_ADMIN', 'ROLE_SUPER_ADMIN'];
|
||||
$expected = ['ROLE_USER', 'ROLE_TEAMLEAD', 'ROLE_ADMIN', 'ROLE_SUPER_ADMIN'];
|
||||
|
||||
self::assertEquals($expected, $sut->getAvailableNames());
|
||||
self::assertEquals($real, $sut->getSystemRoles());
|
||||
@@ -37,9 +38,10 @@ class RoleServiceTest extends TestCase
|
||||
public function testWithRepositoryData()
|
||||
{
|
||||
$real = [
|
||||
'ROLE_TEAMLEAD' => [0 => 'ROLE_USER'],
|
||||
'ROLE_ADMIN' => [0 => 'ROLE_TEAMLEAD'],
|
||||
'ROLE_SUPER_ADMIN' => [0 => 'ROLE_ADMIN']
|
||||
'ROLE_TEAMLEAD',
|
||||
'ROLE_USER',
|
||||
'ROLE_ADMIN',
|
||||
'ROLE_SUPER_ADMIN',
|
||||
];
|
||||
|
||||
$repository = [
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
namespace App\Tests\Security;
|
||||
|
||||
use App\Security\SessionHandler;
|
||||
use Doctrine\DBAL\Connection;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
@@ -19,7 +20,7 @@ class SessionHandlerTest extends TestCase
|
||||
{
|
||||
public function testConstruct()
|
||||
{
|
||||
$sut = new SessionHandler(null);
|
||||
$sut = new SessionHandler($this->createMock(Connection::class));
|
||||
|
||||
self::assertFalse($sut->isSessionExpired());
|
||||
}
|
||||
|
||||
@@ -13,22 +13,12 @@ use Symfony\Component\Security\Core\User\UserInterface;
|
||||
|
||||
class TestUserEntity implements UserInterface
|
||||
{
|
||||
public function getRoles()
|
||||
public function getRoles(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
public function getPassword()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getSalt()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getUsername()
|
||||
public function getUserIdentifier(): string
|
||||
{
|
||||
return 'foo';
|
||||
}
|
||||
@@ -36,4 +26,9 @@ class TestUserEntity implements UserInterface
|
||||
public function eraseCredentials()
|
||||
{
|
||||
}
|
||||
|
||||
public function getTimeFormat()
|
||||
{
|
||||
return 'H:i';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Kimai time-tracking app.
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace App\Tests\Security;
|
||||
|
||||
use App\Security\TokenAuthenticator;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
|
||||
|
||||
/**
|
||||
* @covers \App\Security\TokenAuthenticator
|
||||
*/
|
||||
class TokenAuthenticatorTest extends TestCase
|
||||
{
|
||||
public function testRememberMe()
|
||||
{
|
||||
$factory = $this->createMock(EncoderFactoryInterface::class);
|
||||
$sut = new TokenAuthenticator($factory);
|
||||
|
||||
self::assertFalse($sut->supportsRememberMe());
|
||||
}
|
||||
|
||||
public function testSupports()
|
||||
{
|
||||
$factory = $this->createMock(EncoderFactoryInterface::class);
|
||||
$sut = new TokenAuthenticator($factory);
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => 'dfghj/api/doc/dfghj']);
|
||||
self::assertFalse($sut->supports($request));
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => '/api/fooo']);
|
||||
self::assertFalse($sut->supports($request));
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => '/api/fooo', 'HTTP_X-AUTH-SESSION' => true]);
|
||||
self::assertFalse($sut->supports($request));
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => '/api/fooo', 'HTTP_X-AUTH-USER' => 'foo', 'HTTP_X-AUTH-TOKEN' => 'bar']);
|
||||
self::assertTrue($sut->supports($request));
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => '/api/fooo', 'HTTP_X-AUTH-USER' => 'foo', 'HTTP_X-AUTH-TOKEN' => 'bar', 'HTTP_X-AUTH-SESSION' => true]);
|
||||
self::assertTrue($sut->supports($request));
|
||||
}
|
||||
|
||||
public function testGetCredentials()
|
||||
{
|
||||
$factory = $this->createMock(EncoderFactoryInterface::class);
|
||||
$sut = new TokenAuthenticator($factory);
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => '/api/fooo', 'HTTP_X-AUTH-SESSION' => true]);
|
||||
self::assertEquals(['user' => null, 'token' => null], $sut->getCredentials($request));
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => '/api/fooo', 'HTTP_X-AUTH-USER' => 'foo']);
|
||||
self::assertEquals(['user' => 'foo', 'token' => null], $sut->getCredentials($request));
|
||||
|
||||
$request = new Request([], [], [], [], [], ['REQUEST_URI' => '/api/fooo', 'HTTP_X-AUTH-USER' => 'foo', 'HTTP_X-AUTH-TOKEN' => 'bar']);
|
||||
self::assertEquals(['user' => 'foo', 'token' => 'bar'], $sut->getCredentials($request));
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,6 @@ use App\Entity\User;
|
||||
use App\Security\UserChecker;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Security\Core\Exception\DisabledException;
|
||||
use Symfony\Component\Security\Core\User\User as SymfonyUser;
|
||||
|
||||
/**
|
||||
* @covers \App\Security\UserChecker
|
||||
@@ -25,7 +24,7 @@ class UserCheckerTest extends TestCase
|
||||
$sut = new UserChecker();
|
||||
|
||||
try {
|
||||
$sut->checkPreAuth(new SymfonyUser('sdf', null));
|
||||
$sut->checkPreAuth(new TestUserEntity());
|
||||
} catch (\Exception $ex) {
|
||||
$this->fail('UserChecker should not throw exception in checkPreAuth(), ' . $ex->getMessage());
|
||||
}
|
||||
@@ -37,7 +36,7 @@ class UserCheckerTest extends TestCase
|
||||
$sut = new UserChecker();
|
||||
|
||||
try {
|
||||
$sut->checkPostAuth(new SymfonyUser('sdf', null));
|
||||
$sut->checkPostAuth(new TestUserEntity());
|
||||
} catch (\Exception $ex) {
|
||||
$this->fail('UserChecker should not throw exception in checkPostAuth(), ' . $ex->getMessage());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user