<?php
namespace App\EventSubscriber;
use App\Service\WSCMS;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Twig\Environment;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface as Session;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Security\Core\Security;
class RequestSubscriber implements EventSubscriberInterface
{
public function __construct(AuthorizationCheckerInterface $authorizationChecker, RouterInterface $router, Security $security, Session $session, WSCMS $WSCMS, Environment $twig)
{
$this->authorizationChecker = $authorizationChecker;
$this->router = $router;
$this->twig = $twig;
$this->security = $security;
$this->session = $session;
$this->WSCMS = $WSCMS;
}
public static function getSubscribedEvents(): array
{
return [
RequestEvent::class => 'onKernelRequest',
];
}
public function onKernelRequest(RequestEvent $event)
{
$user = $this->security->getUser();
$request = $event->getRequest();
$_route = $request->get('_route');
$_route_params = $request->get('_route_params');
if (!$this->session->has('DOMAINE_BACK')) {
$this->session->set('DOMAINE_BACK', 'DOMAINE_BACK');
if ($_SERVER['CHECK_GEO_IP'] == 'true') {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://os-travel.com/_script?geoip={$request->getClientIp()}");
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["ClientHost:{$request->getSchemeAndHttpHost()}"]);
$output = curl_exec($ch);
curl_close($ch);
$ipdat = json_decode($output, true);
if (!key_exists('geoplugin_countryCode', $ipdat))
throw new \Exception('Attempted to get "geoip_country_code_by_name"');
$countryCode = $ipdat['geoplugin_countryCode'];
if (isset($_SERVER["DOMAINE_BACK_$countryCode"]))
$this->session->set('DOMAINE_BACK', "DOMAINE_BACK_$countryCode");
}
}
if (isset($_route_params['checkin']) and $_route_params['checkin'] !== 'today' and !$this->isValidDateYMD($_route_params['checkin'])) {
$_route_params['checkin'] = 'today';
$event->setResponse(new RedirectResponse($this->router->generate($_route, $_route_params)));
}
if (isset($_route_params['nuitees']) and !is_numeric($_route_params['nuitees'])) {
$_route_params['nuitees'] = 1;
$event->setResponse(new RedirectResponse($this->router->generate($_route, $_route_params)));
}
if (isset($_GET['seo'])) {
$token = base64_encode(json_encode([
'route' => $_route,
'params' => $_route_params,
'path' => $this->router->generate($_route, $_route_params, 0)
]));
$event->setResponse(new RedirectResponse($_SERVER[$this->session->get('DOMAINE_BACK', 'DOMAINE_BACK')] . "/_script?seo=$token"));
}
if ($this->session->has('langue-translat'))
$request->setLocale($this->session->get('langue-translat'));
if ($user and $user->getLangue())
$request->setLocale($user->getLangue());
if (
!in_array($request->getPathInfo(), ["/front/maintenance-site", "/front/check-cache-webservices"]) and
strpos($request->getPathInfo(), "config-traduction") === false and
strpos($request->getPathInfo(), "reset-cache-webservices") === false and
file_exists('../var/site-en-maintenance.php')
) {
$result = include '../var/site-en-maintenance.php';
if ($result['maintenance']) {
$ips = $result['ips'];
$dateF = $result['dateFin'];
$datetime = new \DateTime();
$timezone = new \DateTimeZone('Africa/Tunis');
$datetime->setTimezone($timezone);
if (!$request->isXmlHttpRequest() and
!in_array($request->getClientIp(), $ips) and
(is_null($dateF) or new \DateTime($dateF->format('Y-m-d H:i')) > new \DateTime($datetime->format('Y-m-d H:i'))))
$event->setResponse(new Response($this->twig->render("maintenance.html.twig", ['dateFin' => $dateF])));
}
}
if ($_SERVER['CHECK_CLIENT_BY_HOST'] == "true" and
!$this->session->has('amicale') and
!empty($amicale = $this->WSCMS->Amicale()))
$this->session->set('amicale', $amicale);
if (!$this->session->has('devise')) {
$devises = array_column($this->WSCMS->Devise()['Devises'], null, 'code');
$client = $this->session->get('client');
if ($user and $user->getDevise() and isset($client['amicale']))
$client['amicale']['code-devise'] = $user->getDevise();
if (isset($client['amicale']['code-devise']))
$devise = array_filter($devises, function ($devise) use ($client) {
return $devise['code'] == $client['amicale']['code-devise'];
});
else
$devise = array_filter($devises, function ($devise) {
return $devise['default'];
});
if (!empty($devise))
$this->session->set('devise', current($devise));
else
$this->session->set('devise', [
"code" => "TND",
"montant" => 1,
"scale" => 3,
"symbole" => "DT",
"tndToDevise" => true,
"periodes" => []
]);
$agence = $this->WSCMS->Agence()['Agence'];
$this->session->set('devise-agence', $devises[isset($agence['devise']) ? $agence['devise'] : 'TND']);
}
$this->session->set('last_route_params.' . $_route, $_route_params);
$this->session->set('messing_messages', null);
}
function isValidDateYMD($date)
{
// Crée un objet DateTime à partir du format Y-m-d
$d = \DateTime::createFromFormat('Y-m-d', $date);
// Vérifie si l'objet a bien été créé et si la date est valide
return $d && $d->format('Y-m-d') === $date;
}
}