custom/plugins/AcrisCookieConsentCS/src/Components/CookiesAcceptService.php line 70

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. /**
  3.  * ACRIS Shopware Plugin
  4.  * Copyright (c) - ACRIS E-Commerce GmbH
  5.  *
  6.  * Die Urheberrechte verbleiben bei der ACRIS E-Commerce GmbH.
  7.  * Sie dürfen vom Auftraggeber während und nach der Beendigung
  8.  * der Zusammenarbeit ausschließlich für die vereinbarten Zwe-
  9.  * cke verändert werden. Der Auftraggeber ist nicht berechtigt
  10.  * ohne ausdrückliche Zustimmung des Auftragnehmers das Werk zu
  11.  * vervielfältigen und / oder zu verbreiten. Änderungen bzw. Be-
  12.  * arbeitungen von Leistungen des Auftragnehmers, wie insbeson-
  13.  * dere deren Weiterentwicklung durch den Auftragnehmer (Käufer)
  14.  * oder durch für diesen tätige Dritte, sind nur mit ausdrückli-
  15.  * cher Zustimmung der ACRIS E-Commerce GmbH zulässig.
  16.  *
  17.  * Es gelten die AGB der ACRIS E-Commerce GmbH in der aktuell
  18.  * gültigen Fassung.
  19.  */
  20. namespace Acris\CookieConsent\Components;
  21. use Acris\CookieConsent\Custom\CookieEntity;
  22. use Acris\CookieConsent\Subscriber\ResponseCacheSubscriber;
  23. use Shopware\Core\Framework\Context;
  24. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  25. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  26. use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
  27. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  28. use Shopware\Core\PlatformRequest;
  29. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  30. use Shopware\Core\System\SystemConfig\SystemConfigService;
  31. use Symfony\Component\DependencyInjection\ContainerInterface;
  32. use Symfony\Component\HttpFoundation\Cookie;
  33. use Symfony\Component\HttpFoundation\Request;
  34. use Symfony\Component\HttpFoundation\Response;
  35. use Symfony\Component\HttpFoundation\Session\Session;
  36. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  37. class CookiesAcceptService
  38. {
  39.     const COOKIE_STRING_SEPERATOR "_||_";
  40.     const COOKIES_SEPERATOR "_cc_";
  41.     private ContainerInterface $container;
  42.     private ResponseCacheSubscriber $responseCacheSubscriber;
  43.     private SystemConfigService $configService;
  44.     /**
  45.      * @param ContainerInterface $container
  46.      */
  47.     public function __construct(
  48.         ContainerInterface $container,
  49.         ResponseCacheSubscriber $responseCacheSubscriber,
  50.         SystemConfigService $configService
  51.     )
  52.     {
  53.         $this->container $container;
  54.         $this->responseCacheSubscriber $responseCacheSubscriber;
  55.         $this->configService $configService;
  56.     }
  57.     /**
  58.      * @param Session $session
  59.      * @param Request $request
  60.      * @return bool
  61.      */
  62.     public function getCookiesAccepted(Session $sessionRequest $request)
  63.     {
  64.         $cookiesAccepted $session->get('acrisCookieAccepted');
  65.         if($cookiesAccepted) return true;
  66.         $deniedCookiesFromCookie $request->cookies->get('acris_cookie_acc');
  67.         $allowCookie $request->cookies->get('cookie-preference');
  68.         if(!$deniedCookiesFromCookie && !$allowCookie) return false;
  69.         if($deniedCookiesFromCookie) {
  70.             $strpos strrpos($deniedCookiesFromCookie,self::COOKIES_SEPERATOR);
  71.             if($strpos === false$strpos 0;
  72.             $deniedCookieGroups substr($deniedCookiesFromCookie,0,$strpos);
  73.             $this->splitDeniedFromCookieAndSafeToSession($session$deniedCookieGroups'acrisCookieGroupsDenied');
  74.             $deniedCookies substr($deniedCookiesFromCookie,strrpos($deniedCookiesFromCookie,self::COOKIES_SEPERATOR) + strlen(self::COOKIES_SEPERATOR));
  75.             $this->splitDeniedFromCookieAndSafeToSession($session$deniedCookies'acrisCookiesDenied');
  76.         }
  77.         $session->set('acrisCookieAccepted'true);
  78.         return true;
  79.     }
  80.     /**
  81.      * @param Session $session
  82.      * @param string $denied
  83.      * @param string $sessionSaveString
  84.      */
  85.     protected function splitDeniedFromCookieAndSafeToSession($session$denied$sessionSaveString)
  86.     {
  87.         if(!$denied) return;
  88.         $deniedArray explode(self::COOKIE_STRING_SEPERATOR$denied);
  89.         if(!empty($deniedArray)) {
  90.             $deniedCookiesFormattedArray = [];
  91.             foreach ($deniedArray as $groupId) {
  92.                 $deniedCookiesFormattedArray[$groupId] = $groupId;
  93.             }
  94.             $session->set($sessionSaveString$deniedCookiesFormattedArray);
  95.         }
  96.     }
  97.     /**
  98.      * @param Response $response
  99.      * @param string $deniedGroups
  100.      * @param string $deniedCookies
  101.      */
  102.     public function setAllowCookies(Request $requestResponse $response$deniedGroups ""$deniedCookies "")
  103.     {
  104.         if(!$deniedGroups && !$deniedCookies) {
  105.             $denied "1";
  106.         } else {
  107.             $denied $deniedGroups self::COOKIES_SEPERATOR $deniedCookies;
  108.         }
  109.         $response->headers->setCookie(new Cookie("acris_cookie_acc"$deniedtime() + (86400 30), '/'nullfalsefalse));
  110.         $response->headers->setCookie(new Cookie("cookie-preference""1"time() + (86400 30), '/'nullfalsefalse));
  111.         $request->cookies->set("acris_cookie_acc"$denied);
  112.         $request->cookies->set("cookie-preference""1");
  113.     }
  114.     /**
  115.      * @param Session $session
  116.      * @param int $groupId
  117.      * @param Context $context
  118.      * @throws \Shopware\Core\Framework\DataAbstractionLayer\Exception\InconsistentCriteriaIdsException
  119.      */
  120.     public function removeCookiesDenyRememberByGroup(Session $session$groupIdContext $context)
  121.     {
  122.         $deniedCookies $session->get('acrisCookiesDenied');
  123.         if(!empty($deniedCookies)) {
  124.             /** @var EntityRepositoryInterface $cookieGroupRepository */
  125.             $cookieGroupRepository $this->container->get('acris_cookie.repository');
  126.             /** @var EntitySearchResult $cookieIdsByGroupId */
  127.             $cookieIdsByGroupId $cookieGroupRepository->search((new Criteria())->addFilter(new EqualsFilter('cookieGroupId'$groupId)), $context);
  128.             $iterator $cookieIdsByGroupId->getIterator();
  129.             while ($iterator->valid()) {
  130.                 /** @var CookieEntity $cookie */
  131.                 $cookie $iterator->current();
  132.                 unset($deniedCookies[$cookie->getId()]);
  133.                 $iterator->next();
  134.             }
  135.             $session->set('acrisCookiesDenied'$deniedCookies);
  136.         }
  137.     }
  138.     public function getDeniedCookiesFromSession(Session $session$type): string
  139.     {
  140.         $deniedCookies $session->get($type);
  141.         if($deniedCookies) {
  142.             sort($deniedCookies);
  143.             return implode(self::COOKIE_STRING_SEPERATOR$deniedCookies);
  144.         }
  145.         return "";
  146.     }
  147.     public function updateCookieFromSessionData(SessionInterface $sessionRequest $request): void
  148.     {
  149.         $deniedGroups $this->getDeniedCookiesFromSession($session'acrisCookieGroupsDenied');
  150.         $deniedCookies $this->getDeniedCookiesFromSession($session'acrisCookiesDenied');
  151.         $acrisCookieAccepted $session->get('acrisCookieAccepted');
  152.         if(!$acrisCookieAccepted && !$deniedGroups && !$deniedCookies) {
  153.             $denied "";
  154.         } else {
  155.             $denied $acrisCookieAccepted "_" $deniedGroups self::COOKIES_SEPERATOR $deniedCookies;
  156.         }
  157.         $this->updateCacheCookie($request$denied);
  158.     }
  159.     public function updateCacheCookie(Request $request$denied ""): void
  160.     {
  161.         if(empty($denied)) {
  162.             $acrisRememberCookie $request->cookies->get('acris_cookie_acc''');
  163.             $permissionCookie $request->cookies->get('cookie-preference''');
  164.             if($permissionCookie || $acrisRememberCookie) {
  165.                 $denied $permissionCookie "_" $acrisRememberCookie;
  166.             }
  167.         }
  168.         if(empty($denied)) {
  169.             return;
  170.         }
  171.         $context $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
  172.         if (!$context instanceof SalesChannelContext) {
  173.             return;
  174.         }
  175.         $this->responseCacheSubscriber->addToCacheHash($denied$context);
  176.     }
  177.     public function checkDenyNonFunctionalCookiesForDefault(Session $session, array $cookieGroups, array $deniedCookieGroupsstring $salesChannelId): array
  178.     {
  179.         if(!$deniedCookieGroups) {
  180.             if(!$this->configService->get('AcrisCookieConsentCS.config.defaultActive'$salesChannelId)) {
  181.                 foreach ($cookieGroups as $key => $cookieGroup) {
  182.                     if($cookieGroup['isDefault'] !== true$deniedCookieGroups[$cookieGroup['id']] = $cookieGroup['id'];
  183.                 }
  184.                 $session->set('acrisCookieGroupsDenied'$deniedCookieGroups);
  185.             }
  186.         }
  187.         return $deniedCookieGroups;
  188.     }
  189. }