vendor/opctim/symfony-csp-bundle/src/EventSubscriber/CspHeaderEventSubscriber.php line 53

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Opctim\CspBundle\EventSubscriber;
  4. use Opctim\CspBundle\Event\AddCspHeaderEvent;
  5. use Opctim\CspBundle\Service\CspHeaderBuilderService;
  6. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpKernel\Event\RequestEvent;
  9. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  10. use Symfony\Component\HttpKernel\KernelEvents;
  11. class CspHeaderEventSubscriber implements EventSubscriberInterface
  12. {
  13.     private string $cspHeader '';
  14.     private EventDispatcherInterface $eventDispatcher;
  15.     private CspHeaderBuilderService $headerBuilderService;
  16.     public function __construct(
  17.         CspHeaderBuilderService  $headerBuilderService,
  18.         EventDispatcherInterface $eventDispatcher
  19.     )
  20.     {
  21.         $this->headerBuilderService $headerBuilderService;
  22.         $this->eventDispatcher $eventDispatcher;
  23.     }
  24.     public static function getSubscribedEvents(): array
  25.     {
  26.         return [
  27.             KernelEvents::REQUEST => 'onKernelRequest',
  28.             KernelEvents::RESPONSE => 'onKernelResponse'
  29.         ];
  30.     }
  31.     public function onKernelRequest(RequestEvent $event): void
  32.     {
  33.         $addCspHeaderEvent = new AddCspHeaderEvent($event->getRequest());
  34.         $this->eventDispatcher->dispatch($addCspHeaderEventAddCspHeaderEvent::NAME);
  35.         if ($addCspHeaderEvent->isModified()) {
  36.             $this->cspHeader $addCspHeaderEvent->getCspHeaderValue();
  37.             return;
  38.         }
  39.         $this->cspHeader $this->headerBuilderService->build();
  40.     }
  41.     public function onKernelResponse(ResponseEvent $event): void
  42.     {
  43.         $headerKeys = [
  44.             'Content-Security-Policy',
  45.             'X-Content-Security-Policy',
  46.             'X-WebKit-CSP'
  47.         ];
  48.         $response $event->getResponse();
  49.         $reportingEndpointHeader $this->headerBuilderService->buildReportingEndpointsHeader();
  50.         if ($reportingEndpointHeader) {
  51.             $response->headers->set('Reporting-Endpoint'$reportingEndpointHeader);
  52.         }
  53.         foreach ($headerKeys as $headerKey) {
  54.             $response->headers->set($headerKey$this->cspHeader);
  55.         }
  56.     }
  57. }