Make maintenance scripts fail on unknown parameters

Passing parameters not registered via standard mechanisms
(addOption/$optionsWithArgs/$optionsWihtoutArgs) will now
cause an error, unless, the script opts out via the new
setAllowUnregisteredOptions/$allowUnregisteredOptions.

Bug: T110209
Change-Id: I21957837f10852169ca3e1eeca9bf1f4052f8c0b
This commit is contained in:
Bill Pirkle 2018-08-02 15:10:31 -05:00
parent a14133e55c
commit 2bd7259a2c
3 changed files with 42 additions and 4 deletions

View file

@ -85,6 +85,9 @@ abstract class Maintenance {
// This is the list of arguments that were actually passed
protected $mArgs = [];
// Allow arbitrary options to be passed, or only specified ones?
protected $mAllowUnregisteredOptions = false;
// Name of the script currently running
protected $mSelf;
@ -210,6 +213,16 @@ abstract class Maintenance {
*/
abstract public function execute();
/**
* Checks to see if a particular option in supported. Normally this means it
* has been registered by the script via addOption.
* @param string $name The name of the option
* @return bool true if the option exists, false otherwise
*/
protected function supportsOption( $name ) {
return isset( $this->mParams[$name] );
}
/**
* Add a parameter to the script. Will be displayed on --help
* with the associated description
@ -238,8 +251,8 @@ abstract class Maintenance {
}
/**
* Checks to see if a particular param exists.
* @param string $name The name of the param
* Checks to see if a particular option exists.
* @param string $name The name of the option
* @return bool
*/
protected function hasOption( $name ) {
@ -289,6 +302,15 @@ abstract class Maintenance {
unset( $this->mParams[$name] );
}
/**
* Sets whether to allow unregistered options, which are options passed to
* a script that do not match an expected parameter.
* @param bool $allow Should we allow?
*/
protected function setAllowUnregisteredOptions( $allow ) {
$this->mAllowUnregisteredOptions = $allow;
}
/**
* Set the description text.
* @param string $text The text of the description
@ -974,6 +996,15 @@ abstract class Maintenance {
$die = true;
}
}
if ( !$this->mAllowUnregisteredOptions ) {
# Check for unexpected options
foreach ( $this->mOptions as $opt => $val ) {
if ( !$this->supportsOption( $opt ) ) {
$this->error( "Unexpected option $opt!" );
$die = true;
}
}
}
if ( $die ) {
$this->maybeHelp( true );

View file

@ -24,7 +24,7 @@
require_once __DIR__ . '/Maintenance.php';
// phpcs:ignore MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
global $optionsWithArgs, $optionsWithoutArgs;
global $optionsWithArgs, $optionsWithoutArgs, $allowUnregisteredOptions;
if ( !isset( $optionsWithArgs ) ) {
$optionsWithArgs = [];
@ -32,19 +32,25 @@ if ( !isset( $optionsWithArgs ) ) {
if ( !isset( $optionsWithoutArgs ) ) {
$optionsWithoutArgs = [];
}
if ( !isset( $allowUnregisteredOptions ) ) {
$allowUnregisteredOptions = false;
}
class CommandLineInc extends Maintenance {
public function __construct() {
// phpcs:ignore MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
global $optionsWithArgs, $optionsWithoutArgs;
global $optionsWithArgs, $optionsWithoutArgs, $allowUnregisteredOptions;
parent::__construct();
foreach ( $optionsWithArgs as $name ) {
$this->addOption( $name, '', false, true );
}
foreach ( $optionsWithoutArgs as $name ) {
$this->addOption( $name, '', false, false );
}
$this->setAllowUnregisteredOptions( $allowUnregisteredOptions );
}
/**

View file

@ -29,6 +29,7 @@ class PHPUnitMaintClass extends Maintenance {
public function __construct() {
parent::__construct();
$this->setAllowUnregisteredOptions( true );
$this->addOption(
'with-phpunitclass',
'Class name of the PHPUnit entry point to use',