diff --git a/libraries/classes/Config/ConfigFile.php b/libraries/classes/Config/ConfigFile.php index 718750348c2a..101fc8cd8338 100644 --- a/libraries/classes/Config/ConfigFile.php +++ b/libraries/classes/Config/ConfigFile.php @@ -9,9 +9,12 @@ use PhpMyAdmin\Core; +use function __; +use function _pgettext; use function array_diff; use function array_flip; use function array_keys; +use function array_merge; use function count; use function is_array; use function preg_replace; @@ -32,7 +35,7 @@ class ConfigFile /** * Stores allowed values for non-standard fields * - * @var array + * @var array */ private array $cfgDb; @@ -84,7 +87,7 @@ public function __construct(array|null $baseConfig = null) $this->defaultCfg = $settings->asArray(); // load additional config information - $this->cfgDb = include ROOT_PATH . 'libraries/config.values.php'; + $this->cfgDb = $this->getAllowedValues(); // apply default values overrides if (count($this->cfgDb['_overrides'])) { @@ -489,4 +492,476 @@ public function getConfigArray(): array return $c; } + + /** + * Database with allowed values for configuration stored in the $cfg array, + * used by setup script and user preferences to generate forms. + * + * Value meaning: + * array - select field, array contains allowed values + * string - type override + * + * @return array + */ + public function getAllowedValues(): array + { + return [ + 'Servers' => [ + 1 => [ + 'port' => 'integer', + 'auth_type' => [ + 'config', + 'http', + 'signon', + 'cookie', + ], + 'AllowDeny' => [ + 'order' => [ + '', + 'deny,allow', + 'allow,deny', + 'explicit', + ], + ], + 'only_db' => 'array', + ], + ], + 'RecodingEngine' => [ + 'auto', + 'iconv', + 'recode', + 'mb', + 'none', + ], + 'OBGzip' => [ + 'auto', + true, + false, + ], + 'MemoryLimit' => 'short_string', + 'NavigationLogoLinkWindow' => [ + 'main', + 'new', + ], + 'NavigationTreeDefaultTabTable' => [ + // fields list + 'structure' => __('Structure'), + // SQL form + 'sql' => __('SQL'), + // search page + 'search' => __('Search'), + // insert row page + 'insert' => __('Insert'), + // browse page + 'browse' => __('Browse'), + ], + 'NavigationTreeDefaultTabTable2' => [ + //don't display + '' => '', + // fields list + 'structure' => __('Structure'), + // SQL form + 'sql' => __('SQL'), + // search page + 'search' => __('Search'), + // insert row page + 'insert' => __('Insert'), + // browse page + 'browse' => __('Browse'), + ], + 'NavigationTreeDbSeparator' => 'short_string', + 'NavigationTreeTableSeparator' => 'short_string', + 'NavigationWidth' => 'integer', + 'TableNavigationLinksMode' => [ + 'icons' => __('Icons'), + 'text' => __('Text'), + 'both' => __('Both'), + ], + 'MaxRows' => [ + 25, + 50, + 100, + 250, + 500, + ], + 'Order' => [ + 'ASC', + 'DESC', + 'SMART', + ], + 'RowActionLinks' => [ + 'none' => __('Nowhere'), + 'left' => __('Left'), + 'right' => __('Right'), + 'both' => __('Both'), + ], + 'TablePrimaryKeyOrder' => [ + 'NONE' => __('None'), + 'ASC' => __('Ascending'), + 'DESC' => __('Descending'), + ], + 'ProtectBinary' => [ + false, + 'blob', + 'noblob', + 'all', + ], + 'CharEditing' => [ + 'input', + 'textarea', + ], + 'TabsMode' => [ + 'icons' => __('Icons'), + 'text' => __('Text'), + 'both' => __('Both'), + ], + 'PDFDefaultPageSize' => [ + 'A3' => 'A3', + 'A4' => 'A4', + 'A5' => 'A5', + 'letter' => 'letter', + 'legal' => 'legal', + ], + 'ActionLinksMode' => [ + 'icons' => __('Icons'), + 'text' => __('Text'), + 'both' => __('Both'), + ], + 'GridEditing' => [ + 'click' => __('Click'), + 'double-click' => __('Double click'), + 'disabled' => __('Disabled'), + ], + 'RelationalDisplay' => [ + 'K' => __('key'), + 'D' => __('display column'), + ], + 'DefaultTabServer' => [ + // the welcome page (recommended for multiuser setups) + 'welcome' => __('Welcome'), + // list of databases + 'databases' => __('Databases'), + // runtime information + 'status' => __('Status'), + // MySQL server variables + 'variables' => __('Variables'), + // user management + 'privileges' => __('Privileges'), + ], + 'DefaultTabDatabase' => [ + // tables list + 'structure' => __('Structure'), + // SQL form + 'sql' => __('SQL'), + // search query + 'search' => __('Search'), + // operations on database + 'operations' => __('Operations'), + ], + 'DefaultTabTable' => [ + // fields list + 'structure' => __('Structure'), + // SQL form + 'sql' => __('SQL'), + // search page + 'search' => __('Search'), + // insert row page + 'insert' => __('Insert'), + // browse page + 'browse' => __('Browse'), + ], + 'InitialSlidersState' => [ + 'open' => __('Open'), + 'closed' => __('Closed'), + 'disabled' => __('Disabled'), + ], + 'FirstDayOfCalendar' => [ + '1' => _pgettext('Week day name', 'Monday'), + '2' => _pgettext('Week day name', 'Tuesday'), + '3' => _pgettext('Week day name', 'Wednesday'), + '4' => _pgettext('Week day name', 'Thursday'), + '5' => _pgettext('Week day name', 'Friday'), + '6' => _pgettext('Week day name', 'Saturday'), + '7' => _pgettext('Week day name', 'Sunday'), + ], + 'SendErrorReports' => [ + 'ask' => __('Ask before sending error reports'), + 'always' => __('Always send error reports'), + 'never' => __('Never send error reports'), + ], + 'DefaultForeignKeyChecks' => [ + 'default' => __('Server default'), + 'enable' => __('Enable'), + 'disable' => __('Disable'), + ], + + 'Import' => [ + 'format' => [ + // CSV + 'csv', + // DocSQL + 'docsql', + // CSV using LOAD DATA + 'ldi', + // SQL + 'sql', + ], + 'charset' => array_merge([''], $GLOBALS['cfg']['AvailableCharsets'] ?? []), + 'sql_compatibility' => [ + 'NONE', + 'ANSI', + 'DB2', + 'MAXDB', + 'MYSQL323', + 'MYSQL40', + 'MSSQL', + 'ORACLE', + // removed; in MySQL 5.0.33, this produces exports that + // can't be read by POSTGRESQL (see our bug #1596328) + //'POSTGRESQL', + 'TRADITIONAL', + ], + 'csv_terminated' => 'short_string', + 'csv_enclosed' => 'short_string', + 'csv_escaped' => 'short_string', + 'ldi_terminated' => 'short_string', + 'ldi_enclosed' => 'short_string', + 'ldi_escaped' => 'short_string', + 'ldi_local_option' => [ + 'auto', + true, + false, + ], + ], + + 'Export' => [ + '_sod_select' => [ + 'structure' => __('structure'), + 'data' => __('data'), + 'structure_and_data' => __('structure and data'), + ], + 'method' => [ + 'quick' => __('Quick - display only the minimal options to configure'), + 'custom' => __('Custom - display all possible options to configure'), + 'custom-no-form' => __('Custom - like above, but without the quick/custom choice'), + ], + 'format' => [ + 'codegen', + 'csv', + 'excel', + 'htmlexcel', + 'htmlword', + 'latex', + 'ods', + 'odt', + 'pdf', + 'sql', + 'texytext', + 'xml', + 'yaml', + ], + 'compression' => [ + 'none', + 'zip', + 'gzip', + ], + 'charset' => array_merge([''], $GLOBALS['cfg']['AvailableCharsets'] ?? []), + 'sql_compatibility' => [ + 'NONE', + 'ANSI', + 'DB2', + 'MAXDB', + 'MYSQL323', + 'MYSQL40', + 'MSSQL', + 'ORACLE', + // removed; in MySQL 5.0.33, this produces exports that + // can't be read by POSTGRESQL (see our bug #1596328) + //'POSTGRESQL', + 'TRADITIONAL', + ], + 'codegen_format' => [ + '#', + 'NHibernate C# DO', + 'NHibernate XML', + ], + 'csv_separator' => 'short_string', + 'csv_terminated' => 'short_string', + 'csv_enclosed' => 'short_string', + 'csv_escaped' => 'short_string', + 'csv_null' => 'short_string', + 'excel_null' => 'short_string', + 'excel_edition' => [ + 'win' => 'Windows', + 'mac_excel2003' => 'Excel 2003 / Macintosh', + 'mac_excel2008' => 'Excel 2008 / Macintosh', + ], + 'sql_structure_or_data' => [ + 'structure' => __('structure'), + 'data' => __('data'), + 'structure_and_data' => __('structure and data'), + ], + 'sql_type' => [ + 'INSERT', + 'UPDATE', + 'REPLACE', + ], + 'sql_insert_syntax' => [ + 'complete' => __('complete inserts'), + 'extended' => __('extended inserts'), + 'both' => __('both of the above'), + 'none' => __('neither of the above'), + ], + 'htmlword_structure_or_data' => [ + 'structure' => __('structure'), + 'data' => __('data'), + 'structure_and_data' => __('structure and data'), + ], + 'htmlword_null' => 'short_string', + 'ods_null' => 'short_string', + 'odt_null' => 'short_string', + 'odt_structure_or_data' => [ + 'structure' => __('structure'), + 'data' => __('data'), + 'structure_and_data' => __('structure and data'), + ], + 'texytext_structure_or_data' => [ + 'structure' => __('structure'), + 'data' => __('data'), + 'structure_and_data' => __('structure and data'), + ], + 'texytext_null' => 'short_string', + ], + + 'Console' => [ + 'Mode' => [ + 'info', + 'show', + 'collapse', + ], + 'OrderBy' => [ + 'exec', + 'time', + 'count', + ], + 'Order' => [ + 'asc', + 'desc', + ], + ], + + /** + * Default values overrides + * Use only full paths + */ + '_overrides' => [], + + /** + * Basic validator assignments (functions from libraries/config/Validator.php + * and 'window.validators' object in js/config.js) + * Use only full paths and form ids + */ + '_validators' => [ + 'Console/Height' => 'validateNonNegativeNumber', + 'CharTextareaCols' => 'validatePositiveNumber', + 'CharTextareaRows' => 'validatePositiveNumber', + 'ExecTimeLimit' => 'validateNonNegativeNumber', + 'Export/sql_max_query_size' => 'validatePositiveNumber', + 'FirstLevelNavigationItems' => 'validatePositiveNumber', + 'ForeignKeyMaxLimit' => 'validatePositiveNumber', + 'Import/csv_enclosed' => [ + [ + 'validateByRegex', + '/^.?$/', + ], + ], + 'Import/csv_escaped' => [ + [ + 'validateByRegex', + '/^.$/', + ], + ], + 'Import/csv_terminated' => [ + [ + 'validateByRegex', + '/^.$/', + ], + ], + 'Import/ldi_enclosed' => [ + [ + 'validateByRegex', + '/^.?$/', + ], + ], + 'Import/ldi_escaped' => [ + [ + 'validateByRegex', + '/^.$/', + ], + ], + 'Import/ldi_terminated' => [ + [ + 'validateByRegex', + '/^.$/', + ], + ], + 'Import/skip_queries' => 'validateNonNegativeNumber', + 'InsertRows' => 'validatePositiveNumber', + 'NumRecentTables' => 'validateNonNegativeNumber', + 'NumFavoriteTables' => 'validateNonNegativeNumber', + 'LimitChars' => 'validatePositiveNumber', + 'LoginCookieValidity' => 'validatePositiveNumber', + 'LoginCookieStore' => 'validateNonNegativeNumber', + 'MaxDbList' => 'validatePositiveNumber', + 'MaxNavigationItems' => 'validatePositiveNumber', + 'MaxCharactersInDisplayedSQL' => 'validatePositiveNumber', + 'MaxRows' => 'validatePositiveNumber', + 'MaxSizeForInputField' => 'validatePositiveNumber', + 'MinSizeForInputField' => 'validateNonNegativeNumber', + 'MaxTableList' => 'validatePositiveNumber', + 'MemoryLimit' => [ + [ + 'validateByRegex', + '/^(-1|(\d+(?:[kmg])?))$/i', + ], + ], + 'NavigationTreeDisplayItemFilterMinimum' => 'validatePositiveNumber', + 'NavigationTreeTableLevel' => 'validatePositiveNumber', + 'NavigationWidth' => 'validateNonNegativeNumber', + 'QueryHistoryMax' => 'validatePositiveNumber', + 'RepeatCells' => 'validateNonNegativeNumber', + 'Server' => 'validateServer', + 'Server_pmadb' => 'validatePMAStorage', + 'Servers/1/port' => 'validatePortNumber', + 'Servers/1/hide_db' => 'validateRegex', + 'TextareaCols' => 'validatePositiveNumber', + 'TextareaRows' => 'validatePositiveNumber', + 'TrustedProxies' => 'validateTrustedProxies', + ], + + /** + * Additional validators used for user preferences + */ + '_userValidators' => [ + 'MaxDbList' => [ + [ + 'validateUpperBound', + 'value:MaxDbList', + ], + ], + 'MaxTableList' => [ + [ + 'validateUpperBound', + 'value:MaxTableList', + ], + ], + 'QueryHistoryMax' => [ + [ + 'validateUpperBound', + 'value:QueryHistoryMax', + ], + ], + ], + ]; + } } diff --git a/libraries/config.values.php b/libraries/config.values.php deleted file mode 100644 index e74efddeb34e..000000000000 --- a/libraries/config.values.php +++ /dev/null @@ -1,477 +0,0 @@ - [ - 1 => [ - 'port' => 'integer', - 'auth_type' => [ - 'config', - 'http', - 'signon', - 'cookie', - ], - 'AllowDeny' => [ - 'order' => [ - '', - 'deny,allow', - 'allow,deny', - 'explicit', - ], - ], - 'only_db' => 'array', - ], - ], - 'RecodingEngine' => [ - 'auto', - 'iconv', - 'recode', - 'mb', - 'none', - ], - 'OBGzip' => [ - 'auto', - true, - false, - ], - 'MemoryLimit' => 'short_string', - 'NavigationLogoLinkWindow' => [ - 'main', - 'new', - ], - 'NavigationTreeDefaultTabTable' => [ - // fields list - 'structure' => __('Structure'), - // SQL form - 'sql' => __('SQL'), - // search page - 'search' => __('Search'), - // insert row page - 'insert' => __('Insert'), - // browse page - 'browse' => __('Browse'), - ], - 'NavigationTreeDefaultTabTable2' => [ - //don't display - '' => '', - // fields list - 'structure' => __('Structure'), - // SQL form - 'sql' => __('SQL'), - // search page - 'search' => __('Search'), - // insert row page - 'insert' => __('Insert'), - // browse page - 'browse' => __('Browse'), - ], - 'NavigationTreeDbSeparator' => 'short_string', - 'NavigationTreeTableSeparator' => 'short_string', - 'NavigationWidth' => 'integer', - 'TableNavigationLinksMode' => [ - 'icons' => __('Icons'), - 'text' => __('Text'), - 'both' => __('Both'), - ], - 'MaxRows' => [ - 25, - 50, - 100, - 250, - 500, - ], - 'Order' => [ - 'ASC', - 'DESC', - 'SMART', - ], - 'RowActionLinks' => [ - 'none' => __('Nowhere'), - 'left' => __('Left'), - 'right' => __('Right'), - 'both' => __('Both'), - ], - 'TablePrimaryKeyOrder' => [ - 'NONE' => __('None'), - 'ASC' => __('Ascending'), - 'DESC' => __('Descending'), - ], - 'ProtectBinary' => [ - false, - 'blob', - 'noblob', - 'all', - ], - 'CharEditing' => [ - 'input', - 'textarea', - ], - 'TabsMode' => [ - 'icons' => __('Icons'), - 'text' => __('Text'), - 'both' => __('Both'), - ], - 'PDFDefaultPageSize' => [ - 'A3' => 'A3', - 'A4' => 'A4', - 'A5' => 'A5', - 'letter' => 'letter', - 'legal' => 'legal', - ], - 'ActionLinksMode' => [ - 'icons' => __('Icons'), - 'text' => __('Text'), - 'both' => __('Both'), - ], - 'GridEditing' => [ - 'click' => __('Click'), - 'double-click' => __('Double click'), - 'disabled' => __('Disabled'), - ], - 'RelationalDisplay' => [ - 'K' => __('key'), - 'D' => __('display column'), - ], - 'DefaultTabServer' => [ - // the welcome page (recommended for multiuser setups) - 'welcome' => __('Welcome'), - // list of databases - 'databases' => __('Databases'), - // runtime information - 'status' => __('Status'), - // MySQL server variables - 'variables' => __('Variables'), - // user management - 'privileges' => __('Privileges'), - ], - 'DefaultTabDatabase' => [ - // tables list - 'structure' => __('Structure'), - // SQL form - 'sql' => __('SQL'), - // search query - 'search' => __('Search'), - // operations on database - 'operations' => __('Operations'), - ], - 'DefaultTabTable' => [ - // fields list - 'structure' => __('Structure'), - // SQL form - 'sql' => __('SQL'), - // search page - 'search' => __('Search'), - // insert row page - 'insert' => __('Insert'), - // browse page - 'browse' => __('Browse'), - ], - 'InitialSlidersState' => [ - 'open' => __('Open'), - 'closed' => __('Closed'), - 'disabled' => __('Disabled'), - ], - 'FirstDayOfCalendar' => [ - '1' => _pgettext('Week day name', 'Monday'), - '2' => _pgettext('Week day name', 'Tuesday'), - '3' => _pgettext('Week day name', 'Wednesday'), - '4' => _pgettext('Week day name', 'Thursday'), - '5' => _pgettext('Week day name', 'Friday'), - '6' => _pgettext('Week day name', 'Saturday'), - '7' => _pgettext('Week day name', 'Sunday'), - ], - 'SendErrorReports' => [ - 'ask' => __('Ask before sending error reports'), - 'always' => __('Always send error reports'), - 'never' => __('Never send error reports'), - ], - 'DefaultForeignKeyChecks' => [ - 'default' => __('Server default'), - 'enable' => __('Enable'), - 'disable' => __('Disable'), - ], - - 'Import' => [ - 'format' => [ - // CSV - 'csv', - // DocSQL - 'docsql', - // CSV using LOAD DATA - 'ldi', - // SQL - 'sql', - ], - 'charset' => array_merge([''], $GLOBALS['cfg']['AvailableCharsets'] ?? []), - 'sql_compatibility' => [ - 'NONE', - 'ANSI', - 'DB2', - 'MAXDB', - 'MYSQL323', - 'MYSQL40', - 'MSSQL', - 'ORACLE', - // removed; in MySQL 5.0.33, this produces exports that - // can't be read by POSTGRESQL (see our bug #1596328) - //'POSTGRESQL', - 'TRADITIONAL', - ], - 'csv_terminated' => 'short_string', - 'csv_enclosed' => 'short_string', - 'csv_escaped' => 'short_string', - 'ldi_terminated' => 'short_string', - 'ldi_enclosed' => 'short_string', - 'ldi_escaped' => 'short_string', - 'ldi_local_option' => [ - 'auto', - true, - false, - ], - ], - - 'Export' => [ - '_sod_select' => [ - 'structure' => __('structure'), - 'data' => __('data'), - 'structure_and_data' => __('structure and data'), - ], - 'method' => [ - 'quick' => __('Quick - display only the minimal options to configure'), - 'custom' => __('Custom - display all possible options to configure'), - 'custom-no-form' => __('Custom - like above, but without the quick/custom choice'), - ], - 'format' => [ - 'codegen', - 'csv', - 'excel', - 'htmlexcel', - 'htmlword', - 'latex', - 'ods', - 'odt', - 'pdf', - 'sql', - 'texytext', - 'xml', - 'yaml', - ], - 'compression' => [ - 'none', - 'zip', - 'gzip', - ], - 'charset' => array_merge([''], $GLOBALS['cfg']['AvailableCharsets'] ?? []), - 'sql_compatibility' => [ - 'NONE', - 'ANSI', - 'DB2', - 'MAXDB', - 'MYSQL323', - 'MYSQL40', - 'MSSQL', - 'ORACLE', - // removed; in MySQL 5.0.33, this produces exports that - // can't be read by POSTGRESQL (see our bug #1596328) - //'POSTGRESQL', - 'TRADITIONAL', - ], - 'codegen_format' => [ - '#', - 'NHibernate C# DO', - 'NHibernate XML', - ], - 'csv_separator' => 'short_string', - 'csv_terminated' => 'short_string', - 'csv_enclosed' => 'short_string', - 'csv_escaped' => 'short_string', - 'csv_null' => 'short_string', - 'excel_null' => 'short_string', - 'excel_edition' => [ - 'win' => 'Windows', - 'mac_excel2003' => 'Excel 2003 / Macintosh', - 'mac_excel2008' => 'Excel 2008 / Macintosh', - ], - 'sql_structure_or_data' => [ - 'structure' => __('structure'), - 'data' => __('data'), - 'structure_and_data' => __('structure and data'), - ], - 'sql_type' => [ - 'INSERT', - 'UPDATE', - 'REPLACE', - ], - 'sql_insert_syntax' => [ - 'complete' => __('complete inserts'), - 'extended' => __('extended inserts'), - 'both' => __('both of the above'), - 'none' => __('neither of the above'), - ], - 'htmlword_structure_or_data' => [ - 'structure' => __('structure'), - 'data' => __('data'), - 'structure_and_data' => __('structure and data'), - ], - 'htmlword_null' => 'short_string', - 'ods_null' => 'short_string', - 'odt_null' => 'short_string', - 'odt_structure_or_data' => [ - 'structure' => __('structure'), - 'data' => __('data'), - 'structure_and_data' => __('structure and data'), - ], - 'texytext_structure_or_data' => [ - 'structure' => __('structure'), - 'data' => __('data'), - 'structure_and_data' => __('structure and data'), - ], - 'texytext_null' => 'short_string', - ], - - 'Console' => [ - 'Mode' => [ - 'info', - 'show', - 'collapse', - ], - 'OrderBy' => [ - 'exec', - 'time', - 'count', - ], - 'Order' => [ - 'asc', - 'desc', - ], - ], - - /** - * Default values overrides - * Use only full paths - */ - '_overrides' => [], - - /** - * Basic validator assignments (functions from libraries/config/Validator.php - * and 'window.validators' object in js/config.js) - * Use only full paths and form ids - */ - '_validators' => [ - 'Console/Height' => 'validateNonNegativeNumber', - 'CharTextareaCols' => 'validatePositiveNumber', - 'CharTextareaRows' => 'validatePositiveNumber', - 'ExecTimeLimit' => 'validateNonNegativeNumber', - 'Export/sql_max_query_size' => 'validatePositiveNumber', - 'FirstLevelNavigationItems' => 'validatePositiveNumber', - 'ForeignKeyMaxLimit' => 'validatePositiveNumber', - 'Import/csv_enclosed' => [ - [ - 'validateByRegex', - '/^.?$/', - ], - ], - 'Import/csv_escaped' => [ - [ - 'validateByRegex', - '/^.$/', - ], - ], - 'Import/csv_terminated' => [ - [ - 'validateByRegex', - '/^.$/', - ], - ], - 'Import/ldi_enclosed' => [ - [ - 'validateByRegex', - '/^.?$/', - ], - ], - 'Import/ldi_escaped' => [ - [ - 'validateByRegex', - '/^.$/', - ], - ], - 'Import/ldi_terminated' => [ - [ - 'validateByRegex', - '/^.$/', - ], - ], - 'Import/skip_queries' => 'validateNonNegativeNumber', - 'InsertRows' => 'validatePositiveNumber', - 'NumRecentTables' => 'validateNonNegativeNumber', - 'NumFavoriteTables' => 'validateNonNegativeNumber', - 'LimitChars' => 'validatePositiveNumber', - 'LoginCookieValidity' => 'validatePositiveNumber', - 'LoginCookieStore' => 'validateNonNegativeNumber', - 'MaxDbList' => 'validatePositiveNumber', - 'MaxNavigationItems' => 'validatePositiveNumber', - 'MaxCharactersInDisplayedSQL' => 'validatePositiveNumber', - 'MaxRows' => 'validatePositiveNumber', - 'MaxSizeForInputField' => 'validatePositiveNumber', - 'MinSizeForInputField' => 'validateNonNegativeNumber', - 'MaxTableList' => 'validatePositiveNumber', - 'MemoryLimit' => [ - [ - 'validateByRegex', - '/^(-1|(\d+(?:[kmg])?))$/i', - ], - ], - 'NavigationTreeDisplayItemFilterMinimum' => 'validatePositiveNumber', - 'NavigationTreeTableLevel' => 'validatePositiveNumber', - 'NavigationWidth' => 'validateNonNegativeNumber', - 'QueryHistoryMax' => 'validatePositiveNumber', - 'RepeatCells' => 'validateNonNegativeNumber', - 'Server' => 'validateServer', - 'Server_pmadb' => 'validatePMAStorage', - 'Servers/1/port' => 'validatePortNumber', - 'Servers/1/hide_db' => 'validateRegex', - 'TextareaCols' => 'validatePositiveNumber', - 'TextareaRows' => 'validatePositiveNumber', - 'TrustedProxies' => 'validateTrustedProxies', - ], - - /** - * Additional validators used for user preferences - */ - '_userValidators' => [ - 'MaxDbList' => [ - [ - 'validateUpperBound', - 'value:MaxDbList', - ], - ], - 'MaxTableList' => [ - [ - 'validateUpperBound', - 'value:MaxTableList', - ], - ], - 'QueryHistoryMax' => [ - [ - 'validateUpperBound', - 'value:QueryHistoryMax', - ], - ], - ], -]; diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 9c5c87581175..1333dfd84f40 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -220,6 +220,11 @@ parameters: count: 1 path: libraries/classes/Config.php + - + message: "#^Argument of an invalid type array\\|string supplied for foreach, only iterables are supported\\.$#" + count: 1 + path: libraries/classes/Config/ConfigFile.php + - message: "#^Method PhpMyAdmin\\\\Config\\\\ConfigFile\\:\\:__construct\\(\\) has parameter \\$baseConfig with no value type specified in iterable type array\\.$#" count: 1 @@ -311,17 +316,17 @@ parameters: path: libraries/classes/Config/ConfigFile.php - - message: "#^Parameter \\#2 \\$array of static method PhpMyAdmin\\\\Core\\:\\:arrayRead\\(\\) expects array, array\\|null given\\.$#" + message: "#^Parameter \\#1 \\$value of function count expects array\\|Countable, array\\|string given\\.$#" count: 1 path: libraries/classes/Config/ConfigFile.php - - message: "#^Property PhpMyAdmin\\\\Config\\\\ConfigFile\\:\\:\\$baseCfg type has no value type specified in iterable type array\\.$#" + message: "#^Parameter \\#2 \\$array of static method PhpMyAdmin\\\\Core\\:\\:arrayRead\\(\\) expects array, array\\|null given\\.$#" count: 1 path: libraries/classes/Config/ConfigFile.php - - message: "#^Property PhpMyAdmin\\\\Config\\\\ConfigFile\\:\\:\\$cfgDb type has no value type specified in iterable type array\\.$#" + message: "#^Property PhpMyAdmin\\\\Config\\\\ConfigFile\\:\\:\\$baseCfg type has no value type specified in iterable type array\\.$#" count: 1 path: libraries/classes/Config/ConfigFile.php @@ -9175,6 +9180,11 @@ parameters: count: 1 path: test/classes/Command/WriteGitRevisionCommandTest.php + - + message: "#^Cannot access offset 'port' on mixed\\.$#" + count: 1 + path: test/classes/Config/ConfigFileTest.php + - message: "#^Call to method PHPUnit\\\\Framework\\\\Assert\\:\\:assertNotNull\\(\\) with string will always evaluate to true\\.$#" count: 3 diff --git a/psalm-baseline.xml b/psalm-baseline.xml index af37bccb9029..ef2468dd3996 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -372,12 +372,12 @@ $mapFrom $path $path - $path $k $mapTo $mapTo + $path id]['Servers'][$i + 1]]]> @@ -400,7 +400,6 @@ $mapFrom $mapFrom $path - $path $port $result[$prefix . $key] $value @@ -428,6 +427,9 @@ + + cfgDb['_overrides']]]> + id]]]> id]]]> @@ -437,13 +439,12 @@ id]]]> id]]]> + + cfgDb['_overrides']]]> + baseCfg]]> - - cfgDb['_overrides'])]]> - cfgDb['_overrides'])]]> - @@ -14387,6 +14388,9 @@ + + + $default_host $default_host @@ -14402,6 +14406,9 @@ $default_host $default_value + + + diff --git a/test/classes/Config/ConfigFileTest.php b/test/classes/Config/ConfigFileTest.php index 22adeac7d3c7..e1f3bf63d0a4 100644 --- a/test/classes/Config/ConfigFileTest.php +++ b/test/classes/Config/ConfigFileTest.php @@ -353,7 +353,7 @@ public function testGetCanonicalPath(): void */ public function testGetDbEntry(): void { - $cfg_db = include ROOT_PATH . 'libraries/config.values.php'; + $cfg_db = $this->object->getAllowedValues(); // verify that $cfg_db read from config.values.php is valid $this->assertGreaterThanOrEqual(20, count($cfg_db));