From afc839f127d82c1ffbb3cfebf1d4134ad54238c6 Mon Sep 17 00:00:00 2001 From: Florent Morselli Date: Tue, 18 Nov 2025 14:01:43 +0100 Subject: [PATCH] feat: add nullable request parameter to creation and request options handlers --- .ci-tools/phpstan-baseline.neon | 156 ++++++++++++++++++ .../Handler/CreationOptionsHandler.php | 4 +- .../Handler/DefaultCreationOptionsHandler.php | 4 +- .../Handler/DefaultRequestOptionsHandler.php | 4 +- .../Handler/DefaultSuccessHandler.php | 11 +- .../Handler/RequestOptionsHandler.php | 4 +- .../src/Security/Handler/SuccessHandler.php | 10 +- .../src/Service/DefaultSuccessHandler.php | 11 +- tests/symfony/functional/SuccessHandler.php | 11 +- 9 files changed, 204 insertions(+), 11 deletions(-) diff --git a/.ci-tools/phpstan-baseline.neon b/.ci-tools/phpstan-baseline.neon index 95df433ba..8c6c0822a 100644 --- a/.ci-tools/phpstan-baseline.neon +++ b/.ci-tools/phpstan-baseline.neon @@ -1767,6 +1767,30 @@ parameters: count: 1 path: ../src/symfony/src/Security/Authorization/Voter/IsUserVerifiedVoter.php + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\CreationOptionsHandler::onCreationOptions() has parameter $request with a nullable type declaration.' + identifier: ergebnis.noParameterWithNullableTypeDeclaration + count: 1 + path: ../src/symfony/src/Security/Handler/CreationOptionsHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\CreationOptionsHandler::onCreationOptions() has parameter $request with null as default value.' + identifier: ergebnis.noParameterWithNullDefaultValue + count: 1 + path: ../src/symfony/src/Security/Handler/CreationOptionsHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\DefaultCreationOptionsHandler::onCreationOptions() has parameter $request with a nullable type declaration.' + identifier: ergebnis.noParameterWithNullableTypeDeclaration + count: 1 + path: ../src/symfony/src/Security/Handler/DefaultCreationOptionsHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\DefaultCreationOptionsHandler::onCreationOptions() has parameter $request with null as default value.' + identifier: ergebnis.noParameterWithNullDefaultValue + count: 1 + path: ../src/symfony/src/Security/Handler/DefaultCreationOptionsHandler.php + - rawMessage: 'Method Webauthn\Bundle\Security\Handler\DefaultFailureHandler::onFailure() has parameter $exception with a nullable type declaration.' identifier: ergebnis.noParameterWithNullableTypeDeclaration @@ -1779,12 +1803,60 @@ parameters: count: 1 path: ../src/symfony/src/Security/Handler/DefaultFailureHandler.php + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\DefaultRequestOptionsHandler::onRequestOptions() has parameter $request with a nullable type declaration.' + identifier: ergebnis.noParameterWithNullableTypeDeclaration + count: 1 + path: ../src/symfony/src/Security/Handler/DefaultRequestOptionsHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\DefaultRequestOptionsHandler::onRequestOptions() has parameter $request with null as default value.' + identifier: ergebnis.noParameterWithNullDefaultValue + count: 1 + path: ../src/symfony/src/Security/Handler/DefaultRequestOptionsHandler.php + - rawMessage: 'Method Webauthn\Bundle\Security\Handler\DefaultRequestOptionsHandler::onRequestOptions() has parameter $userEntity with a nullable type declaration.' identifier: ergebnis.noParameterWithNullableTypeDeclaration count: 1 path: ../src/symfony/src/Security/Handler/DefaultRequestOptionsHandler.php + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\DefaultSuccessHandler::onSuccess() has parameter $publicKeyCredential with a nullable type declaration.' + identifier: ergebnis.noParameterWithNullableTypeDeclaration + count: 1 + path: ../src/symfony/src/Security/Handler/DefaultSuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\DefaultSuccessHandler::onSuccess() has parameter $publicKeyCredential with null as default value.' + identifier: ergebnis.noParameterWithNullDefaultValue + count: 1 + path: ../src/symfony/src/Security/Handler/DefaultSuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\DefaultSuccessHandler::onSuccess() has parameter $publicKeyCredentialOptions with a nullable type declaration.' + identifier: ergebnis.noParameterWithNullableTypeDeclaration + count: 1 + path: ../src/symfony/src/Security/Handler/DefaultSuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\DefaultSuccessHandler::onSuccess() has parameter $publicKeyCredentialOptions with null as default value.' + identifier: ergebnis.noParameterWithNullDefaultValue + count: 1 + path: ../src/symfony/src/Security/Handler/DefaultSuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\DefaultSuccessHandler::onSuccess() has parameter $userEntity with a nullable type declaration.' + identifier: ergebnis.noParameterWithNullableTypeDeclaration + count: 1 + path: ../src/symfony/src/Security/Handler/DefaultSuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\DefaultSuccessHandler::onSuccess() has parameter $userEntity with null as default value.' + identifier: ergebnis.noParameterWithNullDefaultValue + count: 1 + path: ../src/symfony/src/Security/Handler/DefaultSuccessHandler.php + - rawMessage: 'Method Webauthn\Bundle\Security\Handler\FailureHandler::onFailure() has parameter $exception with a nullable type declaration.' identifier: ergebnis.noParameterWithNullableTypeDeclaration @@ -1797,12 +1869,60 @@ parameters: count: 1 path: ../src/symfony/src/Security/Handler/FailureHandler.php + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\RequestOptionsHandler::onRequestOptions() has parameter $request with a nullable type declaration.' + identifier: ergebnis.noParameterWithNullableTypeDeclaration + count: 1 + path: ../src/symfony/src/Security/Handler/RequestOptionsHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\RequestOptionsHandler::onRequestOptions() has parameter $request with null as default value.' + identifier: ergebnis.noParameterWithNullDefaultValue + count: 1 + path: ../src/symfony/src/Security/Handler/RequestOptionsHandler.php + - rawMessage: 'Method Webauthn\Bundle\Security\Handler\RequestOptionsHandler::onRequestOptions() has parameter $userEntity with a nullable type declaration.' identifier: ergebnis.noParameterWithNullableTypeDeclaration count: 1 path: ../src/symfony/src/Security/Handler/RequestOptionsHandler.php + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\SuccessHandler::onSuccess() has parameter $publicKeyCredential with a nullable type declaration.' + identifier: ergebnis.noParameterWithNullableTypeDeclaration + count: 1 + path: ../src/symfony/src/Security/Handler/SuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\SuccessHandler::onSuccess() has parameter $publicKeyCredential with null as default value.' + identifier: ergebnis.noParameterWithNullDefaultValue + count: 1 + path: ../src/symfony/src/Security/Handler/SuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\SuccessHandler::onSuccess() has parameter $publicKeyCredentialOptions with a nullable type declaration.' + identifier: ergebnis.noParameterWithNullableTypeDeclaration + count: 1 + path: ../src/symfony/src/Security/Handler/SuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\SuccessHandler::onSuccess() has parameter $publicKeyCredentialOptions with null as default value.' + identifier: ergebnis.noParameterWithNullDefaultValue + count: 1 + path: ../src/symfony/src/Security/Handler/SuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\SuccessHandler::onSuccess() has parameter $userEntity with a nullable type declaration.' + identifier: ergebnis.noParameterWithNullableTypeDeclaration + count: 1 + path: ../src/symfony/src/Security/Handler/SuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Security\Handler\SuccessHandler::onSuccess() has parameter $userEntity with null as default value.' + identifier: ergebnis.noParameterWithNullDefaultValue + count: 1 + path: ../src/symfony/src/Security/Handler/SuccessHandler.php + - rawMessage: Class Webauthn\Bundle\Security\Http\Authenticator\Passport\Credentials\WebauthnCredentials is neither abstract nor final. identifier: ergebnis.final @@ -2082,6 +2202,42 @@ parameters: count: 1 path: ../src/symfony/src/Service/DefaultFailureHandler.php + - + rawMessage: 'Method Webauthn\Bundle\Service\DefaultSuccessHandler::onSuccess() has parameter $publicKeyCredential with a nullable type declaration.' + identifier: ergebnis.noParameterWithNullableTypeDeclaration + count: 1 + path: ../src/symfony/src/Service/DefaultSuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Service\DefaultSuccessHandler::onSuccess() has parameter $publicKeyCredential with null as default value.' + identifier: ergebnis.noParameterWithNullDefaultValue + count: 1 + path: ../src/symfony/src/Service/DefaultSuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Service\DefaultSuccessHandler::onSuccess() has parameter $publicKeyCredentialOptions with a nullable type declaration.' + identifier: ergebnis.noParameterWithNullableTypeDeclaration + count: 1 + path: ../src/symfony/src/Service/DefaultSuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Service\DefaultSuccessHandler::onSuccess() has parameter $publicKeyCredentialOptions with null as default value.' + identifier: ergebnis.noParameterWithNullDefaultValue + count: 1 + path: ../src/symfony/src/Service/DefaultSuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Service\DefaultSuccessHandler::onSuccess() has parameter $userEntity with a nullable type declaration.' + identifier: ergebnis.noParameterWithNullableTypeDeclaration + count: 1 + path: ../src/symfony/src/Service/DefaultSuccessHandler.php + + - + rawMessage: 'Method Webauthn\Bundle\Service\DefaultSuccessHandler::onSuccess() has parameter $userEntity with null as default value.' + identifier: ergebnis.noParameterWithNullDefaultValue + count: 1 + path: ../src/symfony/src/Service/DefaultSuccessHandler.php + - rawMessage: Cannot access offset 'attestation_conveyance' on mixed. identifier: offsetAccess.nonOffsetAccessible diff --git a/src/symfony/src/Security/Handler/CreationOptionsHandler.php b/src/symfony/src/Security/Handler/CreationOptionsHandler.php index d76a7255b..d94677332 100644 --- a/src/symfony/src/Security/Handler/CreationOptionsHandler.php +++ b/src/symfony/src/Security/Handler/CreationOptionsHandler.php @@ -4,6 +4,7 @@ namespace Webauthn\Bundle\Security\Handler; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Webauthn\PublicKeyCredentialCreationOptions; use Webauthn\PublicKeyCredentialUserEntity; @@ -12,6 +13,7 @@ interface CreationOptionsHandler { public function onCreationOptions( PublicKeyCredentialCreationOptions $publicKeyCredentialCreationOptions, - PublicKeyCredentialUserEntity $userEntity + PublicKeyCredentialUserEntity $userEntity, + ?Request $request = null, ): Response; } diff --git a/src/symfony/src/Security/Handler/DefaultCreationOptionsHandler.php b/src/symfony/src/Security/Handler/DefaultCreationOptionsHandler.php index 0a5cfa28c..6fbd00666 100644 --- a/src/symfony/src/Security/Handler/DefaultCreationOptionsHandler.php +++ b/src/symfony/src/Security/Handler/DefaultCreationOptionsHandler.php @@ -6,6 +6,7 @@ use RuntimeException; use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Serializer\Encoder\JsonEncoder; use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer; @@ -23,7 +24,8 @@ public function __construct( public function onCreationOptions( PublicKeyCredentialCreationOptions $publicKeyCredentialCreationOptions, - PublicKeyCredentialUserEntity $userEntity + PublicKeyCredentialUserEntity $userEntity, + ?Request $request = null, ): Response { $data = $this->normalizer->normalize($publicKeyCredentialCreationOptions, JsonEncoder::FORMAT, [ AbstractObjectNormalizer::SKIP_NULL_VALUES => true, diff --git a/src/symfony/src/Security/Handler/DefaultRequestOptionsHandler.php b/src/symfony/src/Security/Handler/DefaultRequestOptionsHandler.php index 72d5a2a80..2478ee334 100644 --- a/src/symfony/src/Security/Handler/DefaultRequestOptionsHandler.php +++ b/src/symfony/src/Security/Handler/DefaultRequestOptionsHandler.php @@ -6,6 +6,7 @@ use RuntimeException; use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Serializer\Encoder\JsonEncoder; use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer; @@ -23,7 +24,8 @@ public function __construct( public function onRequestOptions( PublicKeyCredentialRequestOptions $publicKeyCredentialRequestOptions, - ?PublicKeyCredentialUserEntity $userEntity + ?PublicKeyCredentialUserEntity $userEntity, + ?Request $request = null ): Response { $data = $this->normalizer->normalize($publicKeyCredentialRequestOptions, JsonEncoder::FORMAT, [ AbstractObjectNormalizer::SKIP_NULL_VALUES => true, diff --git a/src/symfony/src/Security/Handler/DefaultSuccessHandler.php b/src/symfony/src/Security/Handler/DefaultSuccessHandler.php index 252eeb2c9..6641f2236 100644 --- a/src/symfony/src/Security/Handler/DefaultSuccessHandler.php +++ b/src/symfony/src/Security/Handler/DefaultSuccessHandler.php @@ -9,11 +9,18 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; +use Webauthn\PublicKeyCredential; +use Webauthn\PublicKeyCredentialOptions; +use Webauthn\PublicKeyCredentialUserEntity; final class DefaultSuccessHandler implements SuccessHandler, AuthenticationSuccessHandlerInterface { - public function onSuccess(Request $request): Response - { + public function onSuccess( + Request $request, + ?PublicKeyCredential $publicKeyCredential = null, + ?PublicKeyCredentialOptions $publicKeyCredentialOptions = null, + ?PublicKeyCredentialUserEntity $userEntity = null + ): Response { $data = [ 'status' => 'ok', 'errorMessage' => '', diff --git a/src/symfony/src/Security/Handler/RequestOptionsHandler.php b/src/symfony/src/Security/Handler/RequestOptionsHandler.php index aa86ad34b..3bd012224 100644 --- a/src/symfony/src/Security/Handler/RequestOptionsHandler.php +++ b/src/symfony/src/Security/Handler/RequestOptionsHandler.php @@ -4,6 +4,7 @@ namespace Webauthn\Bundle\Security\Handler; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Webauthn\PublicKeyCredentialRequestOptions; use Webauthn\PublicKeyCredentialUserEntity; @@ -12,6 +13,7 @@ interface RequestOptionsHandler { public function onRequestOptions( PublicKeyCredentialRequestOptions $publicKeyCredentialRequestOptions, - ?PublicKeyCredentialUserEntity $userEntity + ?PublicKeyCredentialUserEntity $userEntity, + ?Request $request = null ): Response; } diff --git a/src/symfony/src/Security/Handler/SuccessHandler.php b/src/symfony/src/Security/Handler/SuccessHandler.php index ac3ef9a40..efcb21eae 100644 --- a/src/symfony/src/Security/Handler/SuccessHandler.php +++ b/src/symfony/src/Security/Handler/SuccessHandler.php @@ -6,8 +6,16 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Webauthn\PublicKeyCredential; +use Webauthn\PublicKeyCredentialOptions; +use Webauthn\PublicKeyCredentialUserEntity; interface SuccessHandler { - public function onSuccess(Request $request): Response; + public function onSuccess( + Request $request, + ?PublicKeyCredential $publicKeyCredential = null, + ?PublicKeyCredentialOptions $publicKeyCredentialOptions = null, + ?PublicKeyCredentialUserEntity $userEntity = null + ): Response; } diff --git a/src/symfony/src/Service/DefaultSuccessHandler.php b/src/symfony/src/Service/DefaultSuccessHandler.php index 260a3604c..a5c669ccc 100644 --- a/src/symfony/src/Service/DefaultSuccessHandler.php +++ b/src/symfony/src/Service/DefaultSuccessHandler.php @@ -8,11 +8,18 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Webauthn\Bundle\Security\Handler\SuccessHandler; +use Webauthn\PublicKeyCredential; +use Webauthn\PublicKeyCredentialOptions; +use Webauthn\PublicKeyCredentialUserEntity; final class DefaultSuccessHandler implements SuccessHandler { - public function onSuccess(Request $request): Response - { + public function onSuccess( + Request $request, + ?PublicKeyCredential $publicKeyCredential = null, + ?PublicKeyCredentialOptions $publicKeyCredentialOptions = null, + ?PublicKeyCredentialUserEntity $userEntity = null + ): Response { $data = [ 'status' => 'ok', 'errorMessage' => '', diff --git a/tests/symfony/functional/SuccessHandler.php b/tests/symfony/functional/SuccessHandler.php index 026ddfd8b..7d9bdb917 100644 --- a/tests/symfony/functional/SuccessHandler.php +++ b/tests/symfony/functional/SuccessHandler.php @@ -10,11 +10,18 @@ use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; use Webauthn\Bundle\Security\Handler\SuccessHandler as SuccessHandlerInterface; +use Webauthn\PublicKeyCredential; +use Webauthn\PublicKeyCredentialOptions; +use Webauthn\PublicKeyCredentialUserEntity; final class SuccessHandler implements AuthenticationSuccessHandlerInterface, SuccessHandlerInterface { - public function onSuccess(Request $request): Response - { + public function onSuccess( + Request $request, + ?PublicKeyCredential $publicKeyCredential = null, + ?PublicKeyCredentialOptions $publicKeyCredentialOptions = null, + ?PublicKeyCredentialUserEntity $userEntity = null + ): Response { $data = [ 'status' => 'ok', 'errorMessage' => '',