src/Controller/LoginController.php line 47

  1. <?php
  2. namespace App\Controller;
  3. use App\Classes\ASAuthUtility;
  4. use App\Classes\ASUtility;
  5. use App\Classes\ConfigurationUtility;
  6. use App\Classes\WorkersUtility;
  7. use App\Entity\Configurations;
  8. use App\Entity\Users;
  9. use App\Entity\Workers;
  10. use App\Service\ASRedis;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  18. class LoginController extends AbstractController
  19. {
  20.     private $entityManager;
  21.     private $workersUtility;
  22.     private $baseUrl;
  23.     private $encoder;
  24.     private $asUtility;
  25.     private $asRedis;
  26.     public function __construct(
  27.         EntityManagerInterface $entityManager,
  28.         WorkersUtility $workersUtility,
  29.         UserPasswordHasherInterface $encoder,
  30.         ASUtility $asUtility,
  31.         ASRedis $asRedis
  32.     ) {
  33.         $this->entityManager $entityManager;
  34.         $this->workersUtility $workersUtility;
  35.         $this->baseUrl ConfigurationUtility::getBaseUrl();
  36.         $this->encoder $encoder;
  37.         $this->asRedis $asRedis;
  38.         $this->asUtility $asUtility;
  39.     }
  40.     #[Route(path'/login'name'app_login')]
  41.     public function login(AuthenticationUtils $authenticationUtilsRequest $request): Response
  42.     {
  43.         $conferenceId $request->query->getInt('conferenceId');
  44.         $schoolId $request->query->getInt('schoolId');
  45.         $G5MID $request->query->get('G5MID');
  46.         $aglId $request->query->get('agl_id');
  47.         
  48.         if ($conferenceId !== null && $schoolId !== null && $G5MID !== null) {
  49.             if ($this->getUser()) {
  50.                 $this->container->get('security.token_storage')->setToken(null);
  51.             }
  52.             $objASAuthUtility = new ASAuthUtility(
  53.                 $this->asUtility,
  54.                 $this->asRedis,
  55.                 $conferenceId,
  56.                 $schoolId,
  57.                 $G5MID,
  58.                 $aglId
  59.             );
  60.             
  61.             $aUserInfo $objASAuthUtility->getASUserInfoByG5MID($G5MID);
  62.             if ($aUserInfo) {
  63.                 $this->asRedis->redis->user($G5MID$objASAuthUtility->userId);
  64.                 $objASAuthUtility->storeASUserInfoToRedis($aUserInfo);
  65.                 return $this->redirectToRoute('assignment_index');
  66.             } else {
  67.                 $this->asRedis->deleteASUserRedis();
  68.                 return $this->json("You must login first before accessing this page...");
  69.             }
  70.         } elseif ($this->asRedis->isValidASUserRedis($this->asRedis->validateASUserRedis()) === true) {
  71.             //todo.. if redis still valid....
  72.             return $this->redirectToRoute('assignment_index');
  73.         } elseif ($this->getUser()) {
  74.             $this->asRedis->redis->user(''$this->getUser()->getId());
  75.             $this->asRedis->deleteASUserRedis();
  76.             return $this->redirectToRoute('personal_info_index');
  77.         } else {
  78.             $showBecomeAnEventWorker $this->entityManager->getRepository(Configurations::class)
  79.                 ->findByCode(Configurations::CONF_SHOW_BECOME_AN_EVENT_WORKER);
  80.             // get the login error if there is one
  81.             $error $authenticationUtils->getLastAuthenticationError();
  82.             // last username entered by the user
  83.             $lastUsername $authenticationUtils->getLastUsername();
  84.             return $this->render(
  85.                 'login/login.html.twig',
  86.                 [
  87.                     'isShowBecomeAnEventWorker' => $showBecomeAnEventWorker,
  88.                     'last_username' => $lastUsername,
  89.                     'error' => $error
  90.                 ]
  91.             );
  92.         }
  93.     }
  94.     #[Route(path'/reset'name'app_pass_reset')]
  95.     public function passwordReset()
  96.     {
  97.         return $this->render('login/reset.html.twig', ['email_sent' => '''error' => '']);
  98.     }
  99.     /**
  100.      * @param Request $request
  101.      * @return Response
  102.      */
  103.     #[Route(path'/spre'name'app_send_pass_reset_email')]
  104.     public function sendPasswordResetEmail(Request $request)
  105.     {
  106.         $objEntityManager $this->entityManager;
  107.         $email $request->query->get('email');
  108.         $objUser $this->entityManager->getRepository(Users::class)->findOneBy(['username' => $email]);
  109.         $email_sent '';
  110.         $status true;
  111.         $rschoolLogo ConfigurationUtility::getRSchoolLogo();
  112.         // Send email contains password reset form link
  113.         if ($objUser) {
  114.             $objWorker $this->entityManager->getRepository(Workers::class)
  115.                 ->findOneBy(['user_id' => $objUser->getId()]);
  116.             $hash hash('ripemd160'$email) . '_' $objUser->getId();
  117.             $message '';
  118.             $details = [
  119.                 'email_subject' => 'Password Reset Verification',
  120.                 'email_to' => $email,
  121.                 'savable' => true,
  122.             ];
  123.             $body $this->renderView(
  124.                 'login/email/email_reset_password_link.html.twig',
  125.                 [
  126.                     'admin' => 'Event Worker Admin',
  127.                     'worker_email' => $email,
  128.                     'worker_name' => $objWorker->getFirstName() . ' ' $objWorker->getLastName(),
  129.                     'link' => $this->baseUrl '/pr-' $hash,
  130.                     'logo' => $rschoolLogo
  131.                 ]
  132.             );
  133.             $response $this->workersUtility->email($details$body);
  134.             if ($response) {
  135.                 $minutes_to_add 15;
  136.                 $pwResetExpiration = (new \DateTime())->add(new \DateInterval('PT' $minutes_to_add 'M'));
  137.                 $objUser->setPwResetExpiration($pwResetExpiration);
  138.                 $objUser->setIsRequestNewPassword(1);
  139.                 $objEntityManager->persist($objUser);
  140.                 $objEntityManager->flush();
  141.                 $email_sent true;
  142.             }
  143.         } else {
  144.             $message 'Invalid email address.';
  145.             $status false;
  146.         }
  147.         return $this->json(['email_sent' => $email_sent'message' => $message'status' => $status]);
  148.     }
  149.     /**
  150.      * @param Request $request
  151.      * @return Response
  152.      */
  153.     #[Route(path'/pr-{slug}'name'app_pass_reset_link')]
  154.     public function passwordResetLink(Request $request)
  155.     {
  156.         $slug $request->attributes->get('slug');
  157.         $user_id substr($slugstrpos($slug"_") + 1);
  158.         $objWorker $this->entityManager->getRepository(Users::class)->findOneBy(['id' => $user_id]);
  159.         $current_date = new \DateTime();
  160.         $error '';
  161.         if ($objWorker->getIsRequestNewPassword()) {
  162.             if (!($objWorker->getPwResetExpiration() >= $current_date)) {
  163.                 $error 'The specified link is invalid. The reset links can 
  164.                 be used only once and only within some hours after being sent. 
  165.                 Either the link is old or it was already used before.';
  166.             }
  167.         } else {
  168.             $error 'The specified link is invalid. 
  169.             The reset links can be used only once and only within some hours after being sent. 
  170.             Either the link is old or it was already used before.';
  171.         }
  172.         return $this->render(
  173.             'login/password_reset_form.html.twig',
  174.             ['user_id' => $user_id'error' => $error]
  175.         );
  176.     }
  177.     /**
  178.      * @Route("/save", name="app_save_new_password")
  179.      * @param Request $request
  180.      * @return Response
  181.      */
  182.     #[Route(path'/save'name'app_save_new_password')]
  183.     public function saveNewPassword(Request $request)
  184.     {
  185.         $user_id $request->request->get('user_id');
  186.         $new_pass $request->request->get('new_password');
  187.         $objEntityManager $this->entityManager;
  188.         if ($user_id) {
  189.             $objUser $this->entityManager->getRepository(Users::class)->findOneBy(['id' => $user_id]);
  190.             $objUser->setPassword($this->encoder->hashPassword(new Users(), $new_pass));
  191.             $objUser->setIsRequestNewPassword(0);
  192.             $objEntityManager->persist($objUser);
  193.             $objEntityManager->flush();
  194.         }
  195.         return $this->render('login/password_reset_form.html.twig', ['user_id' => $user_id'success' => true]);
  196.     }
  197.     #[Route(path'/logout'name'app_logout')]
  198.     public function logout(Request $request): void
  199.     {
  200.         $this->asRedis->deleteASUserRedis();
  201.         $this->asRedis->redis->delete('has_access_payment');
  202.         $this->asRedis->redis->delete('utility');
  203.         $this->asRedis->redis->delete('on_auth_worker_password');
  204.     }
  205. }