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
12 changes: 9 additions & 3 deletions sources/AppBundle/Association/UserMembership/UserService.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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
Expand Down
3 changes: 0 additions & 3 deletions sources/AppBundle/Controller/Auth/LostPasswordAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -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',
]);
}
}
65 changes: 34 additions & 31 deletions templates/site/auth/lost_password.html.twig
Original file line number Diff line number Diff line change
@@ -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 %}

<div class="afup-form afup-form--miniform">
{{ form_start(form) }}
<fieldset>
<legend>Mot de passe perdu</legend>
<div class="afup-form-container">
<div>
<p>
Indiquez votre email ici. Si un compte correspond à cet email, vous recevrez un nouveau mot de passe.
</p>
</div>
<div>
{{ form_label(form.email) }}
{{ form_widget(form.email) }}
</div>
<div>
{{ form_widget(form.submit, {attr: {"class": "button button--call-to-action"}}) }}
</div>
<div>
<p>
<a href="{{ url('app_login') }}">Retour au formulaire de connexion</a>
</p>
</div>
{% extends 'layouts/site.html.twig' %}
{% form_theme form 'form_themes/tailwind.html.twig' %}

{% block title %}Mot de passe perdu - AFUP{% endblock %}

{% block content %}

<div class="container mx-auto flex flex-col items-center px-4 my-5 gap-4">
<h1 class="font-titre text-5xl text-afup-800 text-center">Mot de passe perdu</h1>
<p class="text-neutre-700 text-center max-w-2xl">
Indiquez votre email ici. Si un compte correspond à cet email, vous recevrez un nouveau mot de passe.
</p>

{{ form_start(form, {attr: {class: 'w-full sm:w-200'}}) }}

<twig:Card class="flex flex-col gap-8 px-6 py-12 sm:px-28 sm:py-12 my-5 sm:mb-10 w-full">

{# 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') %}
<twig:Alert type="success" class="w-full">{{ message }}</twig:Alert>
{% endfor %}

{{ form_errors(form) }}
{{ form_row(form.email, {label: 'Email', attr: {autofocus: true}}) }}

<div class="flex flex-col-reverse sm:flex-row items-center justify-between gap-4 border-t-2 border-neutre-300 pt-5">
<p class="text-sm text-neutre-700 whitespace-nowrap">
<a href="{{ path('app_login') }}" class="text-afup-500 underline hover:no-underline">Retour à la connexion</a>
</p>
{{ form_widget(form.submit) }}
</div>

</fieldset>
</twig:Card>

{{ form_end(form) }}
</div>

{% endblock %}
5 changes: 5 additions & 0 deletions tests/behat/features/PublicSite/PasswordReset.feature
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Loading