<?php
namespace App\EventListener;
date_default_timezone_set('UTC');
use App\Entity\PopUpMessage;
use App\Entity\User;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Scheb\TwoFactorBundle\Security\Authentication\Token\TwoFactorToken;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
//use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter;
class PopUpMessageListener
{
/**
* @var Session
*/
private $session;
/**
* @var TokenStorageInterface
*/
private $tokenStorage;
/**
* @var RouterInterface
*/
private $router;
/**
* @var AuthorizationCheckerInterface
*/
private $checker;
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var EntityManagerInterface
*/
private $em;
/**
* @var EntityManagerInterface
*/
private $defaultTimeZone;
/**
* SessionIdleHandler constructor.
* @param Session $session
* @param TokenStorageInterface $tokenStorage
* @param RouterInterface $router
* @param AuthorizationCheckerInterface $checker
* @param LoggerInterface $logger
* @param EntityManagerInterface $em
* @param String $defaultTimeZone
*/
public function __construct(Session $session, TokenStorageInterface $tokenStorage, RouterInterface $router, AuthorizationCheckerInterface $checker, LoggerInterface $logger, EntityManagerInterface $em, String $defaultTimeZone)
{
$this->session = $session;
$this->router = $router;
$this->checker = $checker;
$this->tokenStorage = $tokenStorage;
$this->logger = $logger;
$this->em = $em;
$this->defaultTimeZone = $defaultTimeZone;
}
/**
* @param RequestEvent $event
*/
public function onKernelRequest(RequestEvent $event): void
{
$nextMessage= null;
// $this->logger->error("max_idle_time: ".$this->maxIdleTime);
// $this->logger->error("master: ".$event->isMasterRequest());
// $this->logger->error("anonymous: ".$this->isAuthenticatedAnonymously());
if (!$event->isMainRequest()
|| $this->isAuthenticatedAnonymously()) {
// $this->logger->error("return");
return;
}
// $this->logger->error("now: " . $event->getRequest()->get("_route"));
//if current page is the target page (show popup) than return - if no return than loop!!!!!!!
if (
$event->getRequest()->get("_route") == "popupmessage_user_show"
||
$event->getRequest()->get("_route") == "popupmessage_user_save"
||
$event->getRequest()->get("_route") == "popupmessage_user_detail"
||
$event->getRequest()->get("_route") == "popupmessage_user_detail_skip"
) {
return;
}
/** @var User $user */
$user = $this->tokenStorage->getToken()->getUser();
if ($this->checker->isGranted('ROLE_BACKEND_USER')) {
return;
}
// set time zone
if (!defined('_USER_TIMEZONE_')) {
if ($user->getTimezone()) {
define('_USER_TIMEZONE_', $user->getTimezone());
} else {
define('_USER_TIMEZONE_', $this->defaultTimeZone);
}
}
date_default_timezone_set(_USER_TIMEZONE_);
// $this->logger->error("USER : " . $user->getId());
// $this->logger->error("TIME : " .$date->format("Y-m-d H:i:s"));
// return;
//check nextMessage exists
//if not exists return!!!
$nextMessage = $this->em->getRepository(PopUpMessage::class)->getNext($user);
if ($nextMessage == null || empty($nextMessage)) {
if (
$user->getLoginCounter() == 1 &&
$event->getRequest()->get("_route") != "frontend_plan_change" &&
isset($_COOKIE['plan_register'])
) {
$planId = $_COOKIE['plan_register'];
unset($_COOKIE['plan_register']);
setcookie('plan_register', '', time() - 3600, '/');
$event->setResponse(new RedirectResponse($this->router->generate('frontend_plan_change', ['id' => $planId])));
}
// //user logged in more then 3 times
// $skipUserDetail = $this->session->get('skipUserDetail');
// if (
// (is_null($skipUserDetail) || $skipUserDetail == false)
// &&
// $user->getLoginCounter() >= 3
// ) {
// if (
// (
// is_null($user->getCustomerDetail())
// )
// ||
// (
// (is_null($user->getCustomerDetail()->getCompanyName()) || strlen($user->getCustomerDetail()->getCompanyName()) == 0) ||
// (is_null($user->getCustomerDetail()->getVatNumber()) || strlen($user->getCustomerDetail()->getVatNumber()) == 0) ||
// (is_null($user->getCustomerDetail()->getStreet()) || strlen($user->getCustomerDetail()->getStreet()) == 0) ||
// (is_null($user->getCustomerDetail()->getCity()) || strlen($user->getCustomerDetail()->getCity()) == 0) ||
// (is_null($user->getCustomerDetail()->getCountry()) || strlen($user->getCustomerDetail()->getCountry()) == 0) ||
// (is_null($user->getCustomerDetail()->getState()) || strlen($user->getCustomerDetail()->getState()) == 0) ||
// (is_null($user->getCustomerDetail()->getZipCode()) || strlen($user->getCustomerDetail()->getZipCode()) == 0)
// )
// ) {
// $event->setResponse(new RedirectResponse($this->router->generate('popupmessage_user_detail')));
// }
// }
return;
}
//nextMessage exists - redirect to show!
$event->setResponse(new RedirectResponse($this->router->generate('popupmessage_user_show')));
}
/**
* @return bool
*/
private function isAuthenticatedAnonymously(): bool
{
// dump($this->tokenStorage->getToken());
// die;
// $this->logger->error(serialize($this->tokenStorage->getToken()));
// $this->logger->error(is_a($this->tokenStorage->getToken(), AnonymousToken::class));
return !$this->tokenStorage->getToken()
||
is_a($this->tokenStorage->getToken(), AnonymousToken::class)
||
is_a($this->tokenStorage->getToken(), TwoFactorToken::class)
//!$this->checker->isGranted(AuthenticatedVoter::IS_AUTHENTICATED_FULLY)
;
}
}