Anomie has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/292196

Change subject: Fix auto-creation
......................................................................

Fix auto-creation

* Don't block auto-creation from session if autoCreatedAccount() will
  attach it.
* When we're doing our own auth-creation, use AuthManager directly
  whenever possible. And centralize the logic for that instead of
  repeating it everywhere.

Change-Id: Id777c8a32a3a15c19e7885ba749c0f62cea51dad
Depends-On: I40bd3dc4d05db0c3a34b01f550a9a9a1ded8fc61
---
M includes/CentralAuthPrimaryAuthenticationProvider.php
M includes/CentralAuthUtils.php
M includes/CreateLocalAccountJob.php
M includes/LocalRenameJob/LocalRenameJob.php
M includes/LocalRenameJob/LocalUserMergeJob.php
M includes/specials/SpecialCentralAutoLogin.php
M maintenance/createLocalAccount.php
7 files changed, 37 insertions(+), 31 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/CentralAuth 
refs/changes/96/292196/1

diff --git a/includes/CentralAuthPrimaryAuthenticationProvider.php 
b/includes/CentralAuthPrimaryAuthenticationProvider.php
index 4dbaa90..cfa4d92 100644
--- a/includes/CentralAuthPrimaryAuthenticationProvider.php
+++ b/includes/CentralAuthPrimaryAuthenticationProvider.php
@@ -352,7 +352,7 @@
 
                if ( $autocreate !== $this->getUniqueId() ) {
                        // Prevent creation if the user exists centrally
-                       if ( $centralUser->exists() ) {
+                       if ( $centralUser->exists() && $autocreate !== 
AuthManager::AUTOCREATE_SOURCE_SESSION ) {
                                $status->fatal( 'centralauth-account-exists' );
                                return $status;
                        }
diff --git a/includes/CentralAuthUtils.php b/includes/CentralAuthUtils.php
index fab028b..bba0b8a 100644
--- a/includes/CentralAuthUtils.php
+++ b/includes/CentralAuthUtils.php
@@ -1,5 +1,8 @@
 <?php
 
+use MediaWiki\Auth\AuthManager;
+use MediaWiki\Session\SessionManager;
+
 class CentralAuthUtils {
        /** @var BagOStuff|null Session cache */
        private static $sessionCache = null;
@@ -121,18 +124,33 @@
        /**
         * Auto-create a user
         * @param User $user
-        * @return bool Success
+        * @return StatusValue
         */
        public static function autoCreateUser( User $user ) {
+               global $wgDisableAuthManager;
+
                // Ignore warnings about master connections/writes...hard to 
avoid here
                
Profiler::instance()->getTransactionProfiler()->resetExpectations();
 
-               $res = MediaWiki\Session\SessionManager::autoCreateUser( $user 
);
-               \MediaWiki\Logger\LoggerFactory::getInstance( 'authmanager' 
)->info( 'Autocreation attempt', array(
+               if ( !$wgDisableAuthManager ) {
+                       $authManager = AuthManager::singleton();
+                       $source = 
CentralAuthPrimaryAuthenticationProvider::class;
+                       if ( !$authManager->getAuthenticationProvider( $source 
) ) {
+                               $source = 
AuthManager::AUTOCREATE_SOURCE_SESSION;
+                       }
+                       $sv = $authManager->autoCreateUser( $user, $source, 
false );
+               } else {
+                       $sv = StatusValue::newGood();
+                       if ( !SessionManager::autoCreateUser( $user ) ) {
+                               $sv->fatal( new RawMessage( 'auto-creation via 
SessionManager failed' ) );
+                       }
+               }
+
+               \MediaWiki\Logger\LoggerFactory::getInstance( 'authmanager' 
)->info( 'Autocreation attempt', [
                        'event' => 'autocreate',
-                       'successful' => $res,
-               ) );
-               return $res;
+                       'status' => $sv,
+               ] );
+               return $sv;
        }
 
        /**
@@ -142,7 +160,7 @@
         */
        public static function getCentralSession( $session = null ) {
                if ( !$session ) {
-                       $session = 
MediaWiki\Session\SessionManager::getGlobalSession();
+                       $session = SessionManager::getGlobalSession();
                }
                $id = $session->get( 'CentralAuth::centralSessionId' );
 
@@ -178,7 +196,7 @@
                static $keepKeys = array( 'user' => true, 'token' => true, 
'expiry' => true );
 
                if ( $session === null ) {
-                       $session = 
MediaWiki\Session\SessionManager::getGlobalSession();
+                       $session = SessionManager::getGlobalSession();
                }
                $id = $session->get( 'CentralAuth::centralSessionId' );
 
@@ -215,7 +233,7 @@
         */
        public static function deleteCentralSession( $session = null ) {
                if ( !$session ) {
-                       $session = 
MediaWiki\Session\SessionManager::getGlobalSession();
+                       $session = SessionManager::getGlobalSession();
                }
                $id = $session->get( 'CentralAuth::centralSessionId' );
 
diff --git a/includes/CreateLocalAccountJob.php 
b/includes/CreateLocalAccountJob.php
index 846446b..44700ed 100644
--- a/includes/CreateLocalAccountJob.php
+++ b/includes/CreateLocalAccountJob.php
@@ -53,7 +53,7 @@
                        return true;
                }
 
-               $success = CentralAuthUtils::autoCreateUser( $user );
+               $success = CentralAuthUtils::autoCreateUser( $user )->isGood();
                if ( $success ) {
                        $centralUser->invalidateCache();
                }
diff --git a/includes/LocalRenameJob/LocalRenameJob.php 
b/includes/LocalRenameJob/LocalRenameJob.php
index a1d1f85..c4285b6 100644
--- a/includes/LocalRenameJob/LocalRenameJob.php
+++ b/includes/LocalRenameJob/LocalRenameJob.php
@@ -65,7 +65,7 @@
                        return User::newFromName( 'Global rename script' );
                } elseif ( $user->getId() == 0 ) {
                        // No local user, lets "auto-create" one
-                       if ( CentralAuthUtils::autoCreateUser( $user ) ) {
+                       if ( CentralAuthUtils::autoCreateUser( $user 
)->isGood() ) {
                                return User::newFromName( $user->getName() ); 
// So the internal cache is reloaded
                        } else {
                                // Auto-creation didn't work, fallback on the 
system account.
diff --git a/includes/LocalRenameJob/LocalUserMergeJob.php 
b/includes/LocalRenameJob/LocalUserMergeJob.php
index c38df35..552cd1b 100755
--- a/includes/LocalRenameJob/LocalUserMergeJob.php
+++ b/includes/LocalRenameJob/LocalUserMergeJob.php
@@ -60,22 +60,16 @@
         * @throws Exception
         */
        private function maybeCreateNewUser( $newName ) {
-               global $wgDisableAuthManager;
                $user = User::newFromName( $newName );
                if ( $user->getId() ) {
                        // User already exists, nothing to do.
                        return $user;
                }
 
-               if ( class_exists( MediaWiki\Auth\AuthManager::class ) && 
!$wgDisableAuthManager ) {
-                       $status = MediaWiki\Auth\AuthManager::autoCreateUser( 
$user, CentralAuthPrimaryAuthenticationProvider::class, false );
-                       if ( !$status->isGood() ) {
-                               $this->updateStatus( 'failed' );
-                               throw new Exception( 
"AuthManager::autoCreateUser failed for $newName: " . $status->getWikiText( 
null, null, 'en' ) );
-                       }
-               } elseif ( !MediaWiki\Session\SessionManager::autoCreateUser( 
$user ) ) {
+               $status = CentralAuthUtils::autoCreateUser( $user );
+               if ( !$status->isGood() ) {
                        $this->updateStatus( 'failed' );
-                       throw new Exception( "SessionManager::autoCreateUser 
failed for $newName" );
+                       throw new Exception( "AuthManager::autoCreateUser 
failed for $newName: " . $status->getWikiText( null, null, 'en' ) );
                }
 
                return $user;
diff --git a/includes/specials/SpecialCentralAutoLogin.php 
b/includes/specials/SpecialCentralAutoLogin.php
index 865b11e..1e9e86f 100644
--- a/includes/specials/SpecialCentralAutoLogin.php
+++ b/includes/specials/SpecialCentralAutoLogin.php
@@ -478,7 +478,7 @@
                        if ( !User::idFromName( $centralUser->getName() ) ) {
                                $user = new User;
                                $user->setName( $centralUser->getName() );
-                               if ( CentralAuthUtils::autoCreateUser( $user ) 
) {
+                               if ( CentralAuthUtils::autoCreateUser( $user 
)->isGood() ) {
                                        $centralUser->invalidateCache();
                                }
                        }
diff --git a/maintenance/createLocalAccount.php 
b/maintenance/createLocalAccount.php
index 931274a..733b741 100644
--- a/maintenance/createLocalAccount.php
+++ b/maintenance/createLocalAccount.php
@@ -14,8 +14,6 @@
        }
 
        public function execute() {
-               global $wgDisableAuthManager;
-
                if ( !class_exists( 'CentralAuthUser' ) ) {
                        $this->error( "CentralAuth isn't enabled on this 
wiki\n", 1 );
                }
@@ -36,13 +34,9 @@
                                $this->error( "No such global user: 
'$username'\n", 1 );
                        }
 
-                       if ( class_exists( MediaWiki\Auth\AuthManager::class ) 
&& !$wgDisableAuthManager ) {
-                               $status = 
MediaWiki\Auth\AuthManager::autoCreateUser( $user, 
CentralAuthPrimaryAuthenticationProvider::class, false );
-                               if ( !$status->isGood() ) {
-                                       $this->error( 
"AuthManager::autoCreateUser failed for $username: " . $status->getWikiText( 
null, null, 'en' ) );
-                               }
-                       } elseif ( 
!MediaWiki\Session\SessionManager::autoCreateUser( $user ) ) {
-                               $this->error( "SessionManager::autoCreateUser 
failed for $username" );
+                       $status = CentralAuthUtils::autoCreateUser( $user );
+                       if ( !$status->isGood() ) {
+                               $this->error( "autoCreateUser failed for 
$username: " . $status->getWikiText( null, null, 'en' ) );
                        }
 
                        # Update user count

-- 
To view, visit https://gerrit.wikimedia.org/r/292196
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id777c8a32a3a15c19e7885ba749c0f62cea51dad
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/CentralAuth
Gerrit-Branch: master
Gerrit-Owner: Anomie <bjor...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to