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

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.         $salesChannelId $session->has(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID) ? $session->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID) : null;
  69.         $forceConsent $this->configService->get('AcrisCookieConsentCS.config.forceConsent'$salesChannelId);
  70.         if ($forceConsent || (!$deniedCookiesFromCookie && !$allowCookie)) {
  71.             return false;
  72.         }
  73.         if($deniedCookiesFromCookie) {
  74.             $strpos strrpos($deniedCookiesFromCookie,self::COOKIES_SEPERATOR);
  75.             if($strpos === false$strpos 0;
  76.             $deniedCookieGroups substr($deniedCookiesFromCookie,0,$strpos);
  77.             $this->splitDeniedFromCookieAndSafeToSession($session$deniedCookieGroups'acrisCookieGroupsDenied');
  78.             $deniedCookies substr($deniedCookiesFromCookie,strrpos($deniedCookiesFromCookie,self::COOKIES_SEPERATOR) + strlen(self::COOKIES_SEPERATOR));
  79.             $this->splitDeniedFromCookieAndSafeToSession($session$deniedCookies'acrisCookiesDenied');
  80.         }
  81.         $session->set('acrisCookieAccepted'true);
  82.         return true;
  83.     }
  84.     /**
  85.      * @param Session $session
  86.      * @param string $denied
  87.      * @param string $sessionSaveString
  88.      */
  89.     protected function splitDeniedFromCookieAndSafeToSession($session$denied$sessionSaveString)
  90.     {
  91.         if(!$denied) return;
  92.         $deniedArray explode(self::COOKIE_STRING_SEPERATOR$denied);
  93.         if(!empty($deniedArray)) {
  94.             $deniedCookiesFormattedArray = [];
  95.             foreach ($deniedArray as $groupId) {
  96.                 $deniedCookiesFormattedArray[$groupId] = $groupId;
  97.             }
  98.             $session->set($sessionSaveString$deniedCookiesFormattedArray);
  99.         }
  100.     }
  101.     /**
  102.      * @param Response $response
  103.      * @param string $deniedGroups
  104.      * @param string $deniedCookies
  105.      */
  106.     public function setAllowCookies(Request $requestResponse $response$deniedGroups ""$deniedCookies "")
  107.     {
  108.         if(!$deniedGroups && !$deniedCookies) {
  109.             $denied "1";
  110.         } else {
  111.             $denied $deniedGroups self::COOKIES_SEPERATOR $deniedCookies;
  112.         }
  113.         $firstActivated $request->cookies->get("acris_cookie_first_activated");
  114.         if($firstActivated) {
  115.             $response->headers->setCookie(new Cookie("acris_cookie_acc"$deniedtime() + (86400 30), '/'nullfalsefalse));
  116.             $response->headers->setCookie(new Cookie("cookie-preference""1"time() + (86400 30), '/'nullfalsefalse));
  117.             $request->cookies->set("acris_cookie_acc"$denied);
  118.             $request->cookies->set("cookie-preference""1");
  119.         }
  120.     }
  121.     /**
  122.      * @param Session $session
  123.      * @param int $groupId
  124.      * @param Context $context
  125.      * @throws \Shopware\Core\Framework\DataAbstractionLayer\Exception\InconsistentCriteriaIdsException
  126.      */
  127.     public function removeCookiesDenyRememberByGroup(Session $session$groupIdContext $context)
  128.     {
  129.         $deniedCookies $session->get('acrisCookiesDenied');
  130.         if(!empty($deniedCookies)) {
  131.             /** @var EntityRepositoryInterface $cookieGroupRepository */
  132.             $cookieGroupRepository $this->container->get('acris_cookie.repository');
  133.             /** @var EntitySearchResult $cookieIdsByGroupId */
  134.             $cookieIdsByGroupId $cookieGroupRepository->search((new Criteria())->addFilter(new EqualsFilter('cookieGroupId'$groupId)), $context);
  135.             $iterator $cookieIdsByGroupId->getIterator();
  136.             while ($iterator->valid()) {
  137.                 /** @var CookieEntity $cookie */
  138.                 $cookie $iterator->current();
  139.                 unset($deniedCookies[$cookie->getId()]);
  140.                 $iterator->next();
  141.             }
  142.             $session->set('acrisCookiesDenied'$deniedCookies);
  143.         }
  144.     }
  145.     public function getDeniedCookiesFromSession(Session $session$type): string
  146.     {
  147.         $deniedCookies $session->get($type);
  148.         if($deniedCookies) {
  149.             sort($deniedCookies);
  150.             return implode(self::COOKIE_STRING_SEPERATOR$deniedCookies);
  151.         }
  152.         return "";
  153.     }
  154.     public function updateCookieFromSessionData(SessionInterface $sessionRequest $request): void
  155.     {
  156.         $deniedGroups $this->getDeniedCookiesFromSession($session'acrisCookieGroupsDenied');
  157.         $deniedCookies $this->getDeniedCookiesFromSession($session'acrisCookiesDenied');
  158.         $acrisCookieAccepted $session->get('acrisCookieAccepted');
  159.         if(!$acrisCookieAccepted && !$deniedGroups && !$deniedCookies) {
  160.             $denied "";
  161.         } else {
  162.             $denied $acrisCookieAccepted "_" $deniedGroups self::COOKIES_SEPERATOR $deniedCookies;
  163.         }
  164.         $this->updateCacheCookie($request$denied);
  165.     }
  166.     public function updateCacheCookie(Request $request$denied ""): void
  167.     {
  168.         if(empty($denied)) {
  169.             $acrisRememberCookie $request->cookies->get('acris_cookie_acc''');
  170.             $permissionCookie $request->cookies->get('cookie-preference''');
  171.             if($permissionCookie || $acrisRememberCookie) {
  172.                 $denied $permissionCookie "_" $acrisRememberCookie;
  173.             }
  174.         }
  175.         if(empty($denied)) {
  176.             return;
  177.         }
  178.         $context $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
  179.         if (!$context instanceof SalesChannelContext) {
  180.             return;
  181.         }
  182.         $this->responseCacheSubscriber->addToCacheHash($denied$context);
  183.     }
  184.     public function checkDenyNonFunctionalCookiesForDefault(Session $session, array $cookieGroups, array $deniedCookieGroupsstring $salesChannelId): array
  185.     {
  186.         if(!$deniedCookieGroups) {
  187.             if(!$this->configService->get('AcrisCookieConsentCS.config.defaultActive'$salesChannelId)) {
  188.                 foreach ($cookieGroups as $key => $cookieGroup) {
  189.                     if($cookieGroup['isDefault'] !== true$deniedCookieGroups[$cookieGroup['id']] = $cookieGroup['id'];
  190.                 }
  191.                 $session->set('acrisCookieGroupsDenied'$deniedCookieGroups);
  192.             }
  193.         }
  194.         return $deniedCookieGroups;
  195.     }
  196. }