Skip to content

Commit 015d66c

Browse files
Merge pull request #19053 from kamil-tekiela/Refactor-import-9
Refactor instantiation of Import plugin classes
2 parents fc05252 + 30ec978 commit 015d66c

23 files changed

Lines changed: 75 additions & 104 deletions

phpstan-baseline.neon

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2592,7 +2592,7 @@ parameters:
25922592

25932593
-
25942594
message: "#^Cannot access offset 'message' on mixed\\.$#"
2595-
count: 7
2595+
count: 6
25962596
path: src/Controllers/Import/ImportController.php
25972597

25982598
-
@@ -2745,6 +2745,11 @@ parameters:
27452745
count: 1
27462746
path: src/Controllers/Import/ImportController.php
27472747

2748+
-
2749+
message: "#^Static property PhpMyAdmin\\\\Import\\\\ImportSettings\\:\\:\\$importType \\(''\\|'database'\\|'query'\\|'server'\\|'table'\\) does not accept string\\.$#"
2750+
count: 1
2751+
path: src/Controllers/Import/ImportController.php
2752+
27482753
-
27492754
message: "#^Static property PhpMyAdmin\\\\Import\\\\ImportSettings\\:\\:\\$readLimit \\(int\\) does not accept float\\|int\\<min, \\-1\\>\\|int\\<1, max\\>\\.$#"
27502755
count: 1

psalm-baseline.xml

