Skip to content

Commit 250d2cf

Browse files
committed
Merge branch 'fix-csrf-default-2.2' into fix-csrf-default-2.3
Conflicts: src/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php
2 parents 3da5034 + 1cd233e commit 250d2cf

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

Extension/Csrf/Type/FormTypeCsrfExtension.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public function buildForm(FormBuilderInterface $builder, array $options)
7676
->addEventSubscriber(new CsrfValidationListener(
7777
$options['csrf_field_name'],
7878
$options['csrf_provider'],
79-
$options['intention'],
79+
$options['intention'] ?: $builder->getName(),
8080
$options['csrf_message'],
8181
$this->translator,
8282
$this->translationDomain
@@ -95,7 +95,7 @@ public function finishView(FormView $view, FormInterface $form, array $options)
9595
{
9696
if ($options['csrf_protection'] && !$view->parent && $options['compound']) {
9797
$factory = $form->getConfig()->getAttribute('csrf_factory');
98-
$data = $options['csrf_provider']->generateCsrfToken($options['intention']);
98+
$data = $options['csrf_provider']->generateCsrfToken($options['intention'] ?: $form->getName());
9999

100100
$csrfForm = $factory->createNamed($options['csrf_field_name'], 'hidden', $data, array(
101101
'mapped' => false,
@@ -115,7 +115,7 @@ public function setDefaultOptions(OptionsResolverInterface $resolver)
115115
'csrf_field_name' => $this->defaultFieldName,
116116
'csrf_provider' => $this->defaultCsrfProvider,
117117
'csrf_message' => 'The CSRF token is invalid. Please try to resubmit the form.',
118-
'intention' => 'unknown',
118+
'intention' => null,
119119
));
120120
}
121121

Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,24 @@ public function testGenerateCsrfToken()
140140
$this->assertEquals('token', $view['csrf']->vars['value']);
141141
}
142142

143+
public function testGenerateCsrfTokenUsesFormNameAsIntentionByDefault()
144+
{
145+
$this->csrfProvider->expects($this->once())
146+
->method('generateCsrfToken')
147+
->with('FORM_NAME')
148+
->will($this->returnValue('token'));
149+
150+
$view = $this->factory
151+
->createNamed('FORM_NAME', 'form', null, array(
152+
'csrf_field_name' => 'csrf',
153+
'csrf_provider' => $this->csrfProvider,
154+
'compound' => true,
155+
))
156+
->createView();
157+
158+
$this->assertEquals('token', $view['csrf']->vars['value']);
159+
}
160+
143161
public function provideBoolean()
144162
{
145163
return array(
@@ -180,6 +198,37 @@ public function testValidateTokenOnSubmitIfRootAndCompound($valid)
180198
$this->assertSame($valid, $form->isValid());
181199
}
182200

201+
/**
202+
* @dataProvider provideBoolean
203+
*/
204+
public function testValidateTokenOnBindIfRootAndCompoundUsesFormNameAsIntentionByDefault($valid)
205+
{
206+
$this->csrfProvider->expects($this->once())
207+
->method('isCsrfTokenValid')
208+
->with('FORM_NAME', 'token')
209+
->will($this->returnValue($valid));
210+
211+
$form = $this->factory
212+
->createNamedBuilder('FORM_NAME', 'form', null, array(
213+
'csrf_field_name' => 'csrf',
214+
'csrf_provider' => $this->csrfProvider,
215+
'compound' => true,
216+
))
217+
->add('child', 'text')
218+
->getForm();
219+
220+
$form->submit(array(
221+
'child' => 'foobar',
222+
'csrf' => 'token',
223+
));
224+
225+
// Remove token from data
226+
$this->assertSame(array('child' => 'foobar'), $form->getData());
227+
228+
// Validate accordingly
229+
$this->assertSame($valid, $form->isValid());
230+
}
231+
183232
public function testFailIfRootAndCompoundAndTokenMissing()
184233
{
185234
$this->csrfProvider->expects($this->never())

0 commit comments

Comments
 (0)