src/Controller/PasswordController.php line 43

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Form\PasswordNewFormType;
  4. use App\Form\PasswordResetEmailFormType;
  5. use App\Form\PasswordResetFormType;
  6. use Carbon\Carbon;
  7. use Pimcore\Model\Document;
  8. use App\Classes\Controller\AbstractFrontController as AbstractFrontController;
  9. use App\Repository\CustomerRepository;
  10. use App\Repository\PasswordRepository;
  11. use App\Service\Contract\RecaptchaValidationServiceInterface;
  12. use Symfony\Component\Form\FormError;
  13. use Symfony\Component\HttpFoundation\RedirectResponse;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  16. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  17. use Symfony\Contracts\Translation\TranslatorInterface;
  18. class PasswordController extends AbstractFrontController
  19. {
  20.     protected $customerRepository;
  21.     protected $passwordRepository;
  22.     protected $recaptchaValidationService;
  23.     private TranslatorInterface $translator;
  24.     public function __construct(
  25.         CustomerRepository $customerRepository,
  26.         PasswordRepository $passwordRepository,
  27.         RecaptchaValidationServiceInterface $recaptchaValidationService,
  28.         TranslatorInterface $translator
  29.     )
  30.     {
  31.         $this->customerRepository $customerRepository;
  32.         $this->passwordRepository $passwordRepository;
  33.         $this->recaptchaValidationService $recaptchaValidationService;
  34.         $this->translator $translator;
  35.     }
  36.     public function passwordResetRequestAction(Request $request)
  37.     {
  38.         $user $this->getUser();
  39.         if ($user) {
  40.             return $this->redirectToRoute('account_show_password', ['division' => $request->get('division')]);
  41.         }
  42.         $form $this->createForm(
  43.             PasswordResetEmailFormType::class
  44.         );
  45.         $form->handleRequest($request);
  46.         $registeredSuccess false;
  47.         if ($form->isSubmitted() && $form->isValid()) {
  48.             $data $form->getData();
  49.             if (!$this->recaptchaValidationService->isValid($data)) {
  50.                 $payload array_merge(
  51.                     $request->query->all(),
  52.                     $request->request->all()
  53.                 );
  54.                 $this->addFlash('_oldFormData'serialize($payload));
  55.                 $this->addFlash('error''stoelting.recaptcha-failed.error');
  56.                 return $this->redirectBack($request);
  57.             }
  58.             $email $form['_email']->getData();
  59.             $customer $this->customerRepository->getUserByEmail($email);
  60.             if (!$customer) {
  61.                 $form->get('_email')->addError(new FormError($this->translator->trans('stoelting.user.not_found')));
  62.             } else {
  63.                 $token $this->passwordRepository->generateToken();
  64.                 $timestamp Carbon::now()->addDay(1)->timestamp;
  65.                 $this->customerRepository->setUserPasswordToken($customer$token);
  66.                 $link $this->generateUrl(
  67.                     'password-reset',
  68.                     [
  69.                         'action' => 'password-reset',
  70.                         'token'  => $token '-token-' $timestamp
  71.                     ],
  72.                     UrlGeneratorInterface::ABSOLUTE_URL
  73.                 );
  74.                 $division $request->get('division');
  75.                 $link str_replace('%division'$division$link);
  76.                 $this->passwordRepository->sendResetPasswordMail(
  77.                     $customer,
  78.                     [
  79.                         'link' => $link
  80.                     ]
  81.                 );
  82.                 $registeredSuccess true;
  83.             }
  84.         }
  85.         $division $request->get('division');
  86.         return $this->render(
  87.             '@App/division/auth/password-reset-request.html.twig',
  88.             [
  89.                 'form' => $form->createView(),
  90.                 'document' => Document::getByPath('/' $division),
  91.                 'success' => $registeredSuccess
  92.             ]
  93.         );
  94.     }
  95.     public function passwordResetAction(Request $request)
  96.     {
  97.         $division $request->get('division');
  98.         $user $this->getUser();
  99.         if ($user) {
  100.             return $this->redirectToRoute('account_show_password', ['division' => $request->get('division')]);
  101.         }
  102.         $form $this->createForm(PasswordResetFormType::class);
  103.         $form->handleRequest($request);
  104.         if ($form->isSubmitted() && $form->isValid()) {
  105.             $translator $this->translator;
  106.             if ($form['_password']->getData() != $form['_passwordConfirmation']->getData()) {
  107.                 $error = new FormError($translator->trans('stoelting.passwords-dont-match'));
  108.                 $form->get('_passwordConfirmation')->addError($error);
  109.             } else {
  110.                 $tokenAndTimestamp $request->get('token');
  111.                 $tokenAndTimestampExploded explode('-token-'$tokenAndTimestamp);
  112.                 $expirationTimestamp end($tokenAndTimestampExploded);
  113.                 $token reset($tokenAndTimestampExploded);
  114.                 $user $this->customerRepository->getUserByPasswordResetToken($token);
  115.                 if ($user && Carbon::now()->timestamp $expirationTimestamp) {
  116.                     $this->customerRepository->setPassword($user$form['_password']->getData());
  117.                     $this->addFlash('success'$translator->trans('stoelting.password-reset.success'));
  118.                     $token = new UsernamePasswordToken($usernull'main'$user->getRoles());
  119.                     $this->container->get('security.token_storage')->setToken($token);
  120.                     $this->container->get('session')->set('_security_main'serialize($token));
  121.                     return new RedirectResponse('/' $division);
  122.                 }
  123.             }
  124.         }
  125.         return $this->render(
  126.             '@App/division/auth/password-reset.html.twig',
  127.             [
  128.                 'form' => $form->createView(),
  129.                 'document' => Document::getByPath('/' $division)
  130.             ]
  131.         );
  132.     }
  133.     public function passwordNewAction(Request $request)
  134.     {
  135.         $division $request->get('division');
  136.         $user $this->getUser();
  137.         if ($user) {
  138.             return $this->redirectToRoute('account_show_password', ['division' => $request->get('division')]);
  139.         }
  140.         $form $this->createForm(PasswordNewFormType::class);
  141.         $form->handleRequest($request);
  142.         if ($form->isSubmitted() && $form->isValid()) {
  143.             $translator $this->translator;
  144.             if ($form['_password']->getData() != $form['_passwordConfirmation']->getData()) {
  145.                 $error = new FormError($translator->trans('stoelting.passwords-dont-match'));
  146.                 $form->get('_passwordConfirmation')->addError($error);
  147.             } else {
  148.                 $tokenAndTimestamp $request->get('token');
  149.                 $tokenAndTimestampExploded explode('-token-'$tokenAndTimestamp);
  150.                 $expirationTimestamp end($tokenAndTimestampExploded);
  151.                 $token reset($tokenAndTimestampExploded);
  152.                 $user $this->customerRepository->getUserByPasswordResetToken($token);
  153.                 if ($user && Carbon::now()->timestamp $expirationTimestamp) {
  154.                     $this->customerRepository->setPassword($user$form['_password']->getData());
  155.                     $this->addFlash('success'$translator->trans('stoelting.password-new.success'));
  156.                     $token = new UsernamePasswordToken($usernull'main'$user->getRoles());
  157.                     $this->container->get('security.token_storage')->setToken($token);
  158.                     $this->container->get('session')->set('_security_main'serialize($token));
  159.                     return new RedirectResponse('/' $division);
  160.                 }
  161.             }
  162.         }
  163.         return $this->render(
  164.             '@App/division/auth/password-new.html.twig',
  165.             [
  166.                 'form' => $form->createView(),
  167.                 'document' => Document::getByPath('/' $division)
  168.             ]
  169.         );
  170.     }
  171. }