AuthRequest.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. <?php
  2. require_once 'PHPUnit.php';
  3. require_once 'Tests/Auth/OpenID/TestUtil.php';
  4. require_once 'Auth/OpenID/Association.php';
  5. require_once 'Auth/OpenID/Consumer.php';
  6. class AuthRequest_DummyEndpoint {
  7. var $preferred_namespace = null;
  8. var $local_id = null;
  9. var $server_url = null;
  10. var $is_op_identifier = false;
  11. function preferredNamespace()
  12. {
  13. return $this->preferred_namespace;
  14. }
  15. function getLocalID()
  16. {
  17. return $this->local_id;
  18. }
  19. function isOPIdentifier()
  20. {
  21. return $this->is_op_identifier;
  22. }
  23. }
  24. class AuthRequest_DummyAssoc {
  25. var $handle = "assoc-handle";
  26. }
  27. /**
  28. * Base for AuthRequest tests for OpenID 1 and 2.
  29. */
  30. class TestAuthRequestMixin extends OpenIDTestMixin {
  31. var $preferred_namespace = null;
  32. var $immediate = false;
  33. var $expected_mode = 'checkid_setup';
  34. function setUp()
  35. {
  36. $this->endpoint = new AuthRequest_DummyEndpoint();
  37. $this->endpoint->local_id = 'http://server.unittest/joe';
  38. $this->endpoint->claimed_id = 'http://joe.vanity.example/';
  39. $this->endpoint->server_url = 'http://server.unittest/';
  40. $this->endpoint->preferred_namespace = $this->preferred_namespace;
  41. $this->realm = 'http://example/';
  42. $this->return_to = 'http://example/return/';
  43. $this->assoc = new AuthRequest_DummyAssoc();
  44. $this->authreq = new Auth_OpenID_AuthRequest($this->endpoint, $this->assoc);
  45. }
  46. function failUnlessAnonymous($msg)
  47. {
  48. foreach (array('claimed_id', 'identity') as $key) {
  49. $this->failIfOpenIDKeyExists($msg, $key);
  50. }
  51. }
  52. function failUnlessHasRequiredFields($msg)
  53. {
  54. $this->assertEquals($this->preferred_namespace,
  55. $this->authreq->message->getOpenIDNamespace());
  56. $this->assertEquals($this->preferred_namespace,
  57. $msg->getOpenIDNamespace());
  58. $this->failUnlessOpenIDValueEquals($msg, 'mode',
  59. $this->expected_mode);
  60. // Implement these in subclasses because they depend on
  61. // protocol differences!
  62. $this->failUnlessHasRealm($msg);
  63. $this->failUnlessIdentifiersPresent($msg);
  64. }
  65. // TESTS
  66. function test_checkNoAssocHandle()
  67. {
  68. $this->authreq->assoc = null;
  69. $msg = $this->authreq->getMessage($this->realm, $this->return_to,
  70. $this->immediate);
  71. $this->failIfOpenIDKeyExists($msg, 'assoc_handle');
  72. }
  73. function test_checkWithAssocHandle()
  74. {
  75. $msg = $this->authreq->getMessage($this->realm, $this->return_to,
  76. $this->immediate);
  77. $this->failUnlessOpenIDValueEquals($msg, 'assoc_handle',
  78. $this->assoc->handle);
  79. }
  80. function test_addExtensionArg()
  81. {
  82. $this->authreq->addExtensionArg('bag:', 'color', 'brown');
  83. $this->authreq->addExtensionArg('bag:', 'material', 'paper');
  84. $this->assertTrue($this->authreq->message->namespaces->contains('bag:'));
  85. $this->assertEquals($this->authreq->message->getArgs('bag:'),
  86. array('color' => 'brown',
  87. 'material' => 'paper'));
  88. $msg = $this->authreq->getMessage($this->realm, $this->return_to,
  89. $this->immediate);
  90. // XXX: this depends on the way that Message assigns
  91. // namespaces. Really it doesn't care that it has alias "0",
  92. // but that is tested anyway
  93. $post_args = $msg->toPostArgs();
  94. $this->assertEquals('brown', $post_args['openid.ext0.color']);
  95. $this->assertEquals('paper', $post_args['openid.ext0.material']);
  96. }
  97. function test_standard()
  98. {
  99. $msg = $this->authreq->getMessage($this->realm, $this->return_to,
  100. $this->immediate);
  101. $this->failUnlessHasIdentifiers(
  102. $msg, $this->endpoint->local_id,
  103. $this->endpoint->claimed_id);
  104. }
  105. }
  106. class TestAuthRequestOpenID2 extends TestAuthRequestMixin {
  107. var $preferred_namespace = Auth_OpenID_OPENID2_NS;
  108. function failUnlessHasRealm($msg)
  109. {
  110. // check presence of proper realm key and absence of the wrong
  111. // one.
  112. $this->failUnlessOpenIDValueEquals($msg, 'realm', $this->realm);
  113. $this->failIfOpenIDKeyExists($msg, 'trust_root');
  114. }
  115. function failUnlessIdentifiersPresent($msg)
  116. {
  117. $identity_present = $msg->hasKey(Auth_OpenID_OPENID_NS, 'identity');
  118. $claimed_present = $msg->hasKey(Auth_OpenID_OPENID_NS, 'claimed_id');
  119. $this->assertEquals($claimed_present, $identity_present);
  120. }
  121. function failUnlessHasIdentifiers($msg, $op_specific_id, $claimed_id)
  122. {
  123. $this->failUnlessOpenIDValueEquals($msg, 'identity', $op_specific_id);
  124. $this->failUnlessOpenIDValueEquals($msg, 'claimed_id', $claimed_id);
  125. }
  126. // TESTS
  127. function test_markup_checkidImmediate()
  128. {
  129. $result = $this->authreq->formMarkup($this->realm,
  130. null, true);
  131. $this->assertTrue(Auth_OpenID::isFailure($result));
  132. }
  133. function test_markup_returnToArgs()
  134. {
  135. $this->authreq->return_to_args = array('extra' => 'args');
  136. $result = $this->authreq->formMarkup($this->realm,
  137. null, false);
  138. $this->assertTrue(Auth_OpenID::isFailure($result));
  139. }
  140. function test_setAnonymousWorksForOpenID2()
  141. {
  142. // OpenID AuthRequests should be able to set 'anonymous' to true.
  143. $this->assertTrue($this->authreq->message->isOpenID2());
  144. $this->assertTrue($this->authreq->setAnonymous(true));
  145. $this->assertTrue($this->authreq->setAnonymous(false));
  146. }
  147. function test_userAnonymousIgnoresIdentfier()
  148. {
  149. $this->authreq->setAnonymous(true);
  150. $msg = $this->authreq->getMessage($this->realm, $this->return_to,
  151. $this->immediate);
  152. $this->failUnlessHasRequiredFields($msg);
  153. $this->failUnlessAnonymous($msg);
  154. }
  155. function test_opAnonymousIgnoresIdentifier()
  156. {
  157. $this->endpoint->is_op_identifier = true;
  158. $this->authreq->setAnonymous(true);
  159. $msg = $this->authreq->getMessage($this->realm, $this->return_to,
  160. $this->immediate);
  161. $this->failUnlessHasRequiredFields($msg);
  162. $this->failUnlessAnonymous($msg);
  163. }
  164. function test_opIdentifierSendsIdentifierSelect()
  165. {
  166. $this->endpoint->is_op_identifier = true;
  167. $msg = $this->authreq->getMessage($this->realm, $this->return_to,
  168. $this->immediate);
  169. $this->failUnlessHasRequiredFields($msg);
  170. $this->failUnlessHasIdentifiers($msg,
  171. Auth_OpenID_IDENTIFIER_SELECT,
  172. Auth_OpenID_IDENTIFIER_SELECT);
  173. }
  174. }
  175. class TestAuthRequestOpenID1 extends TestAuthRequestMixin {
  176. var $preferred_namespace = Auth_OpenID_OPENID1_NS;
  177. function setUpEndpoint()
  178. {
  179. parent::setUpEndpoint();
  180. $this->endpoint->preferred_namespace = Auth_OpenID_OPENID1_NS;
  181. }
  182. function failUnlessHasIdentifiers($msg, $op_specific_id, $claimed_id)
  183. {
  184. // Make sure claimed_is is *absent* in request.
  185. $this->failUnlessOpenIDValueEquals($msg, 'identity', $op_specific_id);
  186. $this->failIfOpenIDKeyExists($msg, 'claimed_id');
  187. }
  188. function failUnlessIdentifiersPresent($msg)
  189. {
  190. $this->failIfOpenIDKeyExists($msg, 'claimed_id');
  191. $this->assertTrue($msg->hasKey(Auth_OpenID_OPENID_NS, 'identity'));
  192. }
  193. function failUnlessHasRealm($msg)
  194. {
  195. // check presence of proper realm key and absence of the wrong
  196. // one.
  197. $this->failUnlessOpenIDValueEquals($msg, 'trust_root', $this->realm);
  198. $this->failIfOpenIDKeyExists($msg, 'realm');
  199. }
  200. // TESTS
  201. function test_markup_missingReturnTo()
  202. {
  203. $result = $this->authreq->formMarkup($this->realm,
  204. null, false);
  205. $this->assertTrue(Auth_OpenID::isFailure($result));
  206. }
  207. function test_setAnonymousFailsForOpenID1()
  208. {
  209. // OpenID 1 requests MUST NOT be able to set anonymous to True
  210. $this->assertTrue($this->authreq->message->isOpenID1());
  211. $this->assertFalse($this->authreq->setAnonymous(true));
  212. $this->assertTrue($this->authreq->setAnonymous(false));
  213. }
  214. function test_identifierSelect()
  215. {
  216. // Identfier select SHOULD NOT be sent, but this pathway is in
  217. // here in case some special discovery stuff is done to
  218. // trigger it with OpenID 1. If it is triggered, it will send
  219. // identifier_select just like OpenID 2.
  220. $this->endpoint->is_op_identifier = true;
  221. $msg = $this->authreq->getMessage($this->realm, $this->return_to,
  222. $this->immediate);
  223. $this->failUnlessHasRequiredFields($msg);
  224. $this->assertEquals(Auth_OpenID_IDENTIFIER_SELECT,
  225. $msg->getArg(Auth_OpenID_OPENID1_NS,
  226. 'identity'));
  227. }
  228. }
  229. class TestAuthRequestOpenID1Immediate extends TestAuthRequestOpenID1 {
  230. var $immediate = true;
  231. var $expected_mode = 'checkid_immediate';
  232. }
  233. class TestAuthRequestOpenID2Immediate extends TestAuthRequestOpenID2 {
  234. var $immediate = true;
  235. var $expected_mode = 'checkid_immediate';
  236. }
  237. class Tests_Auth_OpenID_AuthRequest extends PHPUnit_TestSuite {
  238. function getName()
  239. {
  240. return "Tests_Auth_OpenID_AuthRequest";
  241. }
  242. function Tests_Auth_OpenID_AuthRequest()
  243. {
  244. $this->addTestSuite('TestAuthRequestOpenID1');
  245. $this->addTestSuite('TestAuthRequestOpenID1Immediate');
  246. $this->addTestSuite('TestAuthRequestOpenID2');
  247. $this->addTestSuite('TestAuthRequestOpenID2Immediate');
  248. }
  249. }
  250. ?>