src/Controller/ForgetPasswordController.php line 30

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: mint
  5.  * Date: 11/11/19
  6.  * Time: 08:01
  7.  */
  8. namespace App\Controller;
  9. use App\Entity\ResetPassword;
  10. use App\Form\ForgotPasswordType;
  11. use App\Form\PasswordUserUpdateType;
  12. use App\Notification\EmailNotification;
  13. use App\Repository\ResetPasswordRepository;
  14. use App\Repository\UserRepository;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  20. class ForgetPasswordController extends AbstractController
  21. {
  22.     /**
  23.      * @Route("/forgot", name="forgot_password")
  24.      */
  25.     public function forgotPasswordRequest(Request $requestEmailNotification $emailNotificationEntityManagerInterface $emUserRepository $userRepository)
  26.     {
  27.         $resetPassword = new ResetPassword();
  28.         $form $this->createForm(ForgotPasswordType::class, $resetPassword);
  29.         $form->handleRequest($request);
  30.         if ($form->isSubmitted() && $form->isValid()) {
  31.             $formData $form->getData();
  32.             $email $formData->getEmail();
  33.             $user $userRepository->findOneBy([
  34.                 'email' => $email
  35.             ]);
  36.             if($user){
  37.                 //enregistrer ici dans la table ResetPassword et envoyer le mail
  38.                 $lang $user->getLanguage();
  39.                 $now = new \DateTimeImmutable();
  40.                 $expireAt $now->add(new \DateInterval("PT1H"));
  41.                 $token $this->generateToken();
  42.                 $resetPassword->setEmail($email)
  43.                     ->setCreateAt($now)
  44.                     ->setToken($token)
  45.                     ->setEndAt($expireAt)
  46.                 ;
  47.                 $em->persist($resetPassword);
  48.                 $em->flush();
  49.                 $emailNotification->forgotPasswordLink($email$token$lang);
  50.                 $this->addFlash('success''Un email vous a été envoyé pour modifier votre mot de passe, merci de le consulter rapidement, le lien est valable UNE heure seulement');
  51.                 return $this->redirectToRoute('forgot_password');
  52.             }else{
  53.                 $this->addFlash('error''Aucun utilisateur inscrit avec cette adresse email');
  54.                 return $this->redirectToRoute('forgot_password');
  55.             }
  56.         }
  57.         return $this->render('pages/forgot.html.twig', [
  58.             'form' => $form->createView(),
  59.         ]);
  60.     }
  61.     /**
  62.      * @Route("/reset/{email}/{token}", name="reset_password_from_email")
  63.      */
  64.     public function forgotPasswordResponseToTheLink($email$tokenRequest $requestUserRepository $userRepositoryResetPasswordRepository $resetPasswordRepositoryUserPasswordEncoderInterface $passwordEncoder,EntityManagerInterface $emEmailNotification $emailNotification)
  65.     {
  66.         $existingToken $resetPasswordRepository->findOneBy([
  67.             'token' => $token
  68.         ]);
  69.         $now = new \DateTimeImmutable();
  70.         if($existingToken and $existingToken->getEndAt() > $now ){
  71.             //changer le MDP ICI
  72.             $user $userRepository->findOneBy([
  73.                 'email' => $email,
  74.             ]);
  75.             $form $this->createForm(PasswordUserUpdateType::class, $user);
  76.             $form->handleRequest($request);
  77.             if ($form->isSubmitted() && $form->isValid()) {
  78.                 $formData $form->getData();
  79.                 $newPassword $formData->getPassword();
  80.                 $encodedPassword $passwordEncoder->encodePassword($user,$newPassword);
  81.                 $user->setPassword($encodedPassword);
  82.                 $em->persist($user);
  83.                 $em->remove($existingToken);
  84.                 $em->flush();
  85.                 $lang $user->getLanguage();
  86.                 $emailNotification->forgotPasswordOk($email$lang);
  87.                 $this->addFlash('success''Votre mot de passe a bien été modifié, vous pouvez vous connecter');
  88.                 return $this->redirectToRoute('app_login');
  89.             }
  90.             return $this->render('pages/reset.html.twig', [
  91.                 'form' => $form->createView(),
  92.             ]);
  93.         }else{
  94.             if($existingToken) {
  95.                 $em->remove($existingToken);
  96.                 $em->flush();
  97.             }
  98.             $this->addFlash('error''Cette demande a expiré ou n\'existe pas, veuillez en refaire la demande');
  99.             return $this->redirectToRoute('forgot_password');
  100.         }
  101.     }
  102.     public function generateToken()
  103.     {
  104.         //Generate a random string.
  105.         $token openssl_random_pseudo_bytes(16);
  106. //Convert the binary data into hexadecimal representation.
  107.         $token bin2hex($token);
  108.         return $token;
  109.     }
  110. }