src/Controller/Security/LoginController.php line 52

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Security;
  3. use App\Common\Controller\BaseController;
  4. use App\Entity\Security\User;
  5. use App\Form\Security\ChangePasswordType;
  6. use App\Form\Security\ResetPasswordType;
  7. use App\Form\Security\User2Type;
  8. use App\Repository\Security\ProfileRepository;
  9. use App\Repository\Security\UserRepository;
  10. use App\Service\Logger;
  11. use App\Service\Mailer\Emailer;
  12. use App\Service\Slugger;
  13. use DateTime;
  14. use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
  15. use LogicException;
  16. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  17. use Symfony\Component\Form\FormError;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  23. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  24. use Symfony\Component\Security\Http\LoginLink\LoginLinkDetails;
  25. use Symfony\Component\Security\Http\LoginLink\LoginLinkHandlerInterface;
  26. use Symfony\Component\Security\Http\Util\TargetPathTrait;
  27. use Symfony\Contracts\Translation\TranslatorInterface;
  28. use Twig\Environment;
  29. class LoginController extends BaseController {
  30.     use TargetPathTrait;
  31.     /**
  32.      * @Route("/login", name="mapp_security_login", host="192.168.43.120")
  33.      */
  34.     public function mlogin(AuthenticationUtils $helperLogger $logger): Response {
  35.         $logger->logging(new User(), new User(), Logger::ACTION_CONNECT_FORM);
  36.         return $this->render('security/mlogin.html.twig', [
  37.                     'last_username' => $helper->getLastUsername(),
  38.                     // last authentication error (if any)
  39.                     'error' => $helper->getLastAuthenticationError(),
  40.         ]);
  41.     }
  42.     /**
  43.      * @Route("/login", name="app_security_login")
  44.      */
  45.     public function login(AuthenticationUtils $helperLogger $logger): Response {
  46.         $user $this->getUser();
  47.         if ($user) {
  48.             $logger->logging($user$userLogger::ACTION_CONNECT_ALREADY);
  49.             return $this->redirectToRoute($this->getParameter('default_homepage'));
  50.         } else {
  51.             $logger->logging(new User(), new User(), Logger::ACTION_CONNECT_FORM);
  52.             return $this->render('security/login.html.twig', [
  53.                         'controller_name' => 'LoginController',
  54.                         // last username entered by the user (if any)
  55.                         'last_username' => $helper->getLastUsername(),
  56.                         // last authentication error (if any)
  57.                         'error' => $helper->getLastAuthenticationError(),
  58.             ]);
  59.         }
  60.     }
  61.     /**
  62.      * @Route("/signup", name="app_security_signup")
  63.      */
  64.     public function signup(Request $requestUserRepository $repositoryProfileRepository $pRepositoryTranslatorInterface $translatorLogger $loggerLoginLinkHandlerInterface $loginLinkHandlerEmailer $emailerEnvironment $twig): Response {
  65.         $logger->logging(new User(), new User(), Logger::ACTION_CONNECT_FORM);
  66.         $user = new User();
  67.         $form $this->createForm(User2Type::class, $user);
  68.         $form->handleRequest($request);
  69.         if ($form->isSubmitted() && $form->isValid()) {
  70.             try {
  71.                 //TODO set username
  72.                 $username $user->getUsername();
  73.                 if ($username === null or trim($username) == false) {
  74.                     $usernamed $user->generateUsername();
  75.                     $username $usernamed;
  76.                     $i 0;
  77.                     $sameUsername $repository->count(['username' => $username]);
  78.                     while ($sameUsername != 0) {
  79.                         $i++;
  80.                         $username $usernamed $i;
  81.                         $sameUsername $repository->count(['username' => $username]);
  82.                     }
  83.                     $user->setUsername($username);
  84.                 }
  85.                 $user->setProfile($pRepository->findDefaultProfile());
  86.                 $user->setPrivatePassword(false);
  87.                 $slugger = new Slugger();
  88.                 $user->setCode($slugger->createCode());
  89.                 $repository->add($usertrue);
  90.                 $loginLinkDetails $loginLinkHandler->createLoginLink($user);
  91.                 $loginLink $loginLinkDetails->getUrl();
  92.                 $delai $this->getDefaultContent2($loginLinkDetails);
  93.                 $dest_name $user->getFullname();
  94.                 $subject 'PROIMMO - Validate Email';
  95.                 $description 'Bonjour ' $dest_name ',' PHP_EOL PHP_EOL ' Veuillez cliquer sur le bouton suivant pour la réinitialisation du mot de passe de votre compte PROIMMO.' PHP_EOL $loginLink PHP_EOL $delai PHP_EOL PHP_EOL 'Merci de faire confiance à Tank\'immo, Madame / Monsieur ' $dest_name '  . Nous restons disponibles.';
  96.                 $htmlContents $twig->render('emails/_login_link_email.html.twig', [
  97.                     'dest_name' => $dest_name,
  98.                     'url' => $loginLink,
  99.                     'delay' => $delai,
  100.                     'username' => $user->getUsername(),
  101.                 ]);
  102.                 $emailer->sendMail(Emailer::$defaultFrom$user->getEmail(), $subject$description$htmlContents);
  103. //            $emailer->sendMail(Emailer::$defaultFrom, Emailer::$defaultTo, $subject, $description, $htmlContents);
  104.                 $this->addFlash('success'$translator->trans('tt_message.add_successfully'));
  105.                 $logger->logging($user$userLogger::ACTION_ADD);
  106.                 return $this->render('security/confirm_email2.html.twig', [
  107.                             'email' => $user->getEmail(),
  108.                             'url' => $loginLink,
  109.                             'message' => $this->getDefaultContent($loginLinkDetails),
  110.                 ]);
  111.             } catch (UniqueConstraintViolationException $ex) {
  112.                 $form->addError(new FormError($translator->trans('tt_message.username_not_unique')));
  113.             }
  114.         } else {
  115.             $logger->logging(new User(), $userLogger::ACTION_ADD_FORM);
  116.         }
  117.         return $this->render('security/signup.html.twig', [
  118.                     'form' => $form->createView(),
  119.         ]);
  120.     }
  121.     /**
  122.      * @Route("/reset_password", name="app_security_reset_password")
  123.      * @IsGranted("IS_AUTHENTICATED")
  124.      * @IsGranted("ROLE_SECURITY_USER_RESET_PASSWORD")
  125.      */
  126.     public function resetPassword(Request $requestTranslatorInterface $translatorLogger $loggerUserPasswordHasherInterface $passwordHasher): Response {
  127.         $user $this->getUser();
  128.         $form $this->createForm(ResetPasswordType::class, $user);
  129.         $form->handleRequest($request);
  130.         if ($form->isSubmitted() && $form->isValid()) {
  131.             $newPassword $form->get('newPassword')->getData();
  132.             $user->setPassword($passwordHasher->hashPassword($user$newPassword));
  133.             $user->setPrivatePassword(true);
  134.             $user->setLmp(new DateTime());
  135.             $user->removeUserrole('ROLE_SECURITY_USER_RESET_PASSWORD');
  136.             $entityManager $this->getDoctrine()->getManager();
  137.             $entityManager->persist($user);
  138.             $entityManager->flush();
  139.             $this->addFlash('success'$translator->trans('tt_message.change_password_successfully'));
  140.             $logger->logging($this->getUser(), $userLogger::ACTION_PASSWORD_CHANGE);
  141.             return $this->redirectToRoute('jit_index');
  142.         } else {
  143.             $logger->logging(new User(), $userLogger::ACTION_RESET_PASSWORD);
  144.         }
  145.         return $this->render('security/reset_password2.html.twig', [
  146.                     'form' => $form->createView(),
  147.         ]);
  148.     }
  149.     /**
  150.      * @IsGranted("IS_AUTHENTICATED_FULLY")
  151.      * @Route("/change_password", name="app_security_change_password")
  152.      */
  153.     public function changePassword(Request $requestTranslatorInterface $translatorLogger $loggerUserPasswordHasherInterface $passwordHasher): Response {
  154.         $user $this->getUser();
  155.         $form $this->createForm(ChangePasswordType::class, $user);
  156.         $form->handleRequest($request);
  157.         if ($form->isSubmitted() && $form->isValid()) {
  158.             $oldPassword $form->get('oldPassword')->getData();
  159.             $newPassword $form->get('newPassword')->getData();
  160.             if ($passwordHasher->isPasswordValid($user$oldPassword)) {
  161.                 $user->setPassword($passwordHasher->hashPassword($user$newPassword));
  162.                 $user->setPrivatePassword(true);
  163.                 $user->setLmp(new DateTime());
  164.                 $user->removeUserrole('ROLE_SECURITY_USER_RESET_PASSWORD');
  165.                 $entityManager $this->getDoctrine()->getManager();
  166.                 $entityManager->persist($user);
  167.                 $entityManager->flush();
  168.                 $this->addFlash('success'$translator->trans('tt_message.change_password_successfully'));
  169.                 $logger->logging($this->getUser(), $userLogger::ACTION_PASSWORD_CHANGE);
  170.                 return $this->redirectToRoute('jit_index');
  171.             } else {
  172.                 $form->addError(new FormError($translator->trans('tt_message.old_password_dont_match')));
  173.             }
  174.         } else {
  175.             $logger->logging(new User(), $userLogger::ACTION_PASSWORD_CHANGE);
  176.         }
  177.         return $this->render('security/change_password2.html.twig', [
  178.                     'form' => $form->createView(),
  179.         ]);
  180.     }
  181.     /**
  182.      * @Route("/confirm_email", name="app_security_confirm_email")
  183.      */
  184.     public function confirmEmail(AuthenticationUtils $helperLogger $logger): Response {
  185.         $logger->logging(new User(), new User(), Logger::ACTION_CONFIRM_EMAIL);
  186.         $slugger = new Slugger();
  187.         $code $slugger->createCode();
  188.         return $this->render('security/confirm_email2.html.twig', [
  189.                     'email' => $code,
  190.         ]);
  191.     }
  192.     /**
  193.      * @Route("/forget_password", name="app_security_forget_password")
  194.      */
  195.     public function forgetPassword(LoginLinkHandlerInterface $loginLinkHandlerUserRepository $userRepositoryRequest $requestLogger $logger,
  196.             UrlGeneratorInterface $urlGeneratorEmailer $emailerEnvironment $twig): Response {
  197.         $logger->logging(new User(), new User(), Logger::ACTION_FORGET_PASSWORD);
  198.         // check if form is submitted
  199.         if ($request->isMethod('POST')) {
  200.             // load the user in some way (e.g. using the form input)
  201.             $email $request->request->get('email');
  202.             $user $userRepository->findOneBy(['email' => $email]);
  203.             $htmlContents '';
  204.             $description '';
  205.             $subject 'PROIMMO - Reset Password';
  206.             if ($user === null) {
  207.                 // Le compte n'existe pas faire toujour le mail
  208.                 $dest_name '';
  209.                 $signuplink $urlGenerator->generate('app_security_signup', [], UrlGeneratorInterface::ABSOLUTE_URL);
  210.                 $description 'Bonjour ' $dest_name ',' PHP_EOL PHP_EOL ' Veuillez noter que vous n\'avez pas de compte sur la plateforme PROIMMO..' PHP_EOL 'Vous pouvez toujours créer un compte gratuitement en cliquant sur le lien ci-dessous' PHP_EOL $signuplink PHP_EOL PHP_EOL 'Merci de faire confiance à Tank\'immo, Madame / Monsieur ' $dest_name '  . Nous restons disponibles.';
  211.                 $htmlContents $twig->render('emails/_login_unknow_email.html.twig', [
  212.                     'dest_name' => $dest_name,
  213.                     'url' => $signuplink,
  214.                 ]);
  215.             } else if (!$user->isEnabled()) {
  216.                 // Compte innactif faire le mail
  217.                 $dest_name $user->getFullname();
  218.                 $description 'Bonjour ' $dest_name ',' PHP_EOL PHP_EOL ' Veuillez noter que votre compte est vérouillé actuellement.' PHP_EOL 'Merci de contacter votre agent pour plus d\'informations' PHP_EOL PHP_EOL 'Merci de faire confiance à Tank\'immo, Madame / Monsieur ' $dest_name '  . Nous restons disponibles.';
  219.                 $htmlContents $twig->render('emails/_login_lock_email.html.twig', [
  220.                     'dest_name' => $dest_name,
  221.                 ]);
  222.             } else {
  223.                 // create a login link for $user this returns an instance
  224.                 // of LoginLinkDetails
  225.                 $loginLinkDetails $loginLinkHandler->createLoginLink($user);
  226.                 $loginLink $loginLinkDetails->getUrl();
  227.                 $delai $this->getDefaultContent2($loginLinkDetails);
  228.                 $dest_name $user->getFullname();
  229.                 $description 'Bonjour ' $dest_name ',' PHP_EOL PHP_EOL ' Veuillez cliquer sur le bouton suivant pour la réinitialisation du mot de passe de votre compte PROIMMO.' PHP_EOL $loginLink PHP_EOL $delai PHP_EOL PHP_EOL 'Merci de faire confiance à Tank\'immo, Madame / Monsieur ' $dest_name '  . Nous restons disponibles.';
  230.                 $htmlContents $twig->render('emails/_login_link_email.html.twig', [
  231.                     'dest_name' => $dest_name,
  232.                     'url' => $loginLink,
  233.                     'delay' => $delai,
  234.                     'username' => $user->getUsername(),
  235.                 ]);
  236.             }
  237.             $emailer->sendMail(Emailer::$defaultFrom$email$subject$description$htmlContents);
  238. //            $emailer->sendMail(Emailer::$defaultFrom, Emailer::$defaultTo, $subject, $description, $htmlContents);
  239.             return $this->render('security/confirm_email2.html.twig', [
  240.                         'email' => $email,
  241. //                        'url' => $loginLink,
  242. //                        'message' => $this->getDefaultContent($loginLinkDetails),
  243.             ]);
  244.         }
  245.         // if it's not submitted, render the form to request the "login link"
  246.         return $this->render('security/forget_password2.html.twig');
  247.     }
  248.     /**
  249.      * @Route("/logout", name="app_security_logout")
  250.      */
  251.     public function logout() {
  252.         throw new LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  253.     }
  254.     /**
  255.      * @Route("/login_check", name="app_security_login_check")
  256.      */
  257.     public function loginCheck() {
  258.         throw new LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  259.     }
  260.     private function getDefaultContent(LoginLinkDetails $loginLinkDetails): string {
  261.         $duration $loginLinkDetails->getExpiresAt()->getTimestamp() - time();
  262.         $durationString '';
  263.         if ($duration 60) {
  264.             $durationString floor($duration 60) . ' minute' . ($duration 60 's' '');
  265.             if (($hours $duration 3600) >= 1) {
  266.                 $durationString floor($hours) . ' hour' . ($hours >= 's' '');
  267.             }
  268.         } else {
  269.             $durationString $duration ' secondes';
  270.         }
  271.         return sprintf('Click on the %s to confirm you want to sign in. This link will expire in %s.''link'$durationString);
  272.     }
  273.     private function getDefaultContent2(LoginLinkDetails $loginLinkDetails): string {
  274.         $duration $loginLinkDetails->getExpiresAt()->getTimestamp() - time();
  275.         $durationString '';
  276.         if ($duration 60) {
  277.             $durationString floor($duration 60) . ' minute' . ($duration 60 's' '');
  278.             if (($hours $duration 3600) >= 1) {
  279.                 $durationString floor($hours) . ' hour' . ($hours >= 's' '');
  280.             }
  281.         } else {
  282.             $durationString $duration ' secondes';
  283.         }
  284.         return sprintf('This link will expire in %s.'$durationString);
  285.     }
  286. }