ConsumerTest.php 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042
  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. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. * @version $Id$
  21. */
  22. /**
  23. * Zend_OpenId
  24. */
  25. require_once 'Zend/OpenId/Consumer.php';
  26. /**
  27. * PHPUnit test case
  28. */
  29. require_once 'PHPUnit/Framework.php';
  30. /**
  31. * Zend_OpenId_ResponseHelper
  32. */
  33. require_once 'Zend/OpenId/ResponseHelper.php';
  34. /**
  35. * Zend_OpenId_Consumer_Storage_File
  36. */
  37. require_once 'Zend/OpenId/Consumer/Storage/File.php';
  38. /**
  39. * Zend_OpenId_Extensions_Sreg
  40. */
  41. require_once 'Zend/OpenId/Extension/Sreg.php';
  42. /**
  43. * Zend_Http_Client_Adapter_Test
  44. */
  45. require_once 'Zend/Http/Client/Adapter/Test.php';
  46. /**
  47. * @category Zend
  48. * @package Zend_OpenId
  49. * @subpackage UnitTests
  50. * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
  51. * @license http://framework.zend.com/license/new-bsd New BSD License
  52. * @group Zend_OpenId
  53. */
  54. class Zend_OpenId_ConsumerTest extends PHPUnit_Framework_TestCase
  55. {
  56. const ID = "http://id.myopenid.com/";
  57. const REAL_ID = "http://real_id.myopenid.com/";
  58. const SERVER = "http://www.myopenid.com/";
  59. const HANDLE = "d41d8cd98f00b204e9800998ecf8427e";
  60. const MAC_FUNC = "sha256";
  61. const SECRET = "4fa03202081808bd19f92b667a291873";
  62. /**
  63. * testing login
  64. *
  65. */
  66. public function testLogin()
  67. {
  68. $expiresIn = time() + 600;
  69. $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php";
  70. $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer");
  71. $storage->delDiscoveryInfo(self::ID);
  72. $this->assertTrue( $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn) );
  73. $storage->delAssociation(self::SERVER);
  74. $this->assertTrue( $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn) );
  75. $response = new Zend_OpenId_ResponseHelper(true);
  76. $consumer = new Zend_OpenId_Consumer($storage);
  77. $this->assertTrue( $consumer->login(self::ID, null, null, null, $response) );
  78. $headers = $response->getHeaders();
  79. $this->assertSame( '', $response->getBody() );
  80. $this->assertTrue( is_array($headers) );
  81. $this->assertSame( 1, count($headers) );
  82. $this->assertTrue( is_array($headers[0]) );
  83. $this->assertSame( 3, count($headers[0]) );
  84. $this->assertSame( 'Location', $headers[0]['name'] );
  85. $this->assertSame( true, $headers[0]['replace'] );
  86. $url = $headers[0]['value'];
  87. $url = parse_url($url);
  88. $this->assertSame( "http", $url['scheme'] );
  89. $this->assertSame( "www.myopenid.com", $url['host'] );
  90. $this->assertSame( "/", $url['path'] );
  91. $q = explode("&", $url['query']);
  92. $query = array();
  93. foreach($q as $var) {
  94. if (list($key, $val) = explode("=", $var, 2)) {
  95. $query[$key] = $val;
  96. }
  97. }
  98. $this->assertTrue( is_array($query) );
  99. $this->assertSame( 6, count($query) );
  100. $this->assertSame( 'checkid_setup', $query['openid.mode'] );
  101. $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] );
  102. $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] );
  103. $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] );
  104. $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftest.php', $query['openid.return_to'] );
  105. $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com', $query['openid.trust_root'] );
  106. // Test user defined return_to and trust_root
  107. $response = new Zend_OpenId_ResponseHelper(true);
  108. $consumer = new Zend_OpenId_Consumer($storage);
  109. $this->assertTrue( $consumer->login(self::ID, "http://www.zf-test.com/return.php", "http://www.zf-test.com/trust.php", null, $response) );
  110. $headers = $response->getHeaders();
  111. $url = $headers[0]['value'];
  112. $url = parse_url($url);
  113. $q = explode("&", $url['query']);
  114. $query = array();
  115. foreach($q as $var) {
  116. if (list($key, $val) = explode("=", $var, 2)) {
  117. $query[$key] = $val;
  118. }
  119. }
  120. $this->assertTrue( is_array($query) );
  121. $this->assertSame( 6, count($query) );
  122. $this->assertSame( 'checkid_setup', $query['openid.mode'] );
  123. $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] );
  124. $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] );
  125. $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] );
  126. $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Freturn.php', $query['openid.return_to'] );
  127. $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftrust.php', $query['openid.trust_root'] );
  128. $storage->delDiscoveryInfo(self::ID);
  129. $this->assertTrue( $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 2.0, $expiresIn) );
  130. // Test login with OpenID 2.0
  131. $response = new Zend_OpenId_ResponseHelper(true);
  132. $consumer = new Zend_OpenId_Consumer($storage);
  133. $this->assertTrue( $consumer->login(self::ID, "http://www.zf-test.com/return.php", "http://www.zf-test.com/trust.php", null, $response) );
  134. $headers = $response->getHeaders();
  135. $url = $headers[0]['value'];
  136. $url = parse_url($url);
  137. $q = explode("&", $url['query']);
  138. $query = array();
  139. foreach($q as $var) {
  140. if (list($key, $val) = explode("=", $var, 2)) {
  141. $query[$key] = $val;
  142. }
  143. }
  144. $this->assertTrue( is_array($query) );
  145. $this->assertSame( 7, count($query) );
  146. $this->assertSame( 'http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0', $query['openid.ns'] );
  147. $this->assertSame( 'checkid_setup', $query['openid.mode'] );
  148. $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] );
  149. $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] );
  150. $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] );
  151. $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Freturn.php', $query['openid.return_to'] );
  152. $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftrust.php', $query['openid.realm'] );
  153. // Test login with SREG extension
  154. $ext = new Zend_OpenId_Extension_Sreg(array("nickname"=>true,"email"=>false));
  155. $response = new Zend_OpenId_ResponseHelper(true);
  156. $consumer = new Zend_OpenId_Consumer($storage);
  157. $this->assertTrue( $consumer->login(self::ID, "http://www.zf-test.com/return.php", "http://www.zf-test.com/trust.php", $ext, $response) );
  158. $headers = $response->getHeaders();
  159. $url = $headers[0]['value'];
  160. $url = parse_url($url);
  161. $q = explode("&", $url['query']);
  162. $query = array();
  163. foreach($q as $var) {
  164. if (list($key, $val) = explode("=", $var, 2)) {
  165. $query[$key] = $val;
  166. }
  167. }
  168. $this->assertTrue( is_array($query) );
  169. $this->assertSame( 9, count($query) );
  170. $this->assertSame( 'http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0', $query['openid.ns'] );
  171. $this->assertSame( 'checkid_setup', $query['openid.mode'] );
  172. $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] );
  173. $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] );
  174. $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] );
  175. $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Freturn.php', $query['openid.return_to'] );
  176. $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftrust.php', $query['openid.realm'] );
  177. $this->assertSame( 'nickname', $query['openid.sreg.required'] );
  178. $this->assertSame( 'email', $query['openid.sreg.optional'] );
  179. // Test login in dumb mode
  180. $storage->delAssociation(self::SERVER);
  181. $response = new Zend_OpenId_ResponseHelper(true);
  182. $consumer = new Zend_OpenId_Consumer($storage, true);
  183. $this->assertTrue( $consumer->login(self::ID, "http://www.zf-test.com/return.php", "http://www.zf-test.com/trust.php", null, $response) );
  184. $headers = $response->getHeaders();
  185. $url = $headers[0]['value'];
  186. $url = parse_url($url);
  187. $q = explode("&", $url['query']);
  188. $query = array();
  189. foreach($q as $var) {
  190. if (list($key, $val) = explode("=", $var, 2)) {
  191. $query[$key] = $val;
  192. }
  193. }
  194. $this->assertTrue( is_array($query) );
  195. $this->assertSame( 6, count($query) );
  196. $this->assertSame( 'http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0', $query['openid.ns'] );
  197. $this->assertSame( 'checkid_setup', $query['openid.mode'] );
  198. $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] );
  199. $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] );
  200. $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Freturn.php', $query['openid.return_to'] );
  201. $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftrust.php', $query['openid.realm'] );
  202. $storage->delDiscoveryInfo(self::ID);
  203. }
  204. /**
  205. * testing check
  206. *
  207. */
  208. public function testCheck()
  209. {
  210. $expiresIn = time() + 600;
  211. $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php";
  212. $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer");
  213. $storage->delDiscoveryInfo(self::ID);
  214. $this->assertTrue( $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn) );
  215. $storage->delAssociation(self::SERVER);
  216. $this->assertTrue( $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn) );
  217. $response = new Zend_OpenId_ResponseHelper(true);
  218. $consumer = new Zend_OpenId_Consumer($storage);
  219. $this->assertTrue( $consumer->check(self::ID, null, null, null, $response) );
  220. $headers = $response->getHeaders();
  221. $this->assertSame( '', $response->getBody() );
  222. $this->assertTrue( is_array($headers) );
  223. $this->assertSame( 1, count($headers) );
  224. $this->assertTrue( is_array($headers[0]) );
  225. $this->assertSame( 3, count($headers[0]) );
  226. $this->assertSame( 'Location', $headers[0]['name'] );
  227. $this->assertSame( true, $headers[0]['replace'] );
  228. $url = $headers[0]['value'];
  229. $url = parse_url($url);
  230. $this->assertSame( "http", $url['scheme'] );
  231. $this->assertSame( "www.myopenid.com", $url['host'] );
  232. $this->assertSame( "/", $url['path'] );
  233. $q = explode("&", $url['query']);
  234. $query = array();
  235. foreach($q as $var) {
  236. if (list($key, $val) = explode("=", $var, 2)) {
  237. $query[$key] = $val;
  238. }
  239. }
  240. $this->assertTrue( is_array($query) );
  241. $this->assertSame( 6, count($query) );
  242. $this->assertSame( 'checkid_immediate', $query['openid.mode'] );
  243. $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] );
  244. $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] );
  245. $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] );
  246. $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftest.php', $query['openid.return_to'] );
  247. $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com', $query['openid.trust_root'] );
  248. $storage->delDiscoveryInfo(self::ID);
  249. $storage->delAssociation(self::SERVER);
  250. }
  251. /**
  252. * testing _getAssociation
  253. *
  254. */
  255. public function testGetAssociation()
  256. {
  257. $expiresIn = time() + 600;
  258. $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer");
  259. $storage->delAssociation(self::SERVER);
  260. $consumer = new Zend_OpenId_ConsumerHelper($storage);
  261. $this->assertFalse( $consumer->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) );
  262. $this->assertTrue( $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn) );
  263. $this->assertTrue( $consumer->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) );
  264. $this->assertSame( self::HANDLE, $handle );
  265. $this->assertSame( self::MAC_FUNC, $macFunc );
  266. $this->assertSame( self::SECRET, $secret );
  267. $this->assertSame( $expiresIn, $expires );
  268. $storage->delAssociation(self::SERVER);
  269. $this->assertTrue( $consumer->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) );
  270. $this->assertSame( self::HANDLE, $handle );
  271. $this->assertSame( self::MAC_FUNC, $macFunc );
  272. $this->assertSame( self::SECRET, $secret );
  273. $this->assertSame( $expiresIn, $expires );
  274. }
  275. /**
  276. * testing _httpRequest
  277. *
  278. */
  279. public function testHttpRequest()
  280. {
  281. $consumer = new Zend_OpenId_ConsumerHelper(new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer"));
  282. $http = new Zend_Http_Client(null,
  283. array(
  284. 'maxredirects' => 4,
  285. 'timeout' => 15,
  286. 'useragent' => 'Zend_OpenId'
  287. ));
  288. $test = new Zend_Http_Client_Adapter_Test();
  289. $http->setAdapter($test);
  290. $consumer->SetHttpClient($http);
  291. $this->assertSame( $http, $consumer->GetHttpClient() );
  292. $this->assertFalse( $consumer->httpRequest(self::SERVER) );
  293. $test->setResponse("HTTP/1.1 200 OK\r\n\r\nok\n");
  294. // Test GET request without parameters
  295. $this->assertSame( "ok\n", $consumer->httpRequest(self::SERVER) );
  296. $this->assertSame( "GET / HTTP/1.1\r\n" .
  297. "Host: www.myopenid.com\r\n" .
  298. "Connection: close\r\n" .
  299. "Accept-encoding: gzip, deflate\r\n" .
  300. "User-Agent: Zend_OpenId\r\n\r\n",
  301. $http->getLastRequest() );
  302. // Test POST request without parameters
  303. $this->assertSame( "ok\n", $consumer->httpRequest(self::SERVER, 'POST') );
  304. $this->assertSame( "POST / HTTP/1.1\r\n" .
  305. "Host: www.myopenid.com\r\n" .
  306. "Connection: close\r\n" .
  307. "Accept-encoding: gzip, deflate\r\n" .
  308. "Content-Type: application/x-www-form-urlencoded\r\n" .
  309. "User-Agent: Zend_OpenId\r\n" .
  310. "Content-Length: 0\r\n\r\n",
  311. $http->getLastRequest() );
  312. // Test GET request with parameters
  313. $this->assertSame( "ok\n", $consumer->httpRequest(self::SERVER . 'test.php', 'GET', array('a'=>'b','c'=>'d')) );
  314. $this->assertSame( "GET /test.php?a=b&c=d HTTP/1.1\r\n" .
  315. "Host: www.myopenid.com\r\n" .
  316. "Connection: close\r\n" .
  317. "Accept-encoding: gzip, deflate\r\n" .
  318. "User-Agent: Zend_OpenId\r\n\r\n",
  319. $http->getLastRequest() );
  320. // Test POST request with parameters
  321. $this->assertSame( "ok\n", $consumer->httpRequest(self::SERVER . 'test.php', 'POST', array('a'=>'b','c'=>'d')) );
  322. $this->assertSame( "POST /test.php HTTP/1.1\r\n" .
  323. "Host: www.myopenid.com\r\n" .
  324. "Connection: close\r\n" .
  325. "Accept-encoding: gzip, deflate\r\n" .
  326. "User-Agent: Zend_OpenId\r\n" .
  327. "Content-Type: application/x-www-form-urlencoded\r\n" .
  328. "Content-Length: 7\r\n\r\n" .
  329. "a=b&c=d",
  330. $http->getLastRequest() );
  331. // Test GET parameters combination
  332. $this->assertSame( "ok\n", $consumer->httpRequest(self::SERVER . 'test.php?a=b', 'GET', array('c'=>'x y')) );
  333. $this->assertSame( "GET /test.php?a=b&c=x+y HTTP/1.1\r\n" .
  334. "Host: www.myopenid.com\r\n" .
  335. "Connection: close\r\n" .
  336. "Accept-encoding: gzip, deflate\r\n" .
  337. "User-Agent: Zend_OpenId\r\n\r\n",
  338. $http->getLastRequest() );
  339. // Test GET and POST parameters combination
  340. $this->assertSame( "ok\n", $consumer->httpRequest(self::SERVER . 'test.php?a=b', 'POST', array('c'=>'x y')) );
  341. $this->assertSame( "POST /test.php?a=b HTTP/1.1\r\n" .
  342. "Host: www.myopenid.com\r\n" .
  343. "Connection: close\r\n" .
  344. "Accept-encoding: gzip, deflate\r\n" .
  345. "User-Agent: Zend_OpenId\r\n" .
  346. "Content-Type: application/x-www-form-urlencoded\r\n" .
  347. "Content-Length: 5\r\n\r\n" .
  348. "c=x+y",
  349. $http->getLastRequest() );
  350. }
  351. /**
  352. * testing _associate
  353. *
  354. */
  355. public function testAssociate()
  356. {
  357. try {
  358. $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer");
  359. $storage->delAssociation(self::SERVER);
  360. $consumer = new Zend_OpenId_ConsumerHelper($storage);
  361. $http = new Zend_Http_Client(null,
  362. array(
  363. 'maxredirects' => 4,
  364. 'timeout' => 15,
  365. 'useragent' => 'Zend_OpenId'
  366. ));
  367. $test = new Zend_Http_Client_Adapter_Test();
  368. $http->setAdapter($test);
  369. $consumer->SetHttpClient($http);
  370. // Test OpenID 1.1 association request with DH-SHA1
  371. $consumer->clearAssociation();
  372. $this->assertFalse( $consumer->associate(self::SERVER, 1.1, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) );
  373. $this->assertSame( "POST / HTTP/1.1\r\n" .
  374. "Host: www.myopenid.com\r\n" .
  375. "Connection: close\r\n" .
  376. "Accept-encoding: gzip, deflate\r\n" .
  377. "User-Agent: Zend_OpenId\r\n" .
  378. "Content-Type: application/x-www-form-urlencoded\r\n" .
  379. "Content-Length: 510\r\n\r\n" .
  380. "openid.mode=associate&" .
  381. "openid.assoc_type=HMAC-SHA1&" .
  382. "openid.session_type=DH-SHA1&".
  383. "openid.dh_modulus=ANz5OguIOXLsDhmYmsWizjEOHTdxfo2Vcbt2I3MYZuYe91ouJ4mLBX%2BYkcLiemOcPym2CBRYHNOyyjmG0mg3BVd9RcLn5S3IHHoXGHblzqdLFEi%2F368Ygo79JRnxTkXjgmY0rxlJ5bU1zIKaSDuKdiI%2BXUkKJX8Fvf8W8vsixYOr&" .
  384. "openid.dh_gen=Ag%3D%3D&" .
  385. "openid.dh_consumer_public=GaLlROlBGgSopPzo1ewYISnnT4BUFBfIKlgDPoS9U41t5eQb8QYqgcw7%2BW3dSF1VlWcvJGR0UbZIEhJ3UrCs6p69q6sgl%2FOZ7P%2B17rme7OynqszA3pqD6MJoQVZ5Ht%2FR%2BjmMjK08ajcgYEZU1GG4U5k8eYbcFnje00%2FTGfjKY0I%3D",
  386. $http->getLastRequest() );
  387. // Test OpenID 2.0 association request with DH-SHA256
  388. $consumer->clearAssociation();
  389. $this->assertFalse( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) );
  390. $this->assertSame( "POST / HTTP/1.1\r\n" .
  391. "Host: www.myopenid.com\r\n" .
  392. "Connection: close\r\n" .
  393. "Accept-encoding: gzip, deflate\r\n" .
  394. "User-Agent: Zend_OpenId\r\n" .
  395. "Content-Type: application/x-www-form-urlencoded\r\n" .
  396. "Content-Length: 567\r\n\r\n" .
  397. "openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&" .
  398. "openid.mode=associate&" .
  399. "openid.assoc_type=HMAC-SHA256&" .
  400. "openid.session_type=DH-SHA256&".
  401. "openid.dh_modulus=ANz5OguIOXLsDhmYmsWizjEOHTdxfo2Vcbt2I3MYZuYe91ouJ4mLBX%2BYkcLiemOcPym2CBRYHNOyyjmG0mg3BVd9RcLn5S3IHHoXGHblzqdLFEi%2F368Ygo79JRnxTkXjgmY0rxlJ5bU1zIKaSDuKdiI%2BXUkKJX8Fvf8W8vsixYOr&" .
  402. "openid.dh_gen=Ag%3D%3D&" .
  403. "openid.dh_consumer_public=GaLlROlBGgSopPzo1ewYISnnT4BUFBfIKlgDPoS9U41t5eQb8QYqgcw7%2BW3dSF1VlWcvJGR0UbZIEhJ3UrCs6p69q6sgl%2FOZ7P%2B17rme7OynqszA3pqD6MJoQVZ5Ht%2FR%2BjmMjK08ajcgYEZU1GG4U5k8eYbcFnje00%2FTGfjKY0I%3D",
  404. $http->getLastRequest() );
  405. // Test OpenID 1.1 association response with DH-SHA1
  406. $consumer->clearAssociation();
  407. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  408. "assoc_type:HMAC-SHA1\n" .
  409. "assoc_handle:0123456789absdef0123456789absdef\n" .
  410. "expires_in:3600\n" .
  411. "session_type:DH-SHA1\n".
  412. "dh_server_public:AIoP3d+ZTkd5vZj6G82XVIQ6KRAfSKmLz2Q3qVMzZ5tt7Z7St714GccipYXzCs5Tzgkc+Nt/uDE5xQ/f0Zn0uDS65CZHx3MOPqAANw/9YC/CafF1CD1MxW5TiN50GsjT/wGkcJFcpPXYVigQDOjIkHjKCysk53ktFvCoT60nFKGc\n".
  413. "enc_mac_key:ON+M6/X8uUcOfxw1HF4sw/0XYyw=\n");
  414. $this->assertTrue( $consumer->associate(self::SERVER, 1.1, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) );
  415. $this->assertTrue( $storage->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) );
  416. $this->assertSame( "0123456789absdef0123456789absdef", $handle );
  417. $this->assertSame( "sha1", $macFunc );
  418. $this->assertSame( "e36624c686748f6b646648f12748ffd157e4d4dd", bin2hex($secret) );
  419. $this->assertTrue( $storage->delAssociation(self::SERVER) );
  420. // Wrong OpenID 2.0 association response (wrong ns)
  421. $consumer->clearAssociation();
  422. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  423. "ns:http://specs.openid.net/auth/1.0\n" .
  424. "assoc_type:HMAC-SHA256\n" .
  425. "assoc_handle:0123456789absdef0123456789absdef\n" .
  426. "expires_in:3600\n" .
  427. "session_type:DH-SHA256\n".
  428. "dh_server_public:AIlflxF8rvxx1Xi4Oj/KdP+7fvczeIRvx8WScMQS9I27R6YKd3Nx++5tAAF0rHelKDSG2ZeFM/zLEu9ZmUFzF02OaehWqykCfmtLASwMZO0u2GwYiIu5BoeJb9HlXJes58u/M4ViPXWhn27w2ZTlZJuuK8sDiTSTj9TmFxOriH4X\n".
  429. "enc_mac_key:lvvCoTyvKy8oV6wnNHeroU0uLgBHiGV4BNkrXJe04JE=\n");
  430. $this->assertFalse( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) );
  431. // Wrong OpenID 2.0 association response (wrong assoc_type)
  432. $consumer->clearAssociation();
  433. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  434. "ns:http://specs.openid.net/auth/2.0\n" .
  435. "assoc_type:HMAC-SHA1\n" .
  436. "assoc_handle:0123456789absdef0123456789absdef\n" .
  437. "expires_in:3600\n" .
  438. "session_type:DH-SHA256\n".
  439. "dh_server_public:AIlflxF8rvxx1Xi4Oj/KdP+7fvczeIRvx8WScMQS9I27R6YKd3Nx++5tAAF0rHelKDSG2ZeFM/zLEu9ZmUFzF02OaehWqykCfmtLASwMZO0u2GwYiIu5BoeJb9HlXJes58u/M4ViPXWhn27w2ZTlZJuuK8sDiTSTj9TmFxOriH4X\n".
  440. "enc_mac_key:lvvCoTyvKy8oV6wnNHeroU0uLgBHiGV4BNkrXJe04JE=\n");
  441. $this->assertFalse( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) );
  442. // Wrong OpenID 2.0 association response (wrong session_type)
  443. $consumer->clearAssociation();
  444. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  445. "ns:http://specs.openid.net/auth/2.0\n" .
  446. "assoc_type:HMAC-SHA256\n" .
  447. "assoc_handle:0123456789absdef0123456789absdef\n" .
  448. "expires_in:3600\n" .
  449. "session_type:DH-SHA257\n".
  450. "dh_server_public:AIlflxF8rvxx1Xi4Oj/KdP+7fvczeIRvx8WScMQS9I27R6YKd3Nx++5tAAF0rHelKDSG2ZeFM/zLEu9ZmUFzF02OaehWqykCfmtLASwMZO0u2GwYiIu5BoeJb9HlXJes58u/M4ViPXWhn27w2ZTlZJuuK8sDiTSTj9TmFxOriH4X\n".
  451. "enc_mac_key:lvvCoTyvKy8oV6wnNHeroU0uLgBHiGV4BNkrXJe04JE=\n");
  452. $this->assertFalse( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) );
  453. // Test OpenID 2.0 association response with DH-SHA256
  454. $consumer->clearAssociation();
  455. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  456. "ns:http://specs.openid.net/auth/2.0\n" .
  457. "assoc_type:HMAC-SHA256\n" .
  458. "assoc_handle:0123456789absdef0123456789absdef\n" .
  459. "expires_in:3600\n" .
  460. "session_type:DH-SHA256\n".
  461. "dh_server_public:AIlflxF8rvxx1Xi4Oj/KdP+7fvczeIRvx8WScMQS9I27R6YKd3Nx++5tAAF0rHelKDSG2ZeFM/zLEu9ZmUFzF02OaehWqykCfmtLASwMZO0u2GwYiIu5BoeJb9HlXJes58u/M4ViPXWhn27w2ZTlZJuuK8sDiTSTj9TmFxOriH4X\n".
  462. "enc_mac_key:lvvCoTyvKy8oV6wnNHeroU0uLgBHiGV4BNkrXJe04JE=\n");
  463. $this->assertTrue( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) );
  464. $this->assertTrue( $storage->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) );
  465. $this->assertSame( "0123456789absdef0123456789absdef", $handle );
  466. $this->assertSame( "sha256", $macFunc );
  467. $this->assertSame( "ed901bc561c29fd7bb42862e5f09fa37e7944a7ee72142322f34a21bfe1384b8", bin2hex($secret) );
  468. $this->assertTrue( $storage->delAssociation(self::SERVER) );
  469. // Test OpenID 2.0 association response without encryption (missing session_type)
  470. $consumer->clearAssociation();
  471. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  472. "ns:http://specs.openid.net/auth/2.0\n" .
  473. "assoc_type:HMAC-SHA256\n" .
  474. "assoc_handle:0123456789absdef0123456789absdef\n" .
  475. "expires_in:3600\n" .
  476. "mac_key:7ZAbxWHCn9e7QoYuXwn6N+eUSn7nIUIyLzSiG/4ThLg=\n");
  477. $this->assertTrue( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) );
  478. $this->assertTrue( $storage->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) );
  479. $this->assertSame( "0123456789absdef0123456789absdef", $handle );
  480. $this->assertSame( "sha256", $macFunc );
  481. $this->assertSame( "ed901bc561c29fd7bb42862e5f09fa37e7944a7ee72142322f34a21bfe1384b8", bin2hex($secret) );
  482. $this->assertTrue( $storage->delAssociation(self::SERVER) );
  483. // Test OpenID 2.0 association response without encryption (blank session_type)
  484. $consumer->clearAssociation();
  485. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  486. "ns:http://specs.openid.net/auth/2.0\n" .
  487. "assoc_type:HMAC-SHA256\n" .
  488. "assoc_handle:0123456789absdef0123456789absdef\n" .
  489. "expires_in:3600\n" .
  490. "session_type:\n".
  491. "mac_key:7ZAbxWHCn9e7QoYuXwn6N+eUSn7nIUIyLzSiG/4ThLg=\n");
  492. $this->assertTrue( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) );
  493. $this->assertTrue( $storage->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) );
  494. $this->assertSame( "0123456789absdef0123456789absdef", $handle );
  495. $this->assertSame( "sha256", $macFunc );
  496. $this->assertSame( "ed901bc561c29fd7bb42862e5f09fa37e7944a7ee72142322f34a21bfe1384b8", bin2hex($secret) );
  497. $this->assertTrue( $storage->delAssociation(self::SERVER) );
  498. // Test OpenID 2.0 association response without encryption (blank session_type)
  499. $consumer->clearAssociation();
  500. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  501. "ns:http://specs.openid.net/auth/2.0\n" .
  502. "assoc_type:HMAC-SHA256\n" .
  503. "assoc_handle:0123456789absdef0123456789absdef\n" .
  504. "expires_in:3600\n" .
  505. "session_type:no-encryption\n".
  506. "mac_key:7ZAbxWHCn9e7QoYuXwn6N+eUSn7nIUIyLzSiG/4ThLg=\n");
  507. $this->assertTrue( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) );
  508. $this->assertTrue( $storage->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) );
  509. $this->assertSame( "0123456789absdef0123456789absdef", $handle );
  510. $this->assertSame( "sha256", $macFunc );
  511. $this->assertSame( "ed901bc561c29fd7bb42862e5f09fa37e7944a7ee72142322f34a21bfe1384b8", bin2hex($secret) );
  512. $this->assertTrue( $storage->delAssociation(self::SERVER) );
  513. } catch (Zend_OpenId_Exception $e) {
  514. $this->markTestSkipped($e->getMessage());
  515. }
  516. }
  517. /**
  518. * testing discovery
  519. *
  520. */
  521. public function testDiscovery()
  522. {
  523. $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer");
  524. $consumer = new Zend_OpenId_ConsumerHelper($storage);
  525. $http = new Zend_Http_Client(null,
  526. array(
  527. 'maxredirects' => 4,
  528. 'timeout' => 15,
  529. 'useragent' => 'Zend_OpenId'
  530. ));
  531. $test = new Zend_Http_Client_Adapter_Test();
  532. $http->setAdapter($test);
  533. $consumer->SetHttpClient($http);
  534. // Bad response
  535. $storage->delDiscoveryInfo(self::ID);
  536. $id = self::ID;
  537. $this->assertFalse( $consumer->discovery($id, $server, $version) );
  538. // Test HTML based discovery (OpenID 1.1)
  539. $storage->delDiscoveryInfo(self::ID);
  540. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  541. "<html><head>\n" .
  542. "<link rel=\"openid.server\" href=\"" . self::SERVER . "\">\n" .
  543. "<link rel=\"openid.delegate\" href=\"" . self::REAL_ID . "\">\n" .
  544. "</head><body</body></html>\n");
  545. $id = self::ID;
  546. $this->assertTrue( $consumer->discovery($id, $server, $version) );
  547. $this->assertSame( self::REAL_ID, $id );
  548. $this->assertSame( self::SERVER, $server );
  549. $this->assertSame( 1.1, $version );
  550. // Test HTML based discovery (OpenID 1.1)
  551. $storage->delDiscoveryInfo(self::ID);
  552. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  553. "<html><head>\n" .
  554. "<link href=\"" . self::SERVER . "\" rel=\"openid.server\">\n" .
  555. "<link href=\"" . self::REAL_ID . "\" rel=\"openid.delegate\">\n" .
  556. "</head><body</body></html>\n");
  557. $id = self::ID;
  558. $this->assertTrue( $consumer->discovery($id, $server, $version) );
  559. $this->assertSame( self::REAL_ID, $id );
  560. $this->assertSame( self::SERVER, $server );
  561. $this->assertSame( 1.1, $version );
  562. // Test HTML based discovery (OpenID 2.0)
  563. $storage->delDiscoveryInfo(self::ID);
  564. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  565. "<html><head>\n" .
  566. "<link rel=\"openid2.provider\" href=\"" . self::SERVER . "\">\n" .
  567. "<link rel=\"openid2.local_id\" href=\"" . self::REAL_ID . "\">\n" .
  568. "</head><body</body></html>\n");
  569. $id = self::ID;
  570. $this->assertTrue( $consumer->discovery($id, $server, $version) );
  571. $this->assertSame( self::REAL_ID, $id );
  572. $this->assertSame( self::SERVER, $server );
  573. $this->assertSame( 2.0, $version );
  574. // Test HTML based discovery (OpenID 2.0)
  575. $storage->delDiscoveryInfo(self::ID);
  576. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  577. "<html><head>\n" .
  578. "<link href=\"" . self::SERVER . "\" rel=\"openid2.provider\">\n" .
  579. "<link href=\"" . self::REAL_ID . "\" rel=\"openid2.local_id\">\n" .
  580. "</head><body</body></html>\n");
  581. $id = self::ID;
  582. $this->assertTrue( $consumer->discovery($id, $server, $version) );
  583. $this->assertSame( self::REAL_ID, $id );
  584. $this->assertSame( self::SERVER, $server );
  585. $this->assertSame( 2.0, $version );
  586. // Test HTML based discovery (OpenID 1.1 and 2.0)
  587. $storage->delDiscoveryInfo(self::ID);
  588. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  589. "<html><head>\n" .
  590. "<link rel=\"openid2.provider\" href=\"" . self::SERVER . "\">\n" .
  591. "<link rel=\"openid2.local_id\" href=\"" . self::REAL_ID . "\">\n" .
  592. "<link rel=\"openid.server\" href=\"" . self::SERVER . "\">\n" .
  593. "<link rel=\"openid.delegate\" href=\"" . self::REAL_ID . "\">\n" .
  594. "</head><body</body></html>\n");
  595. $id = self::ID;
  596. $this->assertTrue( $consumer->discovery($id, $server, $version) );
  597. $this->assertSame( self::REAL_ID, $id );
  598. $this->assertSame( self::SERVER, $server );
  599. $this->assertSame( 2.0, $version );
  600. // Test HTML based discovery (OpenID 1.1) (single quotes)
  601. $storage->delDiscoveryInfo(self::ID);
  602. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  603. "<html><head>\n" .
  604. "<link rel='openid.server' href='" . self::SERVER . "'>\n" .
  605. "<link rel='openid.delegate' href='" . self::REAL_ID . "'>\n" .
  606. "</head><body</body></html>\n");
  607. $id = self::ID;
  608. $this->assertTrue( $consumer->discovery($id, $server, $version) );
  609. $this->assertSame( self::REAL_ID, $id );
  610. $this->assertSame( self::SERVER, $server );
  611. $this->assertSame( 1.1, $version );
  612. // Test HTML based discovery (OpenID 1.1) (single quotes)
  613. $storage->delDiscoveryInfo(self::ID);
  614. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  615. "<html><head>\n" .
  616. "<link href='" . self::SERVER . "' rel='openid.server'>\n" .
  617. "<link href='" . self::REAL_ID . "' rel='openid.delegate'>\n" .
  618. "</head><body</body></html>\n");
  619. $id = self::ID;
  620. $this->assertTrue( $consumer->discovery($id, $server, $version) );
  621. $this->assertSame( self::REAL_ID, $id );
  622. $this->assertSame( self::SERVER, $server );
  623. $this->assertSame( 1.1, $version );
  624. // Test HTML based discovery (OpenID 2.0) (single quotes)
  625. $storage->delDiscoveryInfo(self::ID);
  626. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  627. "<html><head>\n" .
  628. "<link rel='openid2.provider' href='" . self::SERVER . "'>\n" .
  629. "<link rel='openid2.local_id' href='" . self::REAL_ID . "'>\n" .
  630. "</head><body</body></html>\n");
  631. $id = self::ID;
  632. $this->assertTrue( $consumer->discovery($id, $server, $version) );
  633. $this->assertSame( self::REAL_ID, $id );
  634. $this->assertSame( self::SERVER, $server );
  635. $this->assertSame( 2.0, $version );
  636. // Test HTML based discovery (OpenID 2.0) (single quotes)
  637. $storage->delDiscoveryInfo(self::ID);
  638. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  639. "<html><head>\n" .
  640. "<link href='" . self::SERVER . "' rel='openid2.provider'>\n" .
  641. "<link href='" . self::REAL_ID . "' rel='openid2.local_id'>\n" .
  642. "</head><body</body></html>\n");
  643. $id = self::ID;
  644. $this->assertTrue( $consumer->discovery($id, $server, $version) );
  645. $this->assertSame( self::REAL_ID, $id );
  646. $this->assertSame( self::SERVER, $server );
  647. $this->assertSame( 2.0, $version );
  648. // Test HTML based discovery (OpenID 1.1 and 2.0) (single quotes)
  649. $storage->delDiscoveryInfo(self::ID);
  650. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  651. "<html><head>\n" .
  652. "<link rel='openid2.provider' href='" . self::SERVER . "'>\n" .
  653. "<link rel='openid2.local_id' href='" . self::REAL_ID . "'>\n" .
  654. "<link rel='openid.server' href='" . self::SERVER . "'>\n" .
  655. "<link rel='openid.delegate' href='" . self::REAL_ID . "'>\n" .
  656. "</head><body</body></html>\n");
  657. $id = self::ID;
  658. $this->assertTrue( $consumer->discovery($id, $server, $version) );
  659. $this->assertSame( self::REAL_ID, $id );
  660. $this->assertSame( self::SERVER, $server );
  661. $this->assertSame( 2.0, $version );
  662. // Wrong HTML
  663. $storage->delDiscoveryInfo(self::ID);
  664. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  665. "<html><head>\n" .
  666. "</head><body</body></html>\n");
  667. $id = self::ID;
  668. $this->assertFalse( $consumer->discovery($id, $server, $version) );
  669. // Test HTML based discovery with multivalue rel (OpenID 1.1)
  670. $storage->delDiscoveryInfo(self::ID);
  671. $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
  672. "<html><head>\n" .
  673. "<link rel=\" aaa openid.server bbb \" href=\"" . self::SERVER . "\">\n" .
  674. "<link rel=\"aaa openid.delegate\" href=\"" . self::REAL_ID . "\">\n" .
  675. "</head><body</body></html>\n");
  676. $id = self::ID;
  677. $this->assertTrue( $consumer->discovery($id, $server, $version) );
  678. $this->assertSame( self::REAL_ID, $id );
  679. $this->assertSame( self::SERVER, $server );
  680. $this->assertSame( 1.1, $version );
  681. }
  682. /**
  683. * testing verify
  684. *
  685. */
  686. public function testVerify()
  687. {
  688. $expiresIn = time() + 600;
  689. $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php";
  690. $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer");
  691. $consumer = new Zend_OpenId_ConsumerHelper($storage);
  692. $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn);
  693. // Wrong arguments
  694. $this->assertFalse( $consumer->verify(array()) );
  695. // HMAC-SHA1
  696. $consumer->clearAssociation();
  697. $params = array(
  698. "openid_return_to" => "http://www.zf-test.com/test.php",
  699. "openid_assoc_handle" => self::HANDLE,
  700. "openid_claimed_id" => self::ID,
  701. "openid_identity" => self::REAL_ID,
  702. "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe",
  703. "openid_mode" => "id_res",
  704. "openid_signed" => "assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed",
  705. "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw="
  706. );
  707. $storage->delAssociation(self::SERVER);
  708. $storage->addAssociation(self::SERVER, self::HANDLE, "sha1", pack("H*", "8382aea922560ece833ba55fa53b7a975f597370"), $expiresIn);
  709. $storage->purgeNonces();
  710. $this->assertTrue( $consumer->verify($params) );
  711. $storage->delDiscoveryInfo(self::ID);
  712. $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 2.0, $expiresIn);
  713. // HMAC-SHA256
  714. $consumer->clearAssociation();
  715. $params = array(
  716. "openid_ns" => Zend_OpenId::NS_2_0,
  717. "openid_op_endpoint" => self::SERVER,
  718. "openid_return_to" => "http://www.zf-test.com/test.php",
  719. "openid_assoc_handle" => self::HANDLE,
  720. "openid_claimed_id" => self::ID,
  721. "openid_identity" => self::REAL_ID,
  722. "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe",
  723. "openid_mode" => "id_res",
  724. "openid_signed" => "assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed",
  725. "openid_sig" => "rMiVhEmHVcIHoY2uzPNb7udWqa4lruvjnwZfujct0TE="
  726. );
  727. $storage->delAssociation(self::SERVER);
  728. $storage->addAssociation(self::SERVER, self::HANDLE, "sha256", pack("H*", "ed901bc561c29fd7bb42862e5f09fa37e7944a7ee72142322f34a21bfe1384b8"), $expiresIn);
  729. $storage->purgeNonces();
  730. $this->assertTrue( $consumer->verify($params) );
  731. // HMAC-SHA256 (duplicate response_nonce)
  732. $consumer->clearAssociation();
  733. $params = array(
  734. "openid_ns" => Zend_OpenId::NS_2_0,
  735. "openid_op_endpoint" => self::SERVER,
  736. "openid_return_to" => "http://www.zf-test.com/test.php",
  737. "openid_assoc_handle" => self::HANDLE,
  738. "openid_claimed_id" => self::ID,
  739. "openid_identity" => self::REAL_ID,
  740. "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe",
  741. "openid_mode" => "id_res",
  742. "openid_signed" => "assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed",
  743. "openid_sig" => "rMiVhEmHVcIHoY2uzPNb7udWqa4lruvjnwZfujct0TE="
  744. );
  745. $storage->delAssociation(self::SERVER);
  746. $storage->addAssociation(self::SERVER, self::HANDLE, "sha256", pack("H*", "ed901bc561c29fd7bb42862e5f09fa37e7944a7ee72142322f34a21bfe1384b8"), $expiresIn);
  747. $this->assertFalse( $consumer->verify($params) );
  748. $storage->delDiscoveryInfo(self::ID);
  749. $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn);
  750. // wrong signature
  751. $consumer->clearAssociation();
  752. $params = array(
  753. "openid_return_to" => "http://www.zf-test.com/test.php",
  754. "openid_assoc_handle" => self::HANDLE,
  755. "openid_claimed_id" => self::ID,
  756. "openid_identity" => self::REAL_ID,
  757. "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124fff",
  758. "openid_mode" => "id_res",
  759. "openid_signed" => "assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed",
  760. "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw="
  761. );
  762. $storage->delAssociation(self::SERVER);
  763. $storage->addAssociation(self::SERVER, self::HANDLE, "sha1", pack("H*", "8382aea922560ece833ba55fa53b7a975f597370"), $expiresIn);
  764. $storage->purgeNonces();
  765. $this->assertFalse( $consumer->verify($params) );
  766. $this->assertFalse( $storage->getAssociation(self::SERVER, $handle, $func, $secret, $expires) );
  767. // openid_invalidate_handle
  768. $consumer->clearAssociation();
  769. $params = array(
  770. "openid_return_to" => "http://www.zf-test.com/test.php",
  771. "openid_invalidate_handle" => self::HANDLE."1",
  772. "openid_assoc_handle" => self::HANDLE,
  773. "openid_claimed_id" => self::ID,
  774. "openid_identity" => self::REAL_ID,
  775. "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe",
  776. "openid_mode" => "id_res",
  777. "openid_signed" => "assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed",
  778. "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw="
  779. );
  780. $storage->delAssociation(self::SERVER);
  781. $storage->addAssociation(self::SERVER, self::HANDLE, "sha1", pack("H*", "8382aea922560ece833ba55fa53b7a975f597370"), $expiresIn);
  782. $storage->delAssociation(self::SERVER."1");
  783. $storage->addAssociation(self::SERVER."1", self::HANDLE."1", "sha1", pack("H*", "8382aea922560ece833ba55fa53b7a975f597370"), $expiresIn);
  784. $storage->purgeNonces();
  785. $this->assertTrue( $consumer->verify($params) );
  786. $this->assertFalse( $storage->getAssociation(self::SERVER."1", $handle, $func, $secret, $expires) );
  787. $storage->delDiscoveryInfo(self::ID);
  788. }
  789. /**
  790. * testing verify
  791. *
  792. */
  793. public function testVerifyDumb()
  794. {
  795. $expiresIn = time() + 600;
  796. $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php";
  797. $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer");
  798. $consumer = new Zend_OpenId_ConsumerHelper($storage);
  799. $http = new Zend_Http_Client(null,
  800. array(
  801. 'maxredirects' => 4,
  802. 'timeout' => 15,
  803. 'useragent' => 'Zend_OpenId'
  804. ));
  805. $test = new Zend_Http_Client_Adapter_Test();
  806. $http->setAdapter($test);
  807. $consumer->SetHttpClient($http);
  808. $storage->delDiscoveryInfo(self::ID);
  809. $this->assertTrue( $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn) );
  810. $this->assertTrue( $storage->addDiscoveryInfo(self::REAL_ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn) );
  811. // Wrong arguments (no identity)
  812. $test->setResponse("HTTP/1.1 200 OK\r\n\r\nis_valid:true");
  813. $consumer->clearAssociation();
  814. $storage->delAssociation(self::SERVER);
  815. $params = array(
  816. "openid_return_to" => "http://www.zf-test.com/test.php",
  817. "openid_assoc_handle" => self::HANDLE,
  818. "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe",
  819. "openid_mode" => "id_res",
  820. "openid_signed" => "assoc_handle,return_to,response_nonce,mode,signed",
  821. "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw="
  822. );
  823. $storage->purgeNonces();
  824. $this->assertFalse( $consumer->verify($params) );
  825. $test->setResponse("HTTP/1.1 200 OK\r\n\r\nis_valid:false");
  826. $consumer->clearAssociation();
  827. $storage->delAssociation(self::SERVER);
  828. $params = array(
  829. "openid_return_to" => "http://www.zf-test.com/test.php",
  830. "openid_assoc_handle" => self::HANDLE,
  831. "openid_claimed_id" => self::ID,
  832. "openid_identity" => self::REAL_ID,
  833. "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe",
  834. "openid_mode" => "id_res",
  835. "openid_signed" => "assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed",
  836. "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw="
  837. );
  838. $storage->purgeNonces();
  839. $this->assertFalse( $consumer->verify($params) );
  840. $this->assertSame( "POST / HTTP/1.1\r\n" .
  841. "Host: www.myopenid.com\r\n" .
  842. "Connection: close\r\n" .
  843. "Accept-encoding: gzip, deflate\r\n" .
  844. "User-Agent: Zend_OpenId\r\n" .
  845. "Content-Type: application/x-www-form-urlencoded\r\n" .
  846. "Content-Length: 445\r\n\r\n" .
  847. "openid.return_to=http%3A%2F%2Fwww.zf-test.com%2Ftest.php&" .
  848. "openid.assoc_handle=d41d8cd98f00b204e9800998ecf8427e&" .
  849. "openid.claimed_id=http%3A%2F%2Fid.myopenid.com%2F&" .
  850. "openid.identity=http%3A%2F%2Freal_id.myopenid.com%2F&" .
  851. "openid.response_nonce=2007-08-14T12%3A52%3A33Z46c1a59124ffe&" .
  852. "openid.mode=check_authentication&" .
  853. "openid.signed=assoc_handle%2Creturn_to%2Cclaimed_id%2Cidentity%2Cresponse_nonce%2Cmode%2Csigned&" .
  854. "openid.sig=h%2F5AFD25NpzSok5tzHEGCVUkQSw%3D",
  855. $http->getLastRequest() );
  856. $test->setResponse("HTTP/1.1 200 OK\r\n\r\nis_valid:true");
  857. $consumer->clearAssociation();
  858. $storage->delAssociation(self::SERVER);
  859. $params = array(
  860. "openid_return_to" => "http://www.zf-test.com/test.php",
  861. "openid_assoc_handle" => self::HANDLE,
  862. "openid_identity" => self::REAL_ID,
  863. "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe",
  864. "openid_mode" => "id_res",
  865. "openid_signed" => "assoc_handle,return_to,identity,response_nonce,mode,signed",
  866. "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw="
  867. );
  868. $storage->purgeNonces();
  869. $this->assertTrue( $consumer->verify($params) );
  870. // SREG
  871. $this->assertTrue( $storage->delDiscoveryInfo(self::ID) );
  872. $this->assertTrue( $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 2.0, $expiresIn) );
  873. $test->setResponse("HTTP/1.1 200 OK\r\n\r\nis_valid:true");
  874. $consumer->clearAssociation();
  875. $storage->delAssociation(self::SERVER);
  876. $params = array(
  877. "openid_ns" => Zend_OpenId::NS_2_0,
  878. "openid_return_to" => "http://www.zf-test.com/test.php",
  879. "openid_assoc_handle" => self::HANDLE,
  880. "openid_claimed_id" => self::ID,
  881. "openid_identity" => self::REAL_ID,
  882. "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe",
  883. "openid_op_endpoint" => self::SERVER,
  884. "openid_mode" => "id_res",
  885. "openid_ns_sreg" => "http://openid.net/extensions/sreg/1.1",
  886. "openid_sreg_nickname" => "test",
  887. "openid_signed" => "ns,assoc_handle,return_to,claimed_id,identity,response_nonce,mode,ns.sreg,sreg.nickname,signed",
  888. "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw="
  889. );
  890. $storage->purgeNonces();
  891. $this->assertTrue( $consumer->verify($params) );
  892. $this->assertSame( "POST / HTTP/1.1\r\n" .
  893. "Host: www.myopenid.com\r\n" .
  894. "Connection: close\r\n" .
  895. "Accept-encoding: gzip, deflate\r\n" .
  896. "User-Agent: Zend_OpenId\r\n" .
  897. "Content-Type: application/x-www-form-urlencoded\r\n" .
  898. "Content-Length: 672\r\n\r\n" .
  899. "openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&" .
  900. "openid.return_to=http%3A%2F%2Fwww.zf-test.com%2Ftest.php&" .
  901. "openid.assoc_handle=d41d8cd98f00b204e9800998ecf8427e&" .
  902. "openid.claimed_id=http%3A%2F%2Fid.myopenid.com%2F&" .
  903. "openid.identity=http%3A%2F%2Freal_id.myopenid.com%2F&" .
  904. "openid.response_nonce=2007-08-14T12%3A52%3A33Z46c1a59124ffe&" .
  905. "openid.op_endpoint=http%3A%2F%2Fwww.myopenid.com%2F&" .
  906. "openid.mode=check_authentication&" .
  907. "openid.ns.sreg=http%3A%2F%2Fopenid.net%2Fextensions%2Fsreg%2F1.1&" .
  908. "openid.sreg.nickname=test&" .
  909. "openid.signed=ns%2Cassoc_handle%2Creturn_to%2Cclaimed_id%2Cidentity%2Cresponse_nonce%2Cmode%2Cns.sreg%2Csreg.nickname%2Csigned&" .
  910. "openid.sig=h%2F5AFD25NpzSok5tzHEGCVUkQSw%3D",
  911. $http->getLastRequest() );
  912. // invalidate_handle
  913. $test->setResponse("HTTP/1.1 200 OK\r\n\r\nis_valid:false\ninvalidate_handle:".self::HANDLE."1"."\n");
  914. $consumer->clearAssociation();
  915. $params = array(
  916. "openid_ns" => Zend_OpenId::NS_2_0,
  917. "openid_return_to" => "http://www.zf-test.com/test.php",
  918. "openid_assoc_handle" => self::HANDLE,
  919. "openid_claimed_id" => self::ID,
  920. "openid_identity" => self::REAL_ID,
  921. "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe",
  922. "openid_op_endpoint" => self::SERVER,
  923. "openid_mode" => "id_res",
  924. "openid_signed" => "assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed",
  925. "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw="
  926. );
  927. $storage->delAssociation(self::SERVER."1");
  928. $storage->addAssociation(self::SERVER."1", self::HANDLE."1", "sha1", pack("H*", "8382aea922560ece833ba55fa53b7a975f597370"), $expiresIn);
  929. $storage->purgeNonces();
  930. $this->assertFalse( $consumer->verify($params) );
  931. $this->assertFalse( $storage->getAssociation(self::SERVER."1", $handle, $func, $secret, $expires) );
  932. }
  933. }
  934. class Zend_OpenId_ConsumerHelper extends Zend_OpenId_Consumer {
  935. public function addAssociation($url, $handle, $macFunc, $secret, $expires)
  936. {
  937. return $this->_addAssociation($url, $handle, $macFunc, $secret, $expires);
  938. }
  939. public function getAssociation($url, &$handle, &$macFunc, &$secret, &$expires)
  940. {
  941. return $this->_getAssociation($url, $handle, $macFunc, $secret, $expires);
  942. }
  943. public function clearAssociation()
  944. {
  945. $this->_cache = array();
  946. }
  947. public function httpRequest($url, $method = 'GET', array $params = array())
  948. {
  949. return $this->_httpRequest($url, $method, $params);
  950. }
  951. public function associate($url, $version, $priv_key = null)
  952. {
  953. return $this->_associate($url, $version, $priv_key);
  954. }
  955. public function discovery(&$id, &$server, &$version)
  956. {
  957. return $this->_discovery($id, $server, $version);
  958. }
  959. }