src/AppBundle/EventSubscriber/ResponseSubscriber.php line 127

Open in your IDE?
  1. <?php
  2. namespace AppBundle\EventSubscriber;
  3. use Exception;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  6. use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
  7. use Symfony\Component\HttpKernel\Event\KernelEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  11. use AppBundle\Security\Authentication\Token\JwtUserToken;
  12. use Lexik\Bundle\JWTAuthenticationBundle\Encoder\JWTEncoderInterface;
  13. use AppBundle\Entity\User\{UserSessionSessionLogUserSessionLog};
  14. use AppBundle\Utils\JWTTokenGenerator;
  15. use Psr\Log\LoggerInterface;
  16. /**
  17.  * Description of ResponseSubscriber
  18.  *
  19.  * look at https://symfony.com/doc/current/event_dispatcher.html#creating-an-event-subscriber
  20.  *
  21.  * @author SAWIT Mateusz Miklewski <biuro@sawit.pl>
  22.  */
  23. class ResponseSubscriber implements EventSubscriberInterface {
  24.     private $entityManager;
  25.     private $tokenStorage;
  26.     private $jwt_encoder;
  27.     private $generator;
  28.     private $logger;
  29.     static $HeadersSet false;
  30.     public function __construct(EntityManagerInterface $entityManagerTokenStorageInterface $tokenStorageJWTEncoderInterface $jwt_encoderJWTTokenGenerator $generatorLoggerInterface $logger)
  31.     {
  32.         $this->entityManager $entityManager;
  33.         $this->tokenStorage $tokenStorage;
  34.         $this->jwt_encoder $jwt_encoder;
  35.         $this->generator $generator;
  36.         $this->logger $logger;
  37.     }
  38.     public static function getSubscribedEvents(): array {
  39.         // return the subscribed events, their methods and priorities
  40.         return array(
  41.            KernelEvents::RESPONSE => array(
  42.                array('addOptionsHeader'10),
  43.                array('addTokenHeader'0),
  44.                array('doShrinkSource'0),
  45.                array('cacheAssets'0)
  46.            )
  47.         );
  48.     }
  49.     public function addOptionsHeader(KernelEvent $event) {
  50.         $request $event->getRequest();
  51.         $method  $request->getMethod();
  52.         $response $event->getResponse();
  53.         if(!self::$HeadersSet) {
  54.             $response->headers->set('Access-Control-Allow-Origin''*');
  55.             $response->headers->set('Access-Control-Allow-Methods''GET,POST,PUT,DELETE');
  56.             $response->headers->set('Access-Control-Allow-Headers''Accept, Authorization, Content-Type, Token');
  57.             $response->headers->set('Access-Control-Expose-Headers''Token');
  58.             self::$HeadersSet true;
  59.         }
  60.         $event->setResponse($response);
  61.         if ('OPTIONS' === $method) {
  62.             $event->stopPropagation();
  63.             return $response;
  64.         }
  65.         return null;
  66.     }
  67.     public function addTokenHeader(KernelEvent $event) {
  68.         $request $event->getRequest();
  69.         $method  $request->getRealMethod();
  70.         if(!$this->entityManager->isOpen()) {
  71.             return;
  72.         }
  73.         $this->entityManager->clear();
  74.         if ('OPTIONS' !== $method) {
  75.             $token $this->tokenStorage->getToken();
  76.             if($token instanceof JwtUserToken) {
  77.                 try {
  78.                     /* @var $session UserSession */
  79.                     $session $this->entityManager->getRepository(UserSession::class)->findOneBy(['token' => $token->nonce]);
  80.                     if($session && !$session->getDeleted()) {
  81.                         $generator $this->generator;
  82.                         $newToken $generator->refreshToken($token);
  83.                         $response $event->getResponse();
  84.                         $response->headers->set('Token'$newToken);
  85.                         $event->setResponse($response);
  86.                         $sessionLog = new UserSessionLog();
  87.                         $sessionLog->setRequest($event->getRequest()->getRequestUri());
  88.                         $sessionLog->setRequestType($event->getRequest()->getMethod());
  89.                         $sessionLog->setUserSession($session);
  90.                         $this->entityManager->persist($sessionLog);
  91.                         $this->entityManager->flush();
  92.                     }
  93.                 } catch (Exception $e) {
  94.                     $this->logger->error($e->getMessage(), $e->getTrace());
  95.                 }
  96.             }
  97.         }
  98.     }
  99.     public function doShrinkSource(FilterResponseEvent $e){
  100.         $response $e->getResponse();
  101.         $request $e->getRequest();
  102.         if(strpos($request->getRequestUri(), '/api') === false && strpos($request->getRequestUri(), '/_profiler') === false && !$response instanceof BinaryFileResponse) {
  103.             $content $response->getContent();
  104.             $html preg_replace('/(\>)\s*(\<)/m''$1$2'$content);
  105.             $html preg_replace('/\r/'''$html);
  106.             $html preg_replace('/\n/'' '$html);
  107.             $html preg_replace('/\t/'' '$html);
  108.             $html preg_replace('/\s{2,}/'' '$html);
  109.             $response->setContent($html);
  110.         }
  111.     }
  112.     public function cacheAssets(FilterResponseEvent $event) {
  113.         $request $event->getRequest();
  114.         if($request->getContentType() == 'text/css') {
  115.             $response $event->getResponse();
  116.             $response->setSharedMaxAge(6*30*24*60*60); // 6 mies
  117.         }
  118.     }
  119. }