forked from GNUsocial/gnu-social
		
	
		
			
	
	
		
			229 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			229 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | 
 | ||
|  | /** | ||
|  |  * Tests for the combination of Yadis discovery and the OpenID | ||
|  |  * protocol. | ||
|  |  */ | ||
|  | 
 | ||
|  | require_once "Auth/Yadis/XRDS.php"; | ||
|  | require_once "Auth/OpenID/Discover.php"; | ||
|  | 
 | ||
|  | global $__XRDS_BOILERPLATE; | ||
|  | $__XRDS_BOILERPLATE = '<?xml version="1.0" encoding="UTF-8"?>
 | ||
|  | <xrds:XRDS xmlns:xrds="xri://$xrds" | ||
|  |            xmlns="xri://$xrd*($v*2.0)" | ||
|  |            xmlns:openid="http://openid.net/xmlns/1.0"> | ||
|  |     <XRD> | ||
|  | %s | ||
|  |     </XRD> | ||
|  | </xrds:XRDS> | ||
|  | '; | ||
|  | 
 | ||
|  | // Different sets of server URLs for use in the URI tag
 | ||
|  | global $__server_url_options; | ||
|  | $__server_url_options = array( | ||
|  |            array(), // This case should not generate an endpoint object
 | ||
|  |            array('http://server.url/'), | ||
|  |            array('https://server.url/'), | ||
|  |            array('https://server.url/', 'http://server.url/'), | ||
|  |            array('https://server.url/', | ||
|  |                  'http://server.url/', | ||
|  |                  'http://example.server.url/'), | ||
|  |            ); | ||
|  | 
 | ||
|  | // A couple of example extension type URIs. These are not at all
 | ||
|  | // official, but are just here for testing.
 | ||
|  | global $__ext_types; | ||
|  | $__ext_types = array( | ||
|  |                      'http://janrain.com/extension/blah', | ||
|  |                      'http://openid.net/sreg/1.0'); | ||
|  | 
 | ||
|  | // All valid combinations of Type tags that should produce an OpenID
 | ||
|  | // endpoint
 | ||
|  | global $__openid_types; | ||
|  | $__openid_types = array( | ||
|  |                         Auth_OpenID_TYPE_1_0, | ||
|  |                         Auth_OpenID_TYPE_1_1); | ||
|  | 
 | ||
