PageRenderTime 51ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php

https://bitbucket.org/tippycracker/autokraitis
PHP | 172 lines | 107 code | 22 blank | 43 comment | 8 complexity | 88a7308f7f1d4e2c8b585fc4daa49704 MD5 | raw file
Possible License(s): BSD-2-Clause, GPL-2.0, GPL-3.0, BSD-3-Clause, Apache-2.0
  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\Exception\UnexpectedTypeException;
  13. use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderAdapter;
  14. use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface;
  15. use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfTokenManagerAdapter;
  16. use Symfony\Component\Form\Extension\Csrf\EventListener\CsrfValidationListener;
  17. use Symfony\Component\Form\FormBuilderInterface;
  18. use Symfony\Component\Form\FormView;
  19. use Symfony\Component\Form\FormInterface;
  20. use Symfony\Component\Form\Util\ServerParams;
  21. use Symfony\Component\OptionsResolver\Options;
  22. use Symfony\Component\OptionsResolver\OptionsResolver;
  23. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  24. use Symfony\Component\Translation\TranslatorInterface;
  25. /**
  26. * @author Bernhard Schussek <bschussek@gmail.com>
  27. */
  28. class FormTypeCsrfExtension extends AbstractTypeExtension
  29. {
  30. /**
  31. * @var CsrfTokenManagerInterface
  32. */
  33. private $defaultTokenManager;
  34. private $defaultEnabled;
  35. private $defaultFieldName;
  36. private $translator;
  37. private $translationDomain;
  38. private $serverParams;
  39. /**
  40. * @param CsrfTokenManagerInterface|CsrfProviderInterface $defaultTokenManager
  41. * @param bool $defaultEnabled
  42. * @param string $defaultFieldName
  43. * @param TranslatorInterface $translator
  44. * @param null|string $translationDomain
  45. * @param ServerParams $serverParams
  46. */
  47. public function __construct($defaultTokenManager, $defaultEnabled = true, $defaultFieldName = '_token', TranslatorInterface $translator = null, $translationDomain = null, ServerParams $serverParams = null)
  48. {
  49. if ($defaultTokenManager instanceof CsrfProviderInterface) {
  50. $defaultTokenManager = new CsrfProviderAdapter($defaultTokenManager);
  51. } elseif (!$defaultTokenManager instanceof CsrfTokenManagerInterface) {
  52. throw new UnexpectedTypeException($defaultTokenManager, 'CsrfProviderInterface or CsrfTokenManagerInterface');
  53. }
  54. $this->defaultTokenManager = $defaultTokenManager;
  55. $this->defaultEnabled = $defaultEnabled;
  56. $this->defaultFieldName = $defaultFieldName;
  57. $this->translator = $translator;
  58. $this->translationDomain = $translationDomain;
  59. $this->serverParams = $serverParams;
  60. }
  61. /**
  62. * Adds a CSRF field to the form when the CSRF protection is enabled.
  63. *
  64. * @param FormBuilderInterface $builder The form builder
  65. * @param array $options The options
  66. */
  67. public function buildForm(FormBuilderInterface $builder, array $options)
  68. {
  69. if (!$options['csrf_protection']) {
  70. return;
  71. }
  72. $builder
  73. ->addEventSubscriber(new CsrfValidationListener(
  74. $options['csrf_field_name'],
  75. $options['csrf_token_manager'],
  76. $options['csrf_token_id'] ?: ($builder->getName() ?: get_class($builder->getType()->getInnerType())),
  77. $options['csrf_message'],
  78. $this->translator,
  79. $this->translationDomain,
  80. $this->serverParams
  81. ))
  82. ;
  83. }
  84. /**
  85. * Adds a CSRF field to the root form view.
  86. *
  87. * @param FormView $view The form view
  88. * @param FormInterface $form The form
  89. * @param array $options The options
  90. */
  91. public function finishView(FormView $view, FormInterface $form, array $options)
  92. {
  93. if ($options['csrf_protection'] && !$view->parent && $options['compound']) {
  94. $factory = $form->getConfig()->getFormFactory();
  95. $tokenId = $options['csrf_token_id'] ?: ($form->getName() ?: get_class($form->getConfig()->getType()->getInnerType()));
  96. $data = (string) $options['csrf_token_manager']->getToken($tokenId);
  97. $csrfForm = $factory->createNamed($options['csrf_field_name'], 'Symfony\Component\Form\Extension\Core\Type\HiddenType', $data, array(
  98. 'mapped' => false,
  99. ));
  100. $view->children[$options['csrf_field_name']] = $csrfForm->createView($view);
  101. }
  102. }
  103. /**
  104. * {@inheritdoc}
  105. */
  106. public function configureOptions(OptionsResolver $resolver)
  107. {
  108. // BC clause for the "intention" option
  109. $csrfTokenId = function (Options $options) {
  110. if (null !== $options['intention']) {
  111. @trigger_error('The form option "intention" is deprecated since version 2.8 and will be removed in 3.0. Use "csrf_token_id" instead.', E_USER_DEPRECATED);
  112. }
  113. return $options['intention'];
  114. };
  115. // BC clause for the "csrf_provider" option
  116. $csrfTokenManager = function (Options $options) {
  117. if ($options['csrf_provider'] instanceof CsrfTokenManagerInterface) {
  118. return $options['csrf_provider'];
  119. }
  120. return $options['csrf_provider'] instanceof CsrfTokenManagerAdapter
  121. ? $options['csrf_provider']->getTokenManager(false)
  122. : new CsrfProviderAdapter($options['csrf_provider']);
  123. };
  124. $defaultTokenManager = $this->defaultTokenManager;
  125. $csrfProviderNormalizer = function (Options $options, $csrfProvider) use ($defaultTokenManager) {
  126. if (null !== $csrfProvider) {
  127. @trigger_error('The form option "csrf_provider" is deprecated since version 2.8 and will be removed in 3.0. Use "csrf_token_manager" instead.', E_USER_DEPRECATED);
  128. return $csrfProvider;
  129. }
  130. return $defaultTokenManager;
  131. };
  132. $resolver->setDefaults(array(
  133. 'csrf_protection' => $this->defaultEnabled,
  134. 'csrf_field_name' => $this->defaultFieldName,
  135. 'csrf_message' => 'The CSRF token is invalid. Please try to resubmit the form.',
  136. 'csrf_token_manager' => $csrfTokenManager,
  137. 'csrf_token_id' => $csrfTokenId,
  138. 'csrf_provider' => null, // deprecated
  139. 'intention' => null, // deprecated
  140. ));
  141. $resolver->setNormalizer('csrf_provider', $csrfProviderNormalizer);
  142. }
  143. /**
  144. * {@inheritdoc}
  145. */
  146. public function getExtendedType()
  147. {
  148. return 'Symfony\Component\Form\Extension\Core\Type\FormType';
  149. }
  150. }