src/Controller/LoginController.php line 67

Open in your IDE?
  1. <?php 
  2. namespace App\Controller;
  3. use App\Entity\Users;
  4. use App\Form\ChangePasswordFormType;
  5. use App\Form\ChangePasswordForNewFormType;
  6. use App\Form\ResetPasswordRequestFormType;
  7. use App\Message\SendNewClientMessage;
  8. use App\Repository\UsersRepository;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\RedirectResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\Mailer\MailerInterface;
  16. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  19. use Symfony\Component\Security\Core\Security;
  20. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  21. use Symfony\Component\Mime\Email;
  22. use App\Service\EmailService;
  23. use App\Service\WebhookService;
  24. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  25. use Symfony\Component\Messenger\MessageBusInterface;
  26. use DateTime;
  27. class LoginController extends AbstractController
  28. {
  29.     private $entityManager;
  30.     private $security;
  31.     private $passwordHasher;
  32.     private $webhookService;
  33.     private $mdp_perdu;
  34.     private MessageBusInterface $messageBus;
  35.     public function __construct(MessageBusInterface $messageBusParameterBagInterface $paramsEntityManagerInterface $entityManagerWebhookService $webhookServiceSecurity $securityUserPasswordHasherInterface $passwordHasher)
  36.     {
  37.         $this->entityManager $entityManager;
  38.         $this->passwordHasher $passwordHasher;
  39.         $this->webhookService $webhookService;
  40.         $this->mdp_perdu $params->get('CAMPAIGN_AC_ID_MDP_PERDU');
  41.         $this->messageBus $messageBus;
  42.         $this->security $security;
  43.     }
  44.     #[Route('/send-email'name'send-email')]
  45.     public function sendWebhook(): Response
  46.     {
  47.         $to 'nunuxounet@gmail.com';
  48.         $subject 'Test Email';
  49.         $body '<html><body><h1>Test Email</h1><p>Ceci est un test d\'envoi à un webhook Zapier.</p></body></html>';
  50.         $this->webhookService->sendToWebhook($to$subject$body);
  51.         return new Response('Webhook data sent successfully!');
  52.     }
  53.     #[Route('/'name'app_login')]
  54.     public function login(AuthenticationUtils $authenticationUtilsRequest $request): Response
  55.     {
  56.         // Vérifier si l'utilisateur est déjà authentifié
  57.         if ($this->security->isGranted('IS_AUTHENTICATED_FULLY')) {
  58.             // Rediriger vers une autre page si connecté
  59.             return $this->redirectToRoute('app_homepage'); // Remplacez 'app_home' par la route de votre choix
  60.         }
  61.         $myIp '90.62.192.229'// remplace par ton IP publique
  62.         $IpNoNo '90.5.128.205';
  63.         // Récupérer l'IP du visiteur
  64.         $userIp $request->getClientIp();
  65.         // Récupère l'erreur de connexion s'il y en a une
  66.         $error $authenticationUtils->getLastAuthenticationError();
  67.         // Dernier nom d'utilisateur saisi par l'utilisateur
  68.         $lastUsername $authenticationUtils->getLastUsername();
  69.         
  70.         // MODE PROD
  71.         return $this->render('security/login.html.twig', [
  72.             'last_username' => $lastUsername,
  73.             'error' => $error
  74.         ]);
  75.         //MODE DEV
  76.         // if ($userIp === $myIp || $userIp === $IpNoNo) {
  77.         //     // Pour toi uniquement : affichage mode PROD
  78.         //     return $this->render('security/login.html.twig', [
  79.         //         'last_username' => $lastUsername,
  80.         //         'error' => $error
  81.         //     ]);
  82.         // }
  83.         // // Pour tout le monde : affichage mode MAINTENANCE
  84.         // return $this->render('maintenance/index.html.twig', [
  85.         //     'last_username' => $lastUsername,
  86.         //     'error' => $error
  87.         // ]);
  88.         
  89.     }
  90.     #[Route('/reset-password'name'app_forgot_password_request')]
  91.     public function request(Request $requestUsersRepository $userRepositoryMailerInterface $mailerEntityManagerInterface $entityManager): Response
  92.     {
  93.         // Vérifier si l'utilisateur est déjà authentifié
  94.         if ($this->security->isGranted('IS_AUTHENTICATED_FULLY')) {
  95.             // Rediriger vers une autre page si connecté
  96.             return $this->redirectToRoute('app_homepage'); // Remplacez 'app_home' par la route de votre choix
  97.         }
  98.         $form $this->createForm(ResetPasswordRequestFormType::class);
  99.         $form->handleRequest($request);
  100.         if ($form->isSubmitted() && $form->isValid()) {
  101.             $email $form->get('email')->getData();
  102.             $user $userRepository->findOneBy(['email' => $email]);
  103.             if (!$user) {
  104.                 throw new UsernameNotFoundException('No user found for this email');
  105.             }
  106.             // Generate a secure token and save it to the database
  107.             $resetToken bin2hex(random_bytes(32));
  108.             $user->setResetToken($resetToken);
  109.             $user->setTokenExpiryDate(new \DateTime('+1 hour'));
  110.             $entityManager->persist($user);
  111.             $entityManager->flush();
  112.             $this->addFlash('success''Demande de mot de passe traitée, allez vérifier votre boîte mail !');
  113.             // Envoyer le premier webhook
  114.             $resetUrl $this->generateUrl('app_reset_password', ['token' => $resetToken], UrlGeneratorInterface::ABSOLUTE_URL);
  115.             $reponse $this->webhookService->sendNewLinkConnexion($user->getEmail(), $user->getActivecampaignId(), $resetUrl);
  116.             // Envoie du message pour exécution asynchrone
  117.             $message = new SendNewClientMessage($user->getEmail(), $this->mdp_perdu);
  118.             $this->messageBus->dispatch($message);
  119.             return $this->redirectToRoute('app_login');
  120.         }
  121.         return $this->render('security/request.html.twig', [
  122.             'requestForm' => $form->createView(),
  123.         ]);
  124.     }
  125.     #[Route('/reset-password/{token}'name'app_reset_password')]
  126.     public function reset(Request $requestEntityManagerInterface $entityManagerUsersRepository $userRepositorystring $token): Response
  127.     {
  128.         $user $userRepository->findOneBy(['resetToken' => $token]);
  129.         if (!$user || $user->isTokenExpired()) {
  130.             throw $this->createNotFoundException('Token not found or expired.');
  131.         }
  132.         $form $this->createForm(ChangePasswordFormType::class);
  133.         $form->handleRequest($request);
  134.         if ($form->isSubmitted() && $form->isValid()) {
  135.             // Encode the new password
  136.             $plainPassword $form->get('plainPassword')->getData();
  137.             $encodedPassword $this->passwordHasher->hashPassword($user$plainPassword);
  138.             $user->setPassword($encodedPassword);
  139.             $user->setResetToken(null); // Invalidate the token
  140.             $user->setTokenExpiryDate(new DateTime('1900-01-01 00:00:00')); // Clear the token expiry date
  141.             $entityManager->persist($user);
  142.             $entityManager->flush();
  143.             return $this->redirectToRoute('app_login');
  144.         }
  145.         return $this->render('security/reset-password.html.twig', [
  146.             'resetForm' => $form->createView(),
  147.         ]);
  148.     }
  149.     #[Route('/change-password/'name'app_change_password')]
  150.     public function changePassword(Security $securityUserPasswordHasherInterface $userPasswordHasherInterfaceUsersRepository $usersRepositoryRequest $requestEntityManagerInterface $entityManagerUsersRepository $userRepository): Response
  151.     {
  152.         // Récupérer l'utilisateur actuellement connecté
  153.         $user $security->getUser();
  154.         $userEntity $usersRepository->find($user);
  155.         $form $this->createForm(ChangePasswordForNewFormType::class);
  156.         $form->handleRequest($request);
  157.         if ($form->isSubmitted() && $form->isValid()) {
  158.             // Encode the new password
  159.             $plainPassword $form->get('plainPassword')->getData();
  160.             $ancienPasswordForm $form->get('password')->getData();
  161.             $passwordBDD $userEntity->getPassword();
  162.             
  163.             // Vérification de l'ancien mot de passe
  164.             if (!$userPasswordHasherInterface->isPasswordValid($userEntity$ancienPasswordForm)) {
  165.                 // Ajouter un message d'erreur si le mot de passe ne correspond pas
  166.                 $this->addFlash('error''L\'ancien mot de passe est incorrect.');
  167.                 return $this->redirectToRoute('app_change_password');
  168.             }
  169.             $encodedPassword $this->passwordHasher->hashPassword($userEntity$plainPassword);
  170.             $userEntity->setPassword($encodedPassword);
  171.             $entityManager->persist($userEntity);
  172.             $entityManager->flush();
  173.             return $this->redirectToRoute('app_login');
  174.         }
  175.         return $this->render('security/change-password.html.twig', [
  176.             'resetForm' => $form->createView(),
  177.         ]);
  178.     }
  179.     
  180.     #[Route('/login/google'name:'app_login_google')]
  181.     public function connect(ClientRegistry $clientRegistry): RedirectResponse {
  182.         $client $clientRegistry->getClient('google');
  183.         return $client->redirect(['read:user''user:email']);
  184.     }
  185.     
  186.     #[Route('/logout'name'app_logout')]
  187.     public function logout(): void
  188.     {
  189.         throw new \Exception('This should never be reached!');
  190.     }
  191.     #[Route('/home'name'app_homepage')]
  192.     public function homepage(): Response
  193.     {
  194.         // Récupérer l'utilisateur actuellement connecté
  195.         $user $this->getUser();
  196.         // Vérifier le rôle de l'utilisateur
  197.         if (in_array('ROLE_ADMIN'$user->getRoles(), true)) {
  198.             // Redirection si l'utilisateur a le rôle ROLE_ADMIN
  199.             return $this->redirectToRoute('admin_dashboard_validation_routine');
  200.         } elseif (in_array('ROLE_EXPERT'$user->getRoles(), true)) {
  201.             // Redirection si l'utilisateur a le rôle ROLE_USER
  202.             return $this->redirectToRoute('expert_accueil');
  203.         } elseif (in_array('ROLE_EXPERT'$user->getRoles(), true) AND in_array('ROLE_ADMIN'$user->getRoles(), true)) {
  204.             // Redirection si l'utilisateur a le rôle ROLE_USER
  205.             return $this->redirectToRoute('admin_dashboard');
  206.         } else {
  207.             // Redirection par défaut si aucun rôle n'est défini
  208.             return $this->redirectToRoute('user_accueil');
  209.         }
  210.     }
  211. }