src/Controller/SecurityController.php line 25

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\SMS;
  4. use Symfony\Component\Mime\Email;
  5. use App\Repository\UserRepository;
  6. use App\Form\ResetPasswordFormType;
  7. use App\Form\SetSMSFormType;
  8. use App\Form\InitPasswordFormType;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Component\Mailer\MailerInterface;
  11. use Symfony\Component\HttpFoundation\Request ;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  17. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  18. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  19. class SecurityController extends AbstractController
  20. {
  21.     #[Route(path'/login'name'app_login')]
  22.     public function login(AuthenticationUtils $authenticationUtils): Response
  23.     {
  24.         if ($this->getUser()) {
  25.             return $this->redirectToRoute('app_home');
  26.         }
  27.         // get the login error if there is one
  28.         $error $authenticationUtils->getLastAuthenticationError();
  29.         // last username entered by the user
  30.         $lastUsername $authenticationUtils->getLastUsername();
  31.         return $this->render('security/login.html.twig', [
  32.                             'last_username' => $lastUsername
  33.                             'error' => $error
  34.                         ]);
  35.     }
  36.     #[Route(path'/logout'name'app_logout')]
  37.     public function logout(): void
  38.     {
  39.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  40.     }    
  41.     #[Route(path'/forget-pass'name'app_forgetPassword')]
  42.     public function forgetPass(Request $requestUserRepository $userRepository,
  43.                                 TokenGeneratorInterface $tokenGenerator,
  44.                                 EntityManagerInterface $entityManager,
  45.                                 MailerInterface $mailer): Response
  46.     {
  47.         $form $this->createForm(ResetPasswordFormType::class);
  48.         $form->handleRequest($request);
  49.        
  50.         if ($form->isSubmitted() && $form->isValid()) {  
  51.             $email $form->get('email')->getData();      
  52.             $user $userRepository->findOneBy([
  53.                 'email' => $email 
  54.             ]);
  55.             if($user) {
  56.                 /* envoi par mail */
  57.                 // si user existe génère un token de réinitilisation -> on utilise le Tokengenerator de symfony
  58.                 /*
  59.                 $token = $tokenGenerator->generateToken();
  60.                 $user->setResetToken($token);
  61.                 $entityManager->persist($user);
  62.                 $entityManager->flush();
  63.                 
  64.                 // on génére un lien réinitilisation de mot de passe
  65.                 $baseUrl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
  66.                 $url = $baseUrl . $this->generateUrl('app_resetPassword', ['token' => $token, UrlGeneratorInterface::ABSOLUTE_URL]);
  67.                 */
  68.                 // Données du mail
  69.                 /*
  70.                 $html = '<p>Bonjour ' . $user->getNom() . ' ' . $user->getPrenom() . '</p>
  71.                         <p>Afin de réinitialiser votre mot de passe, veillez cliquer sur ce lien:</p>
  72.                         <a href=" '. $url . ' ">' . $url . '</a>  
  73.                         <p>Meilleures salutations</p>';
  74.                 $email = (new Email())
  75.                     ->from('mbe@vertotek.com')
  76.                     ->to($user->getEmail())
  77.                     ->subject('Réinitilisation de mot de passe')
  78.                     
  79.                     ->html($html);
  80.                 $mailer->send($email);
  81.         
  82.                 $this->addFlash('success', 'Email envoyé avec succès');
  83.                 //return $this->redirectToRoute('app_login');
  84.                 return $this->render('security/reset_password_message.html.twig', [
  85.                     'user' => $user
  86.                 ]);
  87.                 */
  88.                 /**** fin de l'envoi par mail */
  89.                 $token random_int(100000999999);
  90.                 //$token = 224466;
  91.         
  92.                 $phone_number $user->getPhoneNumber();
  93.                 $hidden_number '';
  94.                 for($i 0$i strlen($phone_number) - 4$i++) {
  95.                     $hidden_number $hidden_number '*'
  96.                 }
  97.                 $hidden_number $hidden_number substr($phone_number, -4);
  98.                 
  99.                 if($phone_number != null) { 
  100.                     // On sauvegarde la date de creation de token
  101.                     $user->setResetToken($token);
  102.                     $user->setResetTokenCreatedAt(new \DateTimeImmutable());
  103.                     $entityManager->persist($user);
  104.                     $entityManager->flush();
  105.                 
  106.                     $sender 'Apol - Time Manager';
  107.                     $str_sms 'APOL votre de code de validation: '$token;
  108.                     //Envoi SMS 
  109.                     $arr_data_from_sms = [];
  110.                     $status '';
  111.                     $credits '';
  112.                     $message '';
  113.                    
  114.                     $arr_data_from_sms $this->sendSMS($str_sms$phone_number$sender);
  115.                     $status 1;
  116.                     if(isset($arr_data_from_sms['status'])) $status $arr_data_from_sms['status'];
  117.                     if(isset($arr_data_from_sms['credits'])) $credits $arr_data_from_sms['credits'];
  118.                     if(isset($arr_data_from_sms['message'])) $message $arr_data_from_sms['message'];
  119.                     
  120.                     $sms = new Sms();
  121.                     $sms->setStatus($status);
  122.                     $sms->setCredits($credits);
  123.                     $sms->setMessage($message);
  124.                     $sms->setPhoneNumber($phone_number);
  125.                     $entityManager->persist($sms);
  126.                     $entityManager->flush();
  127.                     if($status === 1) {
  128.                         $this->addFlash('success''Merci de saisir le code que vous avez reçu par SMS au '$hidden_number);
  129.                         return $this->redirectToRoute('app_set_sms');
  130.                     } else {
  131.                         $this->addFlash('danger''Problème avec l\'envoi de SMS. Merci de contacter votre administrateur');
  132.                         return $this->redirectToRoute('app_login');
  133.                     }
  134.                    
  135.         
  136.                 } else {
  137.                     $this->addFlash('danger''Aucun no de mobile trouvé. Contactez votre administrateur');
  138.                 }
  139.                 return $this->render('security/reset_password_message.html.twig', [
  140.                         'user' => $user
  141.                          
  142.                     ]);
  143.             }
  144.             $this->addFlash('danger''Un problème est survenu');
  145.             return $this->redirectToRoute('app_login');
  146.         }
  147.     
  148.         return $this->render('security/reset_password_request.html.twig', [
  149.             'form' => $form->createView(),
  150.         ]);
  151.     }
  152.     #[Route(path'/set-sms'name'app_set_sms')]
  153.     public function setSms(Request $requestUserRepository $userRepository,
  154.                                 EntityManagerInterface $entityManager,
  155.                                 UserPasswordHasherInterface $userPasswordHasher): Response
  156.     {
  157.         //on vérifier si le token de l'utilisateur existe
  158.         
  159.         $form $this->createForm(SetSMSFormType::class);
  160.         $form->handleRequest($request);
  161.         if ($form->isSubmitted() && $form->isValid()) {  
  162.             $code $form->get('code')->getData();
  163.              
  164.             $user $userRepository->findOneByResetToken($code);
  165.               
  166.             if($user) {
  167.                 return $this->redirectToRoute('app_resetPassword', ['token' => $code], Response::HTTP_SEE_OTHER);
  168.                 //return $this->redirect('app_resetPassword', array('token' => $code));
  169.             } else {
  170.                 $this->addFlash('danger''Code SMS invalide ');
  171.             }
  172.         }    
  173.         return $this->render('security/set_sms.html.twig', [
  174.                 'form' => $form->createView()    
  175.         ]);
  176.         
  177.     }
  178.     #[Route(path'/reset-pass/{token}'name'app_resetPassword')]
  179.     public function resetPass(String $tokenRequest $requestUserRepository $userRepository,
  180.                                 EntityManagerInterface $entityManager,
  181.                                 UserPasswordHasherInterface $userPasswordHasher): Response
  182.     {
  183.         //on vérifier si le token de l'utilisateur existe
  184.         $user $userRepository->findOneByResetToken($token);
  185.         if($user) {
  186.             $form $this->createForm(InitPasswordFormType::class);
  187.             $form->handleRequest($request);
  188.        
  189.             if ($form->isSubmitted() && $form->isValid()) {  
  190.                 $user->setResetToken('');
  191.                 $user->setPassword(
  192.                     $userPasswordHasher->hashPassword(
  193.                         $user,
  194.                         $form->get('plainPassword')->getData()
  195.                     )
  196.                 );
  197.                 $entityManager->persist($user);
  198.                 $entityManager->flush();
  199.                 $this->addFlash('success''Mot de passe enregistré avec succès');
  200.                 return $this->redirectToRoute('app_login');
  201.             }    
  202.             return $this->render('security/init_password.html.twig', [
  203.                 'form' => $form->createView()
  204.             ]);
  205.         }
  206.         $this->addFlash('danger''Jeton invalid');
  207.         return $this->redirectToRoute('app_login');
  208.     }
  209.     #[Route('/mobileApi/forget-pass'name'mobile_api_forgetPassword'methods: ['POST'])]
  210.     public function mobileForgetPassword(Request $request,
  211.                             UserRepository $userRepository,
  212.                             EntityManagerInterface $entityManager,
  213.                             MailerInterface $mailer): Response         
  214.     {
  215.         $json_in $request->getContent();
  216.         $obj_data json_decode($json_in); 
  217.         
  218.         $email $obj_data->email;
  219.         $user $userRepository->findOneBy([
  220.             'email' => $email 
  221.         ]);
  222.         if($user) {
  223.             $token random_int(100000999999);
  224.             //$token = 224466;
  225.             $phone_number $user->getPhoneNumber();
  226.             if($phone_number != null) { 
  227.                 // On sauvegarde la date de creation de token
  228.                 $user->setResetToken($token);
  229.                 $user->setResetTokenCreatedAt(new \DateTimeImmutable());
  230.                 $entityManager->persist($user);
  231.                 $entityManager->flush();
  232.             
  233.                 $sender 'Apol - Time Manager';
  234.                 $str_sms 'APOL votre de code de validation: '$token;
  235.                 $this->sendSMS($str_sms$phone_number$sender);
  236.                 $arr_response = [ 
  237.                     'code' => 200
  238.                     'user_id' => $user->getId(),
  239.                     'token_code' => $token,
  240.                     'message' => 'Merci de saisir le code que vous avez reçu par SMS'
  241.                 ];
  242.             } else {
  243.                 $arr_response = [ 
  244.                     'code' => 204
  245.                     'message' => 'Aucun no de mobile trouvé. Merci de contacter votre administrateur'
  246.                 ];
  247.             }
  248.         } else {
  249.             $arr_response = [ 
  250.                 'code' => 400
  251.                 'message' => 'Une erreur s\'est produite. Merci de contacter votre administrateur',
  252.             ];            
  253.         }
  254.         return $this->json($arr_response);     
  255.     }
  256.     private function sendSMS(String $str_smsString $phone_number$sender)
  257.     {
  258.         $apol_token "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI3MzM3NyIsImlhdCI6MTY3NjE1NDExOS4xMjc1MX0.60yTcAmlGChiWGQ3Dnh82rsefNHa1pHGUsunPjQmh0o";
  259.         $token $apol_token;
  260.         $content $str_sms;
  261.         $numbers = array($phone_number);
  262.         $sender $sender;
  263.         $recipients = array();
  264.         
  265.         foreach ($numbers as $n) {
  266.             $recipients[] = array('value' => $n);
  267.         }
  268.         $postdata = array(
  269.             'sms' => array(
  270.                 'message' => array(
  271.                     'text' => $content,
  272.                     'sender' => $sender
  273.                 ),
  274.             'recipients' => array('gsm' => $recipients)
  275.             )
  276.         );
  277.         
  278.         $ch curl_init();
  279.         curl_setopt($chCURLOPT_URL"https://api.smsup.ch/send");
  280.         curl_setopt($chCURLOPT_RETURNTRANSFER,1);
  281.         curl_setopt($chCURLOPT_POST1);
  282.         curl_setopt($chCURLOPT_POSTFIELDSjson_encode($postdata));
  283.         curl_setopt($chCURLOPT_HTTPHEADER, array('Content-Type: application/json''Accept: application/json''Authorization: Bearer ' $token));
  284.         $smsUp_response curl_exec($ch);
  285.         curl_close($ch);
  286.         /* 
  287.         $smsResponse ='{"status":1,"message":"OK","ticket":"182384518","cost":1,"credits":49,
  288.             "total":1,"sent":1,"blacklisted":0,"duplicated":0,"invalid":0,"npai":0}';
  289.         $obj_data = json_decode($smsResponse); 
  290.         */
  291.         $obj_data json_decode($smsUp_response); 
  292.         $status $obj_data->status;
  293.         $message $obj_data->message;
  294.         $credits $obj_data->credits;
  295.         
  296.         return [
  297.             'status' => $status,
  298.             'message' => $message,
  299.             'credits' => $credits
  300.         ];
  301.     }
  302.     /*
  303.     * Réception du code depuis le mobile 
  304.     */
  305.     #[Route('/mobileApi/reset-pass'name'mobile_api_resetPassword'methods: ['POST'])]
  306.     public function moibleGetTokenPassword(Request $requestUserRepository $userRepository,
  307.                                 EntityManagerInterface $entityManager,
  308.                                 UserPasswordHasherInterface $userPasswordHasher): Response
  309.     {
  310.         //on vérifier si le token de l'utilisateur existe
  311.         try{ 
  312.             $json_in $request->getContent();
  313.             $obj_data json_decode($json_in); 
  314.             $uid =  $obj_data->user_id;
  315.             $plainPassword $obj_data->password;
  316.             $user $userRepository->findOneBy([
  317.                 'id' => $uid 
  318.             ]);
  319.             if($user) {
  320.                 $user->setResetToken('');
  321.                 $user->setPassword(
  322.                     $userPasswordHasher->hashPassword(
  323.                         $user,
  324.                         $plainPassword
  325.                     )
  326.                 );
  327.                 $entityManager->persist($user);
  328.                 $entityManager->flush();
  329.                 
  330.                   
  331.                 return $this->json([
  332.                     'status' => 201,
  333.                     'user_id' => $user->getId(),
  334.                     'message' => 'Mot de passe enregistré avec succès'
  335.                 ]);
  336.             } else {
  337.                 return $this->json([
  338.                     'status' => 403,
  339.                     'user_id' => null,
  340.                     'message' => 'Une erreur s\'est produite. Merci de contacter votre administrateur'
  341.                 ]);                
  342.             }
  343.         } catch(Exception $e) {
  344.                 return $this->json([
  345.                 'status' => 400,
  346.                 'message' => $e->getMessage()
  347.             ]);
  348.         }        
  349.     }
  350.     
  351.     #[Route(path'/api/login'name'api_login')]
  352.     public function apiLogin(AuthenticationUtils $authenticationUtils): Response
  353.     {
  354.         $user $this->getUser();
  355.         return $this->json(['email' => 'mbe@mbe.com']);
  356.     }
  357.     #[Route('/mobileApi/logout'name'mobile_api_logout'methods: ['POST'])]
  358.     public function moibleLogout(Request $requestUserRepository $userRepository,
  359.                                 EntityManagerInterface $entityManager): Response
  360.     {
  361.         //on vérifier si le token de l'utilisateur existe
  362.         try{ 
  363.             $json_in $request->getContent();
  364.             $obj_data json_decode($json_in); 
  365.             $uid =  $obj_data->user_id;
  366.             $user $userRepository->findOneBy([
  367.                 'id' => $uid 
  368.             ]);
  369.             $email $user->getEmail();
  370.             $qb $entityManager->createQueryBuilder();
  371.             $qb->delete('refreshTokens''rt');
  372.             $qb->where('rt.mail = :email');
  373.             $qb->setParameter('email'$email);
  374.             $qb->getQuery()->execute();
  375.     
  376.         } catch(Exception $e) {
  377.                 return $this->json([
  378.                 'status' => 400,
  379.                 'message' => $e->getMessage()
  380.             ]);
  381.         } 
  382.     }
  383.     
  384.     #[Route('/test-email')]
  385.     public function sendEmail(MailerInterface $mailer): Response
  386.     {
  387.         $email = (new Email())
  388.             ->from('noreply@vertotek.com')
  389.             ->to('mbenaraich@sky4u.ch')
  390.             
  391.             ->subject('Time for Symfony Mailer!')
  392.             ->text('Sending emails is fun again!')
  393.             ->html('<p>See Twig integration for better HTML integration!</p>');
  394.         $mailer->send($email);
  395.          return $this->redirectToRoute('app_home');
  396.     }    
  397. }