From 9971798be32b9c27ef551028f40c8086b8c67433 Mon Sep 17 00:00:00 2001 From: Florent Morselli Date: Thu, 6 Aug 2026 23:17:18 +0200 Subject: [PATCH] fix(bundle): alias the nested token services with their own class The nested token sources registered their autowiring alias against the class of the configuration source itself instead of the class of the service they create, so nothing could ever be autowired through `Jose\Component\NestedToken\NestedTokenLoader $NestedTokenLoader` or its builder counterpart. A test walks every autowiring alias the bundle registers and checks that the aliased service is an instance of the aliased type, so the twelve other sources are covered as well. --- .../Source/NestedToken/NestedTokenBuilder.php | 6 +- .../Source/NestedToken/NestedTokenLoader.php | 6 +- .../Functional/AutowiringAliasesTest.php | 83 +++++++++++++++++++ .../NestedToken/NestedTokenBuilderTest.php | 18 ++++ .../NestedToken/NestedTokenLoaderTest.php | 18 ++++ .../TestBundle/Resources/config/services.php | 5 ++ .../Service/NestedTokenServiceConsumer.php | 31 +++++++ 7 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 tests/Bundle/JoseFramework/Functional/AutowiringAliasesTest.php create mode 100644 tests/Bundle/JoseFramework/TestBundle/Service/NestedTokenServiceConsumer.php diff --git a/src/Bundle/DependencyInjection/Source/NestedToken/NestedTokenBuilder.php b/src/Bundle/DependencyInjection/Source/NestedToken/NestedTokenBuilder.php index b5c5c756..4828c44e 100644 --- a/src/Bundle/DependencyInjection/Source/NestedToken/NestedTokenBuilder.php +++ b/src/Bundle/DependencyInjection/Source/NestedToken/NestedTokenBuilder.php @@ -42,7 +42,11 @@ public function load(array $configs, ContainerBuilder $container): void $definition->addTag($id, $attributes); } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, self::class, $name . 'NestedTokenBuilder'); + $container->registerAliasForArgument( + $service_id, + NestedTokenBuilderService::class, + $name . 'NestedTokenBuilder' + ); } } diff --git a/src/Bundle/DependencyInjection/Source/NestedToken/NestedTokenLoader.php b/src/Bundle/DependencyInjection/Source/NestedToken/NestedTokenLoader.php index 25283cb9..b233d484 100644 --- a/src/Bundle/DependencyInjection/Source/NestedToken/NestedTokenLoader.php +++ b/src/Bundle/DependencyInjection/Source/NestedToken/NestedTokenLoader.php @@ -44,7 +44,11 @@ public function load(array $configs, ContainerBuilder $container): void $definition->addTag($id, $attributes); } $container->setDefinition($service_id, $definition); - $container->registerAliasForArgument($service_id, self::class, $name . 'NestedTokenLoader'); + $container->registerAliasForArgument( + $service_id, + NestedTokenLoaderService::class, + $name . 'NestedTokenLoader' + ); } } diff --git a/tests/Bundle/JoseFramework/Functional/AutowiringAliasesTest.php b/tests/Bundle/JoseFramework/Functional/AutowiringAliasesTest.php new file mode 100644 index 00000000..5df6d770 --- /dev/null +++ b/tests/Bundle/JoseFramework/Functional/AutowiringAliasesTest.php @@ -0,0 +1,83 @@ + + */ + public static function autowiringAliases(): iterable + { + $container = new ContainerBuilder(); + $container->setParameter('kernel.debug', false); + (new JoseFrameworkBundle())->getContainerExtension() + ->load([Yaml::parseFile(__DIR__ . '/../config/config_test.yml')['jose']], $container); + + foreach ($container->getAliases() as $id => $alias) { + if (str_starts_with($id, '.') || ! str_contains($id, ' $')) { + continue; + } + $serviceId = (string) $alias; + + yield $id => [ + explode(' $', $id, 2)[0], + $serviceId, + $container->findDefinition($serviceId) + ->getClass() ?? '', + ]; + } + } +} diff --git a/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenBuilderTest.php b/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenBuilderTest.php index 09c9615c..748da453 100644 --- a/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenBuilderTest.php +++ b/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenBuilderTest.php @@ -7,6 +7,7 @@ use Jose\Bundle\JoseFramework\Services\NestedTokenBuilderFactory; use Jose\Component\Core\JWK; use Jose\Component\NestedToken\NestedTokenBuilder; +use Jose\Tests\Bundle\JoseFramework\TestBundle\Service\NestedTokenServiceConsumer; use Jose\Tests\Bundle\JoseFramework\WebTestCase; use PHPUnit\Framework\Attributes\Test; @@ -45,6 +46,23 @@ public static function theNestedTokenBuilderFromTheConfigurationHelperIsAvailabl static::assertTrue($container->has('jose.nested_token_builder.nested_token_builder_2')); } + #[Test] + public static function theNestedTokenBuilderFromTheConfigurationCanBeAutowired(): void + { + static::ensureKernelShutdown(); + $client = static::createClient(); + $container = $client->getContainer(); + static::assertNotNull($container); + + /** @var NestedTokenServiceConsumer $consumer */ + $consumer = $container->get(NestedTokenServiceConsumer::class); + + static::assertSame( + $container->get('jose.nested_token_builder.nested_token_builder_1'), + $consumer->getBuilder() + ); + } + #[Test] public static function aNestedTokenCanBeSignedAndEncryptedUsingTheServiceCreatedFromTheConfiguration(): void { diff --git a/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenLoaderTest.php b/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenLoaderTest.php index 146e5244..6f0c5ddd 100644 --- a/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenLoaderTest.php +++ b/tests/Bundle/JoseFramework/Functional/NestedToken/NestedTokenLoaderTest.php @@ -8,6 +8,7 @@ use Jose\Component\Core\JWK; use Jose\Component\Core\JWKSet; use Jose\Component\NestedToken\NestedTokenLoader; +use Jose\Tests\Bundle\JoseFramework\TestBundle\Service\NestedTokenServiceConsumer; use Jose\Tests\Bundle\JoseFramework\WebTestCase; use PHPUnit\Framework\Attributes\Test; @@ -46,6 +47,23 @@ public static function theNestedTokenLoaderFromTheConfigurationHelperIsAvailable static::assertTrue($container->has('jose.nested_token_loader.nested_token_loader_2')); } + #[Test] + public static function theNestedTokenLoaderFromTheConfigurationCanBeAutowired(): void + { + static::ensureKernelShutdown(); + $client = static::createClient(); + $container = $client->getContainer(); + static::assertNotNull($container); + + /** @var NestedTokenServiceConsumer $consumer */ + $consumer = $container->get(NestedTokenServiceConsumer::class); + + static::assertSame( + $container->get('jose.nested_token_loader.nested_token_loader_1'), + $consumer->getLoader() + ); + } + #[Test] public static function aNestedTokenCanBeDecryptedAndVerifiedUsingTheServiceCreatedFromTheConfiguration(): void { diff --git a/tests/Bundle/JoseFramework/TestBundle/Resources/config/services.php b/tests/Bundle/JoseFramework/TestBundle/Resources/config/services.php index 5eeef8c8..54dfe723 100644 --- a/tests/Bundle/JoseFramework/TestBundle/Resources/config/services.php +++ b/tests/Bundle/JoseFramework/TestBundle/Resources/config/services.php @@ -3,6 +3,7 @@ declare(strict_types=1); use Jose\Tests\Bundle\JoseFramework\TestBundle\Checker\CustomChecker; +use Jose\Tests\Bundle\JoseFramework\TestBundle\Service\NestedTokenServiceConsumer; use Psr\Clock\ClockInterface; use Symfony\Component\Clock\NativeClock; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; @@ -25,4 +26,8 @@ $container->set(ClockInterface::class) ->class(NativeClock::class) ; + + $container->set(NestedTokenServiceConsumer::class) + ->public() + ; }; diff --git a/tests/Bundle/JoseFramework/TestBundle/Service/NestedTokenServiceConsumer.php b/tests/Bundle/JoseFramework/TestBundle/Service/NestedTokenServiceConsumer.php new file mode 100644 index 00000000..672ae751 --- /dev/null +++ b/tests/Bundle/JoseFramework/TestBundle/Service/NestedTokenServiceConsumer.php @@ -0,0 +1,31 @@ +nestedTokenLoader1NestedTokenLoader; + } + + public function getBuilder(): NestedTokenBuilder + { + return $this->nestedTokenBuilder1NestedTokenBuilder; + } +}