Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ spiriit_auth_log:

# Geolocation configuration (optional)
location:
method: null # 'geoip2', 'ipApi', or null to disable
provider: null # 'geoip2', 'ipApi', or null to disable
geoip2_database_path: null # Required if using geoip2
```

Expand All @@ -72,7 +72,7 @@ spiriit_auth_log:
# ...

location:
method: 'geoip2'
provider: 'geoip2'
geoip2_database_path: '%kernel.project_dir%/var/GeoLite2-City.mmdb'
```

Expand All @@ -85,7 +85,7 @@ spiriit_auth_log:
# ...

location:
method: 'ipApi'
provider: 'ipApi'
```

## Usage
Expand Down
6 changes: 4 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
},
"autoload-dev": {
"psr-4": {
"Spiriit\\Bundle\\Tests\\": "Tests/"
"Spiriit\\Bundle\\Tests\\": "tests/"
}
},
"require": {
Expand All @@ -35,14 +35,16 @@
"symfony/mailer": "^6.0 || ^7.0",
"symfony/security-bundle": "^6.4|^7.0",
"symfony/translation-contracts": "^1.0|^2.0|^3.0",
"symfony/translation": "^7.3",
"symfony/twig-bundle": "^6.4|^7.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.64",
"phpstan/phpstan": "^2.1",
"phpstan/phpstan-symfony": "^2.0",
"rector/rector": "^2.1",
"symfony/phpunit-bridge": "^7.3"
"symfony/phpunit-bridge": "^7.3",
"symfony/yaml": "^7.3"
},
"config": {
"sort-packages": true
Expand Down
4 changes: 3 additions & 1 deletion phpunit.xml.dist
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>

<!-- https://phpunit.readthedocs.io/en/latest/configuration.html -->
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
backupGlobals="false"
bootstrap="vendor/autoload.php"
Expand All @@ -13,6 +14,7 @@

<php>
<ini name="error_reporting" value="-1" />
<env name="KERNEL_CLASS" value="Spiriit\Bundle\Tests\Integration\Kernel"/>
<server name="APP_ENV" value="test" force="true" />
<server name="APP_DEBUG" value="true" force="true" />
<server name="SHELL_VERBOSITY" value="-1" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ interface AuthenticationLogFactoryInterface
{
public function supports(): string;

/**
* @param mixed[] $factoryParameters
*/
public function createFrom(string $userIdentifier, UserInformation $userInformation): AbstractAuthenticationLog;

public function isKnown(AbstractAuthenticationLog $authenticationLog): bool;
Expand Down
10 changes: 9 additions & 1 deletion src/DTO/LoginParameterDto.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
<?php

/*
* This file is part of the SpiriitLabs php-excel-rust package.
* Copyright (c) SpiriitLabs <https://www.spiriit.com/>
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Spiriit\Bundle\AuthLogBundle\DTO;

readonly class LoginParameterDto
Expand All @@ -11,5 +18,6 @@ public function __construct(
public string $toEmailName,
public string $clientIp,
public string $userAgent,
) {}
) {
}
}
5 changes: 3 additions & 2 deletions src/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public function getConfigTreeBuilder(): TreeBuilder
->info('Enables integration with symfony/messenger if set true.')
->end()
->arrayNode('transports')
->isRequired()
->addDefaultsIfNotSet()
->children()
->scalarNode('mailer')
Expand All @@ -50,7 +51,7 @@ public function getConfigTreeBuilder(): TreeBuilder
->arrayNode('location')
->canBeUnset()
->children()
->scalarNode('method')
->scalarNode('provider')
->defaultNull()
->validate()
->ifNotInArray(['geoip2', 'ipApi', null])
Expand All @@ -63,7 +64,7 @@ public function getConfigTreeBuilder(): TreeBuilder
->end()
->validate()
->ifTrue(function ($v): bool {
return null !== $v && ($v['method'] ?? null) === 'geoip2' && empty($v['geoip2_database_path']);
return null !== $v && ($v['provider'] ?? null) === 'geoip2' && empty($v['geoip2_database_path']);
})
->thenInvalid('Le champ "geoip2_database_path" est requis si la méthode "geoip2" est utilisée.')
->end()
Expand Down
20 changes: 9 additions & 11 deletions src/DependencyInjection/SpiriitAuthLogExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,20 @@ public function load(array $configs, ContainerBuilder $container): void
'fromName' => $config['transports']['sender_name'],
];

$container->setAlias('spiriit_auth_log.translator', 'translator');

$container->setDefinition('spiriit_auth_log.notification', new Definition(NotificationInterface::class))
->setClass(MailerNotification::class)
->setArgument('$mailer', new Reference('spiriit_auth_log.transports.mailer'))
->setArgument('$translator', new Reference('translator'))
->setArgument('$addresses', $addresses)
->setPublic(false);
->setArgument('$translator', new Reference('spiriit_auth_log.translator'))
->setArgument('$addresses', $addresses);
} else {
$container->setAlias('spiriit_auth_log.notification', $config['transports']['mailer'])->setPublic(false);
}

$container->setDefinition('spiriit_auth_log.fetch_user_information', new Definition(FetchUserInformation::class))
->setPublic(false);
$container->setDefinition('spiriit_auth_log.fetch_user_information', new Definition(FetchUserInformation::class));

if (null !== $config['location']) {
if (!empty($config['location'])) {
$this->loadLocateMethod($config, $container);
}

Expand All @@ -74,9 +74,9 @@ public function load(array $configs, ContainerBuilder $container): void

$container->setAlias('spiriit_auth_log.login_event_dispatcher', EventDispatcherInterface::class);

$definitionLoginListener = $container->getDefinition('spiriit_auth_log.login_listener');

if ($config['messenger']) {
$definitionLoginListener = $container->getDefinition('spiriit_auth_log.login_listener');

$loader->load('messenger.php');

$definitionLoginListener->addMethodCall('setMessageBus', [
Expand All @@ -90,7 +90,7 @@ public function load(array $configs, ContainerBuilder $container): void
*/
private function loadLocateMethod(array $configLocation, ContainerBuilder $container): void
{
$class = match ($configLocation['location']['method']) {
$class = match ($configLocation['location']['provider']) {
'ipApi' => IpApiLocateMethod::class,
'geoip2' => Geoip2LocateMethod::class,
default => null,
Expand All @@ -100,13 +100,11 @@ private function loadLocateMethod(array $configLocation, ContainerBuilder $conta
$container->setDefinition('spiriit_auth_log.fetch_user_information_method', new Definition(FetchUserInformationMethodInterface::class))
->setClass(IpApiLocateMethod::class)
->setArgument('$httpClient', new Reference('spiriit_auth_log.http_client'))
->setPublic(true)
;
} elseif (Geoip2LocateMethod::class === $class) {
$container->setDefinition('spiriit_auth_log.fetch_user_information_method', new Definition(FetchUserInformationMethodInterface::class))
->setClass(Geoip2LocateMethod::class)
->setArgument('$geoip2DatabasePath', $configLocation['location']['geoip2_database_path'] ?? null)
->setPublic(true)
;
}
}
Expand Down
1 change: 0 additions & 1 deletion src/Listener/LoginListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ public function onLogin(InteractiveLoginEvent $event): void
$request = $event->getRequest();

/** @var UserInterface&AuthenticableLogInterface $user */

$loginParameterDto = new LoginParameterDto(
factoryName: $user->getAuthenticationLogFactoryName(),
userIdentifier: $user->getUserIdentifier(),
Expand Down
3 changes: 0 additions & 3 deletions src/Services/AuthenticationContextBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@ public function __construct(
) {
}

/**
* @param mixed[] $parametersFactory
*/
public function build(LoginParameterDto $loginParameterDto): AuthenticationContext
{
$factory = $this->factory->createFrom($loginParameterDto->factoryName);
Expand Down
78 changes: 78 additions & 0 deletions tests/DependencyInjection/SpiriitAuthLogExtensionTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<?php

/*
* This file is part of the SpiriitLabs php-excel-rust package.
* Copyright (c) SpiriitLabs <https://www.spiriit.com/>
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Spiriit\Bundle\Tests\DependencyInjection;

use PHPUnit\Framework\TestCase;
use Spiriit\Bundle\AuthLogBundle\DependencyInjection\SpiriitAuthLogExtension;
use Spiriit\Bundle\AuthLogBundle\SpiriitAuthLogBundle;
use Spiriit\Bundle\Tests\Integration\Stubs\Kernel;
use Symfony\Bundle\FrameworkBundle\DependencyInjection\FrameworkExtension;
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;

class SpiriitAuthLogExtensionTest extends TestCase
{
public function testEmptyConfiguration(): void
{
$container = $this->createContainer([
'framework' => [
'secret' => 'testing',
],
'spiriit_auth_log' => [],
]);

self::expectException(InvalidConfigurationException::class);
self::expectExceptionMessage('The child config "transports" under "spiriit_auth_log" must be configured.');

$container->compile();
}

private function createContainer(array $configs = []): ContainerBuilder
{
$container = new ContainerBuilder(new ParameterBag([
'kernel.bundles_metadata' => [],
'kernel.cache_dir' => __DIR__,
'kernel.debug' => false,
'kernel.environment' => 'test',
'kernel.name' => 'kernel',
'kernel.root_dir' => __DIR__,
'kernel.project_dir' => __DIR__,
'kernel.container_class' => 'AutowiringTestContainer',
'kernel.charset' => 'utf8',
'kernel.runtime_environment' => 'test',
'env(base64:default::SYMFONY_DECRYPTION_SECRET)' => 'dummy',
'kernel.build_dir' => __DIR__,
'debug.file_link_format' => null,
'env(bool:default::SYMFONY_TRUST_X_SENDFILE_TYPE_HEADER)' => true,
'env(default::SYMFONY_TRUSTED_HOSTS)' => [],
'env(default::SYMFONY_TRUSTED_PROXIES)' => [],
'env(default::SYMFONY_TRUSTED_HEADERS)' => [],
'kernel.bundles' => [
'FrameworkBundle' => FrameworkBundle::class,
'SpiriitAuthLogBundle' => SpiriitAuthLogBundle::class,
],
]));

$container->set('kernel', function () {
return new Kernel('test', false);
});

$container->registerExtension(new FrameworkExtension());
$container->registerExtension(new SpiriitAuthLogExtension());

foreach ($configs as $extension => $config) {
$container->loadFromExtension($extension, $config);
}

return $container;
}
}
93 changes: 93 additions & 0 deletions tests/Integration/KernelTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<?php

/*
* This file is part of the SpiriitLabs php-excel-rust package.
* Copyright (c) SpiriitLabs <https://www.spiriit.com/>
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Spiriit\Bundle\Tests\Integration;

use Spiriit\Bundle\AuthLogBundle\FetchUserInformation\FetchUserInformation;
use Spiriit\Bundle\AuthLogBundle\FetchUserInformation\LocateUserInformation\Geoip2LocateMethod;
use Spiriit\Bundle\AuthLogBundle\FetchUserInformation\LocateUserInformation\IpApiLocateMethod;
use Spiriit\Bundle\AuthLogBundle\Notification\MailerNotification;
use Spiriit\Bundle\Tests\Integration\Stubs\Kernel as KernelStub;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Mailer\MailerInterface;

class KernelTest extends KernelTestCase
{
protected function setUp(): void
{
parent::setUp();

$fs = new Filesystem();
$fs->remove(sys_get_temp_dir().'/SpiriitAuthLogBundle/');
}

protected function tearDown(): void
{
parent::tearDown();

static::ensureKernelShutdown();
}

/**
* {@inheritdoc}
*/
protected static function createKernel(array $options = []): KernelInterface
{
return new KernelStub('test', true, $options['config'] ?? 'base');
}

public function testLoadedMinimalConfig(): void
{
self::bootKernel(['config' => 'minimal']);

$config = self::getContainer()->getParameter('spiriit_auth_log.config');

self::assertArrayHasKey('transports', $config);
self::assertArrayHasKey('sender_email', $config['transports']);
self::assertArrayHasKey('sender_email', $config['transports']);
self::assertInstanceOf(MailerInterface::class, self::getContainer()->get('spiriit_auth_log.transports.mailer'));
self::assertInstanceOf(FetchUserInformation::class, self::getContainer()->get('spiriit_auth_log.fetch_user_information'));
self::assertInstanceOf(MailerNotification::class, self::getContainer()->get('spiriit_auth_log.notification'));
self::assertFalse(self::getContainer()->has('spiriit_auth_log.fetch_user_information_method'));
}

public function testLoadedLocationIpApiConfig(): void
{
self::bootKernel(['config' => 'location_ipapi']);

$config = self::getContainer()->getParameter('spiriit_auth_log.config');

self::assertArrayHasKey('location', $config);
self::assertArrayHasKey('provider', $config['location']);
self::assertInstanceOf(IpApiLocateMethod::class, self::getContainer()->get('spiriit_auth_log.fetch_user_information_method'));
}

public function testLoadedLocationGeoIpConfig(): void
{
self::bootKernel(['config' => 'location_geoip2']);

$config = self::getContainer()->getParameter('spiriit_auth_log.config');

self::assertArrayHasKey('location', $config);
self::assertArrayHasKey('provider', $config['location']);
self::assertInstanceOf(Geoip2LocateMethod::class, self::getContainer()->get('spiriit_auth_log.fetch_user_information_method'));
}

public function testLoadedMessengerConfig(): void
{
self::bootKernel(['config' => 'messenger']);

$config = self::getContainer()->getParameter('spiriit_auth_log.config');

self::assertArrayHasKey('messenger', $config);
self::assertNotNull(self::getContainer()->get('spiriit_auth_log.login_message_handler'));
}
}
Loading