src/Controller/Common/ForgottenPasswordController.php line 41

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Common;
  3. use App\Entity\Doctrine\App\User;
  4. use App\Entity\Doctrine\App\ValidationToken;
  5. use App\Exception\UnauthorisedPasswordChangeException;
  6. use App\Exception\UserPersonalInfosNotFoundException;
  7. use App\Form\ForgottenPassword\MailOrPhoneType;
  8. use App\Form\ForgottenPassword\PasswordType;
  9. use App\Manager\ForgottenPasswordManager;
  10. use App\Manager\ValidationTokenManager;
  11. use App\Repository\UserRepositoryInterface;
  12. use Doctrine\DBAL\Exception;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Doctrine\ORM\NonUniqueResultException;
  15. use Doctrine\ORM\ORMException;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\RedirectResponse;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. /**
  22.  * Class ForgottenPasswordController
  23.  * @package App\Controller\Frontend
  24.  * @Route(path="/forgotten-password", name="forgotten_password.")
  25.  */
  26. class ForgottenPasswordController extends AbstractController
  27. {
  28.     /**
  29.      * @Route(path="/send-token", name="send_token")
  30.      * @param Request $request
  31.      * @param ValidationTokenManager $validationTokenManager
  32.      * @param ForgottenPasswordManager $forgottenPasswordManager
  33.      * @return Response
  34.      * @throws NonUniqueResultException
  35.      * @throws Exception
  36.      * @throws ORMException
  37.      */
  38.     public function sendToken(
  39.         Request $request,
  40.         ValidationTokenManager $validationTokenManager,
  41.         ForgottenPasswordManager $forgottenPasswordManager
  42.     ): Response {
  43.         $form $this->createForm(MailOrPhoneType::class);
  44.         $form->handleRequest($request);
  45.         if ($form->isSubmitted() && $form->isValid()) {
  46.             $value $form->get('value')->getData();
  47.             try {
  48.                 $validationToken $forgottenPasswordManager->execute($value);
  49.             } catch (UserPersonalInfosNotFoundException UnauthorisedPasswordChangeException $e) {
  50.                 $this->addFlash('error'$e->getMessage());
  51.                 return $this->redirectToRoute('app.forgotten_password.send_token');
  52.             }
  53.             $validationTokenManager->create($validationToken);
  54.             return $this->redirectToRoute('app.validation.token', [
  55.                 'username' => $validationToken->getUser()->getUsername(),
  56.                 'property' => $validationToken->getProperty()
  57.             ]);
  58.         }
  59.         return $this->render('frontend/forgotten_password/send_token.html.twig', [
  60.             'form' => $form->createView()
  61.         ]);
  62.     }
  63.     /**
  64.      * @Route(path="/reset/{username}/{token}", name="reset")
  65.      * @param string $username
  66.      * @param string $token
  67.      * @param Request $request
  68.      * @param UserRepositoryInterface $userRepository
  69.      * @param EntityManagerInterface $em
  70.      * @return RedirectResponse|Response
  71.      */
  72.     public function reset(
  73.         string $username,
  74.         string $token,
  75.         Request $request,
  76.         UserRepositoryInterface $userRepository,
  77.         EntityManagerInterface $em
  78.     ) {
  79.         $user $em->getRepository(User::class)->findOneBy(['username' => $username]);
  80.         $validationToken $em->getRepository(ValidationToken::class)->findOneBy([
  81.             'user' => $user,
  82.             'property' => ValidationToken::PROPERTY_PASSWORD,
  83.             'token' => $token
  84.         ]);
  85.         if (!$validationToken instanceof ValidationToken) {
  86.             $this->addFlash('error''Le code n\'est pas valide');
  87.             return $this->redirectToRoute('app.validation.token', [
  88.                 'username' => $user->getUsername(),
  89.                 'property' => ValidationToken::PROPERTY_PASSWORD
  90.             ]);
  91.         }
  92.         if ($validationToken->getExpiration() < new \DateTime()) {
  93.             $this->addFlash('error''Le code a expiré veuillez recommencer la procédure depuis le début');
  94.             return $this->redirectToRoute('app.validation.token', [
  95.                 'username' => $username,
  96.                 'property' => ValidationToken::PROPERTY_PASSWORD
  97.             ]);
  98.         }
  99.         $form $this->createForm(PasswordType::class);
  100.         $form->handleRequest($request);
  101.         if ($form->isSubmitted() && $form->isValid()) {
  102.             $newPassword $form->get('newPassword')->getData();
  103.             // Update password
  104.             $user $userRepository->findByUsername($user->getUsername());
  105.             if (!$userRepository->updatePassword($user$newPassword)) {
  106.                 $this->addFlash('error''Votre mot de passe n\'a pas pu être modifié');
  107.             } else {
  108.                 $this->addFlash('success''Votre mot de passe a été modifié avec succès');
  109.             }
  110.             return $this->redirectToRoute('app.login');
  111.         }
  112.         return $this->render('frontend/forgotten_password/reset_password.html.twig', [
  113.             'form' => $form->createView()
  114.         ]);
  115.     }
  116. }