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