From f04d486e37692a9cd57a818f39467bd21c5c1d23 Mon Sep 17 00:00:00 2001 From: "Mark A. Hershberger" Date: Thu, 30 Aug 2012 19:54:20 -0400 Subject: [PATCH] Bug 35623 - createAndPromote.php: Change to allow promotion only Introduces the --force option to promote the user even if it already exists. Change-Id: Id0cd0e49a46f78fdbff3560adf23ba0c33aae430 --- maintenance/createAndPromote.php | 81 ++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 24 deletions(-) diff --git a/maintenance/createAndPromote.php b/maintenance/createAndPromote.php index ad5333fcc7..81fbbb3d32 100644 --- a/maintenance/createAndPromote.php +++ b/maintenance/createAndPromote.php @@ -20,6 +20,7 @@ * @file * @ingroup Maintenance * @author Rob Church + * @author Pablo Castellano */ require_once( __DIR__ . '/Maintenance.php' ); @@ -31,50 +32,82 @@ require_once( __DIR__ . '/Maintenance.php' ); */ class CreateAndPromote extends Maintenance { + static $permitRoles = array( 'sysop', 'bureaucrat' ); + public function __construct() { parent::__construct(); - $this->mDescription = "Create a new user account"; - $this->addOption( "sysop", "Grant the account sysop rights" ); - $this->addOption( "bureaucrat", "Grant the account bureaucrat rights" ); + $this->mDescription = "Create a new user account and/or grant it additional rights"; + $this->addOption( "force", "If acccount exists already, just grant it rights or change password." ); + foreach( self::$permitRoles as $role ) { + $this->addOption( $role, "Add the account to the {$role} group" ); + } $this->addArg( "username", "Username of new user" ); - $this->addArg( "password", "Password to set" ); + $this->addArg( "password", "Password to set (not required if --force is used)", false); } public function execute() { $username = $this->getArg( 0 ); $password = $this->getArg( 1 ); - - $this->output( wfWikiID() . ": Creating and promoting User:{$username}..." ); + $force = $this->hasOption( 'force' ); + $inGroups = array(); $user = User::newFromName( $username ); if ( !is_object( $user ) ) { $this->error( "invalid username.", true ); - } elseif ( 0 != $user->idForName() ) { - $this->error( "account exists.", true ); } - # Try to set the password - try { - $user->setPassword( $password ); - } catch ( PasswordError $pwe ) { - $this->error( $pwe->getText(), true ); + $exists = ( 0 !== $user->idForName() ); + + if ( $exists && !$force ) { + $this->error( "Account exists. Perhaps you want the --force option?", true ); + } else if ( !$exists && !$password ) { + $this->error( "Argument required!", false ); + $this->maybeHelp( true ); + } else if ( $exists ) { + $inGroups = $user->getGroups(); } - # Insert the account into the database - $user->addToDatabase(); - $user->saveSettings(); + $promotions = array_diff( array_filter( self::$permitRoles, array( $this, 'hasOption' ) ), $inGroups ); - # Promote user - if ( $this->hasOption( 'sysop' ) ) { - $user->addGroup( 'sysop' ); + if ( $exists && !$password && count( $promotions ) === 0 ) { + $this->output( "Account exists and nothing to do.\n" ); + return; + } else if ( count( $promotions ) !== 0 ) { + $promoText = "User:{$username} into " . implode( ', ', $promotions ) . "...\n"; + if ( $exists ) { + $this->output( wfWikiID() . ": Promoting $promoText" ); + } else { + $this->output( wfWikiID() . ": Creating and promoting $promoText" ); + } } - if ( $this->hasOption( 'bureaucrat' ) ) { - $user->addGroup( 'bureaucrat' ); + + if ( $password ) { + # Try to set the password + try { + $user->setPassword( $password ); + if ( $exists ) { + $this->output( "Password set.\n" ); + $user->saveSettings(); + } + } catch ( PasswordError $pwe ) { + $this->error( $pwe->getText(), true ); + } } - # Increment site_stats.ss_users - $ssu = new SiteStatsUpdate( 0, 0, 0, 0, 1 ); - $ssu->doUpdate(); + if ( !$exists ) { + # Insert the account into the database + $user->addToDatabase(); + $user->saveSettings(); + } + + # Promote user + array_map( array( $user, 'addGroup' ), $promotions ); + + if ( !$exists ) { + # Increment site_stats.ss_users + $ssu = new SiteStatsUpdate( 0, 0, 0, 0, 1 ); + $ssu->doUpdate(); + } $this->output( "done.\n" ); } -- 2.20.1