BryanDavis has uploaded a new change for review.

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

Change subject: Detach accounts during global rename
......................................................................

Detach accounts during global rename

Delete localuser rows when changing the globaluser record so that
dangling records are not left during the rename process. As each local
wiki account is renamed it will be reattached.

Bug: T119736
Change-Id: I282cd12cb18a557a3ab4375db9238925470f3897
---
M includes/CentralAuthUser.php
M includes/GlobalRename/GlobalRenameUser.php
M includes/GlobalRename/GlobalRenameUserDatabaseUpdates.php
M includes/LocalRenameJob/LocalRenameUserJob.php
4 files changed, 32 insertions(+), 11 deletions(-)


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

diff --git a/includes/CentralAuthUser.php b/includes/CentralAuthUser.php
index 083400c..6a4f4c1 100644
--- a/includes/CentralAuthUser.php
+++ b/includes/CentralAuthUser.php
@@ -1758,11 +1758,12 @@
         * @param $wikiID String
         * @param $method String
         * @param $sendToRC bool
+        * @param string|bool $ts MediaWiki timestamp or false for current time
         *
         * Prerequisites:
         * - completed migration state
         */
-       public function attach( $wikiID, $method = 'new', $sendToRC = true ) {
+       public function attach( $wikiID, $method = 'new', $sendToRC = true, $ts 
= false ) {
                $this->checkWriteMode();
                $dbw = CentralAuthUtils::getCentralDB();
                $dbw->begin( __METHOD__ );
@@ -1770,7 +1771,7 @@
                        array(
                                'lu_wiki'               => $wikiID,
                                'lu_name'               => $this->mName,
-                               'lu_attached_timestamp' => $dbw->timestamp(),
+                               'lu_attached_timestamp' => $ts ?: 
$dbw->timestamp(),
                                'lu_attached_method'    => $method ),
                        __METHOD__,
                        array( 'IGNORE' )
diff --git a/includes/GlobalRename/GlobalRenameUser.php 
b/includes/GlobalRename/GlobalRenameUser.php
index f3a6c8d..885b7a2 100644
--- a/includes/GlobalRename/GlobalRenameUser.php
+++ b/includes/GlobalRename/GlobalRenameUser.php
@@ -102,13 +102,16 @@
         * @return Status
         */
        public function rename( array $options ) {
-               $wikis = $this->oldCAUser->listAttached();
+               $wikisAttached = $this->oldCAUser->queryAttached();
 
-               $status = $this->setRenameStatuses( $wikis );
+               $status = $this->setRenameStatuses( array_keys( $wikisAttached 
) );
                if ( !$status->isOK() ) {
                        return $status;
                }
 
+               // Rename the user centrally and unattach the old user from all
+               // attached wikis. Each will be reattached as its 
LocalRenameUserJob
+               // runs.
                $this->databaseUpdates->update(
                        $this->oldUser->getName(),
                        $this->newUser->getName()
@@ -128,7 +131,7 @@
                $this->oldCAUser->quickInvalidateCache();
                $this->newCAUser->quickInvalidateCache();
 
-               $this->injectLocalRenameUserJobs( $wikis, $options );
+               $this->injectLocalRenameUserJobs( $wikisAttached, $options );
 
                $this->logger->log(
                        $this->oldUser->getName(),
@@ -166,13 +169,15 @@
        }
 
        /**
+        * @param array $wikisAttached Attached wiki info
         * @param array $options
-        * @param array $wikis
         *
         * @return Status
         */
-       private function injectLocalRenameUserJobs( array $wikis, array 
$options ) {
-               $job = $this->getJob( $options );
+       private function injectLocalRenameUserJobs(
+               array $wikisAttached, array $options
+       ) {
+               $job = $this->getJob( $options, $wikisAttached );
                $statuses = $this->renameuserStatus->getStatuses( 
GlobalRenameUserStatus::READ_LATEST );
                foreach ( $statuses as $wiki => $status ) {
                        if ( $status === 'queued' ) {
@@ -184,14 +189,16 @@
 
        /**
         * @param array $options
+        * @param array $wikisAttached Attached wiki info
         *
         * @return Job
         */
-       private function getJob( array $options ) {
+       private function getJob( array $options, array $wikisAttached ) {
                $params = array(
                        'from' => $this->oldUser->getName(),
                        'to' => $this->newUser->getName(),
                        'renamer' => $this->performingUser->getName(),
+                       'reattach' => $wikisAttached,
                        'movepages' => $options['movepages'],
                        'suppressredirects' => $options['suppressredirects'],
                        'promotetoglobal' => false,
diff --git a/includes/GlobalRename/GlobalRenameUserDatabaseUpdates.php 
b/includes/GlobalRename/GlobalRenameUserDatabaseUpdates.php
index d97170e..a68186a 100644
--- a/includes/GlobalRename/GlobalRenameUserDatabaseUpdates.php
+++ b/includes/GlobalRename/GlobalRenameUserDatabaseUpdates.php
@@ -30,9 +30,8 @@
                        __METHOD__
                );
 
-               $dbw->update(
+               $dbw->delete(
                        'localuser',
-                       array( 'lu_name' => $newname ),
                        array( 'lu_name' => $oldname ),
                        __METHOD__
                );
diff --git a/includes/LocalRenameJob/LocalRenameUserJob.php 
b/includes/LocalRenameJob/LocalRenameUserJob.php
index 85f3fbf..5d2a754 100644
--- a/includes/LocalRenameJob/LocalRenameUserJob.php
+++ b/includes/LocalRenameJob/LocalRenameUserJob.php
@@ -19,6 +19,9 @@
                if ( !isset( $params['reason'] ) ) {
                        $params['reason'] = '';
                }
+               if ( !isset( $params['reattach'] ) ) {
+                       $params['reattach'] = false;
+               }
                parent::__construct( 'LocalRenameUserJob', $title, $params, $id 
);
        }
 
@@ -62,6 +65,17 @@
                        // until a sysadmin intervenes...
                        throw new Exception( 'RenameuserSQL::rename returned 
false.' );
                }
+               if ( $this->params['reattach'] ) {
+                       $caUser = CentralAuthUser::getInstanceByName( 
$this->params['to'] );
+                       $wikiId = wfWikiID();
+                       $details = $this->params['reattach'][$wikiId];
+                       $caUser->attach(
+                               $wikiId,
+                               $details['attachedMethod'],
+                               false,
+                               $details['attachedTimestamp']
+                       );
+               }
 
                if ( $this->params['movepages'] ) {
                        $this->movePages( $oldUser );

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I282cd12cb18a557a3ab4375db9238925470f3897
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/CentralAuth
Gerrit-Branch: master
Gerrit-Owner: BryanDavis <bda...@wikimedia.org>

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

Reply via email to