src/EventSubscriber/CheckAllowedIPSubscriber.php line 53

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use function \bcadd;
  4. use Twig\Environment;
  5. use IP2Location\Database;
  6. use App\Entity\BlockedCountryCode;
  7. use App\Repository\CountryRepository;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Component\Security\Core\Security;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpKernel\KernelEvents;
  12. use Symfony\Component\HttpFoundation\RequestStack;
  13. use Symfony\Component\HttpKernel\Event\RequestEvent;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. class CheckAllowedIPSubscriber implements EventSubscriberInterface
  16. {
  17.     private $twig;
  18.     private $requestStack;
  19.     private $projectDir;
  20.     private $entityManager;
  21.     public function __construct(
  22.         string $projectDir,
  23.         EntityManagerInterface $entityManager,
  24.         RequestStack $requestStack,
  25.         Environment $twig
  26.     )
  27.     {
  28.         $this->requestStack $requestStack;
  29.         $this->projectDir $projectDir;
  30.         $this->twig $twig;
  31.         $this->entityManager $entityManager;
  32.     }
  33.     public static function getSubscribedEvents()
  34.     {
  35.         return [
  36.             KernelEvents::REQUEST =>[
  37.                 ['onKernelRequest',  10], 
  38.             ],
  39.         ];
  40.     }
  41.     public function onKernelRequest(RequestEvent $event)
  42.     {
  43.        
  44.         // $clientIp = $this->requestStack->getCurrentRequest()->getClientIp();
  45.         // $clientIp = $_SERVER['REMOTE_ADDR'];
  46.         // if (filter_var($clientIp, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
  47.         //     $database = new Database( $this->projectDir  . '/src/Database/IP2LOCATION-LITE-DB1.BIN', Database::FILE_IO);
  48.         //     $records = $database->lookup($clientIp, Database::ALL);
  49.         // } elseif (filter_var($clientIp, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
  50.         //     $databaseIpV6 = new Database( $this->projectDir  . '/src/Database/IP2LOCATION-LITE-DB1.IPV6.BIN', Database::FILE_IO);
  51.         //     $records = $databaseIpV6->lookup($clientIp, Database::ALL);
  52.         // } else {
  53.         //    return ;
  54.         // }
  55.         $request $event->getRequest();
  56.         $countryCode $request->headers->get('CF-IPCountry');
  57.         if($countryCode && $this->checkCountryCode($countryCode)){
  58.             $template $this->renderNotAvailableInCountryTemplate();
  59.             $event->setResponse(new Response($template));
  60.         }
  61.     }
  62.     public function checkCountryCode($countryCode){
  63.         $result $this->entityManager->getRepository(BlockedCountryCode::class)->findOneBy([
  64.             'countryCode' => $countryCode,
  65.         ]);
  66.         if($result){
  67.             return true;
  68.         }
  69.         return false;
  70.                 
  71.     }
  72.     private function renderNotAvailableInCountryTemplate(): string
  73.     {
  74.         return $this->twig->render('blocked/blocked_country.html.twig');
  75.     }
  76. }