diff --git a/application/utils.inc.php b/application/utils.inc.php index 50ebdc622..3cab0eb2d 100644 --- a/application/utils.inc.php +++ b/application/utils.inc.php @@ -122,6 +122,11 @@ class utils * @since 3.0.0 */ public const ENUM_SANITIZATION_FILTER_VARIABLE_NAME = 'variable_name'; + /** + * @var string For module codes (e.g. `itop-portal-base`, `combodo-webhook-integration`, `some-module-code-x.y`, ...) + * @since 3.2.3 3.3.0 N°8554 + */ + public const ENUM_SANITIZATION_FILTER_MODULE_CODE = 'module_code'; /** * @var string * @since 2.7.10 3.0.0 @@ -393,6 +398,7 @@ class utils * @since 2.7.10 N°6606 use the utils::ENUM_SANITIZATION_* const * @since 2.7.10 N°6606 new case for ENUM_SANITIZATION_FILTER_PHP_CLASS * @since 3.2.1-1 N°8242 Allow value to be an array for every filter + * @since 3.2.3 3.3.0 N°8554 new case for ENUM_SANITIZATION_FILTER_MODULE_CODE * * @link https://www.php.net/manual/en/filter.filters.sanitize.php PHP sanitization filters */ @@ -480,7 +486,7 @@ class utils ); break; - // For XML / HTML node id selector + // For XML / HTML node selector case static::ENUM_SANITIZATION_FILTER_ELEMENT_SELECTOR: $retValue = filter_var( $value, @@ -493,6 +499,15 @@ class utils $retValue = preg_replace('/[^a-zA-Z0-9_]/', '', $value); break; + case static::ENUM_SANITIZATION_FILTER_MODULE_CODE: + // Module codes allow all alphabets letters, numbers, dash and dot characters + $retValue = filter_var( + $value, + FILTER_VALIDATE_REGEXP, + ['options' => ['regexp' => '/^[\p{L}\d.-]+$/u']] + ); + break; + // For URL case static::ENUM_SANITIZATION_FILTER_URL: $retValue = filter_var($value, FILTER_SANITIZE_URL); diff --git a/datamodels/2.x/itop-hub-connector/ajax.php b/datamodels/2.x/itop-hub-connector/ajax.php index 0f8d0e0b4..18fb365a4 100644 --- a/datamodels/2.x/itop-hub-connector/ajax.php +++ b/datamodels/2.x/itop-hub-connector/ajax.php @@ -242,8 +242,8 @@ try { throw new SecurityException(Dict::S('iTopHub:FailAuthent')); } // First step: prepare the datamodel, if it fails, roll-back - $aSelectedExtensionCodes = utils::ReadParam('extension_codes', []); - $aSelectedExtensionDirs = utils::ReadParam('extension_dirs', []); + $aSelectedExtensionCodes = utils::ReadParam('extension_codes', [], false, utils::ENUM_SANITIZATION_FILTER_MODULE_CODE); + $aSelectedExtensionDirs = utils::ReadParam('extension_dirs', [], false, utils::ENUM_SANITIZATION_FILTER_MODULE_CODE); $oRuntimeEnv = new HubRunTimeEnvironment('production', false); // use a temp environment: production-build $oRuntimeEnv->MoveSelectedExtensions(APPROOT.'/data/downloaded-extensions/', $aSelectedExtensionDirs); diff --git a/tests/php-unit-tests/unitary-tests/application/utilsTest.php b/tests/php-unit-tests/unitary-tests/application/utilsTest.php index b12ca6eff..c0ca39975 100644 --- a/tests/php-unit-tests/unitary-tests/application/utilsTest.php +++ b/tests/php-unit-tests/unitary-tests/application/utilsTest.php @@ -834,6 +834,11 @@ HTML, 'good element_identifier' => [utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER, 'AD05nb', 'AD05nb'], 'bad element_identifier' => [utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER, 'AD05nb+', 'AD05nb'], 'array' => [utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER, ['AD05nb+','apply_modify'], ['AD05nb','apply_modify']], + 'good module code' => [utils::ENUM_SANITIZATION_FILTER_MODULE_CODE, 'some-module-code', 'some-module-code'], + 'good module code with capitalized letters' => [utils::ENUM_SANITIZATION_FILTER_MODULE_CODE, 'SOME-module-code', 'SOME-module-code'], + 'good module code with dot' => [utils::ENUM_SANITIZATION_FILTER_MODULE_CODE, 'some-module-code-for-3.2-version', 'some-module-code-for-3.2-version'], + 'bad module code with underscores' => [utils::ENUM_SANITIZATION_FILTER_MODULE_CODE, 'some_module_code', null], + 'bad module code with slashes' => [utils::ENUM_SANITIZATION_FILTER_MODULE_CODE, 'some-module/code', null], 'good url' => [utils::ENUM_SANITIZATION_FILTER_URL, 'https://www.w3schools.com', 'https://www.w3schools.com'], 'bad url' => [utils::ENUM_SANITIZATION_FILTER_URL, 'https//www.w3schools.com', null], 'url with injection' => [utils::ENUM_SANITIZATION_FILTER_URL, 'https://demo.combodo.com/simple/pages/UI.php?operation=full_text&text=', 'https://demo.combodo.com/simple/pages/UI.php?operation=full_text&text='],