Вход Регистрация
Файл: symfony-2.7/src/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php
Строк: 295
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentFormExtensionCsrfType;

use 
SymfonyComponentFormAbstractTypeExtension;
use 
SymfonyComponentFormExceptionUnexpectedTypeException;
use 
SymfonyComponentFormExtensionCsrfCsrfProviderCsrfProviderAdapter;
use 
SymfonyComponentFormExtensionCsrfCsrfProviderCsrfProviderInterface;
use 
SymfonyComponentFormExtensionCsrfCsrfProviderCsrfTokenManagerAdapter;
use 
SymfonyComponentFormExtensionCsrfEventListenerCsrfValidationListener;
use 
SymfonyComponentFormFormBuilderInterface;
use 
SymfonyComponentFormFormView;
use 
SymfonyComponentFormFormInterface;
use 
SymfonyComponentOptionsResolverOptions;
use 
SymfonyComponentOptionsResolverOptionsResolver;
use 
SymfonyComponentSecurityCsrfCsrfTokenManagerInterface;
use 
SymfonyComponentTranslationTranslatorInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormTypeCsrfExtension extends AbstractTypeExtension
{
    
/**
     * @var CsrfTokenManagerInterface
     */
    
private $defaultTokenManager;

    
/**
     * @var bool
     */
    
private $defaultEnabled;

    
/**
     * @var string
     */
    
private $defaultFieldName;

    
/**
     * @var TranslatorInterface
     */
    
private $translator;

    
/**
     * @var null|string
     */
    
private $translationDomain;

    public function 
__construct($defaultTokenManager$defaultEnabled true$defaultFieldName '_token'TranslatorInterface $translator null$translationDomain null)
    {
        if (
$defaultTokenManager instanceof CsrfProviderInterface) {
            
$defaultTokenManager = new CsrfProviderAdapter($defaultTokenManager);
        } elseif (!
$defaultTokenManager instanceof CsrfTokenManagerInterface) {
            throw new 
UnexpectedTypeException($defaultTokenManager'CsrfProviderInterface or CsrfTokenManagerInterface');
        }

        
$this->defaultTokenManager $defaultTokenManager;
        
$this->defaultEnabled $defaultEnabled;
        
$this->defaultFieldName $defaultFieldName;
        
$this->translator $translator;
        
$this->translationDomain $translationDomain;
    }

    
/**
     * Adds a CSRF field to the form when the CSRF protection is enabled.
     *
     * @param FormBuilderInterface $builder The form builder
     * @param array                $options The options
     */
    
public function buildForm(FormBuilderInterface $builder, array $options)
    {
        if (!
$options['csrf_protection']) {
            return;
        }

        
$builder
            
->addEventSubscriber(new CsrfValidationListener(
                
$options['csrf_field_name'],
                
$options['csrf_token_manager'],
                
$options['csrf_token_id'] ?: ($builder->getName() ?: get_class($builder->getType()->getInnerType())),
                
$options['csrf_message'],
                
$this->translator,
                
$this->translationDomain
            
))
        ;
    }

    
/**
     * Adds a CSRF field to the root form view.
     *
     * @param FormView      $view    The form view
     * @param FormInterface $form    The form
     * @param array         $options The options
     */
    
public function finishView(FormView $viewFormInterface $form, array $options)
    {
        if (
$options['csrf_protection'] && !$view->parent && $options['compound']) {
            
$factory $form->getConfig()->getFormFactory();
            
$tokenId $options['csrf_token_id'] ?: ($form->getName() ?: get_class($form->getConfig()->getType()->getInnerType()));
            
$data = (string) $options['csrf_token_manager']->getToken($tokenId);

            
$csrfForm $factory->createNamed($options['csrf_field_name'], 'hidden'$data, array(
                
'mapped' => false,
            ));

            
$view->children[$options['csrf_field_name']] = $csrfForm->createView($view);
        }
    }

    
/**
     * {@inheritdoc}
     */
    
public function configureOptions(OptionsResolver $resolver)
    {
        
// BC clause for the "intention" option
        
$csrfTokenId = function (Options $options) {
            return 
$options['intention'];
        };

        
// BC clause for the "csrf_provider" option
        
$csrfTokenManager = function (Options $options) {
            if (
$options['csrf_provider'] instanceof CsrfTokenManagerInterface) {
                return 
$options['csrf_provider'];
            }

            return 
$options['csrf_provider'] instanceof CsrfTokenManagerAdapter
                
$options['csrf_provider']->getTokenManager(false)
                : new 
CsrfProviderAdapter($options['csrf_provider']);
        };

        
$resolver->setDefaults(array(
            
'csrf_protection' => $this->defaultEnabled,
            
'csrf_field_name' => $this->defaultFieldName,
            
'csrf_message' => 'The CSRF token is invalid. Please try to resubmit the form.',
            
'csrf_token_manager' => $csrfTokenManager,
            
'csrf_token_id' => $csrfTokenId,
            
'csrf_provider' => $this->defaultTokenManager,
            
'intention' => null,
        ));
    }

    
/**
     * {@inheritdoc}
     */
    
public function getExtendedType()
    {
        return 
'form';
    }
}
Онлайн: 1
Реклама