Skip to content

Commit

Permalink
fixed form configuration when no session is available (closes #841)
Browse files Browse the repository at this point in the history
  • Loading branch information
fabpot committed May 18, 2011
1 parent fdbdcbb commit 0687aad
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 26 deletions.
Expand Up @@ -41,7 +41,6 @@ public function load(array $configs, ContainerBuilder $container)
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));

$loader->load('web.xml');
$loader->load('form.xml');
$loader->load('services.xml');

// A translator must always be registered (as support is included by
Expand Down Expand Up @@ -70,9 +69,7 @@ public function load(array $configs, ContainerBuilder $container)
$loader->load('test.xml');
}

if (isset($config['csrf_protection'])) {
$this->registerCsrfProtectionConfiguration($config['csrf_protection'], $container);
}
$this->registerFormConfiguration($config, $container, $loader);

if (isset($config['esi'])) {
$this->registerEsiConfiguration($config['esi'], $loader);
Expand Down Expand Up @@ -135,15 +132,32 @@ public function load(array $configs, ContainerBuilder $container)
}

/**
* Loads the CSRF protection configuration.
* Loads Form configuration.
*
* @param array $config A CSRF protection configuration array
* @param array $config A configuration array
* @param ContainerBuilder $container A ContainerBuilder instance
* @param XmlFileLoader $loader An XmlFileLoader instance
*/
private function registerCsrfProtectionConfiguration(array $config, ContainerBuilder $container)
private function registerFormConfiguration($config, ContainerBuilder $container, XmlFileLoader $loader)
{
$container->setParameter('form.type_extension.csrf.enabled', $config['enabled']);
$container->setParameter('form.type_extension.csrf.field_name', $config['field_name']);
$loader->load('form.xml');
if (isset($config['csrf_protection'])) {
if (!isset($config['session'])) {
throw new \LogicException('CSRF protection needs that sessions are enabled.');
}
$loader->load('form_csrf.xml');

$container->setParameter('form.type_extension.csrf.enabled', $config['csrf_protection']['enabled']);
$container->setParameter('form.type_extension.csrf.field_name', $config['csrf_protection']['field_name']);
}

if (isset($config['session'])) {
$container->removeDefinition('file.temporary_storage');
$container->setDefinition('file.temporary_storage', $container->getDefinition('file.temporary_storage.session'));
$container->removeDefinition('file.temporary_storage.session');
} else {
$container->removeDefinition('file.temporary_storage.session');
}
}

/**
Expand Down
22 changes: 5 additions & 17 deletions src/Symfony/Bundle/FrameworkBundle/Resources/config/form.xml
Expand Up @@ -8,8 +8,8 @@
<parameter key="form.extension.class">Symfony\Component\Form\Extension\DependencyInjection\DependencyInjectionExtension</parameter>
<parameter key="form.factory.class">Symfony\Component\Form\FormFactory</parameter>
<parameter key="form.type_guesser.validator.class">Symfony\Component\Form\Extension\Validator\ValidatorTypeGuesser</parameter>
<parameter key="form.csrf_provider.class">Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider</parameter>
<parameter key="file.temporary_storage.class">Symfony\Component\HttpFoundation\File\SessionBasedTemporaryStorage</parameter>
<parameter key="file.temporary_storage.class">Symfony\Component\HttpFoundation\File\TemporaryStorage</parameter>
<parameter key="file.temporary_storage.session.class">Symfony\Component\HttpFoundation\File\SessionBasedTemporaryStorage</parameter>
</parameters>

<services>
Expand Down Expand Up @@ -51,15 +51,14 @@
<argument type="service" id="validator.mapping.class_metadata_factory" />
</service>

<!-- CsrfProvider -->
<service id="form.csrf_provider" class="%form.csrf_provider.class%">
<!-- TemporaryStorage - where should we put this? -->
<service id="file.temporary_storage.session" class="%file.temporary_storage.session.class%">
<argument type="service" id="session" />
<argument>%kernel.secret%</argument>
<argument>%kernel.cache_dir%/upload</argument>
</service>

<!-- TemporaryStorage - where should we put this? -->
<service id="file.temporary_storage" class="%file.temporary_storage.class%">
<argument type="service" id="session" />
<argument>%kernel.secret%</argument>
<argument>%kernel.cache_dir%/upload</argument>
</service>
Expand Down Expand Up @@ -151,16 +150,5 @@
<tag name="form.type_extension" alias="field" />
<argument type="service" id="validator" />
</service>

<!-- CsrfExtension -->
<service id="form.type.csrf" class="Symfony\Component\Form\Extension\Csrf\Type\CsrfType">
<tag name="form.type" alias="csrf" />
<argument type="service" id="form.csrf_provider" />
</service>
<service id="form.type_extension.csrf" class="Symfony\Component\Form\Extension\Csrf\Type\FormTypeCsrfExtension">
<tag name="form.type_extension" alias="form" />
<argument>%form.type_extension.csrf.enabled%</argument>
<argument>%form.type_extension.csrf.field_name%</argument>
</service>
</services>
</container>
27 changes: 27 additions & 0 deletions src/Symfony/Bundle/FrameworkBundle/Resources/config/form_csrf.xml
@@ -0,0 +1,27 @@
<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

<parameters>
<parameter key="form.csrf_provider.class">Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider</parameter>
</parameters>

<services>
<service id="form.csrf_provider" class="%form.csrf_provider.class%">
<argument type="service" id="session" />
<argument>%kernel.secret%</argument>
</service>

<service id="form.type.csrf" class="Symfony\Component\Form\Extension\Csrf\Type\CsrfType">
<tag name="form.type" alias="csrf" />
<argument type="service" id="form.csrf_provider" />
</service>
<service id="form.type_extension.csrf" class="Symfony\Component\Form\Extension\Csrf\Type\FormTypeCsrfExtension">
<tag name="form.type_extension" alias="form" />
<argument>%form.type_extension.csrf.enabled%</argument>
<argument>%form.type_extension.csrf.field_name%</argument>
</service>
</services>
</container>

0 comments on commit 0687aad

Please sign in to comment.