src/Controller/SecurityController.php line 44

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Form\EmailResetType;
  5. use App\Form\UserResetPasswordType;
  6. use App\Form\ResetType;
  7. use App\Utils\ProfileUtils;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Mailer\MailerInterface;
  12. use Symfony\Component\Mime\Address;
  13. use Symfony\Component\Mime\Email;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  16. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  17. class SecurityController extends AbstractController
  18. {
  19.     /**
  20.     * @Route("/login", name="app_login")
  21.     */
  22.     public function login(AuthenticationUtils $authenticationUtils): Response
  23.     {
  24.         if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')){
  25.             return $this->redirectToRoute('home_index');
  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.     
  32.         return $this->render('security/login.html.twig', ['last_username' => $lastUsername'error' => $error]);
  33.     }
  34.     /**
  35.     * @Route("/reset", name="reset_login")
  36.     */
  37.     public function resetPassword(Request $requestMailerInterface $mailer)
  38.     {
  39.         $entityManager $this->getDoctrine()->getManager();
  40.         $form $this->createForm(EmailResetType::class);
  41.         $ipRequest $request->server->get('REMOTE_ADDR');
  42.         $dateRequest = new  \Datetime("now");
  43.         $form->handleRequest($request);
  44.         
  45.         if ($form->isSubmitted() && $form->isValid()) {
  46.             $user $entityManager->getRepository(User::class)->findOneByEmail($form->getData()['email']);
  47.             if ($user !== null) {
  48.                 $token uniqid();
  49.                 $user->setResetPassword($token);
  50.                 $entityManager->persist($user);
  51.                 $entityManager->flush();
  52.                 $mailTo $user->getEmail();
  53.                 $message = (new Email())
  54.                     ->from(new Address('no-reply@skaze.fr''Skaze Tools Suite'))
  55.                     ->to($mailTo)
  56.                     ->subject('Request from Skaze Tools')
  57.                     ->html($this->renderView('email/reset.password.html.twig', array('user' => $user,'token' => $token'ipRequest' => $ipRequest'dateRequest' => $dateRequest)))
  58.                 ;
  59.                 $result $mailer->send($message);
  60.                 return $this->render('security/reset.password.confirmation.html.twig');
  61.             }
  62.         }
  63.         return $this->render('generic_forms/_form_bootstrap_without_variables.html.twig', array(
  64.             'form' => $form->createView(),
  65.             'title' => "Reset password",
  66.             'message' => "Please fill in your email below, we will send you a link to update your password."
  67.         ));
  68.     }
  69.      /**
  70.     * @Route("/reset/password/token", name="reset_password_token")
  71.     */
  72.     public function resetPasswordToken(Request $requestUserPasswordHasherInterface $encoderAuthenticationUtils $authenticationUtils)
  73.     {
  74.         $token $request->query->get('token');
  75.    
  76.         if ($token !== null) {
  77.             $entityManager $this->getDoctrine()->getManager();
  78.             $user $entityManager->getRepository(User::class)->findOneByResetPassword($token);
  79.             if ($user !== null) {
  80.                 // Return to login page with error message if token > 15 minutes
  81.                 $lastupdatedDate $user->getUpdatedAt();
  82.                 $lastUpdateT $lastupdatedDate->getTimestamp();
  83.                 $now = new \Datetime;
  84.                 $nowT $now->getTimestamp();
  85.                 $diff abs($nowT $lastUpdateT); 
  86.                 // 900 seconds = 15 minutes
  87.                 if(intval($diff) > 900) {
  88.                     $error "Your mail has be sent more 15 minutes ago, click in forgotten password again and we will send you a new mail to reset your password";
  89.                 return $this->render('security/login.html.twig', ['errorArchived' => $error]);
  90.                 }
  91.                 // Else, user can change his password
  92.                 $form $this->createForm(UserResetPasswordType::class, $user);
  93.                 $form->handleRequest($request);
  94.                 if ($form->isSubmitted() && $form->isValid()) {
  95.                     $plainPassword $_POST['user_reset_password']['password']['first'];
  96.                     $encoded $encoder->hashPassword($user$plainPassword);
  97.                     $user->setPassword($encoded);
  98.                     $entityManager->persist($user);
  99.                     $entityManager->flush();
  100.                     return $this->redirectToRoute('app_login');
  101.                 }
  102.                 return $this->render('generic_forms/_form_bootstrap_without_variables.html.twig', array(
  103.                     'form' => $form->createView(),
  104.                     'title' => "Enter your new password",
  105.                     "message" => "Please fill your new password."
  106.                 ));       
  107.             }
  108.         }
  109.         // get the login error if there is one
  110.         $error $authenticationUtils->getLastAuthenticationError();
  111.         // last username entered by the user
  112.         $lastUsername $authenticationUtils->getLastUsername();
  113.         
  114.         return $this->render('security/login.html.twig', ['last_username' => $lastUsername'error' => $error]);
  115.     }
  116.      /**
  117.     * @Route("/report/token", name="report_token")
  118.     */
  119.     public function reportToken(Request $requestMailerInterface $mailer)
  120.     {
  121.         $ipReport $request->server->get('REMOTE_ADDR');
  122.         $token $request->query->get('token');
  123.         $ipRequest $request->query->get('ipRequest');
  124.         $dateRequest $request->query->get('dateRequest');
  125.         if ($token !== null) {
  126.             $entityManager $this->getDoctrine()->getManager();
  127.             $user $entityManager->getRepository(User::class)->findOneByResetPassword($token);
  128.             if ($user !== null) {
  129.                 //As the demand is not from the user, remove token
  130.                 $user->setResetPassword("");
  131.                 $entityManager->persist($user);
  132.                 $entityManager->flush();
  133.                 $admin "dev.skaze@algorun.com";
  134.                 $mailTo $admin;
  135.                 $message = (new Email())
  136.                     ->from(new Address('no-reply@skaze.fr''Skaze Tools Suite'))
  137.                     ->to($mailTo)
  138.                     ->subject('Report Skaze Tools')
  139.                     ->html(
  140.                       $this->renderView('email/report.token.html.twig', array('user' => $user,'token' => $token'ipRequest' => $ipRequest'dateRequest' => $dateRequest["date"], 'ipReport' => $ipReport'date' => new \Datetime("now"))))
  141.                 ;
  142.    
  143.                 $result $mailer->send($message);
  144.                // Render view to confirm he can have a connexion with the old password
  145.                return $this->render('security/report.token.confirmation.html.twig', array(
  146.                    'token' => $token,
  147.                ));
  148.            }
  149.         }
  150.         // if $token exists, return the login form
  151.         return $this->render('security/report.token.confirmation.html.twig');
  152.     }
  153. }