src/Eccube/EventListener/SameSiteCookieHotfixListener.php line 45

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.ec-cube.co.jp/
  8.  *
  9.  * For the full copyright and license information, please view the LICENSE
  10.  * file that was distributed with this source code.
  11.  */
  12. namespace Eccube\EventListener;
  13. use Eccube\Twig\Environment;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  17. /**
  18.  * Safariの一部のバージョンでSameSite=Noneを正しく扱われないバグ対応.
  19.  *
  20.  * @see https://bugs.webkit.org/show_bug.cgi?id=198181
  21.  */
  22. class SameSiteCookieHotfixListener implements EventSubscriberInterface
  23. {
  24.     private static $TARGET_UA_PATTERNS = [
  25.         '/^.*iPhone; CPU iPhone OS 1[0-2].*$/',
  26.         '/^.*iPad; CPU OS 1[0-2].*$/',
  27.         '/^.*iPod touch; CPU iPhone OS 1[0-2].*$/',
  28.         '/^.*Macintosh; Intel Mac OS X.*Version\/1[0-2].*Safari.*$/',
  29.     ];
  30.     /**
  31.      * @var Environment
  32.      */
  33.     private $twig;
  34.     public function __construct(Environment $twig)
  35.     {
  36.         $this->twig $twig;
  37.     }
  38.     public function onKernelRequest(GetResponseEvent $event)
  39.     {
  40.         if (!$event->isMasterRequest()) {
  41.             return;
  42.         }
  43.         $ua $event->getRequest()->headers->get('User-Agent');
  44.         $isUnsupported array_filter(self::$TARGET_UA_PATTERNS, function ($pattern) use ($ua) {
  45.             return preg_match($pattern$ua);
  46.         });
  47.         if ($isUnsupported) {
  48.             $event->setResponse(new Response($this->twig->render('error_samesite.twig', [
  49.                 'error_title' => 'お使いのブラウザーではご利用いただけません。',
  50.                 'error_message' => '最新版にアップデートして頂くか、他のブラウザーでご利用ください。',
  51.                 'ua' => $ua
  52.             ])));
  53.         }
  54.     }
  55.     /**
  56.      * {@inheritdoc}
  57.      */
  58.     public static function getSubscribedEvents()
  59.     {
  60.         return [
  61.             'kernel.request' => ['onKernelRequest'256],
  62.         ];
  63.     }
  64. }