vendor/web-token/jwt-framework/src/Bundle/JoseFramework/DataCollector/JWSCollector.php line 123

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\JWSBuiltFailureEvent;
  13. use Jose\Bundle\JoseFramework\Event\JWSBuiltSuccessEvent;
  14. use Jose\Bundle\JoseFramework\Event\JWSVerificationFailureEvent;
  15. use Jose\Bundle\JoseFramework\Event\JWSVerificationSuccessEvent;
  16. use Jose\Component\Signature\JWSBuilder;
  17. use Jose\Component\Signature\JWSLoader;
  18. use Jose\Component\Signature\JWSVerifier;
  19. use Jose\Component\Signature\Serializer\JWSSerializerManagerFactory;
  20. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\HttpFoundation\Response;
  23. use Symfony\Component\VarDumper\Cloner\VarCloner;
  24. use Throwable;
  25. class JWSCollector implements CollectorEventSubscriberInterface
  26. {
  27.     /**
  28.      * @var null|JWSSerializerManagerFactory
  29.      */
  30.     private $jwsSerializerManagerFactory;
  31.     /**
  32.      * @var JWSBuilder[]
  33.      */
  34.     private $jwsBuilders = [];
  35.     /**
  36.      * @var JWSVerifier[]
  37.      */
  38.     private $jwsVerifiers = [];
  39.     /**
  40.      * @var JWSLoader[]
  41.      */
  42.     private $jwsLoaders = [];
  43.     /**
  44.      * @var array
  45.      */
  46.     private $jwsVerificationSuccesses = [];
  47.     /**
  48.      * @var array
  49.      */
  50.     private $jwsVerificationFailures = [];
  51.     /**
  52.      * @var array
  53.      */
  54.     private $jwsBuiltSuccesses = [];
  55.     /**
  56.      * @var array
  57.      */
  58.     private $jwsBuiltFailures = [];
  59.     public function __construct(?JWSSerializerManagerFactory $jwsSerializerManagerFactory null)
  60.     {
  61.         $this->jwsSerializerManagerFactory $jwsSerializerManagerFactory;
  62.     }
  63.     public function collect(array &$dataRequest $requestResponse $response, ?Throwable $exception null): void
  64.     {
  65.         $this->collectSupportedJWSSerializations($data);
  66.         $this->collectSupportedJWSBuilders($data);
  67.         $this->collectSupportedJWSVerifiers($data);
  68.         $this->collectSupportedJWSLoaders($data);
  69.         $this->collectEvents($data);
  70.     }
  71.     public function addJWSBuilder(string $idJWSBuilder $jwsBuilder): void
  72.     {
  73.         $this->jwsBuilders[$id] = $jwsBuilder;
  74.     }
  75.     public function addJWSVerifier(string $idJWSVerifier $jwsVerifier): void
  76.     {
  77.         $this->jwsVerifiers[$id] = $jwsVerifier;
  78.     }
  79.     public function addJWSLoader(string $idJWSLoader $jwsLoader): void
  80.     {
  81.         $this->jwsLoaders[$id] = $jwsLoader;
  82.     }
  83.     public static function getSubscribedEvents()
  84.     {
  85.         return [
  86.             JWSVerificationSuccessEvent::class => ['catchJwsVerificationSuccess'],
  87.             JWSVerificationFailureEvent::class => ['catchJwsVerificationFailure'],
  88.             JWSBuiltSuccessEvent::class => ['catchJwsBuiltSuccess'],
  89.             JWSBuiltFailureEvent::class => ['catchJwsBuiltFailure'],
  90.         ];
  91.     }
  92.     public function catchJwsVerificationSuccess(JWSVerificationSuccessEvent $event): void
  93.     {
  94.         $cloner = new VarCloner();
  95.         $this->jwsVerificationSuccesses[] = $cloner->cloneVar($event);
  96.     }
  97.     public function catchJwsVerificationFailure(JWSVerificationFailureEvent $event): void
  98.     {
  99.         $cloner = new VarCloner();
  100.         $this->jwsVerificationFailures[] = $cloner->cloneVar($event);
  101.     }
  102.     public function catchJwsBuiltSuccess(JWSBuiltSuccessEvent $event): void
  103.     {
  104.         $cloner = new VarCloner();
  105.         $this->jwsBuiltSuccesses[] = $cloner->cloneVar($event);
  106.     }
  107.     public function catchJwsBuiltFailure(JWSBuiltFailureEvent $event): void
  108.     {
  109.         $cloner = new VarCloner();
  110.         $this->jwsBuiltFailures[] = $cloner->cloneVar($event);
  111.     }
  112.     private function collectSupportedJWSSerializations(array &$data): void
  113.     {
  114.         $data['jws']['jws_serialization'] = [];
  115.         if (null === $this->jwsSerializerManagerFactory) {
  116.             return;
  117.         }
  118.         $serializers $this->jwsSerializerManagerFactory->all();
  119.         foreach ($serializers as $serializer) {
  120.             $data['jws']['jws_serialization'][$serializer->name()] = $serializer->displayName();
  121.         }
  122.     }
  123.     private function collectSupportedJWSBuilders(array &$data): void
  124.     {
  125.         $data['jws']['jws_builders'] = [];
  126.         foreach ($this->jwsBuilders as $id => $jwsBuilder) {
  127.             $data['jws']['jws_builders'][$id] = [
  128.                 'signature_algorithms' => $jwsBuilder->getSignatureAlgorithmManager()->list(),
  129.             ];
  130.         }
  131.     }
  132.     private function collectSupportedJWSVerifiers(array &$data): void
  133.     {
  134.         $data['jws']['jws_verifiers'] = [];
  135.         foreach ($this->jwsVerifiers as $id => $jwsVerifier) {
  136.             $data['jws']['jws_verifiers'][$id] = [
  137.                 'signature_algorithms' => $jwsVerifier->getSignatureAlgorithmManager()->list(),
  138.             ];
  139.         }
  140.     }
  141.     private function collectSupportedJWSLoaders(array &$data): void
  142.     {
  143.         $data['jws']['jws_loaders'] = [];
  144.         foreach ($this->jwsLoaders as $id => $jwsLoader) {
  145.             $data['jws']['jws_loaders'][$id] = [
  146.                 'serializers' => $jwsLoader->getSerializerManager()->list(),
  147.                 'signature_algorithms' => $jwsLoader->getJwsVerifier()->getSignatureAlgorithmManager()->list(),
  148.             ];
  149.         }
  150.     }
  151.     private function collectEvents(array &$data): void
  152.     {
  153.         $data['jws']['events'] = [
  154.             'verification_success' => $this->jwsVerificationSuccesses,
  155.             'verification_failure' => $this->jwsVerificationFailures,
  156.             'built_success' => $this->jwsBuiltSuccesses,
  157.             'built_failure' => $this->jwsBuiltFailures,
  158.         ];
  159.     }
  160. }