summaryrefslogtreecommitdiff
path: root/maintenance/resetUserTokens.php
diff options
context:
space:
mode:
Diffstat (limited to 'maintenance/resetUserTokens.php')
-rw-r--r--maintenance/resetUserTokens.php70
1 files changed, 51 insertions, 19 deletions
diff --git a/maintenance/resetUserTokens.php b/maintenance/resetUserTokens.php
index d7f8c6d0..bfe04d79 100644
--- a/maintenance/resetUserTokens.php
+++ b/maintenance/resetUserTokens.php
@@ -21,9 +21,10 @@
* @file
* @ingroup Maintenance
* @author Daniel Friesen <mediawiki@danielfriesen.name>
+ * @author Chris Steipp <csteipp@wikimedia.org>
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to reset the user_token for all users on the wiki.
@@ -35,14 +36,21 @@ class ResetUserTokens extends Maintenance {
parent::__construct();
$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) ... " );
wfCountDown( 5 );
@@ -50,29 +58,53 @@ class ResetUserTokens extends Maintenance {
// 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) . '\'' );
+ }
- $username = $user->getName();
+ $maxid = $dbr->selectField( 'user', 'MAX(user_id)', array(), __METHOD__ );
- $this->output( "Resetting user_token for $username: " );
+ $min = 0;
+ $max = $this->mBatchSize;
- // Change value
- $user->setToken();
- $user->saveSettings();
+ do {
+ $result = $dbr->select( 'user',
+ array( 'user_id' ),
+ array_merge(
+ $where,
+ array( 'user_id > ' . $dbr->addQuotes( $min ),
+ 'user_id <= ' . $dbr->addQuotes( $max )
+ )
+ ),
+ __METHOD__
+ );
- $this->output( " OK\n" );
+ foreach ( $result as $user ) {
+ $this->updateUser( $user->user_id );
+ }
- }
+ $min = $max;
+ $max = $min + $this->mBatchSize;
+
+ wfWaitForSlaves();
+
+ } while ( $max <= $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" );
}
}
$maintClass = "ResetUserTokens";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;