From 43cfe7d256e4fe8fef9f45561d592efa25c6e618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Fri, 20 May 2022 12:15:06 -0300 Subject: [PATCH] Mark `Plugins\Plugin::isAvailable` as static method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Allows for checking the availability before creating a new instance. - Fixes https://github.com/phpmyadmin/phpmyadmin/issues/17519 Signed-off-by: MaurĂ­cio Meneghini Fauth --- ChangeLog | 1 + libraries/classes/Plugins.php | 13 +++++-------- libraries/classes/Plugins/Export/ExportPdf.php | 2 +- libraries/classes/Plugins/Export/ExportXml.php | 2 +- libraries/classes/Plugins/ExportPlugin.php | 2 +- libraries/classes/Plugins/Import/ImportLdi.php | 4 ++-- libraries/classes/Plugins/ImportPlugin.php | 2 +- libraries/classes/Plugins/Plugin.php | 2 +- libraries/classes/Plugins/Schema/SchemaPdf.php | 2 +- libraries/classes/Plugins/SchemaPlugin.php | 2 +- phpstan-baseline.neon | 12 +++++++++++- psalm-baseline.xml | 15 ++++++++------- 12 files changed, 34 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8f3bcbaf06..0bd194e56d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,7 @@ phpMyAdmin - ChangeLog - issue #17522 Fix case where the routes cache file is invalid - issue #17506 Fix error when configuring 2FA without XMLWriter or Imagick - issue Fix blank page when some error occurs +- issue #17519 Fix Export pages not working in certain conditions 5.2.0 (2022-05-10) - issue #16521 Upgrade Bootstrap to version 5 diff --git a/libraries/classes/Plugins.php b/libraries/classes/Plugins.php index 9674aa98cf..3fc83de55b 100644 --- a/libraries/classes/Plugins.php +++ b/libraries/classes/Plugins.php @@ -29,6 +29,7 @@ use function class_exists; use function count; use function get_class; use function htmlspecialchars; +use function is_subclass_of; use function mb_strpos; use function mb_strtolower; use function mb_strtoupper; @@ -111,8 +112,9 @@ class Plugins * Reads all plugin information * * @param string $type the type of the plugin (import, export, etc) + * @psalm-param 'Export'|'Import'|'Schema' $type * - * @return array list of plugin instances + * @return Plugin[] list of plugin instances */ private static function getPlugins(string $type): array { @@ -135,16 +137,11 @@ class Plugins } $class = sprintf('PhpMyAdmin\\Plugins\\%s\\%s', $type, $fileInfo->getBasename('.php')); - if (! class_exists($class)) { + if (! class_exists($class) || ! is_subclass_of($class, Plugin::class) || ! $class::isAvailable()) { continue; } - $plugin = new $class(); - if (! ($plugin instanceof Plugin) || ! $plugin->isAvailable()) { - continue; - } - - $plugins[] = $plugin; + $plugins[] = new $class(); } usort($plugins, static function (Plugin $plugin1, Plugin $plugin2): int { diff --git a/libraries/classes/Plugins/Export/ExportPdf.php b/libraries/classes/Plugins/Export/ExportPdf.php index 31381641c2..3a8b6ebffa 100644 --- a/libraries/classes/Plugins/Export/ExportPdf.php +++ b/libraries/classes/Plugins/Export/ExportPdf.php @@ -321,7 +321,7 @@ class ExportPdf extends ExportPlugin $this->pdf = $pdf; } - public function isAvailable(): bool + public static function isAvailable(): bool { return class_exists(TCPDF::class); } diff --git a/libraries/classes/Plugins/Export/ExportXml.php b/libraries/classes/Plugins/Export/ExportXml.php index 9aa7fb0d9d..25c11eca8a 100644 --- a/libraries/classes/Plugins/Export/ExportXml.php +++ b/libraries/classes/Plugins/Export/ExportXml.php @@ -543,7 +543,7 @@ class ExportXml extends ExportPlugin $this->tables = $tables; } - public function isAvailable(): bool + public static function isAvailable(): bool { global $db; diff --git a/libraries/classes/Plugins/ExportPlugin.php b/libraries/classes/Plugins/ExportPlugin.php index 234b0c5fd1..3358d1f081 100644 --- a/libraries/classes/Plugins/ExportPlugin.php +++ b/libraries/classes/Plugins/ExportPlugin.php @@ -372,7 +372,7 @@ abstract class ExportPlugin implements Plugin return $relation; } - public function isAvailable(): bool + public static function isAvailable(): bool { return true; } diff --git a/libraries/classes/Plugins/Import/ImportLdi.php b/libraries/classes/Plugins/Import/ImportLdi.php index bbfee3107e..15f7356956 100644 --- a/libraries/classes/Plugins/Import/ImportLdi.php +++ b/libraries/classes/Plugins/Import/ImportLdi.php @@ -40,7 +40,7 @@ class ImportLdi extends AbstractImportCsv $importPluginProperties->setText('CSV using LOAD DATA'); $importPluginProperties->setExtension('ldi'); - if (! $this->isAvailable()) { + if (! self::isAvailable()) { return $importPluginProperties; } @@ -182,7 +182,7 @@ class ImportLdi extends AbstractImportCsv $finished = true; } - public function isAvailable(): bool + public static function isAvailable(): bool { global $plugin_param; diff --git a/libraries/classes/Plugins/ImportPlugin.php b/libraries/classes/Plugins/ImportPlugin.php index 4573d09949..b02cc344bf 100644 --- a/libraries/classes/Plugins/ImportPlugin.php +++ b/libraries/classes/Plugins/ImportPlugin.php @@ -90,7 +90,7 @@ abstract class ImportPlugin implements Plugin ]; } - public function isAvailable(): bool + public static function isAvailable(): bool { return true; } diff --git a/libraries/classes/Plugins/Plugin.php b/libraries/classes/Plugins/Plugin.php index 3baf528ff2..7eb309eb69 100644 --- a/libraries/classes/Plugins/Plugin.php +++ b/libraries/classes/Plugins/Plugin.php @@ -15,5 +15,5 @@ interface Plugin public function getProperties(): PluginPropertyItem; - public function isAvailable(): bool; + public static function isAvailable(): bool; } diff --git a/libraries/classes/Plugins/Schema/SchemaPdf.php b/libraries/classes/Plugins/Schema/SchemaPdf.php index 932e7f6304..3aae787dbb 100644 --- a/libraries/classes/Plugins/Schema/SchemaPdf.php +++ b/libraries/classes/Plugins/Schema/SchemaPdf.php @@ -125,7 +125,7 @@ class SchemaPdf extends SchemaPlugin return true; } - public function isAvailable(): bool + public static function isAvailable(): bool { return class_exists(TCPDF::class); } diff --git a/libraries/classes/Plugins/SchemaPlugin.php b/libraries/classes/Plugins/SchemaPlugin.php index ae3e393e34..e2992e5032 100644 --- a/libraries/classes/Plugins/SchemaPlugin.php +++ b/libraries/classes/Plugins/SchemaPlugin.php @@ -92,7 +92,7 @@ abstract class SchemaPlugin implements Plugin return $ret; } - public function isAvailable(): bool + public static function isAvailable(): bool { return true; } diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 72780818c2..701d4ab7fe 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -5706,7 +5706,17 @@ parameters: path: libraries/classes/Plugins.php - - message: "#^Method PhpMyAdmin\\\\Plugins\\:\\:getPlugins\\(\\) return type has no value type specified in iterable type array\\.$#" + message: "#^Method PhpMyAdmin\\\\Plugins\\:\\:getExport\\(\\) should return array\\ but returns array\\\\.$#" + count: 1 + path: libraries/classes/Plugins.php + + - + message: "#^Method PhpMyAdmin\\\\Plugins\\:\\:getImport\\(\\) should return array\\ but returns array\\\\.$#" + count: 1 + path: libraries/classes/Plugins.php + + - + message: "#^Method PhpMyAdmin\\\\Plugins\\:\\:getSchema\\(\\) should return array\\ but returns array\\\\.$#" count: 1 path: libraries/classes/Plugins.php diff --git a/psalm-baseline.xml b/psalm-baseline.xml index a7e4431ae2..ada8b0924b 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -8932,6 +8932,11 @@ string + + self::getPlugins('Export') + self::getPlugins('Import') + self::getPlugins('Schema') + $_GET[$opt] $_REQUEST[$opt] @@ -8963,20 +8968,16 @@ $val $val - + getProperties new $class() new $class() - new $class() - + ExportPlugin[] ImportPlugin[] SchemaPlugin[] - self::getPlugins('Export') - self::getPlugins('Import') - self::getPlugins('Schema') - + $val $val