vendor/web-token/jwt-framework/src/Bundle/JoseFramework/DataCollector/JWECollector.php line 125

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * The MIT License (MIT)
  5.  *
  6.  * Copyright (c) 2014-2020 Spomky-Labs
  7.  *
  8.  * This software may be modified and distributed under the terms
  9.  * of the MIT license.  See the LICENSE file for details.
  10.  */
  11. namespace Jose\Bundle\JoseFramework\DataCollector;
  12. use Jose\Bundle\JoseFramework\Event\JWEBuiltFailureEvent;
  13. use Jose\Bundle\JoseFramework\Event\JWEBuiltSuccessEvent;
  14. use Jose\Bundle\JoseFramework\Event\JWEDecryptionFailureEvent;
  15. use Jose\Bundle\JoseFramework\Event\JWEDecryptionSuccessEvent;
  16. use Jose\Component\Encryption\Compression\CompressionMethodManagerFactory;
  17. use Jose\Component\Encryption\JWEBuilder;
  18. use Jose\Component\Encryption\JWEDecrypter;
  19. use Jose\Component\Encryption\JWELoader;
  20. use Jose\Component\Encryption\Serializer\JWESerializerManagerFactory;
  21. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\VarDumper\Cloner\VarCloner;
  25. use Throwable;
  26. class JWECollector implements CollectorEventSubscriberInterface
  27. {
  28.     /**
  29.      * @var null|JWESerializerManagerFactory
  30.      */
  31.     private $jweSerializerManagerFactory;
  32.     /**
  33.      * @var null|CompressionMethodManagerFactory
  34.      */
  35.     private $compressionMethodManagerFactory;
  36.     /**
  37.      * @var array
  38.      */
  39.     private $jweDecryptionSuccesses = [];
  40.     /**
  41.      * @var array
  42.      */
  43.     private $jweDecryptionFailures = [];
  44.     /**
  45.      * @var array
  46.      */
  47.     private $jweBuiltSuccesses = [];
  48.     /**
  49.      * @var array
  50.      */
  51.     private $jweBuiltFailures = [];
  52.     /**
  53.      * @var JWEBuilder[]
  54.      */
  55.     private $jweBuilders = [];
  56.     /**
  57.      * @var JWEDecrypter[]
  58.      */
  59.     private $jweDecrypters = [];
  60.     /**
  61.      * @var JWELoader[]
  62.      */
  63.     private $jweLoaders = [];
  64.     public function __construct(?CompressionMethodManagerFactory $compressionMethodManagerFactory null, ?JWESerializerManagerFactory $jweSerializerManagerFactory null)
  65.     {
  66.         $this->compressionMethodManagerFactory $compressionMethodManagerFactory;
  67.         $this->jweSerializerManagerFactory $jweSerializerManagerFactory;
  68.     }
  69.     public function collect(array &$dataRequest $requestResponse $response, ?Throwable $exception null): void
  70.     {
  71.         $this->collectSupportedCompressionMethods($data);
  72.         $this->collectSupportedJWESerializations($data);
  73.         $this->collectSupportedJWEBuilders($data);
  74.         $this->collectSupportedJWEDecrypters($data);
  75.         $this->collectSupportedJWELoaders($data);
  76.         $this->collectEvents($data);
  77.     }
  78.     public function addJWEBuilder(string $idJWEBuilder $jweBuilder): void
  79.     {
  80.         $this->jweBuilders[$id] = $jweBuilder;
  81.     }
  82.     public function addJWEDecrypter(string $idJWEDecrypter $jweDecrypter): void
  83.     {
  84.         $this->jweDecrypters[$id] = $jweDecrypter;
  85.     }
  86.     public function addJWELoader(string $idJWELoader $jweLoader): void
  87.     {
  88.         $this->jweLoaders[$id] = $jweLoader;
  89.     }
  90.     public static function getSubscribedEvents()
  91.     {
  92.         return [
  93.             JWEDecryptionSuccessEvent::class => ['catchJweDecryptionSuccess'],
  94.             JWEDecryptionFailureEvent::class => ['catchJweDecryptionFailure'],
  95.             JWEBuiltSuccessEvent::class => ['catchJweBuiltSuccess'],
  96.             JWEBuiltFailureEvent::class => ['catchJweBuiltFailure'],
  97.         ];
  98.     }
  99.     public function catchJweDecryptionSuccess(JWEDecryptionSuccessEvent $event): void
  100.     {
  101.         $cloner = new VarCloner();
  102.         $this->jweDecryptionSuccesses[] = $cloner->cloneVar($event);
  103.     }
  104.     public function catchJweDecryptionFailure(JWEDecryptionFailureEvent $event): void
  105.     {
  106.         $cloner = new VarCloner();
  107.         $this->jweDecryptionFailures[] = $cloner->cloneVar($event);
  108.     }
  109.     public function catchJweBuiltSuccess(JWEBuiltSuccessEvent $event): void
  110.     {
  111.         $cloner = new VarCloner();
  112.         $this->jweBuiltSuccesses[] = $cloner->cloneVar($event);
  113.     }
  114.     public function catchJweBuiltFailure(JWEBuiltFailureEvent $event): void
  115.     {
  116.         $cloner = new VarCloner();
  117.         $this->jweBuiltFailures[] = $cloner->cloneVar($event);
  118.     }
  119.     private function collectSupportedCompressionMethods(array &$data): void
  120.     {
  121.         $data['jwe']['compression_methods'] = [];
  122.         if (null === $this->compressionMethodManagerFactory) {
  123.             return;
  124.         }
  125.         $compressionMethods $this->compressionMethodManagerFactory->all();
  126.         foreach ($compressionMethods as $alias => $compressionMethod) {
  127.             $data['jwe']['compression_methods'][$alias] = $compressionMethod->name();
  128.         }
  129.     }
  130.     private function collectSupportedJWESerializations(array &$data): void
  131.     {
  132.         $data['jwe']['jwe_serialization'] = [];
  133.         if (null === $this->jweSerializerManagerFactory) {
  134.             return;
  135.         }
  136.         $serializers $this->jweSerializerManagerFactory->all();
  137.         foreach ($serializers as $serializer) {
  138.             $data['jwe']['jwe_serialization'][$serializer->name()] = $serializer->displayName();
  139.         }
  140.     }
  141.     private function collectSupportedJWEBuilders(array &$data): void
  142.     {
  143.         $data['jwe']['jwe_builders'] = [];
  144.         foreach ($this->jweBuilders as $id => $jweBuilder) {
  145.             $data['jwe']['jwe_builders'][$id] = [
  146.                 'key_encryption_algorithms' => $jweBuilder->getKeyEncryptionAlgorithmManager()->list(),
  147.                 'content_encryption_algorithms' => $jweBuilder->getContentEncryptionAlgorithmManager()->list(),
  148.                 'compression_methods' => $jweBuilder->getCompressionMethodManager()->list(),
  149.             ];
  150.         }
  151.     }
  152.     private function collectSupportedJWEDecrypters(array &$data): void
  153.     {
  154.         $data['jwe']['jwe_decrypters'] = [];
  155.         foreach ($this->jweDecrypters as $id => $jweDecrypter) {
  156.             $data['jwe']['jwe_decrypters'][$id] = [
  157.                 'key_encryption_algorithms' => $jweDecrypter->getKeyEncryptionAlgorithmManager()->list(),
  158.                 'content_encryption_algorithms' => $jweDecrypter->getContentEncryptionAlgorithmManager()->list(),
  159.                 'compression_methods' => $jweDecrypter->getCompressionMethodManager()->list(),
  160.             ];
  161.         }
  162.     }
  163.     private function collectSupportedJWELoaders(array &$data): void
  164.     {
  165.         $data['jwe']['jwe_loaders'] = [];
  166.         foreach ($this->jweLoaders as $id => $jweLoader) {
  167.             $data['jwe']['jwe_loaders'][$id] = [
  168.                 'serializers' => $jweLoader->getSerializerManager()->names(),
  169.                 'key_encryption_algorithms' => $jweLoader->getJweDecrypter()->getKeyEncryptionAlgorithmManager()->list(),
  170.                 'content_encryption_algorithms' => $jweLoader->getJweDecrypter()->getContentEncryptionAlgorithmManager()->list(),
  171.                 'compression_methods' => $jweLoader->getJweDecrypter()->getCompressionMethodManager()->list(),
  172.             ];
  173.         }
  174.     }
  175.     private function collectEvents(array &$data): void
  176.     {
  177.         $data['jwe']['events'] = [
  178.             'decryption_success' => $this->jweDecryptionSuccesses,
  179.             'decryption_failure' => $this->jweDecryptionFailures,
  180.             'built_success' => $this->jweBuiltSuccesses,
  181.             'built_failure' => $this->jweBuiltFailures,
  182.         ];
  183.     }
  184. }