src/Controller/ResettingController.php line 42

Open in your IDE?
  1. <?php 
  2. namespace App\Controller;
  3. use App\Entity\Messagerie;
  4. use Symfony\Component\Routing\Annotation\Route;
  5.  
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use App\Entity\Users;
  9. use App\Form\ResettingType;
  10. use App\Notification\MessageNotification;
  11. use App\Services\Mailer;
  12. use Doctrine\Persistence\ManagerRegistry;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  15. use Symfony\Component\Validator\Constraints\Email;
  16. use Symfony\Component\Validator\Constraints\NotBlank;
  17. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  18. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  19. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  20. use Symfony\Component\Routing\Generator\UrlGenerator;
  21. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  22. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  23. /**
  24.  * @Route("/renouvellement-mot-de-passe")
  25.  */
  26. class ResettingController extends AbstractController
  27. {   
  28.     private $generator;
  29.     public function __construct(UrlGeneratorInterface $generator)
  30.         {
  31.             $this->generator $generator;
  32.         }
  33.     /**
  34.      * @Route("/requete", name="request_resetting")
  35.      */
  36.     public function request(Request $requestMessageNotification $mailerManagerRegistry $doctrine TokenGeneratorInterface $tokenGenerator)
  37.     {
  38.         // création d'un formulaire "à la volée", afin que l'internaute puisse renseigner son mail
  39.         $form $this->createFormBuilder()
  40.             ->add('email'EmailType::class, [
  41.                 'constraints' => [
  42.                     new Email(),
  43.                     new NotBlank()
  44.                 ]
  45.             ])
  46.             ->getForm();
  47.         $form->handleRequest($request);
  48.         if ($form->isSubmitted() && $form->isValid()) {
  49.             $em $doctrine->getManager();
  50.             // voir l'épisode 2 de cette série pour retrouver la méthode loadUserByUsername:
  51.             $user $em->getRepository(Users::class)->findOneBy(['email'=> $form->getData()['email']]);
  52.             // aucun email associé à ce compte.
  53.             if (!$user) {
  54.                 $this->addFlash('error'"Aucun compte ne correspond à cette adresse email");
  55.                 return $this->redirectToRoute("request_resetting");
  56.             } 
  57.             // création du token
  58.             $user->setToken($tokenGenerator->generateToken());
  59.             // enregistrement de la date de création du token
  60.             $user->setPasswordRequestedAt(new \Datetime());
  61.             $em->flush();
  62.            
  63.            $lien $this->generator->generate('resetting', ['id' => $user->getId(), 'token' => $user->getToken()], UrlGenerator::ABSOLUTE_URL);
  64.             
  65.            $btnLien =   '<table border="0" valign="top" cellspacing="0" cellpadding="0" width="550" align="center" class="rnb-col-1">
  66.            <tbody><tr>
  67.                <td valign="top">
  68.                    <table cellpadding="0" border="0" align="center" cellspacing="0" class="rnb-btn-col-content" style="margin:auto; border-collapse: separate;">
  69.                        <tbody><tr>
  70.                            <td width="auto" valign="middle" bgcolor="#000000 " align="center" style="font-size:1.2em; font-family:Arial,Helvetica,sans-serif; color:#ffffff; font-weight:normal; padding:20px 30px; vertical-align: middle; background-color:#000000 ;border-radius:30px;border-top:0px None #ffffff;border-right:0px None #ffffff;border-bottom:0px None #ffffff;border-left:0px None #ffffff;">
  71.                                <span style="color:#ffffff; font-weight:normal;">
  72.                                        <a style="text-decoration:none; color:#ffffff; font-weight:normal;" target="_blank" href="'.$lien.'"><strong>Modifier mon mot de passe</strong></a>
  73.                                    </span>
  74.                            </td>
  75.                        </tr></tbody></table>
  76.                </td>
  77.            </tr>
  78.            </tbody>
  79.        </table>' ;
  80.             // on utilise le service Mailer créé précédemment
  81.             /* $bodyMail = $mailer->createBodyMail('resetting/mail.html.twig', [
  82.                 'user' => $user
  83.             ]);
  84.             $mailer->sendMessage('from@email.com', $user->getEmail(), 'renouvellement du mot de passe', $bodyMail); */
  85.             $message "<p>Bonjour,</p><br>
  86.             <p>Vous avez demandé à réinitialiser votre mot de passe&nbsp;? </p> 
  87.             <p>Rien de plus simple, cliquez ici et suivez les instructions : </p> 
  88.           
  89.             <br>
  90.                         
  91.                   ".$btnLien."
  92.                         <br>
  93.                         <p style='font-size:0.7em'>Si le lien ne fonctionne pas, copiez le lien ci-dessous et collez le dans votre navigateur : <br>
  94.                         '".$lien."'
  95.                         </p>
  96.                         <br><br>
  97.                         <p>À bientôt sur aoyos.fr</p>
  98.                         <p>&nbsp;</p><br>
  99.                        ";
  100.             $messagerie = new Messagerie;
  101.             $messagerie->setEmail($user->getEmail());    
  102.             $messagerie->setSujet("Réinitialisation de votre accès Aoyos"); 
  103.             $messagerie->setMessage($message);   
  104.             $mailer->notify($messagerie);
  105.             $this->addFlash('success'"Un mail va vous être envoyé afin que vous puissiez renouveler votre mot de passe. Le lien que vous recevrez sera valide 24h.");
  106.                 
  107.             
  108.             return $this->redirectToRoute("request_resetting");
  109.         }
  110.         return $this->render('security/requestmdp.html.twig', [
  111.             'form' => $form->createView()
  112.         ]);
  113.     }
  114.     // si supérieur à 10min, retourne false
  115.     // sinon retourne false
  116.     private function isRequestInTime(\Datetime $passwordRequestedAt null)
  117.     {
  118.         if ($passwordRequestedAt === null)
  119.         {
  120.             return false;        
  121.         }
  122.         
  123.         $now = new \DateTime();
  124.         $interval $now->getTimestamp() - $passwordRequestedAt->getTimestamp();
  125.         $daySeconds 60 10;
  126.         $response $interval $daySeconds false $reponse true;
  127.         return $response;
  128.     }
  129.     /**
  130.      * @Route("/{id}/{token}", name="resetting")
  131.      */
  132.     public function resetting(Users $user$tokenRequest $requestManagerRegistry $doctrine UserPasswordHasherInterface $passwordEncoder)
  133.     {
  134.         // interdit l'accès à la page si:
  135.         // le token associé au membre est null
  136.         // le token enregistré en base et le token présent dans l'url ne sont pas égaux
  137.         // le token date de plus de 10 minutes
  138.         if ($user->getToken() === null || $token !== $user->getToken() || !$this->isRequestInTime($user->getPasswordRequestedAt()))
  139.         {
  140.             $this->addFlash('success'"Ce lien a déjà été utilisé");
  141.             return $this->redirectToRoute('login');
  142.         }
  143.         $form $this->createForm(ResettingType::class, $user);
  144.         $form->handleRequest($request);
  145.         if($form->isSubmitted() && $form->isValid())
  146.         {
  147.             $password $passwordEncoder->hashPassword($user$user->getPlainPassword());
  148.             $user->setPassword($password);
  149.             // réinitialisation du token à null pour qu'il ne soit plus réutilisable
  150.             $user->setToken(null);
  151.             $user->setPasswordRequestedAt(null);
  152.             $em $doctrine->getManager();
  153.             $em->persist($user);
  154.             $em->flush();
  155.            // $request->getSession()->getFlashBag()->add('success', "Votre mot de passe a été renouvelé.");
  156.            $this->addFlash('success'"Votre mot de passe a bien été modifié, vous pouvez vous connecter :");
  157.             return $this->redirectToRoute('login');
  158.         }
  159.         return $this->render('security/resetmdp.html.twig', [
  160.             'form' => $form->createView()
  161.         ]);
  162.         
  163.     }
  164. }
  165. ?>