forked from GNUsocial/gnu-social
		
	
		
			
	
	
		
			347 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			347 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | 
 | ||
|  | require_once "Tests/Auth/OpenID/TestUtil.php"; | ||
|  | require_once "Tests/Auth/OpenID/MemStore.php"; | ||
|  | 
 | ||
|  | require_once "Auth/OpenID/Message.php"; | ||
|  | require_once "Auth/OpenID/Consumer.php"; | ||
|  | 
 | ||
|  | /** | ||
|  |  * A consumer whose _requestAssocation will return predefined results | ||
|  |  * instead of trying to actually perform association requests. | ||
|  |  */ | ||
|  | class ErrorRaisingConsumer extends Auth_OpenID_GenericConsumer { | ||
|  |     // The list of objects to be returned by successive calls to
 | ||
|  |     // _requestAssocation.  Each call will pop the first element from
 | ||
|  |     // this list and return it to _negotiateAssociation.  If the
 | ||
|  |     // element is a Message object, it will be wrapped in a
 | ||
|  |     // ServerErrorContainer exception.  Otherwise it will be returned
 | ||
|  |     // as-is.
 | ||
|  |     var $return_messages = array(); | ||
|  | 
 | ||
|  |     function _requestAssociation($endpoint, $assoc_type, $session_type) | ||
|  |     { | ||
|  |         $m = array_pop($this->return_messages); | ||
|  |         if (is_a($m, 'Auth_OpenID_Message')) { | ||
|  |             return Auth_OpenID_ServerErrorContainer::fromMessage($m); | ||
|  |         } else if (Auth_OpenID::isFailure($m)) { | ||
|  |             return $m; | ||
|  |         } else { | ||
|  |             return $m; | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Test the session type negotiation behavior of an OpenID 2 consumer. | ||
|  |  */ | ||
|  | class TestOpenID2SessionNegotiation extends PHPUnit_Framework_TestCase { | ||
|  |     function setUp() | ||
|  |     { | ||
|  |         $dumb = null; | ||
|  |         $this->consumer = new ErrorRaisingConsumer($dumb); | ||
|  |         $this->endpoint = new Auth_OpenID_ServiceEndpoint(); | ||
|  |         $this->endpoint->type_uris = array(Auth_OpenID_TYPE_2_0); | ||
|  |         $this->endpoint->server_url = 'bogus'; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Test the case where the response to an associate request is a | ||
|  |      * server error or is otherwise undecipherable. | ||
|  |      */ | ||
|  |     function testBadResponse() | ||
|  |     { | ||
|  |         $this->consumer->return_messages = array( | ||
|  |            new Auth_OpenID_Message($this->endpoint->preferredNamespace())); | ||
|  |         $this->assertEquals($this->consumer->_negotiateAssociation($this->endpoint), null); | ||
|  |         // $this->failUnlessLogMatches('Server error when requesting an association')
 | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Test the case where the response to an associate request is a | ||
|  |      * a failure response object. | ||
|  |      */ | ||
|  |     function testBadResponseWithFailure() | ||
|  |     { | ||
|  |         $this->consumer->return_messages = array( | ||
|  |              new Auth_OpenID_FailureResponse($this->endpoint)); | ||
|  |         $this->assertEquals($this->consumer->_negotiateAssociation($this->endpoint), null); | ||
|  |         // $this->failUnlessLogMatches('Server error when requesting an association')
 | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Test the case where the association type (assoc_type) returned | ||
|  |      * in an unsupported-type response is absent. | ||
|  |      */ | ||
|  |     function testEmptyAssocType() | ||
|  |     { | ||
|  |         $msg = new Auth_OpenID_Message($this->endpoint->preferredNamespace()); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error', 'Unsupported type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error_code', 'unsupported-type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'assoc_type', null); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'session_type', 'new-session-type'); | ||
|  | 
 | ||
|  |         $this->consumer->return_messages = array($msg); | ||
|  |         $this->assertEquals($this->consumer->_negotiateAssociation($this->endpoint), null); | ||
|  | 
 | ||
|  |         // $this->failUnlessLogMatches('Unsupported association type',
 | ||
|  |         //                           'Server responded with unsupported association ' +
 | ||
|  |         //                           'session but did not supply a fallback.')
 | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Test the case where the session type (session_type) returned in | ||
|  |      * an unsupported-type response is absent. | ||
|  |      */ | ||
|  |     function testEmptySessionType() | ||
|  |     { | ||
|  |         $msg = new Auth_OpenID_Message($this->endpoint->preferredNamespace()); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error', 'Unsupported type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error_code', 'unsupported-type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'assoc_type', 'new-assoc-type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'session_type', null); | ||
|  | 
 | ||
|  |         $this->consumer->return_messages = array($msg); | ||
|  |         $this->assertEquals($this->consumer->_negotiateAssociation($this->endpoint), null); | ||
|  | 
 | ||
|  |         // $this->failUnlessLogMatches('Unsupported association type',
 | ||
|  |         //                           'Server responded with unsupported association ' +
 | ||
|  |         //                           'session but did not supply a fallback.')
 | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Test the case where an unsupported-type response specifies a | ||
|  |      * preferred (assoc_type, session_type) combination that is not | ||
|  |      * allowed by the consumer's SessionNegotiator. | ||
|  |      */ | ||
|  |     function testNotAllowed() | ||
|  |     { | ||
|  |         $allowed_types = array(); | ||
|  | 
 | ||
|  |         $negotiator = new Auth_OpenID_SessionNegotiator($allowed_types); | ||
|  |         $this->consumer->negotiator = $negotiator; | ||
|  | 
 | ||
|  |         $msg = new Auth_OpenID_Message($this->endpoint->preferredNamespace()); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error', 'Unsupported type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error_code', 'unsupported-type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'assoc_type', 'not-allowed'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'session_type', 'not-allowed'); | ||
|  | 
 | ||
|  |         $this->consumer->return_messages = array($msg); | ||
|  |         $this->assertEquals($this->consumer->_negotiateAssociation($this->endpoint), null); | ||
|  | 
 | ||
|  |         // $this->failUnlessLogMatches('Unsupported association type',
 | ||
|  |         //                       'Server sent unsupported session/association type:')
 | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Test the case where an unsupported-type response triggers a | ||
|  |      * retry to get an association with the new preferred type. | ||
|  |      */ | ||
|  |     function testUnsupportedWithRetry() | ||
|  |     { | ||
|  |         $msg = new Auth_OpenID_Message($this->endpoint->preferredNamespace()); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error', 'Unsupported type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error_code', 'unsupported-type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'assoc_type', 'HMAC-SHA1'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'session_type', 'DH-SHA1'); | ||
|  | 
 | ||
|  |         $assoc = new Auth_OpenID_Association( | ||
|  |                    'handle', 'secret', 'issued', 10000, 'HMAC-SHA1'); | ||
|  | 
 | ||
|  |         $this->consumer->return_messages = array($msg, $assoc); | ||
|  |         $this->assertTrue($this->consumer->_negotiateAssociation($this->endpoint) === $assoc); | ||
|  | 
 | ||
|  |         // $this->failUnlessLogMatches('Unsupported association type');
 | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Test the case where an unsupported-typ response triggers a | ||
|  |      * retry, but the retry fails and None is returned instead. | ||
|  |      */ | ||
|  |     function testUnsupportedWithRetryAndFail() | ||
|  |     { | ||
|  |         $msg = new Auth_OpenID_Message($this->endpoint->preferredNamespace()); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error', 'Unsupported type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error_code', 'unsupported-type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'assoc_type', 'HMAC-SHA1'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'session_type', 'DH-SHA1'); | ||
|  | 
 | ||
|  |         $this->consumer->return_messages = array($msg, | ||
|  |            new Auth_OpenID_Message($this->endpoint->preferredNamespace())); | ||
|  | 
 | ||
|  |         $this->assertEquals($this->consumer->_negotiateAssociation($this->endpoint), null); | ||
|  | 
 | ||
|  |         // $this->failUnlessLogMatches('Unsupported association type',
 | ||
|  |         //                           'Server %s refused' % ($this->endpoint.server_url))
 | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Test the valid case, wherein an association is returned on the | ||
|  |      * first attempt to get one. | ||
|  |      */ | ||
|  |     function testValid() | ||
|  |     { | ||
|  |         $assoc = new Auth_OpenID_Association( | ||
|  |                    'handle', 'secret', 'issued', 10000, 'HMAC-SHA1'); | ||
|  | 
 | ||
|  |         $this->consumer->return_messages = array($assoc); | ||
|  |         $this->assertTrue($this->consumer->_negotiateAssociation($this->endpoint) === $assoc); | ||
|  |         // $this->failUnlessLogEmpty()
 | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Tests for the OpenID 1 consumer association session behavior.  See | ||
|  |  * the docs for TestOpenID2SessionNegotiation.  Notice that this class | ||
|  |  * is not a subclass of the OpenID 2 tests.  Instead, it uses many of | ||
|  |  * the same inputs but inspects the log messages logged with | ||
|  |  * oidutil.log.  See the calls to $this->failUnlessLogMatches.  Some | ||
|  |  * of these tests pass openid2-style messages to the openid 1 | ||
|  |  * association processing logic to be sure it ignores the extra data. | ||
|  |  */ | ||
|  | class TestOpenID1SessionNegotiation extends PHPUnit_Framework_TestCase { | ||
|  |     function setUp() | ||
|  |     { | ||
|  |         $dumb = null; | ||
|  |         $this->consumer = new ErrorRaisingConsumer($dumb); | ||
|  | 
 | ||
|  |         $this->endpoint = new Auth_OpenID_ServiceEndpoint(); | ||
|  |         $this->endpoint->type_uris = array(Auth_OpenID_OPENID1_NS); | ||
|  |         $this->endpoint->server_url = 'bogus'; | ||
|  |     } | ||
|  | 
 | ||
|  |     function testBadResponse() | ||
|  |     { | ||
|  |         $this->consumer->return_messages = | ||
|  |             array(new Auth_OpenID_Message($this->endpoint->preferredNamespace())); | ||
|  |         $this->assertEquals($this->consumer->_negotiateAssociation($this->endpoint), null); | ||
|  |         // $this->failUnlessLogMatches('Server error when requesting an association')
 | ||
|  |     } | ||
|  | 
 | ||
|  |     function testEmptyAssocType() | ||
|  |     { | ||
|  |         $msg = new Auth_OpenID_Message($this->endpoint->preferredNamespace()); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error', 'Unsupported type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error_code', 'unsupported-type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'assoc_type', null); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'session_type', 'new-session-type'); | ||
|  | 
 | ||
|  |         $this->consumer->return_messages = array($msg); | ||
|  |         $this->assertEquals($this->consumer->_negotiateAssociation($this->endpoint), null); | ||
|  | 
 | ||
|  |         // $this->failUnlessLogMatches('Server error when requesting an association')
 | ||
|  |     } | ||
|  | 
 | ||
|  |     function testEmptySessionType() | ||
|  |     { | ||
|  |         $msg = new Auth_OpenID_Message($this->endpoint->preferredNamespace()); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error', 'Unsupported type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error_code', 'unsupported-type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'assoc_type', 'new-assoc-type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'session_type', null); | ||
|  | 
 | ||
|  |         $this->consumer->return_messages = array($msg); | ||
|  |         $this->assertEquals($this->consumer->_negotiateAssociation($this->endpoint), null); | ||
|  | 
 | ||
|  |         // $this->failUnlessLogMatches('Server error when requesting an association');
 | ||
|  |     } | ||
|  | 
 | ||
|  |     function testNotAllowed() | ||
|  |     { | ||
|  |         $allowed_types = array(); | ||
|  | 
 | ||
|  |         $negotiator = new Auth_OpenID_SessionNegotiator($allowed_types); | ||
|  |         $this->consumer->negotiator = $negotiator; | ||
|  | 
 | ||
|  |         $msg = new Auth_OpenID_Message($this->endpoint->preferredNamespace()); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error', 'Unsupported type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error_code', 'unsupported-type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'assoc_type', 'not-allowed'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'session_type', 'not-allowed'); | ||
|  | 
 | ||
|  |         $this->consumer->return_messages = array($msg); | ||
|  |         $this->assertEquals($this->consumer->_negotiateAssociation($this->endpoint), null); | ||
|  | 
 | ||
|  |         // $this->failUnlessLogMatches('Server error when requesting an association')
 | ||
|  |     } | ||
|  | 
 | ||
|  |     function testUnsupportedWithRetry() | ||
|  |     { | ||
|  |         $msg = new Auth_OpenID_Message($this->endpoint->preferredNamespace()); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error', 'Unsupported type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'error_code', 'unsupported-type'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'assoc_type', 'HMAC-SHA1'); | ||
|  |         $msg->setArg(Auth_OpenID_OPENID_NS, 'session_type', 'DH-SHA1'); | ||
|  | 
 | ||
|  |         $assoc = new Auth_OpenID_Association( | ||
|  |                    'handle', 'secretxx', 'issued', 10000, 'HMAC-SHA1'); | ||
|  | 
 | ||
|  |         $this->consumer->return_messages = array($assoc, $msg); | ||
|  | 
 | ||
|  |         $result = $this->consumer->_negotiateAssociation($this->endpoint); | ||
|  |         $this->assertTrue($result === null); | ||
|  | 
 | ||
|  |         // $this->failUnlessLogMatches('Server error when requesting an association')
 | ||
|  |     } | ||
|  | 
 | ||
|  |     function testValid() | ||
|  |     { | ||
|  |         $assoc = new Auth_OpenID_Association( | ||
|  |                    'handle', 'secret', 'issued', 10000, 'HMAC-SHA1'); | ||
|  | 
 | ||
|  |         $this->consumer->return_messages = array($assoc); | ||
|  |         $this->assertTrue($this->consumer->_negotiateAssociation($this->endpoint) === $assoc); | ||
|  |         // $this->failUnlessLogEmpty()
 | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | class TestNegotiatorBehaviors extends PHPUnit_Framework_TestCase { | ||
|  |     function setUp() | ||
|  |     { | ||
|  |         $this->allowed_types = array( | ||
|  |                                      array('HMAC-SHA1', 'no-encryption'), | ||
|  |                                      array('HMAC-SHA256', 'no-encryption') | ||
|  |                                      ); | ||
|  | 
 | ||
|  |         $this->n = new Auth_OpenID_SessionNegotiator($this->allowed_types); | ||
|  |     } | ||
|  | 
 | ||
|  |     function testAddAllowedTypeNoSessionTypes() | ||
|  |     { | ||
|  |         $this->assertFalse($this->n->addAllowedType('invalid')); | ||
|  |     } | ||
|  | 
 | ||
|  |     function testAddAllowedTypeBadSessionType() | ||
|  |     { | ||
|  |         $this->assertFalse($this->n->addAllowedType('assoc1', 'invalid')); | ||
|  |     } | ||
|  | 
 | ||
|  |     function testAddAllowedTypeContents() | ||
|  |     { | ||
|  |         $assoc_type = 'HMAC-SHA1'; | ||
|  |         $this->assertTrue($this->n->addAllowedType($assoc_type)); | ||
|  | 
 | ||
|  |         foreach (Auth_OpenID_getSessionTypes($assoc_type) as $typ) { | ||
|  |             $this->assertTrue(in_array(array($assoc_type, $typ), | ||
|  |                                        $this->n->allowed_types)); | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | class Tests_Auth_OpenID_Negotiation extends PHPUnit_Framework_TestSuite { | ||
|  | 
 | ||
|  |     function getName() | ||
|  |     { | ||
|  |         return 'Tests_Auth_OpenID_Negotiation'; | ||
|  |     } | ||
|  | 
 | ||
|  |     function Tests_Auth_OpenID_Negotiation() | ||
|  |     { | ||
|  |         $this->addTestSuite('TestNegotiatorBehaviors'); | ||
|  |         $this->addTestSuite('TestOpenID1SessionNegotiation'); | ||
|  |         $this->addTestSuite('TestOpenID2SessionNegotiation'); | ||
|  |     } | ||
|  | } | ||
|  | 
 |