<?php
namespace App\Listener;
use App\Entity\Currency;
use App\Entity\UrlRedirect;
use App\Services\UserTokenManager;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\User;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Exception\RouteNotFoundException;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Csrf\TokenStorage\TokenStorageInterface;
class RequestListener
{
private $router;
private $tokenStorage;
private $em;
private $session;
private $userTokenManager;
public function __construct(UserTokenManager $userTokenManager, RouterInterface $router, \Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface $tokenStorage, EntityManagerInterface $em, SessionInterface $session)
{
$this->router = $router;
$this->tokenStorage = $tokenStorage;
$this->em = $em;
$this->userTokenManager = $userTokenManager;
$this->session = $session;
}
public function onKernelRequest(\Symfony\Component\HttpKernel\Event\RequestEvent $event)
{
if (\Symfony\Component\HttpKernel\HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
// don't do anything if it's not the master request
return;
}
//set locale according to detectee values
if ($this->session->get('_locale')) {
$request = $event->getRequest();
$request->setLocale($this->session->get('_locale'));
} else {
if ($_SERVER['SERVER_NAME'] == 'ckdev.centrumkrzesel.pl' or $_SERVER['SERVER_NAME'] == 'ckprod.centrumkrzesel.pl' or $_SERVER['SERVER_NAME'] == 'www.centrumkrzesel.pl' or $_SERVER['SERVER_NAME'] == 'centrumkrzesel.pl') {
$currency = $this->em->getRepository(Currency::class)->findOneBy(['isDefault'=>true, 'deletedBy'=>null]);
$this->session->set('currency', $currency);
$this->session->set('_locale', 'pl');
$request = $event->getRequest();
$request->setLocale('pl');
/*
$currency = $this->em->getRepository(Currency::class)->find(3);
$this->session->set('currency', $currency);
$this->session->set('_locale', 'sk');
$request = $event->getRequest();
$request->setLocale('sk');
*/
/*
$currency = $this->em->getRepository(Currency::class)->find(4);
$this->session->set('currency', $currency);
$this->session->set('_locale', 'ro');
$request = $event->getRequest();
$request->setLocale('ro');
*/
} elseif ($_SERVER['SERVER_NAME'] == 'dev.stolicky24.sk' or $_SERVER['SERVER_NAME'] == 'stolicky24.sk' or $_SERVER['SERVER_NAME'] == 'www.stolicky24.sk') {
$currency = $this->em->getRepository(Currency::class)->find(3);
$this->session->set('currency', $currency);
$this->session->set('_locale', 'sk');
$request = $event->getRequest();
$request->setLocale('sk');
} elseif ($_SERVER['SERVER_NAME'] == 'mobila24.ro' or $_SERVER['SERVER_NAME'] == 'www.mobila24.ro') {
$currency = $this->em->getRepository(Currency::class)->find(4);
$this->session->set('currency', $currency);
$this->session->set('_locale', 'ro');
$request = $event->getRequest();
$request->setLocale('ro');
} elseif ($_SERVER['SERVER_NAME'] == 'dev.ezidle.cz' or $_SERVER['SERVER_NAME'] == 'ro.centrumkrzesel.pl') {
throw new NotFoundHttpException('Error 404');
exit();
} else {
$currency = $this->em->getRepository(Currency::class)->find(2);
$this->session->set('currency', $currency);
$this->session->set('_locale', 'cz');
$request = $event->getRequest();
$request->setLocale('cz');
}
}
//redirects 301 configured
$url = $this->curPageURL();
$find = $this->em->getRepository(UrlRedirect::class)->findOneBy(['deletedBy'=>null, 'from'=>$url]);
if ($find and $find->getTo()) {
$response = new RedirectResponse($find->getTo(), 301);
$event->setResponse($response);
}
////
if ($this->tokenStorage->getToken() and $this->tokenStorage->getToken()->getUser() and $this->tokenStorage->getToken()->getUser() instanceof User and $this->tokenStorage->getToken()->getUser()->hasRole('ROLE_ADMIN')) {
/** @var $user User */
$user = $this->tokenStorage->getToken()->getUser();
$requestUri = $request->getRequestUri();
$pass_validity_days = 90;
$token = $this->tokenStorage->getToken();
if ($token && $token->getUser() instanceof User && $pass_validity_days > 0 and $user->hasRole('ROLE_ADMIN')) {
/** @var $user User */
$user = $this->tokenStorage->getToken()->getUser();
$today = new \DateTime();
$defaultPasswordChangeAt = new \DateTime();
$defaultPasswordChangeAt->modify('-'.$pass_validity_days.' days');
$passwordChangeAt = $user->getPasswordChangedAt() instanceof \DateTime ? $user->getPasswordChangedAt() : $defaultPasswordChangeAt;
$days_since_last_change = $passwordChangeAt->diff($today);
if ((int)$days_since_last_change->format('%a') >= $pass_validity_days and mb_strpos($requestUri, 'profile') === false and mb_strpos($requestUri, 'change-user-password') === false and mb_strpos($requestUri, 'logout') === false) {
$response = new RedirectResponse($this->router->generate('fos_user_change_password_ext'));
$event->setResponse($response);
}
}
} else {
if (!strstr($this->curPageURL(), '_profiler') and !strstr($this->curPageURL(), '_wdt')) {
$url = $this->curPageURL();
$cookieToken = $request->cookies->get('user_token');
/** @var $user User */
$user = $this->userTokenManager->findUserByCookie($cookieToken);
if ($user and $user->getDeletedBy() === null and $user->hasRole('ROLE_ADMIN')) {
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->tokenStorage->setToken($token);
$response = new RedirectResponse(
$this->router->generate('orders').'?auto_login=1'
);
$event->setResponse($response);
}
}
}
}
private function curPageURL() {
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["HTTP_HOST"]."".$_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}
}