src/Controller/Frontend/FmResettingController.php line 110

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the FOSUserBundle package.
  4.  *
  5.  * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace App\Controller\Frontend;
  11. use App\Entity\Gos\LeadFormResponse;
  12. use App\Entity\Gos\NewsletterTemplate;
  13. use App\Entity\Gos\PasswordFromImport;
  14. use App\Entity\Gos\PortalSettings;
  15. use App\Entity\Gos\User;
  16. use App\Utils\Email\SendMail;
  17. use App\Utils\Encryption;
  18. use App\Utils\SalesManago\SalesManagoEvent;
  19. use App\Utils\SalesManago\v2\Action\Contact\Upsert\Events\SalesManagoUpsertEventsV2;
  20. use App\Utils\SalesManago\v2\Action\SalesManagoEventDispatcher;
  21. use App\Utils\UserServices;
  22. use Doctrine\ORM\EntityManagerInterface;
  23. use FOS\UserBundle\CompatibilityUtil;
  24. use FOS\UserBundle\Event\FormEvent;
  25. use FOS\UserBundle\Event\GetResponseNullableUserEvent;
  26. use FOS\UserBundle\Event\GetResponseUserEvent;
  27. use FOS\UserBundle\Form\Factory\FactoryInterface;
  28. use FOS\UserBundle\Form\Type\ResettingFormType;
  29. use FOS\UserBundle\FOSUserEvents;
  30. use FOS\UserBundle\Mailer\MailerInterface;
  31. use FOS\UserBundle\Model\UserManagerInterface;
  32. use FOS\UserBundle\Util\TokenGeneratorInterface;
  33. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  34. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  35. use Symfony\Component\HttpFoundation\JsonResponse;
  36. use Symfony\Component\HttpFoundation\RedirectResponse;
  37. use Symfony\Component\HttpFoundation\Request;
  38. use Symfony\Component\HttpFoundation\RequestStack;
  39. use Symfony\Component\HttpFoundation\Response;
  40. use FOS\UserBundle\Controller\ResettingController as FOSBaseController;
  41. use Symfony\Component\Routing\RouterInterface;
  42. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  43. use Symfony\Contracts\Translation\TranslatorInterface;
  44. use Twig\Environment;
  45. use Twig\TemplateWrapper;
  46. class FmResettingController extends FOSBaseController
  47. {
  48.     private EventDispatcherInterface $eventDispatcher;
  49.     private FactoryInterface $formFactory;
  50.     private UserManagerInterface $userManager;
  51.     private TokenGeneratorInterface $tokenGenerator;
  52.     private MailerInterface $mailer;
  53.     private $retryTtl;
  54.     private ?Request $request;
  55.     private TranslatorInterface $translator;
  56.     private EntityManagerInterface $em;
  57.     private SalesManagoEvent $salesManagoEvent;
  58.     private UserServices $userServices;
  59.     private SendMail $sendMail;
  60.     private Environment $twig;
  61.     private Encryption $encryption;
  62.     private SalesManagoEventDispatcher $salesManagoEventDispatcher;
  63.     public function __construct(
  64.         EventDispatcherInterface $eventDispatcher,
  65.         FactoryInterface $formFactory,
  66.         UserManagerInterface $userManager,
  67.         TokenGeneratorInterface $tokenGenerator,
  68.         MailerInterface $mailer,
  69.         $retryTtl,
  70.         RequestStack $requestStack,
  71.         TranslatorInterface $translator,
  72.         EntityManagerInterface $em,
  73.         SalesManagoEvent $salesManagoEvent,
  74.         UserServices $userServices,
  75.         SendMail $sendMail,
  76.         Environment $twig,
  77.         Encryption $encryption,
  78.         SalesManagoEventDispatcher $salesManagoEventDispatcher
  79.     ) {
  80.         $this->eventDispatcher CompatibilityUtil::upgradeEventDispatcher($eventDispatcher);
  81.         $this->formFactory $formFactory;
  82.         $this->userManager $userManager;
  83.         $this->tokenGenerator $tokenGenerator;
  84.         $this->mailer $mailer;
  85.         $this->retryTtl $retryTtl;
  86.         $this->request $requestStack->getCurrentRequest();
  87.         $this->translator $translator;
  88.         $this->em $em;
  89.         $this->salesManagoEvent $salesManagoEvent;
  90.         $this->userServices $userServices;
  91.         $this->sendMail $sendMail;
  92.         $this->twig $twig;
  93.         $this->encryption $encryption;
  94.         $this->salesManagoEventDispatcher $salesManagoEventDispatcher;
  95.         parent::__construct($eventDispatcher$formFactory$userManager$tokenGenerator$mailer$retryTtl);
  96.     }
  97.     /**
  98.      * Request reset user password: show form.
  99.      */
  100.     public function requestAction(): Response
  101.     {
  102.         if ($this->request->attributes->get('_route') == 'eforum_reset')
  103.         {
  104.             return $this->render(sprintf('frontend-eforum/security/request.html.twig'));
  105.         }
  106.         if ($this->request->attributes->get('_route') == 'uniqskills_reset')
  107.         {
  108.             return $this->render(sprintf('uniqskills/security/request.html.twig'));
  109.         }
  110.         return $this->render('@FOSUser/Resetting/request.html.twig');
  111.     }
  112.     public function sendEmailAction(Request $request): Response
  113.     {
  114.         $username $request->request->get('username');
  115.         $user $this->userManager->findUserByUsernameOrEmail($username);
  116.         $event = new GetResponseNullableUserEvent($user$request);
  117.         $this->eventDispatcher->dispatch($event,FOSUserEvents::RESETTING_SEND_EMAIL_INITIALIZE);
  118.         if (null !== $event->getResponse()) {
  119.             return $event->getResponse();
  120.         }
  121.         if (null !== $user && !$user->isPasswordRequestNonExpired(30)) {
  122.             $event = new GetResponseUserEvent($user$request);
  123.             $this->eventDispatcher->dispatch($eventFOSUserEvents::RESETTING_RESET_REQUEST);
  124.             if (null !== $event->getResponse())
  125.             {
  126.                 if ($request->request->get('from_app'))
  127.                 {
  128.                     return $this->json([
  129.                         'status' => false,
  130.                         'message' => 'Email z kodem umożliwiającym zresetowanie hasła został już wysłany'
  131.                     ]);
  132.                 }
  133.                 elseif ($request->request->get('json_reset'))
  134.                 {
  135.                     return $this->json(['success' => true]);
  136.                 }
  137.                 return $event->getResponse();
  138.             }
  139.             if ($request->request->get('from_app'))
  140.             {
  141.                 $user->setResettingCode(self::generateActivationCodeForApp());
  142.             }
  143.             elseif (null === $user->getConfirmationToken())
  144.             {
  145.                 $user->setConfirmationToken($this->tokenGenerator->generateToken());
  146.             }
  147.             $event = new GetResponseUserEvent($user$request);
  148.             $this->eventDispatcher->dispatch($eventFOSUserEvents::RESETTING_SEND_EMAIL_CONFIRM);
  149.             if (null !== $event->getResponse()) {
  150.                 return $event->getResponse();
  151.             }
  152.             $this->mailer->sendResettingEmailMessage($user);
  153.             $user->setPasswordRequestedAt(new \DateTime());
  154.             $this->userManager->updateUser($user);
  155.             $event = new GetResponseUserEvent($user$request);
  156.             $this->eventDispatcher->dispatch($eventFOSUserEvents::RESETTING_SEND_EMAIL_COMPLETED);
  157.             if (null !== $event->getResponse()) {
  158.                 return $event->getResponse();
  159.             }
  160.         }
  161.         if ($request->request->get('from_app'))
  162.         {
  163.             return $this->json([
  164.                 'status' => true,
  165.                 'message' => 'Wiadomość z kodem umożliwiającym zresetowanie hasła wysłana na podany adres email'
  166.             ]);
  167.         }
  168.         if ($request->request->get('json_reset'))
  169.         {
  170.             return $this->json(['success' => true]);
  171.         }
  172.         if ($request->get('_route') == 'eforum_reset_sendmail')
  173.         {
  174.             return $this->redirectToRoute('eforum_reset_check', ['username' => $username]);
  175.         }
  176.         if ($request->get('_route') == 'uniqskills_reset_sendmail')
  177.         {
  178.             return $this->redirectToRoute('uniqskills_reset_check', ['username' => $username]);
  179.         }
  180.         if ($request->get('_route') === 'order_ajax_form_reset_sendmail')
  181.         {
  182.             return $this->json(['success' => true]);
  183.         }
  184.         return $this->redirectToRoute('fos_user_resetting_check_email', ['username' => $username]);
  185.     }
  186.     /**
  187.      * Tell the user to check his email provider.
  188.      *
  189.      * @param Request $request
  190.      *
  191.      * @return Response
  192.      */
  193.     public function checkEmailAction(Request $request): Response
  194.     {
  195.         $origin     $request->getSession()->get('origin''default');
  196.         $username   $request->query->get('username');
  197.         $locale     $request->getSession()->get('userLocale'$request->getLocale());
  198.         if (empty($username))
  199.         {
  200.             // the user does not come from the sendEmail action
  201.             if ($origin == 'eforum')
  202.             {
  203.                 return $this->redirectToRoute('eforum_reset');
  204.             }
  205.             elseif ($origin == 'uniqskills')
  206.             {
  207.                 return $this->redirectToRoute('uniqskills_reset', ['_locale' => $locale]);
  208.             }
  209.             else
  210.             {
  211.                 return $this->redirectToRoute('fos_user_resetting_request');
  212.             }
  213.         }
  214.         if ($origin == 'eforum')
  215.         {
  216.             $this->addFlash('success''resetting.reset.check_email');
  217.             return $this->redirectToRoute('eforum_reset');
  218.         }
  219.         elseif ($origin == 'uniqskills')
  220.         {
  221.             $message $this->translator->trans(
  222.                 'uniqskills.resetting.request.emailSent',
  223.                 [],
  224.                 'messages',
  225.                 $locale
  226.             );
  227.             $this->addFlash('success'$message);
  228.             return $this->redirectToRoute('uniqskills_reset', ['_locale' => $locale]);
  229.         }
  230.         else
  231.         {
  232.             return $this->render('@FOSUser/Resetting/check_email.html.twig', [
  233.                 'tokenLifetime' => 0
  234.             ]);
  235.         }
  236.     }
  237.     /**
  238.      * Reset user password.
  239.      *
  240.      * @param Request $request
  241.      * @param string  $token
  242.      *
  243.      * @return Response
  244.      */
  245.     public function resetAction(Request $request$token): Response
  246.     {
  247.         $origin         $request->attributes->get('_route');
  248.         $customMessage  '';
  249.         $hash           $request->getSession()->get('portalSettingsHash');
  250.         $portalSettings $this->em->getRepository(PortalSettings::class)->findOneByHash($hash);
  251.         $isAjax         $request->request->get('isAjax');
  252.         $user $this->userManager->findUserByConfirmationToken($token);
  253.         if (null === $user)
  254.         {
  255.             $this->addFlash(
  256.                 'danger',
  257.                 $this->translator->trans(
  258.                     'errors.account.linkExpired',
  259.                     [],
  260.                     'messages',
  261.                     $request->getSession()->get('userLocale''pl'))
  262.             );
  263.             if ($origin == 'eforum_reset_password')
  264.             {
  265.                 return $this->redirectToRoute('eforum_reset');
  266.             }
  267.             elseif ($origin == 'uniqskills_reset_password')
  268.             {
  269.                 return $this->redirectToRoute('uniqskills_reset');
  270.             }
  271.             return $this->redirectToRoute('fos_user_resetting_request');
  272.         }
  273.         $event = new GetResponseUserEvent($user$request);
  274.         $this->eventDispatcher->dispatch($eventFOSUserEvents::RESETTING_RESET_INITIALIZE);
  275.         if (!$user->isEnabled())
  276.         {
  277.             $request->getSession()->set('firstActivation'1);
  278.             $request->getSession()->set('registerBool'true);
  279.             $user->setEnabled(true);
  280.             $user->setActivationDate(new \DateTime());
  281.             $this->addFlash('success',
  282.                 $this->translator->trans(
  283.                     'messages.account.accountActivated',
  284.                     [],
  285.                     'messages',
  286.                     $request->getSession()->get('userLocale''pl')
  287.                 )
  288.             );
  289.             $gosUser $this->em->getRepository(User::class)->find($user->getId());
  290.             $this->userServices->activateVouchersForUser($gosUser);
  291.             $gosUser->setAllowedAdvertising(true);
  292.             $this->em->persist($gosUser);
  293.             $this->salesManagoEvent->sendAllowedAdvertising($gosUser);
  294.             $this->salesManagoEventDispatcher->dispatchContactUpsert($gosUserSalesManagoUpsertEventsV2::ON_ACTIVATION);
  295.             $this->userServices->sendUserLeadToDB($gosUser$portalSettings$user->getReginfo(), __METHOD__);
  296.             $this->em->flush();
  297.         }
  298.         if ($request->query->has('pdfArticleUrl')) {
  299.             return $this->render('frontend/article_pdf/after_register_content.html.twig', [
  300.                 'pdfUrl' => $this->pdfResponseUrl($request->query->get('pdfArticleUrl'))
  301.             ]);
  302.         }
  303.         if (null !== $event->getResponse())
  304.         {
  305.             return $event->getResponse();
  306.         }
  307.         $form $this->createForm(ResettingFormType::class, $user);
  308.         $form->handleRequest($request);
  309.         if ($form->isSubmitted() && $form->isValid())
  310.         {
  311.             // user change password in gos - deactivate passwordFromImport
  312.             $register false;
  313.             $passwordsFromImport $this->em->getRepository(PasswordFromImport::class)
  314.                 ->findActivePasswordByUserEmail($user->getEmail());
  315.             foreach ($passwordsFromImport as $passwordFromImport)
  316.             {
  317.                 $passwordFromImport->setIsActive(false);
  318.                 $this->em->persist($passwordFromImport);
  319.             }
  320.             $firstActivation 0;
  321.             $otpNetflix false;
  322.             if ($request->getSession()->has('firstActivation'))
  323.             {
  324.                 $firstActivation 1;
  325.             }
  326.             if ($request->getSession()->has('registerBool'))
  327.             {
  328.                 $register true;
  329.             }
  330.             if ($request->getSession()->has('otpNetflix'))
  331.             {
  332.                 $otpNetflix true;
  333.             }
  334.             $this->em->flush();
  335.             $event = new FormEvent($form$request);
  336.             $this->eventDispatcher->dispatch($eventFOSUserEvents::RESETTING_RESET_SUCCESS);
  337.             $this->userManager->updateUser($user);
  338.             $request->getSession()->remove('otpRoute');
  339.             if ($otpNetflix)
  340.             {
  341.                 return $this->redirectToRoute('fmOneTimePasswordRegisterConfirmation');
  342.             }
  343.             if ($origin == 'eforum_reset_password')
  344.             {
  345.                 $this->addFlash('success',
  346.                     $this->translator->trans(
  347.                         'messages.account.passwordChanged',
  348.                         [],
  349.                         'messages',
  350.                         $request->getSession()->get('userLocale''pl')
  351.                     )
  352.                 );
  353.                 if ($register)
  354.                 {
  355.                     return $this->redirectToRoute('eforum_login', [
  356.                         'gaEvent' => 'accountCreate',
  357.                         'fa' => $firstActivation
  358.                     ]);
  359.                 }
  360.                 return $this->redirectToRoute('eforum_login');
  361.             }
  362.             elseif ($origin == 'uniqskills_reset_password')
  363.             {
  364.                 $this->addFlash('success''messages.account.passwordChanged');
  365.                 if ($register)
  366.                 {
  367.                     return $this->redirectToRoute('uniqskills_login', [
  368.                         'gaEvent' => 'accountCreate',
  369.                         'fa' => $firstActivation
  370.                     ]);
  371.                 }
  372.                 return $this->redirectToRoute('uniqskills_login');
  373.             }
  374.             if ($request->query->get('gos'))
  375.             {
  376.                 return $this->redirectToRoute('backend_login');
  377.             }
  378.             if ($register)
  379.             {
  380.                 return $this->redirectToRoute('fos_user_security_login', [
  381.                     'gaEvent' => 'accountCreate',
  382.                     'fa' => $firstActivation
  383.                 ]);
  384.             }
  385.             if ($user->getCart() && count($user->getCart()->getProductCart()) > 0)
  386.             {
  387.                 $event->setResponse($this->redirectToRoute('fmOrderUserBase'));
  388.             }
  389.             if (null === $response $event->getResponse())
  390.             {
  391.                 $response = new RedirectResponse($this->redirectToRoute('fos_user_profile_show'));
  392.             }
  393.             return $response;
  394.         }
  395.         if ($origin == 'eforum_reset_password')
  396.         {
  397.             $template '/frontend-eforum/security/reset.html.twig';
  398.         }
  399.         elseif ($origin == 'uniqskills_reset_password')
  400.         {
  401.             $template '/uniqskills/security/reset.html.twig';
  402.         }
  403.         elseif ($request->getSession()->get('otpRoute') !== null || $request->query->get('otpRoute') !== null)
  404.         {
  405.             if ($request->getSession()->get('otpRoute') === null)
  406.             {
  407.                 $request->getSession()->set('otpRoute'$request->query->get('otpRoute'));
  408.             }
  409.             $otpRoute        $request->getSession()->get('otpRoute');
  410.             $leadIndex       strpos($otpRoute'leadTemplate');
  411.             $newsletterIndex strpos($otpRoute'newsletterTemplate');
  412.             if ($leadIndex !== false)
  413.             {
  414.                 $id intval(substr($otpRoute$leadIndex strlen('leadTemplate')));
  415.                 $leadTemplate $this->em->getRepository(LeadFormResponse::class)->find($id);
  416.                 if ($leadTemplate instanceof LeadFormResponse)
  417.                 {
  418.                     $customMessage $leadTemplate->getNewAccountBodyResponse();
  419.                     if ($leadTemplate->isEnglish()) {
  420.                         $translator->setLocale('en');
  421.                     }
  422.                 }
  423.                 $template 'frontend/one_time_password/new_password.html.twig';
  424.             }
  425.             elseif ($newsletterIndex !== false)
  426.             {
  427.                 $id intval(substr($otpRoute$newsletterIndex strlen('newsletterTemplate')));
  428.                 $newsletterTemplate $this->em->getRepository(NewsletterTemplate::class)->find($id);
  429.                 if ($newsletterTemplate instanceof NewsletterTemplate)
  430.                 {
  431.                     $customMessage $newsletterTemplate->getMessageConfirmedNewUser();
  432.                     if($newsletterTemplate->getIsFileNewsletter() && $newsletterTemplate->getGratisFilename())
  433.                     {
  434.                         $gratisLink $_ENV['GOS_URL_HTTPS'].$this->generateUrl('fmNewsletterGratis',
  435.                                 ['gratisFilename' => $newsletterTemplate->getGratisFilename()]);
  436.                         $customMessage str_replace('GRATIS_URL'$gratisLink$customMessage);
  437.                     }
  438.                 }
  439.                 $template 'frontend/one_time_password/new_password.html.twig';
  440.             }
  441.             else
  442.             {
  443.                 $template '@FOSUser/Resetting/reset.html.twig';
  444.             }
  445.         }
  446.         else
  447.         {
  448.             $template '@FOSUser/Resetting/reset.html.twig';
  449.         }
  450.         if ($isAjax)
  451.         {
  452.             /** @var TemplateWrapper $template */
  453.             $template $this->twig->load($template);
  454.             $content $template->renderBlock('content', [
  455.                 'token'         => $token,
  456.                 'form'          => $form->createView(),
  457.                 'active'        => $user->isEnabled(),
  458.                 'isGOS'         => $request->query->get('gos') ? 0,
  459.                 'customMessage' => $customMessage,
  460.                 'portalSettings'=> $portalSettings,
  461.             ]);
  462.             if ($template->hasBlock('customjs'))
  463.             {
  464.                 $content .= $template->renderBlock('customjs');
  465.             }
  466.             $response = new Response();
  467.             $response->setContent($content);
  468.             return $response;
  469.         }
  470.         return $this->render($template, array(
  471.             'token'         => $token,
  472.             'form'          => $form->createView(),
  473.             'active'        => $user->isEnabled(),
  474.             'isGOS'         => $request->query->get('gos') ? 0,
  475.             'customMessage' => $customMessage,
  476.             'portalSettings'=> $portalSettings,
  477.         ));
  478.     }
  479.     /**
  480.      * @param string $url
  481.      * @return string
  482.      */
  483.     private function pdfResponseUrl(string $url): string
  484.     {
  485.         $url parse_url($url);
  486.         $path $url['path'] . '/pdf';
  487.         $scheme str_replace('http''https'$url['scheme']);
  488.         $host $url['host'];
  489.         $query = isset($url['query']) ? '?' $url['query'] : '';
  490.         return $scheme '://' $host $path $query;
  491.     }
  492.     /**
  493.      * @Route("/reset-activation-code", name="fmUserResetActivationCode")
  494.      */
  495.     public function sendAgainConfirmationCodeAction(Request $request): JsonResponse
  496.     {
  497.         $data           $request->query->get('data');
  498.         $token          $request->query->get('publicToken');
  499.         $userToken      $this->encryption->decrypt($data$token);
  500.         $locale         $request->getSession()->get('userLocale''pl');
  501.         $portalSetting  $this->em->getRepository(PortalSettings::class)
  502.                             ->findOneByHash('44e1391ae50ee1dbb0ba3f6349b837');
  503.         /** @var User $user */
  504.         $user $this->em->getRepository(User::class)->findOneBy(['token' => $userToken]);
  505.         if ($user)
  506.         {
  507.             if (!$user->isEnabled())
  508.             {
  509.                 $user->setActivationCode(self::generateActivationCodeForApp());
  510.                 $this->em->flush();
  511.                 $status $this->sendMail->sendMail(
  512.                     'account_reset_activation_code',
  513.                     $user->getEmail(),
  514.                     ['user'  => $user],
  515.                     $portalSetting->getHash(),
  516.                     false,
  517.                     $locale
  518.                 );
  519.                 if ($status)
  520.                 {
  521.                     return $this->json([
  522.                         'status' => true,
  523.                         'message' => 'Email z nowym kodem aktywacyjnym został wysłany'
  524.                     ]);
  525.                 }
  526.                 else
  527.                 {
  528.                     return $this->json([
  529.                         'status' => false,
  530.                         'message' => 'Nie udało się wysłać maila'
  531.                     ]);
  532.                 }
  533.             }
  534.             else
  535.             {
  536.                 return $this->json([
  537.                     'status' => false,
  538.                     'enabled' => false,
  539.                     'message' => 'Użytkownik był już aktywny'
  540.                 ]);
  541.             }
  542.         }
  543.         return $this->json([
  544.             'status' => false,
  545.             'message' => 'Nie udało się wysłać maila'
  546.         ]);
  547.     }
  548.     private static function generateActivationCodeForApp($digits 6): string
  549.     {
  550.         return str_pad(rand(0pow(10$digits)-1), $digits'0'STR_PAD_LEFT);
  551.     }
  552. }