Add invalidateUserSessions.php maintenance script
authorGergő Tisza <gtisza@wikimedia.org>
Wed, 15 Jun 2016 18:01:31 +0000 (18:01 +0000)
committerGergő Tisza <gtisza@wikimedia.org>
Thu, 16 Jun 2016 12:57:18 +0000 (12:57 +0000)
Similar to resetUserTokens.php but uses AuthManager and takes a
list of users (a script for invalidating all users would be
mostly pointless with $wgAuthenticationTokenVersion).

resetUserTokens.php is deprecated, but kept around - mainly in case
we want to transform it into a fast token reset algorithm much like
I6b6e75db2a.

Change-Id: I81450c44a7af26393db7fc61fd5c05f13a13ac3f

maintenance/invalidateUserSessions.php [new file with mode: 0644]
maintenance/resetUserTokens.php

diff --git a/maintenance/invalidateUserSessions.php b/maintenance/invalidateUserSessions.php
new file mode 100644 (file)
index 0000000..4b567ae
--- /dev/null
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Invalidate the sessions of certain users on the wiki.
+ * If you want to invalidate all sessions, use $wgAuthenticationTokenVersion instead.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Session\SessionManager;
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Invalidate the sessions of certain users on the wiki.
+ * If you want to invalidate all sessions, use $wgAuthenticationTokenVersion instead.
+ *
+ * @ingroup Maintenance
+ */
+class InvalidateUserSesssions extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription(
+                       'Invalidate the sessions of certain users on the wiki.'
+               );
+               $this->addOption( 'user', 'Username', false, true, 'u' );
+               $this->addOption( 'file', 'File with one username per line', false, true, 'f' );
+               $this->setBatchSize( 1000 );
+       }
+
+       public function execute() {
+               $username = $this->getOption( 'user' );
+               $file = $this->getOption( 'file' );
+
+               if ( $username === null && $file === null ) {
+                       $this->error( 'Either --user or --file is required', 1 );
+               } elseif ( $username !== null && $file !== null ) {
+                       $this->error( 'Cannot use both --user and --file', 1 );
+               }
+
+               if ( $username !== null ) {
+                       $usernames = [ $username ];
+               } else {
+                       $usernames = is_readable( $file ) ?
+                               file( $file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES ) : false;
+                       if ( $usernames === false ) {
+                               $this->error( "Could not open $file", 2 );
+                       }
+               }
+
+               $i = 0;
+               $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+               $sessionManager = SessionManager::singleton();
+               foreach ( $usernames as $username ) {
+                       $i++;
+                       $user = User::newFromName( $username );
+                       if ( $user->getId() ) {
+                               $sessionManager->invalidateSessionsForUser( $user );
+                               $this->output( "Invalidated sessions for user $username\n" );
+                       } else {
+                               $this->output( "Could not find user $username\n" );
+                       }
+
+                       if ( $i % $this->mBatchSize ) {
+                               $lbFactory->waitForReplication();
+                       }
+               }
+       }
+}
+
+$maintClass = "InvalidateUserSesssions";
+require_once RUN_MAINTENANCE_IF_MAIN;
index 837f304..131a569 100644 (file)
@@ -30,12 +30,14 @@ require_once __DIR__ . '/Maintenance.php';
  * Maintenance script to reset the user_token for all users on the wiki.
  *
  * @ingroup Maintenance
+ * @deprecated since 1.27, use $wgAuthenticationTokenVersion instead.
  */
 class ResetUserTokens extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->addDescription(
-                       'Reset the user_token of all users on the wiki. Note that this may log some of them out.'
+                       "Reset the user_token of all users on the wiki. Note that this may log some of them out.\n"
+                       . "Deprecated, use \$wgAuthenticationTokenVersion instead."
                );
                $this->addOption( 'nowarn', "Hides the 5 seconds warning", false, false );
                $this->addOption(