X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=maintenance%2FresetUserTokens.php;h=08be553773e9003c1de74b6a12e58254929c8514;hb=ed07e7d9baa6a98e428be5556bb798e6c4b75642;hp=241d6328c83fcdeae9c6d2e8a05d9715d17c4f6a;hpb=f10c9815e69b59844c178d218640bd1ac0435896;p=lhc%2Fweb%2Fwiklou.git diff --git a/maintenance/resetUserTokens.php b/maintenance/resetUserTokens.php index 241d6328c8..08be553773 100644 --- a/maintenance/resetUserTokens.php +++ b/maintenance/resetUserTokens.php @@ -21,6 +21,7 @@ * @file * @ingroup Maintenance * @author Daniel Friesen + * @author Chris Steipp */ require_once __DIR__ . '/Maintenance.php'; @@ -33,44 +34,81 @@ require_once __DIR__ . '/Maintenance.php'; class ResetUserTokens extends Maintenance { public function __construct() { parent::__construct(); - $this->mDescription = "Reset the user_token of all users on the wiki. Note that this may log some of them out."; + $this->mDescription = + "Reset the user_token of all users on the wiki. Note that this may log some of them out."; $this->addOption( 'nowarn', "Hides the 5 seconds warning", false, false ); + $this->addOption( + 'nulls', + 'Only reset tokens that are currently null (string of \x00\'s)', + false, + false + ); + $this->setBatchSize( 1000 ); } public function execute() { + $this->nullsOnly = $this->getOption( 'nulls' ); if ( !$this->getOption( 'nowarn' ) ) { - $this->output( "The script is about to reset the user_token for ALL USERS in the database.\n" ); - $this->output( "This may log some of them out and is not necessary unless you believe your\n" ); - $this->output( "user table has been compromised.\n" ); + if ( $this->nullsOnly ) { + $this->output( "The script is about to reset the user_token " + . "for USERS WITH NULL TOKENS in the database.\n" ); + } else { + $this->output( "The script is about to reset the user_token for ALL USERS in the database.\n" ); + $this->output( "This may log some of them out and is not necessary unless you believe your\n" ); + $this->output( "user table has been compromised.\n" ); + } $this->output( "\n" ); - $this->output( "Abort with control-c in the next five seconds (skip this countdown with --nowarn) ... " ); + $this->output( "Abort with control-c in the next five seconds " + . "(skip this countdown with --nowarn) ... " ); wfCountDown( 5 ); } // We list user by user_id from one of the slave database $dbr = wfGetDB( DB_SLAVE ); - $result = $dbr->select( 'user', - array( 'user_id' ), - array(), - __METHOD__ - ); - foreach ( $result as $id ) { - $user = User::newFromId( $id->user_id ); + $where = array(); + if ( $this->nullsOnly ) { + // Have to build this by hand, because \ is escaped in helper functions + $where = array( 'user_token = \'' . str_repeat( '\0', 32 ) . '\'' ); + } + + $maxid = $dbr->selectField( 'user', 'MAX(user_id)', array(), __METHOD__ ); - $username = $user->getName(); + $min = 0; + $max = $this->mBatchSize; - $this->output( "Resetting user_token for $username: " ); + do { + $result = $dbr->select( 'user', + array( 'user_id' ), + array_merge( + $where, + array( 'user_id > ' . $dbr->addQuotes( $min ), + 'user_id <= ' . $dbr->addQuotes( $max ) + ) + ), + __METHOD__ + ); - // Change value - $user->setToken(); - $user->saveSettings(); + foreach ( $result as $user ) { + $this->updateUser( $user->user_id ); + } - $this->output( " OK\n" ); + $min = $max; + $max = $min + $this->mBatchSize; - } + wfWaitForSlaves(); + } while ( $min <= $maxid ); + } + private function updateUser( $userid ) { + $user = User::newFromId( $userid ); + $username = $user->getName(); + $this->output( 'Resetting user_token for "' . $username . '": ' ); + // Change value + $user->setToken(); + $user->saveSettings(); + $this->output( " OK\n" ); } }