<?php
declare(strict_types=1);
namespace App\Subscriber;
use App\Controller\AuthController;
use App\Controller\UserController;
use App\Logger\Log;
use App\Service\FileService;
use App\Service\IAppService;
use App\Service\IAuthService;
use App\Service\IOptionService;
use App\Service\OptionService;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
class LoginSubscriber implements EventSubscriberInterface
{
private ParameterBagInterface $parameterBag;
private TranslatorInterface $translator;
private SessionInterface $session;
private Security $security;
protected TokenStorageInterface $securityToken;
protected Log $log;
protected FileService $fileService;
private OptionService $optionService;
public function __construct(
ParameterBagInterface $parameterBag,
SessionInterface $session,
Security $security,
TokenStorageInterface $securityToken,
Log $log,
FileService $fileService,
TranslatorInterface $translator,
OptionService $optionService
) {
$this->session = $session;
$this->translator = $translator;
$this->security = $security;
$this->securityToken = $securityToken;
$this->fileService = $fileService;
$this->log = $log;
$this->parameterBag = $parameterBag;
$this->optionService = $optionService;
}
public function onKernelController(ControllerEvent $event)
{
$controller = $event->getController();
if (!is_array($controller)) {
return;
}
if ($this->fileService->checkFile($this->parameterBag->get('app.connection_dir').DIRECTORY_SEPARATOR.IOptionService::MAINTENANCE_FILE) && IAuthService::STAFF != $this->parameterBag->get('app.user')) {
$this->log->writeLog(
[
IOptionService::KEY_CLASS => get_class($this),
IOptionService::KEY_FUNCTION => __FUNCTION__,
IOptionService::KEY_MESSAGE => 'site is under maintenance',
],
Log::MESSAGE_INFO
);
if (null !== $this->security->getUser()) {
// clean session i think is not working
$session = $event->getRequest()->getSession();
$session->invalidate();
$session->clear();
// clean user activity
$this->securityToken->setToken(null);
// redirect to maintenance page
$this->redirectionMaintenance($event);
} elseif ('maintenance' != $event->getRequest()->attributes->get('_route')) {
$this->redirectionMaintenance($event);
}
} elseif (
$controller[0] instanceof AuthController
&& null !== $this->security->getUser()
&& (
'auth_signin' == $event->getRequest()->attributes->get('_route')
|| 'auth_forgot_password' == $event->getRequest()->attributes->get('_route')
|| 'auth_reset_password' == $event->getRequest()->attributes->get('_route')
)
) {
$this->redirectionHome($event);
} elseif (
$controller[0] instanceof AuthController
&& 'new_account' != $event->getRequest()->attributes->get('_route')
&& 'auth_activation' != $event->getRequest()->attributes->get('_route')
&& 'auth_validate_account' != $event->getRequest()->attributes->get('_route')
&& 'auth_signout' != $event->getRequest()->attributes->get('_route')
&& $event->getRequest()->attributes->get('_route') != "auth_resent_activation_code"
) {
// dd($this->security->getUser());
if (null !== $this->security->getUser()) {
$event->setController(function () {
return new RedirectResponse(IAppService::INDEX_URL);
});
}
}
}
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
];
}
public function redirectionMaintenance(ControllerEvent $event)
{
if ($event->getRequest()->isMethod('POST') && $event->getRequest()->isXmlHttpRequest()) {
if (!$event->getController() instanceof AuthController) {
$event->setController(function () {
return new JsonResponse([
'redirect' => $this->parameterBag->get('app.url').'maintenance',
], 200);
});
} else {
$event->setController(function () {
return new JsonResponse('maintenance', 200);
});
}
} else {
$event->setController(function () {
return new RedirectResponse($this->parameterBag->get('app.url').'maintenance');
});
}
}
public function redirectionHome(ControllerEvent $event)
{
if ($event->getRequest()->isMethod('POST') && $event->getRequest()->isXmlHttpRequest()) {
if (!$event->getController() instanceof AuthController) {
$event->setController(function () {
return new JsonResponse([
'redirect' => $this->getLastUrl(),
], 200);
});
} else {
// $event->setController(function () {
// return new JsonResponse('HOME', 200);
// });
}
} else {
$event->setController(function () {
return new RedirectResponse($this->getLastUrl());
});
}
}
private function getLastUrl()
{
$lastUrl = $this->parameterBag->get('app.url') . IAppService::INDEX_URL;
if (null !== $this->session->get(IAppService::SESSION_URL)) {
$lastUrl = $this->session->get(IAppService::SESSION_URL)['page'];
}
return $lastUrl;
}
}