vendor/web-token/jwt-bundle/DataCollector/JWSCollector.php line 101

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