Merge "Prevent login-only local password provider from removing passwords"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 30 Nov 2016 16:39:12 +0000 (16:39 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 30 Nov 2016 16:39:12 +0000 (16:39 +0000)
1  2 
includes/auth/LocalPasswordPrimaryAuthenticationProvider.php
tests/phpunit/includes/auth/LocalPasswordPrimaryAuthenticationProviderTest.php

@@@ -104,7 -104,7 +104,7 @@@ class LocalPasswordPrimaryAuthenticatio
                // The old hash format was just an md5 hex hash, with no type information
                if ( preg_match( '/^[0-9a-f]{32}$/', $row->user_password ) ) {
                        if ( $this->config->get( 'PasswordSalt' ) ) {
 -                              $row->user_password = ":A:{$row->user_id}:{$row->user_password}";
 +                              $row->user_password = ":B:{$row->user_id}:{$row->user_password}";
                        } else {
                                $row->user_password = ":A:{$row->user_password}";
                        }
  
                // @codeCoverageIgnoreStart
                if ( $this->getPasswordFactory()->needsUpdate( $pwhash ) ) {
 -                      $pwhash = $this->getPasswordFactory()->newFromPlaintext( $req->password );
 -                      \DeferredUpdates::addCallableUpdate( function () use ( $pwhash, $oldRow ) {
 +                      $newHash = $this->getPasswordFactory()->newFromPlaintext( $req->password );
 +                      \DeferredUpdates::addCallableUpdate( function () use ( $newHash, $oldRow ) {
                                $dbw = wfGetDB( DB_MASTER );
                                $dbw->update(
                                        'user',
 -                                      [ 'user_password' => $pwhash->toString() ],
 +                                      [ 'user_password' => $newHash->toString() ],
                                        [
                                                'user_id' => $oldRow->user_id,
                                                'user_password' => $oldRow->user_password
  
                $pwhash = null;
  
-               if ( $this->loginOnly ) {
-                       $pwhash = $this->getPasswordFactory()->newFromCiphertext( null );
-                       $expiry = null;
-                       // @codeCoverageIgnoreStart
-               } elseif ( get_class( $req ) === PasswordAuthenticationRequest::class ) {
-                       // @codeCoverageIgnoreEnd
-                       $pwhash = $this->getPasswordFactory()->newFromPlaintext( $req->password );
-                       $expiry = $this->getNewPasswordExpiry( $username );
+               if ( get_class( $req ) === PasswordAuthenticationRequest::class ) {
+                       if ( $this->loginOnly ) {
+                               $pwhash = $this->getPasswordFactory()->newFromCiphertext( null );
+                               $expiry = null;
+                       } else {
+                               $pwhash = $this->getPasswordFactory()->newFromPlaintext( $req->password );
+                               $expiry = $this->getNewPasswordExpiry( $username );
+                       }
                }
  
                if ( $pwhash ) {
@@@ -2,8 -2,6 +2,8 @@@
  
  namespace MediaWiki\Auth;
  
 +use MediaWiki\MediaWikiServices;
 +
  /**
   * @group AuthManager
   * @group Database
@@@ -30,7 -28,7 +30,7 @@@ class LocalPasswordPrimaryAuthenticatio
                }
                $config = new \MultiConfig( [
                        $this->config,
 -                      \ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
 +                      MediaWikiServices::getInstance()->getMainConfig()
                ] );
  
                if ( !$this->manager ) {
                        AuthenticationResponse::newPass( $userName ),
                        $provider->beginPrimaryAuthentication( $reqs )
                );
 -
        }
  
        /**
                $changeReq->password = $newpass;
                $provider->providerChangeAuthenticationData( $changeReq );
  
-               if ( $loginOnly ) {
+               if ( $loginOnly && $changed ) {
                        $old = 'fail';
                        $new = 'fail';
                        $expectExpiry = null;
                $this->assertNull( $provider->finishAccountCreation( $user, $user, $res2 ) );
                $ret = $provider->beginPrimaryAuthentication( $reqs );
                $this->assertEquals( AuthenticationResponse::PASS, $ret->status, 'new password is set' );
 -
        }
  
  }