Lines changed: 8 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1959,6 +1959,9 @@
19591959
<PossiblyInvalidPropertyAssignmentValue>
19601960
<code><![CDATA[$memoryLimit / 8]]></code>
19611961
</PossiblyInvalidPropertyAssignmentValue>
1962+
<PropertyTypeCoercion>
1963+
<code><![CDATA[(string) $request->getParsedBodyParam('import_type')]]></code>
1964+
</PropertyTypeCoercion>
19621965
<RiskyTruthyFalsyComparison>
19631966
<code><![CDATA[empty($GLOBALS['goto'])]]></code>
19641967
</RiskyTruthyFalsyComparison>
@@ -7764,10 +7767,6 @@
77647767
<code><![CDATA[getFieldNames]]></code>
77657768
<code><![CDATA[numFields]]></code>
77667769
</PossiblyFalseReference>
7767-
<PossiblyInvalidArrayOffset>
7768-
<code><![CDATA[$GLOBALS['plugin_param']['export_type']]]></code>
7769-
<code><![CDATA[$GLOBALS['plugin_param']['single_table']]]></code>
7770-
</PossiblyInvalidArrayOffset>
77717770
<PossiblyInvalidOperand>
77727771
<code><![CDATA[str_replace('_', '/', $mimeMap[$fieldName]['mimetype'])]]></code>
77737772
</PossiblyInvalidOperand>
@@ -7782,9 +7781,6 @@
77827781
<code><![CDATA[$tableAlias]]></code>
77837782
<code><![CDATA[$tableAlias]]></code>
77847783
</PossiblyNullOperand>
7785-
<RiskyTruthyFalsyComparison>
7786-
<code><![CDATA[! $GLOBALS['plugin_param']['single_table']]]></code>
7787-
</RiskyTruthyFalsyComparison>
77887784
</file>
77897785
<file src="src/Plugins/Export/ExportMediawiki.php">
77907786
<DeprecatedMethod>
@@ -7888,10 +7884,6 @@
78887884
<code><![CDATA[$GLOBALS[$GLOBALS['what'] . '_null']]]></code>
78897885
<code><![CDATA[str_replace('_', '/', $mimeMap[$fieldName]['mimetype'])]]></code>
78907886
</PossiblyInvalidArgument>
7891-
<PossiblyInvalidArrayOffset>
7892-
<code><![CDATA[$GLOBALS['plugin_param']['export_type']]]></code>
7893-
<code><![CDATA[$GLOBALS['plugin_param']['single_table']]]></code>
7894-
</PossiblyInvalidArrayOffset>
78957887
<PossiblyNullArgument>
78967888
<code><![CDATA[$row[$j]]]></code>
78977889
<code><![CDATA[$tableAlias]]></code>
@@ -7910,7 +7902,6 @@
79107902
<code><![CDATA[string]]></code>
79117903
</PossiblyUnusedReturnValue>
79127904
<RiskyTruthyFalsyComparison>
7913-
<code><![CDATA[! $GLOBALS['plugin_param']['single_table']]]></code>
79147905
<code><![CDATA[$foreigner]]></code>
79157906
</RiskyTruthyFalsyComparison>
79167907
</file>
@@ -8084,11 +8075,6 @@
80848075
<code><![CDATA[$field->key->columns]]></code>
80858076
<code><![CDATA[$field->references->columns]]></code>
80868077
</MixedPropertyTypeCoercion>
8087-
<PossiblyInvalidArrayOffset>
8088-
<code><![CDATA[$GLOBALS['plugin_param']['export_type']]]></code>
8089-
<code><![CDATA[$GLOBALS['plugin_param']['export_type']]]></code>
8090-
<code><![CDATA[$GLOBALS['plugin_param']['single_table']]]></code>
8091-
</PossiblyInvalidArrayOffset>
80928078
<PossiblyNullArgument>
80938079
<code><![CDATA[$createQuery]]></code>
80948080
<code><![CDATA[$definition]]></code>
@@ -8134,7 +8120,6 @@
81348120
<code><![CDATA[bool]]></code>
81358121
</PossiblyUnusedReturnValue>
81368122
<RiskyTruthyFalsyComparison>
8137-
<code><![CDATA[! $GLOBALS['plugin_param']['single_table']]]></code>
81388123
<code><![CDATA[empty($GLOBALS['exporting_metadata'])]]></code>
81398124
<code><![CDATA[empty($GLOBALS['sql_auto_increment'])]]></code>
81408125
<code><![CDATA[empty($GLOBALS['sql_drop_table'])]]></code>
@@ -8648,6 +8633,11 @@
86488633
<code><![CDATA[string[]]]></code>
86498634
</PossiblyUnusedReturnValue>
86508635
</file>
8636+
<file src="src/Plugins/Import/ImportFormat.php">
8637+
<PossiblyUnusedMethod>
8638+
<code><![CDATA[getClassName]]></code>
8639+
</PossiblyUnusedMethod>
8640+
</file>
86518641
<file src="src/Plugins/Import/ImportLdi.php">
86528642
<DeprecatedMethod>
86538643
<code><![CDATA[Config::getInstance()]]></code>
@@ -14259,12 +14249,6 @@
1425914249
<code><![CDATA[$config->selectedServer]]></code>
1426014250
<code><![CDATA[$config->selectedServer]]></code>
1426114251
</InvalidPropertyAssignmentValue>
14262-
<PossiblyInvalidArrayOffset>
14263-
<code><![CDATA[$GLOBALS['plugin_param']['export_type']]]></code>
14264-
<code><![CDATA[$GLOBALS['plugin_param']['export_type']]]></code>
14265-
<code><![CDATA[$GLOBALS['plugin_param']['single_table']]]></code>
14266-
<code><![CDATA[$GLOBALS['plugin_param']['single_table']]]></code>
14267-
</PossiblyInvalidArrayOffset>
1426814252
</file>
1426914253
<file src="tests/unit/Plugins/Export/ExportOdsTest.php">
1427014254
<TypeDoesNotContainType>
@@ -14284,12 +14268,6 @@
1428414268
<MixedAssignment>
1428514269
<code><![CDATA[$result]]></code>
1428614270
</MixedAssignment>
14287-
<PossiblyInvalidArrayOffset>
14288-
<code><![CDATA[$GLOBALS['plugin_param']['export_type']]]></code>
14289-
<code><![CDATA[$GLOBALS['plugin_param']['export_type']]]></code>
14290-
<code><![CDATA[$GLOBALS['plugin_param']['single_table']]]></code>
14291-
<code><![CDATA[$GLOBALS['plugin_param']['single_table']]]></code>
14292-
</PossiblyInvalidArrayOffset>
1429314271
<TypeDoesNotContainType>
1429414272
<code><![CDATA[assertSame]]></code>
1429514273
</TypeDoesNotContainType>
@@ -14320,12 +14298,6 @@
1432014298
<code><![CDATA[$result]]></code>
1432114299
<code><![CDATA[$result]]></code>
1432214300
</MixedAssignment>
14323-
<PossiblyInvalidArrayOffset>
14324-
<code><![CDATA[$GLOBALS['plugin_param']['export_type']]]></code>
14325-
<code><![CDATA[$GLOBALS['plugin_param']['export_type']]]></code>
14326-
<code><![CDATA[$GLOBALS['plugin_param']['single_table']]]></code>
14327-
<code><![CDATA[$GLOBALS['plugin_param']['single_table']]]></code>
14328-
</PossiblyInvalidArrayOffset>
1432914301
<PossiblyNullArgument>
1433014302
<code><![CDATA[$GLOBALS['sql_constraints']]]></code>
1433114303
<code><![CDATA[$GLOBALS['sql_constraints']]]></code>

