]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - maintenance/invalidateUserSessions.php
MediaWiki 1.30.2 renames
[autoinstalls/mediawiki.git] / maintenance / invalidateUserSessions.php
1 <?php
2 /**
3  * Invalidate the sessions of certain users on the wiki.
4  * If you want to invalidate all sessions, use $wgAuthenticationTokenVersion instead.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  * http://www.gnu.org/copyleft/gpl.html
20  *
21  * @file
22  * @ingroup Maintenance
23  */
24
25 use MediaWiki\MediaWikiServices;
26 use MediaWiki\Session\SessionManager;
27
28 require_once __DIR__ . '/Maintenance.php';
29
30 /**
31  * Invalidate the sessions of certain users on the wiki.
32  * If you want to invalidate all sessions, use $wgAuthenticationTokenVersion instead.
33  *
34  * @ingroup Maintenance
35  */
36 class InvalidateUserSesssions extends Maintenance {
37         public function __construct() {
38                 parent::__construct();
39                 $this->addDescription(
40                         'Invalidate the sessions of certain users on the wiki.'
41                 );
42                 $this->addOption( 'user', 'Username', false, true, 'u' );
43                 $this->addOption( 'file', 'File with one username per line', false, true, 'f' );
44                 $this->setBatchSize( 1000 );
45         }
46
47         public function execute() {
48                 $username = $this->getOption( 'user' );
49                 $file = $this->getOption( 'file' );
50
51                 if ( $username === null && $file === null ) {
52                         $this->error( 'Either --user or --file is required', 1 );
53                 } elseif ( $username !== null && $file !== null ) {
54                         $this->error( 'Cannot use both --user and --file', 1 );
55                 }
56
57                 if ( $username !== null ) {
58                         $usernames = [ $username ];
59                 } else {
60                         $usernames = is_readable( $file ) ?
61                                 file( $file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES ) : false;
62                         if ( $usernames === false ) {
63                                 $this->error( "Could not open $file", 2 );
64                         }
65                 }
66
67                 $i = 0;
68                 $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
69                 $sessionManager = SessionManager::singleton();
70                 foreach ( $usernames as $username ) {
71                         $i++;
72                         $user = User::newFromName( $username );
73                         try {
74                                 $sessionManager->invalidateSessionsForUser( $user );
75                                 if ( $user->getId() ) {
76                                         $this->output( "Invalidated sessions for user $username\n" );
77                                 } else {
78                                         # session invalidation might still work if there is a central identity provider
79                                         $this->output( "Could not find user $username, tried to invalidate anyway\n" );
80                                 }
81                         } catch ( Exception $e ) {
82                                 $this->output( "Failed to invalidate sessions for user $username | "
83                                         . str_replace( [ "\r", "\n" ], ' ', $e->getMessage() ) . "\n" );
84                         }
85
86                         if ( $i % $this->mBatchSize ) {
87                                 $lbFactory->waitForReplication();
88                         }
89                 }
90         }
91 }
92
93 $maintClass = "InvalidateUserSesssions";
94 require_once RUN_MAINTENANCE_IF_MAIN;