src/Controller/DefaultController.php line 89

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Contact;
  4. use App\Entity\Requests;
  5. use App\Entity\User;
  6. use App\Form\ContactType;
  7. use App\Form\ResetPasswordScreenType;
  8. use App\Form\ResetPasswordType;
  9. use App\Form\User\UserCreateAccountType;
  10. use App\Form\User\UserCreateProfileType;
  11. use App\Form\User\UserMakeRequestType;
  12. use App\Repository\UserRepository;
  13. use App\Services\EmailService;
  14. use App\Utilities\Random;
  15. use DateTime;
  16. use Doctrine\ORM\EntityManagerInterface;
  17. use Random\RandomException;
  18. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  19. use Symfony\Component\Form\FormError;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  23. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  24. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  25. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  26. use Symfony\Component\Routing\Annotation\Route;
  27. use Symfony\Component\Security\Core\Security;
  28. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  29. use Symfony\Component\String\Slugger\SluggerInterface;
  30. /**
  31.  * Gestion de la page d'accueil du site
  32.  */
  33. class DefaultController extends AbstractController
  34. {
  35.     /**
  36.      * @var EntityManagerInterface
  37.      */
  38.     private $em;
  39.     /**
  40.      * @var Sluggerinterface
  41.      */
  42.     private $slugger;
  43.     public function __construct(EntityManagerInterface $emSluggerInterface $slugger)
  44.     {
  45.         $this->em $em;
  46.         $this->slugger $slugger;
  47.     }
  48.     /**
  49.      * Gestion de la page d'accueil
  50.      *
  51.      * @Route("/", name="app_default_index")
  52.      *
  53.      * @return Response
  54.      */
  55.     public function index(): Response
  56.     {
  57.         return $this->render("home/index-new.html.twig");
  58.     }
  59.     /**
  60.      * Page participation
  61.      *
  62.      * @Route("/participation", name="app_default_participation")
  63.      *
  64.      * @return Response
  65.      */
  66.     public function participation(): Response
  67.     {
  68.         return $this->render("home/participation-new.html.twig");
  69.     }
  70.     /**
  71.      * Page faq
  72.      *
  73.      * @Route("/foire-aux-questions", name="app_default_faq")
  74.      *
  75.      * @return Response
  76.      */
  77.     public function faq(): Response
  78.     {
  79.         return $this->render("home/faq-new.html.twig");
  80.     }
  81.     /**
  82.      * Création d'un compte pour un nouveau utilisateur
  83.      *
  84.      * @Route("/creation-de-compte", name="app_user_register")
  85.      *
  86.      * @param Request $request
  87.      * @param TokenGeneratorInterface $tokenGeneratorInterface
  88.      * @param EmailService $emailService
  89.      *
  90.      * @return Response
  91.      * @throws TransportExceptionInterface
  92.      */
  93.     public function createAccount(Request $requestTokenGeneratorInterface $tokenGeneratorInterfaceEmailService $emailService): Response
  94.     {
  95.         $user = new User;
  96.         $form $this->createForm(UserCreateAccountType::class, $user);
  97.         $form->handleRequest($request);
  98.         //dd($user);
  99.         if ($form->isSubmitted() && $form->isValid()) {
  100.             $user->setVerified(false)
  101.                 ->setVerifiedToken(sha1($tokenGeneratorInterface->generateToken()))
  102.                 ->setVerifiedExpiration((new \DateTimeImmutable)->modify('1 hours'));
  103.             $this->em->persist($user);
  104.             $this->em->flush();
  105.             $emailService->send('email_create_account'$user'Création de compte', []);
  106.             $this->addFlash('success'"Votre compte a été crée, un mail vous a été envoyé pour confirmation.");
  107.             return $this->redirectToRoute('app_default_index');
  108.         }
  109.         return $this->render('home/create_account.html.twig', ['form' => $form->createView()]);
  110.     }
  111.     /**
  112.      * @Route("verify", name="app_verify_email")
  113.      *
  114.      * @param Request $request
  115.      * @param EntityManagerInterface $entityManagerInterface
  116.      * @param EmailService $emailService
  117.      * @param TokenGeneratorInterface $tokenGeneratorInterface
  118.      * @param UserPasswordHasherInterface $userPasswordHasherInterface
  119.      * @return Response
  120.      * @throws TransportExceptionInterface
  121.      */
  122.     public function verifyEmail(Request $requestEntityManagerInterface $entityManagerInterfaceEmailService $emailServiceTokenGeneratorInterface $tokenGeneratorInterfaceUserPasswordHasherInterface $userPasswordHasherInterface): Response
  123.     {
  124.         if ($request->query->get('token') === null) {
  125.             $this->createNotFoundException();
  126.         }
  127.         $user $entityManagerInterface->getRepository(User::class)->findOneBy(['verifiedToken' => $request->query->get('token')]);
  128.         if ($user === null) {
  129.             return $this->redirectToRoute('app_default_index');
  130.         };
  131.         if ($user->getVerifiedExpiration()->getTimestamp() < (new \DateTimeImmutable)->getTimestamp()) {
  132.             $user->setVerifiedExpiration((new \DateTimeImmutable)->modify('1 hours'))
  133.                 ->setVerifiedToken(sha1($tokenGeneratorInterface->generateToken()));
  134.             $entityManagerInterface->persist($user);
  135.             $entityManagerInterface->flush();
  136.             $emailService->send('email_create_account'$user'Création de compte', []);
  137.             $this->addFlash('warning'"Un mail de comfirmation de compte vous a été envoyé, veuillez confirmer votre email pour acceder à notre service.");
  138.             return $this->redirectToRoute('app_default_index');
  139.         }
  140.         $defaultPassword Random::randomString(8);
  141.         $user->setPassword($userPasswordHasherInterface->hashPassword($user$defaultPassword))
  142.             ->setVerified(true)
  143.             ->setVerifiedExpiration(null)
  144.             ->setVerifiedToken(null)
  145.             ->setLocked(false);
  146.         $entityManagerInterface->persist($user);
  147.         $entityManagerInterface->flush();
  148.         $emailService->send('email_customer_lock_status'$user'[GRAND PRIX ANSUTEN]'compact('defaultPassword'));
  149.         $this->addFlash('success'"Votre adresse e-mail a été vérifiée ! Un e-mail contenant vos informations d'accès à la plateforme vous a été envoyé.");
  150.         return $this->redirectToRoute('app_default_index');
  151.     }
  152.     /**
  153.      * Création de profil d'un nouvel utilisateur
  154.      *
  155.      * @Route("/faire-une-demande/creation-de-compte-profile", name="app_user_request_account_create_step_2")
  156.      *
  157.      * @param Request $request
  158.      * @param UserPasswordHasherInterface $hash
  159.      * @param EmailService $emailService
  160.      * @return Response
  161.      * @throws TransportExceptionInterface|RandomException
  162.      */
  163.     public function createProfile(Request $requestUserPasswordHasherInterface $hashEmailService $emailService): Response
  164.     {
  165.         $user $request->getSession()->get('newRequester');
  166.         if ($user === null) throw new AccessDeniedHttpException();
  167.         $form $this->createForm(UserCreateProfileType::class, $user);
  168.         $form->handleRequest($request);
  169.         $certificate $form->get('certificateFiles')->getData();
  170.         if (
  171.             $certificate == null
  172.             && ($user->getProfile() == 'Collectivité(Préfecture,Mairie)'
  173.                 || $user->getProfile() == "ONG,Association")
  174.         ) {
  175.             $form->get('certificateFiles')->addError(new FormError('Veuillez téleverser les documents légaux de votre entité.'));
  176.         }
  177.         if ($form->isSubmitted() && $form->isValid()) {
  178.             if (
  179.                 $user->getProfile() == 'Collectivité(Préfecture,Mairie)'
  180.                 || $user->getProfile() == "ONG,Association"
  181.             ) {
  182.                 $time time();
  183.                 $t intval(substr($time, (strlen($time) - 3)));
  184.                 $token intval(substr(mt_rand(), 04)) . $t;
  185.                 $user->setToken($token);
  186.             } else {
  187.                 $user->setToken($user->getCardNumber());
  188.             }
  189.             $defaultPassword self::randomString(8);
  190.             $user
  191.                 ->setPassword($hash->hashPassword($user$defaultPassword))->setRoles(['ROLE_USER']);
  192.             $this->em->persist($user);
  193.             $this->em->flush();
  194.             $emailService->send('email_send_password'$user"Création de compte", ['defaultPassword' => $defaultPassword]);
  195.             $emailService->sendAdmin('email_creation_account'$user"Création de compte");
  196.             $request->getSession()->remove('newRequester');
  197.             //$request->getSession()->remove('code_country');
  198.             $this->addFlash('success'"Votre compte a été créé, veuillez consulter votre boite mail.");
  199.             return $this->redirectToRoute('app_user_request_create', ['id' => $user->getId()]);
  200.         }
  201.         return $this->render('home/create_profile.html.twig', [
  202.             'form' => $form->createView(),
  203.         ]);
  204.     }
  205.     /**
  206.      * Création d'une demande d'un nouveau utilisateur
  207.      *
  208.      * @Route("/faire-une-demande/{id}/definition-du-besoin",name="app_user_request_create")
  209.      *
  210.      * @param User $user
  211.      *
  212.      * @param Request $request
  213.      *
  214.      * @return Response
  215.      */
  216.     public function createRequest(Request $requestEmailService $emailServiceUser $user): Response
  217.     {
  218.         $requests = new Requests();
  219.         $form $this->createForm(UserMakeRequestType::class, $requests);
  220.         $form->handleRequest($request);
  221.         if ($form->isSubmitted() && $form->isValid()) {
  222.             $requests->setUserRequest($user)->setStatus('transmise')->setSlug($this->slugger->slug($requests->getRequirement(), '-'));
  223.             $this->em->persist($requests);
  224.             $this->em->flush();
  225.             $emailService->send('email_create_new_request'$user"Transmission de votre demande", ['request' => $requests]);
  226.             $emailService->sendAdmin('email_receive_new_request'$user"Nouvelle demande", ['request' => $requests]);
  227.             $this->addFlash('account-success'$user->getEmail());
  228.             $request->getSession()->remove('newRequester');
  229.             return $this->redirectToRoute('app_default_index');
  230.         }
  231.         return $this->render('home/create_request.html.twig', ['form' => $form->createView(), 'id_user' => $user->getId()]);
  232.     }
  233.     /**
  234.      * Annulation de la création de la nouvelle demande pour un nouveau utilisateur
  235.      *
  236.      * @Route("/{id}/annuler-la-demande", name="app_user_request_cancel")
  237.      *
  238.      * @param Requests $request
  239.      *
  240.      * @param EntityManagerInterface $em
  241.      *
  242.      * @return Response
  243.      */
  244.     public function cancelRequest(Requests $requestEntityManagerInterface $em): Response
  245.     {
  246.         $user $request->getUserRequest();
  247.         $em->remove($request);
  248.         $em->remove($user);
  249.         $em->flush();
  250.         return $this->redirectToRoute('app_default_index');
  251.     }
  252.     /**
  253.      * Recherche l'adresse mail pour une réinitialisation
  254.      * de mot de passe d'un compte utilisateur
  255.      *
  256.      * @Route("/demande-de-mot-de-passe-oublie", name="app_user_screen_reset_password", methods={"GET","POST"})
  257.      *
  258.      * @param UserRepository $userRepository
  259.      *
  260.      * @param Request $request
  261.      *
  262.      * @param EmailService $emailService
  263.      *
  264.      * @return Response
  265.      * @throws TransportExceptionInterface
  266.      */
  267.     public function screenPasswordUpadate(UserRepository $userRepositoryRequest $requestEmailService $emailService): Response
  268.     {
  269.         $form $this->createForm(ResetPasswordScreenType::class);
  270.         $form->handleRequest($request);
  271.         if ($form->isSubmitted() && $form->isValid()) {
  272.             $email $form->get('email')->getData();
  273.             $user $userRepository->findOneBy(['email' => $email]);
  274.             if ($user !== null) {
  275.                 $data = [
  276.                     'email' => $email,
  277.                     'expire' => (new DateTime())->modify('15 minutes')->getTimestamp(),
  278.                 ];
  279.                 $token self::decrypt_encrypt_token('encrypt'$data);
  280.                 $this->addFlash('success'"Un mail vous a été envoyé pour la modification de votre mot de passe.");
  281.                 // Envoi d'email de reinitialisation de compte
  282.                 $emailService->send("email_reset_password"$user"Demande de modification de mot de passe"compact('token'));
  283.             } else {
  284.                 $this->addFlash('warning'"Cette adresse e-mail est introuvable");
  285.             }
  286.         }
  287.         return $this->render('security/screen_reset_password.html.twig', ['form' => $form->createView()]);
  288.     }
  289.     /**
  290.      * Réinitialisation de mot de passe d'un compte utilisateur
  291.      *
  292.      * @Route("/reinitialisation-de-mot-de-passe/{token}", name="app_user_reset_password")
  293.      *
  294.      * @param $token
  295.      * @param UserRepository $userRepository
  296.      *
  297.      * @param Request $request
  298.      *
  299.      * @param UserPasswordHasherInterface $userPasswordHasherInterface
  300.      *
  301.      * @param EntityManagerInterface $em
  302.      *
  303.      * @param EmailService $emailService
  304.      *
  305.      * @return Response
  306.      * @throws TransportExceptionInterface
  307.      */
  308.     public function forgotPassword($tokenUserRepository $userRepositoryRequest $requestUserPasswordHasherInterface $userPasswordHasherInterfaceEntityManagerInterface $emEmailService $emailService): Response
  309.     {
  310.         if ($token === null) {
  311.             throw new NotFoundHttpException('Desolé, cette URL est invalide');
  312.         }
  313.         $decryptToken self::decrypt_encrypt_token('decrypt'$token);
  314.         $expire $decryptToken['expire'];
  315.         $email $decryptToken['email'];
  316.         if ($expire time()) {
  317.             $this->addFlash('danger'"L'URL pour la réinitialisation de votre mot de passe a expiré");
  318.             return $this->redirectToRoute('app_login');
  319.         }
  320.         $form $this->createForm(ResetPasswordType::class);
  321.         $form->handleRequest($request);
  322.         if ($form->isSubmitted() && $form->isValid()) {
  323.             $user $userRepository->findOneBy(['email' => $email]);
  324.             $password $form->get('password')->getData();
  325.             if ($user !== null) {
  326.                 $user->setPassword($userPasswordHasherInterface->hashPassword($user$password))
  327.                     ->setUpdatedPassword(true);
  328.                 $em->persist($user);
  329.                 $em->flush();
  330.                 $emailService->send("email_reset_password_success"$user'Modification de mot de passe', []);
  331.                 $this->addFlash('success''Votre mot de passe a bien été modifié.');
  332.                 if ($request->query->get('rd') === 'user') {
  333.                     return $this->redirectToRoute('app_user_index');
  334.                 }
  335.             }
  336.             return $this->redirectToRoute('app_login');
  337.         }
  338.         return $this->render("security/reset_password.html.twig", ['form' => $form->createView()]);
  339.     }
  340.     /**
  341.      * Gestion de formulaire de contact
  342.      * pour q'un utilisateur puisse contacter l'ANSUTEN depuis la plateforme
  343.      *
  344.      * @Route("/contacter", name="app_contact_use")
  345.      *
  346.      * @param Request $request
  347.      *
  348.      * @param EmailService $emailService
  349.      *
  350.      * @param Security $security
  351.      *
  352.      * @return Response
  353.      * @throws TransportExceptionInterface
  354.      */
  355.     public function contact_use(Request $requestEmailService $emailServiceSecurity $security): Response
  356.     {
  357.         $contact = new Contact();
  358.         $form $this->createForm(ContactType::class, $contact);
  359.         $form->handleRequest($request);
  360.         if ($form->isSubmitted() && $form->isValid()) {
  361.             $emailService->sendContactUse('email_receive_message_from_user'$contact"Nouveau message");
  362.             $this->addFlash('success'"Merci de votre intérêt, votre message a été enovoyé.");
  363.             return $this->redirectToRoute('app_default_index');
  364.         }
  365.         return $this->render('home/contact_use.html.twig', [
  366.             'form' => $form->createView(),
  367.         ]);
  368.     }
  369.     /**
  370.      * @Route("/en-savoir-plus", name="app_about_use")
  371.      * @param Request $request
  372.      *
  373.      * @return Response
  374.      */
  375.     public function about_use(Request $request): Response
  376.     {
  377.         return $this->render('/home/about_use.html.twig');
  378.     }
  379.     /**
  380.      * Cryptage et décryptage du token de réinitialisation de mot de passe
  381.      *
  382.      * @param string $action
  383.      *
  384.      * @param mixed $data
  385.      *
  386.      * @return bool|string|array
  387.      */
  388.     public static function decrypt_encrypt_token(string $action$data)
  389.     {
  390.         $encrypt_method "AES-256-CBC";
  391.         $secret_key 'ANSUTEN-GUINEE-2022-BRAINSENSE';
  392.         $secret_iv '123456789101112';
  393.         $key hash('sha256'$secret_key);
  394.         $iv substr(hash('sha256'$secret_iv), 016);
  395.         $result false;
  396.         if ($action === 'decrypt') {
  397.             $result json_decode(openssl_decrypt(base64_decode($data), $encrypt_method$key0$iv), true);
  398.         } else if ($action === 'encrypt') {
  399.             $result base64_encode(openssl_encrypt(json_encode($data), $encrypt_method$key0$iv));
  400.         }
  401.         return $result;
  402.     }
  403.     /**
  404.      * Fonction de génération de lettre et chiffre
  405.      * pour la génération d'un mot de passe aléatoir
  406.      *
  407.      * @param int $max la taille maximum de la chaine génerée
  408.      *
  409.      * @return string
  410.      * @throws RandomException
  411.      */
  412.     private static function randomString(int $max 8): string
  413.     {
  414.         $char '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  415.         $randomString "";
  416.         for ($i 0$i $max$i++) {
  417.             $index random_int(0strlen($char) - 1);
  418.             $randomString .= $char[$index];
  419.         }
  420.         return $randomString;
  421.     }
  422. }
  423. # zepekegno <moussa.traore-interne@brainsense.fr>