Skip to content

Commit

Permalink
Merge pull request #507 from systemli/fix/login_event
Browse files Browse the repository at this point in the history
Subscribe to correct LoginEvent name
  • Loading branch information
doobry-systemli authored Nov 7, 2023
2 parents 9268491 + ce1d943 commit 321a83f
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 14 deletions.
2 changes: 1 addition & 1 deletion .env
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,5 @@ MAILER_DELIVERY_ADDRESS="[email protected]"
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
# DATABASE_URL="mysql://app:[email protected]:3306/app?serverVersion=8&charset=utf8mb4"
# DATABASE_URL="postgresql://app:[email protected]:5432/app?serverVersion=14&charset=utf8"
DATABASE_URL="mysql://mail:[email protected]:3306/mail?serverVersion=mariadb-10.3.23&charset=utf8mb4"
DATABASE_URL="mysql://mail:[email protected]:3306/mail?charset=utf8mb4"
###< doctrine/doctrine-bundle ###
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# 3.2.4 (unreleased)

* Fix setting last_login_time on authentication through checkpassword command.

# 3.2.3 (2023.10.31)

* Update dependencies
Expand Down
4 changes: 3 additions & 1 deletion src/Command/UsersRegistrationMailCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ protected function configure(): void
*
* @throws \Exception
*/
protected function execute(InputInterface $input, OutputInterface $output)
protected function execute(InputInterface $input, OutputInterface $output): int
{
$email = $input->getOption('user');
$locale = $input->getOption('locale');
Expand All @@ -50,5 +50,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
}

$this->welcomeMessageSender->send($user, $locale);

return 0;
}
}
2 changes: 1 addition & 1 deletion src/Event/RecoveryProcessEvent.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use Symfony\Contracts\EventDispatcher\Event;

/**
* Class LoginEvent.
* Class RecoveryProcessEvent.
*/
class RecoveryProcessEvent extends Event
{
Expand Down
2 changes: 1 addition & 1 deletion src/EventListener/LoginListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public static function getSubscribedEvents(): array
{
return [
SecurityEvents::INTERACTIVE_LOGIN => 'onSecurityInteractiveLogin',
LoginEvent::class => 'onLogin',
LoginEvent::NAME => 'onLogin',
];
}
}
60 changes: 51 additions & 9 deletions tests/Command/UsersCheckPasswordCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
use App\Command\UsersCheckPasswordCommand;
use App\Entity\User;
use App\Enum\Roles;
use App\Event\LoginEvent;
use App\EventListener\LoginListener;
use App\Handler\MailCryptKeyHandler;
use App\Handler\UserAuthenticationHandler;
use App\Helper\FileDescriptorReader;
Expand All @@ -13,6 +15,10 @@
use PHPUnit\Framework\TestCase;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Tester\CommandTester;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\PasswordHasher\Hasher\PasswordHasherFactoryInterface;
use Symfony\Component\PasswordHasher\PasswordHasherInterface;

class UsersCheckPasswordCommandTest extends TestCase
{
Expand All @@ -21,16 +27,21 @@ class UsersCheckPasswordCommandTest extends TestCase
protected $quotaUser;
protected $mailCryptUser;
protected $spamUser;
protected $loginListener;

public function setUp(): void
{
$this->plainUser = new User();
$this->plainUser->setPassword('passwordhash');
$this->quotaUser = new User();
$this->quotaUser->setPassword('passwordhash');
$this->quotaUser->setQuota(1024);
$this->mailCryptUser = new User();
$this->mailCryptUser->setPassword('passwordhash');
$this->mailCryptUser->setMailCrypt(true);
$this->mailCryptUser->setMailCryptPublicKey('somePublicKey');
$this->spamUser = new User();
$this->spamUser->setPassword('passwordhash');
$this->spamUser->setRoles([Roles::SPAM]);
}

Expand Down Expand Up @@ -92,6 +103,35 @@ public function testExecuteFd3($inputStream, $returnCode): void
$this->assertEquals($returnCode, $commandTester->getStatusCode());
}

public function testExecuteCallsLoginListener(): void
{
$inputStream = "[email protected]\x00password";
$returnCode = 0;

$manager = $this->getManager();
$reader = $this->getReaderFd3($inputStream);
$handler = $this->getHandler();
$mailCryptKeyHandler = $this->getMailCryptKeyHandler();
$mailCrypt = 2;
$mailUID = 5000;
$mailGID = 5000;
$mailLocation = 'var/vmail';

$command = new UsersCheckPasswordCommand($manager,
$reader,
$handler,
$mailCryptKeyHandler,
$mailCrypt,
$mailUID,
$mailGID,
$mailLocation);
$commandTester = new CommandTester($command);

$this->loginListener->expects(self::once())->method('onLogin');
$commandTester->execute([]);
self::assertEquals($returnCode, $commandTester->getStatusCode());
}

/**
* @dataProvider validContentProvider
*/
Expand Down Expand Up @@ -239,19 +279,21 @@ public function getManager(): EntityManagerInterface

public function getHandler(): UserAuthenticationHandler
{
$handler = $this->getMockBuilder(UserAuthenticationHandler::class)
->disableOriginalConstructor()
->getMock();
$handler->method('authenticate')->willReturnMap(
$passwordHasher = $this->createMock(PasswordHasherInterface::class);
$passwordHasher->method('verify')->willReturnMap(
[
[$this->plainUser, 'password', $this->plainUser],
[$this->quotaUser, 'password', $this->quotaUser],
[$this->mailCryptUser, 'password', $this->mailCryptUser],
[$this->spamUser, 'password', $this->spamUser],
['passwordhash', 'password', true],
['passwordhash', 'wrongpassword', false],
['passwordhash', '', false],
]
);
$passwordHasherFactory = $this->createMock(PasswordHasherFactoryInterface::class);
$passwordHasherFactory->method('getPasswordHasher')->willReturn($passwordHasher);

return $handler;
$this->loginListener = $this->createMock(LoginListener::class);
$eventDispatcher = new EventDispatcher();
$eventDispatcher->addListener(LoginEvent::NAME, [$this->loginListener, 'onLogin']);
return new UserAuthenticationHandler($passwordHasherFactory, $eventDispatcher);
}

public function getMailCryptKeyHandler(): MailCryptKeyHandler
Expand Down
2 changes: 1 addition & 1 deletion tests/EventListener/LoginListenerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ public function testGetSubscribedEvents(): void
{
$this->assertEquals([
SecurityEvents::INTERACTIVE_LOGIN => 'onSecurityInteractiveLogin',
LoginEvent::class => 'onLogin',
LoginEvent::NAME => 'onLogin',
],
$this->listener::getSubscribedEvents());
}
Expand Down

0 comments on commit 321a83f

Please sign in to comment.