src/Controller/ResetPasswordController.php line 73

Open in your IDE?
  1. <?php
  2.     namespace App\Controller;
  3.     use App\Entity\User;
  4.     use App\Factory\Platform\MailerFactory;
  5.     use App\Form\Type\ChangePasswordFormType;
  6.     use App\Form\Type\ResetPasswordRequestFormType;
  7.     use App\Services\Common\Email\MailTypes;
  8.     use App\Services\Common\MailerService;
  9.     use App\Services\DTV\YamlConfig\YamlReader;
  10.     use Doctrine\ORM\EntityManagerInterface;
  11.     use Exception;
  12.     use Psr\Log\LoggerInterface;
  13.     use ReflectionException;
  14.     use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15.     use Symfony\Component\HttpFoundation\RedirectResponse;
  16.     use Symfony\Component\HttpFoundation\Request;
  17.     use Symfony\Component\HttpFoundation\Response;
  18.     use Symfony\Component\Routing\Annotation\Route;
  19.     use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  20.     use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
  21.     use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
  22.     use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
  23.     use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  24.     use SymfonyCasts\Bundle\ResetPassword\Controller\ResetPasswordControllerTrait;
  25.     use SymfonyCasts\Bundle\ResetPassword\Exception\ResetPasswordExceptionInterface;
  26.     use SymfonyCasts\Bundle\ResetPassword\ResetPasswordHelperInterface;
  27.     /**
  28.      * Controller pour la gestion de la réinitialisation du mot de passe
  29.      *
  30.      * @Route("/reset-password")
  31.      */
  32.     class ResetPasswordController extends AbstractController
  33.     {
  34.         use ResetPasswordControllerTrait;
  35.         private ResetPasswordHelperInterface $resetPasswordHelper;
  36.         private LoggerInterface              $logger;
  37.         private MailerService                $mailerService;
  38.         private YamlReader                   $yamlReader;
  39.         private EntityManagerInterface       $em;
  40.         /**
  41.          * @param ResetPasswordHelperInterface $resetPasswordHelper
  42.          * @param LoggerInterface $logger
  43.          * @param MailerService $mailerService
  44.          * @param YamlReader $yamlReader
  45.          * @param EntityManagerInterface $em
  46.          */
  47.         public function __construct(ResetPasswordHelperInterface $resetPasswordHelperLoggerInterface $loggerMailerService $mailerServiceYamlReader $yamlReaderEntityManagerInterface $em)
  48.         {
  49.             $this->resetPasswordHelper $resetPasswordHelper;
  50.             $this->logger              $logger;
  51.             $this->mailerService       $mailerService;
  52.             $this->yamlReader          $yamlReader;
  53.             $this->em                  $em;
  54.         }
  55.         /**
  56.          * Affiche et traite le formulaire de demande de réinitialisation du mot de passe.
  57.          *
  58.          * @Route("", name="app_forgot_password_request")
  59.          *
  60.          * @param   Request  $request
  61.          *
  62.          * @return Response
  63.          *
  64.          * @throws Exception
  65.          */
  66.         public function requestRequest $request ): Response
  67.         {
  68.             $form $this->createFormResetPasswordRequestFormType::class );
  69.             $form->handleRequest$request );
  70.             if ( $form->isSubmitted() && $form->isValid() ) {
  71. //                try {
  72.                     return $this->processSendingPasswordResetEmail(
  73.                         $form->get'email' )->getData(),
  74.                     );
  75. //                } catch ( ClientExceptionInterface|RedirectionExceptionInterface|ServerExceptionInterface|TransportExceptionInterface|ReflectionException $e ) {
  76. //                    $this->logger->critical( 'Erreur de lors du reset password : ' . $e->getMessage() );
  77. //                }
  78.             }
  79.             $twigPath 'security/request.html.twig';
  80.             if ( $this->yamlReader->getType() === 'dtv' ) {
  81.                 $twigPath 'security/DeveloppetesventesCom/request.html.twig';
  82.             }
  83.             return $this->render$twigPath, [
  84.                 'requestForm' => $form->createView(),
  85.             ] );
  86.         }
  87.         /**
  88.          * Redirige vers la page de vérification de l'e-mail.
  89.          *
  90.          * @param   string  $emailFormData
  91.          *
  92.          * @return RedirectResponse
  93.          *
  94.          * @throws ReflectionException
  95.          * @throws ClientExceptionInterface
  96.          * @throws RedirectionExceptionInterface
  97.          * @throws ServerExceptionInterface
  98.          * @throws TransportExceptionInterface
  99.          * @throws Exception
  100.          */
  101.         private function processSendingPasswordResetEmailstring $emailFormData ): RedirectResponse
  102.         {
  103.             $user $this->em->getRepositoryUser::class )->findOneBy(
  104.                 [
  105.                     'email' => $emailFormData,
  106.                 ]
  107.             );
  108.             // Do not reveal whether a user account was found or not.
  109.             if ( $user === null ) {
  110.                 return $this->redirectToRoute'app_check_email' );
  111.             }
  112.             $mailer $this->yamlReader->getMailer();
  113.             // Check les CGU
  114.             if( is_null($user->getCguAt())){
  115.                 $this->addFlash(
  116.                     'danger',
  117.                      "Vous n'avez pas accepté les CGU via l'e-mail qui vous a été envoyé. <br>
  118.                      Merci de cliquer sur le lien sécurisé présent dans l'e-mail.<br> 
  119.                      Si vous n'avez pas reçu l'e-mail, merci de prendre contact avec la hotline à l'adresse ".$mailer['contact_email']
  120.                 );
  121.                 return $this->redirectToRoute'app_login' );
  122.             }
  123.             try {
  124.                 $resetToken $this->resetPasswordHelper->generateResetToken$user );
  125.             } catch ( ResetPasswordExceptionInterface $e ) {
  126.                 // If you want to tell the user why a reset email was not sent, uncomment
  127.                 // the lines below and change the redirect to 'app_forgot_password_request'.
  128.                 // Caution: This may reveal if a user is registered or not.
  129.                 $this->addFlash(
  130.                     'reset_password_error',
  131.                     sprintf'Il y a eu un problème lors du traitement de votre demande de réinitialisation du mot de passe - %s'$e->getReason() )
  132.                 );
  133.                 return $this->redirectToRoute'app_check_email' );
  134.             }
  135.             $this->mailerService->createApiMailRequestMailTypes::RESET_PASSWORD )
  136.                                 ->addRecipientToRequest(
  137.                                     $user,
  138.                                     MailerFactory::buildResetPassword$resetToken->getToken() )
  139.                                 )
  140.                                 ->send()
  141.             ;
  142.             // Store the token object in session for retrieval in check-email route.
  143.             $this->setTokenObjectInSession$resetToken );
  144.             return $this->redirectToRoute'app_check_email' );
  145.         }
  146.         /**
  147.          * Page de confirmation après qu'un utilisateur ait demandé une réinitialisation du mot de passe.
  148.          *
  149.          * @Route("/check-email", name="app_check_email")
  150.          */
  151.         public function checkEmail(): Response
  152.         {
  153.             // We prevent users from directly accessing this page
  154. //            if ( NULL === ( $resetToken = $this->getTokenObjectFromSession() ) ) {
  155. //                return $this->redirectToRoute( 'app_forgot_password_request' );
  156. //            }
  157.             $resetToken $this->getTokenObjectFromSession();
  158.             $twigPath 'security/check_email.html.twig';
  159.             if ( $this->yamlReader->getType() === 'dtv' ) {
  160.                 $twigPath 'security/DeveloppetesventesCom/check_email.html.twig';
  161.             }
  162.             return $this->render$twigPath, [
  163.                 'resetToken' => $resetToken,
  164.             ] );
  165.         }
  166.         /**
  167.          * Valide et traite l'URL de réinitialisation que l'utilisateur a cliqué dans son e-mail.
  168.          *
  169.          * @Route("/reset/{token}", name="app_reset_password")
  170.          */
  171.         public function reset(
  172.             Request                      $request,
  173.             UserPasswordEncoderInterface $passwordEncoder,
  174.             string                       $token NULL
  175.         ): Response
  176.         {
  177.             if ( $token ) {
  178.                 // We store the token in session and remove it from the URL, to avoid the URL being
  179.                 // loaded in a browser and potentially leaking the token to 3rd party JavaScript.
  180.                 $this->storeTokenInSession$token );
  181.                 return $this->redirectToRoute'app_reset_password' );
  182.             }
  183.             $token $this->getTokenFromSession();
  184.             if ( NULL === $token ) {
  185.                 throw $this->createNotFoundException'No reset password token found in the URL or in the session.' );
  186.             }
  187.             try {
  188.                 /** @var User $user */
  189.                 $user $this->resetPasswordHelper->validateTokenAndFetchUser$token );
  190.             } catch ( ResetPasswordExceptionInterface $e ) {
  191.                 $this->addFlash(
  192.                     'reset_password_error',
  193.                     sprintf(
  194.                         'There was a problem validating your reset request - %s',
  195.                         $e->getReason()
  196.                     )
  197.                 );
  198.                 return $this->redirectToRoute'app_forgot_password_request' );
  199.             }
  200.             // The token is valid; allow the user to change their password.
  201.             $form $this->createFormChangePasswordFormType::class );
  202.             $form->handleRequest$request );
  203.             if ( $form->isSubmitted() && $form->isValid() ) {
  204.                 // A password reset token should be used only once, remove it.
  205.                 $this->resetPasswordHelper->removeResetRequest$token );
  206.                 // Encode the plain password, and set it.
  207.                 $encodedPassword $passwordEncoder->encodePassword(
  208.                     $user,
  209.                     $form->get'plainPassword' )->getData()
  210.                 );
  211.                 $user->setPassword$encodedPassword );
  212.                 $this->em->flush();
  213.                 // The session is cleaned up after the password has been changed.
  214.                 $this->cleanSessionAfterReset();
  215.                 $this->addFlash('success''Votre nouveau mot de passe a bien été enregistré !');
  216.                 return $this->redirectToRoute'app_login' );
  217.             }
  218.             $twigPath 'security/reset.html.twig';
  219.             if ( $this->yamlReader->getType() === 'dtv' ) {
  220.                 $twigPath 'security/DeveloppetesventesCom/reset.html.twig';
  221.             }
  222.             return $this->render$twigPath, [
  223.                 'resetForm' => $form->createView(),
  224.             ] );
  225.         }
  226.         /**
  227.          * Indique si on doit mettre à jour le mot de passe de l'utilisateur
  228.          *
  229.          * @Route("/{id}", name="app_need_refresh_password")
  230.          *
  231.          *
  232.          * @param   User  $user
  233.          *
  234.          * @return Response
  235.          * @throws ClientExceptionInterface
  236.          * @throws RedirectionExceptionInterface
  237.          * @throws ReflectionException
  238.          * @throws ServerExceptionInterface
  239.          * @throws TransportExceptionInterface
  240.          */
  241.         public function needRefreshPasswordUser $user ): Response
  242.         {
  243.             try {
  244.                 $resetToken $this->resetPasswordHelper->generateResetToken$user );
  245.             } catch ( ResetPasswordExceptionInterface $e ) {
  246.                 return $this->render'security/need_refresh_password.html.twig' );
  247.             }
  248.             $this->mailerService->createApiMailRequestMailTypes::RESET_PASSWORD )
  249.                                 ->addRecipientToRequest(
  250.                                     $user,
  251.                                     MailerFactory::buildResetPassword(
  252.                                         $resetToken->getToken()
  253.                                     )
  254.                                 )
  255.                                 ->send()
  256.             ;
  257.             // Store the token object in session for retrieval in check-email route.
  258.             $this->setTokenObjectInSession$resetToken );
  259.             $twigPath 'security/need_refresh_password.html.twig';
  260.             if ( $this->yamlReader->getType() === 'dtv' ) {
  261.                 $twigPath 'security/DeveloppetesventesCom/need_refresh_password.html.twig';
  262.             }
  263.             return $this->render$twigPath, [
  264.                 'resetToken' => $resetToken,
  265.             ] );
  266.         }
  267.     }