<?phpnamespace App\Controller\Vitrine;use App\Entity\Core\Mails;use App\Entity\Pages\Pages;use App\Entity\Pages\PagesHasBlocks;use App\Form\Core\PasswordForgottenForm;use App\Form\Core\UsersPassword;use App\Services\Core\Users;use Doctrine\ORM\EntityManagerInterface;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\EventDispatcher\EventDispatcherInterface;use Symfony\Component\HttpFoundation\Cookie;use Symfony\Component\HttpFoundation\JsonResponse;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Routing\Annotation\Route;use Symfony\Component\Routing\Generator\UrlGeneratorInterface;use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;class PasswordController extends AbstractController{ private $passwordEncoder; private $us; private $ms; private $em; public function __construct(UserPasswordEncoderInterface $passwordEncoder, Users $us, \App\Services\Mails $ms, EntityManagerInterface $em ) { $this->passwordEncoder = $passwordEncoder; $this->ms = $ms; $this->us = $us; $this->em = $em; } /** * Demande d'un nouveau mot de passe - formulaire * @param Request $request * @return Response */ public function passwordForgotten(Request $request): Response { $themeSelection = $_ENV['THEME_BLOG']; $locale = $request->getLocale(); $user = $this->getUser(); if($user != null) { return $this->redirectToRoute('homepage'); } $form = $this->createForm(PasswordForgottenForm::class); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $data = $request->request->all(); $data = $data['password_forgotten_form']; $email = $data['email']; $verificationUser = $this->em->getRepository(\App\Entity\Core\Users::class)->findOneBy(['email' => $email]); if($verificationUser == null) { return $this->redirectToRoute('app_error3_password_forgotten'); } if(empty($verificationUser->getPasswordForgotten())) { $verificationUser->setPasswordForgotten($this->us->randomPasswordSecurised(40)); $this->em->persist($verificationUser); $this->em->flush(); } $lastDate = $verificationUser->getPasswordForgottenLastDate(); if($lastDate == null) { // Envoyer un mail $this->sendPasswordForgottenEmail($verificationUser); // Mise à jour de la date $now = new \DateTime('now'); $verificationUser->setPasswordForgottenLastDate($now); $this->em->persist($verificationUser); $this->em->flush(); return $this->redirectToRoute('app_confirmation_password_forgotten'); } $datetime1 = new \DateTime('now'); $interval = $datetime1->diff($lastDate); $minutes = $interval->days * 24 * 60; $minutes += $interval->h * 60; $minutes += $interval->i; if($minutes > 30) { // Envoyer un mail $this->sendPasswordForgottenEmail($verificationUser); // Mise à jour de la date $now = new \DateTime('now'); $verificationUser->setPasswordForgottenLastDate($now); $this->em->persist($verificationUser); $this->em->flush(); return $this->redirectToRoute('app_confirmation_password_forgotten'); } return $this->redirectToRoute('app_error2_password_forgotten'); } $page = $this->em->getRepository(Pages::class)->findOneBy(['name' => 'password', 'locale' => $locale]); $blocks = $this->em->getRepository(PagesHasBlocks::class)->findBy(['page' => $page, 'type' => 'prod', 'startPage' => false],['sequence' => 'ASC']); $page->setViews((int)$page->getViews() + 1); $this->em->persist($page); $this->em->flush(); return $this->render('vitrine/'.$themeSelection.'/password/forgotten.html.twig',[ 'form' => $form->createView(), 'page' => $page, 'blocks' => $blocks ]); } /** * Message de confirmation * @param Request $request * @return Response */ public function confirmationPasswordForgotten(Request $request): Response { $themeSelection = $_ENV['THEME_BLOG']; $locale = $request->getLocale(); $user = $this->getUser(); if($user != null) { return $this->redirectToRoute('homepage'); } return $this->render('vitrine/'.$themeSelection.'/password/confirmation_forgotten.html.twig'); } /** * Message de confirmation * @param Request $request * @return Response */ public function confirmation2PasswordForgotten(Request $request): Response { $themeSelection = $_ENV['THEME_BLOG']; $locale = $request->getLocale(); $user = $this->getUser(); if($user != null) { return $this->redirectToRoute('homepage'); } return $this->render('vitrine/'.$themeSelection.'/password/confirmation2_forgotten.html.twig'); } /** * Message d'erreur * @param Request $request * @return Response */ public function errorPasswordForgotten(Request $request): Response { $themeSelection = $_ENV['THEME_BLOG']; $locale = $request->getLocale(); $user = $this->getUser(); if($user != null) { return $this->redirectToRoute('homepage'); } return $this->render('vitrine/'.$themeSelection.'/password/error_forgotten.html.twig'); } /** * Message d'erreur 2 * @param Request $request * @return Response */ public function error2PasswordForgotten(Request $request): Response { $themeSelection = $_ENV['THEME_BLOG']; $locale = $request->getLocale(); $user = $this->getUser(); if($user != null) { return $this->redirectToRoute('homepage'); } return $this->render('vitrine/'.$themeSelection.'/password/error2_forgotten.html.twig'); } /** * Message d'erreur 3 * @param Request $request * @return Response */ public function error3PasswordForgotten(Request $request): Response { $themeSelection = $_ENV['THEME_BLOG']; $locale = $request->getLocale(); $user = $this->getUser(); if($user != null) { return $this->redirectToRoute('homepage'); } return $this->render('vitrine/'.$themeSelection.'/password/error3_forgotten.html.twig'); } /** * Message d'erreur 4 * @param Request $request * @return Response */ public function error4PasswordForgotten(Request $request): Response { $themeSelection = $_ENV['THEME_BLOG']; $locale = $request->getLocale(); $user = $this->getUser(); if($user != null) { return $this->redirectToRoute('homepage'); } return $this->render('vitrine/'.$themeSelection.'/password/error4_forgotten.html.twig'); } /** * Génération d'un nouveau mot de passe - depuis un lien mail. * @param Request $request * @param $identifiant * @return Response */ public function passwordForgottenNew(Request $request, $identifiant): Response { $themeSelection = $_ENV['THEME_BLOG']; $locale = $request->getLocale(); $user = $this->getUser(); if($user != null) { return $this->redirectToRoute('homepage'); } $verificationUser = $this->em->getRepository(\App\Entity\Core\Users::class)->findOneBy(['locale' => $locale, 'passwordForgotten' => $identifiant]); if($verificationUser == null) { return $this->redirectToRoute('app_error4_password_forgotten'); } $lastDate = $verificationUser->getPasswordForgottenLastDate(); if($lastDate == null) { return $this->redirectToRoute('app_error4_password_forgotten'); } $datetime1 = new \DateTime('now'); $interval = $datetime1->diff($lastDate); $minutes = $interval->days * 24 * 60; $minutes += $interval->h * 60; $minutes += $interval->i; if($minutes > 120) { return $this->redirectToRoute('app_error4_password_forgotten'); } $form = $this->createForm(UsersPassword::class,$verificationUser); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $data = $request->request->all(); $first = $data['users_password']['password']['first']; $second = $data['users_password']['password']['second']; if($first == $second) { $verificationUser->setPassword($this->passwordEncoder->encodePassword($verificationUser,$first)); $verificationUser->setUpdatedAt(new \DateTime("now")); $verificationUser->setPasswordForgotten(null); $this->em->persist($verificationUser); $this->em->flush(); return $this->redirectToRoute('app_confirmation2_password_forgotten'); } return $this->redirectToRoute('app_error_password_forgotten'); } $page = $this->em->getRepository(Pages::class)->findOneBy(['name' => 'password_new']); $blocks = $this->em->getRepository(PagesHasBlocks::class)->findBy(['page' => $page, 'type' => 'prod', 'startPage' => false],['sequence' => 'ASC']); $page->setViews((int)$page->getViews() + 1); $this->em->persist($page); $this->em->flush(); return $this->render('vitrine/'.$themeSelection.'/password/forgotten_new.html.twig',[ 'form' => $form->createView(), 'page' => $page, 'blocks' => $blocks ]); } /** * Envoyer un mail à l'utilisateur. * @param \App\Entity\Core\Users $entity * @return true|null */ private function sendPasswordForgottenEmail(\App\Entity\Core\Users $entity) { $templateEntity = $this->em->getRepository(Mails::class)->findOneBy(['name' => "password-forgotten"]); if($templateEntity == null) { return null; } $path = (string)$this->generateUrl('app_password_forgotten_new', ['identifiant' => $entity->getPasswordForgotten()], UrlGeneratorInterface::ABSOLUTE_URL); return $this->ms->sendPasswordForgottenEmail($templateEntity,$path,$entity); }}