<?php
declare(strict_types=1);
namespace App\Subscriber;
use App\Store\StoreContext;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
/**
* @see config/packages/framework.yaml
*/
class PunchoutCookiePolicySubscriber implements EventSubscriberInterface
{
private StoreContext $storeContext;
private LoggerInterface $logger;
public function __construct(StoreContext $storeContext, LoggerInterface $logger)
{
$this->storeContext = $storeContext;
$this->logger = $logger;
}
public static function getSubscribedEvents(): array
{
// run after Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelResponse()
return [KernelEvents::RESPONSE => ['onKernelResponse', -1001]];
}
/**
* Change cookie samesite=lax to samesite=none for punchout store requests
*/
public function onKernelResponse(ResponseEvent $event): void
{
if (!$this->storeContext->isPunchoutStore()) {
return;
}
$response = $event->getResponse();
$cookieList = $response->headers->getCookies();
foreach ($cookieList as $cookie) {
$name = $cookie->getName();
if ($name !== 'PHPSESSID') {
continue;
}
$updatedCookie = $cookie->withSameSite('none');
$response->headers->setCookie($updatedCookie);
if (!$event->getRequest()->isSecure()) {
$this->logger->error('Cookie PHPSESSID is ignored by browser, due to browser security with settings samesite=none and non-https connection.');
}
}
}
}