2019-07-17 20:08:50 +00:00
< ? php
/*
* @ copyright Copyright ( C ) 2005 - 2009 Keyboard Monkeys Ltd . http :// www . kb - m . com
* @ license http :// creativecommons . org / licenses / BSD / BSD License
* @ author Keyboard Monkey Ltd
* @ since CommunityID 0.9
* @ package CommunityID
* @ packager Keyboard Monkeys
*/
require_once dirname ( __FILE__ ) . '/../../../TestHarness.php' ;
class OpenidControllerTests extends PHPUnit_Framework_TestCase
{
2019-07-17 20:19:00 +00:00
const USER_PASSWORD = 'secret' ;
const CHECKID_QUERY = 'openid.ns=http%%3A%%2F%%2Fspecs.openid.net%%2Fauth%%2F2.0&openid.mode=checkid_setup&openid.identity=http%%3A%%2F%%2Flocalhost%%2Fcommunityid%%2Fidentity%%2Ftestuser&openid.claimed_id=http%%3A%%2F%%2Flocalhost%%2Fcommunityid%%2Fidentity%%2Ftestuser&openid.assoc_handle=%s&openid.return_to=http%%3A%%2F%%2Fwww.example.com&openid.realm=http%%3A%%2F%%2Fwww.example.com' ;
2019-07-17 20:08:50 +00:00
private $_response ;
private $_tempDir ;
private $_user ;
// state isn't preserved accross test methods, so gotta use a static
public static $assocHandle ;
public function __construct ( $name = NULL , array $data = array (), $dataName = '' )
{
parent :: __construct ( $name , $data , $dataName );
$this -> _tempDir = APP_DIR . '/tests/temp' ;
}
public function setUp ()
{
TestHarness :: setUp ();
2019-07-17 20:16:19 +00:00
Application :: $front -> returnResponse ( true );
2019-07-17 20:08:50 +00:00
$this -> _response = new Zend_Controller_Response_Http ();
2019-07-17 20:19:00 +00:00
$this -> _response -> headersSentThrowsException = false ;
2019-07-17 20:16:19 +00:00
Application :: $front -> setResponse ( $this -> _response );
2019-07-17 20:08:50 +00:00
2019-07-17 20:16:19 +00:00
$users = new Users_Model_Users ();
2019-07-17 20:19:00 +00:00
$users -> deleteTestEntries ();
2019-07-17 20:08:50 +00:00
$this -> _user = $users -> createRow ();
$this -> _user -> test = 1 ;
$this -> _user -> username = 'testuser' ;
2019-07-17 20:16:19 +00:00
$this -> _user -> role = Users_Model_User :: ROLE_REGISTERED ;
2019-07-17 20:08:50 +00:00
$this -> _user -> openid = 'http://localhost/communityid/identity/' . $this -> _user -> username ;
2019-07-17 20:19:00 +00:00
$this -> _user -> setClearPassword ( self :: USER_PASSWORD );
2019-07-17 20:08:50 +00:00
$this -> _user -> accepted_eula = 1 ;
$this -> _user -> firstname = 'firstnametest' ;
$this -> _user -> lastname = 'lastnametest' ;
$this -> _user -> email = 'usertest@mailinator.com' ;
$this -> _user -> token = '' ;
$this -> _user -> save ();
Zend_Registry :: set ( 'user' , $this -> _user );
2019-07-17 20:19:00 +00:00
// php-openid lib sucks
$GLOBALS [ 'Auth_OpenID_registered_aliases' ] = array ();
$GLOBALS [ '_Auth_OpenID_Request_Modes' ] = array ( 'checkid_setup' , 'checkid_immediate' );
$GLOBALS [ 'Auth_OpenID_sreg_data_fields' ] = array (
'fullname' => 'Full Name' ,
'nickname' => 'Nickname' ,
'dob' => 'Date of Birth' ,
'email' => 'E-mail Address' ,
'gender' => 'Gender' ,
'postcode' => 'Postal Code' ,
'country' => 'Country' ,
'language' => 'Language' ,
'timezone' => 'Time Zone' );
2019-07-17 20:08:50 +00:00
}
public function testIndexAction ()
{
2019-07-17 20:16:19 +00:00
Application :: $front -> setRequest ( new TestRequest ( '/openid' ));
2019-07-17 20:19:00 +00:00
try {
Application :: dispatch ();
} catch ( Monkeys_BadUrlException $e ) {
$this -> assertTrue ( true );
return ;
}
$this -> fail ( 'Expected Monkeys_BadUrlException was not raised' );
2019-07-17 20:08:50 +00:00
}
public function testProviderAssociateAction ()
{
2019-07-17 20:19:00 +00:00
$_GET = array (
'openid.ns' => 'http://specs.openid.net/auth/2.0' ,
'openid.mode' => 'associate' ,
'openid.assoc_type' => 'HMAC-SHA256' ,
'openid.session_type' => 'DH-SHA256' ,
'openid.dh_modulus' => 'ANz5OguIOXLsDhmYmsWizjEOHTdxfo2Vcbt2I3MYZuYe91ouJ4mLBX+YkcLiemOcPym2CBRYHNOyyjmG0mg3BVd9RcLn5S3IHHoXGHblzqdLFEi/368Ygo79JRnxTkXjgmY0rxlJ5bU1zIKaSDuKdiI+XUkKJX8Fvf8W8vsixYOr' ,
'openid.dh_gen' => 'Ag==' ,
'openid.dh_consumer_public' => 'MFzHUMsSa4YSQ3JrcPSqyUaTQ3Z+QWKH6knvrREW7b6zQ2qMdOrpckgnUgo0pILMQpls8Ty/3JDv+IO29qASk2PwwZwxC2kXK/MQC/om5gs/IpjPSw1wK4bz2QTUHTRSxmtTxiq0tHYmIIqadz4TTMfXohMU2VCuYBqDNMHZFpk=' ,
2019-07-17 20:08:50 +00:00
);
2019-07-17 20:19:00 +00:00
$_SERVER [ 'REQUEST_METHOD' ] = 'GET' ;
$_SERVER [ 'QUERY_STRING' ] = http_build_query ( $_GET );
2019-07-17 20:08:50 +00:00
2019-07-17 20:16:19 +00:00
Application :: $front -> setRequest ( new TestRequest ( '/openid/provider' ));
Application :: dispatch ();
2019-07-17 20:08:50 +00:00
$this -> assertEquals (
preg_match (
" %
2019-07-17 20:19:00 +00:00
assoc_handle : ( \ { HMAC - SHA256\ } \ {[ a - f0 - 9 ] + \ } \ { .*== \ }) \\x0A
2019-07-17 20:08:50 +00:00
assoc_type : HMAC - SHA256\\x0A
dh_server_public :.* \\x0A
enc_mac_key :.* \\x0A
2019-07-17 20:19:00 +00:00
expires_in : \d + \\x0A
ns : http :// specs\ . openid\ . net / auth / 2 \ . 0 \\x0A
session_type : DH - SHA256\\x0A
2019-07-17 20:08:50 +00:00
% x " ,
$this -> _response -> getBody (),
$matches
),
1
);
2019-07-17 20:19:00 +00:00
self :: $assocHandle = urlencode ( $matches [ 1 ]);
2019-07-17 20:08:50 +00:00
}
public function testProviderCheckidSetupAction ()
{
2019-07-17 20:19:00 +00:00
Zend_Auth :: getInstance () -> clearIdentity ();
Zend_Registry :: getInstance () -> offsetUnset ( 'user' );
$_SERVER [ 'REQUEST_METHOD' ] = 'GET' ;
$_SERVER [ 'QUERY_STRING' ] = 'openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.mode=checkid_setup&openid.identity=http%3A%2F%2Flocalhost%2Fcommunityid%2Fidentity%2Ftestuser&openid.claimed_id=http%3A%2F%2Flocalhost%2Fcommunityid%2Fidentity%2Ftestuser&openid.assoc_handle=' . self :: $assocHandle . '&openid.return_to=http%3A%2F%2Fwww.example.com&openid.realm=http%3A%2F%2Fwww.example.com' ;
2019-07-17 20:08:50 +00:00
Zend_OpenId :: $exitOnRedirect = false ;
2019-07-17 20:19:00 +00:00
Application :: $front -> setRequest ( new TestRequest ( '/openid/provider?' . $_SERVER [ 'QUERY_STRING' ]));
2019-07-17 20:16:19 +00:00
Application :: dispatch ();
2019-07-17 20:08:50 +00:00
2019-07-17 20:19:00 +00:00
$this -> assertContains ( '<form action="authenticate?' . $_SERVER [ 'QUERY_STRING' ] . '" method="post" class="formGrid">' , $this -> _response -> getBody ());
2019-07-17 20:08:50 +00:00
}
public function testLoginAction ()
{
2019-07-17 20:19:00 +00:00
Zend_Auth :: getInstance () -> clearIdentity ();
Zend_Registry :: getInstance () -> offsetUnset ( 'user' );
$_SERVER [ 'REQUEST_METHOD' ] = 'GET' ;
2019-07-17 20:08:50 +00:00
$_SERVER [ 'QUERY_STRING' ] = sprintf ( self :: CHECKID_QUERY , self :: $assocHandle );
2019-07-17 20:16:19 +00:00
Application :: $front -> setRequest ( new TestRequest ( '/openid/login?' . $_SERVER [ 'QUERY_STRING' ]));
Application :: dispatch ();
2019-07-17 20:08:50 +00:00
2019-07-17 20:16:19 +00:00
$this -> assertContains ( '<form action="authenticate?' . $_SERVER [ 'QUERY_STRING' ] . '" method="post" class="formGrid">' , $this -> _response -> getBody ());
2019-07-17 20:08:50 +00:00
}
2019-07-17 20:19:00 +00:00
2019-07-17 20:08:50 +00:00
public function testAuthenticateEmptyUsernameAction ()
{
2019-07-17 20:19:00 +00:00
$_SERVER [ 'REQUEST_METHOD' ] = 'POST' ;
2019-07-17 20:08:50 +00:00
$_SERVER [ 'QUERY_STRING' ] = sprintf ( self :: CHECKID_QUERY , self :: $assocHandle );
$_POST = array (
'openIdIdentity' => '' ,
2019-07-17 20:19:00 +00:00
'password' => self :: USER_PASSWORD ,
2019-07-17 20:08:50 +00:00
);
2019-07-17 20:16:19 +00:00
Application :: $front -> setRequest ( new TestRequest ( '/openid/authenticate?' . $_SERVER [ 'QUERY_STRING' ]));
Application :: dispatch ();
2019-07-17 20:08:50 +00:00
2019-07-17 20:16:19 +00:00
$this -> assertContains ( 'Login' , $this -> _response -> getBody ());
2019-07-17 20:08:50 +00:00
}
public function testAuthenticateBadUsernameAction ()
{
2019-07-17 20:19:00 +00:00
$_SERVER [ 'REQUEST_METHOD' ] = 'POST' ;
2019-07-17 20:08:50 +00:00
$_SERVER [ 'QUERY_STRING' ] = sprintf ( self :: CHECKID_QUERY , self :: $assocHandle );
$_POST = array (
'openIdIdentity' => 'whateva' ,
'password' => 'whatevaagain' ,
);
2019-07-17 20:16:19 +00:00
Application :: $front -> setRequest ( new TestRequest ( '/openid/authenticate?' . $_SERVER [ 'QUERY_STRING' ]));
Application :: dispatch ();
2019-07-17 20:08:50 +00:00
2019-07-17 20:19:00 +00:00
$this -> assertContains ( 'Login' , $this -> _response -> getBody ());
2019-07-17 20:08:50 +00:00
}
public function testAuthenticateBadPasswordAction ()
{
2019-07-17 20:19:00 +00:00
$_SERVER [ 'REQUEST_METHOD' ] = 'POST' ;
2019-07-17 20:08:50 +00:00
$_SERVER [ 'QUERY_STRING' ] = sprintf ( self :: CHECKID_QUERY , self :: $assocHandle );
$_POST = array (
'openIdIdentity' => $this -> _user -> openid ,
2019-07-17 20:19:00 +00:00
'password' => 'badpassword' ,
2019-07-17 20:08:50 +00:00
);
2019-07-17 20:16:19 +00:00
Application :: $front -> setRequest ( new TestRequest ( '/openid/authenticate?' . $_SERVER [ 'QUERY_STRING' ]));
Application :: dispatch ();
2019-07-17 20:08:50 +00:00
2019-07-17 20:19:00 +00:00
$this -> assertContains ( 'Login' , $this -> _response -> getBody ());
2019-07-17 20:08:50 +00:00
}
public function testAuthenticateSuccessfulAction ()
{
2019-07-17 20:19:00 +00:00
Zend_Auth :: getInstance () -> clearIdentity ();
Zend_Registry :: getInstance () -> offsetUnset ( 'user' );
$_SERVER [ 'REQUEST_METHOD' ] = 'POST' ;
2019-07-17 20:08:50 +00:00
$_SERVER [ 'QUERY_STRING' ] = sprintf ( self :: CHECKID_QUERY , self :: $assocHandle );
$_POST = array (
'openIdIdentity' => $this -> _user -> openid ,
2019-07-17 20:19:00 +00:00
'password' => self :: USER_PASSWORD ,
2019-07-17 20:08:50 +00:00
);
2019-07-17 20:16:19 +00:00
Application :: $front -> setRequest ( new TestRequest ( '/openid/authenticate?' . $_SERVER [ 'QUERY_STRING' ]));
Application :: dispatch ();
2019-07-17 20:08:50 +00:00
2019-07-17 20:19:00 +00:00
$this -> assertContains (
'A site identifying as <a href="http://www.example.com">http://www.example.com</a> has asked for confirmation that <a href="' . $this -> _user -> openid . '">' . $this -> _user -> openid . '</a> is your identity URL.' ,
$this -> _response -> getBody ()
2019-07-17 20:08:50 +00:00
);
}
public function testTrustAction1 ()
{
2019-07-17 20:19:00 +00:00
$_SERVER [ 'REQUEST_METHOD' ] = 'GET' ;
2019-07-17 20:08:50 +00:00
$_SERVER [ 'QUERY_STRING' ] = sprintf ( self :: CHECKID_QUERY , self :: $assocHandle );
2019-07-17 20:16:19 +00:00
Application :: $front -> setRequest ( new TestRequest ( '/openid/provider?' . $_SERVER [ 'QUERY_STRING' ]));
Application :: dispatch ();
2019-07-17 20:08:50 +00:00
2019-07-17 20:19:00 +00:00
$this -> assertContains (
'A site identifying as <a href="http://www.example.com">http://www.example.com</a> has asked for confirmation that <a href="' . $this -> _user -> openid . '">' . $this -> _user -> openid . '</a> is your identity URL.' ,
$this -> _response -> getBody ()
2019-07-17 20:08:50 +00:00
);
}
public function testTrustAction2 ()
{
2019-07-17 20:19:00 +00:00
$_SERVER [ 'REQUEST_METHOD' ] = 'GET' ;
2019-07-17 20:08:50 +00:00
$_SERVER [ 'QUERY_STRING' ] = sprintf ( self :: CHECKID_QUERY , self :: $assocHandle );
2019-07-17 20:16:19 +00:00
Application :: $front -> setRequest ( new TestRequest ( '/openid/trust?' . $_SERVER [ 'QUERY_STRING' ]));
Application :: dispatch ();
2019-07-17 20:08:50 +00:00
$this -> assertContains (
2019-07-17 20:19:00 +00:00
'A site identifying as <a href="http://www.example.com">http://www.example.com</a> has asked for confirmation that <a href="' . $this -> _user -> openid . '">' . $this -> _user -> openid . '</a> is your identity URL.' ,
2019-07-17 20:08:50 +00:00
$this -> _response -> getBody ()
);
}
2019-07-17 20:19:00 +00:00
public function testTrustWithSreg ()
2019-07-17 20:08:50 +00:00
{
2019-07-17 20:19:00 +00:00
$_SERVER [ 'REQUEST_METHOD' ] = 'GET' ;
$_SERVER [ 'QUERY_STRING' ] = sprintf ( self :: CHECKID_QUERY , self :: $assocHandle );
$_SERVER [ 'QUERY_STRING' ] .= '&openid.ns.sreg=http%3A%2F%2Fopenid.net%2Fextensions%2Fsreg%2F1.1&openid.sreg.optional=nickname%2Cmobilenum' ;
Application :: $front -> setRequest ( new TestRequest ( '/openid/trust?' . $_SERVER [ 'QUERY_STRING' ]));
Application :: dispatch ();
$this -> assertContains ( '<input type="text" name="openid_sreg_nickname" id="openid_sreg_nickname" value=""' , $this -> _response -> getBody ());
}
2019-07-17 20:08:50 +00:00
2019-07-17 20:19:00 +00:00
public function testProceedAction ()
{
$_SERVER [ 'REQUEST_METHOD' ] = 'POST' ;
2019-07-17 20:08:50 +00:00
$_SERVER [ 'QUERY_STRING' ] = sprintf ( self :: CHECKID_QUERY , self :: $assocHandle );
// required for logging
$_SERVER [ 'REMOTE_ADDR' ] = '127.0.0.1' ;
$_POST = array (
'action' => 'proceed' ,
'allow' => 'Allow' ,
);
2019-07-17 20:19:00 +00:00
Application :: $front -> setRequest ( new TestRequest ( '/openid/proceed?' . $_SERVER [ 'QUERY_STRING' ]));
2019-07-17 20:16:19 +00:00
Application :: dispatch ();
2019-07-17 20:08:50 +00:00
2019-07-17 20:19:00 +00:00
$responseHeaders = $this -> _response -> getHeaders ();
2019-07-17 20:08:50 +00:00
$this -> assertEquals (
preg_match (
' #
2019-07-17 20:19:00 +00:00
http :// www . example . com\ ?
openid . assoc_handle = '.self::$assocHandle.'
2019-07-17 20:08:50 +00:00
& openid . claimed_id = http % 3 A % 2 F % 2 Flocalhost % 2 Fcommunityid % 2 Fidentity % 2 Ftestuser
& openid . identity = http % 3 A % 2 F % 2 Flocalhost % 2 Fcommunityid % 2 Fidentity % 2 Ftestuser
2019-07-17 20:19:00 +00:00
& openid . mode = id_res
& openid . ns = http % 3 A % 2 F % 2 Fspecs . openid . net % 2 Fauth % 2 F2 . 0
2019-07-17 20:08:50 +00:00
& openid . op_endpoint = http % 3 A % 2 F % 2 F .*
& openid . response_nonce = '.gmdate(' Y - m - d\T ').' .*
2019-07-17 20:19:00 +00:00
& openid . return_to = http % 3 A % 2 F % 2 Fwww . example . com
2019-07-17 20:08:50 +00:00
& openid . sig =.*
2019-07-17 20:19:00 +00:00
& openid . signed = assoc_handle % 2 Cclaimed_id % 2 Cidentity % 2 Cmode % 2 Cns % 2 Cop_endpoint % 2 Cresponse_nonce % 2 Creturn_to % 2 Csigned
2019-07-17 20:08:50 +00:00
#x',
2019-07-17 20:19:00 +00:00
$responseHeaders [ 0 ][ 'value' ]
2019-07-17 20:08:50 +00:00
),
1
);
}
2019-07-17 20:19:00 +00:00
public function testProceedWithSreg ()
2019-07-17 20:08:50 +00:00
{
2019-07-17 20:19:00 +00:00
$_POST = array (
'openid_sreg_nickname' => 'nicktest' ,
'openid_sreg_email' => 'test_x@mailinator.com' ,
'openid_sreg_fullname' => 'Michael Jordan' ,
'action' => 'proceed' ,
'allow' => 'Allow' ,
2019-07-17 20:08:50 +00:00
);
$queryString = self :: CHECKID_QUERY . " &openid.ns.sreg=http%%3A%%2F%%2Fopenid.net%%2Fextensions%%2Fsreg%%2F1.1&openid.sreg.required=nickname&openid.sreg.optional=email%%2Cfullname " ;
2019-07-17 20:19:00 +00:00
$_SERVER [ " REQUEST_METHOD " ] = 'POST' ;
2019-07-17 20:08:50 +00:00
$_SERVER [ 'QUERY_STRING' ] = sprintf ( $queryString , self :: $assocHandle );
// required for logging
$_SERVER [ 'REMOTE_ADDR' ] = '127.0.0.1' ;
2019-07-17 20:19:00 +00:00
Application :: $front -> setRequest ( new TestRequest ( '/openid/proceed?' . $_SERVER [ 'QUERY_STRING' ]));
2019-07-17 20:16:19 +00:00
Application :: dispatch ();
2019-07-17 20:08:50 +00:00
2019-07-17 20:19:00 +00:00
$responseHeaders = $this -> _response -> getHeaders ();
2019-07-17 20:08:50 +00:00
$this -> assertEquals (
preg_match (
' #
2019-07-17 20:19:00 +00:00
http :// www . example . com\ ?
openid . assoc_handle = '.self::$assocHandle.'
& openid . claimed_id = http % 3 A % 2 F % 2 Flocalhost % 2 Fcommunityid % 2 Fidentity % 2 Ftestuser
& openid . identity = http % 3 A % 2 F % 2 Flocalhost % 2 Fcommunityid % 2 Fidentity % 2 Ftestuser
& openid . mode = id_res
& openid . ns = http % 3 A % 2 F % 2 Fspecs . openid . net % 2 Fauth % 2 F2 . 0
& openid . ns . sreg = http % 3 A % 2 F % 2 Fopenid . net % 2 Fextensions % 2 Fsreg % 2 F1 . 1
& openid . op_endpoint = http % 3 A % 2 F % 2 F .*
& openid . response_nonce = '.gmdate(' Y - m - d\T ').' .*
& openid . return_to = http % 3 A % 2 F % 2 Fwww . example . com
& openid . sig =.*
& openid . signed = assoc_handle % 2 Cclaimed_id % 2 Cidentity % 2 Cmode % 2 Cns % 2 Cns . sreg % 2 Cop_endpoint % 2 Cresponse_nonce % 2 Creturn_to % 2 Csigned % 2 Csreg . email % 2 Csreg . fullname % 2 Csreg . nickname
& openid . sreg . email = test_x % 40 mailinator . com
& openid . sreg . fullname = Michael\ + Jordan
& openid . sreg . nickname = nicktest
2019-07-17 20:08:50 +00:00
#x',
2019-07-17 20:19:00 +00:00
$responseHeaders [ 0 ][ 'value' ]
2019-07-17 20:08:50 +00:00
),
1
);
}
public function tearDown ()
{
2019-07-17 20:16:19 +00:00
$users = new Users_Model_Users ();
2019-07-17 20:08:50 +00:00
$this -> _user -> delete ();
}
}