vendor/umimeweby/uw-login-user-bundle/src/Controller/UserResetPass/ResetPasswordController.php line 94

Open in your IDE?
  1. <?php
  2. namespace Umimeweby\UWLoginUserBundle\Controller\UserResetPass;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  7. use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
  8. use Umimeweby\EmailerBundle\Contract\Service\MailMessages\MessageBuilderInterface;
  9. use Umimeweby\EmailerBundle\Service\Mailer\EMailer;
  10. use Umimeweby\UWHelpersBundle\Helper\FlashTypes;
  11. use Umimeweby\UWLoginUserBundle\Contracts\Repository\BasicORMUserRepositoryInterface;
  12. use Umimeweby\UWLoginUserBundle\Contracts\Service\Security\ResetPasswordViewProviderInterface;
  13. use Umimeweby\UWLoginUserBundle\Contracts\Service\Security\RouteProviderInterface;
  14. use Umimeweby\UWLoginUserBundle\DataHolder\ResetPassDetails;
  15. use Umimeweby\UWLoginUserBundle\Entity\RsToken\RsToken;
  16. use Umimeweby\UWLoginUserBundle\Form\ResetPassType;
  17. use Umimeweby\UWLoginUserBundle\Repository\RsToken\RsTokenRepository;
  18. use Umimeweby\UWLoginUserBundle\Service\Security\ResetPassword\RSTokenCleaner;
  19. use Umimeweby\UWLoginUserBundle\Service\Security\ResetPassword\RSTokenGenerator;
  20. use Umimeweby\UWLoginUserBundle\Service\Security\ResetPassword\RsTokenVerifier;
  21. use Umimeweby\UWLoginUserBundle\Service\Security\RouteProvider\BasicRouteProvider;
  22. class ResetPasswordController extends AbstractController
  23. {
  24.     private $userRepo;
  25.     private $emailer;
  26.     private $newResetPassTokenMsgBuilder;
  27.     private $routeProvider;
  28.     private $rpViewProvider;
  29.     private $rstgen;
  30.     private $rstRepo;
  31.     private $rstCleaner;
  32.     private $rstVerifier;
  33.     private $encoder;
  34.     public function __construct(
  35.         BasicORMUserRepositoryInterface $userRepo,
  36.         MessageBuilderInterface $nrptmBuilder,
  37.         RouteProviderInterface $routeprovider,
  38.         ResetPasswordViewProviderInterface $rpViewProvider,
  39.         EMailer $emailer,
  40.         RSTokenGenerator $rstgen,
  41.         RsTokenRepository $rstRepo,
  42.         RSTokenCleaner $rstCleaner,
  43.         RsTokenVerifier $rstVerifier,
  44.         UserPasswordEncoderInterface $encoder
  45.     ) {
  46.         $this->userRepo $userRepo;
  47.         $this->emailer $emailer;
  48.         $this->newResetPassTokenMsgBuilder $nrptmBuilder;
  49.         $this->routeProvider $routeprovider;
  50.         $this->rpViewProvider $rpViewProvider;
  51.         $this->rstgen $rstgen;
  52.         $this->rstRepo $rstRepo;
  53.         $this->rstCleaner $rstCleaner;
  54.         $this->rstVerifier $rstVerifier;
  55.         $this->encoder $encoder;
  56.     }
  57.     public function stepOneEmail(Request $request)
  58.     {
  59.         /** @var \Symfony\Component\Form\FormInterface */
  60.         $form $this->createFormBuilder()
  61.         ->add('email'EmailType::class, [
  62.             'label' => 'Váš email',
  63.         ])
  64.         ->getForm();
  65.         $form->handleRequest($request);
  66.         if ($form->isSubmitted() and $form->isValid()) {
  67.             $email $form->get('email')->getData();
  68.             if ($this->userRepo->activeEmailExists($email)) {
  69.                 $tokenString $this->rstgen->generateResetPasswordToken($email);
  70.                 $data = [];
  71.                 $data['token'] = $tokenString;
  72.                 $data['emailTo'] = $email;
  73.                 $emailMessage $this->newResetPassTokenMsgBuilder->buildMessage($data);
  74.                 $this->emailer->sendMessage($emailMessage);
  75.                 $this->addFlash(FlashTypes::FL_SUCCESS'Během chvilky by vám měl přijít email s instrukcemi jak postupovat dále');
  76.                 return $this->redirectToRoute($this->routeProvider->getRouteToRedirectAfterRSTokenSend());
  77.             } else {
  78.                 $this->addFlash(FlashTypes::FL_WARNING'Uživatel  s emailem '.$email.' neexistuje nebo není aktivovaný');
  79.             }
  80.         }
  81.         return $this->render($this->rpViewProvider->getResetPasswordFormViewtemplatePath(), [
  82.             'form' => $form->createView(),
  83.         ]);
  84.     }
  85.     public function stepTwoRp($token '')
  86.     {
  87.         if ('' == $token) {
  88.             return $this->redirectToRoute($this->routeProvider->getRouteTokenCheckError());
  89.         }
  90.         $selector substr($token030);
  91.         $this->rstCleaner->removeExpiredTokens(RsToken::RESETPASS_DAYS_TO_EXPIRE);
  92.         /** @var RsToken */
  93.         $rsToken $this->rstRepo->findToken($selector);
  94.         if ($rsToken) {
  95.             $verifier substr($token30);
  96.             if (!$this->rstVerifier->verifyOrDelete($verifier$rsToken)) {
  97.                 $this->addFlash(FlashTypes::FL_ERROR'Token nemohl být ověřen');
  98.                 return $this->redirectToRoute($this->routeProvider->getRouteTokenCheckError());
  99.             }
  100.             $rpData = new ResetPassDetails($rsToken->getEmail());
  101.             $form $this->createForm(ResetPassType::class, $rpData, [
  102.                 'action' => $this->generateUrl(BasicRouteProvider::DEFAULT_RESETPASSWORD_NEWPASSHANDLE_ROUTE),
  103.             ]);
  104.             $this->rstVerifier->removeToken($rsToken);
  105.             return $this->render($this->rpViewProvider->getNewPasswordFormViewtemplatePath(), [
  106.                 'form' => $form->createView(),
  107.             ]);
  108.         }
  109.         $this->addFlash(FlashTypes::FL_ERROR'Token nenalezen - možná již expiroval?');
  110.         return $this->redirectToRoute($this->routeProvider->getRouteTokenCheckError());
  111.     }
  112.     /**
  113.      * Step 3 in reset-password-process, this method handles Posting of Form with new password.
  114.      *
  115.      * @param Request $request
  116.      *
  117.      * @throws UsernameNotFoundException
  118.      *
  119.      * @return \Symfony\Component\HttpFoundation\RedirectResponse
  120.      */
  121.     public function stepThree(Request $request)
  122.     {
  123.         $rpDetails = new ResetPassDetails();
  124.         $form $this->createForm(ResetPassType::class, $rpDetails);
  125.         $form->handleRequest($request);
  126.         if (!($form->isSubmitted() and $form->isValid())) {
  127.             $formErrors $form->getErrors(true);
  128.             if (count($formErrors) > 0) {
  129.                 $message $formErrors[0]->getMessage();
  130.             } else {
  131.                 $message 'Problem s formularem';
  132.             }
  133.             $this->addFlash(FlashTypes::FL_ERROR$message);
  134.             //show again reset pass form to show errors and possibility to provide new password again
  135.             return $this->render($this->rpViewProvider->getNewPasswordFormViewtemplatePath(), [
  136.                 'form' => $form->createView(),
  137.             ]);
  138.         }
  139.         $email $form->get('email')->getData();
  140.         $plainPass $form->get('plainPassword')->getData();
  141.         $em $this->getDoctrine()->getManager();
  142.         $user $this->userRepo->findOneBy(['email' => $email]);
  143.         if (!$user) {
  144.             throw new  UsernameNotFoundException();
  145.         }
  146.         $password $this->encoder->encodePassword($user$plainPass);
  147.         $user->changeEncodedPassword($password);
  148.         $em->flush();
  149.         $this->addFlash(FlashTypes::FL_SUCCESS'Vaše heslo bylo změněno. Můžete se přihlásit');
  150.         return $this->redirectToRoute($this->routeProvider->getLoginFormRoute());
  151.     }
  152. }