Message.php 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253
  1. <?php
  2. /**
  3. * Unit tests for the Auth_OpenID_Message implementation.
  4. */
  5. require_once "Auth/OpenID/Message.php";
  6. require_once "Auth/OpenID.php";
  7. require_once "PHPUnit.php";
  8. class MessageTest extends PHPUnit_TestCase {
  9. function _argTest($ns, $key, $expected = null)
  10. {
  11. $a_default = 'a bogus default value';
  12. $this->assertEquals($this->msg->getArg($ns, $key), $expected);
  13. if ($expected === null) {
  14. $this->assertEquals(
  15. $this->msg->getArg($ns, $key, $a_default), $a_default);
  16. $result = $this->msg->getArg($ns, $key, Auth_OpenID_NO_DEFAULT);
  17. $this->assertTrue(Auth_OpenID::isFailure($result));
  18. } else {
  19. $this->assertEquals(
  20. $this->msg->getArg($ns, $key, $a_default), $expected);
  21. $this->assertEquals(
  22. $this->msg->getArg($ns, $key, Auth_OpenID_NO_DEFAULT),
  23. $expected);
  24. }
  25. }
  26. }
  27. class Tests_Auth_OpenID_EmptyMessage extends MessageTest {
  28. function setUp()
  29. {
  30. $this->msg = new Auth_OpenID_Message();
  31. }
  32. function test_toPostArgs()
  33. {
  34. $this->assertEquals($this->msg->toPostArgs(), array());
  35. }
  36. function test_toArgs()
  37. {
  38. $this->assertEquals($this->msg->toArgs(), array());
  39. }
  40. function test_toKVForm()
  41. {
  42. $this->assertEquals($this->msg->toKVForm(), '');
  43. }
  44. function test_toURLEncoded()
  45. {
  46. $this->assertEquals($this->msg->toURLEncoded(), '');
  47. }
  48. function test_toURL()
  49. {
  50. $base_url = 'http://base.url/';
  51. $this->assertEquals($this->msg->toURL($base_url), $base_url);
  52. }
  53. function test_getOpenID()
  54. {
  55. $this->assertEquals($this->msg->getOpenIDNamespace(), null);
  56. }
  57. function test_getKeyOpenID()
  58. {
  59. $key = $this->msg->getKey(Auth_OpenID_OPENID_NS, 'foo');
  60. $this->assertTrue(Auth_OpenID::isFailure($key));
  61. $this->msg->setOpenIDNamespace(Auth_OpenID_OPENID1_NS, false);
  62. $key = $this->msg->getKey(Auth_OpenID_OPENID_NS, 'foo');
  63. $this->assertEquals('openid.foo', $key);
  64. }
  65. function test_getKeyBARE()
  66. {
  67. $this->assertEquals($this->msg->getKey(Auth_OpenID_BARE_NS, 'foo'), 'foo');
  68. }
  69. function test_getKeyNS1()
  70. {
  71. $this->assertEquals($this->msg->getKey(Auth_OpenID_OPENID1_NS, 'foo'), null);
  72. }
  73. function test_getKeyNS2()
  74. {
  75. $this->assertEquals($this->msg->getKey(Auth_OpenID_OPENID2_NS, 'foo'), null);
  76. }
  77. function test_getKeyNS3()
  78. {
  79. $this->assertEquals($this->msg->getKey('urn:nothing-significant', 'foo'),
  80. null);
  81. }
  82. function test_hasKey()
  83. {
  84. $this->assertEquals($this->msg->hasKey(Auth_OpenID_OPENID_NS, 'foo'), false);
  85. }
  86. function test_hasKeyBARE()
  87. {
  88. $this->assertEquals($this->msg->hasKey(Auth_OpenID_BARE_NS, 'foo'), false);
  89. }
  90. function test_hasKeyNS1()
  91. {
  92. $this->assertEquals($this->msg->hasKey(Auth_OpenID_OPENID1_NS, 'foo'), false);
  93. }
  94. function test_hasKeyNS2()
  95. {
  96. $this->assertEquals($this->msg->hasKey(Auth_OpenID_OPENID2_NS, 'foo'), false);
  97. }
  98. function test_hasKeyNS3()
  99. {
  100. $this->assertEquals($this->msg->hasKey('urn:nothing-significant', 'foo'),
  101. false);
  102. }
  103. function test_getArg()
  104. {
  105. $result = $this->msg->getArg(Auth_OpenID_OPENID_NS, 'foo');
  106. $this->assertTrue(Auth_OpenID::isFailure($result));
  107. }
  108. function test_getArgs()
  109. {
  110. $result = $this->msg->getArgs(Auth_OpenID_OPENID_NS);
  111. $this->assertTrue(Auth_OpenID::isFailure($result));
  112. }
  113. function test_getArgsBARE()
  114. {
  115. $this->assertEquals($this->msg->getArgs(Auth_OpenID_BARE_NS), array());
  116. }
  117. function test_getArgsNS1()
  118. {
  119. $this->assertEquals($this->msg->getArgs(Auth_OpenID_OPENID1_NS), array());
  120. }
  121. function test_getArgsNS2()
  122. {
  123. $this->assertEquals($this->msg->getArgs(Auth_OpenID_OPENID2_NS), array());
  124. }
  125. function test_getArgsNS3()
  126. {
  127. $this->assertEquals($this->msg->getArgs('urn:nothing-significant'), array());
  128. }
  129. function test_updateArgs()
  130. {
  131. $result= $this->msg->updateArgs(Auth_OpenID_OPENID_NS,
  132. array('does not' => 'matter'));
  133. $this->assertTrue(Auth_OpenID::isFailure($result));
  134. }
  135. function _test_updateArgsNS($ns)
  136. {
  137. $update_args = array(
  138. 'Camper van Beethoven' => 'David Lowery',
  139. 'Magnolia Electric Co.' => 'Jason Molina');
  140. $this->assertEquals($this->msg->getArgs($ns), array());
  141. $this->msg->updateArgs($ns, $update_args);
  142. $this->assertEquals($this->msg->getArgs($ns), $update_args);
  143. }
  144. function test_updateArgsBARE()
  145. {
  146. $this->_test_updateArgsNS(Auth_OpenID_BARE_NS);
  147. }
  148. function test_updateArgsNS1()
  149. {
  150. $this->_test_updateArgsNS(Auth_OpenID_OPENID1_NS);
  151. }
  152. function test_updateArgsNS2()
  153. {
  154. $this->_test_updateArgsNS(Auth_OpenID_OPENID2_NS);
  155. }
  156. function test_updateArgsNS3()
  157. {
  158. $this->_test_updateArgsNS('urn:nothing-significant');
  159. }
  160. function test_setArg()
  161. {
  162. $result = $this->msg->setArg(Auth_OpenID_OPENID_NS,
  163. 'does not', 'matter');
  164. $this->assertTrue(Auth_OpenID::isFailure($result));
  165. }
  166. function _test_setArgNS($ns)
  167. {
  168. $key = 'Camper van Beethoven';
  169. $value = 'David Lowery';
  170. $this->assertEquals($this->msg->getArg($ns, $key), null);
  171. $this->msg->setArg($ns, $key, $value);
  172. $this->assertEquals($this->msg->getArg($ns, $key), $value);
  173. }
  174. function test_setArgBARE()
  175. {
  176. $this->_test_setArgNS(Auth_OpenID_BARE_NS);
  177. }
  178. function test_setArgNS1()
  179. {
  180. $this->_test_setArgNS(Auth_OpenID_OPENID1_NS);
  181. }
  182. function test_setArgNS2()
  183. {
  184. $this->_test_setArgNS(Auth_OpenID_OPENID2_NS);
  185. }
  186. function test_setArgNS3()
  187. {
  188. $this->_test_setArgNS('urn:nothing-significant');
  189. }
  190. function test_delArg()
  191. {
  192. $result = $this->msg->delArg(Auth_OpenID_OPENID_NS, 'does not');
  193. $this->assertTrue(Auth_OpenID::isFailure($result));
  194. }
  195. function _test_delArgNS($ns)
  196. {
  197. $key = 'Camper van Beethoven';
  198. $this->assertEquals($this->msg->delArg($ns, $key), false);
  199. }
  200. function test_delArgBARE()
  201. {
  202. $this->_test_delArgNS(Auth_OpenID_BARE_NS);
  203. }
  204. function test_delArgNS1()
  205. {
  206. $this->_test_delArgNS(Auth_OpenID_OPENID1_NS);
  207. }
  208. function test_delArgNS2()
  209. {
  210. $this->_test_delArgNS(Auth_OpenID_OPENID2_NS);
  211. }
  212. function test_delArgNS3()
  213. {
  214. $this->_test_delArgNS('urn:nothing-significant');
  215. }
  216. function test_isOpenID1()
  217. {
  218. $this->assertFalse($this->msg->isOpenID1());
  219. }
  220. function test_isOpenID2()
  221. {
  222. $this->assertFalse($this->msg->isOpenID2());
  223. }
  224. function test_args()
  225. {
  226. $this->_argTest(Auth_OpenID_BARE_NS, 'foo');
  227. $this->_argTest(Auth_OpenID_OPENID1_NS, 'foo');
  228. $this->_argTest(Auth_OpenID_OPENID2_NS, 'foo');
  229. $this->_argTest('urn:nothing-significant', 'foo');
  230. }
  231. }
  232. class Tests_Auth_OpenID_OpenID1Message extends MessageTest {
  233. function setUp()
  234. {
  235. $this->msg = Auth_OpenID_Message::fromPostArgs(array('openid.mode' => 'error',
  236. 'openid.error' => 'unit test'));
  237. }
  238. function test_toPostArgs()
  239. {
  240. $this->assertEquals($this->msg->toPostArgs(),
  241. array('openid.mode' => 'error',
  242. 'openid.error' => 'unit test'));
  243. }
  244. function test_toArgs()
  245. {
  246. $this->assertEquals($this->msg->toArgs(),
  247. array('mode' => 'error',
  248. 'error' => 'unit test'));
  249. }
  250. function test_toKVForm()
  251. {
  252. $this->assertEquals($this->msg->toKVForm(),
  253. "error:unit test\nmode:error\n");
  254. }
  255. function test_toURLEncoded()
  256. {
  257. $this->assertEquals($this->msg->toURLEncoded(),
  258. 'openid.error=unit+test&openid.mode=error');
  259. }
  260. function test_toURL()
  261. {
  262. $base_url = 'http://base.url/';
  263. $actual = $this->msg->toURL($base_url);
  264. $actual_base = substr($actual, 0, strlen($base_url));
  265. $this->assertEquals($actual_base, $base_url);
  266. $this->assertEquals($actual[strlen($base_url)], '?');
  267. $query = substr($actual, strlen($base_url) + 1);
  268. $parsed = Auth_OpenID::parse_str($query);
  269. $this->assertEquals($parsed, array('openid.mode' => 'error',
  270. 'openid.error' => 'unit test'));
  271. }
  272. function test_getOpenID()
  273. {
  274. $this->assertEquals($this->msg->getOpenIDNamespace(),
  275. Auth_OpenID_OPENID1_NS);
  276. $this->assertTrue($this->msg->namespaces->isImplicit(Auth_OpenID_OPENID1_NS));
  277. }
  278. function test_getKeyOpenID()
  279. {
  280. $this->assertEquals($this->msg->getKey(Auth_OpenID_OPENID_NS, 'mode'),
  281. 'openid.mode');
  282. }
  283. function test_getKeyBARE()
  284. {
  285. $this->assertEquals($this->msg->getKey(Auth_OpenID_BARE_NS, 'mode'), 'mode');
  286. }
  287. function test_getKeyNS1()
  288. {
  289. $this->assertEquals(
  290. $this->msg->getKey(Auth_OpenID_OPENID1_NS, 'mode'), 'openid.mode');
  291. }
  292. function test_getKeyNS2()
  293. {
  294. $this->assertEquals($this->msg->getKey(Auth_OpenID_OPENID2_NS, 'mode'), null);
  295. }
  296. function test_getKeyNS3()
  297. {
  298. $this->assertEquals(
  299. $this->msg->getKey('urn:nothing-significant', 'mode'), null);
  300. }
  301. function test_hasKey()
  302. {
  303. $this->assertEquals($this->msg->hasKey(Auth_OpenID_OPENID_NS, 'mode'), true);
  304. }
  305. function test_hasKeyBARE()
  306. {
  307. $this->assertEquals($this->msg->hasKey(Auth_OpenID_BARE_NS, 'mode'), false);
  308. }
  309. function test_hasKeyNS1()
  310. {
  311. $this->assertEquals($this->msg->hasKey(Auth_OpenID_OPENID1_NS, 'mode'), true);
  312. }
  313. function test_hasKeyNS2()
  314. {
  315. $this->assertEquals(
  316. $this->msg->hasKey(Auth_OpenID_OPENID2_NS, 'mode'), false);
  317. }
  318. function test_hasKeyNS3()
  319. {
  320. $this->assertEquals(
  321. $this->msg->hasKey('urn:nothing-significant', 'mode'), false);
  322. }
  323. function test_getArgs()
  324. {
  325. $this->assertEquals($this->msg->getArgs(Auth_OpenID_OPENID_NS),
  326. array('mode' => 'error',
  327. 'error' => 'unit test'));
  328. }
  329. function test_getArgsBARE()
  330. {
  331. $this->assertEquals($this->msg->getArgs(Auth_OpenID_BARE_NS), array());
  332. }
  333. function test_getArgsNS1()
  334. {
  335. $this->assertEquals($this->msg->getArgs(Auth_OpenID_OPENID1_NS),
  336. array('mode' => 'error',
  337. 'error' => 'unit test'));
  338. }
  339. function test_getArgsNS2()
  340. {
  341. $this->assertEquals($this->msg->getArgs(Auth_OpenID_OPENID2_NS), array());
  342. }
  343. function test_getArgsNS3()
  344. {
  345. $this->assertEquals($this->msg->getArgs('urn:nothing-significant'), array());
  346. }
  347. function _test_updateArgsNS($ns, $before=null)
  348. {
  349. if ($before === null) {
  350. $before = array();
  351. }
  352. $update_args = array(
  353. 'Camper van Beethoven' => 'David Lowery',
  354. 'Magnolia Electric Co.' => 'Jason Molina');
  355. $this->assertEquals($this->msg->getArgs($ns), $before);
  356. $this->msg->updateArgs($ns, $update_args);
  357. $after = $before;
  358. $after = array_merge($after, $update_args);
  359. $this->assertEquals($this->msg->getArgs($ns), $after);
  360. }
  361. function test_updateArgs()
  362. {
  363. $this->_test_updateArgsNS(Auth_OpenID_OPENID_NS,
  364. array('mode' => 'error', 'error' => 'unit test'));
  365. }
  366. function test_updateArgsBARE()
  367. {
  368. $this->_test_updateArgsNS(Auth_OpenID_BARE_NS);
  369. }
  370. function test_updateArgsNS1()
  371. {
  372. $this->_test_updateArgsNS(Auth_OpenID_OPENID1_NS,
  373. array('mode' => 'error', 'error' => 'unit test'));
  374. }
  375. function test_updateArgsNS2()
  376. {
  377. $this->_test_updateArgsNS(Auth_OpenID_OPENID2_NS);
  378. }
  379. function test_updateArgsNS3()
  380. {
  381. $this->_test_updateArgsNS('urn:nothing-significant');
  382. }
  383. function _test_setArgNS($ns)
  384. {
  385. $key = 'Camper van Beethoven';
  386. $value = 'David Lowery';
  387. $this->assertEquals($this->msg->getArg($ns, $key), null);
  388. $this->msg->setArg($ns, $key, $value);
  389. $this->assertEquals($this->msg->getArg($ns, $key), $value);
  390. }
  391. function test_setArg()
  392. {
  393. $this->_test_setArgNS(Auth_OpenID_OPENID_NS);
  394. }
  395. function test_setArgBARE()
  396. {
  397. $this->_test_setArgNS(Auth_OpenID_BARE_NS);
  398. }
  399. function test_setArgNS1()
  400. {
  401. $this->_test_setArgNS(Auth_OpenID_OPENID1_NS);
  402. }
  403. function test_setArgNS2()
  404. {
  405. $this->_test_setArgNS(Auth_OpenID_OPENID2_NS);
  406. }
  407. function test_setArgNS3()
  408. {
  409. $this->_test_setArgNS('urn:nothing-significant');
  410. }
  411. function _test_delArgNS($ns)
  412. {
  413. $key = 'Camper van Beethoven';
  414. $value = 'David Lowery';
  415. $this->assertEquals($this->msg->delArg($ns, $key), false);
  416. $this->msg->setArg($ns, $key, $value);
  417. $this->assertEquals($this->msg->getArg($ns, $key), $value);
  418. $this->msg->delArg($ns, $key);
  419. $this->assertEquals($this->msg->getArg($ns, $key), null);
  420. }
  421. function test_delArg()
  422. {
  423. $this->_test_delArgNS(Auth_OpenID_OPENID_NS);
  424. }
  425. function test_delArgBARE()
  426. {
  427. $this->_test_delArgNS(Auth_OpenID_BARE_NS);
  428. }
  429. function test_delArgNS1()
  430. {
  431. $this->_test_delArgNS(Auth_OpenID_OPENID1_NS);
  432. }
  433. function test_delArgNS2()
  434. {
  435. $this->_test_delArgNS(Auth_OpenID_OPENID2_NS);
  436. }
  437. function test_delArgNS3()
  438. {
  439. $this->_test_delArgNS('urn:nothing-significant');
  440. }
  441. function test_isOpenID1()
  442. {
  443. $this->assertTrue($this->msg->isOpenID1());
  444. }
  445. function test_isOpenID2()
  446. {
  447. $this->assertFalse($this->msg->isOpenID2());
  448. }
  449. function test_args()
  450. {
  451. $this->_argTest(Auth_OpenID_BARE_NS, 'mode');
  452. $this->_argTest(Auth_OpenID_OPENID_NS, 'mode', 'error');
  453. $this->_argTest(Auth_OpenID_OPENID1_NS, 'mode', 'error');
  454. $this->_argTest(Auth_OpenID_OPENID2_NS, 'mode');
  455. $this->_argTest('urn:nothing-significant', 'mode');
  456. }
  457. }
  458. class Tests_Auth_OpenID_OpenID1ExplicitMessage extends PHPUnit_TestCase {
  459. function setUp()
  460. {
  461. $this->msg = Auth_OpenID_Message::fromPostArgs(array('openid.mode' => 'error',
  462. 'openid.error' => 'unit test',
  463. 'openid.ns' => Auth_OpenID_OPENID1_NS));
  464. }
  465. function test_isOpenID1()
  466. {
  467. $this->assertTrue($this->msg->isOpenID1());
  468. $this->assertFalse(
  469. $this->msg->namespaces->isImplicit(Auth_OpenID_OPENID1_NS));
  470. }
  471. function test_isOpenID2()
  472. {
  473. $this->assertFalse($this->msg->isOpenID2());
  474. }
  475. function test_toPostArgs()
  476. {
  477. $this->assertEquals($this->msg->toPostArgs(),
  478. array('openid.mode' => 'error',
  479. 'openid.error' => 'unit test',
  480. 'openid.ns' => Auth_OpenID_OPENID1_NS));
  481. }
  482. function test_toArgs()
  483. {
  484. $this->assertEquals($this->msg->toArgs(),
  485. array('mode' => 'error',
  486. 'error' => 'unit test',
  487. 'ns' => Auth_OpenID_OPENID1_NS));
  488. }
  489. function test_toKVForm()
  490. {
  491. $this->assertEquals($this->msg->toKVForm(),
  492. "error:unit test\nmode:error\nns:".
  493. Auth_OpenID_OPENID1_NS."\n");
  494. }
  495. function test_toURLEncoded()
  496. {
  497. $this->assertEquals($this->msg->toURLEncoded(),
  498. 'openid.error=unit+test&openid.mode=error&openid.ns=http%3A%2F%2Fopenid.net%2Fsignon%2F1.0');
  499. }
  500. function test_toURL()
  501. {
  502. $base_url = 'http://base.url/';
  503. $actual = $this->msg->toURL($base_url);
  504. $actual_base = substr($actual, 0, strlen($base_url));
  505. $this->assertEquals($actual_base, $base_url);
  506. $this->assertEquals($actual[strlen($base_url)], '?');
  507. $query = substr($actual, strlen($base_url) + 1);
  508. $parsed = Auth_OpenID::parse_str($query);
  509. $this->assertEquals($parsed, array('openid.mode' => 'error',
  510. 'openid.error' => 'unit test',
  511. 'openid.ns' => Auth_OpenID_OPENID1_NS));
  512. }
  513. }
  514. class Tests_Auth_OpenID_OpenID2Message extends MessageTest {
  515. function setUp()
  516. {
  517. $this->msg = Auth_OpenID_Message::fromPostArgs(array('openid.mode' => 'error',
  518. 'openid.error' => 'unit test',
  519. 'openid.ns' => Auth_OpenID_OPENID2_NS));
  520. $this->msg->setArg(Auth_OpenID_BARE_NS, "xey", "value");
  521. }
  522. function test_toPostArgs()
  523. {
  524. $this->assertEquals($this->msg->toPostArgs(),
  525. array('openid.mode' => 'error',
  526. 'openid.error' => 'unit test',
  527. 'openid.ns' => Auth_OpenID_OPENID2_NS,
  528. 'xey' => 'value'));
  529. }
  530. function test_toArgs()
  531. {
  532. // This method can't tolerate BARE_NS.
  533. $this->msg->delArg(Auth_OpenID_BARE_NS, "xey");
  534. $this->assertEquals($this->msg->toArgs(),
  535. array('mode' => 'error',
  536. 'error' => 'unit test',
  537. 'ns' => Auth_OpenID_OPENID2_NS));
  538. }
  539. function test_toKVForm()
  540. {
  541. // Can't tolerate BARE_NS in kvform
  542. $this->msg->delArg(Auth_OpenID_BARE_NS, "xey");
  543. $this->assertEquals($this->msg->toKVForm(),
  544. sprintf("error:unit test\nmode:error\nns:%s\n",
  545. Auth_OpenID_OPENID2_NS));
  546. }
  547. function _test_urlencoded($s)
  548. {
  549. $expected = 'openid.error=unit+test&openid.mode=error&' .
  550. 'openid.ns=%s&xey=value';
  551. $expected = sprintf($expected, urlencode(Auth_OpenID_OPENID2_NS));
  552. $this->assertEquals($s, $expected);
  553. }
  554. function test_toURLEncoded()
  555. {
  556. $this->_test_urlencoded($this->msg->toURLEncoded());
  557. }
  558. function test_toURL()
  559. {
  560. $base_url = 'http://base.url/';
  561. $actual = $this->msg->toURL($base_url);
  562. $actual_base = substr($actual, 0, strlen($base_url));
  563. $this->assertEquals($actual_base, $base_url);
  564. $this->assertEquals($actual[strlen($base_url)], '?');
  565. $query = substr($actual, strlen($base_url) + 1);
  566. $this->_test_urlencoded($query);
  567. }
  568. function test_getOpenID()
  569. {
  570. $this->assertEquals($this->msg->getOpenIDNamespace(),
  571. Auth_OpenID_OPENID2_NS);
  572. }
  573. function test_getKeyOpenID()
  574. {
  575. $this->assertEquals($this->msg->getKey(Auth_OpenID_OPENID_NS, 'mode'),
  576. 'openid.mode');
  577. }
  578. function test_getKeyBARE()
  579. {
  580. $this->assertEquals($this->msg->getKey(Auth_OpenID_BARE_NS, 'mode'), 'mode');
  581. }
  582. function test_getKeyNS1()
  583. {
  584. $this->assertEquals(
  585. $this->msg->getKey(Auth_OpenID_OPENID1_NS, 'mode'), null);
  586. }
  587. function test_getKeyNS2()
  588. {
  589. $this->assertEquals(
  590. $this->msg->getKey(Auth_OpenID_OPENID2_NS, 'mode'), 'openid.mode');
  591. }
  592. function test_getKeyNS3()
  593. {
  594. $this->assertEquals(
  595. $this->msg->getKey('urn:nothing-significant', 'mode'), null);
  596. }
  597. function test_hasKeyOpenID()
  598. {
  599. $this->assertEquals($this->msg->hasKey(Auth_OpenID_OPENID_NS, 'mode'), true);
  600. }
  601. function test_hasKeyBARE()
  602. {
  603. $this->assertEquals($this->msg->hasKey(Auth_OpenID_BARE_NS, 'mode'), false);
  604. }
  605. function test_hasKeyNS1()
  606. {
  607. $this->assertEquals(
  608. $this->msg->hasKey(Auth_OpenID_OPENID1_NS, 'mode'), false);
  609. }
  610. function test_hasKeyNS2()
  611. {
  612. $this->assertEquals(
  613. $this->msg->hasKey(Auth_OpenID_OPENID2_NS, 'mode'), true);
  614. }
  615. function test_hasKeyNS3()
  616. {
  617. $this->assertEquals(
  618. $this->msg->hasKey('urn:nothing-significant', 'mode'), false);
  619. }
  620. function test_getArgsOpenID()
  621. {
  622. $this->assertEquals($this->msg->getArgs(Auth_OpenID_OPENID_NS),
  623. array('mode' => 'error',
  624. 'error' => 'unit test'));
  625. }
  626. function test_getArgsBARE()
  627. {
  628. $this->assertEquals($this->msg->getArgs(Auth_OpenID_BARE_NS),
  629. array('xey' => 'value'));
  630. }
  631. function test_getArgsNS1()
  632. {
  633. $this->assertEquals($this->msg->getArgs(Auth_OpenID_OPENID1_NS), array());
  634. }
  635. function test_getArgsNS2()
  636. {
  637. $this->assertEquals($this->msg->getArgs(Auth_OpenID_OPENID2_NS),
  638. array('mode' => 'error',
  639. 'error' => 'unit test'));
  640. }
  641. function test_getArgsNS3()
  642. {
  643. $this->assertEquals($this->msg->getArgs('urn:nothing-significant'), array());
  644. }
  645. function _test_updateArgsNS($ns, $before=null)
  646. {
  647. if ($before === null) {
  648. $before = array();
  649. }
  650. $update_args = array(
  651. 'Camper van Beethoven' => 'David Lowery',
  652. 'Magnolia Electric Co.' => 'Jason Molina');
  653. $this->assertEquals($this->msg->getArgs($ns), $before);
  654. $this->msg->updateArgs($ns, $update_args);
  655. $after = $before;
  656. $after = array_merge($after, $update_args);
  657. $this->assertEquals($this->msg->getArgs($ns), $after);
  658. }
  659. function test_updateArgsOpenID()
  660. {
  661. $this->_test_updateArgsNS(Auth_OpenID_OPENID_NS,
  662. array('mode' => 'error', 'error' => 'unit test'));
  663. }
  664. function test_updateArgsBARE()
  665. {
  666. $this->_test_updateArgsNS(Auth_OpenID_BARE_NS,
  667. array('xey' => 'value'));
  668. }
  669. function test_updateArgsNS1()
  670. {
  671. $this->_test_updateArgsNS(Auth_OpenID_OPENID1_NS);
  672. }
  673. function test_updateArgsNS2()
  674. {
  675. $this->_test_updateArgsNS(Auth_OpenID_OPENID2_NS,
  676. array('mode' => 'error', 'error' => 'unit test'));
  677. }
  678. function test_updateArgsNS3()
  679. {
  680. $this->_test_updateArgsNS('urn:nothing-significant');
  681. }
  682. function _test_setArgNS($ns)
  683. {
  684. $key = 'Camper van Beethoven';
  685. $value = 'David Lowery';
  686. $this->assertEquals($this->msg->getArg($ns, $key), null);
  687. $this->msg->setArg($ns, $key, $value);
  688. $this->assertEquals($this->msg->getArg($ns, $key), $value);
  689. }
  690. function test_setArgOpenID()
  691. {
  692. $this->_test_setArgNS(Auth_OpenID_OPENID_NS);
  693. }
  694. function test_setArgBARE()
  695. {
  696. $this->_test_setArgNS(Auth_OpenID_BARE_NS);
  697. }
  698. function test_setArgNS1()
  699. {
  700. $this->_test_setArgNS(Auth_OpenID_OPENID1_NS);
  701. }
  702. function test_setArgNS2()
  703. {
  704. $this->_test_setArgNS(Auth_OpenID_OPENID2_NS);
  705. }
  706. function test_setArgNS3()
  707. {
  708. $this->_test_setArgNS('urn:nothing-significant');
  709. }
  710. function test_badAlias()
  711. {
  712. // Make sure dotted aliases and OpenID protocol fields are not
  713. // allowed as namespace aliases.
  714. global $Auth_OpenID_OPENID_PROTOCOL_FIELDS;
  715. $all = array_merge($Auth_OpenID_OPENID_PROTOCOL_FIELDS, array('dotted.alias'));
  716. foreach ($all as $f) {
  717. $args = array(sprintf('openid.ns.%s', $f) => 'blah',
  718. sprintf('openid.%s.foo', $f) => 'test');
  719. // .fromPostArgs covers .fromPostArgs, .fromOpenIDArgs,
  720. // ._fromOpenIDArgs, and .fromOpenIDArgs (since it calls
  721. // .fromPostArgs). Python code raises AssertionError, but
  722. // we usually return null for bad things in PHP.
  723. $this->assertEquals($this->msg->fromPostArgs($args), null);
  724. }
  725. }
  726. function _test_delArgNS($ns)
  727. {
  728. $key = 'Camper van Beethoven';
  729. $value = 'David Lowery';
  730. $this->assertEquals($this->msg->delArg($ns, $key), false);
  731. $this->msg->setArg($ns, $key, $value);
  732. $this->assertEquals($this->msg->getArg($ns, $key), $value);
  733. $this->msg->delArg($ns, $key);
  734. $this->assertEquals($this->msg->getArg($ns, $key), null);
  735. }
  736. function test_delArgOpenID()
  737. {
  738. $this->_test_delArgNS(Auth_OpenID_OPENID_NS);
  739. }
  740. function test_delArgBARE()
  741. {
  742. $this->_test_delArgNS(Auth_OpenID_BARE_NS);
  743. }
  744. function test_delArgNS1()
  745. {
  746. $this->_test_delArgNS(Auth_OpenID_OPENID1_NS);
  747. }
  748. function test_delArgNS2()
  749. {
  750. $this->_test_delArgNS(Auth_OpenID_OPENID2_NS);
  751. }
  752. function test_delArgNS3()
  753. {
  754. $this->_test_delArgNS('urn:nothing-significant');
  755. }
  756. function test_overwriteExtensionArg()
  757. {
  758. $ns = 'urn:unittest_extension';
  759. $key = 'mykey';
  760. $value_1 = 'value_1';
  761. $value_2 = 'value_2';
  762. $this->msg->setArg($ns, $key, $value_1);
  763. $this->assertTrue($this->msg->getArg($ns, $key) == $value_1);
  764. $this->msg->setArg($ns, $key, $value_2);
  765. $this->assertTrue($this->msg->getArg($ns, $key) == $value_2);
  766. }
  767. function test_argList()
  768. {
  769. $this->assertEquals($this->msg->fromPostArgs(array('arg' => array(1, 2, 3))),
  770. null);
  771. }
  772. function test_isOpenID1()
  773. {
  774. $this->assertFalse($this->msg->isOpenID1());
  775. }
  776. function test_isOpenID2()
  777. {
  778. $this->assertTrue($this->msg->isOpenID2());
  779. }
  780. function test_args()
  781. {
  782. $this->_argTest(Auth_OpenID_BARE_NS, 'mode');
  783. $this->_argTest(Auth_OpenID_OPENID_NS, 'mode', 'error');
  784. $this->_argTest(Auth_OpenID_OPENID1_NS, 'mode');
  785. $this->_argTest(Auth_OpenID_OPENID2_NS, 'mode', 'error');
  786. $this->_argTest('urn:nothing-significant', 'mode');
  787. }
  788. }
  789. class Tests_Auth_OpenID_GeneralMessageTest extends PHPUnit_TestCase {
  790. function setUp()
  791. {
  792. $this->postargs = array(
  793. 'openid.ns' => Auth_OpenID_OPENID2_NS,
  794. 'openid.mode' => 'checkid_setup',
  795. 'openid.identity' => 'http://bogus.example.invalid:port/',
  796. 'openid.assoc_handle' => 'FLUB',
  797. 'openid.return_to' => 'Neverland');
  798. $this->action_url = 'scheme://host:port/path?query';
  799. $this->form_tag_attrs = array(
  800. 'company' => 'janrain',
  801. 'class' => 'fancyCSS');
  802. $this->submit_text = 'GO!';
  803. // Expected data regardless of input
  804. $this->required_form_attrs = array(
  805. 'accept-charset' => 'UTF-8',
  806. 'enctype' => 'application/x-www-form-urlencoded',
  807. 'method' => 'post');
  808. }
  809. function _checkForm($html, $message_, $action_url,
  810. $form_tag_attrs, $submit_text)
  811. {
  812. $parser =& Auth_Yadis_getXMLParser();
  813. // Parse HTML source
  814. $this->assertTrue($parser->init($html, array()));
  815. // Get root element
  816. $form = $parser->evalXPath('/form[1]');
  817. $this->assertTrue(count($form) == 1);
  818. $form = $form[0];
  819. // Check required form attributes
  820. $form_attrs = $parser->attributes($form);
  821. foreach ($this->required_form_attrs as $k => $v) {
  822. $this->assertTrue($form_attrs[$k] == $v);
  823. }
  824. // Check extra form attributes
  825. foreach ($form_tag_attrs as $k => $v) {
  826. // Skip attributes that already passed the required
  827. // attribute check, since they should be ignored by the
  828. // form generation code.
  829. if (in_array($k, array_keys($this->required_form_attrs))) {
  830. continue;
  831. }
  832. $this->assertTrue($form_attrs[$k] == $v,
  833. "Form attr $k is ".$form_attrs[$k]." (expected $v)");
  834. }
  835. // Check hidden fields against post args
  836. $hiddens = array();
  837. $input_elements = $parser->evalXPath('input', $form);
  838. foreach ($input_elements as $e) {
  839. $attrs = $parser->attributes($e);
  840. if (strtoupper($attrs['type']) == 'HIDDEN') {
  841. $hiddens[] = $e;
  842. }
  843. }
  844. // For each post arg, make sure there is a hidden with that
  845. // value. Make sure there are no other hiddens.
  846. $postargs = $message_->toPostArgs();
  847. foreach ($postargs as $name => $value) {
  848. $found = false;
  849. foreach ($hiddens as $e) {
  850. $attrs = $parser->attributes($e);
  851. if ($attrs['name'] == $name) {
  852. $this->assertTrue($attrs['value'] == $value);
  853. $found = true;
  854. break;
  855. }
  856. }
  857. if (!$found) {
  858. $this->fail("Post arg $name not found in form");
  859. }
  860. }
  861. $keys = array_keys($postargs);
  862. foreach ($hiddens as $e) {
  863. $attrs = $parser->attributes($e);
  864. $this->assertTrue(in_array($attrs['name'], $keys));
  865. }
  866. // Check action URL
  867. $this->assertTrue($form_attrs['action'] == $action_url);
  868. // Check submit text
  869. $submits = array();
  870. foreach ($input_elements as $e) {
  871. $attrs = $parser->attributes($e);
  872. if (strtoupper($attrs['type']) == 'SUBMIT') {
  873. $submits[] = $e;
  874. }
  875. }
  876. $this->assertTrue(count($submits) == 1);
  877. $attrs = $parser->attributes($submits[0]);
  878. $this->assertTrue($attrs['value'] == $submit_text);
  879. }
  880. function test_toFormMarkup()
  881. {
  882. $m = Auth_OpenID_Message::fromPostArgs($this->postargs);
  883. $html = $m->toFormMarkup($this->action_url, $this->form_tag_attrs,
  884. $this->submit_text);
  885. $this->_checkForm($html, $m, $this->action_url,
  886. $this->form_tag_attrs, $this->submit_text);
  887. }
  888. function test_overrideMethod()
  889. {
  890. // Be sure that caller cannot change form method to GET.
  891. $m = Auth_OpenID_Message::fromPostArgs($this->postargs);
  892. $tag_attrs = $this->form_tag_attrs;
  893. $tag_attrs['method'] = 'GET';
  894. $html = $m->toFormMarkup($this->action_url, $this->form_tag_attrs,
  895. $this->submit_text);
  896. $this->_checkForm($html, $m, $this->action_url,
  897. $this->form_tag_attrs, $this->submit_text);
  898. }
  899. function test_overrideRequired()
  900. {
  901. // Be sure that caller CANNOT change the form charset for
  902. // encoding type.
  903. $m = Auth_OpenID_Message::fromPostArgs($this->postargs);
  904. $tag_attrs = $this->form_tag_attrs;
  905. $tag_attrs['accept-charset'] = 'UCS4';
  906. $tag_attrs['enctype'] = 'invalid/x-broken';
  907. $html = $m->toFormMarkup($this->action_url, $tag_attrs,
  908. $this->submit_text);
  909. $this->_checkForm($html, $m, $this->action_url,
  910. $tag_attrs, $this->submit_text);
  911. }
  912. function test_setOpenIDNamespace_invalid()
  913. {
  914. $m = new Auth_OpenID_Message();
  915. $invalid_things = array(
  916. // Empty string is not okay here.
  917. '',
  918. // Good guess! But wrong.
  919. 'http://openid.net/signon/2.0',
  920. // What?
  921. 'http://specs%\\\r2Eopenid.net/auth/2.0',
  922. // Too much escapings!
  923. 'http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0',
  924. // This is a Type URI, not a openid.ns value.
  925. 'http://specs.openid.net/auth/2.0/signon',
  926. );
  927. foreach ($invalid_things as $x) {
  928. $this->assertTrue($m->setOpenIDNamespace($x, true) === false);
  929. }
  930. }
  931. function test_isOpenID1()
  932. {
  933. $v1_namespaces = array(
  934. // Yes, there are two of them.
  935. 'http://openid.net/signon/1.1',
  936. 'http://openid.net/signon/1.0',
  937. );
  938. foreach ($v1_namespaces as $ns) {
  939. $m = new Auth_OpenID_Message($ns);
  940. $this->assertTrue($m->isOpenID1(),
  941. "$ns not recognized as OpenID 1");
  942. $this->assertEquals($ns, $m->getOpenIDNamespace());
  943. $this->assertTrue($m->namespaces->isImplicit($ns));
  944. }
  945. }
  946. function test_isOpenID2()
  947. {
  948. $ns = 'http://specs.openid.net/auth/2.0';
  949. $m = new Auth_OpenID_Message($ns);
  950. $this->assertTrue($m->isOpenID2());
  951. $this->assertFalse(
  952. $m->namespaces->isImplicit(Auth_OpenID_NULL_NAMESPACE));
  953. $this->assertEquals($ns, $m->getOpenIDNamespace());
  954. }
  955. function test_setOpenIDNamespace_explicit()
  956. {
  957. $m = new Auth_OpenID_Message();
  958. $m->setOpenIDNamespace(Auth_OpenID_THE_OTHER_OPENID1_NS, false);
  959. $this->assertFalse($m->namespaces->isImplicit(
  960. Auth_OpenID_THE_OTHER_OPENID1_NS));
  961. }
  962. function test_setOpenIDNamespace_implicit()
  963. {
  964. $m = new Auth_OpenID_Message();
  965. $m->setOpenIDNamespace(Auth_OpenID_THE_OTHER_OPENID1_NS, true);
  966. $this->assertTrue(
  967. $m->namespaces->isImplicit(Auth_OpenID_THE_OTHER_OPENID1_NS));
  968. }
  969. function test_explicitOpenID11NSSerialzation()
  970. {
  971. $m = new Auth_OpenID_Message();
  972. $m->setOpenIDNamespace(Auth_OpenID_THE_OTHER_OPENID1_NS, false);
  973. $post_args = $m->toPostArgs();
  974. $this->assertEquals($post_args,
  975. array('openid.ns' =>
  976. Auth_OpenID_THE_OTHER_OPENID1_NS));
  977. }
  978. function test_fromPostArgs_ns11()
  979. {
  980. // An example of the stuff that some Drupal installations send us,
  981. // which includes openid.ns but is 1.1.
  982. $query = array(
  983. 'openid.assoc_handle' => '',
  984. 'openid.claimed_id' => 'http://foobar.invalid/',
  985. 'openid.identity' => 'http://foobar.myopenid.com',
  986. 'openid.mode' => 'checkid_setup',
  987. 'openid.ns' => 'http://openid.net/signon/1.1',
  988. 'openid.ns.sreg' => 'http://openid.net/extensions/sreg/1.1',
  989. 'openid.return_to' => 'http://drupal.invalid/return_to',
  990. 'openid.sreg.required' => 'nickname,email',
  991. 'openid.trust_root' => 'http://drupal.invalid',
  992. );
  993. $m = Auth_OpenID_Message::fromPostArgs($query);
  994. $this->assertTrue($m->isOpenID1());
  995. }
  996. }
  997. class Tests_Auth_OpenID_NamespaceMap extends PHPUnit_TestCase {
  998. function test_onealias()
  999. {
  1000. $nsm = new Auth_OpenID_NamespaceMap();
  1001. $uri = 'http://example.com/foo';
  1002. $alias = "foo";
  1003. $nsm->addAlias($uri, $alias);
  1004. $this->assertTrue($nsm->getNamespaceURI($alias) == $uri);
  1005. $this->assertTrue($nsm->getAlias($uri) == $alias);
  1006. }
  1007. function test_iteration()
  1008. {
  1009. $nsm = new Auth_OpenID_NamespaceMap();
  1010. $uripat = 'http://example.com/foo%d';
  1011. $nsm->add(sprintf($uripat, 0));
  1012. for ($n = 1; $n < 23; $n++) {
  1013. $this->assertTrue($nsm->contains(sprintf($uripat, $n - 1)));
  1014. $this->assertTrue($nsm->isDefined(sprintf($uripat, $n - 1)));
  1015. $nsm->add(sprintf($uripat, $n));
  1016. }
  1017. foreach ($nsm->iteritems() as $pair) {
  1018. list($uri, $alias) = $pair;
  1019. $this->assertTrue('ext'.substr($uri, 22) == $alias);
  1020. }
  1021. $it = $nsm->iterAliases();
  1022. $this->assertTrue(count($it) == 23);
  1023. $it = $nsm->iterNamespaceURIs();
  1024. $this->assertTrue(count($it) == 23);
  1025. }
  1026. }
  1027. class Tests_Auth_OpenID_Message extends PHPUnit_TestCase {
  1028. }
  1029. global $Tests_Auth_OpenID_Message_other;
  1030. $Tests_Auth_OpenID_Message_other = array(
  1031. new Tests_Auth_OpenID_EmptyMessage(),
  1032. new Tests_Auth_OpenID_OpenID1Message(),
  1033. new Tests_Auth_OpenID_OpenID2Message(),
  1034. new Tests_Auth_OpenID_NamespaceMap(),
  1035. new Tests_Auth_OpenID_OpenID1ExplicitMessage(),
  1036. new Tests_Auth_OpenID_GeneralMessageTest()
  1037. );
  1038. ?>