From a293f40eeb3ce8c3acf06071de5358c4678f3144 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Mon, 26 Aug 2024 11:19:27 +0200 Subject: [PATCH 1/5] Fix SA (#1694) --- src/Action/ResetAction.php | 2 +- src/Command/ActivateUserCommand.php | 4 ++-- src/Command/ChangePasswordCommand.php | 4 ++-- src/Command/CreateUserCommand.php | 2 +- src/Command/DeactivateUserCommand.php | 4 ++-- src/Command/DemoteUserCommand.php | 8 ++++---- src/Command/PromoteUserCommand.php | 8 ++++---- src/DependencyInjection/SonataUserExtension.php | 8 ++++---- src/Mailer/Mailer.php | 2 +- src/Security/RolesBuilder/AdminRolesBuilder.php | 2 +- src/Security/UserProvider.php | 8 ++++---- tests/Functional/Action/ResetActionTest.php | 4 ++-- tests/Mailer/MailerTest.php | 2 +- 13 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/Action/ResetAction.php b/src/Action/ResetAction.php index 392c38b73..92789f376 100644 --- a/src/Action/ResetAction.php +++ b/src/Action/ResetAction.php @@ -51,7 +51,7 @@ public function __invoke(Request $request, string $token): Response $user = $this->userManager->findUserByConfirmationToken($token); if (null === $user) { - throw new NotFoundHttpException(sprintf('The user with "confirmation token" does not exist for value "%s"', $token)); + throw new NotFoundHttpException(\sprintf('The user with "confirmation token" does not exist for value "%s"', $token)); } if (!$user->isPasswordRequestNonExpired($this->tokenTtl)) { diff --git a/src/Command/ActivateUserCommand.php b/src/Command/ActivateUserCommand.php index 0d4601080..70b495ba0 100644 --- a/src/Command/ActivateUserCommand.php +++ b/src/Command/ActivateUserCommand.php @@ -53,14 +53,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int $user = $this->userManager->findUserByUsername($username); if (null === $user) { - throw new \InvalidArgumentException(sprintf('User identified by "%s" username does not exist.', $username)); + throw new \InvalidArgumentException(\sprintf('User identified by "%s" username does not exist.', $username)); } $user->setEnabled(true); $this->userManager->save($user); - $output->writeln(sprintf('User "%s" has been activated.', $username)); + $output->writeln(\sprintf('User "%s" has been activated.', $username)); return 0; } diff --git a/src/Command/ChangePasswordCommand.php b/src/Command/ChangePasswordCommand.php index 435bbf35f..aad9484a0 100644 --- a/src/Command/ChangePasswordCommand.php +++ b/src/Command/ChangePasswordCommand.php @@ -56,7 +56,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $user = $this->userManager->findUserByUsername($username); if (null === $user) { - throw new \InvalidArgumentException(sprintf('User identified by "%s" username does not exist.', $username)); + throw new \InvalidArgumentException(\sprintf('User identified by "%s" username does not exist.', $username)); } $user->setPlainPassword($password); @@ -64,7 +64,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->userManager->updatePassword($user); $this->userManager->save($user); - $output->writeln(sprintf('Changed password for user "%s".', $username)); + $output->writeln(\sprintf('Changed password for user "%s".', $username)); return 0; } diff --git a/src/Command/CreateUserCommand.php b/src/Command/CreateUserCommand.php index 256932661..9d88938d7 100644 --- a/src/Command/CreateUserCommand.php +++ b/src/Command/CreateUserCommand.php @@ -77,7 +77,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->userManager->save($user); - $output->writeln(sprintf('Created user "%s".', $username)); + $output->writeln(\sprintf('Created user "%s".', $username)); return 0; } diff --git a/src/Command/DeactivateUserCommand.php b/src/Command/DeactivateUserCommand.php index 253b63e9b..9a936e743 100644 --- a/src/Command/DeactivateUserCommand.php +++ b/src/Command/DeactivateUserCommand.php @@ -53,14 +53,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int $user = $this->userManager->findUserByUsername($username); if (null === $user) { - throw new \InvalidArgumentException(sprintf('User identified by "%s" username does not exist.', $username)); + throw new \InvalidArgumentException(\sprintf('User identified by "%s" username does not exist.', $username)); } $user->setEnabled(false); $this->userManager->save($user); - $output->writeln(sprintf('User "%s" has been activated.', $username)); + $output->writeln(\sprintf('User "%s" has been activated.', $username)); return 0; } diff --git a/src/Command/DemoteUserCommand.php b/src/Command/DemoteUserCommand.php index 88503d6be..bdd088b5d 100644 --- a/src/Command/DemoteUserCommand.php +++ b/src/Command/DemoteUserCommand.php @@ -67,19 +67,19 @@ protected function execute(InputInterface $input, OutputInterface $output): int $user = $this->userManager->findUserByUsername($username); if (null === $user) { - throw new \InvalidArgumentException(sprintf('User identified by "%s" username does not exist.', $username)); + throw new \InvalidArgumentException(\sprintf('User identified by "%s" username does not exist.', $username)); } if ($superAdmin) { $user->setSuperAdmin(false); - $output->writeln(sprintf('User "%s" has been demoted as a simple user. This change will not apply until the user logs out and back in again.', $username)); + $output->writeln(\sprintf('User "%s" has been demoted as a simple user. This change will not apply until the user logs out and back in again.', $username)); } elseif ($user->hasRole($role)) { $user->removeRole($role); - $output->writeln(sprintf('Role "%s" has been removed from user "%s". This change will not apply until the user logs out and back in again.', $role, $username)); + $output->writeln(\sprintf('Role "%s" has been removed from user "%s". This change will not apply until the user logs out and back in again.', $role, $username)); } else { - $output->writeln(sprintf('User "%s" didn\'t have "%s" role.', $username, $role)); + $output->writeln(\sprintf('User "%s" didn\'t have "%s" role.', $username, $role)); } $this->userManager->save($user); diff --git a/src/Command/PromoteUserCommand.php b/src/Command/PromoteUserCommand.php index 0a16fa246..d262262bc 100644 --- a/src/Command/PromoteUserCommand.php +++ b/src/Command/PromoteUserCommand.php @@ -67,19 +67,19 @@ protected function execute(InputInterface $input, OutputInterface $output): int $user = $this->userManager->findUserByUsername($username); if (null === $user) { - throw new \InvalidArgumentException(sprintf('User identified by "%s" username does not exist.', $username)); + throw new \InvalidArgumentException(\sprintf('User identified by "%s" username does not exist.', $username)); } if ($superAdmin) { $user->setSuperAdmin(true); - $output->writeln(sprintf('User "%s" has been promoted as a super administrator. This change will not apply until the user logs out and back in again.', $username)); + $output->writeln(\sprintf('User "%s" has been promoted as a super administrator. This change will not apply until the user logs out and back in again.', $username)); } elseif (!$user->hasRole($role)) { $user->addRole($role); - $output->writeln(sprintf('Role "%s" has been added to user "%s". This change will not apply until the user logs out and back in again.', $role, $username)); + $output->writeln(\sprintf('Role "%s" has been added to user "%s". This change will not apply until the user logs out and back in again.', $role, $username)); } else { - $output->writeln(sprintf('User "%s" did already have "%s" role.', $username, $role)); + $output->writeln(\sprintf('User "%s" did already have "%s" role.', $username, $role)); } $this->userManager->save($user); diff --git a/src/DependencyInjection/SonataUserExtension.php b/src/DependencyInjection/SonataUserExtension.php index 525ead004..942a86515 100644 --- a/src/DependencyInjection/SonataUserExtension.php +++ b/src/DependencyInjection/SonataUserExtension.php @@ -48,11 +48,11 @@ public function load(array $configs, ContainerBuilder $container): void if (isset($bundles['SonataAdminBundle'])) { $loader->load('admin.php'); - $loader->load(sprintf('admin_%s.php', $config['manager_type'])); + $loader->load(\sprintf('admin_%s.php', $config['manager_type'])); $loader->load('actions.php'); } - $loader->load(sprintf('%s.php', $config['manager_type'])); + $loader->load(\sprintf('%s.php', $config['manager_type'])); $container->setParameter('sonata.user.manager_type', $config['manager_type']); $loader->load('twig.php'); @@ -139,7 +139,7 @@ private function checkManagerTypeToModelTypesMapping(array $config): void $managerType = $config['manager_type']; if (!\in_array($managerType, ['orm', 'mongodb'], true)) { - throw new \InvalidArgumentException(sprintf('Invalid manager type "%s".', $managerType)); + throw new \InvalidArgumentException(\sprintf('Invalid manager type "%s".', $managerType)); } $this->prohibitModelTypeMapping( @@ -162,7 +162,7 @@ private function prohibitModelTypeMapping( ): void { if (is_a($actualModelClass, $prohibitedModelClass, true)) { throw new \InvalidArgumentException( - sprintf( + \sprintf( 'Model class "%s" does not correspond to manager type "%s".', $actualModelClass, $managerType diff --git a/src/Mailer/Mailer.php b/src/Mailer/Mailer.php index 7f6d4c7e1..8268e2947 100644 --- a/src/Mailer/Mailer.php +++ b/src/Mailer/Mailer.php @@ -55,7 +55,7 @@ public function sendResettingEmailMessage(UserInterface $user): void $this->mailer->send( (new Email()) - ->from(sprintf('%s <%s>', $fromName, $fromAddress)) + ->from(\sprintf('%s <%s>', $fromName, $fromAddress)) ->to((string) $user->getEmail()) ->subject($subject) ->html($body) diff --git a/src/Security/RolesBuilder/AdminRolesBuilder.php b/src/Security/RolesBuilder/AdminRolesBuilder.php index f286e79a9..d90a92d91 100644 --- a/src/Security/RolesBuilder/AdminRolesBuilder.php +++ b/src/Security/RolesBuilder/AdminRolesBuilder.php @@ -110,7 +110,7 @@ private function getAdminRolesByAdminCode(string $code, ?string $domain = null, $adminLabelTranslated = $admin->getTranslator()->trans($admin->getLabel() ?? '', [], $admin->getTranslationDomain()); $isMasterAdmin = $this->isMaster($admin); foreach (array_keys($admin->getSecurityInformation()) as $key) { - $role = sprintf($baseRole, $key); + $role = \sprintf($baseRole, $key); $adminRoles[$role] = [ 'role' => $role, 'label' => $key, diff --git a/src/Security/UserProvider.php b/src/Security/UserProvider.php index 1c42e2760..9390c4ed4 100644 --- a/src/Security/UserProvider.php +++ b/src/Security/UserProvider.php @@ -42,7 +42,7 @@ public function loadUserByIdentifier(string $identifier): SecurityUserInterface $user = $this->findUser($identifier); if (null === $user || !$user->isEnabled()) { - throw new UserNotFoundException(sprintf('Username "%s" does not exist.', $identifier)); + throw new UserNotFoundException(\sprintf('Username "%s" does not exist.', $identifier)); } return $user; @@ -51,15 +51,15 @@ public function loadUserByIdentifier(string $identifier): SecurityUserInterface public function refreshUser(SecurityUserInterface $user): SecurityUserInterface { if (!$user instanceof UserInterface) { - throw new UnsupportedUserException(sprintf('Expected an instance of %s, but got "%s".', UserInterface::class, $user::class)); + throw new UnsupportedUserException(\sprintf('Expected an instance of %s, but got "%s".', UserInterface::class, $user::class)); } if (!$this->supportsClass($user::class)) { - throw new UnsupportedUserException(sprintf('Expected an instance of %s, but got "%s".', $this->userManager->getClass(), $user::class)); + throw new UnsupportedUserException(\sprintf('Expected an instance of %s, but got "%s".', $this->userManager->getClass(), $user::class)); } if (null === $reloadedUser = $this->userManager->findOneBy(['id' => $user->getId()])) { - throw new UserNotFoundException(sprintf('User with ID "%s" could not be reloaded.', $user->getId() ?? '')); + throw new UserNotFoundException(\sprintf('User with ID "%s" could not be reloaded.', $user->getId() ?? '')); } return $reloadedUser; diff --git a/tests/Functional/Action/ResetActionTest.php b/tests/Functional/Action/ResetActionTest.php index 2229dcfd3..f3a556d48 100644 --- a/tests/Functional/Action/ResetActionTest.php +++ b/tests/Functional/Action/ResetActionTest.php @@ -39,7 +39,7 @@ public function testItSubmitsResetPasswordFormWithNonValidData(): void static::assertSame($user->getPassword(), 'random_password'); - $client->request('GET', sprintf('/reset/%s', $confirmationToken)); + $client->request('GET', \sprintf('/reset/%s', $confirmationToken)); static::assertResponseIsSuccessful(); @@ -62,7 +62,7 @@ public function testItResetsPassword(): void static::assertSame($user->getPassword(), 'random_password'); - $client->request('GET', sprintf('/reset/%s', $confirmationToken)); + $client->request('GET', \sprintf('/reset/%s', $confirmationToken)); $client->submitForm('submit', [ 'resetting_form[plainPassword][first]' => 'new_password', diff --git a/tests/Mailer/MailerTest.php b/tests/Mailer/MailerTest.php index a8caa5f40..bd26849e9 100644 --- a/tests/Mailer/MailerTest.php +++ b/tests/Mailer/MailerTest.php @@ -94,7 +94,7 @@ public function testSendResettingEmailMessage(string $template, string $subject, $fromAddress = current(array_keys($this->emailFrom)); $email = (new Email()) - ->from(sprintf('%s <%s>', $fromName, $fromAddress)) + ->from(\sprintf('%s <%s>', $fromName, $fromAddress)) ->to((string) $user->getEmail()) ->subject($subject) ->html($body); From f5a0a5a6b48f2b06a25a8dc954ed2815247d573f Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Mon, 26 Aug 2024 14:49:09 +0200 Subject: [PATCH 2/5] Avoid Username/Email is passed as clear GET Parameter to CheckEmailAction on password reset process (#1695) Co-authored-by: BA-JBI <31063297+BA-JBI@users.noreply.github.com> --- src/Action/CheckEmailAction.php | 92 ++++++++++++++++--- src/Action/RequestAction.php | 4 +- .../SonataUserExtension.php | 2 +- src/Resources/config/actions_resetting.php | 1 - tests/Action/CheckEmailActionTest.php | 31 +------ tests/Action/RequestActionTest.php | 2 +- 6 files changed, 84 insertions(+), 48 deletions(-) diff --git a/src/Action/CheckEmailAction.php b/src/Action/CheckEmailAction.php index fae1681ec..af18af914 100644 --- a/src/Action/CheckEmailAction.php +++ b/src/Action/CheckEmailAction.php @@ -15,32 +15,98 @@ use Sonata\AdminBundle\Admin\Pool; use Sonata\AdminBundle\Templating\TemplateRegistryInterface; -use Symfony\Component\HttpFoundation\RedirectResponse; -use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Twig\Environment; final class CheckEmailAction { + private Pool $adminPool; + private TemplateRegistryInterface $templateRegistry; + private int $tokenTtl; + + /** + * NEXT_MAJOR: Remove `$tokenTtlDeprecated` argument and only allow first types of arguments. + */ public function __construct( private Environment $twig, - private UrlGeneratorInterface $urlGenerator, - private Pool $adminPool, - private TemplateRegistryInterface $templateRegistry, - private int $tokenTtl + Pool|UrlGeneratorInterface $adminPool, + TemplateRegistryInterface|Pool $templateRegistry, + int|TemplateRegistryInterface $tokenTtl, + ?int $tokenTtlDeprecated = null, ) { - } + // NEXT_MAJOR: Remove all checks and use constructor property promotion instead + if ($adminPool instanceof UrlGeneratorInterface) { + if (!$templateRegistry instanceof Pool) { + throw new \TypeError(\sprintf( + 'Argument 3 passed to %s() must be an instance of %s, %s given.', + __METHOD__, + Pool::class, + $templateRegistry::class + )); + } + $this->adminPool = $templateRegistry; - public function __invoke(Request $request): Response - { - $username = $request->query->get('username'); + if (!$tokenTtl instanceof TemplateRegistryInterface) { + throw new \TypeError(\sprintf( + 'Argument 4 passed to %s() must be an instance of %s, int given.', + __METHOD__, + TemplateRegistryInterface::class, + )); + } + $this->templateRegistry = $tokenTtl; + + if (!\is_int($tokenTtlDeprecated)) { + throw new \TypeError(\sprintf( + 'Argument 5 passed to %s() must be type of %s, %s given.', + __METHOD__, + 'integer', + \gettype($tokenTtlDeprecated) + )); + } + $this->tokenTtl = $tokenTtlDeprecated; - if (null === $username) { - // the user does not come from the sendEmail action - return new RedirectResponse($this->urlGenerator->generate('sonata_user_admin_resetting_request')); + @trigger_error(\sprintf( + 'Passing an instance of %s as argument 2 to "%s()" is deprecated since sonata-project/user-bundle 5.x and will only accept an instance of %s in version 6.0.', + UrlGeneratorInterface::class, + __METHOD__, + Pool::class + ), \E_USER_DEPRECATED); + } else { + $this->adminPool = $adminPool; + if (!$templateRegistry instanceof TemplateRegistryInterface) { + throw new \TypeError(\sprintf( + 'Argument 3 passed to %s() must be an instance of %s, %s given.', + __METHOD__, + TemplateRegistryInterface::class, + $templateRegistry::class + )); + } + $this->templateRegistry = $templateRegistry; + + if (!\is_int($tokenTtl)) { + throw new \TypeError(\sprintf( + 'Argument 4 passed to %s() must be type of %s, %s given.', + __METHOD__, + 'integer', + \gettype($tokenTtl) + )); + } + $this->tokenTtl = $tokenTtl; + + if (null !== $tokenTtlDeprecated) { + throw new \TypeError(\sprintf( + 'Argument 5 passed to %s() must be %s, %s given.', + __METHOD__, + 'NULL', + \gettype($tokenTtlDeprecated) + )); + } } + } + public function __invoke(): Response + { return new Response($this->twig->render('@SonataUser/Admin/Security/Resetting/checkEmail.html.twig', [ 'base_template' => $this->templateRegistry->getTemplate('layout'), 'admin_pool' => $this->adminPool, diff --git a/src/Action/RequestAction.php b/src/Action/RequestAction.php index 628740098..54aa513d3 100644 --- a/src/Action/RequestAction.php +++ b/src/Action/RequestAction.php @@ -66,9 +66,7 @@ public function __invoke(Request $request): Response $this->userManager->save($user); } - return new RedirectResponse($this->urlGenerator->generate('sonata_user_admin_resetting_check_email', [ - 'username' => $username, - ])); + return new RedirectResponse($this->urlGenerator->generate('sonata_user_admin_resetting_check_email')); } return new Response($this->twig->render('@SonataUser/Admin/Security/Resetting/request.html.twig', [ diff --git a/src/DependencyInjection/SonataUserExtension.php b/src/DependencyInjection/SonataUserExtension.php index 942a86515..b36a15ad5 100644 --- a/src/DependencyInjection/SonataUserExtension.php +++ b/src/DependencyInjection/SonataUserExtension.php @@ -121,7 +121,7 @@ private function configureResetting(array $config, ContainerBuilder $container): ->replaceArgument(9, $config['retry_ttl']); $container->getDefinition('sonata.user.action.check_email') - ->replaceArgument(4, $config['token_ttl']); + ->replaceArgument(3, $config['token_ttl']); $container->getDefinition('sonata.user.action.reset') ->replaceArgument(8, $config['token_ttl']); diff --git a/src/Resources/config/actions_resetting.php b/src/Resources/config/actions_resetting.php index 488ddabac..95250f273 100644 --- a/src/Resources/config/actions_resetting.php +++ b/src/Resources/config/actions_resetting.php @@ -39,7 +39,6 @@ ->public() ->args([ service('twig'), - service('router'), service('sonata.admin.pool'), service('sonata.admin.global_template_registry'), abstract_arg('token ttl'), diff --git a/tests/Action/CheckEmailActionTest.php b/tests/Action/CheckEmailActionTest.php index 12ef4a09e..2c56169c4 100644 --- a/tests/Action/CheckEmailActionTest.php +++ b/tests/Action/CheckEmailActionTest.php @@ -19,9 +19,6 @@ use Sonata\AdminBundle\Templating\TemplateRegistryInterface; use Sonata\UserBundle\Action\CheckEmailAction; use Symfony\Component\DependencyInjection\Container; -use Symfony\Component\HttpFoundation\RedirectResponse; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Twig\Environment; final class CheckEmailActionTest extends TestCase @@ -31,11 +28,6 @@ final class CheckEmailActionTest extends TestCase */ private MockObject $templating; - /** - * @var MockObject&UrlGeneratorInterface - */ - private MockObject $urlGenerator; - private Pool $pool; /** @@ -48,32 +40,13 @@ final class CheckEmailActionTest extends TestCase protected function setUp(): void { $this->templating = $this->createMock(Environment::class); - $this->urlGenerator = $this->createMock(UrlGeneratorInterface::class); $this->pool = new Pool(new Container()); $this->templateRegistry = $this->createMock(TemplateRegistryInterface::class); $this->resetTtl = 60; } - public function testWithoutUsername(): void - { - $request = new Request(); - - $this->urlGenerator->expects(static::once()) - ->method('generate') - ->with('sonata_user_admin_resetting_request') - ->willReturn('/foo'); - - $action = $this->getAction(); - $result = $action($request); - - static::assertInstanceOf(RedirectResponse::class, $result); - static::assertSame('/foo', $result->getTargetUrl()); - } - public function testWithUsername(): void { - $request = new Request(['username' => 'bar']); - $parameters = [ 'base_template' => 'base.html.twig', 'admin_pool' => $this->pool, @@ -91,13 +64,13 @@ public function testWithUsername(): void ->willReturn('base.html.twig'); $action = $this->getAction(); - $result = $action($request); + $result = $action(); static::assertSame('template content', $result->getContent()); } private function getAction(): CheckEmailAction { - return new CheckEmailAction($this->templating, $this->urlGenerator, $this->pool, $this->templateRegistry, $this->resetTtl); + return new CheckEmailAction($this->templating, $this->pool, $this->templateRegistry, $this->resetTtl); } } diff --git a/tests/Action/RequestActionTest.php b/tests/Action/RequestActionTest.php index 17a30b24f..a32049a2e 100644 --- a/tests/Action/RequestActionTest.php +++ b/tests/Action/RequestActionTest.php @@ -238,7 +238,7 @@ public function testEmailSent(): void $this->urlGenerator->method('generate')->with( 'sonata_user_admin_resetting_check_email', - ['username' => 'bar'], + [], )->willReturn('/check-email'); $action = $this->getAction(); From 903de0da577ca8b12c8b106524ffc7b018ddac89 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Mon, 26 Aug 2024 16:05:46 +0200 Subject: [PATCH 3/5] Update deprecation --- src/Action/CheckEmailAction.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Action/CheckEmailAction.php b/src/Action/CheckEmailAction.php index af18af914..57ec65abd 100644 --- a/src/Action/CheckEmailAction.php +++ b/src/Action/CheckEmailAction.php @@ -67,7 +67,7 @@ public function __construct( $this->tokenTtl = $tokenTtlDeprecated; @trigger_error(\sprintf( - 'Passing an instance of %s as argument 2 to "%s()" is deprecated since sonata-project/user-bundle 5.x and will only accept an instance of %s in version 6.0.', + 'Passing an instance of %s as argument 2 to "%s()" is deprecated since sonata-project/user-bundle 5.13 and will only accept an instance of %s in version 6.0.', UrlGeneratorInterface::class, __METHOD__, Pool::class From 3252b50db490252fabb2d59aebf1a5b4655e49a8 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Mon, 26 Aug 2024 16:07:47 +0200 Subject: [PATCH 4/5] 5.13.0 (#1696) --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d702b701f..bffd236c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [5.13.0](https://github.com/sonata-project/SonataUserBundle/compare/5.12.0...5.13.0) - 2024-08-26 +### Changed +- [[#1576](https://github.com/sonata-project/SonataUserBundle/pull/1576)] Make Reset Password Optional ([@Hanmac](https://github.com/Hanmac)) + +### Fixed +- [[#1689](https://github.com/sonata-project/SonataUserBundle/pull/1689)] Symfony 7.1 deprecation about `Symfony\Component\HttpKernel\DependencyInjection\Extension` usage ([@VincentLanglet](https://github.com/VincentLanglet)) + +### Removed +- [[#1695](https://github.com/sonata-project/SonataUserBundle/pull/1695)] After requesting new passwort the username isn't passed to CheckEmailAction anymode ([@VincentLanglet](https://github.com/VincentLanglet)) + ## [5.12.0](https://github.com/sonata-project/SonataUserBundle/compare/5.11.0...5.12.0) - 2024-04-18 ### Added - [[#1677](https://github.com/sonata-project/SonataUserBundle/pull/1677)] BaseUser3 with roles mapped type as `json` to be compatible with ORM 3 ([@RobinDev](https://github.com/RobinDev)) From c56ae3067181481b6e269c07ac4cf5384f70e19d Mon Sep 17 00:00:00 2001 From: SonataCI Date: Mon, 26 Aug 2024 16:12:21 +0000 Subject: [PATCH 5/5] DevKit updates --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 0357635db..0a389559c 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -2,4 +2,4 @@ # # It's auto-generated by sonata-project/dev-kit package. -github: [jordisala1991, OskarStark, VincentLanglet, core23] +github: [jordisala1991, VincentLanglet, OskarStark, core23]