src/Controller/MailPasswordResetController.php line 37

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use Psr\Log\LoggerInterface;
  5. use App\Service\EmailService;
  6. use App\Repository\UserRepository;
  7. use App\Service\UserWordpressService;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Contracts\HttpClient\HttpClientInterface;
  14. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  17. use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
  18. class MailPasswordResetController extends AbstractController
  19. {
  20.     private $logger;
  21.     private $httpClient;
  22.     private $emailService;
  23.     private $wordpressService;
  24.     public function __construct(UserWordpressService $wordpressServiceEmailService $emailService,LoggerInterface $loggerHttpClientInterface $httpClient)
  25.     {
  26.         $this->logger $logger;
  27.         $this->httpClient $httpClient;
  28.         $this->emailService $emailService;
  29.         $this->wordpressService $wordpressService;
  30.     }
  31.     #[Route('/forgot-password'name'app_forgot_password')]
  32.     public function index(UserRepository $userRepositoryRequest $requestEntityManagerInterface $entityManagerJWTTokenManagerInterface $JWTTokenManager): Response
  33.     {
  34.         // Je teste si le champ email a été envoyé
  35.             if($request->get('email')) {
  36.                 $email $request->get('email');
  37.                 $user $userRepository->findOneByEmail($email);
  38.                 // Si ne trouve pas d'utilisateur avec cette email
  39.                     if(empty($user)) {
  40.                         $this->addFlash('danger''Pas de compte lié à cette adresse mail');
  41.                     }
  42.                 // Si j'en trouve
  43.                     else {
  44.                         // Je génère un token unique qui me permettra de l'identifier une fois qu'il cliquera sur lien envoyé par mail
  45.                             $token uniqid(md5($email), true) . bin2hex(random_bytes(5));
  46.                             $user->setTempToken($token);
  47.                             //dump($user);
  48.                             $entityManager->persist($user);
  49.                             $entityManager->flush();
  50.                         // J'envoie le mail de changement de mot de passe
  51.                             $to $user->getEmail();
  52.                             // Sujet de l'e-mail
  53.                             $subject "Changement de mot de passe";
  54.                             // Je génère le lien pour qu'il puisse changer son mot de passe
  55.                                 $signedUrl $this->generateUrl('new_password',['token' => $token],  UrlGeneratorInterface::ABSOLUTE_URL, [
  56.                                     'scheme' => 'https'
  57.                                 ]);
  58.                             //dump($signedUrl);
  59.                             //dump($token);
  60.                             // Message
  61.                             $message "<h4>Bonjour! Votre lien de modification de votre mot de passe!</h4>
  62.                                         <p>
  63.                                         Appuyer sur le lien ci dessous pour changer votre mot de passe: <br><br>
  64.                                             <a href=".$signedUrl.">Changer mon mot de passe</a>
  65.                                         </p>
  66.                                         <p>
  67.                                             Bien à vous!
  68.                                         </p>";
  69.                             if($this->emailService->sendMail($to$subject$message) == 'succeed') {
  70.                                 $this->addFlash('success''Un lien vous a été envoyé dans votre boite mail pour cette modification '.$user->getEmail().', veuillez l\'utiliser pour la modification du mot de passe');
  71.                             }
  72.                             else {
  73.                                 throw new \Exception("Erreur d'envoie de mail");
  74.                             }
  75.                     }
  76.             }
  77.         return $this->render('forgot_password/index.html.twig', [
  78.             'controller_name' => 'MailPasswordResetController',
  79.         ]);
  80.     }
  81.     // Route appelée lorsque l'utilisateur clique sur le lien que l'on lui a envoyé par mail
  82.         #[Route('/password/new'name'new_password')]
  83.         public function newPassword(UserPasswordHasherInterface $userPasswordHasherUserRepository $userRepositoryRequest $requestEntityManagerInterface $entityManagerJWTTokenManagerInterface $JWTTokenManager): Response
  84.         {
  85.             // Je vérifie la présence du token dans l'url
  86.                 if($request->get('token')) {
  87.                     // Je cherche la correspondance avec un User par token
  88.                         $user $userRepository->findOneByTempToken($request->get('token'));
  89.                     // Si je ne trouve pas de correspondance
  90.                         if(empty($user)) {
  91.                             return new JsonResponse('Lien expiré'Response::HTTP_BAD_REQUEST);
  92.                         }
  93.                     // Si j'en trouve
  94.                         else {
  95.                             return $this->render('security/newpassword.html.twig', [
  96.                                 'email' => $user->getEmail(),
  97.                             ]);
  98.                         }
  99.                 }
  100.             
  101.             // Etant aussi la route de changement de mot de passe à proprement parlé lors d'un oublie je capte aussi si l'utilisateur a rempli le formulaire de nouveau mot de passe
  102.                 else if ($request->getMethod() === 'POST' && $request->get('newpassword')) {
  103.                     //dump($request->get('newpassword'));
  104.                     //dump($request->get('confirmNewpassword'));
  105.                     // Je cherche la correspondance avec un User par email
  106.                         $user $userRepository->findOneByEmail($request->get('email'));
  107.                         //dump($user);
  108.                     // Si je ne trouve pas de correspondance
  109.                         if(empty($user)) {
  110.                             $this->addFlash('danger''Pas de compte lié à cette adresse mail');
  111.                         }
  112.                     // Si j'en trouve
  113.                         else {
  114.                             // Je vérifie que le mot de passe et sa confirmation sont les mêmes
  115.                                 // Si c'est le cas 
  116.                                     if($request->get('newpassword') === $request->get('confirmNewpassword')) {
  117.                                         $user->setPassword(
  118.                                             $userPasswordHasher->hashPassword(
  119.                                                 $user,
  120.                                                 $request->get('newpassword')
  121.                                             )
  122.                                         );
  123.                                         $user->setTempToken(null);
  124.                                         //dump($user);
  125.                                         $entityManager->persist($user);
  126.                                         $entityManager->flush();
  127.                                         $this->addFlash('success''Votre mot de passe a été changé avec succès, vous pouvez vous connecter');
  128.                                         return $this->redirectToRoute('app_login');
  129.                                     }
  130.                                 // Si ça ne l'est pas
  131.                                     else {
  132.                                         $this->addFlash('danger''Le mot de passe et sa confirmation doivent être identiques');
  133.                                     }
  134.                         }
  135.                         return $this->render('security/newpassword.html.twig', [
  136.                             'email' => $user->getEmail(),
  137.                         ]);
  138.                 }
  139.             return new JsonResponse('Lien expiré'Response::HTTP_BAD_REQUEST);
  140.         }
  141.     // Route appelée lorsque l'utilisateur clique sur le lien que l'on lui a envoyé par mail
  142.         #[Route('/mail/new'name'new_mail')]
  143.         public function newMail(UserPasswordHasherInterface $userPasswordHasherUserRepository $userRepositoryRequest $requestEntityManagerInterface $entityManagerJWTTokenManagerInterface $JWTTokenManager): Response
  144.         {
  145.             // Je vérifie la présence du token dans l'url
  146.                 if($request->get('token')) {
  147.                     // Je cherche la correspondance avec un User par token
  148.                         $user $userRepository->findOneByTempToken($request->get('token'));
  149.                     // Si je ne trouve pas de correspondance
  150.                         if(empty($user)) {
  151.                             return new JsonResponse('Lien expiré'Response::HTTP_BAD_REQUEST);
  152.                         }
  153.                     // Si j'en trouve
  154.                         else {
  155.                             $user->setEmail($request->get('newEmail'));
  156.                             $user->setTempToken(null);
  157.                             //dump($user);
  158.                             $entityManager->persist($user);
  159.                             $entityManager->flush();
  160.                             $this->addFlash('success''Votre Email a été mis à jour avec succès, vous pouvez vous connecter');
  161.                             // Je contacte le backoffice pour le notifier du changement
  162.                                 $this->updateUserBackoffice($entityManager$user);
  163.                             return $this->redirectToRoute('app_login');
  164.                         }
  165.                 }
  166.             return new JsonResponse('Lien expiré'Response::HTTP_BAD_REQUEST);
  167.         }
  168.     
  169.     // Fonction pour *signaler des changements du profil d'un user au backoffice
  170.         public function updateUserBackoffice(EntityManagerInterface $entityManagerUser $user) {
  171.             $autoPublish 0;
  172.             // Si auto publish à true je passe 1 sinon je passe 0
  173.             if($user->isAutoPublish()) {
  174.                 $autoPublish 1;
  175.             }
  176.             // A faire après la vérification d'email dans la prod
  177.             $jsonData = [
  178.                 'authentication_key' => $_ENV['AUTHENTICATION_KEY'],
  179.                 'idcustomer' => $user->getId(),
  180.                 'customerkey' => $user->getCustomerKey(),
  181.                 'customerlastname' => $user->getLastname(),
  182.                 'customerfirstname' => $user->getFirstname(),
  183.                 'customeremail' => $user->getEMail(),
  184.                 'customerphonenumber' => $user->getPhoneNumber(),
  185.                 'customersubjects' => $user->getCustomerSubjects(),
  186.                 'companyname' => $user->getCompanyName(),
  187.                 'siteurl' => $user->getWordpressUrl(),
  188.                 'publishinguser' => $user->getWordpressUsername(),
  189.                 'publishinguserkey' => $this->wordpressService->decryptPassword($user->getWordpressPassword()),
  190.                 'seoplugin' => $user->getSeoPlugin(),
  191.                 'autopublish' => $user->isAutoPublish() == true 0
  192.             ];
  193.             //dump($jsonData);
  194.             try {
  195.                 // Envoyer les données à l'API externe
  196.                     $response $this->httpClient->request('POST''https://www.groupe-saven.fr/api.cpe/newcustomer.php',
  197.                     [
  198.                         'json' => $jsonData
  199.                     ]);
  200.                     $statusCode $response->getStatusCode();
  201.                     $content $response->getContent(false);
  202.                     $data json_decode($contenttrue);
  203.                     ////dump($statusCode);
  204.                     //dump($data);
  205.                     //dump($response);
  206.                     if ($statusCode !== 200) {
  207.                         // Lancer une exception avec le contenu de la réponse si le code de statut n'est pas 200
  208.                         throw new \Exception("Erreur HTTP $statusCode: " $content);
  209.                     }
  210.                     if ($data['status'] === 'success') {
  211.                         //dump($data['id']);
  212.                         if(!$user->getPbnId() == (int) $data['id']) {
  213.                             $this->logger->error("danger" " Mauvais Utilisateur modifier côté backoffice");
  214.                         }
  215.                         else {
  216.                             //dump("Tout est Ok côté front et backoffice");
  217.                         }
  218.                     }
  219.             } catch (Exception $e) {
  220.                 //dump($response);
  221.                 $this->logger->error("danger" $e->getMessage());
  222.             }
  223.             return true;
  224.         }
  225. }