diff --git a/src/Symfony/Component/Form/CHANGELOG.md b/src/Symfony/Component/Form/CHANGELOG.md index e18359b90b..388d116529 100644 --- a/src/Symfony/Component/Form/CHANGELOG.md +++ b/src/Symfony/Component/Form/CHANGELOG.md @@ -7,6 +7,7 @@ CHANGELOG * deprecated the `$scale` argument of the `IntegerToLocalizedStringTransformer` * added `Symfony\Component\Form\ClearableErrorsInterface` * deprecated calling `FormRenderer::searchAndRenderBlock` for fields which were already rendered + * added a cause when a CSRF error has occurred * deprecated the `scale` option of the `IntegerType` 4.1.0 diff --git a/src/Symfony/Component/Form/Extension/Csrf/EventListener/CsrfValidationListener.php b/src/Symfony/Component/Form/Extension/Csrf/EventListener/CsrfValidationListener.php index f45de6738d..f898737843 100644 --- a/src/Symfony/Component/Form/Extension/Csrf/EventListener/CsrfValidationListener.php +++ b/src/Symfony/Component/Form/Extension/Csrf/EventListener/CsrfValidationListener.php @@ -59,14 +59,15 @@ class CsrfValidationListener implements EventSubscriberInterface if ($form->isRoot() && $form->getConfig()->getOption('compound') && !$postRequestSizeExceeded) { $data = $event->getData(); - if (!isset($data[$this->fieldName]) || !$this->tokenManager->isTokenValid(new CsrfToken($this->tokenId, $data[$this->fieldName]))) { + $csrfToken = new CsrfToken($this->tokenId, $data[$this->fieldName] ?? null); + if (!isset($data[$this->fieldName]) || !$this->tokenManager->isTokenValid($csrfToken)) { $errorMessage = $this->errorMessage; if (null !== $this->translator) { $errorMessage = $this->translator->trans($errorMessage, array(), $this->translationDomain); } - $form->addError(new FormError($errorMessage)); + $form->addError(new FormError($errorMessage, $errorMessage, array(), null, $csrfToken)); } if (\is_array($data)) { diff --git a/src/Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php index 51c1e55e71..73740f6416 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php @@ -365,9 +365,10 @@ class FormTypeCsrfExtensionTest extends TypeTestCase public function testsTranslateCustomErrorMessage() { + $csrfToken = new CsrfToken('TOKEN_ID', 'token'); $this->tokenManager->expects($this->once()) ->method('isTokenValid') - ->with(new CsrfToken('TOKEN_ID', 'token')) + ->with($csrfToken) ->will($this->returnValue(false)); $this->translator->expects($this->once()) @@ -390,7 +391,7 @@ class FormTypeCsrfExtensionTest extends TypeTestCase )); $errors = $form->getErrors(); - $expected = new FormError('[trans]Foobar[/trans]'); + $expected = new FormError('[trans]Foobar[/trans]', null, array(), null, $csrfToken); $expected->setOrigin($form); $this->assertGreaterThan(0, \count($errors));