src/EventSubscriber/ResponseEncryptingSubscriber.php line 70

Open in your IDE?
  1. <?php
  2. /**
  3.  * @license SILK SOFTWARE HOUSE SP Z O O
  4.  */
  5. namespace App\EventSubscriber;
  6. use App\Decoder\Interfaces\DecoderInterface;
  7. use App\Entity\DeviceCommand;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  11. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  12. use Symfony\Component\HttpKernel\KernelEvents;
  13. /**
  14.  * Class ResponseEncryptingSubscriber.
  15.  */
  16. class ResponseEncryptingSubscriber implements EventSubscriberInterface
  17. {
  18.     const MAX_BUFFER_SIZE 400;
  19.     /**
  20.      * Decoder.
  21.      *
  22.      * @var DecoderInterface
  23.      */
  24.     private $decoder;
  25.     /**
  26.      * Device ping path.
  27.      *
  28.      * @var string[]
  29.      */
  30.     private $encryptedPaths;
  31.     /**
  32.      * ResponseEncryptingSubscriber constructor.
  33.      *
  34.      * @param DecoderInterface $decoder
  35.      * @param string[]         $encryptedPaths Array of encrypted paths.
  36.      */
  37.     public function __construct(DecoderInterface $decoder, array $encryptedPaths)
  38.     {
  39.         $this->decoder $decoder;
  40.         $this->encryptedPaths $encryptedPaths;
  41.     }
  42.     /**
  43.      * Get subscribed events.
  44.      *
  45.      * @return array
  46.      */
  47.     public static function getSubscribedEvents(): array
  48.     {
  49.         return [
  50.             KernelEvents::RESPONSE => [
  51.                 ['onKernelResponse', -9999],
  52.             ],
  53.         ];
  54.     }
  55.     /**
  56.      * On kernel response.
  57.      *
  58.      * @param ResponseEvent $event
  59.      *
  60.      * @throws AccessDeniedHttpException
  61.      */
  62.     public function onKernelResponse(ResponseEvent $event)
  63.     {
  64.         if (!$event->isMasterRequest() || !in_array($event->getRequest()->getPathInfo(), $this->encryptedPaths)) {
  65.             return;
  66.         }
  67.         $serial $event->getResponse()->headers->get('serial');
  68.         if ($serial) {
  69.             $event->getResponse()->headers->remove('serial');
  70.         }
  71.         $encrypted $this->decoder->encrypt($event->getResponse()->getContent(), $serial);
  72.         $response $event->getResponse();
  73.         $response->setContent($encrypted);
  74.         $response->headers->remove('Content-Type');
  75.         $response->headers->add(['Content-Type' => 'text/plain']);
  76.         if (strlen($encrypted) > self::MAX_BUFFER_SIZE) {
  77.             $response->setStatusCode(Response::HTTP_REQUEST_ENTITY_TOO_LARGE);
  78.             $contentWhereSizeFailed json_encode(['cmd' => DeviceCommand::NO_COMMAND]);
  79.             $response->setContent($this->decoder->encrypt($contentWhereSizeFailed$serial));
  80.         }
  81.         $event->setResponse($response);
  82.     }
  83. }