Skip to content

Commit 63356f2

Browse files
Maxcastelsoyuka
andauthored
fix(symfony): validate the classes of the default parameters (#8715)
Co-authored-by: Antoine Bluchet <soyuka@users.noreply.github.com>
1 parent d75363a commit 63356f2

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

‎src/Symfony/Bundle/DependencyInjection/Configuration.php‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,18 @@ private function addDefaultsSection(ArrayNodeDefinition $rootNode): void
674674
->arrayNode('parameters')
675675
->info('Global parameters applied to all resources and operations.')
676676
->useAttributeAsKey('parameter_class')
677+
->validate()
678+
->always(static function (array $parameters): array {
679+
foreach ($parameters as $name => $parameter) {
680+
$class = $parameter['class'] ?? $name;
681+
if ((isset($parameter['class']) || str_contains((string) $name, '\\')) && !is_subclass_of($class, Parameter::class)) {
682+
throw new InvalidConfigurationException(\sprintf('The default parameter "%s" must reference a class extending "%s", "%s" given.', $name, Parameter::class, $class));
683+
}
684+
}
685+
686+
return $parameters;
687+
})
688+
->end()
677689
->prototype('array')
678690
->ignoreExtraKeys(false)
679691
->children()

‎tests/Symfony/Bundle/DependencyInjection/ConfigurationTest.php‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
namespace ApiPlatform\Tests\Symfony\Bundle\DependencyInjection;
1515

1616
use ApiPlatform\Metadata\Exception\InvalidArgumentException;
17+
use ApiPlatform\Metadata\HeaderParameter;
1718
use ApiPlatform\Symfony\Bundle\DependencyInjection\Configuration;
1819
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
1920
use Doctrine\ORM\OptimisticLockException;
@@ -540,4 +541,43 @@ public function testOauthScopeNaming(): void
540541

541542
$this->assertEquals(['resource:read-write' => 'Read and write resource data'], $config['oauth']['scopes']);
542543
}
544+
545+
public function testDefaultParameters(): void
546+
{
547+
$config = $this->processor->processConfiguration($this->configuration, [
548+
'api_platform' => [
549+
'defaults' => [
550+
'parameters' => [
551+
HeaderParameter::class => ['key' => 'API-Token'],
552+
'request_id' => ['class' => HeaderParameter::class, 'key' => 'Request-ID'],
553+
'api_version' => ['key' => 'api_version'],
554+
],
555+
],
556+
],
557+
]);
558+
559+
$this->assertCount(3, $config['defaults']['parameters']);
560+
}
561+
562+
public static function invalidDefaultParameterProvider(): iterable
563+
{
564+
yield 'unknown class option' => ['api_token', ['class' => 'ApiPlatform\Metadata\HeaderParamter'], 'ApiPlatform\Metadata\HeaderParamter'];
565+
yield 'unknown class as key' => ['ApiPlatform\Metadata\HeaderParamter', ['key' => 'API-Token'], 'ApiPlatform\Metadata\HeaderParamter'];
566+
yield 'not a parameter' => ['api_token', ['class' => \stdClass::class], \stdClass::class];
567+
}
568+
569+
#[DataProvider('invalidDefaultParameterProvider')]
570+
public function testDefaultParametersWithInvalidClass(string $name, array $parameter, string $class): void
571+
{
572+
$this->expectException(InvalidConfigurationException::class);
573+
$this->expectExceptionMessage(\sprintf('The default parameter "%s" must reference a class extending "ApiPlatform\Metadata\Parameter", "%s" given.', $name, $class));
574+
575+
$this->processor->processConfiguration($this->configuration, [
576+
'api_platform' => [
577+
'defaults' => [
578+
'parameters' => [$name => $parameter],
579+
],
580+
],
581+
]);
582+
}
543583
}

0 commit comments

Comments
 (0)