vendor/kunstmaan/admin-bundle/EventListener/ToolbarListener.php line 122

Open in your IDE?
  1. <?php
  2. namespace Kunstmaan\AdminBundle\EventListener;
  3. use Kunstmaan\AdminBundle\Helper\AdminRouteHelper;
  4. use Kunstmaan\AdminBundle\Helper\Toolbar\DataCollector;
  5. use Symfony\Component\DependencyInjection\ContainerInterface;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  10. use Symfony\Component\HttpKernel\HttpKernel;
  11. use Symfony\Component\HttpKernel\KernelEvents;
  12. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  13. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  14. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  15. use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
  16. use Twig\Environment;
  17. class ToolbarListener implements EventSubscriberInterface
  18. {
  19.     const DISABLED 1;
  20.     const ENABLED 2;
  21.     /**
  22.      * @var Environment
  23.      */
  24.     protected $twig;
  25.     /**
  26.      * @var UrlGeneratorInterface
  27.      */
  28.     protected $urlGenerator;
  29.     /**
  30.      * @var DataCollector
  31.      */
  32.     protected $dataCollector;
  33.     /**
  34.      * @var AuthorizationChecker
  35.      */
  36.     protected $authorizationChecker;
  37.     /**
  38.      * @var TokenStorageInterface
  39.      */
  40.     protected $tokenStorage;
  41.     /**
  42.      * @var bool
  43.      */
  44.     protected $enabled;
  45.     /**
  46.      * @var ContainerInterface
  47.      */
  48.     private $container;
  49.     /**
  50.      * @var AdminRouteHelper
  51.      */
  52.     protected $adminRouteHelper;
  53.     /**
  54.      * @var array
  55.      */
  56.     protected $providerKeys;
  57.     /**
  58.      * @var array
  59.      */
  60.     protected $adminFirewallName;
  61.     /**
  62.      * @param bool   $enabled
  63.      * @param string $adminFirewallName
  64.      */
  65.     public function __construct(
  66.         Environment $twig,
  67.         UrlGeneratorInterface $urlGenerator,
  68.         DataCollector $dataCollector,
  69.         AuthorizationChecker $authorizationChecker,
  70.         TokenStorageInterface $tokenStorage,
  71.         $enabled,
  72.         ContainerInterface $container,
  73.         AdminRouteHelper $adminRouteHelper,
  74.         array $providerKeys,
  75.         $adminFirewallName 'main',
  76.     ) {
  77.         $this->twig $twig;
  78.         $this->urlGenerator $urlGenerator;
  79.         $this->dataCollector $dataCollector;
  80.         $this->authorizationChecker $authorizationChecker;
  81.         $this->tokenStorage $tokenStorage;
  82.         $this->enabled $enabled;
  83.         $this->container $container;
  84.         $this->adminRouteHelper $adminRouteHelper;
  85.         $this->providerKeys $providerKeys;
  86.         $this->adminFirewallName $adminFirewallName;
  87.     }
  88.     /**
  89.      * @return array
  90.      */
  91.     public static function getSubscribedEvents()
  92.     {
  93.         return [
  94.             KernelEvents::RESPONSE => ['onKernelResponse', -125],
  95.         ];
  96.     }
  97.     /**
  98.      * @return bool
  99.      */
  100.     public function isEnabled()
  101.     {
  102.         return !$this->container->has('profiler') && $this->enabled;
  103.     }
  104.     public function onKernelResponse(ResponseEvent $event)
  105.     {
  106.         if (!$this->isEnabled() || HttpKernel::MAIN_REQUEST !== $event->getRequestType()) {
  107.             return;
  108.         }
  109.         $response $event->getResponse();
  110.         $request $event->getRequest();
  111.         $session $request->getSession();
  112.         $url $event->getRequest()->getRequestUri();
  113.         $token $this->tokenStorage->getToken();
  114.         if (null !== $token && method_exists($token'getFirewallName')) {
  115.             $key $token->getFirewallName();
  116.         } else {
  117.             $key $this->adminFirewallName;
  118.         }
  119.         // Only enable toolbar when the kunstmaan_admin.toolbar_firewall_names config value contains the current firewall name.
  120.         if (!\in_array($key$this->providerKeysfalse)) {
  121.             return false;
  122.         }
  123.         // Only enable toolbar when we can find an authenticated user in the session from the kunstmaan_admin.admin_firewall_name config value.
  124.         $authenticated false;
  125.         if ($session->isStarted() && $session->has(sprintf('_security_%s'$this->adminFirewallName))) {
  126.             /** @var TokenInterface $token */
  127.             $token unserialize($session->get(sprintf('_security_%s'$this->adminFirewallName)));
  128.             $authenticated null !== $token;
  129.         }
  130.         // Do not capture redirects or modify XML HTTP Requests
  131.         if (!$authenticated || !$event->isMainRequest() || $request->isXmlHttpRequest() || $this->adminRouteHelper->isAdminRoute($url)) {
  132.             return;
  133.         }
  134.         if ($response->isRedirection() || ($response->headers->has('Content-Type') && false === strpos(
  135.             $response->headers->get('Content-Type'),
  136.             'html'
  137.         ))
  138.             || 'html' !== $request->getRequestFormat()
  139.             || false !== stripos($response->headers->get('Content-Disposition'), 'attachment;')
  140.         ) {
  141.             return;
  142.         }
  143.         $this->injectToolbar($response$request);
  144.     }
  145.     /**
  146.      * Injects the admin toolbar into the given Response.
  147.      *
  148.      * @param Response $response A Response instance
  149.      */
  150.     protected function injectToolbar(Response $responseRequest $request)
  151.     {
  152.         $content $response->getContent();
  153.         $pos strripos($content'</body>');
  154.         if (false !== $pos) {
  155.             $toolbar "\n" str_replace(
  156.                 "\n",
  157.                 '',
  158.                 $this->twig->render(
  159.                     '@KunstmaanAdmin/Toolbar/toolbar.html.twig',
  160.                     ['collectors' => $this->dataCollector->getDataCollectors()]
  161.                 )
  162.             ) . "\n";
  163.             $content substr($content0$pos) . $toolbar substr($content$pos);
  164.             $response->setContent($content);
  165.         }
  166.     }
  167. }