Переглянути джерело

Merge branch 'hotfix/203'

Close #203

Fixes ZF-3187
Matthew Weier O'Phinney 12 роки тому
батько
коміт
11e254cf72
2 змінених файлів з 43 додано та 4 видалено
  1. 24 4
      library/Zend/OpenId/Consumer.php
  2. 19 0
      tests/Zend/OpenId/ConsumerTest.php

+ 24 - 4
library/Zend/OpenId/Consumer.php

@@ -18,7 +18,7 @@
  * @subpackage Zend_OpenId_Consumer
  * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
+ * @version    $Id: Consumer.php 24593 2012-01-05 20:35:02Z matthew $
  */
 
 /**
@@ -730,14 +730,34 @@ class Zend_OpenId_Consumer
             return true;
         }
 
-        /* TODO: OpenID 2.0 (7.3) XRI and Yadis discovery */
-
-        /* HTML-based discovery */
         $response = $this->_httpRequest($id, 'GET', array(), $status);
         if ($status != 200 || !is_string($response)) {
             return false;
         }
+
+        /* OpenID 2.0 (7.3) XRI and Yadis discovery */
         if (preg_match(
+                '/<meta[^>]*http-equiv=(["\'])[ \t]*(?:[^ \t"\']+[ \t]+)*?X-XRDS-Location[ \t]*[^"\']*\\1[^>]*content=(["\'])([^"\']+)\\2[^>]*\/?>/i',
+                $response,
+                $r)) {
+            $XRDS = $r[3];
+            $version = 2.0;
+            $response = $this->_httpRequest($XRDS); 
+            if (preg_match(
+                    '/<URI>([^\t]*)<\/URI>/i',
+                    $response,
+                    $x)) {
+                $server = $x[1];
+                // $realId 
+                $realId = 'http://specs.openid.net/auth/2.0/identifier_select';
+            }
+            else {
+                $this->_setError("Unable to get URI for XRDS discovery");
+            }
+        }
+
+        /* HTML-based discovery */
+        else if (preg_match(
                 '/<link[^>]*rel=(["\'])[ \t]*(?:[^ \t"\']+[ \t]+)*?openid2.provider[ \t]*[^"\']*\\1[^>]*href=(["\'])([^"\']+)\\2[^>]*\/?>/i',
                 $response,
                 $r)) {

+ 19 - 0
tests/Zend/OpenId/ConsumerTest.php

@@ -575,6 +575,25 @@ class Zend_OpenId_ConsumerTest extends PHPUnit_Framework_TestCase
         $id = self::ID;
         $this->assertFalse( $consumer->discovery($id, $server, $version) );
 
+        // Test Yardis Discovery
+        $storage->delDiscoveryInfo(self::ID);
+        $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .
+                           "<html><head>\n" .
+                           "<meta http-equiv=\"X-XRDS-Location\" content=\"" . self::SERVER . "\" />" .
+                           "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" .
+                           "<xrds:XRDS xmlns:xrds=\"xri://\$xrds\" xmlns=\"xri://\$xrd*(\$v*2.0)\">\n" .
+                           "  <XRD>\n" .
+                           "  <Service priority=\"0\">\n" .
+                           "  <Type>http://specs.openid.net/auth/2.0/server</Type>\n" .
+                           "  <URI>" . self::SERVER . "</URI>\n" .
+                           "  </Service>\n" .
+                           "  </XRD>\n" .
+                           "</xrds:XRDS>");
+        $this->assertTrue( $consumer->discovery($id, $server, $version) );
+        $this->assertSame( "http://specs.openid.net/auth/2.0/identifier_select", $id );
+        $this->assertSame( self::SERVER, $server );
+        $this->assertSame( 2.0, $version );
+
         // Test HTML based discovery (OpenID 1.1)
         $storage->delDiscoveryInfo(self::ID);
         $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" .