From 71b4226dc721bc0f23cc594760329f29e51defac Mon Sep 17 00:00:00 2001 From: Alexis Degrugillier Date: Tue, 19 Mar 2019 20:27:06 +0100 Subject: [PATCH] Add an option validation on cli commands (#2278) If an option used on cli is not recognized, the command aborts and displays an error message. If the typed option is similar to one of the recognized options, a hint is displayed. At the moment, there is a limitation on long options. Short options are not validated at the moment. See #2046 --- cli/_cli.php | 25 +++++++++++++++++++++++++ cli/_update-or-create-user.php | 2 +- cli/actualize-user.php | 10 ++++++---- cli/db-optimize.php | 10 ++++++---- cli/delete-user.php | 10 ++++++---- cli/do-install.php | 6 +++--- cli/export-opml-for-user.php | 10 ++++++---- cli/export-zip-for-user.php | 12 +++++++----- cli/import-for-user.php | 12 +++++++----- cli/reconfigure.php | 8 ++++++++ 10 files changed, 75 insertions(+), 30 deletions(-) diff --git a/cli/_cli.php b/cli/_cli.php index e8fb6ae42..dec244bc3 100644 --- a/cli/_cli.php +++ b/cli/_cli.php @@ -3,6 +3,9 @@ if (php_sapi_name() !== 'cli') { die('FreshRSS error: This PHP script may only be invoked from command line!'); } +const REGEX_INPUT_OPTIONS = '/^--/'; +const REGEX_PARAM_OPTIONS = '/:*$/'; + require(__DIR__ . '/../constants.php'); require(LIB_PATH . '/lib_rss.php'); //Includes class autoloader require(LIB_PATH . '/lib_install.php'); @@ -64,3 +67,25 @@ function performRequirementCheck($databaseType) { fail($message); } } + +function getLongOptions($options, $regex) { + $longOptions = array_filter($options, function($a) use ($regex) { + return preg_match($regex, $a); + }); + return array_map(function($a) use ($regex) { + return preg_replace($regex, '', $a); + }, $longOptions); +} + +function validateOptions($input, $params) { + $sanitizeInput = getLongOptions($input, REGEX_INPUT_OPTIONS); + $sanitizeParams = getLongOptions($params, REGEX_PARAM_OPTIONS); + $unknownOptions = array_diff($sanitizeInput, $sanitizeParams); + + if (0 === count($unknownOptions)) { + return true; + } + + fwrite(STDERR, sprintf("FreshRSS error: unknown options: %s\n", implode (', ', $unknownOptions))); + return false; +} diff --git a/cli/_update-or-create-user.php b/cli/_update-or-create-user.php index a5960b58a..eda597f19 100644 --- a/cli/_update-or-create-user.php +++ b/cli/_update-or-create-user.php @@ -22,7 +22,7 @@ if (!$isUpdate) { $options = getopt('', $params); -if (empty($options['user'])) { +if (!validateOptions($argv, $params) || empty($options['user'])) { fail('Usage: ' . basename($_SERVER['SCRIPT_FILENAME']) . " --user username ( --password 'password' --api_password 'api_password'" . " --language en --email user@example.net --token 'longRandomString'" . diff --git a/cli/actualize-user.php b/cli/actualize-user.php index dd07fc142..08e17de98 100755 --- a/cli/actualize-user.php +++ b/cli/actualize-user.php @@ -2,11 +2,13 @@ /path/to/file.opml.xml"); } diff --git a/cli/export-zip-for-user.php b/cli/export-zip-for-user.php index 86113d9fa..b89a55104 100755 --- a/cli/export-zip-for-user.php +++ b/cli/export-zip-for-user.php @@ -2,12 +2,14 @@ /path/to/file.zip"); } diff --git a/cli/import-for-user.php b/cli/import-for-user.php index 95ff18c8c..7c66fbef2 100755 --- a/cli/import-for-user.php +++ b/cli/import-for-user.php @@ -2,12 +2,14 @@