X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=maintenance%2FcreateAndPromote.php;h=03e690475a987036ddb62230af5788caabec033a;hb=ab23aad688242fc17eebe28cab9590ec317d8bcf;hp=ad5333fcc7c6b1a9cbfc72ba319745ec5884c5fc;hpb=987319a54adf9f6208534b5ac3b60d6f88bbf7e4;p=lhc%2Fweb%2Fwiklou.git diff --git a/maintenance/createAndPromote.php b/maintenance/createAndPromote.php index ad5333fcc7..861b364b68 100644 --- a/maintenance/createAndPromote.php +++ b/maintenance/createAndPromote.php @@ -1,6 +1,6 @@ + * @author Pablo Castellano */ -require_once( __DIR__ . '/Maintenance.php' ); +require_once __DIR__ . '/Maintenance.php'; /** - * Maintenance script to create an account and grant it administrator rights. + * Maintenance script to create an account and grant it rights. * * @ingroup Maintenance */ class CreateAndPromote extends Maintenance { + private static $permitRoles = array( 'sysop', 'bureaucrat', 'bot' ); 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->addOption( + 'custom-groups', + 'Comma-separated list of groups to add the user to', + false, + true + ); + $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 ); + } elseif ( !$exists && !$password ) { + $this->error( "Argument required!", false ); + $this->maybeHelp( true ); + } elseif ( $exists ) { + $inGroups = $user->getGroups(); + } + + $groups = array_filter( self::$permitRoles, array( $this, 'hasOption' ) ); + if ( $this->hasOption( 'custom-groups' ) ) { + $customGroupsText = $this->getOption( 'custom-groups' ); + if ( $customGroupsText !== '' ) { + $customGroups = explode( ',', $customGroupsText ); + foreach ( $customGroups as $customGroup ) { + $groups[] = trim( $customGroup ); + } + } } - # Insert the account into the database - $user->addToDatabase(); - $user->saveSettings(); + $promotions = array_diff( + $groups, + $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; + } elseif ( 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 ( $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 ); + } } - if ( $this->hasOption( 'bureaucrat' ) ) { - $user->addGroup( 'bureaucrat' ); + + if ( !$exists ) { + # Insert the account into the database + $user->addToDatabase(); + $user->saveSettings(); } - # Increment site_stats.ss_users - $ssu = new SiteStatsUpdate( 0, 0, 0, 0, 1 ); - $ssu->doUpdate(); + # 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" ); } } $maintClass = "CreateAndPromote"; -require_once( RUN_MAINTENANCE_IF_MAIN ); +require_once RUN_MAINTENANCE_IF_MAIN;