<?php
declare(strict_types=1);
namespace App\Infrastructure\Controller\Security;
use App\Domain\Common\Entity\BaseUser;
use App\Domain\Common\Entity\UserAgent;
use App\Domain\Common\Repository\BaseUserRepository;
use App\Infrastructure\Controller\Common\BaseController;
use App\Infrastructure\Form\Security\AskPasswordType;
use App\Infrastructure\Form\Security\ResetPasswordType;
use App\Infrastructure\Helper\TokenGeneratorHelper;
use App\Infrastructure\Mailer\ResetPasswordMailer;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
final class ResetPasswordController extends BaseController
{
private BaseUserRepository $userRepository;
private UserPasswordHasherInterface $passwordHasher;
private ResetPasswordMailer $resetPasswordMailer;
public function __construct(
BaseUserRepository $userRepository,
UserPasswordHasherInterface $passwordHasher,
ResetPasswordMailer $resetPasswordMailer
) {
$this->userRepository = $userRepository;
$this->passwordHasher = $passwordHasher;
$this->resetPasswordMailer = $resetPasswordMailer;
}
/**
* @Route("/reinitialiser-mot-de-passe", name="app_security_reset_password_action")
*/
public function resetPasswordAction(Request $request): Response
{
$user = $this->getUser();
if ($user) {
return $this->redirectToRoute('app_homepage');
}
$token = $request->query->get('token');
if (null === $token) {
$askPasswordForm = $this->createForm(AskPasswordType::class);
$askPasswordForm->handleRequest($request);
if ($askPasswordForm->isSubmitted() && $askPasswordForm->isValid()) {
$user = $this->userRepository->find($askPasswordForm->get('codeClient')->getData());
if (null !== $user) {
$user->setResetPasswordToken(TokenGeneratorHelper::generateToken());
$this->userRepository->save($user);
if ($resetPasswordToken = $user->getResetPasswordToken()) {
$this->resetPasswordMailer->sendResetPasswordEmail($user, $resetPasswordToken);
}
}
return $this->render('Security/reset_password/validate.html.twig');
}
return $this->render('Security/reset_password/request.html.twig', [
'form' => $askPasswordForm->createView(),
]);
}
$user = $this->userRepository->findOneBy([
'resetPasswordToken' => $token,
]);
if (null === $user) {
return $this->redirectToRoute('app_security_reset_password_action');
}
$resetPasswordForm = $this->createForm(ResetPasswordType::class);
$resetPasswordForm->handleRequest($request);
if ($resetPasswordForm->isSubmitted() && $resetPasswordForm->isValid()) {
/** @var PasswordAuthenticatedUserInterface&BaseUser $user */
$user->setPassword($this->passwordHasher->hashPassword($user, $resetPasswordForm->get('plainPassword')->getData()));
$user->setResetPasswordToken(null);
$this->userRepository->save($user);
$this->addFlash(self::FLASH_SUCCESS, 'Votre mot de passe a été réinitialisé avec succès.');
return $this->redirectToRoute('app_security_login', [
'username' => $user->getCodeClient(),
]);
}
return $this->render('Security/reset_password/action.html.twig', [
'form' => $resetPasswordForm->createView(),
'mainTitleLabel' => $user instanceof UserAgent ? 'Créez votre mot de passe' : 'Mot de passe oublié ?',
]);
}
}