<?php
namespace App\Event;
use App\Entity\Parametre\Utilisateur;
use App\Form\Authenticator\LoginAuthenticatorType;
use App\Helper\UserHelper;
use Doctrine\Bundle\DoctrineBundle\Registry;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Symfony\Component\Security\Core\Authentication\Token\Storage\UsageTrackingTokenStorage;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Environment;
/**
* SecurityInteractiveLogin.
*
* @author John Doe
* @package App\Event
*/
class SecurityHttpEvent {
/** @var Registry */
private $doctrine;
/** @var FormFactoryInterface */
private $formFactory;
/** @var RequestStack */
private $requestStack;
/** @var TokenStorage */
private $tokenStorage;
/** @var TranslatorInterface */
private $translator;
/** @var Environment */
private $twig;
/**
* SecurityInteractiveLogin constructor.
*
* @param Registry $doctrine
* @param RequestStack $requestStack
* @param TranslatorInterface $translator
* @param UsageTrackingTokenStorage $tokenStorage
* @param Environment $twig
* @param FormFactoryInterface $formFactory
*/
public function __construct(Registry $doctrine, RequestStack $requestStack, TranslatorInterface $translator, UsageTrackingTokenStorage $tokenStorage, Environment $twig, FormFactoryInterface $formFactory) {
$this->doctrine = $doctrine;
$this->requestStack = $requestStack;
$this->translator = $translator;
$this->tokenStorage = $tokenStorage;
$this->twig = $twig;
$this->formFactory = $formFactory;
}
/**
* Get the entity manager.
*
* @return \Doctrine\Persistence\ObjectManager
*/
private function em() {
return $this->doctrine->getManager();
}
/**
* Event on login success.
*
* @param InteractiveLoginEvent $event
* @return false
* @throws \Twig\Error\LoaderError
* @throws \Twig\Error\RuntimeError
* @throws \Twig\Error\SyntaxError
*/
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) {
/** @var Utilisateur $user */
$user = $event->getAuthenticationToken()->getUser();
// Check session.
// if (true === UserHelper::hasCurrentlyActiveSession($this->requestStack->getCurrentRequest(), $user)) {
//
// // Create form.
// $form = $this->formFactory->create(LoginAuthenticatorType::class);
// $form->handleRequest($event->getRequest());
//
// $event->getRequest()->getSession()->set("loginError", "SESSION_ALREADY_ACTIVE");
// $this->renderView("Authentication/login.html.twig", [
// "error" => [
// "messageKey" => $this->translator->trans("app_login.session_active", [], "authenticator"),
// "messageData" => [],
// ],
// "localeLangage" => $this->translator->getLocale(),
// "form" => $form->createView(),
// ]);
// }
// If is first connexion.
if ($user->getDatePremiereConnexion() === null) {
$user->setDatePremiereConnexion(new \DateTime());
}
// Update user information.
$user->setDateDerniereConnexion(new \DateTime());
$user->setAdresseIp($this->requestStack->getCurrentRequest()->getClientIp());
$user->setUserAgent($this->requestStack->getCurrentRequest()->headers->get("user-agent"));
$user->setDateSessionExpiration(new \DateTime());
$user->getDateSessionExpiration()->modify("+2 min");
// Create session to save the session token.
$event->getRequest()->getSession()->set("UpdateSessionToken", 1);
// Set session lang.
if (null !== $user->getLang()) {
$event->getRequest()->getSession()->set('_locale', $user->getLang());
}
// Flush informations.
$this->em()->flush();
}
/**
* Render twig view.
*
* @param $twigPath
* @param $parameters
* @return false
* @throws \Twig\Error\LoaderError
* @throws \Twig\Error\RuntimeError
* @throws \Twig\Error\SyntaxError
*/
private function renderView($twigPath, $parameters) {
$view = $this->twig->render($twigPath, $parameters);
exit($view);
return false;
}
}