Next major version 2 with PHP 8.1, Symfony 6, Tabler UI, 2FA ... (#2902)

This commit is contained in:
Kevin Papst
2022-12-31 21:19:55 +01:00
committed by GitHub
parent 95e06746bd
commit 90a0fd8a22
2164 changed files with 83700 additions and 86426 deletions

View File

@@ -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));
}
}

View File

@@ -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());
}
}

View File

@@ -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');

View File

@@ -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 = [

View File

@@ -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());
}

View File

@@ -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';
}
}

View File

@@ -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));
}
}

View File

@@ -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());
}