<?php
namespace App\EventSubscriber;
use function \bcadd;
use Twig\Environment;
use IP2Location\Database;
use App\Entity\BlockedCountryCode;
use App\Repository\CountryRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CheckAllowedIPSubscriber implements EventSubscriberInterface
{
private $twig;
private $requestStack;
private $projectDir;
private $entityManager;
public function __construct(
string $projectDir,
EntityManagerInterface $entityManager,
RequestStack $requestStack,
Environment $twig
)
{
$this->requestStack = $requestStack;
$this->projectDir = $projectDir;
$this->twig = $twig;
$this->entityManager = $entityManager;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST =>[
['onKernelRequest', 10],
],
];
}
public function onKernelRequest(RequestEvent $event)
{
// $clientIp = $this->requestStack->getCurrentRequest()->getClientIp();
// $clientIp = $_SERVER['REMOTE_ADDR'];
// if (filter_var($clientIp, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
// $database = new Database( $this->projectDir . '/src/Database/IP2LOCATION-LITE-DB1.BIN', Database::FILE_IO);
// $records = $database->lookup($clientIp, Database::ALL);
// } elseif (filter_var($clientIp, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
// $databaseIpV6 = new Database( $this->projectDir . '/src/Database/IP2LOCATION-LITE-DB1.IPV6.BIN', Database::FILE_IO);
// $records = $databaseIpV6->lookup($clientIp, Database::ALL);
// } else {
// return ;
// }
$request = $event->getRequest();
$countryCode = $request->headers->get('CF-IPCountry');
if($countryCode && $this->checkCountryCode($countryCode)){
$template = $this->renderNotAvailableInCountryTemplate();
$event->setResponse(new Response($template));
}
}
public function checkCountryCode($countryCode){
$result = $this->entityManager->getRepository(BlockedCountryCode::class)->findOneBy([
'countryCode' => $countryCode,
]);
if($result){
return true;
}
return false;
}
private function renderNotAvailableInCountryTemplate(): string
{
return $this->twig->render('blocked/blocked_country.html.twig');
}
}