vendor/kobizo/core-bundle/src/Controller/FeResetPasswordController.php line 54

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Kobizo\Bundle\CoreBundle\Controller;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Kobizo\Bundle\CoreBundle\Form\RequestPasswordFormType;
  6. use Kobizo\Bundle\CoreBundle\Form\ResetPasswordFormType;
  7. use Kobizo\Bundle\CoreBundle\Helper\SiteParamsHelper;
  8. use Kobizo\Component\Configuration\MailTemplate\ForgotPasswordMailTemplateConfig;
  9. use Kobizo\Component\Helper\TokenGeneratorInterface;
  10. use Kobizo\Bundle\CoreBundle\Repository\UserRepository;
  11. use Kobizo\Bundle\CoreBundle\Security\LoginFormAuthenticator;
  12. use Kobizo\Component\Provider\MailTemplateProvider;
  13. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  14. use Symfony\Component\HttpFoundation\RedirectResponse;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Mailer\MailerInterface;
  18. use Symfony\Component\Mime\Address;
  19. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  22. use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter;
  23. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. use Kobizo\Component\Resources\AccessControl\DashboardResource;
  26. use Kobizo\Component\Attributes\DefaultRolesAttribute;
  27. use Kobizo\Component\Configuration\Backend\AdminUrlConfig;
  28. /**
  29.  * @Route("/password")
  30.  */
  31. class FeResetPasswordController extends KobizoFeAbstractController
  32. {
  33.     const TTL_RESET_TIME 3600;
  34.     /**
  35.      * @Route("/request", name="app_request_password")
  36.      */
  37.     public function sendEmail(
  38.         Request $request,
  39.         UserRepository $repository,
  40.         MailerInterface $mailer,
  41.         TokenGeneratorInterface $tokenGenerator,
  42.         SiteParamsHelper $siteParamsHelper,
  43.         EntityManagerInterface $entityManager,
  44.         TranslatorInterface $translator,
  45.         MailTemplateProvider $mailTemplateProvider,
  46.         ForgotPasswordMailTemplateConfig $forgotPasswordTemplateConfig,
  47.         AdminUrlConfig $adminUrlConfig
  48.     ): Response {
  49.         if ($this->isGranted(AuthenticatedVoter::IS_AUTHENTICATED_FULLY)) {
  50.             return $this->redirectToRoute('dashboard_analytics', ['admin' => $adminUrlConfig->getValue()]);
  51.         }
  52.         $form $this->createForm(RequestPasswordFormType::class);
  53.         $form->handleRequest($request);
  54.         if ($form->isSubmitted() && $form->isValid()) {
  55.             $email $form->get('email')->getData();
  56.             $user $repository->findOneByEmail($email);
  57.             if (null !== $user && !$user->isPasswordRequestNoneExpired()) {
  58.                 if (null === $user->getConfirmationToken()) {
  59.                     $user->setConfirmationToken($tokenGenerator->generateConfirmationToken($user->getEmail()));
  60.                 }
  61.                 $user->setPasswordRequestedAt(new \DateTime());
  62.                 $entityManager->persist($user);
  63.                 $entityManager->flush();
  64.                 $url $this->container->get('router')->generate(
  65.                     'app_reset_password',
  66.                     [
  67.                         'confirmationToken' => $user->getConfirmationToken(),
  68.                     ],
  69.                     UrlGeneratorInterface::NETWORK_PATH
  70.                 );
  71.                 $options = [
  72.                     'resetPasswordUrl' => $url,
  73.                     'siteName' => $siteParamsHelper->getSiteName(),
  74.                     'siteUrl' => $siteParamsHelper->getSiteUrl(),
  75.                     'address' => $siteParamsHelper->getSiteAddress(),
  76.                     MailTemplateProvider::CODE => $forgotPasswordTemplateConfig->getValue()
  77.                 ];
  78.                 $email = (new TemplatedEmail())
  79.                     ->from(new Address($siteParamsHelper->getNoReplyEmail(), $siteParamsHelper->getSiteName()))
  80.                     ->to($user->getEmail())
  81.                     ->subject($translator->trans('Reset Your Password'))
  82.                     ->html($mailTemplateProvider->get($options));
  83.                 $mailer->send($email);
  84.                 return $this->render('@KobizoCore/frontend/password-sent.twig', [
  85.                     'email' => $user->getEmail(),
  86.                 ]);
  87.             }
  88.         }
  89.         return $this->render('@KobizoCore/frontend/request-password.twig', [
  90.             'requestPasswordForm' => $form->createView(),
  91.         ]);
  92.     }
  93.     /**
  94.      * @Route("/reset/{confirmationToken}", name="app_reset_password")
  95.      */
  96.     public function reset(
  97.         Request $request,
  98.         UserRepository $repository,
  99.         UserAuthenticatorInterface $userAuthenticator,
  100.         LoginFormAuthenticator $authenticator,
  101.         UserPasswordHasherInterface $userPasswordHasher,
  102.         EntityManagerInterface $entityManager,
  103.         AdminUrlConfig $adminUrlConfig,
  104.         string $confirmationToken
  105.     ): Response {
  106.         if ($this->isGranted(AuthenticatedVoter::IS_AUTHENTICATED_FULLY)) {
  107.             return $this->redirectToRoute('dashboard_analytics');
  108.         }
  109.         $form $this->createForm(ResetPasswordFormType::class);
  110.         $form->handleRequest($request);
  111.         if ($form->isSubmitted() && $form->isValid()) {
  112.             $user $repository->findOneByConfirmationToken($form->get('confirmationToken')->getData());
  113.             if (null === $user || !$user->isPasswordRequestNoneExpired(self::TTL_RESET_TIME)) {
  114.                 return new RedirectResponse($this->container->get('router')->generate('app_request_password'));
  115.             }
  116.             $user->setPassword(
  117.                 $userPasswordHasher->hashPassword(
  118.                     $user,
  119.                     $form->get('plainPassword')->getData()
  120.                 )
  121.             );
  122.             $user->setConfirmationToken(null);
  123.             $user->setPasswordRequestedAt(null);
  124.             $entityManager->persist($user);
  125.             $entityManager->flush();
  126.             $userAuthenticator->authenticateUser(
  127.                 $user,
  128.                 $authenticator,
  129.                 $request,
  130.             );
  131.             if ($this->isGranted(DashboardResource::DASHBOARD_CRM) && $user->isAdmin()) {
  132.                 return $this->redirectToRoute('dashboard_analytics', ['admin' => $adminUrlConfig->getValue()]);
  133.             }
  134.             if ($this->isGranted(DefaultRolesAttribute::CLIENT)) {
  135.                 return $this->redirectToRoute('customer_account');
  136.             }
  137.             return $this->redirectToRoute('home');
  138.         }
  139.         return $this->render('@KobizoCore/frontend/reset-password.twig', [
  140.             'resetPasswordForm' => $form->createView(),
  141.             'confirmationToken' => $confirmationToken,
  142.         ]);
  143.     }
  144. }