Merge #20105 - Fix #19891 - invalid $cfg['Export']['format'] or $cfg['Import']['format'] defaulting to sql in dropdown

Pull-request: #20105
Fixes: #19891
Signed-off-by: William Desportes <williamdes@wdes.fr>
This commit is contained in:
William Desportes 2026-03-17 12:55:30 +01:00
commit 6f66b76c5d
No known key found for this signature in database
GPG Key ID: 70684F4717D49A31
6 changed files with 53 additions and 0 deletions

View File

@ -94,6 +94,7 @@ final class ImportController extends AbstractController
];
$default = isset($_GET['format']) ? (string) $_GET['format'] : Plugins::getDefault('Import', 'format');
$default = Plugins::validatePluginNameOrUseDefault($importList, $default);
$choice = Plugins::getChoice($importList, $default);
$options = Plugins::getOptions('Import', $importList);
$skipQueriesDefault = Plugins::getDefault('Import', 'skip_queries');

View File

@ -79,6 +79,7 @@ final class ImportController extends AbstractController
];
$default = isset($_GET['format']) ? (string) $_GET['format'] : Plugins::getDefault('Import', 'format');
$default = Plugins::validatePluginNameOrUseDefault($importList, $default);
$choice = Plugins::getChoice($importList, $default);
$options = Plugins::getOptions('Import', $importList);
$skipQueriesDefault = Plugins::getDefault('Import', 'skip_queries');

View File

@ -92,6 +92,7 @@ final class ImportController extends AbstractController
];
$default = isset($_GET['format']) ? (string) $_GET['format'] : Plugins::getDefault('Import', 'format');
$default = Plugins::validatePluginNameOrUseDefault($importList, $default);
$choice = Plugins::getChoice($importList, $default);
$options = Plugins::getOptions('Import', $importList);
$skipQueriesDefault = Plugins::getDefault('Import', 'skip_queries');

View File

@ -132,6 +132,8 @@ final class Options
}
$default = isset($_GET['what']) ? (string) $_GET['what'] : Plugins::getDefault('Export', 'format');
$default = Plugins::validatePluginNameOrUseDefault($exportList, $default);
$dropdown = Plugins::getChoice($exportList, $default);
$tableObject = new Table($table, $db);
$rows = [];

View File

@ -25,10 +25,12 @@ use SplFileInfo;
use Throwable;
use function __;
use function array_map;
use function class_exists;
use function count;
use function get_class;
use function htmlspecialchars;
use function in_array;
use function is_subclass_of;
use function mb_strpos;
use function mb_strtolower;
@ -189,6 +191,25 @@ class Plugins
return '';
}
/**
* Validates the plugin name and returns it, or falls back to 'sql' if invalid.
*
* @param ExportPlugin[]|ImportPlugin[] $plugins
*/
public static function validatePluginNameOrUseDefault(array $plugins, string $pluginName): string
{
// If the format is invalid, fall back to 'sql' (issue: #19891)
$validNames = array_map(static function ($plugin) {
return $plugin->getName();
}, $plugins);
if (! in_array($pluginName, $validNames, true)) {
return 'sql';
}
return $pluginName;
}
/**
* Returns default value for option $opt
*

View File

@ -125,4 +125,31 @@ class PluginsTest extends AbstractTestCase
];
self::assertSame($expected, $actual);
}
public function testValidatePluginNameOrUseDefaultForExport(): void
{
$exportList = [
new Plugins\Export\ExportJson(),
new Plugins\Export\ExportOds(),
new Plugins\Export\ExportSql(),
new Plugins\Export\ExportXml(),
];
$actual = Plugins::validatePluginNameOrUseDefault($exportList, 'xml');
self::assertSame('xml', $actual);
$actual = Plugins::validatePluginNameOrUseDefault($exportList, 'lmx');
self::assertSame('sql', $actual);
}
public function testValidatePluginNameOrUseDefaultForImport(): void
{
$importList = [
new Plugins\Import\ImportOds(),
new Plugins\Import\ImportSql(),
new Plugins\Import\ImportXml(),
];
$actual = Plugins::validatePluginNameOrUseDefault($importList, 'xml');
self::assertSame('xml', $actual);
$actual = Plugins::validatePluginNameOrUseDefault($importList, 'lmx');
self::assertSame('sql', $actual);
}
}