diff --git a/sources/AppBundle/Association/UserMembership/UserService.php b/sources/AppBundle/Association/UserMembership/UserService.php index 85c260350..3d3da4a14 100644 --- a/sources/AppBundle/Association/UserMembership/UserService.php +++ b/sources/AppBundle/Association/UserMembership/UserService.php @@ -15,6 +15,7 @@ use AppBundle\MembershipFee\Entity\Cotisation; use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; +use Symfony\Component\Security\Core\Exception\UserNotFoundException; class UserService { @@ -64,10 +65,15 @@ public function resetPassword(User $user): void */ public function resetPasswordForEmail($email): void { - $user = $this->userRepository->loadUserByEmailOrAlternateEmail($email); - if (null !== $user) { - $this->resetPassword($user); + try { + $user = $this->userRepository->loadUserByEmailOrAlternateEmail($email); + } catch (UserNotFoundException) { + // Email inconnu : on s'arrête sans le signaler, pour ne pas révéler quels + // emails correspondent à un compte. + return; } + + $this->resetPassword($user); } public function sendWelcomeEmail(User $user): bool diff --git a/sources/AppBundle/Controller/Auth/LostPasswordAction.php b/sources/AppBundle/Controller/Auth/LostPasswordAction.php index 6be9aa21c..c21db22f3 100644 --- a/sources/AppBundle/Controller/Auth/LostPasswordAction.php +++ b/sources/AppBundle/Controller/Auth/LostPasswordAction.php @@ -34,9 +34,6 @@ public function __invoke(Request $request): Response return $this->view->render('site/auth/lost_password.html.twig', [ 'form' => $form->createView(), - 'title' => 'Mot de passe perdu', - 'page' => 'motdepasse_perdu', - 'class' => 'panel-page', ]); } } diff --git a/templates/site/auth/lost_password.html.twig b/templates/site/auth/lost_password.html.twig index 1a36578ff..0e34c2490 100644 --- a/templates/site/auth/lost_password.html.twig +++ b/templates/site/auth/lost_password.html.twig @@ -1,36 +1,39 @@ -{% extends 'admin/association/membership/_base.html.twig' %} - -{% block page_title %}{% endblock %} - -{% block page_container_extra_classes %}remove-min-height-from-container-id{% endblock %} - -{% block page_content %} - -
- {{ form_start(form) }} -
- Mot de passe perdu -
-
-

- Indiquez votre email ici. Si un compte correspond à cet email, vous recevrez un nouveau mot de passe. -

-
-
- {{ form_label(form.email) }} - {{ form_widget(form.email) }} -
-
- {{ form_widget(form.submit, {attr: {"class": "button button--call-to-action"}}) }} -
-
-

- Retour au formulaire de connexion -

-
+{% extends 'layouts/site.html.twig' %} +{% form_theme form 'form_themes/tailwind.html.twig' %} + +{% block title %}Mot de passe perdu - AFUP{% endblock %} + +{% block content %} + +
+

Mot de passe perdu

+

+ Indiquez votre email ici. Si un compte correspond à cet email, vous recevrez un nouveau mot de passe. +

+ + {{ form_start(form, {attr: {class: 'w-full sm:w-200'}}) }} + + + + {# Le contrôleur pose un flash 'notice' : c'est le seul retour visible de la demande, + et layouts/site.html.twig n'affiche pas les flashs. #} + {% for message in app.flashes('notice') %} + {{ message }} + {% endfor %} + + {{ form_errors(form) }} + {{ form_row(form.email, {label: 'Email', attr: {autofocus: true}}) }} + +
+

+ Retour à la connexion +

+ {{ form_widget(form.submit) }}
-
+ + {{ form_end(form) }}
+ {% endblock %} diff --git a/tests/behat/features/PublicSite/PasswordReset.feature b/tests/behat/features/PublicSite/PasswordReset.feature index d278fb3aa..e51178878 100644 --- a/tests/behat/features/PublicSite/PasswordReset.feature +++ b/tests/behat/features/PublicSite/PasswordReset.feature @@ -6,3 +6,8 @@ Scenario: L'utilisateur reçoit une URL de connexion complète dans l'e-mail de When I request a password reset for "edmond.dupont@mycorp.fr" Then I should receive an email And the email should contain a full URL starting with "https://apachephptest:80/login" + +# Prévention contre l'énumération des comptes +Scenario: Un message générique est affiché si on soumet un email inconnu + When I request a password reset for "unkown.email@example.com" + Then I should see "Votre demande a été prise en compte. Si un compte correspond à cet email vous recevez un nouveau mot de passe rapidement."