src/Controller/SecurityController.php line 47

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\DataStatus;
  4. use App\Entity\Patient;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\Routing\Annotation\Route;
  9. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  10. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  11. use Symfony\Component\Routing\RouterInterface;
  12. use Symfony\Component\Routing\Exception\RouteNotFoundException;
  13. use Doctrine\Persistence\ManagerRegistry;
  14. use Symfony\Component\HttpFoundation\RequestStack;
  15. use Symfony\Component\Mailer\MailerInterface;
  16. use Symfony\Component\Mime\Email;
  17. use Symfony\Component\Mime\Address;
  18. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  19. use App\Service\Tool;
  20. use App\Entity\User;
  21. use App\Form\ProfileType;
  22. use App\Form\UserType;
  23. use App\Service\FileUploader;
  24. use Symfony\Component\EventDispatcher\EventDispatcher;
  25. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  26. use Symfony\Component\HttpFoundation\JsonResponse;
  27. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  28. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  29. class SecurityController extends AbstractController
  30. {
  31.     private $requestStack;
  32.     private $doctrine;
  33.     public function __construct(ManagerRegistry $doctrineRequestStack $requestStack)
  34.     {
  35.         $this->doctrine $doctrine;
  36.         $this->requestStack $requestStack;
  37.     }
  38.     /**
  39.      * @Route("/connexion", name="app_login")
  40.      */
  41.     public function index(AuthenticationUtils $authenticationUtils): Response
  42.     {
  43.         if ($this->getUser()) {
  44.             return $this->redirectToRoute('dashboard_index');
  45.         }
  46.         $error $authenticationUtils->getLastAuthenticationError();
  47.         $lastUsername $authenticationUtils->getLastUsername();
  48.         return $this->render('security/login.html.twig', ['last_username' => $lastUsername'error' => $error]);
  49.     }
  50.     /**
  51.      * @Route("/check-user", name="app_check_user")
  52.      */
  53.     public function checkUser(Request $request): Response
  54.     {
  55.         $em $this->doctrine->getManager();
  56.         $checkUser $em->getRepository(User::class)->findOneBy([
  57.             'email' => $request->get('email')
  58.         ]);
  59.         if ($checkUser) {
  60.             return new JsonResponse([
  61.                 'error' => true
  62.             ]);
  63.         }
  64.         return new JsonResponse([
  65.             'success' => true
  66.         ]);
  67.     }
  68.     /**
  69.      * @Route("/inscription", name="app_register")
  70.      */
  71.     public function register(Request $requestAuthenticationUtils $authenticationUtilsFileUploader $fileUploaderUserPasswordHasherInterface $passwordEncoderMailerInterface $mailer): Response
  72.     {
  73.         if ($this->getUser()) {
  74.             return $this->redirectToRoute('dashboard_index');
  75.         }
  76.         $error $authenticationUtils->getLastAuthenticationError();
  77.         $lastUsername $authenticationUtils->getLastUsername();
  78.         $em $this->doctrine->getManager();
  79.         $form $this->createForm(UserType::class, new User(), ["password" => true"is_register" => true]);
  80.         $form->handleRequest($request);
  81.         if ($form->isSubmitted() && $form->isValid()) {
  82.             $session $this->requestStack->getSession();
  83.             $checkUser $em->getRepository(User::class)->findOneBy([
  84.                 'email' => $form['email']->getData()
  85.             ]);
  86.             if ($checkUser != null) {
  87.                 $session->getFlashBag()->add('error'"L'adresse e-mail indiquée est déjà utilisée.");
  88.                 return $this->redirect($request->getUri());
  89.             }
  90.             $user $form->getData();
  91.             $user->setIsActive(true);
  92.             $user->setIsOptin(false);
  93.             $user->setOptinContact(false);
  94.             $user->setOptinConsentement(false);
  95.             $user->setIsDarkmode(false);
  96.             $user->setToken("");
  97.             $user->setCreatedAt(new \DateTimeImmutable());
  98.             $user->setStatus($em->getRepository(DataStatus::class)->findOneBy(["slug" => "en_attente"]));
  99.             $user->setRoles(["ROLE_CUSTOMER"]);
  100.             if ($form['password']->getData()) {
  101.                 $user->setPassword($passwordEncoder->hashPassword(
  102.                     $user,
  103.                     $form['password']->getData()
  104.                 ));
  105.             }
  106.             $logo $form->get('logo')->getData();
  107.             $dir $this->getParameter('kernel.project_dir') . '/public/uploads/logos/';
  108.             if (!is_dir($this->getParameter('kernel.project_dir') . '/public/uploads/logos/')) {
  109.                 mkdir($this->getParameter('kernel.project_dir') . '/public/uploads/logos/'0755true);
  110.             }
  111.             if ($logo) {
  112.                 $fileName $fileUploader->upload($logo$dir$logo->guessExtension());
  113.                 $user->setLogo($fileName);
  114.             }
  115.             $fileDiplome $form->get('diplome_copy')->getData();
  116.             $dir $this->getParameter('kernel.project_dir') . '/public/uploads/diplomes/';
  117.             if (!is_dir($this->getParameter('kernel.project_dir') . '/public/uploads/diplomes/')) {
  118.                 mkdir($this->getParameter('kernel.project_dir') . '/public/uploads/diplomes/'0755true);
  119.             }
  120.             if ($fileDiplome) {
  121.                 $fileName $fileUploader->upload($fileDiplome$dir$fileDiplome->guessExtension());
  122.                 $user->setDiplomeCopy($fileName);
  123.             }
  124.             $fileAdeli $form->get('adeli_certif')->getData();
  125.             $dir $this->getParameter('kernel.project_dir') . '/public/uploads/adeli/';
  126.             if (!is_dir($this->getParameter('kernel.project_dir') . '/public/uploads/adeli/')) {
  127.                 mkdir($this->getParameter('kernel.project_dir') . '/public/uploads/adeli/'0755true);
  128.             }
  129.             if ($fileAdeli) {
  130.                 $fileName $fileUploader->upload($fileAdeli$dir$fileAdeli->guessExtension());
  131.                 $user->setAdeliCertif($fileName);
  132.             }
  133.             
  134.             $file $form->get('signature')->getData();
  135.             $dir $this->getParameter('kernel.project_dir') . '/public/uploads/signatures/';
  136.             if(!is_dir($this->getParameter('kernel.project_dir') . '/public/uploads/signatures/')){
  137.                 mkdir($this->getParameter('kernel.project_dir') . '/public/uploads/signatures/',0755true);
  138.             }
  139.             if ($file) {
  140.                 $fileName $fileUploader->upload($file$dir$file->guessExtension());
  141.                 $user->setSignature($fileName);
  142.             }
  143.             // $user->setRegisterToken(uniqid());
  144.             // $url = $this->generateUrl('security_confirm_register', ['email' => $user->getEmail(), 'token' => $user->getRegisterToken()], UrlGeneratorInterface::ABSOLUTE_URL);
  145.             // $mail = (new Email())
  146.             //     ->subject('Bienvenue sur Profil-diet ! Veuillez activer votre compte')
  147.             //     ->from(new Address($_ENV['MAILER_ADDRESS'], $_ENV['MAILER_NAME']))
  148.             //     ->to($user->getEmail())
  149.             //     ->html($this->renderView('email/validation.html.twig', array('user' => $user, "link" => $url)));
  150.             // $mailer->send($mail);
  151.             
  152.             $mail = (new Email())
  153.                 ->subject('Bienvenue chez Profil-diet !')
  154.                 ->from(new Address($_ENV['MAILER_ADDRESS'], $_ENV['MAILER_NAME']))
  155.                 ->to($user->getEmail())
  156.                 ->html($this->renderView('email/en_attente_validation.html.twig', array('user' => $user)));
  157.             $mailer->send($mail);
  158.             $admins $em->getRepository(User::class)->findByRole("ROLE_ADMIN");
  159.             $adminEmails = [];
  160.             foreach($admins as $a) {
  161.                 $adminEmails[] = $a->getEmail();
  162.             }
  163.             $checkUrl $this->generateUrl('user_index', [], UrlGeneratorInterface::ABSOLUTE_URL);
  164.             $mail = (new Email())
  165.                 ->subject('PROFIL- DIET : une nouvelle demande d\'essai gratuit vous attend !')
  166.                 ->from(new Address($_ENV['MAILER_ADDRESS'], $_ENV['MAILER_NAME']))
  167.                 ->to(...$adminEmails)
  168.                 ->html($this->renderView('email/nouveau_client.html.twig', array('patient' => $user'url' => $checkUrl)));
  169.             $mailer->send($mail);
  170.             $em $this->doctrine->getManager();
  171.             $em->persist($user);
  172.             $em->flush();
  173.             $session->getFlashBag()->add('success'"Merci pour votre inscription, un administrateur va vérifier les données saisies avant d’activer le compte, vous recevrez une confirmation par e-mail");
  174.             return $this->redirectToRoute('app_login');
  175.         }
  176.         return $this->render('security/register.html.twig', ['form' => $form->createView(), 'last_username' => $lastUsername'error' => $error]);
  177.     }
  178.     /**
  179.      * @Route("/confirmation-inscription", name="security_confirm_register")
  180.      */
  181.     public function confirmRegister(Request $requestTool $toolUrlGeneratorInterface $routerMailerInterface $mailer)
  182.     {
  183.         $em $this->doctrine->getManager();
  184.         $session $this->requestStack->getSession();
  185.         $email $request->query->get('email');
  186.         $token $request->query->get('token');
  187.         $checkEmail $em->getRepository(User::class)->findOneBy(array("email" => $email));
  188.         if (!$checkEmail) {
  189.             $session->getFlashBag()->add('error'"L'adresse e-mail renseignée n'existe pas.");
  190.             return $this->redirectToRoute('app_register');
  191.         } else {
  192.             $checkEmail->setRegisterToken("");
  193.             $checkEmail->setIsActive(true);
  194.             $em->persist($checkEmail);
  195.             $em->flush();
  196.             $session $this->requestStack->getSession();
  197.             $session->getFlashBag()->add('success'"Félicitations, votre compte est bien validé, vous pouvez vous connecter");
  198.             return $this->redirectToRoute('app_login');
  199.         }
  200.     }
  201.     /**
  202.      * @Route("/confirmation-inscription-email", name="security_confirm_register_email")
  203.      */
  204.     public function confirmRegisterEmail(Request $requestTool $toolUrlGeneratorInterface $routerMailerInterface $mailer)
  205.     {
  206.         $em $this->doctrine->getManager();
  207.         $user $em->getRepository(User::class)->findOneBy(['email' => $request->request->get('email')]);
  208.         if(!$user) return $this->json(["success" => false"message" => "Adresse email invalide"]);
  209.         $user->setRegisterToken(uniqid());
  210.         $url $this->generateUrl('security_confirm_register', ['email' => $user->getEmail(), 'token' => $user->getRegisterToken()], UrlGeneratorInterface::ABSOLUTE_URL);
  211.         $mail = (new Email())
  212.             ->subject('Activation compte')
  213.             ->from(new Address($_ENV['MAILER_ADDRESS'], $_ENV['MAILER_NAME']))
  214.             ->to($user->getEmail())
  215.             ->html($this->renderView('email/template.html.twig', array('content' => 'Cliquez sur le bouton suivant pour activer votre compte et vous connecter.''user' => $user'button' => ["title" => "Me connecter""link" => $url])));
  216.         $mailer->send($mail);
  217.         $session $this->requestStack->getSession();
  218.         $em->persist($user);
  219.         $em->flush();
  220.         return $this->json(["success" => true"message" => "Email envoyé avec succès"]);
  221.     }
  222.     /**
  223.      * @Route("/mot-de-passe-perdu", name="security_reset_password")
  224.      */
  225.     public function resetPassword(Request $requestTool $toolUrlGeneratorInterface $routerMailerInterface $mailer)
  226.     {
  227.         if ($this->getUser()) {
  228.             return $this->redirectToRoute('dashboard_index');
  229.         }
  230.         if ($request->isMethod('post')) {
  231.             $em $this->doctrine->getManager();
  232.             $session $this->requestStack->getSession();
  233.             if (!$tool->captchaverify($request->get('recaptcha_response'))) {
  234.                 $session->getFlashBag()->add('error'"Erreur de sécurité avec le captcha code.");
  235.                 return $this->redirectToRoute('security_reset_password');
  236.             }
  237.             $email $request->request->get('email');
  238.             $checkEmail $em->getRepository(User::class)->findOneBy(array("email" => $email));
  239.             if (!$checkEmail) {
  240.                 $session->getFlashBag()->add('error'"L'adresse e-mail renseignée n'existe pas.");
  241.                 return $this->redirectToRoute('security_reset_password');
  242.             } else {
  243.                 $token $tool->generateToken();
  244.                 $checkEmail->setToken($token);
  245.                 $em->persist($checkEmail);
  246.                 $em->flush();
  247.                 $url $router->generate('security_update_password', ['email' => $checkEmail->getEmail(), 'token' => $checkEmail->getToken()], UrlGeneratorInterface::ABSOLUTE_URL);
  248.                 $message = (new Email())
  249.                     ->subject('Récupération de votre mot de passe')
  250.                     ->from(new Address($_ENV['MAILER_ADDRESS'], $_ENV['MAILER_NAME']))
  251.                     ->to($checkEmail->getEmail())
  252.                     ->html($this->renderView('email/reset_pwd.html.twig', array('user' => $checkEmail'url' => $url)));
  253.                 $mailer->send($message);
  254.                 $session->getFlashBag()->add('success'"Un e-mail de récupération de mot de passe a été envoyé.");
  255.                 return $this->redirectToRoute('app_logout');
  256.             }
  257.         }
  258.         return $this->render('security/reset_password.html.twig', []);
  259.     }
  260.     /**
  261.      * @Route("/mise-a-jour-mot-de-passe/{email}/{token}", name="security_update_password")
  262.      */
  263.     public function updatePassword(Request $request$email$tokenUserPasswordHasherInterface $hasherEventDispatcherInterface $eventDispatcher)
  264.     {
  265.         $em $this->doctrine->getManager();
  266.         $session $this->requestStack->getSession();
  267.         $checkUser $em->getRepository(User::class)->findOneBy(array("email" => $email"token" => $token));
  268.         if (!$checkUser) {
  269.             $session->getFlashBag()->add('error'"La page demandée n'existe pas.");
  270.             return $this->redirectToRoute('security_reset_password');
  271.         }
  272.         if ($request->isMethod('post')) {
  273.             $password $request->request->get('password');
  274.             if (!hash_equals($request->request->get('password'), $request->request->get('confirm_password'))) {
  275.                 $session->getFlashBag()->add('error'"Les deux mots de passe sont différents");
  276.                 return $this->redirectToRoute('security_update_password', ['email' => $checkUser->getEmail(), 'token' => $checkUser->getToken()]);
  277.             } else if (!$password) {
  278.                 $session->getFlashBag()->add('error'"Le mot de passe est obligatoire");
  279.                 return $this->redirectToRoute('security_update_password', ['email' => $checkUser->getEmail(), 'token' => $checkUser->getToken()]);
  280.             } else {
  281.                 $password $hasher->hashPassword($checkUser$request->request->get('password'));
  282.                 $checkUser->setPassword($password);
  283.                 $checkUser->setToken(null);
  284.                 $checkUser->setIsActive(true);
  285.                 $token = new UsernamePasswordToken($checkUser'main'$checkUser->getRoles());
  286.                 $this->container->get('security.token_storage')->setToken($token);
  287.                 $session->set('_security_main'serialize($token));
  288.                 $event = new InteractiveLoginEvent($request$token);
  289.                 $eventDispatcher->dispatch($event'security.interactive_login');
  290.         
  291.                 $em->persist($checkUser);
  292.                 $em->flush();
  293.                 $session->getFlashBag()->add('success'"Votre mot de passe a été mis à jour !");
  294.                 // $session->invalidate();
  295.                 return $this->redirectToRoute('dashboard_index');
  296.             }
  297.         }
  298.         return $this->render('security/update_password.html.twig', []);
  299.     }
  300.     /**
  301.      * @Route("/changement-agence/{id}/{role_id}", name="switch_agency")
  302.      */
  303.     public function switchCustomer(AuthenticationUtils $authenticationUtils$id$role_id)
  304.     {
  305.         $em $this->doctrine->getManager();
  306.         $session $this->requestStack->getSession();
  307.         $user $this->container->get('security.token_storage')->getToken()->getUser();
  308.         $agency $em->getRepository(Agency::class)->find($id);
  309.         $role $em->getRepository(DataRole::class)->find($role_id);
  310.         $checkUserRole $em->getRepository(UserAgency::class)->findOneBy(array("agency" => $agency"role" => $role));
  311.         if ($checkUserRole) {
  312.             $user->setAgency($agency);
  313.             $user->setRole($role);
  314.             $em->persist($user);
  315.             $em->flush();
  316.         } else if ($id == && $role_id == && $this->isGranted('ROLE_ADMIN')) {
  317.             $user->setAgency(NULL);
  318.             $user->setRole(NULL);
  319.             $em->persist($user);
  320.             $em->flush();
  321.         }
  322.         //echo $user->getAgency()->getId();die;
  323.         return $this->redirectToRoute('dashboard_index');
  324.     }
  325.     /**
  326.      * @Route("/logout", name="app_logout")
  327.      */
  328.     public function logout()
  329.     {
  330.         $session $this->requestStack->getSession();
  331.         $session->getFlashBag()->add('success'"Déconnexion !");
  332.         return $this->redirectToRoute('app_login');
  333.     }
  334. }