PageRenderTime 41ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/symfony/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Configuration.php

https://github.com/tumf/tepco
PHP | 248 lines | 219 code | 17 blank | 12 comment | 3 complexity | 3a4be76ad679ea1bb4e9ba2d2f6eff2c MD5 | raw file
  1. <?php
  2. namespace Symfony\Bundle\SecurityBundle\DependencyInjection;
  3. use Symfony\Component\Config\Definition\Builder\TreeBuilder;
  4. /**
  5. * This class contains the configuration information for the following tags:
  6. *
  7. * * security.config
  8. * * security.acl
  9. *
  10. * This information is solely responsible for how the different configuration
  11. * sections are normalized, and merged.
  12. *
  13. * @author Johannes M. Schmitt <schmittjoh@gmail.com>
  14. */
  15. class Configuration
  16. {
  17. public function getFactoryConfigTree()
  18. {
  19. $tb = new TreeBuilder();
  20. return $tb
  21. ->root('security', 'array')
  22. ->ignoreExtraKeys()
  23. ->fixXmlConfig('factory', 'factories')
  24. ->arrayNode('factories')
  25. ->prototype('scalar')->end()
  26. ->end()
  27. ->end()
  28. ->buildTree();
  29. }
  30. public function getMainConfigTree(array $factories)
  31. {
  32. $tb = new TreeBuilder();
  33. $rootNode = $tb->root('security', 'array');
  34. $rootNode
  35. ->scalarNode('access_denied_url')->defaultNull()->end()
  36. ->scalarNode('session_fixation_strategy')->cannotBeEmpty()->defaultValue('migrate')->end()
  37. // add a faux-entry for factories, so that no validation error is thrown
  38. ->fixXmlConfig('factory', 'factories')
  39. ->arrayNode('factories')
  40. ->ignoreExtraKeys()
  41. ->end()
  42. ;
  43. $this->addAclSection($rootNode);
  44. $this->addEncodersSection($rootNode);
  45. $this->addProvidersSection($rootNode);
  46. $this->addFirewallsSection($rootNode, $factories);
  47. $this->addAccessControlSection($rootNode);
  48. $this->addRoleHierarchySection($rootNode);
  49. return $tb->buildTree();
  50. }
  51. protected function addAclSection($rootNode)
  52. {
  53. $rootNode
  54. ->arrayNode('acl')
  55. ->scalarNode('connection')->end()
  56. ->scalarNode('cache')->end()
  57. ->end()
  58. ;
  59. }
  60. protected function addRoleHierarchySection($rootNode)
  61. {
  62. $rootNode
  63. ->fixXmlConfig('role', 'role_hierarchy')
  64. ->arrayNode('role_hierarchy')
  65. ->useAttributeAsKey('id')
  66. ->prototype('array')
  67. ->performNoDeepMerging()
  68. ->beforeNormalization()->ifString()->then(function($v) { return array('value' => $v); })->end()
  69. ->beforeNormalization()
  70. ->ifTrue(function($v) { return is_array($v) && isset($v['value']); })
  71. ->then(function($v) { return preg_split('/\s*,\s*/', $v['value']); })
  72. ->end()
  73. ->prototype('scalar')->end()
  74. ->end()
  75. ->end()
  76. ;
  77. }
  78. protected function addAccessControlSection($rootNode)
  79. {
  80. $rootNode
  81. ->fixXmlConfig('rule', 'access_control')
  82. ->arrayNode('access_control')
  83. ->cannotBeOverwritten()
  84. ->prototype('array')
  85. ->scalarNode('requires_channel')->defaultNull()->end()
  86. ->scalarNode('path')->defaultNull()->end()
  87. ->scalarNode('host')->defaultNull()->end()
  88. ->scalarNode('ip')->defaultNull()->end()
  89. ->arrayNode('methods')
  90. ->beforeNormalization()->ifString()->then(function($v) { return preg_split('/\s*,\s*/', $v); })->end()
  91. ->prototype('scalar')->end()
  92. ->end()
  93. ->fixXmlConfig('role')
  94. ->arrayNode('roles')
  95. ->beforeNormalization()->ifString()->then(function($v) { return preg_split('/\s*,\s*/', $v); })->end()
  96. ->prototype('scalar')->end()
  97. ->end()
  98. ->fixXmlConfig('attribute')
  99. ->arrayNode('attributes')
  100. ->useAttributeAsKey('key')
  101. ->prototype('scalar')
  102. ->beforeNormalization()
  103. ->ifTrue(function($v) { return is_array($v) && isset($v['pattern']); })
  104. ->then(function($v) { return $v['pattern']; })
  105. ->end()
  106. ->end()
  107. ->end()
  108. ->end()
  109. ->end()
  110. ;
  111. }
  112. protected function addFirewallsSection($rootNode, array $factories)
  113. {
  114. $firewallNodeBuilder =
  115. $rootNode
  116. ->fixXmlConfig('firewall')
  117. ->arrayNode('firewalls')
  118. ->isRequired()
  119. ->requiresAtLeastOneElement()
  120. ->disallowNewKeysInSubsequentConfigs()
  121. ->useAttributeAsKey('name')
  122. ->prototype('array')
  123. ->scalarNode('pattern')->end()
  124. ->booleanNode('security')->defaultTrue()->end()
  125. ->scalarNode('request_matcher')->end()
  126. ->scalarNode('access_denied_url')->end()
  127. ->scalarNode('access_denied_handler')->end()
  128. ->scalarNode('entry_point')->end()
  129. ->scalarNode('provider')->end()
  130. ->booleanNode('stateless')->defaultFalse()->end()
  131. ->scalarNode('context')->cannotBeEmpty()->end()
  132. ->arrayNode('logout')
  133. ->treatTrueLike(array())
  134. ->canBeUnset()
  135. ->scalarNode('path')->defaultValue('/logout')->end()
  136. ->scalarNode('target')->defaultValue('/')->end()
  137. ->scalarNode('success_handler')->end()
  138. ->booleanNode('invalidate_session')->defaultTrue()->end()
  139. ->fixXmlConfig('delete_cookie')
  140. ->arrayNode('delete_cookies')
  141. ->beforeNormalization()
  142. ->ifTrue(function($v) { return is_array($v) && is_int(key($v)); })
  143. ->then(function($v) { return array_map(function($v) { return array('name' => $v); }, $v); })
  144. ->end()
  145. ->useAttributeAsKey('name')
  146. ->prototype('array')
  147. ->scalarNode('path')->defaultNull()->end()
  148. ->scalarNode('domain')->defaultNull()->end()
  149. ->end()
  150. ->end()
  151. ->fixXmlConfig('handler')
  152. ->arrayNode('handlers')
  153. ->prototype('scalar')->end()
  154. ->end()
  155. ->end()
  156. ->booleanNode('anonymous')->defaultFalse()->end()
  157. ->arrayNode('switch_user')
  158. ->scalarNode('provider')->end()
  159. ->scalarNode('parameter')->defaultValue('_switch_user')->end()
  160. ->scalarNode('role')->defaultValue('ROLE_ALLOWED_TO_SWITCH')->end()
  161. ->end()
  162. ;
  163. foreach ($factories as $factoriesAtPosition) {
  164. foreach ($factoriesAtPosition as $factory) {
  165. $factoryNode =
  166. $firewallNodeBuilder->arrayNode(str_replace('-', '_', $factory->getKey()))
  167. ->canBeUnset()
  168. ;
  169. $factory->addConfiguration($factoryNode);
  170. }
  171. }
  172. }
  173. protected function addProvidersSection($rootNode)
  174. {
  175. $rootNode
  176. ->fixXmlConfig('provider')
  177. ->arrayNode('providers')
  178. ->disallowNewKeysInSubsequentConfigs()
  179. ->isRequired()
  180. ->requiresAtLeastOneElement()
  181. ->useAttributeAsKey('name')
  182. ->prototype('array')
  183. ->scalarNode('id')->end()
  184. ->fixXmlConfig('provider')
  185. ->arrayNode('providers')
  186. ->beforeNormalization()
  187. ->ifString()
  188. ->then(function($v) { return preg_split('/\s*,\s*/', $v); })
  189. ->end()
  190. ->prototype('scalar')->end()
  191. ->end()
  192. ->fixXmlConfig('user')
  193. ->arrayNode('users')
  194. ->useAttributeAsKey('name')
  195. ->prototype('array')
  196. ->scalarNode('password')->defaultValue(uniqid())->end()
  197. ->arrayNode('roles')
  198. ->beforeNormalization()->ifString()->then(function($v) { return preg_split('/\s*,\s*/', $v); })->end()
  199. ->prototype('scalar')->end()
  200. ->end()
  201. ->end()
  202. ->end()
  203. ->arrayNode('entity')
  204. ->scalarNode('class')->isRequired()->cannotBeEmpty()->end()
  205. ->scalarNode('property')->defaultNull()->end()
  206. ->end()
  207. ->end()
  208. ->end()
  209. ;
  210. }
  211. protected function addEncodersSection($rootNode)
  212. {
  213. $rootNode
  214. ->fixXmlConfig('encoder')
  215. ->arrayNode('encoders')
  216. ->requiresAtLeastOneElement()
  217. ->useAttributeAsKey('class')
  218. ->prototype('array')
  219. ->canBeUnset()
  220. ->performNoDeepMerging()
  221. ->beforeNormalization()->ifString()->then(function($v) { return array('algorithm' => $v); })->end()
  222. ->scalarNode('algorithm')->cannotBeEmpty()->end()
  223. ->booleanNode('ignore_case')->defaultFalse()->end()
  224. ->booleanNode('encode_as_base64')->defaultTrue()->end()
  225. ->scalarNode('iterations')->defaultValue(5000)->end()
  226. ->scalarNode('id')->end()
  227. ->end()
  228. ->end()
  229. ;
  230. }
  231. }