<?php
namespace App\Controller;
use App\Entity\Users;
use App\Form\ChangePasswordFormType;
use App\Form\ChangePasswordForNewFormType;
use App\Form\ResetPasswordRequestFormType;
use App\Message\SendNewClientMessage;
use App\Repository\UsersRepository;
use Doctrine\ORM\EntityManagerInterface;
use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Mime\Email;
use App\Service\EmailService;
use App\Service\WebhookService;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Messenger\MessageBusInterface;
use DateTime;
class LoginController extends AbstractController
{
private $entityManager;
private $security;
private $passwordHasher;
private $webhookService;
private $mdp_perdu;
private MessageBusInterface $messageBus;
public function __construct(MessageBusInterface $messageBus, ParameterBagInterface $params, EntityManagerInterface $entityManager, WebhookService $webhookService, Security $security, UserPasswordHasherInterface $passwordHasher)
{
$this->entityManager = $entityManager;
$this->passwordHasher = $passwordHasher;
$this->webhookService = $webhookService;
$this->mdp_perdu = $params->get('CAMPAIGN_AC_ID_MDP_PERDU');
$this->messageBus = $messageBus;
$this->security = $security;
}
#[Route('/send-email', name: 'send-email')]
public function sendWebhook(): Response
{
$to = 'nunuxounet@gmail.com';
$subject = 'Test Email';
$body = '<html><body><h1>Test Email</h1><p>Ceci est un test d\'envoi à un webhook Zapier.</p></body></html>';
$this->webhookService->sendToWebhook($to, $subject, $body);
return new Response('Webhook data sent successfully!');
}
#[Route('/', name: 'app_login')]
public function login(AuthenticationUtils $authenticationUtils, Request $request): Response
{
// Vérifier si l'utilisateur est déjà authentifié
if ($this->security->isGranted('IS_AUTHENTICATED_FULLY')) {
// Rediriger vers une autre page si connecté
return $this->redirectToRoute('app_homepage'); // Remplacez 'app_home' par la route de votre choix
}
$myIp = '90.62.192.229'; // remplace par ton IP publique
$IpNoNo = '90.5.128.205';
// Récupérer l'IP du visiteur
$userIp = $request->getClientIp();
// Récupère l'erreur de connexion s'il y en a une
$error = $authenticationUtils->getLastAuthenticationError();
// Dernier nom d'utilisateur saisi par l'utilisateur
$lastUsername = $authenticationUtils->getLastUsername();
// MODE PROD
return $this->render('security/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error
]);
//MODE DEV
// if ($userIp === $myIp || $userIp === $IpNoNo) {
// // Pour toi uniquement : affichage mode PROD
// return $this->render('security/login.html.twig', [
// 'last_username' => $lastUsername,
// 'error' => $error
// ]);
// }
// // Pour tout le monde : affichage mode MAINTENANCE
// return $this->render('maintenance/index.html.twig', [
// 'last_username' => $lastUsername,
// 'error' => $error
// ]);
}
#[Route('/reset-password', name: 'app_forgot_password_request')]
public function request(Request $request, UsersRepository $userRepository, MailerInterface $mailer, EntityManagerInterface $entityManager): Response
{
// Vérifier si l'utilisateur est déjà authentifié
if ($this->security->isGranted('IS_AUTHENTICATED_FULLY')) {
// Rediriger vers une autre page si connecté
return $this->redirectToRoute('app_homepage'); // Remplacez 'app_home' par la route de votre choix
}
$form = $this->createForm(ResetPasswordRequestFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$email = $form->get('email')->getData();
$user = $userRepository->findOneBy(['email' => $email]);
if (!$user) {
throw new UsernameNotFoundException('No user found for this email');
}
// Generate a secure token and save it to the database
$resetToken = bin2hex(random_bytes(32));
$user->setResetToken($resetToken);
$user->setTokenExpiryDate(new \DateTime('+1 hour'));
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash('success', 'Demande de mot de passe traitée, allez vérifier votre boîte mail !');
// Envoyer le premier webhook
$resetUrl = $this->generateUrl('app_reset_password', ['token' => $resetToken], UrlGeneratorInterface::ABSOLUTE_URL);
$reponse = $this->webhookService->sendNewLinkConnexion($user->getEmail(), $user->getActivecampaignId(), $resetUrl);
// Envoie du message pour exécution asynchrone
$message = new SendNewClientMessage($user->getEmail(), $this->mdp_perdu);
$this->messageBus->dispatch($message);
return $this->redirectToRoute('app_login');
}
return $this->render('security/request.html.twig', [
'requestForm' => $form->createView(),
]);
}
#[Route('/reset-password/{token}', name: 'app_reset_password')]
public function reset(Request $request, EntityManagerInterface $entityManager, UsersRepository $userRepository, string $token): Response
{
$user = $userRepository->findOneBy(['resetToken' => $token]);
if (!$user || $user->isTokenExpired()) {
throw $this->createNotFoundException('Token not found or expired.');
}
$form = $this->createForm(ChangePasswordFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Encode the new password
$plainPassword = $form->get('plainPassword')->getData();
$encodedPassword = $this->passwordHasher->hashPassword($user, $plainPassword);
$user->setPassword($encodedPassword);
$user->setResetToken(null); // Invalidate the token
$user->setTokenExpiryDate(new DateTime('1900-01-01 00:00:00')); // Clear the token expiry date
$entityManager->persist($user);
$entityManager->flush();
return $this->redirectToRoute('app_login');
}
return $this->render('security/reset-password.html.twig', [
'resetForm' => $form->createView(),
]);
}
#[Route('/change-password/', name: 'app_change_password')]
public function changePassword(Security $security, UserPasswordHasherInterface $userPasswordHasherInterface, UsersRepository $usersRepository, Request $request, EntityManagerInterface $entityManager, UsersRepository $userRepository): Response
{
// Récupérer l'utilisateur actuellement connecté
$user = $security->getUser();
$userEntity = $usersRepository->find($user);
$form = $this->createForm(ChangePasswordForNewFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Encode the new password
$plainPassword = $form->get('plainPassword')->getData();
$ancienPasswordForm = $form->get('password')->getData();
$passwordBDD = $userEntity->getPassword();
// Vérification de l'ancien mot de passe
if (!$userPasswordHasherInterface->isPasswordValid($userEntity, $ancienPasswordForm)) {
// Ajouter un message d'erreur si le mot de passe ne correspond pas
$this->addFlash('error', 'L\'ancien mot de passe est incorrect.');
return $this->redirectToRoute('app_change_password');
}
$encodedPassword = $this->passwordHasher->hashPassword($userEntity, $plainPassword);
$userEntity->setPassword($encodedPassword);
$entityManager->persist($userEntity);
$entityManager->flush();
return $this->redirectToRoute('app_login');
}
return $this->render('security/change-password.html.twig', [
'resetForm' => $form->createView(),
]);
}
#[Route('/login/google', name:'app_login_google')]
public function connect(ClientRegistry $clientRegistry): RedirectResponse {
$client = $clientRegistry->getClient('google');
return $client->redirect(['read:user', 'user:email']);
}
#[Route('/logout', name: 'app_logout')]
public function logout(): void
{
throw new \Exception('This should never be reached!');
}
#[Route('/home', name: 'app_homepage')]
public function homepage(): Response
{
// Récupérer l'utilisateur actuellement connecté
$user = $this->getUser();
// Vérifier le rôle de l'utilisateur
if (in_array('ROLE_ADMIN', $user->getRoles(), true)) {
// Redirection si l'utilisateur a le rôle ROLE_ADMIN
return $this->redirectToRoute('admin_dashboard_validation_routine');
} elseif (in_array('ROLE_EXPERT', $user->getRoles(), true)) {
// Redirection si l'utilisateur a le rôle ROLE_USER
return $this->redirectToRoute('expert_accueil');
} elseif (in_array('ROLE_EXPERT', $user->getRoles(), true) AND in_array('ROLE_ADMIN', $user->getRoles(), true)) {
// Redirection si l'utilisateur a le rôle ROLE_USER
return $this->redirectToRoute('admin_dashboard');
} else {
// Redirection par défaut si aucun rôle n'est défini
return $this->redirectToRoute('user_accueil');
}
}
}