src/Controller/ResetPasswordController.php line 53
<?phpdeclare(strict_types=1);namespace App\Controller;use App\Entity\Admin;use App\Form\ChangePasswordFormType;use App\Form\ResetPasswordRequestFormType;use App\Service\CodeService;use App\Service\MailService;use App\Service\SmsService;use Doctrine\ORM\EntityManagerInterface;use Doctrine\Persistence\ManagerRegistry;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\RedirectResponse;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Mailer\Exception\TransportExceptionInterface;use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;use Symfony\Component\Routing\Annotation\Route;use Symfony\Contracts\Translation\TranslatorInterface;use SymfonyCasts\Bundle\ResetPassword\Controller\ResetPasswordControllerTrait;use SymfonyCasts\Bundle\ResetPassword\Exception\ResetPasswordExceptionInterface;use SymfonyCasts\Bundle\ResetPassword\ResetPasswordHelperInterface;#[Route('/reset-password')]class ResetPasswordController extends AbstractController{use ResetPasswordControllerTrait;private ResetPasswordHelperInterface $resetPasswordHelper;private SmsService $smsService;private CodeService $codeService;private UserPasswordHasherInterface $userPasswordHasher;private EntityManagerInterface $em;public function __construct(private readonly ManagerRegistry $doctrine, EntityManagerInterface $em, ResetPasswordHelperInterface $resetPasswordHelper, SmsService $smsService, CodeService $codeService, UserPasswordHasherInterface $userPasswordHasher){$this->resetPasswordHelper = $resetPasswordHelper;$this->em = $em;$this->smsService = $smsService;$this->codeService = $codeService;$this->userPasswordHasher = $userPasswordHasher;}/*** Display & process form to request a password reset.* @throws TransportExceptionInterface*/#[Route('/', name: 'app_forgot_password_request', methods: ['GET', 'POST'])]public function request(Request $request, MailService $mailer): Response{$form = $this->createForm(ResetPasswordRequestFormType::class);$form->handleRequest($request);if ($form->isSubmitted() && $form->isValid()) {return $this->processSendingPasswordResetEmail($form->get('email')->getData(), $form->get('username')->getData(),$mailer);}return $this->render('reset_password/request.html.twig', ['requestForm' => $form->createView(),]);}/*** Confirmation page after a user has requested a password reset.*/#[Route('/check-email', name: 'app_check_email', methods: ['GET'])]public function checkEmail(): Response{// We prevent users from directly accessing this pageif (null === ($resetToken = $this->getTokenObjectFromSession())) {return $this->redirectToRoute('app_forgot_password_request');}return $this->render('reset_password/check_email.html.twig', ['resetToken' => $resetToken,]);}/*** Validates and process the reset URL that the user clicked in their email.*/#[Route('/reset/{token}', name: 'app_reset_password', methods: ['GET', 'POST'])]public function reset(Request $request, UserPasswordHasherInterface $passwordHasher, string $token = null): Response{if ($token) {// We store the token in session and remove it from the URL, to avoid the URL being// loaded in a browser and potentially leaking the token to 3rd party JavaScript.$this->storeTokenInSession($token);return $this->redirectToRoute('app_reset_password');}$token = $this->getTokenFromSession();if (null === $token) {throw $this->createNotFoundException('No reset password token found in the URL or in the session.');}try {$user = $this->resetPasswordHelper->validateTokenAndFetchUser($token);} catch (ResetPasswordExceptionInterface $e) {$this->addFlash('reset_password_error', sprintf('There was a problem validating your reset request - %s',$e->getReason()));return $this->redirectToRoute('app_forgot_password_request');}$this->em->initializeObject($user); // forces hydration// The token is valid; allow the user to change their password.$form = $this->createForm(ChangePasswordFormType::class);$form->handleRequest($request);if ($form->isSubmitted() && $form->isValid()) {// A password reset token should be used only once, remove it.$this->resetPasswordHelper->removeResetRequest($token);// Encode the plain password, and set it.$encodedPassword = $passwordHasher->hashPassword($user,$form->get('plainPassword')->getData());$user->setPassword($encodedPassword);$this->doctrine->getManager()->flush();// The session is cleaned up after the password has been changed.$this->cleanSessionAfterReset();return $this->redirectToRoute('app_dashboard');}return $this->render('reset_password/reset.html.twig', ['resetForm' => $form->createView(),]);}/*** @throws TransportExceptionInterface*/private function processSendingPasswordResetEmail(string $emailFormData, string $usernameFormData, MailService $mailService): RedirectResponse{$user = $this->em->getRepository(Admin::class)->findOneBy(['email' => $emailFormData, 'username' => $usernameFormData]);$this->em->initializeObject($user); // forces hydration// Do not reveal whether a user account was found or not.if (!$user) {return $this->redirectToRoute('app_check_email');}try {$resetToken = $this->resetPasswordHelper->generateResetToken($user);} catch (ResetPasswordExceptionInterface $e) {// If you want to tell the user why a reset email was not sent, uncomment// the lines below and change the redirect to 'app_forgot_password_request'.// Caution: This may reveal if a user is registered or not.//$this->addFlash('reset_password_error', sprintf('There was a problem handling your password reset request - %s',$e->getReason()));return $this->redirectToRoute('app_check_email');}try {//New password$p = strtoupper($this->codeService->PasswordCode(5));$user->setPassword($this->userPasswordHasher->hashPassword($user, $p));$message = 'Votre mot de passe '. $user->getName().' est: '.$p;$this->smsService->smsService($user->getPhone(), $message);$em = $this->doctrine->getManager();$em->flush();$mailService->sendTemplatedMail($user->getEmail(),'Votre demande de réinitialisation de mot de passe du compte administrateur','reset_password/email.html.twig',['resetToken' => $resetToken]);}catch (ResetPasswordExceptionInterface $e) {$this->addFlash('reset_password_error', sprintf('There was a problem handling your password reset request - %s',$e->getReason()));return $this->redirectToRoute('app_check_email');}// Store the token object in session for retrieval in check-email route.$this->setTokenObjectInSession($resetToken);return $this->redirectToRoute('app_check_email');}}