294 lines
8.1 KiB
PHP
294 lines
8.1 KiB
PHP
|
<?php
|
||
|
|
||
|
/*
|
||
|
* Unit tests for verification of return_to URLs for a realm.
|
||
|
*/
|
||
|
|
||
|
require_once 'Auth/OpenID/Discover.php';
|
||
|
require_once 'Auth/OpenID/TrustRoot.php';
|
||
|
|
||
|
require_once 'Auth/Yadis/Yadis.php';
|
||
|
|
||
|
/*
|
||
|
* Tests for building the discovery URL from a realm and a return_to
|
||
|
* URL
|
||
|
*/
|
||
|
class Tests_Auth_OpenID_BuildDiscoveryURL extends PHPUnit_Framework_TestCase {
|
||
|
/*
|
||
|
* Build a discovery URL out of the realm and a return_to and make
|
||
|
* sure that it matches the expected discovery URL
|
||
|
*/
|
||
|
function failUnlessDiscoURL($realm, $expected_discovery_url)
|
||
|
{
|
||
|
$actual_discovery_url = Auth_OpenID_TrustRoot::buildDiscoveryURL($realm);
|
||
|
$this->assertEquals($expected_discovery_url, $actual_discovery_url);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* There is no wildcard and the realm is the same as the return_to
|
||
|
* URL
|
||
|
*/
|
||
|
function test_trivial()
|
||
|
{
|
||
|
$this->failUnlessDiscoURL('http://example.com/foo',
|
||
|
'http://example.com/foo');
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* There is a wildcard
|
||
|
*/
|
||
|
function test_wildcard()
|
||
|
{
|
||
|
$this->failUnlessDiscoURL('http://*.example.com/foo',
|
||
|
'http://www.example.com/foo');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class _MockDiscover {
|
||
|
function _MockDiscover($data) {
|
||
|
$this->data =& $data;
|
||
|
}
|
||
|
|
||
|
function mockDiscover($uri, $fetcher, $discover_function=null)
|
||
|
{
|
||
|
$result = new Auth_Yadis_DiscoveryResult($uri);
|
||
|
$result->response_text = $this->data;
|
||
|
$result->normalized_uri = $uri;
|
||
|
return $result;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class Tests_Auth_OpenID_ExtractReturnToURLs extends PHPUnit_Framework_TestCase {
|
||
|
var $disco_url = 'http://example.com/';
|
||
|
|
||
|
function failUnlessXRDSHasReturnURLs($data, $expected_return_urls)
|
||
|
{
|
||
|
$discover_object = new _MockDiscover($data);
|
||
|
$actual_return_urls = Auth_OpenID_getAllowedReturnURLs($this->disco_url, null, array($discover_object, 'mockDiscover'));
|
||
|
|
||
|
$this->assertEquals($expected_return_urls, $actual_return_urls);
|
||
|
}
|
||
|
|
||
|
function failUnlessDiscoveryFailure($text)
|
||
|
{
|
||
|
$discover_object = new _MockDiscover($text);
|
||
|
$this->assertFalse(Auth_OpenID_getAllowedReturnURLs($this->disco_url, null, array($discover_object, 'mockDiscover')));
|
||
|
}
|
||
|
|
||
|
function test_empty()
|
||
|
{
|
||
|
$this->failUnlessDiscoveryFailure('');
|
||
|
}
|
||
|
|
||
|
function test_badXML()
|
||
|
{
|
||
|
$this->failUnlessDiscoveryFailure('>');
|
||
|
}
|
||
|
|
||
|
function test_noEntries()
|
||
|
{
|
||
|
$this->failUnlessXRDSHasReturnURLs('<?xml version="1.0" encoding="UTF-8"?>
|
||
|
<xrds:XRDS xmlns:xrds="xri://$xrds"
|
||
|
xmlns="xri://$xrd*($v*2.0)"
|
||
|
>
|
||
|
<XRD>
|
||
|
</XRD>
|
||
|
</xrds:XRDS>
|
||
|
', array());
|
||
|
}
|
||
|
|
||
|
function test_noReturnToEntries()
|
||
|
{
|
||
|
$this->failUnlessXRDSHasReturnURLs('<?xml version="1.0" encoding="UTF-8"?>
|
||
|
<xrds:XRDS xmlns:xrds="xri://$xrds"
|
||
|
xmlns="xri://$xrd*($v*2.0)"
|
||
|
>
|
||
|
<XRD>
|
||
|
<Service priority="10">
|
||
|
<Type>http://specs.openid.net/auth/2.0/server</Type>
|
||
|
<URI>http://www.myopenid.com/server</URI>
|
||
|
</Service>
|
||
|
</XRD>
|
||
|
</xrds:XRDS>
|
||
|
', array());
|
||
|
}
|
||
|
|
||
|
function test_oneEntry()
|
||
|
{
|
||
|
$this->failUnlessXRDSHasReturnURLs('<?xml version="1.0" encoding="UTF-8"?>
|
||
|
<xrds:XRDS xmlns:xrds="xri://$xrds"
|
||
|
xmlns="xri://$xrd*($v*2.0)"
|
||
|
>
|
||
|
<XRD>
|
||
|
<Service>
|
||
|
<Type>http://specs.openid.net/auth/2.0/return_to</Type>
|
||
|
<URI>http://rp.example.com/return</URI>
|
||
|
</Service>
|
||
|
</XRD>
|
||
|
</xrds:XRDS>
|
||
|
', array('http://rp.example.com/return'));
|
||
|
}
|
||
|
|
||
|
function test_twoEntries()
|
||
|
{
|
||
|
$this->failUnlessXRDSHasReturnURLs('<?xml version="1.0" encoding="UTF-8"?>
|
||
|
<xrds:XRDS xmlns:xrds="xri://$xrds"
|
||
|
xmlns="xri://$xrd*($v*2.0)"
|
||
|
>
|
||
|
<XRD>
|
||
|
<Service priority="0">
|
||
|
<Type>http://specs.openid.net/auth/2.0/return_to</Type>
|
||
|
<URI>http://rp.example.com/return</URI>
|
||
|
</Service>
|
||
|
<Service priority="1">
|
||
|
<Type>http://specs.openid.net/auth/2.0/return_to</Type>
|
||
|
<URI>http://other.rp.example.com/return</URI>
|
||
|
</Service>
|
||
|
</XRD>
|
||
|
</xrds:XRDS>
|
||
|
', array('http://rp.example.com/return',
|
||
|
'http://other.rp.example.com/return'));
|
||
|
}
|
||
|
|
||
|
function test_twoEntries_withOther()
|
||
|
{
|
||
|
$this->failUnlessXRDSHasReturnURLs('<?xml version="1.0" encoding="UTF-8"?>
|
||
|
<xrds:XRDS xmlns:xrds="xri://$xrds"
|
||
|
xmlns="xri://$xrd*($v*2.0)"
|
||
|
>
|
||
|
<XRD>
|
||
|
<Service priority="0">
|
||
|
<Type>http://specs.openid.net/auth/2.0/return_to</Type>
|
||
|
<URI>http://rp.example.com/return</URI>
|
||
|
</Service>
|
||
|
<Service priority="1">
|
||
|
<Type>http://specs.openid.net/auth/2.0/return_to</Type>
|
||
|
<URI>http://other.rp.example.com/return</URI>
|
||
|
</Service>
|
||
|
<Service priority="0">
|
||
|
<Type>http://example.com/LOLCATS</Type>
|
||
|
<URI>http://example.com/invisible+uri</URI>
|
||
|
</Service>
|
||
|
</XRD>
|
||
|
</xrds:XRDS>
|
||
|
', array('http://rp.example.com/return',
|
||
|
'http://other.rp.example.com/return'));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class Tests_Auth_OpenID_ReturnToMatches extends PHPUnit_Framework_TestCase {
|
||
|
function test_noEntries()
|
||
|
{
|
||
|
$this->assertFalse(Auth_OpenID_returnToMatches(array(), 'anything'));
|
||
|
}
|
||
|
|
||
|
function test_exactMatch()
|
||
|
{
|
||
|
$r = 'http://example.com/return.to';
|
||
|
$this->assertTrue(Auth_OpenID_returnToMatches(array($r), $r));
|
||
|
}
|
||
|
|
||
|
function test_garbageMatch()
|
||
|
{
|
||
|
$r = 'http://example.com/return.to';
|
||
|
$this->assertTrue(Auth_OpenID_returnToMatches(
|
||
|
array('This is not a URL at all. In fact, it has characters, ' .
|
||
|
'like "<" that are not allowed in URLs', $r), $r));
|
||
|
}
|
||
|
|
||
|
function test_descendant()
|
||
|
{
|
||
|
$r = 'http://example.com/return.to';
|
||
|
$this->assertTrue(Auth_OpenID_returnToMatches(array($r),
|
||
|
'http://example.com/return.to/user:joe'));
|
||
|
}
|
||
|
|
||
|
function test_wildcard()
|
||
|
{
|
||
|
$this->assertFalse(Auth_OpenID_returnToMatches(
|
||
|
array('http://*.example.com/return.to'),
|
||
|
'http://example.com/return.to'));
|
||
|
}
|
||
|
|
||
|
function test_noMatch()
|
||
|
{
|
||
|
$r = 'http://example.com/return.to';
|
||
|
$this->assertFalse(Auth_OpenID_returnToMatches(array($r),
|
||
|
'http://example.com/xss_exploit'));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class Verifier {
|
||
|
function Verifier($test_case, $return_to)
|
||
|
{
|
||
|
$this->tc =& $test_case;
|
||
|
$this->return_to = $return_to;
|
||
|
}
|
||
|
|
||
|
function verify($disco_url)
|
||
|
{
|
||
|
$this->tc->assertEquals('http://www.example.com/', $disco_url);
|
||
|
|
||
|
if ($this->return_to === false) {
|
||
|
return false;
|
||
|
} else {
|
||
|
return array($this->return_to);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class Tests_Auth_OpenID_VerifyReturnTo extends PHPUnit_Framework_TestCase {
|
||
|
|
||
|
function test_bogusRealm()
|
||
|
{
|
||
|
$this->assertFalse(Auth_OpenID_verifyReturnTo('', 'http://example.com/', null));
|
||
|
}
|
||
|
|
||
|
function test_verifyWithDiscoveryCalled()
|
||
|
{
|
||
|
$realm = 'http://*.example.com/';
|
||
|
$return_to = 'http://www.example.com/foo';
|
||
|
|
||
|
$v = new Verifier($this, $return_to);
|
||
|
|
||
|
$this->assertTrue(Auth_OpenID_verifyReturnTo($realm, $return_to, null, array($v, 'verify')));
|
||
|
}
|
||
|
|
||
|
function test_verifyFailWithDiscoveryCalled()
|
||
|
{
|
||
|
$realm = 'http://*.example.com/';
|
||
|
$return_to = 'http://www.example.com/foo';
|
||
|
|
||
|
$v = new Verifier($this, 'http://something-else.invalid/');
|
||
|
|
||
|
$this->assertFalse(Auth_OpenID_verifyReturnTo($realm, $return_to, null, array($v, 'verify')));
|
||
|
}
|
||
|
|
||
|
function test_verifyFailIfDiscoveryRedirects()
|
||
|
{
|
||
|
$realm = 'http://*.example.com/';
|
||
|
$return_to = 'http://www.example.com/foo';
|
||
|
|
||
|
$v = new Verifier($this, false);
|
||
|
|
||
|
$this->assertFalse(Auth_OpenID_verifyReturnTo($realm, $return_to, null, array($v, 'verify')));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class Tests_Auth_OpenID_RPVerify extends PHPUnit_Framework_TestSuite {
|
||
|
function getName()
|
||
|
{
|
||
|
return "Tests_Auth_OpenID_RPVerify";
|
||
|
}
|
||
|
|
||
|
function Tests_Auth_OpenID_RPVerify()
|
||
|
{
|
||
|
$this->addTestSuite('Tests_Auth_OpenID_VerifyReturnTo');
|
||
|
$this->addTestSuite('Tests_Auth_OpenID_ReturnToMatches');
|
||
|
$this->addTestSuite('Tests_Auth_OpenID_ExtractReturnToURLs');
|
||
|
$this->addTestSuite('Tests_Auth_OpenID_BuildDiscoveryURL');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|