blazy-8.x-2.x-dev/src/EventSubscriber/CspSubscriber.php
src/EventSubscriber/CspSubscriber.php
<?php namespace Drupal\blazy\EventSubscriber; use Drupal\Core\Asset\LibraryDependencyResolverInterface; use Drupal\Core\Render\AttachmentsInterface; use Drupal\csp\CspEvents; use Drupal\csp\Event\PolicyAlterEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** * Alter CSP policy for Blazy. */ class CspSubscriber implements EventSubscriberInterface { /** * The Library Dependency Resolver service. * * @var \Drupal\Core\Asset\LibraryDependencyResolverInterface */ private $libraryDependencyResolver; /** * CspSubscriber constructor. * * @param \Drupal\Core\Asset\LibraryDependencyResolverInterface $libraryDependencyResolver * The Library Dependency Resolver Service. */ public function __construct(LibraryDependencyResolverInterface $libraryDependencyResolver) { $this->libraryDependencyResolver = $libraryDependencyResolver; } /** * {@inheritdoc} */ public static function getSubscribedEvents(): array { $events = []; if (class_exists(CspEvents::class)) { $events[CspEvents::POLICY_ALTER] = ['onCspPolicyAlter']; } return $events; } /** * Alter CSP policy to allow data img-src. * * @param \Drupal\csp\Event\PolicyAlterEvent $alterEvent * The Policy Alter event. * * @phpstan-ignore-next-line */ public function onCspPolicyAlter(PolicyAlterEvent $alterEvent) : void { /* @phpstan-ignore-next-line */ $policy = $alterEvent->getPolicy(); /* @phpstan-ignore-next-line */ $response = $alterEvent->getResponse(); if ($response instanceof AttachmentsInterface) { $attachments = $response->getAttachments(); $libraries = isset($attachments['library']) ? $this->libraryDependencyResolver->getLibrariesWithDependencies($attachments['library']) : []; if (in_array('blazy/load', $libraries)) { $policy->fallbackAwareAppendIfEnabled('img-src', ['data:']); } } } }