diff options
-rw-r--r-- | Auth/OpenID/Message.php | 63 | ||||
-rw-r--r-- | Tests/Auth/OpenID/Consumer.php | 6 | ||||
-rw-r--r-- | Tests/Auth/OpenID/Message.php | 2 |
3 files changed, 50 insertions, 21 deletions
diff --git a/Auth/OpenID/Message.php b/Auth/OpenID/Message.php index b8fd8d8..a9a7d21 100644 --- a/Auth/OpenID/Message.php +++ b/Auth/OpenID/Message.php @@ -48,6 +48,40 @@ $Auth_OpenID_OPENID_PROTOCOL_FIELDS = array( 'invalidate_handle', 'op_endpoint', 'response_nonce', 'sig', 'assoc_handle', 'trust_root', 'openid'); +// Global namespace / alias registration map. See +// Auth_OpenID_registerNamespaceAlias. +global $Auth_OpenID_registered_aliases; +$Auth_OpenID_registered_aliases = array(); + +/** + * Registers a (namespace URI, alias) mapping in a global namespace + * alias map. Raises NamespaceAliasRegistrationError if either the + * namespace URI or alias has already been registered with a different + * value. This function is required if you want to use a namespace + * with an OpenID 1 message. + */ +function Auth_OpenID_registerNamespaceAlias($namespace_uri, $alias) +{ + global $Auth_OpenID_registered_aliases; + + if (Auth_OpenID::arrayGet($Auth_OpenID_registered_aliases, + $alias) == $namespace_uri) { + return true; + } + + if (in_array($namespace_uri, + array_values($Auth_OpenID_registered_aliases))) { + return false; + } + + if (in_array($alias, $Auth_OpenID_registered_aliases)) { + return false; + } + + $Auth_OpenID_registered_aliases[$alias] = $namespace_uri; + return true; +} + /** * An Auth_OpenID_Mapping maintains a mapping from arbitrary keys to * arbitrary values. (This is unlike an ordinary PHP array, whose @@ -202,7 +236,6 @@ class Auth_OpenID_Mapping { class Auth_OpenID_NamespaceMap { function Auth_OpenID_NamespaceMap() { - $this->default_aliases = array(Auth_OpenID_SREG_URI => 'sreg'); $this->alias_to_namespace = new Auth_OpenID_Mapping(); $this->namespace_to_alias = new Auth_OpenID_Mapping(); } @@ -296,16 +329,6 @@ class Auth_OpenID_NamespaceMap { return $alias; } - // See if there is a default alias for this namespace - $default_alias = Auth_OpenID::arrayGet($this->default_aliases, - $namespace_uri); - - if ($default_alias !== null) { - if ($this->addAlias($namespace_uri, $default_alias) !== null) { - return $default_alias; - } - } - // Fall back to generating a numerical alias $i = 0; while (1) { @@ -345,10 +368,6 @@ class Auth_OpenID_Message { Auth_OpenID_OPENID1_NS, Auth_OpenID_OPENID2_NS); - $this->default_namespaces = array( - 'sreg' => Auth_OpenID_SREG_URI - ); - $this->args = new Auth_OpenID_Mapping(); $this->namespaces = new Auth_OpenID_NamespaceMap(); if ($openid_namespace === null) { @@ -418,6 +437,8 @@ class Auth_OpenID_Message { function _fromOpenIDArgs($openid_args) { + global $Auth_OpenID_registered_aliases; + // Takes an Auth_OpenID_Mapping instance OR an array. if (!Auth_OpenID_Mapping::isA($openid_args)) { @@ -473,9 +494,13 @@ class Auth_OpenID_Message { // Only try to map an alias to a default if it's an // OpenID 1.x message. if ($openid_ns_uri == Auth_OpenID_OPENID1_NS) { - $ns_uri = Auth_OpenID::arrayGet( - $this->default_namespaces, - $ns_alias); + foreach ($Auth_OpenID_registered_aliases + as $alias => $uri) { + if ($alias == $ns_alias) { + $ns_uri = $uri; + break; + } + } } if ($ns_uri === null) { @@ -751,7 +776,7 @@ class Auth_OpenID_Message { return $stuff; } - return null; + return array(); } function updateArgs($namespace, $updates) diff --git a/Tests/Auth/OpenID/Consumer.php b/Tests/Auth/OpenID/Consumer.php index 67e6d4f..249886a 100644 --- a/Tests/Auth/OpenID/Consumer.php +++ b/Tests/Auth/OpenID/Consumer.php @@ -23,6 +23,7 @@ require_once 'Auth/OpenID/KVForm.php'; require_once 'Auth/OpenID/Consumer.php'; require_once 'Auth/OpenID/Server.php'; require_once 'Auth/OpenID/Nonce.php'; +require_once 'Auth/OpenID/Message.php'; require_once 'Auth/OpenID/HMACSHA1.php'; require_once 'Tests/Auth/OpenID/MemStore.php'; require_once 'PHPUnit.php'; @@ -1449,12 +1450,15 @@ class Tests_Auth_OpenID_SuccessResponse extends PHPUnit_TestCase { 'openid.sreg.nickname' => 'j3h', 'openid.return_to' => 'return_to'); + $temp_sreg_uri = 'bogus'; + $this->assertTrue(Auth_OpenID_registerNamespaceAlias($temp_sreg_uri, 'sreg')); + $message = Auth_OpenID_Message::fromPostArgs($query); $resp = new Auth_OpenID_SuccessResponse($this->endpoint, $message); $utargs = $resp->extensionResponse($uri, false); $this->assertEquals($utargs, array('one' => '1', 'two' => '2')); - $sregargs = $resp->extensionResponse(Auth_OpenID_SREG_URI, false); + $sregargs = $resp->extensionResponse($temp_sreg_uri, false); $this->assertEquals($sregargs, array('nickname' => 'j3h')); } diff --git a/Tests/Auth/OpenID/Message.php b/Tests/Auth/OpenID/Message.php index d95f17e..cd26c52 100644 --- a/Tests/Auth/OpenID/Message.php +++ b/Tests/Auth/OpenID/Message.php @@ -126,7 +126,7 @@ class Tests_Auth_OpenID_EmptyMessage extends MessageTest { function test_getArgs() { - $this->assertEquals($this->msg->getArgs(Auth_OpenID_OPENID_NS), null); + $this->assertEquals($this->msg->getArgs(Auth_OpenID_OPENID_NS), array()); } function test_getArgsBARE() |