|  | $temp = array(); | ||
|  | foreach (__subsets($__ext_types) as $exts) { | ||
|  |     foreach (__subsets($__openid_types) as $ts) { | ||
|  |         if ($ts) { | ||
|  |             $temp[] = array_merge($exts, $ts); | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | global $__type_uri_options; | ||
|  | $__type_uri_options = $temp; | ||
|  | 
 | ||
|  | // Range of valid Delegate tag values for generating test data
 | ||
|  | global $__delegate_options; | ||
|  | $__delegate_options = array( | ||
|  |                             null, | ||
|  |                             'http://vanity.domain/', | ||
|  |                             'https://somewhere/yadis/'); | ||
|  | 
 | ||
|  | $temp = array(); | ||
|  | foreach ($__delegate_options as $delegate) { | ||
|  |     foreach ($__type_uri_options as $type_uris) { | ||
|  |         foreach ($__server_url_options as $uris) { | ||
|  |             $temp[] = array($uris, $type_uris, $delegate); | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | // All combinations of valid URIs, Type URIs and Delegate tags
 | ||
|  | global $__data; | ||
|  | $__data = $temp; | ||
|  | 
 | ||
|  | function _mkXRDS($services_str) | ||
|  | { | ||
|  |     global $__XRDS_BOILERPLATE; | ||
|  |     return sprintf($__XRDS_BOILERPLATE, $services_str); | ||
|  | } | ||
|  | 
 | ||
|  | function _mkService($uris = null, $type_uris = null, | ||
|  |                     $delegate = null, $dent = '        ') | ||
|  | { | ||
|  |     $chunks = array($dent, "<Service>\n"); | ||
|  |     $dent2 = $dent . '    '; | ||
|  |     if ($type_uris) { | ||
|  |         foreach ($type_uris as $type_uri) { | ||
|  |             $chunks = array_merge($chunks, | ||
|  |                                   array($dent2 . '<Type>', | ||
|  |                                         $type_uri, "</Type>\n")); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     if ($uris) { | ||
|  |         foreach ($uris as $uri) { | ||
|  |             if (is_array($uri)) { | ||
|  |                 list($uri, $prio) = $uri; | ||
|  |             } else { | ||
|  |                 $prio = null; | ||
|  |             } | ||
|  |             $chunks = array_merge($chunks, array($dent2, '<URI')); | ||
|  |             if ($prio !== null) { | ||
|  |                     $chunks = array_merge($chunks, array(' priority="', strval($prio), '"')); | ||
|  |             } | ||
|  |             $chunks = array_merge($chunks, array('>', $uri, "</URI>\n")); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     if ($delegate) { | ||
|  |         $chunks = array_merge($chunks, | ||
|  |                               array($dent2, '<openid:Delegate>', | ||
|  |                                     $delegate, "</openid:Delegate>\n")); | ||
|  |     } | ||
|  | 
 | ||
|  |     $chunks = array_merge($chunks, array($dent, "</Service>\n")); | ||
|  | 
 | ||
|  |     return implode("", $chunks); | ||
|  | } | ||
|  | 
 | ||
|  | // Used for generating test data
 | ||
|  | function __subsets($list) | ||
|  | { | ||
|  |     // Generate all non-empty sublists of a list
 | ||
|  |     $subsets_list = array(array()); | ||
|  |     foreach ($list as $elem) { | ||
|  | 
 | ||
|  |         $temp = array(); | ||
|  |         foreach ($subsets_list as $t) { | ||
|  |             $temp[] = array_merge(array($elem), $t); | ||
|  |         } | ||
|  | 
 | ||
|  |         $subsets_list = array_merge($subsets_list, $temp); | ||
|  |     } | ||
|  | 
 | ||
|  |     return $subsets_list; | ||
|  | } | ||
|  | 
 | ||
|  | class Tests_Auth_OpenID_Tester extends PHPUnit_Framework_TestCase { | ||
|  |     function Tests_Auth_OpenID_Tester($uris, $type_uris, $delegate) | ||
|  |     { | ||
|  |         parent::__construct(); | ||
|  |         $this->uris = $uris; | ||
|  |         $this->type_uris = $type_uris; | ||
|  |         $this->local_id = $delegate; | ||
|  |     } | ||
|  | 
 | ||
|  |     function setUp() | ||
|  |     { | ||
|  |         $this->yadis_url = 'http://unit.test/'; | ||
|  | 
 | ||
|  |         // Create an XRDS document to parse
 | ||
|  |         $services = _mkService($this->uris, | ||
|  |                                $this->type_uris, | ||
|  |                                $this->local_id); | ||
|  |         $this->xrds = _mkXRDS($services); | ||
|  |     } | ||
|  | 
 | ||
|  |     function runTest() | ||
|  |     { | ||
|  |         // Parse into endpoint objects that we will check
 | ||
|  |         $xrds_object = Auth_Yadis_XRDS::parseXRDS($this->xrds); | ||
|  | 
 | ||
|  |         $endpoints = array(); | ||
|  | 
 | ||
|  |         if ($xrds_object) { | ||
|  |             $endpoints = $xrds_object->services(array('filter_MatchesAnyOpenIDType')); | ||
|  |             $endpoints = Auth_OpenID_makeOpenIDEndpoints($this->yadis_url, $endpoints); | ||
|  |         } | ||
|  | 
 | ||
|  |         // make sure there are the same number of endpoints as
 | ||
|  |         // URIs. This assumes that the type_uris contains at least one
 | ||
|  |         // OpenID type.
 | ||
|  |         $this->assertEquals(count($this->uris), count($endpoints), | ||
|  |                             "URI <-> Endpoint count"); | ||
|  | 
 | ||
|  |         // So that we can check equality on the endpoint types
 | ||
|  |         $type_uris = $this->type_uris; | ||
|  |         sort($type_uris); | ||
|  | 
 | ||
|  | 
 | ||
|  |         $seen_uris = array(); | ||
|  |         foreach ($endpoints as $endpoint) { | ||
|  |             $seen_uris[] = $endpoint->server_url; | ||
|  | 
 | ||
|  |             // All endpoints will have same yadis_url
 | ||
|  |             $this->assertEquals($this->yadis_url, $endpoint->claimed_id); | ||
|  | 
 | ||
|  |             // and delegate
 | ||
|  |             $this->assertEquals($this->local_id, $endpoint->local_id); | ||
|  | 
 | ||
|  |             // and types
 | ||
|  |             $actual_types = $endpoint->type_uris; | ||
|  |             sort($actual_types); | ||
|  |             $this->assertEquals($actual_types, $type_uris); | ||
|  |         } | ||
|  | 
 | ||
|  |         // So that they will compare equal, because we don't care what
 | ||
|  |         // order they are in
 | ||
|  |         sort($seen_uris); | ||
|  |         $uris = $this->uris; | ||
|  |         sort($uris); | ||
|  | 
 | ||
|  |         // Make sure we saw all URIs, and saw each one once
 | ||
|  |         $this->assertEquals($uris, $seen_uris); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | class Tests_Auth_OpenID_OpenID_Yadis extends PHPUnit_Framework_TestSuite { | ||
|  |     function Tests_Auth_OpenID_OpenID_Yadis() | ||
|  |     { | ||
|  |         global $__data; | ||
|  |         foreach ($__data as $case) { | ||
|  |             $this->addTest(new Tests_Auth_OpenID_Tester($case[0], $case[1], $case[2])); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     function getName() | ||
|  |     { | ||
|  |         return 'Tests_Auth_OpenID_OpenID_Yadis'; | ||
|  |     } | ||
|  | 
 | ||
|  | } | ||
|  | 
 |