PageRenderTime 54ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/Tests/Unit/Security/Authorization/Voter/PolicyTest.php

https://github.com/christianjul/FLOW3-Composer
PHP | 228 lines | 140 code | 48 blank | 40 comment | 8 complexity | ecea537099be2496c273afea64cd0d67 MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-3.0
  1. <?php
  2. namespace TYPO3\FLOW3\Tests\Unit\Security\Authorization\Voter;
  3. /* *
  4. * This script belongs to the FLOW3 framework. *
  5. * *
  6. * It is free software; you can redistribute it and/or modify it under *
  7. * the terms of the GNU Lesser General Public License, either version 3 *
  8. * of the License, or (at your option) any later version. *
  9. * *
  10. * The TYPO3 project - inspiring people to share! *
  11. * */
  12. /**
  13. * Testcase for the Policy voter
  14. *
  15. */
  16. class PolicyTest extends \TYPO3\FLOW3\Tests\UnitTestCase {
  17. /**
  18. * @test
  19. */
  20. public function voteForJoinPointAbstainsIfNoPrivilegeWasConfigured() {
  21. $mockRoleAdministrator = $this->getMock('TYPO3\FLOW3\Security\Policy\Role', array(), array(), 'role1' . md5(uniqid(mt_rand(), TRUE)), FALSE);
  22. $mockRoleAdministrator->expects($this->any())->method('__toString')->will($this->returnValue('ADMINISTRATOR'));
  23. $mockRoleCustomer = $this->getMock('TYPO3\FLOW3\Security\Policy\Role', array(), array(), 'role2' . md5(uniqid(mt_rand(), TRUE)), FALSE);
  24. $mockRoleCustomer->expects($this->any())->method('__toString')->will($this->returnValue('CUSTOMER'));
  25. $mockSecurityContext = $this->getMock('TYPO3\FLOW3\Security\Context', array(), array(), '', FALSE);
  26. $mockSecurityContext->expects($this->once())->method('getRoles')->will($this->returnValue(array($mockRoleAdministrator, $mockRoleCustomer)));
  27. $mockJoinPoint = $this->getMock('TYPO3\FLOW3\Aop\JoinPointInterface');
  28. $mockPolicyService = $this->getMock('TYPO3\FLOW3\Security\Policy\PolicyService');
  29. $mockPolicyService->expects($this->any())->method('getPrivilegesForJoinPoint')->will($this->returnValue(array()));
  30. $Policy = new \TYPO3\FLOW3\Security\Authorization\Voter\Policy($mockPolicyService);
  31. $this->assertEquals($Policy->voteForJoinPoint($mockSecurityContext, $mockJoinPoint), \TYPO3\FLOW3\Security\Authorization\Voter\Policy::VOTE_ABSTAIN, 'The wrong vote was returned!');
  32. }
  33. /**
  34. * @test
  35. */
  36. public function voteForJoinPointAbstainsIfNoRolesAreAvailable() {
  37. $mockSecurityContext = $this->getMock('TYPO3\FLOW3\Security\Context', array(), array(), '', FALSE);
  38. $mockSecurityContext->expects($this->once())->method('getRoles')->will($this->returnValue(array()));
  39. $mockJoinPoint = $this->getMock('TYPO3\FLOW3\Aop\JoinPointInterface', array(), array(), '', FALSE);
  40. $mockPolicyService = $this->getMock('TYPO3\FLOW3\Security\Policy\PolicyService', array(), array(), '', FALSE);
  41. $Policy = new \TYPO3\FLOW3\Security\Authorization\Voter\Policy($mockPolicyService);
  42. $this->assertEquals($Policy->voteForJoinPoint($mockSecurityContext, $mockJoinPoint), \TYPO3\FLOW3\Security\Authorization\Voter\Policy::VOTE_ABSTAIN, 'The wrong vote was returned!');
  43. }
  44. /**
  45. * @test
  46. */
  47. public function voteForJoinPointAbstainsIfNoPolicyEntryCouldBeFound() {
  48. $mockSecurityContext = $this->getMock('TYPO3\FLOW3\Security\Context', array(), array(), '', FALSE);
  49. $mockSecurityContext->expects($this->once())->method('getRoles')->will($this->returnValue(array(new \TYPO3\FLOW3\Security\Policy\Role('role1'))));
  50. $mockJoinPoint = $this->getMock('TYPO3\FLOW3\Aop\JoinPointInterface', array(), array(), '', FALSE);
  51. $mockPolicyService = $this->getMock('TYPO3\FLOW3\Security\Policy\PolicyService', array(), array(), '', FALSE);
  52. $mockPolicyService->expects($this->once())->method('getPrivilegesForJoinPoint')->will($this->throwException(new \TYPO3\FLOW3\Security\Exception\NoEntryInPolicyException()));
  53. $voter = new \TYPO3\FLOW3\Security\Authorization\Voter\Policy($mockPolicyService);
  54. $this->assertEquals($voter->voteForJoinPoint($mockSecurityContext, $mockJoinPoint), \TYPO3\FLOW3\Security\Authorization\Voter\Policy::VOTE_ABSTAIN, 'The wrong vote was returned!');
  55. }
  56. /**
  57. * @test
  58. */
  59. public function voteForJoinPointDeniesAccessIfADenyPrivilegeWasConfiguredForOneOfTheRoles() {
  60. $role1ClassName = 'role1' . md5(uniqid(mt_rand(), TRUE));
  61. $role2ClassName = 'role2' . md5(uniqid(mt_rand(), TRUE));
  62. $mockRoleAdministrator = $this->getMock('TYPO3\FLOW3\Security\Policy\Role', array(), array(), $role1ClassName, FALSE);
  63. $mockRoleAdministrator->expects($this->any())->method('__toString')->will($this->returnValue('Administrator'));
  64. $mockRoleCustomer = $this->getMock('TYPO3\FLOW3\Security\Policy\Role', array(), array(), $role2ClassName, FALSE);
  65. $mockRoleCustomer->expects($this->any())->method('__toString')->will($this->returnValue('Customer'));
  66. $mockSecurityContext = $this->getMock('TYPO3\FLOW3\Security\Context', array(), array(), '', FALSE);
  67. $mockSecurityContext->expects($this->once())->method('getRoles')->will($this->returnValue(array($mockRoleAdministrator, $mockRoleCustomer)));
  68. $mockJoinPoint = $this->getMock('TYPO3\FLOW3\Aop\JoinPointInterface');
  69. $getPrivilegesCallback = function() use (&$role1ClassName) {
  70. $args = func_get_args();
  71. if ($args[0] instanceof $role1ClassName) {
  72. return array(\TYPO3\FLOW3\Security\Policy\PolicyService::PRIVILEGE_DENY);
  73. } else {
  74. return array(\TYPO3\FLOW3\Security\Policy\PolicyService::PRIVILEGE_GRANT);
  75. }
  76. };
  77. $mockPolicyService = $this->getMock('TYPO3\FLOW3\Security\Policy\PolicyService');
  78. $mockPolicyService->expects($this->any())->method('getPrivilegesForJoinPoint')->will($this->returnCallback($getPrivilegesCallback));
  79. $Policy = new \TYPO3\FLOW3\Security\Authorization\Voter\Policy($mockPolicyService);
  80. $this->assertEquals($Policy->voteForJoinPoint($mockSecurityContext, $mockJoinPoint), \TYPO3\FLOW3\Security\Authorization\Voter\Policy::VOTE_DENY , 'The wrong vote was returned!');
  81. }
  82. /**
  83. * @test
  84. */
  85. public function voteForJoinPointGrantsAccessIfAGrantPrivilegeAndNoDenyPrivilegeWasConfigured() {
  86. $role1ClassName = 'role1' . md5(uniqid(mt_rand(), TRUE));
  87. $role2ClassName = 'role2' . md5(uniqid(mt_rand(), TRUE));
  88. $mockRoleAdministrator = $this->getMock('TYPO3\FLOW3\Security\Policy\Role', array(), array(), $role1ClassName, FALSE);
  89. $mockRoleAdministrator->expects($this->any())->method('__toString')->will($this->returnValue('Administrator'));
  90. $mockRoleCustomer = $this->getMock('TYPO3\FLOW3\Security\Policy\Role', array(), array(), $role2ClassName, FALSE);
  91. $mockRoleCustomer->expects($this->any())->method('__toString')->will($this->returnValue('Customer'));
  92. $mockSecurityContext = $this->getMock('TYPO3\FLOW3\Security\Context', array(), array(), '', FALSE);
  93. $mockSecurityContext->expects($this->once())->method('getRoles')->will($this->returnValue(array($mockRoleAdministrator, $mockRoleCustomer)));
  94. $mockJoinPoint = $this->getMock('TYPO3\FLOW3\Aop\JoinPointInterface');
  95. $getPrivilegesCallback = function() use (&$role1ClassName) {
  96. $args = func_get_args();
  97. if ($args[0] instanceof $role1ClassName) {
  98. return array(\TYPO3\FLOW3\Security\Policy\PolicyService::PRIVILEGE_GRANT);
  99. } else {
  100. return array();
  101. }
  102. };
  103. $mockPolicyService = $this->getMock('TYPO3\FLOW3\Security\Policy\PolicyService');
  104. $mockPolicyService->expects($this->any())->method('getPrivilegesForJoinPoint')->will($this->returnCallback($getPrivilegesCallback));
  105. $Policy = new \TYPO3\FLOW3\Security\Authorization\Voter\Policy($mockPolicyService);
  106. $this->assertEquals($Policy->voteForJoinPoint($mockSecurityContext, $mockJoinPoint), \TYPO3\FLOW3\Security\Authorization\Voter\Policy::VOTE_GRANT , 'The wrong vote was returned!');
  107. }
  108. /**
  109. * @test
  110. */
  111. public function voteForResourceAbstainsIfNoRolesAreAvailable() {
  112. $mockSecurityContext = $this->getMock('TYPO3\FLOW3\Security\Context', array(), array(), '', FALSE);
  113. $mockSecurityContext->expects($this->once())->method('getRoles')->will($this->returnValue(array()));
  114. $mockPolicyService = $this->getMock('TYPO3\FLOW3\Security\Policy\PolicyService', array(), array(), '', FALSE);
  115. $voter = new \TYPO3\FLOW3\Security\Authorization\Voter\Policy($mockPolicyService);
  116. $this->assertEquals($voter->voteForResource($mockSecurityContext, 'myResource'), \TYPO3\FLOW3\Security\Authorization\Voter\Policy::VOTE_ABSTAIN, 'The wrong vote was returned!');
  117. }
  118. /**
  119. * @test
  120. */
  121. public function voteForResourceAbstainsIfNoPolicyEntryCouldBeFound() {
  122. $mockSecurityContext = $this->getMock('TYPO3\FLOW3\Security\Context', array(), array(), '', FALSE);
  123. $mockSecurityContext->expects($this->once())->method('getRoles')->will($this->returnValue(array(new \TYPO3\FLOW3\Security\Policy\Role('role1'))));
  124. $mockPolicyService = $this->getMock('TYPO3\FLOW3\Security\Policy\PolicyService', array(), array(), '', FALSE);
  125. $mockPolicyService->expects($this->once())->method('getPrivilegeForResource')->will($this->throwException(new \TYPO3\FLOW3\Security\Exception\NoEntryInPolicyException()));
  126. $voter = new \TYPO3\FLOW3\Security\Authorization\Voter\Policy($mockPolicyService);
  127. $this->assertEquals($voter->voteForResource($mockSecurityContext, 'myResource'), \TYPO3\FLOW3\Security\Authorization\Voter\Policy::VOTE_ABSTAIN, 'The wrong vote was returned!');
  128. }
  129. /**
  130. * @test
  131. */
  132. public function voteForResourceDeniesAccessIfADenyPrivilegeWasConfiguredForOneOfTheRoles() {
  133. $role1ClassName = 'role1' . md5(uniqid(mt_rand(), TRUE));
  134. $role2ClassName = 'role2' . md5(uniqid(mt_rand(), TRUE));
  135. $mockRoleAdministrator = $this->getMock('TYPO3\FLOW3\Security\Policy\Role', array(), array(), $role1ClassName, FALSE);
  136. $mockRoleAdministrator->expects($this->any())->method('__toString')->will($this->returnValue('ADMINISTRATOR'));
  137. $mockRoleCustomer = $this->getMock('TYPO3\FLOW3\Security\Policy\Role', array(), array(), $role2ClassName, FALSE);
  138. $mockRoleCustomer->expects($this->any())->method('__toString')->will($this->returnValue('CUSTOMER'));
  139. $mockSecurityContext = $this->getMock('TYPO3\FLOW3\Security\Context', array(), array(), '', FALSE);
  140. $mockSecurityContext->expects($this->once())->method('getRoles')->will($this->returnValue(array($mockRoleAdministrator, $mockRoleCustomer)));
  141. $getPrivilegeCallback = function() use (&$role1ClassName) {
  142. $args = func_get_args();
  143. if ($args[0] instanceof $role1ClassName) {
  144. return \TYPO3\FLOW3\Security\Policy\PolicyService::PRIVILEGE_DENY;
  145. } else {
  146. return NULL;
  147. }
  148. };
  149. $mockPolicyService = $this->getMock('TYPO3\FLOW3\Security\Policy\PolicyService');
  150. $mockPolicyService->expects($this->any())->method('getPrivilegeForResource')->will($this->returnCallback($getPrivilegeCallback));
  151. $Policy = new \TYPO3\FLOW3\Security\Authorization\Voter\Policy($mockPolicyService);
  152. $this->assertEquals($Policy->voteForResource($mockSecurityContext, 'myResource'), \TYPO3\FLOW3\Security\Authorization\Voter\Policy::VOTE_DENY , 'The wrong vote was returned!');
  153. }
  154. /**
  155. * @test
  156. */
  157. public function voteForResourceGrantsAccessIfAGrantPrivilegeAndNoDenyPrivilegeWasConfigured() {
  158. $role1ClassName = 'role1' . md5(uniqid(mt_rand(), TRUE));
  159. $role2ClassName = 'role2' . md5(uniqid(mt_rand(), TRUE));
  160. $mockRoleAdministrator = $this->getMock('TYPO3\FLOW3\Security\Policy\Role', array(), array(), $role1ClassName, FALSE);
  161. $mockRoleAdministrator->expects($this->any())->method('__toString')->will($this->returnValue('Administrator'));
  162. $mockRoleCustomer = $this->getMock('TYPO3\FLOW3\Security\Policy\Role', array(), array(), $role2ClassName, FALSE);
  163. $mockRoleCustomer->expects($this->any())->method('__toString')->will($this->returnValue('Customer'));
  164. $mockSecurityContext = $this->getMock('TYPO3\FLOW3\Security\Context', array(), array(), '', FALSE);
  165. $mockSecurityContext->expects($this->once())->method('getRoles')->will($this->returnValue(array($mockRoleAdministrator, $mockRoleCustomer)));
  166. $getPrivilegesCallback = function() use (&$role1ClassName) {
  167. $args = func_get_args();
  168. if ($args[0] instanceof $role1ClassName) {
  169. return \TYPO3\FLOW3\Security\Policy\PolicyService::PRIVILEGE_GRANT;
  170. } else {
  171. return NULL;
  172. }
  173. };
  174. $mockPolicyService = $this->getMock('TYPO3\FLOW3\Security\Policy\PolicyService');
  175. $mockPolicyService->expects($this->any())->method('getPrivilegeForResource')->will($this->returnCallback($getPrivilegesCallback));
  176. $Policy = new \TYPO3\FLOW3\Security\Authorization\Voter\Policy($mockPolicyService);
  177. $this->assertEquals($Policy->voteForResource($mockSecurityContext, 'myResource'), \TYPO3\FLOW3\Security\Authorization\Voter\Policy::VOTE_GRANT , 'The wrong vote was returned!');
  178. }
  179. }
  180. ?>