src/Controller/Vitrine/PasswordController.php line 119

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Vitrine;
  3. use App\Entity\Core\Mails;
  4. use App\Entity\Pages\Pages;
  5. use App\Entity\Pages\PagesHasBlocks;
  6. use App\Form\Core\PasswordForgottenForm;
  7. use App\Form\Core\UsersPassword;
  8. use App\Services\Core\Users;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  11. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  12. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  15. use Symfony\Component\HttpFoundation\Cookie;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  21. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  22. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  23. class PasswordController extends AbstractController
  24. {
  25.     private $passwordEncoder;
  26.     private $us;
  27.     private $ms;
  28.     private $em;
  29.     public function __construct(UserPasswordEncoderInterface $passwordEncoder,
  30.                                 Users                        $us,
  31.                                 \App\Services\Mails          $ms,
  32.                                 EntityManagerInterface       $em
  33.     ) {
  34.         $this->passwordEncoder $passwordEncoder;
  35.         $this->ms $ms;
  36.         $this->us $us;
  37.         $this->em $em;
  38.     }
  39.     /**
  40.      * Demande d'un nouveau mot de passe - formulaire
  41.      * @param Request $request
  42.      * @return Response
  43.      */
  44.     public function passwordForgotten(Request $request): Response
  45.     {
  46.         $themeSelection $_ENV['THEME_BLOG'];
  47.         $locale $request->getLocale();
  48.         $user $this->getUser();
  49.         if($user != null) {
  50.             return $this->redirectToRoute('homepage');
  51.         }
  52.         $form $this->createForm(PasswordForgottenForm::class);
  53.         $form->handleRequest($request);
  54.         if ($form->isSubmitted() && $form->isValid()) {
  55.             $data $request->request->all();
  56.             $data $data['password_forgotten_form'];
  57.             $email $data['email'];
  58.             $verificationUser $this->em->getRepository(\App\Entity\Core\Users::class)->findOneBy(['email' => $email]);
  59.             if($verificationUser == null) {
  60.                 return $this->redirectToRoute('app_error3_password_forgotten');
  61.             }
  62.             if(empty($verificationUser->getPasswordForgotten())) {
  63.                 $verificationUser->setPasswordForgotten($this->us->randomPasswordSecurised(40));
  64.                 $this->em->persist($verificationUser);
  65.                 $this->em->flush();
  66.             }
  67.             $lastDate $verificationUser->getPasswordForgottenLastDate();
  68.             if($lastDate == null) {
  69.                 // Envoyer un mail
  70.                 $this->sendPasswordForgottenEmail($verificationUser);
  71.                 // Mise à jour de la date
  72.                 $now = new \DateTime('now');
  73.                 $verificationUser->setPasswordForgottenLastDate($now);
  74.                 $this->em->persist($verificationUser);
  75.                 $this->em->flush();
  76.                 return $this->redirectToRoute('app_confirmation_password_forgotten');
  77.             }
  78.             $datetime1 = new \DateTime('now');
  79.             $interval $datetime1->diff($lastDate);
  80.             $minutes $interval->days 24 60;
  81.             $minutes += $interval->60;
  82.             $minutes += $interval->i;
  83.             if($minutes 30) {
  84.                 // Envoyer un mail
  85.                 $this->sendPasswordForgottenEmail($verificationUser);
  86.                 // Mise à jour de la date
  87.                 $now = new \DateTime('now');
  88.                 $verificationUser->setPasswordForgottenLastDate($now);
  89.                 $this->em->persist($verificationUser);
  90.                 $this->em->flush();
  91.                 return $this->redirectToRoute('app_confirmation_password_forgotten');
  92.             }
  93.             return $this->redirectToRoute('app_error2_password_forgotten');
  94.         }
  95.         $page $this->em->getRepository(Pages::class)->findOneBy(['name' => 'password''locale' => $locale]);
  96.         $blocks $this->em->getRepository(PagesHasBlocks::class)->findBy(['page' => $page'type' => 'prod''startPage' => false],['sequence' => 'ASC']);
  97.         $page->setViews((int)$page->getViews() + 1);
  98.         $this->em->persist($page);
  99.         $this->em->flush();
  100.         return $this->render('vitrine/'.$themeSelection.'/password/forgotten.html.twig',[
  101.             'form' => $form->createView(),
  102.             'page' => $page,
  103.             'blocks' => $blocks
  104.         ]);
  105.     }
  106.     /**
  107.      * Message de confirmation
  108.      * @param Request $request
  109.      * @return Response
  110.      */
  111.     public function confirmationPasswordForgotten(Request $request): Response
  112.     {
  113.         $themeSelection $_ENV['THEME_BLOG'];
  114.         $locale $request->getLocale();
  115.         $user $this->getUser();
  116.         if($user != null) {
  117.             return $this->redirectToRoute('homepage');
  118.         }
  119.         return $this->render('vitrine/'.$themeSelection.'/password/confirmation_forgotten.html.twig');
  120.     }
  121.     /**
  122.      * Message de confirmation
  123.      * @param Request $request
  124.      * @return Response
  125.      */
  126.     public function confirmation2PasswordForgotten(Request $request): Response
  127.     {
  128.         $themeSelection $_ENV['THEME_BLOG'];
  129.         $locale $request->getLocale();
  130.         $user $this->getUser();
  131.         if($user != null) {
  132.             return $this->redirectToRoute('homepage');
  133.         }
  134.         return $this->render('vitrine/'.$themeSelection.'/password/confirmation2_forgotten.html.twig');
  135.     }
  136.     /**
  137.      * Message d'erreur
  138.      * @param Request $request
  139.      * @return Response
  140.      */
  141.     public function errorPasswordForgotten(Request $request): Response
  142.     {
  143.         $themeSelection $_ENV['THEME_BLOG'];
  144.         $locale $request->getLocale();
  145.         $user $this->getUser();
  146.         if($user != null) {
  147.             return $this->redirectToRoute('homepage');
  148.         }
  149.         return $this->render('vitrine/'.$themeSelection.'/password/error_forgotten.html.twig');
  150.     }
  151.     /**
  152.      * Message d'erreur 2
  153.      * @param Request $request
  154.      * @return Response
  155.      */
  156.     public function error2PasswordForgotten(Request $request): Response
  157.     {
  158.         $themeSelection $_ENV['THEME_BLOG'];
  159.         $locale $request->getLocale();
  160.         $user $this->getUser();
  161.         if($user != null) {
  162.             return $this->redirectToRoute('homepage');
  163.         }
  164.         return $this->render('vitrine/'.$themeSelection.'/password/error2_forgotten.html.twig');
  165.     }
  166.     /**
  167.      * Message d'erreur 3
  168.      * @param Request $request
  169.      * @return Response
  170.      */
  171.     public function error3PasswordForgotten(Request $request): Response
  172.     {
  173.         $themeSelection $_ENV['THEME_BLOG'];
  174.         $locale $request->getLocale();
  175.         $user $this->getUser();
  176.         if($user != null) {
  177.             return $this->redirectToRoute('homepage');
  178.         }
  179.         return $this->render('vitrine/'.$themeSelection.'/password/error3_forgotten.html.twig');
  180.     }
  181.     /**
  182.      * Message d'erreur 4
  183.      * @param Request $request
  184.      * @return Response
  185.      */
  186.     public function error4PasswordForgotten(Request $request): Response
  187.     {
  188.         $themeSelection $_ENV['THEME_BLOG'];
  189.         $locale $request->getLocale();
  190.         $user $this->getUser();
  191.         if($user != null) {
  192.             return $this->redirectToRoute('homepage');
  193.         }
  194.         return $this->render('vitrine/'.$themeSelection.'/password/error4_forgotten.html.twig');
  195.     }
  196.     /**
  197.      * Génération d'un nouveau mot de passe - depuis un lien mail.
  198.      * @param Request $request
  199.      * @param $identifiant
  200.      * @return Response
  201.      */
  202.     public function passwordForgottenNew(Request $request$identifiant): Response
  203.     {
  204.         $themeSelection $_ENV['THEME_BLOG'];
  205.         $locale $request->getLocale();
  206.         $user $this->getUser();
  207.         if($user != null) {
  208.             return $this->redirectToRoute('homepage');
  209.         }
  210.         $verificationUser $this->em->getRepository(\App\Entity\Core\Users::class)->findOneBy(['locale' => $locale'passwordForgotten' => $identifiant]);
  211.         if($verificationUser == null) {
  212.             return $this->redirectToRoute('app_error4_password_forgotten');
  213.         }
  214.         $lastDate $verificationUser->getPasswordForgottenLastDate();
  215.         if($lastDate == null) {
  216.             return $this->redirectToRoute('app_error4_password_forgotten');
  217.         }
  218.         $datetime1 = new \DateTime('now');
  219.         $interval $datetime1->diff($lastDate);
  220.         $minutes $interval->days 24 60;
  221.         $minutes += $interval->60;
  222.         $minutes += $interval->i;
  223.         if($minutes 120) {
  224.             return $this->redirectToRoute('app_error4_password_forgotten');
  225.         }
  226.         $form $this->createForm(UsersPassword::class,$verificationUser);
  227.         $form->handleRequest($request);
  228.         if ($form->isSubmitted() && $form->isValid()) {
  229.             $data $request->request->all();
  230.             $first $data['users_password']['password']['first'];
  231.             $second $data['users_password']['password']['second'];
  232.             if($first == $second) {
  233.                 $verificationUser->setPassword($this->passwordEncoder->encodePassword($verificationUser,$first));
  234.                 $verificationUser->setUpdatedAt(new \DateTime("now"));
  235.                 $verificationUser->setPasswordForgotten(null);
  236.                 $this->em->persist($verificationUser);
  237.                 $this->em->flush();
  238.                 return $this->redirectToRoute('app_confirmation2_password_forgotten');
  239.             }
  240.             return $this->redirectToRoute('app_error_password_forgotten');
  241.         }
  242.         $page $this->em->getRepository(Pages::class)->findOneBy(['name' => 'password_new']);
  243.         $blocks $this->em->getRepository(PagesHasBlocks::class)->findBy(['page' => $page'type' => 'prod''startPage' => false],['sequence' => 'ASC']);
  244.         $page->setViews((int)$page->getViews() + 1);
  245.         $this->em->persist($page);
  246.         $this->em->flush();
  247.         return $this->render('vitrine/'.$themeSelection.'/password/forgotten_new.html.twig',[
  248.             'form' => $form->createView(),
  249.             'page' => $page,
  250.             'blocks' => $blocks
  251.         ]);
  252.     }
  253.     /**
  254.      * Envoyer un mail à l'utilisateur.
  255.      * @param \App\Entity\Core\Users $entity
  256.      * @return true|null
  257.      */
  258.     private function sendPasswordForgottenEmail(\App\Entity\Core\Users $entity)
  259.     {
  260.         $templateEntity $this->em->getRepository(Mails::class)->findOneBy(['name' => "password-forgotten"]);
  261.         if($templateEntity == null) {
  262.             return null;
  263.         }
  264.         $path = (string)$this->generateUrl('app_password_forgotten_new', ['identifiant' => $entity->getPasswordForgotten()], UrlGeneratorInterface::ABSOLUTE_URL);
  265.         return $this->ms->sendPasswordForgottenEmail($templateEntity,$path,$entity);
  266.     }
  267. }