* Test result of attempted login with an empty username
*/
public function testApiLoginNoName() {
- $data = $this->doApiRequest( array( 'action' => 'login',
+ $session = [
+ 'wsTokenSecrets' => [ 'login' => 'foobar' ],
+ ];
+ $data = $this->doApiRequest( [ 'action' => 'login',
'lgname' => '', 'lgpassword' => self::$users['sysop']->password,
- ) );
+ 'lgtoken' => (string)( new MediaWiki\Session\Token( 'foobar', '' ) )
+ ], $session );
$this->assertEquals( 'NoName', $data[0]['login']['result'] );
}
global $wgServer;
$user = self::$users['sysop'];
- $user->getUser()->logOut();
+ $user->getUser()->logout();
if ( !isset( $wgServer ) ) {
$this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
}
- $ret = $this->doApiRequest( array(
+ $ret = $this->doApiRequest( [
"action" => "login",
"lgname" => $user->username,
"lgpassword" => "bad",
- ) );
+ ] );
$result = $ret[0];
$token = $result["login"]["token"];
$ret = $this->doApiRequest(
- array(
+ [
"action" => "login",
"lgtoken" => $token,
"lgname" => $user->username,
"lgpassword" => "badnowayinhell",
- ),
+ ],
$ret[2]
);
}
$user = self::$users['sysop'];
- $user->getUser()->logOut();
+ $user->getUser()->logout();
- $ret = $this->doApiRequest( array(
+ $ret = $this->doApiRequest( [
"action" => "login",
"lgname" => $user->username,
"lgpassword" => $user->password,
- )
+ ]
);
$result = $ret[0];
$token = $result["login"]["token"];
$ret = $this->doApiRequest(
- array(
+ [
"action" => "login",
"lgtoken" => $token,
"lgname" => $user->username,
"lgpassword" => $user->password,
- ),
+ ],
$ret[2]
);
$user = self::$users['sysop'];
$req = MWHttpRequest::factory( self::$apiUrl . "?action=login&format=xml",
- array( "method" => "POST",
- "postData" => array(
+ [ "method" => "POST",
+ "postData" => [
"lgname" => $user->username,
"lgpassword" => $user->password
- )
- ),
+ ]
+ ],
__METHOD__
);
$req->execute();
$this->assertEquals( ' result="NeedToken"', $a->asXML() );
$token = (string)$sxe->login[0]->attributes()->token;
- $req->setData( array(
+ $req->setData( [
"lgtoken" => $token,
"lgname" => $user->username,
- "lgpassword" => $user->password ) );
+ "lgpassword" => $user->password ] );
$req->execute();
$cj = $req->getCookieJar();
public function testRunLogin() {
$sysopUser = self::$users['sysop'];
- $data = $this->doApiRequest( array(
+ $data = $this->doApiRequest( [
'action' => 'login',
'lgname' => $sysopUser->username,
- 'lgpassword' => $sysopUser->password ) );
+ 'lgpassword' => $sysopUser->password ] );
$this->assertArrayHasKey( "login", $data[0] );
$this->assertArrayHasKey( "result", $data[0]['login'] );
$this->assertEquals( "NeedToken", $data[0]['login']['result'] );
$token = $data[0]['login']['token'];
- $data = $this->doApiRequest( array(
+ $data = $this->doApiRequest( [
'action' => 'login',
"lgtoken" => $token,
"lgname" => $sysopUser->username,
- "lgpassword" => $sysopUser->password ), $data[2] );
+ "lgpassword" => $sysopUser->password ], $data[2] );
$this->assertArrayHasKey( "login", $data[0] );
$this->assertArrayHasKey( "result", $data[0]['login'] );
$this->assertArrayHasKey( 'lgtoken', $data[0]['login'] );
}
+ public function testBotPassword() {
+ global $wgServer, $wgSessionProviders;
+
+ if ( !isset( $wgServer ) ) {
+ $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
+ }
+
+ $this->setMwGlobals( [
+ 'wgSessionProviders' => array_merge( $wgSessionProviders, [
+ [
+ 'class' => 'MediaWiki\\Session\\BotPasswordSessionProvider',
+ 'args' => [ [ 'priority' => 40 ] ],
+ ]
+ ] ),
+ 'wgEnableBotPasswords' => true,
+ 'wgBotPasswordsDatabase' => false,
+ 'wgCentralIdLookupProvider' => 'local',
+ 'wgGrantPermissions' => [
+ 'test' => [ 'read' => true ],
+ ],
+ ] );
+
+ // Make sure our session provider is present
+ $manager = TestingAccessWrapper::newFromObject( MediaWiki\Session\SessionManager::singleton() );
+ if ( !isset( $manager->sessionProviders['MediaWiki\\Session\\BotPasswordSessionProvider'] ) ) {
+ $tmp = $manager->sessionProviders;
+ $manager->sessionProviders = null;
+ $manager->sessionProviders = $tmp + $manager->getProviders();
+ }
+ $this->assertNotNull(
+ MediaWiki\Session\SessionManager::singleton()->getProvider(
+ 'MediaWiki\\Session\\BotPasswordSessionProvider'
+ ),
+ 'sanity check'
+ );
+
+ $user = self::$users['sysop'];
+ $centralId = CentralIdLookup::factory()->centralIdFromLocalUser( $user->getUser() );
+ $this->assertNotEquals( 0, $centralId, 'sanity check' );
+
+ $passwordFactory = new PasswordFactory();
+ $passwordFactory->init( RequestContext::getMain()->getConfig() );
+ // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only
+ $passwordFactory->setDefaultType( 'A' );
+ $pwhash = $passwordFactory->newFromPlaintext( 'foobaz' );
+
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->insert(
+ 'bot_passwords',
+ [
+ 'bp_user' => $centralId,
+ 'bp_app_id' => 'foo',
+ 'bp_password' => $pwhash->toString(),
+ 'bp_token' => '',
+ 'bp_restrictions' => MWRestrictions::newDefault()->toJson(),
+ 'bp_grants' => '["test"]',
+ ],
+ __METHOD__
+ );
+
+ $lgName = $user->username . BotPassword::getSeparator() . 'foo';
+
+ $ret = $this->doApiRequest( [
+ 'action' => 'login',
+ 'lgname' => $lgName,
+ 'lgpassword' => 'foobaz',
+ ] );
+
+ $result = $ret[0];
+ $this->assertNotInternalType( 'bool', $result );
+ $this->assertNotInternalType( 'null', $result['login'] );
+
+ $a = $result['login']['result'];
+ $this->assertEquals( 'NeedToken', $a );
+ $token = $result['login']['token'];
+
+ $ret = $this->doApiRequest( [
+ 'action' => 'login',
+ 'lgtoken' => $token,
+ 'lgname' => $lgName,
+ 'lgpassword' => 'foobaz',
+ ], $ret[2] );
+
+ $result = $ret[0];
+ $this->assertNotInternalType( 'bool', $result );
+ $a = $result['login']['result'];
+
+ $this->assertEquals( 'Success', $a );
+ }
+
}