<?php 
 
/* 
 * This file is part of the Nelmio SecurityBundle. 
 * 
 * (c) Nelmio <hello@nelm.io> 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
namespace Nelmio\SecurityBundle\EventListener; 
 
use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 
use Symfony\Component\HttpKernel\Event\ResponseEvent; 
use Symfony\Component\HttpKernel\HttpKernelInterface; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpKernel\KernelEvents; 
 
/** 
 * @final 
 */ 
class XssProtectionListener implements EventSubscriberInterface 
{ 
    private $enabled; 
    private $modeBlock; 
    private $reportUri; 
 
    public function __construct($enabled, $modeBlock, $reportUri = null) 
    { 
        $this->enabled = $enabled; 
        $this->modeBlock = $modeBlock; 
        $this->reportUri = $reportUri; 
    } 
 
    /** 
     * @param FilterResponseEvent|ResponseEvent $e 
     */ 
    public function onKernelResponse($e) 
    { 
        // Compatibility with Symfony < 5 and Symfony >=5 
        if (!$e instanceof FilterResponseEvent && !$e instanceof ResponseEvent) { 
            throw new \InvalidArgumentException(\sprintf('Expected instance of type %s, %s given', \class_exists(ResponseEvent::class) ? ResponseEvent::class : FilterResponseEvent::class, \is_object($e) ? \get_class($e) : \gettype($e))); 
        } 
 
        if (HttpKernelInterface::MASTER_REQUEST !== $e->getRequestType()) { 
            return; 
        } 
 
        $response = $e->getResponse(); 
 
        if ($response->isRedirection()) { 
            return; 
        } 
 
        $value = '0'; 
        if ($this->enabled) { 
            $value = '1'; 
 
            if ($this->modeBlock) { 
                $value .= '; mode=block'; 
            } 
 
            if ($this->reportUri) { 
                $value .= '; report=' . $this->reportUri; 
            } 
        } 
 
        $response->headers->set('X-XSS-Protection', $value); 
    } 
 
    /** 
     * @return array 
     */ 
    public static function getSubscribedEvents() 
    { 
        return array(KernelEvents::RESPONSE => 'onKernelResponse'); 
    } 
 
    public static function fromConfig(array $config) 
    { 
        $enabled = $config['enabled']; 
        $modeBlock = $config['mode_block']; 
        $reportUri = $config['report_uri']; 
 
        return new self($enabled, $modeBlock, $reportUri); 
    } 
}