src/Controller/ResettingController.php line 36

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Datetime;
  4. //use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use App\Entity\User;
  10. use App\Services\Mailer;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  13. use Symfony\Component\Validator\Constraints\Email;
  14. use Symfony\Component\Validator\Constraints\NotBlank;
  15. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  16. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  17. use App\Form\ResettingType;
  18. use App\Security\TokenAuthenticator;
  19. use Symfony\Component\Dotenv\Dotenv;
  20. use Symfony\Component\HttpClient\HttpClient;
  21. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  22. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  23. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  24. /**
  25.  * @Route("/renouvellement-mot-de-passe")
  26.  */
  27. class ResettingController extends AbstractController
  28. {
  29.     public function __construct()
  30.     {
  31.         $dotenv = new Dotenv();
  32.         $dotenv->load(__DIR__ '/../../.env');
  33.     }
  34.     /**
  35.      * @Route("/", name="request_resetting")
  36.      * @param Request $request
  37.      * @param Mailer $mailer
  38.      * @param TokenGeneratorInterface $tokenGenerator
  39.      * @return RedirectResponse|Response
  40.      * @throws TransportExceptionInterface
  41.      */
  42.     public function request(Request $requestMailer $mailerTokenGeneratorInterface $tokenGenerator)
  43.     {
  44.         // création d'un formulaire "à la volée", afin que l'internaute puisse renseigner son mail
  45.         $email =  $request->get("email");
  46.         $form $this->createFormBuilder()
  47.             ->add('email'EmailType::class, [
  48.                 'attr'=>['placeholder'=>'Email'],
  49.                 'label' => false,
  50.                 'constraints' => [
  51.                     new Email(),
  52.                     new NotBlank()
  53.                 ], "data"=>$email
  54.             ])
  55.             ->getForm();
  56.         $form->handleRequest($request);
  57.         if ($form->isSubmitted() && $form->isValid()) {
  58.             $em $this->getDoctrine()->getManager();
  59.             $user $em->getRepository(User::class)->loadUserByEmail($form->getData()['email']);
  60.             // aucun email associé à ce compte.
  61.             if (!$user) {
  62.                 $request->getSession()->getFlashBag()->add('warning'"Cet email n'existe pas.");
  63.                 return $this->redirectToRoute("request_resetting");
  64.             }
  65.             // création du token
  66.             $user->setToken($tokenGenerator->generateToken());
  67.             // enregistrement de la date de création du token
  68.             $user->setPasswordRequestedAt(new Datetime());
  69.             $em->flush();
  70.             // on utilise le service Mailer créé précédemment
  71.             // $bodyMail = $mailer->createBodyMail('auth/mail.html.twig', [
  72.             //     'user' => $user
  73.             // ]);
  74.             // $mailer->sendMessage('from@email.com', $user->getEmail(), 'renouvellement du mot de passe', $bodyMail);
  75.             // $request->getSession()->getFlashBag()->add('success', "Un mail va vous être envoyé afin que vous puissiez renouveller votre mot de passe. Le lien que vous recevrez sera valide 24h.");
  76.             $datasJson = [];
  77.             $datasJson["user"]["email"] = $user->getEmail();
  78.             $datasJson["user"]["vendor"] =  $user->getShopifyVendorName();
  79.             $datasJson["user"]["url"] = $this->generateUrl('resetting', ['id' => $user->getId(), 'token' => $user->getToken()],  UrlGeneratorInterface::ABSOLUTE_URL);
  80.             $client =  HttpClient::create();
  81.             $configs = ['headers' => ["Content-Type" => "application/json"]];
  82.             $configs['body'] = json_encode($datasJson);
  83.             $client->request('POST'$_ENV['ZAPIER_MAIL_MDP'], $configs);
  84.             /* penser a faire un log ???
  85.             $res= $client->request('POST', $_ENV['ZAPIER_MAIL_MDP'], $configs);
  86.             var_dump($res->getContent());exit(); */
  87.             return $this->redirectToRoute("app_login");
  88.         }
  89.         return $this->render('auth/reset.html.twig', [
  90.             'form' => $form->createView()
  91.         ]);
  92.     }
  93.     /**
  94.      * si supérieur à 10min, retourne false
  95.      * sinon retourne false
  96.      * @param Datetime|null $passwordRequestedAt
  97.      * @return bool
  98.      */
  99.     public static function isRequestInTime(Datetime $passwordRequestedAt null): bool
  100.     {
  101.         if ($passwordRequestedAt === null) {
  102.             return false;
  103.         }
  104.         $now = new DateTime();
  105.         $interval $now->getTimestamp() - $passwordRequestedAt->getTimestamp();
  106.         //   $daySeconds = 60 * 10;
  107.         //$daySeconds = 3600 * 24 ; //pour 24h
  108.         $daySeconds 3600 24 365//pour 1 AN
  109.         $response $interval $daySeconds false true;
  110.         return $response;
  111.     }
  112.     /**
  113.      * @Route("/{id}/{token}", name="resetting")
  114.      * @param User $user
  115.      * @param $token
  116.      * @param Request $request
  117.      * @param UserPasswordEncoderInterface $passwordEncoder
  118.      * @return RedirectResponse|Response
  119.      */
  120.     public function resetting(User $user$tokenRequest $requestUserPasswordEncoderInterface $passwordEncoder)
  121.     {
  122.         // interdit l'accès à la page si:
  123.         // le token associé au membre est null
  124.         // le token enregistré en base et le token présent dans l'url ne sont pas égaux
  125.         // le token date de plus de 10 minutes
  126.         if ($user->getToken() === null || $token !== $user->getToken() || !self::isRequestInTime($user->getPasswordRequestedAt())) {
  127.             // throw new AccessDeniedHttpException();
  128.             return $this->redirectToRoute('app_login');
  129.         }
  130.         $form $this->createForm(ResettingType::class, $user);
  131.         $form->handleRequest($request);
  132.         if ($form->isSubmitted() && $form->isValid()) {
  133.             $password $passwordEncoder->encodePassword($user$user->getPlainPassword());
  134.             $user->setPassword($password);
  135.             // réinitialisation du token à null pour qu'il ne soit plus réutilisable
  136.             $user->setToken(null);
  137.             $user->setPasswordRequestedAt(null);
  138.             $em $this->getDoctrine()->getManager();
  139.             $em->persist($user);
  140.             $em->flush();
  141.             $request->getSession()->getFlashBag()->add('success'"Votre mot de passe a été renouvelé.");
  142.             return $this->redirectToRoute('app_login');
  143.         }
  144.         return $this->render('auth/change.html.twig', [
  145.             'form' => $form->createView(),
  146.             'user'=>$user
  147.         ]);
  148.     }
  149. }