vendor/web-token/jwt-bundle/DataCollector/CheckerCollector.php line 92

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Jose\Bundle\JoseFramework\DataCollector;
  4. use Jose\Bundle\JoseFramework\Event\ClaimCheckedFailureEvent;
  5. use Jose\Bundle\JoseFramework\Event\ClaimCheckedSuccessEvent;
  6. use Jose\Bundle\JoseFramework\Event\HeaderCheckedFailureEvent;
  7. use Jose\Bundle\JoseFramework\Event\HeaderCheckedSuccessEvent;
  8. use Jose\Bundle\JoseFramework\Services\ClaimCheckerManager;
  9. use Jose\Bundle\JoseFramework\Services\ClaimCheckerManagerFactory;
  10. use Jose\Bundle\JoseFramework\Services\HeaderCheckerManager;
  11. use Jose\Bundle\JoseFramework\Services\HeaderCheckerManagerFactory;
  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 CheckerCollector implements CollectorEventSubscriberInterface
  19. {
  20.     /**
  21.      * @var array<Data>
  22.      */
  23.     private array $headerCheckedSuccesses = [];
  24.     /**
  25.      * @var array<Data>
  26.      */
  27.     private array $headerCheckedFailures = [];
  28.     /**
  29.      * @var array<Data>
  30.      */
  31.     private array $claimCheckedSuccesses = [];
  32.     /**
  33.      * @var array<Data>
  34.      */
  35.     private array $claimCheckedFailures = [];
  36.     /**
  37.      * @var array<HeaderCheckerManager>
  38.      */
  39.     private array $headerCheckerManagers = [];
  40.     /**
  41.      * @var array<ClaimCheckerManager>
  42.      */
  43.     private array $claimCheckerManagers = [];
  44.     public function __construct(
  45.         private readonly ?ClaimCheckerManagerFactory $claimCheckerManagerFactory null,
  46.         private readonly ?HeaderCheckerManagerFactory $headerCheckerManagerFactory null
  47.     ) {
  48.     }
  49.     /**
  50.      * @param array<string, mixed> $data
  51.      */
  52.     public function collect(array &$dataRequest $requestResponse $response, ?Throwable $exception null): void
  53.     {
  54.         $this->collectHeaderCheckerManagers($data);
  55.         $this->collectSupportedHeaderCheckers($data);
  56.         $this->collectClaimCheckerManagers($data);
  57.         $this->collectSupportedClaimCheckers($data);
  58.         $this->collectEvents($data);
  59.     }
  60.     public function addHeaderCheckerManager(string $idHeaderCheckerManager $headerCheckerManager): void
  61.     {
  62.         $this->headerCheckerManagers[$id] = $headerCheckerManager;
  63.     }
  64.     public function addClaimCheckerManager(string $idClaimCheckerManager $claimCheckerManager): void
  65.     {
  66.         $this->claimCheckerManagers[$id] = $claimCheckerManager;
  67.     }
  68.     public static function getSubscribedEvents(): array
  69.     {
  70.         return [
  71.             HeaderCheckedSuccessEvent::class => ['catchHeaderCheckSuccess'],
  72.             HeaderCheckedFailureEvent::class => ['catchHeaderCheckFailure'],
  73.             ClaimCheckedSuccessEvent::class => ['catchClaimCheckSuccess'],
  74.             ClaimCheckedFailureEvent::class => ['catchClaimCheckFailure'],
  75.         ];
  76.     }
  77.     public function catchHeaderCheckSuccess(HeaderCheckedSuccessEvent $event): void
  78.     {
  79.         $cloner = new VarCloner();
  80.         $this->headerCheckedSuccesses[] = $cloner->cloneVar($event);
  81.     }
  82.     public function catchHeaderCheckFailure(HeaderCheckedFailureEvent $event): void
  83.     {
  84.         $cloner = new VarCloner();
  85.         $this->headerCheckedFailures[] = $cloner->cloneVar($event);
  86.     }
  87.     public function catchClaimCheckSuccess(ClaimCheckedSuccessEvent $event): void
  88.     {
  89.         $cloner = new VarCloner();
  90.         $this->claimCheckedSuccesses[] = $cloner->cloneVar($event);
  91.     }
  92.     public function catchClaimCheckFailure(ClaimCheckedFailureEvent $event): void
  93.     {
  94.         $cloner = new VarCloner();
  95.         $this->claimCheckedFailures[] = $cloner->cloneVar($event);
  96.     }
  97.     /**
  98.      * @param array<string, array<string, mixed>> $data
  99.      */
  100.     private function collectHeaderCheckerManagers(array &$data): void
  101.     {
  102.         $data['checker']['header_checker_managers'] = [];
  103.         foreach ($this->headerCheckerManagers as $id => $checkerManager) {
  104.             $data['checker']['header_checker_managers'][$id] = [];
  105.             foreach ($checkerManager->getCheckers() as $checker) {
  106.                 $data['checker']['header_checker_managers'][$id][] = [
  107.                     'header' => $checker->supportedHeader(),
  108.                     'protected' => $checker->protectedHeaderOnly(),
  109.                 ];
  110.             }
  111.         }
  112.     }
  113.     /**
  114.      * @param array<string, array<string, mixed>> $data
  115.      */
  116.     private function collectSupportedHeaderCheckers(array &$data): void
  117.     {
  118.         $data['checker']['header_checkers'] = [];
  119.         if ($this->headerCheckerManagerFactory !== null) {
  120.             $aliases $this->headerCheckerManagerFactory->all();
  121.             foreach ($aliases as $alias => $checker) {
  122.                 $data['checker']['header_checkers'][$alias] = [
  123.                     'header' => $checker->supportedHeader(),
  124.                     'protected' => $checker->protectedHeaderOnly(),
  125.                 ];
  126.             }
  127.         }
  128.     }
  129.     /**
  130.      * @param array<string, array<string, mixed>> $data
  131.      */
  132.     private function collectClaimCheckerManagers(array &$data): void
  133.     {
  134.         $data['checker']['claim_checker_managers'] = [];
  135.         foreach ($this->claimCheckerManagers as $id => $checkerManager) {
  136.             $data['checker']['claim_checker_managers'][$id] = [];
  137.             foreach ($checkerManager->getCheckers() as $checker) {
  138.                 $data['checker']['claim_checker_managers'][$id][] = [
  139.                     'claim' => $checker->supportedClaim(),
  140.                 ];
  141.             }
  142.         }
  143.     }
  144.     /**
  145.      * @param array<string, array<string, mixed>> $data
  146.      */
  147.     private function collectSupportedClaimCheckers(array &$data): void
  148.     {
  149.         $data['checker']['claim_checkers'] = [];
  150.         if ($this->claimCheckerManagerFactory !== null) {
  151.             $aliases $this->claimCheckerManagerFactory->all();
  152.             foreach ($aliases as $alias => $checker) {
  153.                 $data['checker']['claim_checkers'][$alias] = [
  154.                     'claim' => $checker->supportedClaim(),
  155.                 ];
  156.             }
  157.         }
  158.     }
  159.     /**
  160.      * @param array<string, array<string, mixed>> $data
  161.      */
  162.     private function collectEvents(array &$data): void
  163.     {
  164.         $data['checker']['events'] = [
  165.             'header_check_success' => $this->headerCheckedSuccesses,
  166.             'header_check_failure' => $this->headerCheckedFailures,
  167.             'claim_check_success' => $this->claimCheckedSuccesses,
  168.             'claim_check_failure' => $this->claimCheckedFailures,
  169.         ];
  170.     }
  171. }