src/Controller/ResetController.php line 44

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use DateTime;
  4. use Sonata\UserBundle\Form\Type\ResetPasswordRequestFormType;
  5. use Sonata\UserBundle\Form\Type\ResettingFormType;
  6. use Sonata\UserBundle\Mailer\MailerInterface;
  7. use Sonata\UserBundle\Model\UserManagerInterface;
  8. use Sonata\UserBundle\Util\TokenGeneratorInterface;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\RedirectResponse;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Contracts\Translation\TranslatorInterface;
  16. class ResetController extends AbstractController
  17. {
  18.     private UserManagerInterface $userManager;
  19.     private MailerInterface $mailer;
  20.     private int $retryTtl;
  21.     private int $tokenTtl;
  22.     public function __construct(
  23.         UserManagerInterface $userManager,
  24.         MailerInterface $mailer,
  25.         int $retryTtl,
  26.         int $tokenTtl
  27.     ) {
  28.         $this->userManager $userManager;
  29.         $this->mailer $mailer;
  30.         $this->retryTtl $retryTtl;
  31.         $this->tokenTtl $tokenTtl;
  32.     }
  33.     /**
  34.      * @Route("/resetting/request", name="frontend_user_resetting_request")
  35.      */
  36.     public function request(Request $requestTokenGeneratorInterface $tokenGenerator): Response
  37.     {
  38.         if ($this->isGranted('IS_AUTHENTICATED_FULLY')) {
  39.             return new RedirectResponse($this->generateUrl('index'));
  40.         }
  41.         $form $this->createForm(ResetPasswordRequestFormType::class);
  42.         $form->handleRequest($request);
  43.         if ($form->isSubmitted() && $form->isValid()) {
  44.             $username $form->get('username')->getData();
  45.             $user $this->userManager->findUserByUsernameOrEmail($username);
  46.             if (null !== $user && $user->isEnabled() && !$user->isPasswordRequestNonExpired($this->retryTtl) && $user->isAccountNonLocked()) {
  47.                 if (null === $user->getConfirmationToken()) {
  48.                     $user->setConfirmationToken($tokenGenerator->generateToken());
  49.                 }
  50.                 $this->mailer->sendResettingEmailMessage($user);
  51.                 $user->setPasswordRequestedAt(new DateTime());
  52.                 $this->userManager->save($user);
  53.             }
  54.             return new RedirectResponse($this->generateUrl('frontend_user_resetting_check_email', [
  55.                 'username' => $username,
  56.             ]));
  57.         }
  58.         return $this->render('security/resetting/request.html.twig', [
  59.             'form' => $form->createView(),
  60.         ]);
  61.     }
  62.     /**
  63.      * @Route("/resetting/check_email", name="frontend_user_resetting_check_email")
  64.      *
  65.      */
  66.     public function checkEmail(Request $request): Response
  67.     {
  68.         $username $request->query->get('username');
  69.         if (null === $username) {
  70.             // the user does not come from the sendEmail action
  71.             return new RedirectResponse($this->generateUrl('frontend_user_resetting_request'));
  72.         }
  73.         return $this->render('security/resetting/checkEmail.html.twig', [
  74.             'tokenLifetime' => ceil($this->tokenTtl 3600),
  75.             'error' => null
  76.         ]);
  77.     }
  78.     /**
  79.      * @Route("/resetting/reset/{token}", name="frontend_user_resetting_reset")
  80.      */
  81.     public function reset(Request $requeststring $tokenTranslatorInterface $translator): Response
  82.     {
  83.         if ($this->isGranted('IS_AUTHENTICATED_FULLY')) {
  84.             return new RedirectResponse($this->generateUrl('index'));
  85.         }
  86.         $user $this->userManager->findUserByConfirmationToken($token);
  87.         if (null === $user) {
  88.             throw new NotFoundHttpException(sprintf('The user with "confirmation token" does not exist for value "%s"'$token));
  89.         }
  90.         if (!$user->isPasswordRequestNonExpired($this->tokenTtl)) {
  91.             return new RedirectResponse($this->generateUrl('frontend_user_resetting_request'));
  92.         }
  93.         $form $this->createForm(ResettingFormType::class, $user);
  94.         $form->handleRequest($request);
  95.         if ($form->isSubmitted() && $form->isValid()) {
  96.             $user->setConfirmationToken(null);
  97.             $user->setPasswordRequestedAt(null);
  98.             $user->setEnabled(true);
  99.             $this->addFlash('success',
  100.                 $translator->trans('resetting.flash.success', [], 'SonataUserBundle')
  101.             );
  102.             $response = new RedirectResponse($this->generateUrl('index'));
  103.             // Doctrine Event isn't running?
  104.             $this->userManager->updatePassword($user);
  105.             $this->userManager->save($user);
  106.             return $response;
  107.         }
  108.         return $this->render('security/resetting/reset.html.twig', [
  109.             'token' => $token,
  110.             'form' => $form->createView(),
  111.             'error' => null
  112.         ]);
  113.     }
  114. }