PageRenderTime 49ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/Tests/Security/Authentication/Provider/ProviderTest.php

https://github.com/wetalkgroup/EscapeWSSEAuthenticationBundle
PHP | 230 lines | 112 code | 27 blank | 91 comment | 7 complexity | 176a87fc0feb5998a35e60e980f13aea MD5 | raw file
  1. <?php
  2. /**
  3. * @author Dmitry Petrov <dmitry.petrov@opensoftdev.ru>
  4. */
  5. namespace Escape\WSSEAuthenticationBundle\Tests\Security\Authentication\Provider;
  6. use Escape\WSSEAuthenticationBundle\Security\Authentication\Provider\Provider;
  7. use Escape\WSSEAuthenticationBundle\Security\Authentication\Token\Token;
  8. class ProviderTestSimple extends Provider
  9. {
  10. public function validateDigest($digest, $nonce, $created, $secret)
  11. {
  12. return parent::validateDigest($digest, $nonce, $created, $secret);
  13. }
  14. }
  15. /**
  16. * @author Dmitry Petrov <dmitry.petrov@opensoftdev.ru>
  17. */
  18. class ProviderTest extends \PHPUnit_Framework_TestCase
  19. {
  20. private $userProvider;
  21. private static $nonceDir;
  22. public static function setUpBeforeClass()
  23. {
  24. parent::setUpBeforeClass();
  25. static::$nonceDir = __DIR__ . '/../../../nonceDir/';
  26. }
  27. private function clearDir()
  28. {
  29. $handle = opendir(static::$nonceDir);
  30. while ($tmp = readdir($handle)) {
  31. if($tmp != '..' && $tmp != '.' && $tmp != '') {
  32. unlink(static::$nonceDir . $tmp);
  33. }
  34. }
  35. }
  36. protected function setUp()
  37. {
  38. $this->userProvider = $this->getMock('Symfony\Component\Security\Core\User\UserProviderInterface');
  39. $this->clearDir();
  40. }
  41. /**
  42. * @test
  43. * @dataProvider providerSupports
  44. * @param $token
  45. * @param $expected
  46. */
  47. public function supports($token, $expected)
  48. {
  49. $provider = new Provider($this->userProvider);
  50. $this->assertEquals($expected, $provider->supports($token));
  51. }
  52. public function providerSupports()
  53. {
  54. return array(
  55. array(new Token(), true),
  56. array($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'), false)
  57. );
  58. }
  59. /**
  60. * @test
  61. *
  62. * @param $digest
  63. * @param $nonce
  64. * @param $created
  65. * @param $secret
  66. */
  67. public function validateDigestExpireTime()
  68. {
  69. $provider = new ProviderTestSimple($this->userProvider);
  70. $result = $provider->validateDigest(null, null, '2000-10-10 12:00:00', null);
  71. $this->assertFalse($result);
  72. }
  73. /**
  74. * @test
  75. * @dataProvider providerValidateDigest
  76. * @param $digest
  77. * @param $nonce
  78. * @param $created
  79. * @param $secret
  80. */
  81. public function validateDigestWithoutNonceDir($digest, $nonce, $created, $secret, $expected)
  82. {
  83. $provider = new ProviderTestSimple($this->userProvider);
  84. $result = $provider->validateDigest($digest, $nonce, $created, $secret);
  85. $this->assertEquals($expected, $result);
  86. }
  87. public function providerValidateDigest()
  88. {
  89. $time = date('Y-m-d H:i:s');
  90. $digest = base64_encode(sha1(base64_decode(base64_encode('test')).$time.'test', true));
  91. return array(
  92. array($digest, base64_encode('test'), $time, 'test', true),
  93. array($digest, base64_encode('test'), $time, 'test1', false),
  94. array($digest, base64_encode('test'), $time+4, 'test', false),
  95. array($digest, base64_encode('test2'), $time, 'test', false),
  96. array($digest. '9', base64_encode('test'), $time, 'test', false),
  97. );
  98. }
  99. /**
  100. * @test
  101. * @dataProvider providerValidateDigest
  102. * @param $digest
  103. * @param $nonce
  104. * @param $created
  105. * @param $secret
  106. */
  107. public function validateDigestWithNonceDir($digest, $nonce, $created, $secret, $expected)
  108. {
  109. $provider = new ProviderTestSimple($this->userProvider, __DIR__ . '/../../../nonceDir');
  110. $result = $provider->validateDigest($digest, $nonce, $created, $secret);
  111. $this->assertEquals($expected, $result);
  112. $this->assertFileExists(static::$nonceDir . $nonce);
  113. $result = $provider->validateDigest($digest, $nonce, $created, $secret);
  114. $this->assertEquals($expected, $result);
  115. unlink(static::$nonceDir . $nonce);
  116. /*//expire timestamp after specified lifetime
  117. if(time() - strtotime($created) > $this->lifetime)
  118. return false;
  119. if($this->nonceDir)
  120. {
  121. //validate nonce is unique within specified lifetime
  122. if(file_exists($this->nonceDir.'/'.$nonce) && file_get_contents($this->nonceDir.'/'.$nonce) + $this->lifetime < time())
  123. throw new NonceExpiredException('Previously used nonce detected');
  124. file_put_contents($this->nonceDir.'/'.$nonce, time());
  125. }
  126. //validate secret
  127. $expected = base64_encode(sha1(base64_decode($nonce).$created.$secret), true);
  128. return $digest === $expected;*/
  129. }
  130. /**
  131. * @test
  132. * @dataProvider providerValidateDigest
  133. * @expectedException \Symfony\Component\Security\Core\Exception\NonceExpiredException
  134. * @param $digest
  135. * @param $nonce
  136. * @param $created
  137. * @param $secret
  138. */
  139. public function validateDigestWithNonceDirExpectedException($digest, $nonce, $created, $secret, $expected)
  140. {
  141. $provider = new ProviderTestSimple($this->userProvider, __DIR__ . '/../../../nonceDir');
  142. file_put_contents(static::$nonceDir . $nonce, time() - 60000);
  143. $provider->validateDigest($digest, $nonce, $created, $secret);
  144. unlink(static::$nonceDir . $nonce);
  145. }
  146. /**
  147. * @test
  148. *
  149. * @depends validateDigestWithNonceDirExpectedException
  150. * @depends validateDigestWithNonceDir
  151. * @depends validateDigestWithoutNonceDir
  152. * @depends validateDigestExpireTime
  153. * @expectedException \Symfony\Component\Security\Core\Exception\AuthenticationException
  154. */
  155. public function authenticateExpectedException()
  156. {
  157. $provider = new ProviderTestSimple($this->userProvider);
  158. $provider->authenticate(new Token());
  159. /*$user = $this->userProvider->loadUserByUsername($token->getUsername());
  160. if($user && $this->validateDigest($token->digest, $token->nonce, $token->created, $user->getPassword()))
  161. {
  162. $authenticatedToken = new Token($user->getRoles());
  163. $authenticatedToken->setUser($user);
  164. $authenticatedToken->setAuthenticated(true);
  165. return $authenticatedToken;
  166. }
  167. throw new AuthenticationException('WSSE authentication failed.');*/
  168. }
  169. /**
  170. * @test
  171. * @depends validateDigestWithNonceDirExpectedException
  172. * @depends validateDigestWithNonceDir
  173. * @depends validateDigestWithoutNonceDir
  174. * @depends validateDigestExpireTime
  175. */
  176. public function authenticate()
  177. {
  178. $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
  179. $user->expects($this->once())->method('getPassword')->will($this->returnValue('test'));
  180. $user->expects($this->once())->method('getRoles')->will($this->returnValue(array()));
  181. $this->userProvider->expects($this->once())->method('loadUserByUsername')->will($this->returnValue($user));
  182. $expected = new Token();
  183. $expected->setUser($user);
  184. $expected->setAuthenticated(true);
  185. $time = date('Y-m-d H:i:s');
  186. $digest = base64_encode(sha1(base64_decode(base64_encode('test')).$time.'test', true));
  187. //$digest, base64_encode('test'), $time, 'test', true),
  188. $token = new Token();
  189. $token->digest = $digest;
  190. $token->nonce = base64_encode('test');
  191. $token->created = $time;
  192. $provider = new ProviderTestSimple($this->userProvider);
  193. $result = $provider->authenticate($token);
  194. $this->assertEquals($expected, $result);
  195. }
  196. }