lib/composer/UserBundle/src/VisualMedia/UserBundle/Controller/ResetPasswordController.php line 85

Open in your IDE?
  1. <?php
  2. /**
  3.  * Reset Password Controller
  4.  *
  5.  * @author Gideon Oudhuis <g.oudhuis@visualmedia.nl>
  6.  */
  7. namespace VisualMedia\UserBundle\Controller;
  8. use DateTime;
  9. use Swift_Mailer;
  10. use Swift_Message;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  14. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  15. use VisualMedia\LisaBundle\Helper\Helper;
  16. use VisualMedia\LisaBundle\Component\ManagerData;
  17. use VisualMedia\LisaBundle\Controller\BaseController;
  18. use VisualMedia\LisaBundle\Service\SettingProvider;
  19. use VisualMedia\UserBundle\Entity\BaseUser;
  20. use VisualMedia\UserBundle\Form\Type\ResetPasswordRequestType;
  21. use VisualMedia\UserBundle\Form\Type\ResetPasswordType;
  22. use VisualMedia\UserBundle\Manager\BaseUserManager;
  23. /**
  24.  * Reset Password Controller
  25.  */
  26. class ResetPasswordController extends BaseController
  27. {
  28.     // Route template mapping
  29.     const TEMPLATE_MAPPING = array(
  30.         'manage_reset_password_request' => '@VisualMediaUser/ResetPassword/reset_password_request.html.twig',
  31.         'manage_reset_password' => '@VisualMediaUser/ResetPassword/reset_password.html.twig',
  32.         'frontend_reset_password_request' => '@VisualMediaUser/ResetPassword/frontend_reset_password_request.html.twig',
  33.         'frontend_reset_password' => '@VisualMediaUser/ResetPassword/frontend_reset_password.html.twig'
  34.     );
  35.     /**
  36.      * Reset Password Request Action
  37.      *
  38.      * @param Request $request
  39.      *
  40.      * @return Response
  41.      */
  42.     public function resetPasswordRequestAction(Request $request): Response
  43.     {
  44.         $route $request->get('_route');
  45.         $firewall explode('_'$route)[0] ?? null;
  46.         $translator $this->get('translator');
  47.         $userManager $this->container->get(BaseUserManager::class);
  48.         $form $this->createForm(ResetPasswordRequestType::class);
  49.         $form->handleRequest($request);
  50.         if ($form->isSubmitted() && $form->isValid()) {
  51.             $email $form->get('email')->getData();
  52.             if (null !== $user $userManager->getFirst(new ManagerData(array($userManager::OPTION_EMAIL => $email)))) {
  53.                 $encoderToken openssl_random_pseudo_bytes(64);
  54.                 $token bin2hex($encoderToken);
  55.                 $resetExpired = new DateTime();
  56.                 $resetExpired->modify('+30 minutes');
  57.                 $user->setResetToken($token);
  58.                 $user->setResetExpired($resetExpired);
  59.                 $userManager->persist($user);
  60.                 $userManager->flush();
  61.                 $this->sendResetPasswordMail($request$usersprintf('%s_reset_password'$firewall));
  62.                 return $this->redirectToRoute(sprintf('%s_login'$firewall));
  63.             }
  64.             else {
  65.                 $request->getSession()->getFlashBag()->set('danger'$translator->trans('reset_password.user_not_found', array('%email%' => $email), 'flashmessage'));
  66.             }
  67.         }
  68.         return $this->render(static::TEMPLATE_MAPPING[$route], array(
  69.             'form' => $form->createView(),
  70.         ));
  71.     }
  72.     /**
  73.      * Reset Password Action
  74.      *
  75.      * @param Request $request
  76.      * @param string $token
  77.      *
  78.      * @return Response
  79.      * @throws Exception
  80.      */
  81.     public function resetPasswordAction(Request $request$token): Response
  82.     {
  83.         $route $request->get('_route');
  84.         $firewall explode('_'$route)[0] ?? null;
  85.         $now = new DateTime();
  86.         $translator $this->get('translator');
  87.         $encoder $this->container->get(UserPasswordEncoderInterface::class);
  88.         $userManager $this->container->get('VisualMedia\UserBundle\Manager\BaseUserManager');
  89.         $user $userManager->getFirst(new ManagerData(array(
  90.             $userManager::OPTION_TOKEN => $token,
  91.             $userManager::OPTION_EXPIRED => $now->format('Y-m-d:H-i-s'),
  92.         )));
  93.         if ($user === null) {
  94.             throw new \Exception($translator->trans('reset_password.token_expired', [], 'exception'));
  95.         }
  96.         $form $this->createForm(ResetPasswordType::class);
  97.         $form->handleRequest($request);
  98.         if ($form->isSubmitted() && $form->isValid()) {
  99.             $plainPassword $form->get('plainPassword')->getData();
  100.             $password $encoder->encodePassword($user$plainPassword);
  101.             $user->setPassword($password);
  102.             $userManager->persist($user);
  103.             $userManager->flush();
  104.             $request->getSession()->getFlashBag()->set('success'$translator->trans('reset_password.success', [], 'flashmessage'));
  105.             return $this->redirectToRoute(sprintf('%s_login'$firewall));
  106.         }
  107.         return $this->render(static::TEMPLATE_MAPPING[$route] , array(
  108.             'form' => $form->createView(),
  109.         ));
  110.     }
  111.     /**
  112.      * Send Reset Password Mail
  113.      *
  114.      * @param Request $request
  115.      * @param BaseUser $user
  116.      * @param string $route
  117.      *
  118.      * @return void
  119.      */
  120.     protected function sendResetPasswordMail(Request $requestBaseUser $user$route): void
  121.     {
  122.         $translator $this->get('translator');
  123.         $settingProvider $this->get(SettingProvider::class);
  124.         $mailer $this->container->get('swiftmailer.mailer.default');
  125.         $resetUrl $this->generateUrl($route, array('token' => $user->getResetToken()), UrlGeneratorInterface::ABSOLUTE_URL);
  126.         $mailerSenderName $settingProvider->getValue($reference 'mailer_sender_name'$domain 'system') ?? Helper::settingPlaceholder($reference$domain);
  127.         $mailerSenderEmail $settingProvider->getValue($reference 'mailer_sender_email'$domain 'system') ?? Helper::settingPlaceholder($reference$domain);
  128.         $message = new Swift_Message($translator->trans('reset_password.subject', [], 'email'));
  129.         $message->setFrom($mailerSenderEmail$mailerSenderName);
  130.         $message->setTo($user->getEmail(), $user->getUsername());
  131.         $message->setBody($this->renderView('@VisualMediaUser/Email/reset_password.html.twig', array(
  132.             'user' => $user,
  133.             'resetUrl' => $resetUrl,
  134.             'mailer_sender_name' => $mailerSenderName,
  135.         )), 'text/html');
  136.         $mailer->send($message);
  137.         $request->getSession()->getFlashBag()->set('success'$translator->trans('reset_password.email_send', [], 'flashmessage'));
  138.     }
  139. }