psalm.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
onfly_compression: bool,
8989
output_charset_conversion: bool,
9090
output_kanji_conversion: bool,
91-
plugin_param: string|array{export_type: string, single_table: bool},
91+
plugin_param: array{export_type: string, single_table: bool},
9292
plugin_scripts: string[],
9393
pma_auth_server: string,
9494
PMA_PHP_SELF: string,

src/Controllers/Database/ImportController.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ public function __invoke(ServerRequest $request): void
7575

7676
[$GLOBALS['SESSION_KEY'], $uploadId] = Ajax::uploadProgressSetup();
7777

78-
$importList = Plugins::getImport('database');
78+
ImportSettings::$importType = 'database';
79+
$importList = Plugins::getImport();
7980

8081
if ($importList === []) {
8182
$this->response->addHTML(Message::error(__(

src/Controllers/Import/ImportController.php

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,18 @@
2020
use PhpMyAdmin\Import\ImportSettings;
2121
use PhpMyAdmin\Message;
2222
use PhpMyAdmin\ParseAnalyze;
23-
use PhpMyAdmin\Plugins;
24-
use PhpMyAdmin\Plugins\ImportPlugin;
23+
use PhpMyAdmin\Plugins\Import\ImportFormat;
2524
use PhpMyAdmin\ResponseRenderer;
2625
use PhpMyAdmin\Sql;
2726
use PhpMyAdmin\Template;
2827
use PhpMyAdmin\Url;
2928
use PhpMyAdmin\Util;
3029
use PhpMyAdmin\Utils\ForeignKey;
3130
use Throwable;
31+
use Webmozart\Assert\Assert;
3232

3333
use function __;
3434
use function _ngettext;
35-
use function in_array;
3635
use function ini_get;
3736
use function ini_parse_quantity;
3837
use function ini_set;
@@ -187,27 +186,18 @@ public function __invoke(ServerRequest $request): void
187186
$this->response->addJSON('console_message_id', $consoleMessageId);
188187
}
189188

190-
/**
191-
* Sets globals from $_POST patterns, for import plugins
192-
* We only need to load the selected plugin
193-
*/
194-
195-
if (! in_array($format, ['csv', 'ldi', 'mediawiki', 'ods', 'shp', 'sql', 'xml'], true)) {
196-
// this should not happen for a normal user
197-
// but only during an attack
189+
Assert::string($format);
190+
$importFormat = ImportFormat::tryFrom($format);
191+
if ($importFormat === null) {
198192
$this->response->setRequestStatus(false);
199193
$this->response->addHTML(Message::error(__('Incorrect format parameter'))->getDisplay());
200194

201195
return;
202196
}
203197

204198
$postPatterns = ['/^' . $format . '_/'];
205-
206199
Core::setPostAsGlobal($postPatterns);
207200

208-
// We don't want anything special in format
209-
$format = Core::securePath($format);
210-
211201
if (Current::$table !== '' && Current::$database !== '') {
212202
$GLOBALS['urlParams'] = ['db' => Current::$database, 'table' => Current::$table];
213203
} elseif (Current::$database !== '') {
@@ -493,21 +483,7 @@ public function __invoke(ServerRequest $request): void
493483
$queriesToBeExecuted = [];
494484

495485
if (! $GLOBALS['error']) {
496-
/** @var ImportPlugin $importPlugin */
497-
$importPlugin = Plugins::getPlugin('import', $format, ImportSettings::$importType);
498-
if ($importPlugin == null) {
499-
$GLOBALS['message'] = Message::error(
500-
__('Could not load import plugins, please check your installation!'),
501-
);
502-
503-
$_SESSION['Import_message']['message'] = $GLOBALS['message']->getDisplay();
504-
505-
$this->response->setRequestStatus(false);
506-
$this->response->addJSON('message', $GLOBALS['message']->getDisplay());
507-
$this->response->addHTML($GLOBALS['message']->getDisplay());
508-
509-
return;
510-
}
486+
$importPlugin = new ($importFormat->getClassName());
511487

512488
// Do the real import
513489
$defaultFkCheck = ForeignKey::handleDisableCheckInit();

src/Controllers/Server/ImportController.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ public function __invoke(ServerRequest $request): void
5555

5656
[$GLOBALS['SESSION_KEY'], $uploadId] = Ajax::uploadProgressSetup();
5757

58-
$importList = Plugins::getImport('server');
58+
ImportSettings::$importType = 'server';
59+
$importList = Plugins::getImport();
5960

6061
if ($importList === []) {
6162
$this->response->addHTML(Message::error(__(

src/Controllers/Table/ImportController.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ public function __invoke(ServerRequest $request): void
9595

9696
[$GLOBALS['SESSION_KEY'], $uploadId] = Ajax::uploadProgressSetup();
9797

98-
$importList = Plugins::getImport('table');
98+
ImportSettings::$importType = 'table';
99+
$importList = Plugins::getImport();
99100

100101
if ($importList === []) {
101102
$this->response->addHTML(Message::error(__(

src/Import/ImportSettings.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ final class ImportSettings
2626
public static int $timestamp = 0;
2727
public static string $message = '';
2828
public static string $importFile = '';
29+
/** @var 'query'|'table'|'database'|'server'|'' */
2930
public static string $importType = '';
3031
public static string $importFileName = '';
3132
public static string $localImportFile = '';

src/Plugins.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,16 +95,11 @@ public static function getExport(string $type, bool $singleTable): array
9595
}
9696

9797
/**
98-
* @param string $type server|database|table
99-
* @psalm-param 'server'|'database'|'table' $type
100-
*
10198
* @return ImportPlugin[]
10299
* @psalm-return list<ImportPlugin>
103100
*/
104-
public static function getImport(string $type): array
101+
public static function getImport(): array
105102
{
106-
$GLOBALS['plugin_param'] = $type;
107-
108103
return self::getPlugins('Import');
109104
}
110105

src/Plugins/Import/ImportCsv.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ protected function setProperties(): ImportPluginProperties
6363
{
6464
$this->analyze = false;
6565

66-
if ($GLOBALS['plugin_param'] !== 'table') {
66+
if (ImportSettings::$importType !== 'table') {
6767
$this->analyze = true;
6868
}
6969

@@ -79,7 +79,7 @@ protected function setProperties(): ImportPluginProperties
7979

8080
$generalOptions = $this->getGeneralOptions();
8181

82-
if ($GLOBALS['plugin_param'] !== 'table') {
82+
if (ImportSettings::$importType !== 'table') {
8383
$leaf = new TextPropertyItem(
8484
'new_tbl_name',
8585
__(
@@ -88,7 +88,7 @@ protected function setProperties(): ImportPluginProperties
8888
);
8989
$generalOptions->addProperty($leaf);
9090

91-
if ($GLOBALS['plugin_param'] === 'server') {
91+
if (ImportSettings::$importType === 'server') {
9292
$leaf = new TextPropertyItem(
9393
'new_db_name',
9494
__(

0 commit comments

Comments
 (0)