vendor/symfony/form/Extension/Csrf/Type/FormTypeCsrfExtension.php line 84

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Form\Extension\Csrf\Type;
  11. use Symfony\Component\Form\AbstractTypeExtension;
  12. use Symfony\Component\Form\Extension\Core\Type\FormType;
  13. use Symfony\Component\Form\Extension\Csrf\EventListener\CsrfValidationListener;
  14. use Symfony\Component\Form\FormBuilderInterface;
  15. use Symfony\Component\Form\FormInterface;
  16. use Symfony\Component\Form\FormView;
  17. use Symfony\Component\Form\Util\ServerParams;
  18. use Symfony\Component\OptionsResolver\OptionsResolver;
  19. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  20. use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
  21. use Symfony\Contracts\Translation\TranslatorInterface;
  22. /**
  23.  * @author Bernhard Schussek <bschussek@gmail.com>
  24.  */
  25. class FormTypeCsrfExtension extends AbstractTypeExtension
  26. {
  27.     private $defaultTokenManager;
  28.     private $defaultEnabled;
  29.     private $defaultFieldName;
  30.     private $translator;
  31.     private $translationDomain;
  32.     private $serverParams;
  33.     /**
  34.      * @param TranslatorInterface|null $translator
  35.      */
  36.     public function __construct(CsrfTokenManagerInterface $defaultTokenManagerbool $defaultEnabled truestring $defaultFieldName '_token'$translator nullstring $translationDomain nullServerParams $serverParams null)
  37.     {
  38.         if (null !== $translator && !$translator instanceof LegacyTranslatorInterface && !$translator instanceof TranslatorInterface) {
  39.             throw new \TypeError(sprintf('Argument 4 passed to %s() must be an instance of %s, %s given.'__METHOD__TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator)));
  40.         }
  41.         $this->defaultTokenManager $defaultTokenManager;
  42.         $this->defaultEnabled $defaultEnabled;
  43.         $this->defaultFieldName $defaultFieldName;
  44.         $this->translator $translator;
  45.         $this->translationDomain $translationDomain;
  46.         $this->serverParams $serverParams;
  47.     }
  48.     /**
  49.      * Adds a CSRF field to the form when the CSRF protection is enabled.
  50.      */
  51.     public function buildForm(FormBuilderInterface $builder, array $options)
  52.     {
  53.         if (!$options['csrf_protection']) {
  54.             return;
  55.         }
  56.         $builder
  57.             ->addEventSubscriber(new CsrfValidationListener(
  58.                 $options['csrf_field_name'],
  59.                 $options['csrf_token_manager'],
  60.                 $options['csrf_token_id'] ?: ($builder->getName() ?: \get_class($builder->getType()->getInnerType())),
  61.                 $options['csrf_message'],
  62.                 $this->translator,
  63.                 $this->translationDomain,
  64.                 $this->serverParams
  65.             ))
  66.         ;
  67.     }
  68.     /**
  69.      * Adds a CSRF field to the root form view.
  70.      */
  71.     public function finishView(FormView $viewFormInterface $form, array $options)
  72.     {
  73.         if ($options['csrf_protection'] && !$view->parent && $options['compound']) {
  74.             $factory $form->getConfig()->getFormFactory();
  75.             $tokenId $options['csrf_token_id'] ?: ($form->getName() ?: \get_class($form->getConfig()->getType()->getInnerType()));
  76.             $data = (string) $options['csrf_token_manager']->getToken($tokenId);
  77.             $csrfForm $factory->createNamed($options['csrf_field_name'], 'Symfony\Component\Form\Extension\Core\Type\HiddenType'$data, [
  78.                 'block_prefix' => 'csrf_token',
  79.                 'mapped' => false,
  80.             ]);
  81.             $view->children[$options['csrf_field_name']] = $csrfForm->createView($view);
  82.         }
  83.     }
  84.     /**
  85.      * {@inheritdoc}
  86.      */
  87.     public function configureOptions(OptionsResolver $resolver)
  88.     {
  89.         $resolver->setDefaults([
  90.             'csrf_protection' => $this->defaultEnabled,
  91.             'csrf_field_name' => $this->defaultFieldName,
  92.             'csrf_message' => 'The CSRF token is invalid. Please try to resubmit the form.',
  93.             'csrf_token_manager' => $this->defaultTokenManager,
  94.             'csrf_token_id' => null,
  95.         ]);
  96.     }
  97.     /**
  98.      * {@inheritdoc}
  99.      */
  100.     public static function getExtendedTypes(): iterable
  101.     {
  102.         return [FormType::class];
  103.     }
  104. }