ProviderTest.php 76 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_OpenId
  17. * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
  18. * @license http://framework.zend.com/license/new-bsd New BSD License
  19. * @version $Id$
  20. */
  21. /**
  22. * Zend_OpenId
  23. */
  24. require_once 'Zend/OpenId/Provider.php';
  25. /**
  26. * PHPUnit test case
  27. */
  28. require_once 'PHPUnit/Framework.php';
  29. /**
  30. * Zend_OpenId_ResponseHelper
  31. */
  32. require_once 'Zend/OpenId/ResponseHelper.php';
  33. /**
  34. * @package Zend_OpenId
  35. * @subpackage UnitTests
  36. */
  37. class Zend_OpenId_ProviderTest extends PHPUnit_Framework_TestCase
  38. {
  39. const USER = "http://test_user.myopenid.com/";
  40. const PASSWORD = "01234567890abcdef";
  41. const HANDLE = "01234567890abcdef";
  42. private $_user;
  43. public function __construct($name = NULL, array $data = array(), $dataName = '')
  44. {
  45. parent::__construct($name, $data, $dataName);
  46. $this->_user = new Zend_OpenId_Provider_User_Session();
  47. }
  48. /**
  49. * testing register
  50. *
  51. */
  52. public function testRegister()
  53. {
  54. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  55. $storage->delUser(self::USER);
  56. $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage);
  57. $this->assertFalse( $storage->checkUser(self::USER, self::PASSWORD) );
  58. // wrong ID
  59. $this->assertFalse( $provider->register("", self::PASSWORD) );
  60. // registration of new user
  61. $this->assertTrue( $provider->register(self::USER, self::PASSWORD) );
  62. // registration of existent user
  63. $this->assertFalse( $provider->register(self::USER, self::PASSWORD) );
  64. $this->assertTrue( $storage->checkUser(self::USER, md5(self::USER . self::PASSWORD)) );
  65. $storage->delUser(self::USER);
  66. }
  67. /**
  68. * testing hasUser
  69. *
  70. */
  71. public function testHasUser()
  72. {
  73. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  74. $storage->delUser(self::USER);
  75. $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage);
  76. // wrong ID
  77. $this->assertFalse( $provider->hasUser("") );
  78. $this->assertFalse( $provider->hasUser("http://:80/test") );
  79. // check for non existent
  80. $this->assertFalse( $provider->hasUser(self::USER) );
  81. // check for existent user
  82. $this->assertTrue( $storage->addUser(self::USER, self::PASSWORD) );
  83. $this->assertTrue( $provider->hasUser(self::USER) );
  84. $storage->delUser(self::USER);
  85. }
  86. /**
  87. * testing login
  88. *
  89. */
  90. public function testLogin()
  91. {
  92. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  93. $storage->delUser(self::USER);
  94. $this->_user->delLoggedInUser();
  95. $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage);
  96. // wrong ID
  97. $this->assertFalse( $provider->login("", self::PASSWORD) );
  98. $this->assertFalse( $this->_user->getLoggedInUser() );
  99. $this->assertFalse( $provider->login("http://:80/test", self::PASSWORD) );
  100. $this->assertFalse( $this->_user->getLoggedInUser() );
  101. // login as non existent user
  102. $this->assertFalse( $provider->login(self::USER, self::PASSWORD) );
  103. $this->assertFalse( $this->_user->getLoggedInUser() );
  104. // login as existent user with wrong password
  105. $this->assertTrue( $provider->register(self::USER, self::PASSWORD) );
  106. $this->assertFalse( $provider->login(self::USER, self::PASSWORD . "x") );
  107. $this->assertFalse( $this->_user->getLoggedInUser() );
  108. // login as existent user with proper password
  109. $this->assertTrue( $provider->login(self::USER, self::PASSWORD) );
  110. $this->assertSame( self::USER, $this->_user->getLoggedInUser() );
  111. $storage->delUser(self::USER);
  112. $this->_user->delLoggedInUser();
  113. }
  114. /**
  115. * testing logout
  116. *
  117. */
  118. public function testLogout()
  119. {
  120. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  121. $storage->delUser(self::USER);
  122. $this->_user->delLoggedInUser();
  123. $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage);
  124. $this->assertFalse( $this->_user->getLoggedInUser() );
  125. $this->assertTrue( $provider->register(self::USER, self::PASSWORD) );
  126. $this->assertFalse( $this->_user->getLoggedInUser() );
  127. $this->assertTrue( $provider->login(self::USER, self::PASSWORD) );
  128. $this->assertSame( self::USER, $this->_user->getLoggedInUser() );
  129. $this->assertTrue( $provider->logout() );
  130. $this->assertFalse( $this->_user->getLoggedInUser() );
  131. $storage->delUser(self::USER);
  132. $this->_user->delLoggedInUser();
  133. }
  134. /**
  135. * testing logout
  136. *
  137. */
  138. public function testLoggedInUser()
  139. {
  140. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  141. $storage->delUser(self::USER);
  142. $this->_user->delLoggedInUser();
  143. $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage);
  144. $this->assertFalse( $provider->getLoggedInUser() );
  145. $this->assertTrue( $provider->register(self::USER, self::PASSWORD) );
  146. $this->assertFalse( $provider->getLoggedInUser() );
  147. $this->assertTrue( $provider->login(self::USER, self::PASSWORD) );
  148. $this->assertSame( self::USER, $this->_user->getLoggedInUser() );
  149. $this->assertTrue( $provider->logout() );
  150. $this->assertFalse( $provider->getLoggedInUser() );
  151. $storage->delUser(self::USER);
  152. $this->_user->delLoggedInUser();
  153. }
  154. /**
  155. * testing getSiteRoot
  156. *
  157. */
  158. public function testGetSiteRoot()
  159. {
  160. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  161. $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage);
  162. $params = array(
  163. 'openid_realm' => "http://wrong/",
  164. 'openid_trust_root' => "http://root/",
  165. 'openid_return_to' => "http://wrong/",
  166. );
  167. $this->assertSame( "http://root/", $provider->getSiteRoot($params) );
  168. $params = array(
  169. 'openid_realm' => "http://wrong/",
  170. 'openid_return_to' => "http://root/",
  171. );
  172. $this->assertSame( "http://root/", $provider->getSiteRoot($params) );
  173. $params = array(
  174. 'openid_realm' => "http://wrong/",
  175. );
  176. $this->assertFalse( $provider->getSiteRoot($params) );
  177. $params = array(
  178. 'openid_ns' => Zend_OpenId::NS_2_0,
  179. 'openid_realm' => "http://root/",
  180. 'openid_trust_root' => "http://wrong/",
  181. 'openid_return_to' => "http://wrong/",
  182. );
  183. $this->assertSame( "http://root/", $provider->getSiteRoot($params) );
  184. $params = array(
  185. 'openid_ns' => Zend_OpenId::NS_2_0,
  186. 'openid_trust_root' => "http://wrong/",
  187. 'openid_return_to' => "http://root/",
  188. );
  189. $this->assertSame( "http://root/", $provider->getSiteRoot($params) );
  190. $params = array(
  191. 'openid_ns' => Zend_OpenId::NS_2_0,
  192. 'openid_return_to' => "http://root/",
  193. );
  194. $this->assertSame( "http://root/", $provider->getSiteRoot($params) );
  195. $params = array(
  196. 'openid_ns' => Zend_OpenId::NS_2_0,
  197. );
  198. $this->assertFalse( $provider->getSiteRoot($params) );
  199. $params = array(
  200. 'openid_trust_root' => "",
  201. );
  202. $this->assertFalse( $provider->getSiteRoot($params) );
  203. }
  204. /**
  205. * testing allowSite
  206. *
  207. */
  208. public function testAllowSite()
  209. {
  210. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  211. $storage->delUser(self::USER);
  212. $this->_user->delLoggedInUser();
  213. $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage);
  214. // not logged in
  215. $this->assertFalse( $provider->allowSite("http://www.test.com/") );
  216. // logged in
  217. $this->assertTrue( $provider->register(self::USER, self::PASSWORD) );
  218. $this->assertTrue( $provider->login(self::USER, self::PASSWORD) );
  219. $this->assertTrue( $provider->allowSite("http://www.test.com/") );
  220. $trusted = $storage->getTrustedSites(self::USER);
  221. $this->assertTrue( is_array($trusted) );
  222. $this->assertSame( 1, count($trusted) );
  223. reset($trusted);
  224. $this->assertSame( "http://www.test.com/", key($trusted) );
  225. $this->assertSame( true, current($trusted) );
  226. // duplicate
  227. $this->assertTrue( $provider->allowSite("http://www.test.com/") );
  228. $trusted = $storage->getTrustedSites(self::USER);
  229. $this->assertTrue( is_array($trusted) );
  230. $this->assertSame( 1, count($trusted) );
  231. reset($trusted);
  232. $this->assertSame( "http://www.test.com/", key($trusted) );
  233. $this->assertSame( true, current($trusted) );
  234. // extensions
  235. $sreg = new Zend_OpenId_Extension_Sreg(array("nickname"=>"test_id"));
  236. $this->assertTrue( $provider->allowSite("http://www.test.com/", $sreg) );
  237. $trusted = $storage->getTrustedSites(self::USER);
  238. $this->assertTrue( is_array($trusted) );
  239. $this->assertSame( 1, count($trusted) );
  240. reset($trusted);
  241. $this->assertSame( "http://www.test.com/", key($trusted) );
  242. $this->assertSame( array('Zend_OpenId_Extension_Sreg'=>array('nickname'=>'test_id')), current($trusted) );
  243. $this->_user->delLoggedInUser();
  244. $storage->delUser(self::USER);
  245. }
  246. /**
  247. * testing denySite
  248. *
  249. */
  250. public function testDenySite()
  251. {
  252. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  253. $storage->delUser(self::USER);
  254. $this->_user->delLoggedInUser();
  255. $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage);
  256. $sreg = new Zend_OpenId_Extension_Sreg(array("nickname"=>"test_id"));
  257. // not logged in
  258. $this->assertFalse( $provider->denySite("http://www.test.com/") );
  259. $this->assertTrue( $provider->register(self::USER, self::PASSWORD) );
  260. $this->assertTrue( $provider->login(self::USER, self::PASSWORD) );
  261. $this->assertTrue( $provider->allowSite("http://www.test1.com/") );
  262. $this->assertTrue( $provider->allowSite("http://www.test2.com/", $sreg) );
  263. $this->AssertSame( array(
  264. 'http://www.test1.com/' => true,
  265. 'http://www.test2.com/' => array(
  266. 'Zend_OpenId_Extension_Sreg' => array(
  267. 'nickname' => 'test_id'
  268. )
  269. )
  270. ),
  271. $storage->getTrustedSites(self::USER) );
  272. $this->assertTrue( $provider->denySite("http://www.test3.com/") );
  273. $this->AssertSame( array(
  274. 'http://www.test1.com/' => true,
  275. 'http://www.test2.com/' => array(
  276. 'Zend_OpenId_Extension_Sreg' => array(
  277. 'nickname' => 'test_id'
  278. )
  279. ),
  280. 'http://www.test3.com/' => false
  281. ),
  282. $storage->getTrustedSites(self::USER) );
  283. $this->assertTrue( $provider->denySite("http://www.test1.com/") );
  284. $this->AssertSame( array(
  285. 'http://www.test1.com/' => false,
  286. 'http://www.test2.com/' => array(
  287. 'Zend_OpenId_Extension_Sreg' => array(
  288. 'nickname' => 'test_id'
  289. )
  290. ),
  291. 'http://www.test3.com/' => false
  292. ),
  293. $storage->getTrustedSites(self::USER) );
  294. $this->assertTrue( $provider->denySite("http://www.test2.com/") );
  295. $this->AssertSame( array(
  296. 'http://www.test1.com/' => false,
  297. 'http://www.test2.com/' => false,
  298. 'http://www.test3.com/' => false
  299. ),
  300. $storage->getTrustedSites(self::USER) );
  301. $this->_user->delLoggedInUser();
  302. $storage->delUser(self::USER);
  303. }
  304. /**
  305. * testing delSite
  306. *
  307. */
  308. public function testDelSite()
  309. {
  310. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  311. $storage->delUser(self::USER);
  312. $this->_user->delLoggedInUser();
  313. $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage);
  314. $sreg = new Zend_OpenId_Extension_Sreg(array("nickname"=>"test_id"));
  315. // not logged in
  316. $this->assertFalse( $provider->delSite("http://www.test.com/") );
  317. $this->assertTrue( $provider->register(self::USER, self::PASSWORD) );
  318. $this->assertTrue( $provider->login(self::USER, self::PASSWORD) );
  319. $this->assertTrue( $provider->allowSite("http://www.test1.com/") );
  320. $this->assertTrue( $provider->allowSite("http://www.test2.com/", $sreg) );
  321. $this->AssertSame( array(
  322. 'http://www.test1.com/' => true,
  323. 'http://www.test2.com/' => array(
  324. 'Zend_OpenId_Extension_Sreg' => array(
  325. 'nickname' => 'test_id'
  326. )
  327. )
  328. ),
  329. $storage->getTrustedSites(self::USER) );
  330. $this->assertTrue( $provider->delSite("http://www.test3.com/") );
  331. $this->AssertSame( array(
  332. 'http://www.test1.com/' => true,
  333. 'http://www.test2.com/' => array(
  334. 'Zend_OpenId_Extension_Sreg' => array(
  335. 'nickname' => 'test_id'
  336. )
  337. )
  338. ),
  339. $storage->getTrustedSites(self::USER) );
  340. $this->assertTrue( $provider->delSite("http://www.test1.com/") );
  341. $this->AssertSame( array(
  342. 'http://www.test2.com/' => array(
  343. 'Zend_OpenId_Extension_Sreg' => array(
  344. 'nickname' => 'test_id'
  345. )
  346. )
  347. ),
  348. $storage->getTrustedSites(self::USER) );
  349. $this->assertTrue( $provider->delSite("http://www.test2.com/") );
  350. $this->AssertSame( array(
  351. ),
  352. $storage->getTrustedSites(self::USER) );
  353. $this->_user->delLoggedInUser();
  354. $storage->delUser(self::USER);
  355. }
  356. /**
  357. * testing getTrustedSites
  358. *
  359. */
  360. public function testGetTrustedSites()
  361. {
  362. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  363. $storage->delUser(self::USER);
  364. $this->_user->delLoggedInUser();
  365. $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage);
  366. $sreg = new Zend_OpenId_Extension_Sreg(array("nickname"=>"test_id"));
  367. $this->assertTrue( $provider->register(self::USER, self::PASSWORD) );
  368. $this->assertTrue( $provider->login(self::USER, self::PASSWORD) );
  369. $this->assertTrue( $provider->allowSite("http://www.test1.com/") );
  370. $this->assertTrue( $provider->allowSite("http://www.test2.com/", $sreg) );
  371. $this->AssertSame( array(
  372. 'http://www.test1.com/' => true,
  373. 'http://www.test2.com/' => array(
  374. 'Zend_OpenId_Extension_Sreg' => array(
  375. 'nickname' => 'test_id'
  376. )
  377. )
  378. ),
  379. $provider->getTrustedSites() );
  380. $this->_user->delLoggedInUser();
  381. $this->AssertFalse( $provider->getTrustedSites() );
  382. $storage->delUser(self::USER);
  383. }
  384. /**
  385. * testing genSecret
  386. *
  387. */
  388. public function testGenSecret()
  389. {
  390. $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"));
  391. // SHA1
  392. $x = $provider->genSecret("sha1");
  393. $this->assertTrue( is_string($x) );
  394. $this->assertSame( 20, strlen($x) );
  395. // SHA256
  396. $x = $provider->genSecret("sha256");
  397. $this->assertTrue( is_string($x) );
  398. $this->assertSame( 32, strlen($x) );
  399. // invalid function
  400. $this->assertFalse( $provider->genSecret("md5") );
  401. }
  402. /**
  403. * testing _associate
  404. *
  405. */
  406. public function testAssociate()
  407. {
  408. try {
  409. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  410. $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, $storage);
  411. // Wrong assoc_type
  412. $ret = $provider->handle(array('openid_mode'=>'associate'));
  413. $res = array();
  414. foreach (explode("\n", $ret) as $line) {
  415. if (!empty($line)) {
  416. list($key, $val) = explode(":", $line, 2);
  417. $res[$key] = $val;
  418. }
  419. }
  420. $this->assertSame( 'unsupported-type', $res['error-code'] );
  421. // Wrong assoc_type (OpenID 2.0)
  422. $ret = $provider->handle(array('openid_ns'=>Zend_OpenId::NS_2_0,
  423. 'openid_mode'=>'associate'));
  424. $res = array();
  425. foreach (explode("\n", $ret) as $line) {
  426. if (!empty($line)) {
  427. list($key, $val) = explode(":", $line, 2);
  428. $res[$key] = $val;
  429. }
  430. }
  431. $this->assertSame( Zend_OpenId::NS_2_0, $res['ns'] );
  432. $this->assertSame( 'unsupported-type', $res['error-code'] );
  433. // Wrong session_type
  434. $ret = $provider->handle(array('openid_mode'=>'associate',
  435. 'openid_assoc_type'=>'HMAC-SHA1',
  436. 'openid_session_type'=>'DH-SHA257'));
  437. $res = array();
  438. foreach (explode("\n", $ret) as $line) {
  439. if (!empty($line)) {
  440. list($key, $val) = explode(":", $line, 2);
  441. $res[$key] = $val;
  442. }
  443. }
  444. $this->assertSame( 'unsupported-type', $res['error-code'] );
  445. // Associaation without encryption
  446. $ret = $provider->handle(array('openid_assoc_type'=>'HMAC-SHA1',
  447. 'openid_mode'=>'associate'));
  448. $res = array();
  449. foreach (explode("\n", $ret) as $line) {
  450. if (!empty($line)) {
  451. list($key, $val) = explode(":", $line, 2);
  452. $res[$key] = $val;
  453. }
  454. }
  455. $this->assertSame( 'HMAC-SHA1', $res['assoc_type'] );
  456. $this->assertTrue( isset($res['mac_key']) );
  457. $this->assertSame( 20, strlen(base64_decode($res['mac_key'])) );
  458. $this->assertTrue( isset($res['assoc_handle']) );
  459. $this->assertSame( '3600', $res['expires_in'] );
  460. $this->assertFalse( isset($res['session_type']) );
  461. $this->assertTrue( $storage->getAssociation($res['assoc_handle'], $macFunc, $secret, $expires) );
  462. $this->assertSame( 'sha1', $macFunc );
  463. $this->assertSame( bin2hex(base64_decode($res['mac_key'])), bin2hex($secret) );
  464. // Associaation without encryption (OpenID 2.0)
  465. $ret = $provider->handle(array('openid_ns'=>Zend_OpenId::NS_2_0,
  466. 'openid_assoc_type'=>'HMAC-SHA256',
  467. 'openid_mode'=>'associate'));
  468. $res = array();
  469. foreach (explode("\n", $ret) as $line) {
  470. if (!empty($line)) {
  471. list($key, $val) = explode(":", $line, 2);
  472. $res[$key] = $val;
  473. }
  474. }
  475. $this->assertSame( Zend_OpenId::NS_2_0, $res['ns'] );
  476. $this->assertSame( 'HMAC-SHA256', $res['assoc_type'] );
  477. $this->assertTrue( isset($res['mac_key']) );
  478. $this->assertSame( 32, strlen(base64_decode($res['mac_key'])) );
  479. $this->assertTrue( isset($res['assoc_handle']) );
  480. $this->assertSame( '3600', $res['expires_in'] );
  481. $this->assertFalse( isset($res['session_type']) );
  482. $this->assertTrue( $storage->getAssociation($res['assoc_handle'], $macFunc, $secret, $expires) );
  483. $this->assertSame( 'sha256', $macFunc );
  484. $this->assertSame( bin2hex(base64_decode($res['mac_key'])), bin2hex($secret) );
  485. // Associaation without encryption (OpenID 2.0)
  486. $ret = $provider->handle(array('openid_ns'=>Zend_OpenId::NS_2_0,
  487. 'openid_assoc_type'=>'HMAC-SHA256',
  488. 'openid_mode'=>'associate',
  489. 'openid_session_type'=>'no-encryption'));
  490. $res = array();
  491. foreach (explode("\n", $ret) as $line) {
  492. if (!empty($line)) {
  493. list($key, $val) = explode(":", $line, 2);
  494. $res[$key] = $val;
  495. }
  496. }
  497. $this->assertSame( Zend_OpenId::NS_2_0, $res['ns'] );
  498. $this->assertSame( 'HMAC-SHA256', $res['assoc_type'] );
  499. $this->assertTrue( isset($res['mac_key']) );
  500. $this->assertSame( 32, strlen(base64_decode($res['mac_key'])) );
  501. $this->assertTrue( isset($res['assoc_handle']) );
  502. $this->assertSame( '3600', $res['expires_in'] );
  503. $this->assertSame( 'no-encryption', $res['session_type'] );
  504. $this->assertTrue( $storage->getAssociation($res['assoc_handle'], $macFunc, $secret, $expires) );
  505. $this->assertSame( 'sha256', $macFunc );
  506. $this->assertSame( bin2hex(base64_decode($res['mac_key'])), bin2hex($secret) );
  507. // Associaation with DH-SHA1 encryption
  508. $ret = $provider->handle(array('openid_assoc_type'=>'HMAC-SHA1',
  509. 'openid_mode'=>'associate',
  510. 'openid_session_type'=>'DH-SHA1',
  511. 'openid_dh_modulus'=>'ANz5OguIOXLsDhmYmsWizjEOHTdxfo2Vcbt2I3MYZuYe91ouJ4mLBX+YkcLiemOcPym2CBRYHNOyyjmG0mg3BVd9RcLn5S3IHHoXGHblzqdLFEi/368Ygo79JRnxTkXjgmY0rxlJ5bU1zIKaSDuKdiI+XUkKJX8Fvf8W8vsixYOr',
  512. 'openid_dh_gen'=>'Ag==',
  513. 'openid_dh_consumer_public'=>'RqexRm+Zn5s3sXxFBjI9WfCOBwBDDQBKPzX4fjMGl3YEJh5tx8SVo7awgwuqsliR+nvjmRh5kSFIGv8YSCsy88v1CcAfWUGfjehO9euxQcXOYJnNGbl6GQrE2FYe2RCvML4Yi8eYCYtCQi0wlDE7BJXGSVPXFzj/ru0lR/voPpk=',
  514. ));
  515. $res = array();
  516. foreach (explode("\n", $ret) as $line) {
  517. if (!empty($line)) {
  518. list($key, $val) = explode(":", $line, 2);
  519. $res[$key] = $val;
  520. }
  521. }
  522. $this->assertSame( 'HMAC-SHA1', $res['assoc_type'] );
  523. $this->assertSame( 'DH-SHA1', $res['session_type'] );
  524. $this->assertTrue( isset($res['dh_server_public']) );
  525. $this->assertTrue( isset($res['enc_mac_key']) );
  526. $this->assertSame( 20, strlen(base64_decode($res['enc_mac_key'])) );
  527. $this->assertTrue( isset($res['assoc_handle']) );
  528. $this->assertSame( '3600', $res['expires_in'] );
  529. $this->assertTrue( $storage->getAssociation($res['assoc_handle'], $macFunc, $secret, $expires) );
  530. $this->assertSame( 'sha1', $macFunc );
  531. // Associaation with DH-SHA256 encryption (OpenID 2.0)
  532. $ret = $provider->handle(array('openid_ns'=>Zend_OpenId::NS_2_0,
  533. 'openid_assoc_type'=>'HMAC-SHA256',
  534. 'openid_mode'=>'associate',
  535. 'openid_session_type'=>'DH-SHA256',
  536. 'openid_dh_modulus'=>'ANz5OguIOXLsDhmYmsWizjEOHTdxfo2Vcbt2I3MYZuYe91ouJ4mLBX+YkcLiemOcPym2CBRYHNOyyjmG0mg3BVd9RcLn5S3IHHoXGHblzqdLFEi/368Ygo79JRnxTkXjgmY0rxlJ5bU1zIKaSDuKdiI+XUkKJX8Fvf8W8vsixYOr',
  537. 'openid_dh_gen'=>'Ag==',
  538. 'openid_dh_consumer_public'=>'RqexRm+Zn5s3sXxFBjI9WfCOBwBDDQBKPzX4fjMGl3YEJh5tx8SVo7awgwuqsliR+nvjmRh5kSFIGv8YSCsy88v1CcAfWUGfjehO9euxQcXOYJnNGbl6GQrE2FYe2RCvML4Yi8eYCYtCQi0wlDE7BJXGSVPXFzj/ru0lR/voPpk=',
  539. ));
  540. $res = array();
  541. foreach (explode("\n", $ret) as $line) {
  542. if (!empty($line)) {
  543. list($key, $val) = explode(":", $line, 2);
  544. $res[$key] = $val;
  545. }
  546. }
  547. $this->assertSame( 'HMAC-SHA256', $res['assoc_type'] );
  548. $this->assertSame( 'DH-SHA256', $res['session_type'] );
  549. $this->assertTrue( isset($res['dh_server_public']) );
  550. $this->assertTrue( isset($res['enc_mac_key']) );
  551. $this->assertSame( 32, strlen(base64_decode($res['enc_mac_key'])) );
  552. $this->assertTrue( isset($res['assoc_handle']) );
  553. $this->assertSame( '3600', $res['expires_in'] );
  554. $this->assertTrue( $storage->getAssociation($res['assoc_handle'], $macFunc, $secret, $expires) );
  555. $this->assertSame( 'sha256', $macFunc );
  556. } catch (Zend_OpenId_Exception $e) {
  557. $this->markTestSkipped($e->getMessage());
  558. }
  559. }
  560. /**
  561. * testing _checkAuthentication
  562. *
  563. */
  564. public function testCheckAuthentication()
  565. {
  566. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  567. $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, $storage);
  568. // Wrong arguments
  569. $ret = $provider->handle(array('openid_mode'=>'check_authentication'));
  570. $res = array();
  571. foreach (explode("\n", $ret) as $line) {
  572. if (!empty($line)) {
  573. list($key, $val) = explode(":", $line, 2);
  574. $res[$key] = $val;
  575. }
  576. }
  577. $this->assertSame( 'id_res', $res['openid.mode'] );
  578. $this->assertSame( 'false', $res['is_valid'] );
  579. // Wrong arguments (OpenID 2.0)
  580. $ret = $provider->handle(array('openid_ns'=>Zend_OpenId::NS_2_0,
  581. 'openid_mode'=>'check_authentication'));
  582. $res = array();
  583. foreach (explode("\n", $ret) as $line) {
  584. if (!empty($line)) {
  585. list($key, $val) = explode(":", $line, 2);
  586. $res[$key] = $val;
  587. }
  588. }
  589. $this->assertSame( Zend_OpenId::NS_2_0, $res['ns'] );
  590. $this->assertSame( 'id_res', $res['openid.mode'] );
  591. $this->assertSame( 'false', $res['is_valid'] );
  592. // Wrong session id
  593. $storage->delAssociation(self::HANDLE);
  594. $ret = $provider->handle(array('openid_mode'=>'check_authentication',
  595. 'openid_assoc_handle'=>self::HANDLE));
  596. $res = array();
  597. foreach (explode("\n", $ret) as $line) {
  598. if (!empty($line)) {
  599. list($key, $val) = explode(":", $line, 2);
  600. $res[$key] = $val;
  601. }
  602. }
  603. $this->assertSame( 'id_res', $res['openid.mode'] );
  604. $this->assertSame( 'false', $res['is_valid'] );
  605. // Proper session signed with HAMC-SHA256
  606. $storage->addAssociation(self::HANDLE, "sha1", pack("H*", '0102030405060708091011121314151617181920'), time() + 3660);
  607. $ret = $provider->handle(array('openid_mode'=>'check_authentication',
  608. 'openid_assoc_handle'=>self::HANDLE,
  609. 'openid_signed'=>'mode,assoc_handle,signed',
  610. 'openid_sig'=>'IgLZCOXmEPowYl6yyFZjYL4ZTtQ='));
  611. $res = array();
  612. foreach (explode("\n", $ret) as $line) {
  613. if (!empty($line)) {
  614. list($key, $val) = explode(":", $line, 2);
  615. $res[$key] = $val;
  616. }
  617. }
  618. $this->assertSame( 'id_res', $res['openid.mode'] );
  619. $this->assertSame( 'true', $res['is_valid'] );
  620. // Proper session signed with HAMC-SHA256
  621. $storage->delAssociation(self::HANDLE);
  622. $storage->addAssociation(self::HANDLE, "sha256", pack("H*", '0102030405060708091011121314151617181920212223242526272829303132'), time() + 3660);
  623. $ret = $provider->handle(array('openid_mode'=>'check_authentication',
  624. 'openid_assoc_handle'=>self::HANDLE,
  625. 'openid_signed'=>'mode,assoc_handle,signed',
  626. 'openid_sig'=>'xoJcXj30L1N7QRir7I2ovop1SaijXnAI97X/yH+kvck='));
  627. $res = array();
  628. foreach (explode("\n", $ret) as $line) {
  629. if (!empty($line)) {
  630. list($key, $val) = explode(":", $line, 2);
  631. $res[$key] = $val;
  632. }
  633. }
  634. $this->assertSame( 'id_res', $res['openid.mode'] );
  635. $this->assertSame( 'true', $res['is_valid'] );
  636. // Wrong signature
  637. $storage->delAssociation(self::HANDLE);
  638. $storage->addAssociation(self::HANDLE, "sha256", pack("H*", '0102030405060708091011121314151617181920212223242526272829303132'), time() + 3660);
  639. $ret = $provider->handle(array('openid_ns'=>Zend_OpenId::NS_2_0,
  640. 'openid_mode'=>'check_authentication',
  641. 'openid_assoc_handle'=>self::HANDLE,
  642. 'openid_signed'=>'ns,mode,assoc_handle,signed',
  643. 'openid_sig'=>'xoJcXj30L1N7QRir7I2ovop1SaijXnAI97X/yH+kvck='));
  644. $res = array();
  645. foreach (explode("\n", $ret) as $line) {
  646. if (!empty($line)) {
  647. list($key, $val) = explode(":", $line, 2);
  648. $res[$key] = $val;
  649. }
  650. }
  651. $this->assertSame( 'id_res', $res['openid.mode'] );
  652. $this->assertSame( 'false', $res['is_valid'] );
  653. $storage->delAssociation(self::HANDLE);
  654. }
  655. /**
  656. * testing respondToConsumer
  657. *
  658. */
  659. public function testRespondToConsumer()
  660. {
  661. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  662. $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, $storage);
  663. // dumb mode
  664. $response = new Zend_OpenId_ResponseHelper(true);
  665. $storage->delAssociation(self::HANDLE);
  666. $this->assertTrue( $provider->respondToConsumer(array(
  667. 'openid_assoc_handle' => self::HANDLE,
  668. 'openid_return_to' => 'http://www.test.com/test.php'
  669. ), null, $response) );
  670. $headers = $response->getHeaders();
  671. $this->assertSame( 'Location', $headers[0]['name'] );
  672. $url = parse_url($headers[0]['value']);
  673. $this->assertSame( 'www.test.com', $url['host'] );
  674. $this->assertSame( '/test.php', $url['path'] );
  675. $ret = array();
  676. foreach (explode('&', $url['query']) as $line) {
  677. list($key,$val) = explode('=', $line, 2);
  678. $ret[$key] = urldecode($val);
  679. }
  680. $this->assertSame( 'id_res', $ret['openid.mode'] );
  681. $this->assertSame( 'http://www.test.com/test.php', $ret['openid.return_to'] );
  682. $this->assertTrue( isset($ret['openid.assoc_handle']) );
  683. $this->assertTrue( isset($ret['openid.response_nonce']) );
  684. $this->assertTrue( isset($ret['openid.signed']) );
  685. $this->assertTrue( isset($ret['openid.sig']) );
  686. $this->assertTrue( $storage->getAssociation($ret['openid.assoc_handle'], $macFunc, $secret, $expires) );
  687. $this->assertSame( 'sha1', $macFunc );
  688. // OpenID 2.0 with SHA256
  689. $_SERVER['SCRIPT_URI'] = "http://www.test.com/endpoint.php";
  690. $response = new Zend_OpenId_ResponseHelper(true);
  691. $storage->addAssociation(self::HANDLE, "sha256", pack("H*", '0102030405060708091011121314151617181920212223242526272829303132'), time() + 3660);
  692. $this->assertTrue( $provider->respondToConsumer(array(
  693. 'openid_ns' => Zend_OpenId::NS_2_0,
  694. 'openid_assoc_handle' => self::HANDLE,
  695. 'openid_return_to' => 'http://www.test.com/test.php'
  696. ), null, $response) );
  697. $headers = $response->getHeaders();
  698. $this->assertSame( 'Location', $headers[0]['name'] );
  699. $url = parse_url($headers[0]['value']);
  700. $this->assertSame( 'www.test.com', $url['host'] );
  701. $this->assertSame( '/test.php', $url['path'] );
  702. $ret = array();
  703. foreach (explode('&', $url['query']) as $line) {
  704. list($key,$val) = explode('=', $line, 2);
  705. $ret[$key] = urldecode($val);
  706. }
  707. $this->assertSame( 'id_res', $ret['openid.mode'] );
  708. $this->assertSame( 'http://www.test.com/test.php', $ret['openid.return_to'] );
  709. $this->assertSame( self::HANDLE, $ret['openid.assoc_handle'] );
  710. $this->assertTrue( isset($ret['openid.response_nonce']) );
  711. $this->assertTrue( isset($ret['openid.signed']) );
  712. $this->assertTrue( isset($ret['openid.sig']) );
  713. $this->assertSame( Zend_OpenId::NS_2_0, $ret['openid.ns'] );
  714. $this->assertSame( "http://www.test.com/endpoint.php", $ret['openid.op_endpoint'] );
  715. $this->assertTrue( $storage->getAssociation(self::HANDLE, $macFunc, $secret, $expires) );
  716. $this->assertSame( 'sha256', $macFunc );
  717. $storage->delAssociation(self::HANDLE);
  718. // OpenID 1.1 with SHA1
  719. $storage->addAssociation(self::HANDLE, "sha1", pack("H*", '0102030405060708091011121314151617181920'), time() + 3660);
  720. $response = new Zend_OpenId_ResponseHelper(true);
  721. $ret = $provider->respondToConsumer(array(
  722. 'openid_assoc_handle' => self::HANDLE,
  723. 'openid_return_to' => 'http://www.test.com/test.php',
  724. 'openid_claimed_id' => 'http://claimed_id/',
  725. 'openid_identity' => 'http://identity/',
  726. 'openid_unknown' => 'http://www.test.com/test.php',
  727. ), null, $response);
  728. $headers = $response->getHeaders();
  729. $this->assertSame( 'Location', $headers[0]['name'] );
  730. $url = parse_url($headers[0]['value']);
  731. $this->assertSame( 'www.test.com', $url['host'] );
  732. $this->assertSame( '/test.php', $url['path'] );
  733. $ret = array();
  734. foreach (explode('&', $url['query']) as $line) {
  735. list($key,$val) = explode('=', $line, 2);
  736. $ret[$key] = urldecode($val);
  737. }
  738. $this->assertSame( 'id_res', $ret['openid.mode'] );
  739. $this->assertSame( 'http://www.test.com/test.php', $ret['openid.return_to'] );
  740. $this->assertSame( self::HANDLE, $ret['openid.assoc_handle'] );
  741. $this->assertTrue( isset($ret['openid.response_nonce']) );
  742. $this->assertTrue( isset($ret['openid.signed']) );
  743. $this->assertTrue( isset($ret['openid.sig']) );
  744. $this->assertFalse( isset($ret['openid.ns']) );
  745. $this->assertFalse( isset($ret['openid.op_endpoint']) );
  746. $this->assertSame( 'http://claimed_id/', $ret['openid.claimed_id'] );
  747. $this->assertSame( 'http://identity/', $ret['openid.identity'] );
  748. $this->assertFalse( isset($ret['openid.unknown']) );
  749. $this->assertTrue( $storage->getAssociation(self::HANDLE, $macFunc, $secret, $expires) );
  750. $this->assertSame( 'sha1', $macFunc );
  751. $storage->delAssociation(self::HANDLE);
  752. // extensions
  753. $sreg = new Zend_OpenId_Extension_Sreg(array("nickname"=>"test_id"));
  754. $response = new Zend_OpenId_ResponseHelper(true);
  755. $this->assertTrue( $provider->respondToConsumer(array(
  756. 'openid_return_to' => 'http://www.test.com/test.php',
  757. ), $sreg, $response) );
  758. $headers = $response->getHeaders();
  759. $this->assertSame( 'Location', $headers[0]['name'] );
  760. $url = parse_url($headers[0]['value']);
  761. $this->assertSame( 'www.test.com', $url['host'] );
  762. $this->assertSame( '/test.php', $url['path'] );
  763. $ret = array();
  764. foreach (explode('&', $url['query']) as $line) {
  765. list($key,$val) = explode('=', $line, 2);
  766. $ret[$key] = urldecode($val);
  767. }
  768. $this->assertSame( 'test_id', $ret['openid.sreg.nickname'] );
  769. }
  770. /**
  771. * testing _checkId
  772. *
  773. */
  774. public function testCheckIdImmediate()
  775. {
  776. $_SERVER['SCRIPT_URI'] = "http://www.test.com/server.php";
  777. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  778. $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, $storage);
  779. $provider->logout();
  780. // Wrong arguments (no openid.return_to and openid.trust_root)
  781. $response = new Zend_OpenId_ResponseHelper(true);
  782. $this->assertFalse( $provider->handle(array(
  783. 'openid_mode'=>'checkid_immediate'),
  784. null, $response) );
  785. // Unexistent user
  786. $storage->delUser(self::USER);
  787. $response = new Zend_OpenId_ResponseHelper(true);
  788. $this->assertTrue($provider->handle(array(
  789. 'openid_mode'=>'checkid_immediate',
  790. 'openid_identity'=>self::USER,
  791. 'openid_return_to'=>'http://www.test.com/test.php'),
  792. null, $response));
  793. $headers = $response->getHeaders();
  794. $this->assertSame( 'Location', $headers[0]['name'] );
  795. $this->assertSame( 'http://www.test.com/test.php?openid.mode=cancel', $headers[0]['value'] );
  796. // No openid_identity
  797. $response = new Zend_OpenId_ResponseHelper(true);
  798. $this->assertTrue($provider->handle(array(
  799. 'openid_mode'=>'checkid_immediate',
  800. 'openid_return_to'=>'http://www.test.com/test.php'),
  801. null, $response));
  802. $headers = $response->getHeaders();
  803. $this->assertSame( 'Location', $headers[0]['name'] );
  804. $url = parse_url($headers[0]['value']);
  805. $this->assertSame( 'www.test.com', $url['host'] );
  806. $this->assertSame( '/test.php', $url['path'] );
  807. $query = array();
  808. foreach (explode('&', $url['query']) as $line) {
  809. list($key,$val) = explode('=', $line, 2);
  810. $query[$key] = urldecode($val);
  811. }
  812. $this->assertSame( 'id_res', $query['openid.mode'] );
  813. $url2 = parse_url($query['openid.user_setup_url']);
  814. $this->assertSame( 'www.test.com', $url2['host'] );
  815. $this->assertSame( '/server.php', $url2['path'] );
  816. $query2 = array();
  817. foreach (explode('&', $url2['query']) as $line) {
  818. list($key,$val) = explode('=', $line, 2);
  819. $query2[$key] = urldecode($val);
  820. }
  821. $this->assertSame( 'login', $query2['openid.action'] );
  822. $this->assertSame( 'checkid_setup', $query2['openid.mode'] );
  823. $this->assertSame( 'http://www.test.com/test.php', $query2['openid.return_to'] );
  824. // Non logged in user
  825. $provider->register(self::USER, self::PASSWORD);
  826. $response = new Zend_OpenId_ResponseHelper(true);
  827. $this->assertTrue($provider->handle(array(
  828. 'openid_mode'=>'checkid_immediate',
  829. 'openid_identity'=>self::USER,
  830. 'openid_return_to'=>'http://www.test.com/test.php'),
  831. null, $response));
  832. $headers = $response->getHeaders();
  833. $this->assertSame( 'Location', $headers[0]['name'] );
  834. $url = parse_url($headers[0]['value']);
  835. $this->assertSame( 'www.test.com', $url['host'] );
  836. $this->assertSame( '/test.php', $url['path'] );
  837. $query = array();
  838. foreach (explode('&', $url['query']) as $line) {
  839. list($key,$val) = explode('=', $line, 2);
  840. $query[$key] = urldecode($val);
  841. }
  842. $this->assertSame( 'id_res', $query['openid.mode'] );
  843. $url2 = parse_url($query['openid.user_setup_url']);
  844. $this->assertSame( 'www.test.com', $url2['host'] );
  845. $this->assertSame( '/server.php', $url2['path'] );
  846. $query2 = array();
  847. foreach (explode('&', $url2['query']) as $line) {
  848. list($key,$val) = explode('=', $line, 2);
  849. $query2[$key] = urldecode($val);
  850. }
  851. $this->assertSame( 'login', $query2['openid.action'] );
  852. $this->assertSame( 'checkid_setup', $query2['openid.mode'] );
  853. $this->assertSame( 'http://www.test.com/test.php', $query2['openid.return_to'] );
  854. $this->assertSame( self::USER, $query2['openid.identity'] );
  855. // Non logged in user with SREG
  856. $provider->register(self::USER, self::PASSWORD);
  857. $response = new Zend_OpenId_ResponseHelper(true);
  858. $this->assertTrue($provider->handle(array(
  859. 'openid_mode'=>'checkid_immediate',
  860. 'openid_identity'=>self::USER,
  861. 'openid_return_to'=>'http://www.test.com/test.php',
  862. 'openid_ns_sreg'=>Zend_OpenId_Extension_Sreg::NAMESPACE_1_1,
  863. 'openid_sreg_required'=>'nickname'),
  864. null, $response));
  865. $headers = $response->getHeaders();
  866. $this->assertSame( 'Location', $headers[0]['name'] );
  867. $url = parse_url($headers[0]['value']);
  868. $this->assertSame( 'www.test.com', $url['host'] );
  869. $this->assertSame( '/test.php', $url['path'] );
  870. $query = array();
  871. foreach (explode('&', $url['query']) as $line) {
  872. list($key,$val) = explode('=', $line, 2);
  873. $query[$key] = urldecode($val);
  874. }
  875. $this->assertSame( 'id_res', $query['openid.mode'] );
  876. $url2 = parse_url($query['openid.user_setup_url']);
  877. $this->assertSame( 'www.test.com', $url2['host'] );
  878. $this->assertSame( '/server.php', $url2['path'] );
  879. $query2 = array();
  880. foreach (explode('&', $url2['query']) as $line) {
  881. list($key,$val) = explode('=', $line, 2);
  882. $query2[$key] = urldecode($val);
  883. }
  884. $this->assertSame( 'login', $query2['openid.action'] );
  885. $this->assertSame( 'checkid_setup', $query2['openid.mode'] );
  886. $this->assertSame( 'http://www.test.com/test.php', $query2['openid.return_to'] );
  887. $this->assertSame( self::USER, $query2['openid.identity'] );
  888. $this->assertSame( Zend_OpenId_Extension_Sreg::NAMESPACE_1_1, $query2['openid.ns.sreg'] );
  889. $this->assertSame( "nickname", $query2['openid.sreg.required'] );
  890. // Logged in user (unknown site)
  891. $this->assertTrue( $provider->login(self::USER, self::PASSWORD) );
  892. $response = new Zend_OpenId_ResponseHelper(true);
  893. $this->assertTrue($provider->handle(array(
  894. 'openid_mode'=>'checkid_immediate',
  895. 'openid_identity'=>self::USER,
  896. 'openid_return_to'=>'http://www.test.com/test.php'),
  897. null, $response));
  898. $headers = $response->getHeaders();
  899. $this->assertSame( 'Location', $headers[0]['name'] );
  900. $url = parse_url($headers[0]['value']);
  901. $this->assertSame( 'www.test.com', $url['host'] );
  902. $this->assertSame( '/test.php', $url['path'] );
  903. $query = array();
  904. foreach (explode('&', $url['query']) as $line) {
  905. list($key,$val) = explode('=', $line, 2);
  906. $query[$key] = urldecode($val);
  907. }
  908. $this->assertSame( 'id_res', $query['openid.mode'] );
  909. $url2 = parse_url($query['openid.user_setup_url']);
  910. $this->assertSame( 'www.test.com', $url2['host'] );
  911. $this->assertSame( '/server.php', $url2['path'] );
  912. $query2 = array();
  913. foreach (explode('&', $url2['query']) as $line) {
  914. list($key,$val) = explode('=', $line, 2);
  915. $query2[$key] = urldecode($val);
  916. }
  917. $this->assertSame( 'trust', $query2['openid.action'] );
  918. $this->assertSame( 'checkid_setup', $query2['openid.mode'] );
  919. $this->assertSame( 'http://www.test.com/test.php', $query2['openid.return_to'] );
  920. $this->assertSame( self::USER, $query2['openid.identity'] );
  921. // Logged in user (unknown site 2)
  922. $this->assertTrue( $provider->login(self::USER, self::PASSWORD) );
  923. $this->assertTrue( $provider->allowSite('http://www.test.com/test1.php') );
  924. $response = new Zend_OpenId_ResponseHelper(true);
  925. $this->assertTrue($provider->handle(array(
  926. 'openid_mode'=>'checkid_immediate',
  927. 'openid_identity'=>self::USER,
  928. 'openid_return_to'=>'http://www.test.com/test.php'),
  929. null, $response));
  930. $headers = $response->getHeaders();
  931. $this->assertSame( 'Location', $headers[0]['name'] );
  932. $url = parse_url($headers[0]['value']);
  933. $this->assertSame( 'www.test.com', $url['host'] );
  934. $this->assertSame( '/test.php', $url['path'] );
  935. $query = array();
  936. foreach (explode('&', $url['query']) as $line) {
  937. list($key,$val) = explode('=', $line, 2);
  938. $query[$key] = urldecode($val);
  939. }
  940. $this->assertSame( 'id_res', $query['openid.mode'] );
  941. $url2 = parse_url($query['openid.user_setup_url']);
  942. $this->assertSame( 'www.test.com', $url2['host'] );
  943. $this->assertSame( '/server.php', $url2['path'] );
  944. $query2 = array();
  945. foreach (explode('&', $url2['query']) as $line) {
  946. list($key,$val) = explode('=', $line, 2);
  947. $query2[$key] = urldecode($val);
  948. }
  949. $this->assertSame( 'trust', $query2['openid.action'] );
  950. $this->assertSame( 'checkid_setup', $query2['openid.mode'] );
  951. $this->assertSame( 'http://www.test.com/test.php', $query2['openid.return_to'] );
  952. $this->assertSame( self::USER, $query2['openid.identity'] );
  953. // Logged in user (unknown site + SREG)
  954. $response = new Zend_OpenId_ResponseHelper(true);
  955. $this->assertTrue( $provider->delSite('http://www.test.com/test1.php') );
  956. $this->assertTrue($provider->handle(array(
  957. 'openid_mode'=>'checkid_immediate',
  958. 'openid_identity'=>self::USER,
  959. 'openid_return_to'=>'http://www.test.com/test.php',
  960. 'openid_ns_sreg'=>Zend_OpenId_Extension_Sreg::NAMESPACE_1_1,
  961. 'openid_sreg_required'=>'nickname'),
  962. null, $response));
  963. $headers = $response->getHeaders();
  964. $this->assertSame( 'Location', $headers[0]['name'] );
  965. $url = parse_url($headers[0]['value']);
  966. $this->assertSame( 'www.test.com', $url['host'] );
  967. $this->assertSame( '/test.php', $url['path'] );
  968. $query = array();
  969. foreach (explode('&', $url['query']) as $line) {
  970. list($key,$val) = explode('=', $line, 2);
  971. $query[$key] = urldecode($val);
  972. }
  973. $this->assertSame( 'id_res', $query['openid.mode'] );
  974. $url2 = parse_url($query['openid.user_setup_url']);
  975. $this->assertSame( 'www.test.com', $url2['host'] );
  976. $this->assertSame( '/server.php', $url2['path'] );
  977. $query2 = array();
  978. foreach (explode('&', $url2['query']) as $line) {
  979. list($key,$val) = explode('=', $line, 2);
  980. $query2[$key] = urldecode($val);
  981. }
  982. $this->assertSame( 'trust', $query2['openid.action'] );
  983. $this->assertSame( 'checkid_setup', $query2['openid.mode'] );
  984. $this->assertSame( 'http://www.test.com/test.php', $query2['openid.return_to'] );
  985. $this->assertSame( self::USER, $query2['openid.identity'] );
  986. $this->assertSame( Zend_OpenId_Extension_Sreg::NAMESPACE_1_1, $query2['openid.ns.sreg'] );
  987. $this->assertSame( "nickname", $query2['openid.sreg.required'] );
  988. // Logged in user (untrusted site)
  989. $this->assertTrue( $provider->denySite('http://www.test.com') );
  990. $response = new Zend_OpenId_ResponseHelper(true);
  991. $this->assertTrue($provider->handle(array(
  992. 'openid_mode'=>'checkid_immediate',
  993. 'openid_identity'=>self::USER,
  994. 'openid_return_to'=>'http://www.test.com/test.php'),
  995. null, $response));
  996. $headers = $response->getHeaders();
  997. $this->assertSame( 'Location', $headers[0]['name'] );
  998. $this->assertSame( 'http://www.test.com/test.php?openid.mode=cancel', $headers[0]['value'] );
  999. // Logged in user (untrusted site with wildcard)
  1000. $this->assertTrue( $provider->delSite('http://www.test.com') );
  1001. $this->assertTrue( $provider->denySite('http://*.test.com') );
  1002. $response = new Zend_OpenId_ResponseHelper(true);
  1003. $this->assertTrue($provider->handle(array(
  1004. 'openid_mode'=>'checkid_immediate',
  1005. 'openid_identity'=>self::USER,
  1006. 'openid_return_to'=>'http://www.test.com/test.php'),
  1007. null, $response));
  1008. $headers = $response->getHeaders();
  1009. $this->assertSame( 'Location', $headers[0]['name'] );
  1010. $this->assertSame( 'http://www.test.com/test.php?openid.mode=cancel', $headers[0]['value'] );
  1011. // Logged in user (trusted site)
  1012. $this->assertTrue( $provider->delSite('http://*.test.com') );
  1013. $this->assertTrue( $provider->allowSite('http://www.test.com/') );
  1014. $response = new Zend_OpenId_ResponseHelper(true);
  1015. $this->assertTrue($provider->handle(array(
  1016. 'openid_mode'=>'checkid_immediate',
  1017. 'openid_identity'=>self::USER,
  1018. 'openid_return_to'=>'http://www.test.com/test.php'),
  1019. null, $response));
  1020. $headers = $response->getHeaders();
  1021. $this->assertSame( 'Location', $headers[0]['name'] );
  1022. $url = parse_url($headers[0]['value']);
  1023. $this->assertSame( 'www.test.com', $url['host'] );
  1024. $this->assertSame( '/test.php', $url['path'] );
  1025. $query = array();
  1026. foreach (explode('&', $url['query']) as $line) {
  1027. list($key,$val) = explode('=', $line, 2);
  1028. $query[$key] = urldecode($val);
  1029. }
  1030. $this->assertSame( 'id_res', $query['openid.mode'] );
  1031. $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] );
  1032. $this->assertSame( self::USER, $query['openid.identity'] );
  1033. $this->assertTrue( isset($query['openid.assoc_handle']) );
  1034. $this->assertTrue( isset($query['openid.response_nonce']) );
  1035. $this->assertTrue( isset($query['openid.signed']) );
  1036. $this->assertTrue( isset($query['openid.sig']) );
  1037. $this->assertSame( 20, strlen(base64_decode($query['openid.sig'])) );
  1038. // Logged in user (trusted site without openid.return_to)
  1039. $this->assertTrue( $provider->allowSite('http://www.test.com/') );
  1040. $response = new Zend_OpenId_ResponseHelper(true);
  1041. $this->assertTrue($provider->handle(array(
  1042. 'openid_mode'=>'checkid_immediate',
  1043. 'openid_identity'=>self::USER,
  1044. 'openid_trust_root'=>'http://www.test.com/test.php'),
  1045. null, $response));
  1046. $this->assertSame( array(), $response->getHeaders() );
  1047. $this->assertSame( '', $response->getBody() );
  1048. // Logged in user (trusted site) & OpenID 2.0 & established session
  1049. $storage->delAssociation(self::HANDLE);
  1050. $storage->addAssociation(self::HANDLE, "sha1", pack("H*", '0102030405060708091011121314151617181920'), time() + 3660);
  1051. $this->assertTrue( $provider->allowSite('http://www.test.com/') );
  1052. $response = new Zend_OpenId_ResponseHelper(true);
  1053. $this->assertTrue($provider->handle(array(
  1054. 'openid_ns'=>Zend_OpenId::NS_2_0,
  1055. 'openid_assoc_handle'=>self::HANDLE,
  1056. 'openid_mode'=>'checkid_immediate',
  1057. 'openid_identity'=>self::USER,
  1058. 'openid_return_to'=>'http://www.test.com/test.php'),
  1059. null, $response));
  1060. $headers = $response->getHeaders();
  1061. $this->assertSame( 'Location', $headers[0]['name'] );
  1062. $url = parse_url($headers[0]['value']);
  1063. $this->assertSame( 'www.test.com', $url['host'] );
  1064. $this->assertSame( '/test.php', $url['path'] );
  1065. $query = array();
  1066. foreach (explode('&', $url['query']) as $line) {
  1067. list($key,$val) = explode('=', $line, 2);
  1068. $query[$key] = urldecode($val);
  1069. }
  1070. $this->assertSame( Zend_OpenId::NS_2_0, $query['openid.ns'] );
  1071. $this->assertSame( "http://www.test.com/server.php", $query['openid.op_endpoint'] );
  1072. $this->assertSame( 'id_res', $query['openid.mode'] );
  1073. $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] );
  1074. $this->assertSame( self::USER, $query['openid.identity'] );
  1075. $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] );
  1076. $this->assertTrue( isset($query['openid.response_nonce']) );
  1077. $this->assertTrue( isset($query['openid.signed']) );
  1078. $this->assertTrue( isset($query['openid.sig']) );
  1079. $this->assertSame( 20, strlen(base64_decode($query['openid.sig'])) );
  1080. // Logged in user (trusted site) & invalid association handle
  1081. $storage->delAssociation(self::HANDLE);
  1082. $this->assertTrue( $provider->allowSite('http://www.test.com/') );
  1083. $response = new Zend_OpenId_ResponseHelper(true);
  1084. $this->assertTrue($provider->handle(array(
  1085. 'openid_ns'=>Zend_OpenId::NS_2_0,
  1086. 'openid_assoc_handle'=>self::HANDLE,
  1087. 'openid_mode'=>'checkid_immediate',
  1088. 'openid_identity'=>self::USER,
  1089. 'openid_return_to'=>'http://www.test.com/test.php'),
  1090. null, $response));
  1091. $headers = $response->getHeaders();
  1092. $this->assertSame( 'Location', $headers[0]['name'] );
  1093. $url = parse_url($headers[0]['value']);
  1094. $this->assertSame( 'www.test.com', $url['host'] );
  1095. $this->assertSame( '/test.php', $url['path'] );
  1096. $query = array();
  1097. foreach (explode('&', $url['query']) as $line) {
  1098. list($key,$val) = explode('=', $line, 2);
  1099. $query[$key] = urldecode($val);
  1100. }
  1101. $this->assertSame( Zend_OpenId::NS_2_0, $query['openid.ns'] );
  1102. $this->assertSame( "http://www.test.com/server.php", $query['openid.op_endpoint'] );
  1103. $this->assertSame( 'id_res', $query['openid.mode'] );
  1104. $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] );
  1105. $this->assertSame( self::USER, $query['openid.identity'] );
  1106. $this->assertSame( self::HANDLE, $query['openid.invalidate_handle'] );
  1107. $this->assertTrue( isset($query['openid.assoc_handle']) );
  1108. $this->assertTrue( isset($query['openid.response_nonce']) );
  1109. $this->assertTrue( isset($query['openid.signed']) );
  1110. $this->assertTrue( isset($query['openid.sig']) );
  1111. $this->assertSame( 32, strlen(base64_decode($query['openid.sig'])) );
  1112. // SREG success
  1113. $sreg = new Zend_OpenId_Extension_Sreg(array('nickname'=>'test','email'=>'test@test.com'));
  1114. $this->assertTrue( $provider->allowSite('http://www.test.com/', $sreg) );
  1115. $sreg = new Zend_OpenId_Extension_Sreg();
  1116. $response = new Zend_OpenId_ResponseHelper(true);
  1117. $this->assertTrue($provider->handle(array(
  1118. 'openid_ns'=>Zend_OpenId::NS_2_0,
  1119. 'openid_mode'=>'checkid_immediate',
  1120. 'openid_identity'=>self::USER,
  1121. 'openid_return_to'=>'http://www.test.com/test.php',
  1122. 'openid_ns_sreg'=>Zend_OpenId_Extension_Sreg::NAMESPACE_1_1,
  1123. 'openid_sreg_required'=>'nickname',
  1124. 'openid_sreg_optional'=>'email',
  1125. ),
  1126. $sreg, $response));
  1127. $headers = $response->getHeaders();
  1128. $this->assertSame( 'Location', $headers[0]['name'] );
  1129. $url = parse_url($headers[0]['value']);
  1130. $this->assertSame( 'www.test.com', $url['host'] );
  1131. $this->assertSame( '/test.php', $url['path'] );
  1132. $query = array();
  1133. foreach (explode('&', $url['query']) as $line) {
  1134. list($key,$val) = explode('=', $line, 2);
  1135. $query[$key] = urldecode($val);
  1136. }
  1137. $this->assertSame( Zend_OpenId::NS_2_0, $query['openid.ns'] );
  1138. $this->assertSame( "http://www.test.com/server.php", $query['openid.op_endpoint'] );
  1139. $this->assertSame( 'id_res', $query['openid.mode'] );
  1140. $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] );
  1141. $this->assertSame( self::USER, $query['openid.identity'] );
  1142. $this->assertTrue( isset($query['openid.assoc_handle']) );
  1143. $this->assertTrue( isset($query['openid.response_nonce']) );
  1144. $this->assertTrue( isset($query['openid.signed']) );
  1145. $this->assertTrue( isset($query['openid.sig']) );
  1146. $this->assertSame( 32, strlen(base64_decode($query['openid.sig'])) );
  1147. $this->assertSame( Zend_OpenId_Extension_Sreg::NAMESPACE_1_1, $query['openid.ns.sreg'] );
  1148. $this->assertSame( 'test', $query['openid.sreg.nickname'] );
  1149. $this->assertSame( 'test@test.com', $query['openid.sreg.email'] );
  1150. // SREG failed
  1151. $sreg = new Zend_OpenId_Extension_Sreg(array('nickname'=>'test'));
  1152. $this->assertTrue( $provider->allowSite('http://www.test.com/', $sreg) );
  1153. $sreg = new Zend_OpenId_Extension_Sreg();
  1154. $response = new Zend_OpenId_ResponseHelper(true);
  1155. $this->assertTrue($provider->handle(array(
  1156. 'openid_mode'=>'checkid_immediate',
  1157. 'openid_identity'=>self::USER,
  1158. 'openid_return_to'=>'http://www.test.com/test.php',
  1159. 'openid_sreg_required'=>'nickname,email',
  1160. ),
  1161. $sreg, $response));
  1162. $headers = $response->getHeaders();
  1163. $this->assertSame( 'Location', $headers[0]['name'] );
  1164. $url = parse_url($headers[0]['value']);
  1165. $this->assertSame( 'www.test.com', $url['host'] );
  1166. $this->assertSame( '/test.php', $url['path'] );
  1167. $query = array();
  1168. foreach (explode('&', $url['query']) as $line) {
  1169. list($key,$val) = explode('=', $line, 2);
  1170. $query[$key] = urldecode($val);
  1171. }
  1172. $this->assertSame( 'id_res', $query['openid.mode'] );
  1173. $url2 = parse_url($query['openid.user_setup_url']);
  1174. $this->assertSame( 'www.test.com', $url2['host'] );
  1175. $this->assertSame( '/server.php', $url2['path'] );
  1176. $query2 = array();
  1177. foreach (explode('&', $url2['query']) as $line) {
  1178. list($key,$val) = explode('=', $line, 2);
  1179. $query2[$key] = urldecode($val);
  1180. }
  1181. $this->assertSame( 'trust', $query2['openid.action'] );
  1182. $this->assertSame( 'checkid_setup', $query2['openid.mode'] );
  1183. $this->assertSame( 'http://www.test.com/test.php', $query2['openid.return_to'] );
  1184. $this->assertSame( self::USER, $query2['openid.identity'] );
  1185. $this->assertSame( "nickname,email", $query2['openid.sreg.required'] );
  1186. $provider->logout();
  1187. $storage->delUser(self::USER);
  1188. }
  1189. /**
  1190. * testing handle
  1191. *
  1192. */
  1193. public function testCheckIdSetup()
  1194. {
  1195. $_SERVER['SCRIPT_URI'] = "http://www.test.com/server.php";
  1196. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  1197. $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, $storage);
  1198. $provider->logout();
  1199. // Wrong arguments (no openid.return_to and openid.trust_root)
  1200. $response = new Zend_OpenId_ResponseHelper(true);
  1201. $this->assertFalse( $provider->handle(array(
  1202. 'openid_mode'=>'checkid_setup'),
  1203. null, $response) );
  1204. // Unexistent user
  1205. $storage->delUser(self::USER);
  1206. $response = new Zend_OpenId_ResponseHelper(true);
  1207. $this->assertTrue($provider->handle(array(
  1208. 'openid_mode'=>'checkid_setup',
  1209. 'openid_identity'=>self::USER,
  1210. 'openid_return_to'=>'http://www.test.com/test.php'),
  1211. null, $response));
  1212. $headers = $response->getHeaders();
  1213. $this->assertSame( 'Location', $headers[0]['name'] );
  1214. $this->assertSame( 'http://www.test.com/test.php?openid.mode=cancel', $headers[0]['value'] );
  1215. // No openid_identity
  1216. $response = new Zend_OpenId_ResponseHelper(true);
  1217. $this->assertTrue($provider->handle(array(
  1218. 'openid_mode'=>'checkid_setup',
  1219. 'openid_return_to'=>'http://www.test.com/test.php'),
  1220. null, $response));
  1221. $headers = $response->getHeaders();
  1222. $this->assertSame( 'Location', $headers[0]['name'] );
  1223. $url = parse_url($headers[0]['value']);
  1224. $this->assertSame( 'www.test.com', $url['host'] );
  1225. $this->assertSame( '/server.php', $url['path'] );
  1226. $query = array();
  1227. foreach (explode('&', $url['query']) as $line) {
  1228. list($key,$val) = explode('=', $line, 2);
  1229. $query[$key] = urldecode($val);
  1230. }
  1231. $this->assertSame( 'login', $query['openid.action'] );
  1232. $this->assertSame( 'checkid_setup', $query['openid.mode'] );
  1233. $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] );
  1234. // Non logged in user
  1235. $provider->register(self::USER, self::PASSWORD);
  1236. $response = new Zend_OpenId_ResponseHelper(true);
  1237. $this->assertTrue($provider->handle(array(
  1238. 'openid_mode'=>'checkid_setup',
  1239. 'openid_identity'=>self::USER,
  1240. 'openid_return_to'=>'http://www.test.com/test.php'),
  1241. null, $response));
  1242. $headers = $response->getHeaders();
  1243. $this->assertSame( 'Location', $headers[0]['name'] );
  1244. $url = parse_url($headers[0]['value']);
  1245. $this->assertSame( 'www.test.com', $url['host'] );
  1246. $this->assertSame( '/server.php', $url['path'] );
  1247. $query = array();
  1248. foreach (explode('&', $url['query']) as $line) {
  1249. list($key,$val) = explode('=', $line, 2);
  1250. $query[$key] = urldecode($val);
  1251. }
  1252. $this->assertSame( 'login', $query['openid.action'] );
  1253. $this->assertSame( 'checkid_setup', $query['openid.mode'] );
  1254. $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] );
  1255. $this->assertSame( self::USER, $query['openid.identity'] );
  1256. // Logged in user (unknown site)
  1257. $this->assertTrue( $provider->login(self::USER, self::PASSWORD) );
  1258. $response = new Zend_OpenId_ResponseHelper(true);
  1259. $this->assertTrue($provider->handle(array(
  1260. 'openid_mode'=>'checkid_setup',
  1261. 'openid_identity'=>self::USER,
  1262. 'openid_return_to'=>'http://www.test.com/test.php'),
  1263. null, $response));
  1264. $headers = $response->getHeaders();
  1265. $this->assertSame( 'Location', $headers[0]['name'] );
  1266. $url = parse_url($headers[0]['value']);
  1267. $this->assertSame( 'www.test.com', $url['host'] );
  1268. $this->assertSame( '/server.php', $url['path'] );
  1269. $query = array();
  1270. foreach (explode('&', $url['query']) as $line) {
  1271. list($key,$val) = explode('=', $line, 2);
  1272. $query[$key] = urldecode($val);
  1273. }
  1274. $this->assertSame( 'trust', $query['openid.action'] );
  1275. $this->assertSame( 'checkid_setup', $query['openid.mode'] );
  1276. $this->assertSame( self::USER, $query['openid.identity'] );
  1277. $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] );
  1278. // Logged in user (untrusted site)
  1279. $this->assertTrue( $provider->denySite('http://www.test.com/') );
  1280. $response = new Zend_OpenId_ResponseHelper(true);
  1281. $this->assertTrue($provider->handle(array(
  1282. 'openid_mode'=>'checkid_setup',
  1283. 'openid_identity'=>self::USER,
  1284. 'openid_return_to'=>'http://www.test.com/test.php'),
  1285. null, $response));
  1286. $headers = $response->getHeaders();
  1287. $this->assertSame( 'Location', $headers[0]['name'] );
  1288. $this->assertSame( 'http://www.test.com/test.php?openid.mode=cancel', $headers[0]['value'] );
  1289. // Logged in user (trusted site)
  1290. $this->assertTrue( $provider->allowSite('http://www.test.com/') );
  1291. $response = new Zend_OpenId_ResponseHelper(true);
  1292. $this->assertTrue($provider->handle(array(
  1293. 'openid_mode'=>'checkid_setup',
  1294. 'openid_identity'=>self::USER,
  1295. 'openid_return_to'=>'http://www.test.com/test.php'),
  1296. null, $response));
  1297. $headers = $response->getHeaders();
  1298. $this->assertSame( 'Location', $headers[0]['name'] );
  1299. $url = parse_url($headers[0]['value']);
  1300. $this->assertSame( 'www.test.com', $url['host'] );
  1301. $this->assertSame( '/test.php', $url['path'] );
  1302. $query = array();
  1303. foreach (explode('&', $url['query']) as $line) {
  1304. list($key,$val) = explode('=', $line, 2);
  1305. $query[$key] = urldecode($val);
  1306. }
  1307. $this->assertSame( 'id_res', $query['openid.mode'] );
  1308. $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] );
  1309. $this->assertSame( self::USER, $query['openid.identity'] );
  1310. $this->assertTrue( isset($query['openid.assoc_handle']) );
  1311. $this->assertTrue( isset($query['openid.response_nonce']) );
  1312. $this->assertTrue( isset($query['openid.signed']) );
  1313. $this->assertTrue( isset($query['openid.sig']) );
  1314. $this->assertSame( 20, strlen(base64_decode($query['openid.sig'])) );
  1315. // Logged in user (trusted site without openid.return_to)
  1316. $this->assertTrue( $provider->allowSite('http://www.test.com/') );
  1317. $response = new Zend_OpenId_ResponseHelper(true);
  1318. $this->assertTrue($provider->handle(array(
  1319. 'openid_mode'=>'checkid_setup',
  1320. 'openid_identity'=>self::USER,
  1321. 'openid_trust_root'=>'http://www.test.com/test.php'),
  1322. null, $response));
  1323. $this->assertSame( array(), $response->getHeaders() );
  1324. $this->assertSame( '', $response->getBody() );
  1325. // Logged in user (trusted site) & OpenID 2.0 & established session
  1326. $storage->delAssociation(self::HANDLE);
  1327. $storage->addAssociation(self::HANDLE, "sha1", pack("H*", '0102030405060708091011121314151617181920'), time() + 3660);
  1328. $this->assertTrue( $provider->allowSite('http://www.test.com/') );
  1329. $response = new Zend_OpenId_ResponseHelper(true);
  1330. $this->assertTrue($provider->handle(array(
  1331. 'openid_ns'=>Zend_OpenId::NS_2_0,
  1332. 'openid_assoc_handle'=>self::HANDLE,
  1333. 'openid_mode'=>'checkid_setup',
  1334. 'openid_identity'=>self::USER,
  1335. 'openid_return_to'=>'http://www.test.com/test.php'),
  1336. null, $response));
  1337. $headers = $response->getHeaders();
  1338. $this->assertSame( 'Location', $headers[0]['name'] );
  1339. $url = parse_url($headers[0]['value']);
  1340. $this->assertSame( 'www.test.com', $url['host'] );
  1341. $this->assertSame( '/test.php', $url['path'] );
  1342. $query = array();
  1343. foreach (explode('&', $url['query']) as $line) {
  1344. list($key,$val) = explode('=', $line, 2);
  1345. $query[$key] = urldecode($val);
  1346. }
  1347. $this->assertSame( Zend_OpenId::NS_2_0, $query['openid.ns'] );
  1348. $this->assertSame( "http://www.test.com/server.php", $query['openid.op_endpoint'] );
  1349. $this->assertSame( 'id_res', $query['openid.mode'] );
  1350. $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] );
  1351. $this->assertSame( self::USER, $query['openid.identity'] );
  1352. $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] );
  1353. $this->assertTrue( isset($query['openid.response_nonce']) );
  1354. $this->assertTrue( isset($query['openid.signed']) );
  1355. $this->assertTrue( isset($query['openid.sig']) );
  1356. $this->assertSame( 20, strlen(base64_decode($query['openid.sig'])) );
  1357. // Logged in user (trusted site) & invalid association handle
  1358. $storage->delAssociation(self::HANDLE);
  1359. $this->assertTrue( $provider->allowSite('http://www.test.com/') );
  1360. $response = new Zend_OpenId_ResponseHelper(true);
  1361. $this->assertTrue($provider->handle(array(
  1362. 'openid_ns'=>Zend_OpenId::NS_2_0,
  1363. 'openid_assoc_handle'=>self::HANDLE,
  1364. 'openid_mode'=>'checkid_setup',
  1365. 'openid_identity'=>self::USER,
  1366. 'openid_return_to'=>'http://www.test.com/test.php'),
  1367. null, $response));
  1368. $headers = $response->getHeaders();
  1369. $this->assertSame( 'Location', $headers[0]['name'] );
  1370. $url = parse_url($headers[0]['value']);
  1371. $this->assertSame( 'www.test.com', $url['host'] );
  1372. $this->assertSame( '/test.php', $url['path'] );
  1373. $query = array();
  1374. foreach (explode('&', $url['query']) as $line) {
  1375. list($key,$val) = explode('=', $line, 2);
  1376. $query[$key] = urldecode($val);
  1377. }
  1378. $this->assertSame( Zend_OpenId::NS_2_0, $query['openid.ns'] );
  1379. $this->assertSame( "http://www.test.com/server.php", $query['openid.op_endpoint'] );
  1380. $this->assertSame( 'id_res', $query['openid.mode'] );
  1381. $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] );
  1382. $this->assertSame( self::USER, $query['openid.identity'] );
  1383. $this->assertSame( self::HANDLE, $query['openid.invalidate_handle'] );
  1384. $this->assertTrue( isset($query['openid.assoc_handle']) );
  1385. $this->assertTrue( isset($query['openid.response_nonce']) );
  1386. $this->assertTrue( isset($query['openid.signed']) );
  1387. $this->assertTrue( isset($query['openid.sig']) );
  1388. $this->assertSame( 32, strlen(base64_decode($query['openid.sig'])) );
  1389. // SREG success
  1390. $sreg = new Zend_OpenId_Extension_Sreg(array('nickname'=>'test','email'=>'test@test.com'));
  1391. $this->assertTrue( $provider->allowSite('http://www.test.com/', $sreg) );
  1392. $sreg = new Zend_OpenId_Extension_Sreg();
  1393. $response = new Zend_OpenId_ResponseHelper(true);
  1394. $this->assertTrue($provider->handle(array(
  1395. 'openid_ns'=>Zend_OpenId::NS_2_0,
  1396. 'openid_mode'=>'checkid_setup',
  1397. 'openid_identity'=>self::USER,
  1398. 'openid_return_to'=>'http://www.test.com/test.php',
  1399. 'openid_ns_sreg'=>Zend_OpenId_Extension_Sreg::NAMESPACE_1_1,
  1400. 'openid_sreg_required'=>'nickname',
  1401. 'openid_sreg_optional'=>'email',
  1402. ),
  1403. $sreg, $response));
  1404. $headers = $response->getHeaders();
  1405. $this->assertSame( 'Location', $headers[0]['name'] );
  1406. $url = parse_url($headers[0]['value']);
  1407. $this->assertSame( 'www.test.com', $url['host'] );
  1408. $this->assertSame( '/test.php', $url['path'] );
  1409. $query = array();
  1410. foreach (explode('&', $url['query']) as $line) {
  1411. list($key,$val) = explode('=', $line, 2);
  1412. $query[$key] = urldecode($val);
  1413. }
  1414. $this->assertSame( Zend_OpenId::NS_2_0, $query['openid.ns'] );
  1415. $this->assertSame( "http://www.test.com/server.php", $query['openid.op_endpoint'] );
  1416. $this->assertSame( 'id_res', $query['openid.mode'] );
  1417. $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] );
  1418. $this->assertSame( self::USER, $query['openid.identity'] );
  1419. $this->assertTrue( isset($query['openid.assoc_handle']) );
  1420. $this->assertTrue( isset($query['openid.response_nonce']) );
  1421. $this->assertTrue( isset($query['openid.signed']) );
  1422. $this->assertTrue( isset($query['openid.sig']) );
  1423. $this->assertSame( 32, strlen(base64_decode($query['openid.sig'])) );
  1424. $this->assertSame( Zend_OpenId_Extension_Sreg::NAMESPACE_1_1, $query['openid.ns.sreg'] );
  1425. $this->assertSame( 'test', $query['openid.sreg.nickname'] );
  1426. $this->assertSame( 'test@test.com', $query['openid.sreg.email'] );
  1427. // SREG failed
  1428. $sreg = new Zend_OpenId_Extension_Sreg(array('nickname'=>'test'));
  1429. $this->assertTrue( $provider->allowSite('http://www.test.com/', $sreg) );
  1430. $sreg = new Zend_OpenId_Extension_Sreg();
  1431. $response = new Zend_OpenId_ResponseHelper(true);
  1432. $this->assertTrue($provider->handle(array(
  1433. 'openid_mode'=>'checkid_setup',
  1434. 'openid_identity'=>self::USER,
  1435. 'openid_return_to'=>'http://www.test.com/test.php',
  1436. 'openid_sreg_required'=>'nickname,email',
  1437. ),
  1438. $sreg, $response));
  1439. $headers = $response->getHeaders();
  1440. $this->assertSame( 'Location', $headers[0]['name'] );
  1441. $url = parse_url($headers[0]['value']);
  1442. $this->assertSame( 'www.test.com', $url['host'] );
  1443. $this->assertSame( '/server.php', $url['path'] );
  1444. $query = array();
  1445. foreach (explode('&', $url['query']) as $line) {
  1446. list($key,$val) = explode('=', $line, 2);
  1447. $query[$key] = urldecode($val);
  1448. }
  1449. $this->assertSame( 'trust', $query['openid.action'] );
  1450. $this->assertSame( 'checkid_setup', $query['openid.mode'] );
  1451. $this->assertSame( self::USER, $query['openid.identity'] );
  1452. $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] );
  1453. $this->assertSame( 'nickname,email', $query['openid.sreg.required'] );
  1454. $provider->logout();
  1455. $storage->delUser(self::USER);
  1456. }
  1457. /**
  1458. * testing handle
  1459. *
  1460. */
  1461. public function testHandle()
  1462. {
  1463. $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"));
  1464. // no openid_mode
  1465. $this->assertFalse( $provider->handle(array()) );
  1466. // wrong openid_mode
  1467. $this->assertFalse( $provider->handle(array('openid_mode'=>'wrong')) );
  1468. }
  1469. /**
  1470. * testing setOpEndpoint
  1471. *
  1472. */
  1473. public function testSetOpEndpoint()
  1474. {
  1475. $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider");
  1476. $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, $storage);
  1477. $provider->setOpEndpoint("http://www.test.com/real_endpoint.php");
  1478. // OpenID 2.0 with SHA256
  1479. $_SERVER['SCRIPT_URI'] = "http://www.test.com/endpoint.php";
  1480. $response = new Zend_OpenId_ResponseHelper(true);
  1481. $storage->addAssociation(self::HANDLE, "sha256", pack("H*", '0102030405060708091011121314151617181920212223242526272829303132'), time() + 3660);
  1482. $this->assertTrue( $provider->respondToConsumer(array(
  1483. 'openid_ns' => Zend_OpenId::NS_2_0,
  1484. 'openid_assoc_handle' => self::HANDLE,
  1485. 'openid_return_to' => 'http://www.test.com/test.php'
  1486. ), null, $response) );
  1487. $headers = $response->getHeaders();
  1488. $this->assertSame( 'Location', $headers[0]['name'] );
  1489. $url = parse_url($headers[0]['value']);
  1490. $this->assertSame( 'www.test.com', $url['host'] );
  1491. $this->assertSame( '/test.php', $url['path'] );
  1492. $ret = array();
  1493. foreach (explode('&', $url['query']) as $line) {
  1494. list($key,$val) = explode('=', $line, 2);
  1495. $ret[$key] = urldecode($val);
  1496. }
  1497. $this->assertSame( 'id_res', $ret['openid.mode'] );
  1498. $this->assertSame( 'http://www.test.com/test.php', $ret['openid.return_to'] );
  1499. $this->assertSame( self::HANDLE, $ret['openid.assoc_handle'] );
  1500. $this->assertTrue( isset($ret['openid.response_nonce']) );
  1501. $this->assertTrue( isset($ret['openid.signed']) );
  1502. $this->assertTrue( isset($ret['openid.sig']) );
  1503. $this->assertSame( Zend_OpenId::NS_2_0, $ret['openid.ns'] );
  1504. $this->assertSame( "http://www.test.com/real_endpoint.php", $ret['openid.op_endpoint'] );
  1505. $this->assertTrue( $storage->getAssociation(self::HANDLE, $macFunc, $secret, $expires) );
  1506. $this->assertSame( 'sha256', $macFunc );
  1507. $storage->delAssociation(self::HANDLE);
  1508. }
  1509. }
  1510. class Zend_OpenId_ProviderHelper extends Zend_OpenId_Provider
  1511. {
  1512. public function genSecret($func)
  1513. {
  1514. return $this->_genSecret($func);
  1515. }
  1516. }