diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 212724343a..78e24dc53d 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -15695,11 +15695,6 @@ parameters: count: 2 path: src/Tracking/Tracker.php - - - message: "#^Only booleans are allowed in a negated boolean, mixed given\\.$#" - count: 2 - path: src/Tracking/Tracker.php - - message: "#^Only booleans are allowed in an if condition, string\\|false given\\.$#" count: 1 @@ -15825,11 +15820,6 @@ parameters: count: 1 path: src/Tracking/Tracking.php - - - message: "#^Only booleans are allowed in a negated boolean, mixed given\\.$#" - count: 1 - path: src/Tracking/TrackingChecker.php - - message: "#^Method PhpMyAdmin\\\\Transformations\\:\\:getAvailableMimeTypes\\(\\) should return array but returns mixed\\.$#" count: 1 diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 8804d08031..6bff330774 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -5095,7 +5095,6 @@ Config::getInstance() Config::getInstance() Config::getInstance() - Config::getInstance() Routing::$route @@ -6513,11 +6512,6 @@ - - - DatabaseInterface::getInstance() - - bool @@ -11857,8 +11851,6 @@ - $trackingEnabled - $trackingEnabled Current::$database @@ -11966,11 +11958,6 @@ $versionNumber - - - $trackingEnabled - - DatabaseInterface::getInstance() @@ -13809,8 +13796,6 @@ Config::getInstance() Config::getInstance() Config::getInstance() - Config::getInstance() - Config::getInstance() DatabaseInterface::getInstance() DatabaseInterface::getInstance() diff --git a/src/Application.php b/src/Application.php index d4ad7e43a0..271749c979 100644 --- a/src/Application.php +++ b/src/Application.php @@ -40,12 +40,10 @@ use PhpMyAdmin\Http\Middleware\SqlQueryGlobalSetting; use PhpMyAdmin\Http\Middleware\ThemeInitialization; use PhpMyAdmin\Http\Middleware\TokenMismatchChecking; use PhpMyAdmin\Http\Middleware\TokenRequestParamChecking; -use PhpMyAdmin\Http\Middleware\TrackerEnabling; use PhpMyAdmin\Http\Middleware\UriSchemeUpdating; use PhpMyAdmin\Http\Middleware\UrlParamsSetting; use PhpMyAdmin\Http\Middleware\UrlRedirection; use PhpMyAdmin\Http\Middleware\UserPreferencesLoading; -use PhpMyAdmin\Http\Middleware\ZeroConfPostConnection; use PhpMyAdmin\Http\Response; use PhpMyAdmin\Http\ServerRequest; use PhpMyAdmin\Routing\Routing; @@ -116,8 +114,6 @@ class Application $requestHandler->add(new TokenMismatchChecking()); $requestHandler->add(new ProfilingChecking()); $requestHandler->add(new UserPreferencesLoading($this->config)); - $requestHandler->add(new TrackerEnabling()); - $requestHandler->add(new ZeroConfPostConnection($this->config)); $runner = new RequestHandlerRunner( $requestHandler, diff --git a/src/DatabaseInterface.php b/src/DatabaseInterface.php index a96d490b66..5a423a6876 100644 --- a/src/DatabaseInterface.php +++ b/src/DatabaseInterface.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace PhpMyAdmin; use PhpMyAdmin\Config\Settings\Server; -use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\Dbal\Connection; use PhpMyAdmin\Dbal\ConnectionException; use PhpMyAdmin\Dbal\DbalInterface; @@ -1208,23 +1207,6 @@ class DatabaseInterface implements DbalInterface } } - /** - * Function called just after a connection to the MySQL database server has - * been established. It sets the connection collation, and determines the - * version of MySQL which is running. - */ - public function postConnectControl(Relation $relation): void - { - // If Zero configuration mode enabled, check PMA tables in current db. - if (! Config::getInstance()->settings['ZeroConf']) { - return; - } - - $this->databaseList = null; - - $relation->initRelationParamsCache(); - } - /** * returns a single value from the given result or query, * if the query or the result has more than one row or field @@ -1665,14 +1647,6 @@ class DatabaseInterface implements DbalInterface ), E_USER_WARNING, ); - - return null; - } - - if ($connectionType === Connection::TYPE_AUXILIARY) { - // Do not go back to main login if connection failed - // (currently used only in unit testing) - return null; } return null; diff --git a/src/Dbal/DbalInterface.php b/src/Dbal/DbalInterface.php index c23a48c63b..f7ee094d5c 100644 --- a/src/Dbal/DbalInterface.php +++ b/src/Dbal/DbalInterface.php @@ -7,7 +7,6 @@ namespace PhpMyAdmin\Dbal; use PhpMyAdmin\Column; use PhpMyAdmin\ColumnFull; use PhpMyAdmin\Config\Settings\Server; -use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\DatabaseInterface; use PhpMyAdmin\FieldMetadata; use PhpMyAdmin\Identifiers\DatabaseName; @@ -298,13 +297,6 @@ interface DbalInterface */ public function setCollation(string $collation): void; - /** - * Function called just after a connection to the MySQL database server has - * been established. It sets the connection collation, and determines the - * version of MySQL which is running. - */ - public function postConnectControl(Relation $relation): void; - /** * returns a single value from the given result or query, * if the query or the result has more than one row or field diff --git a/src/Http/Middleware/Authentication.php b/src/Http/Middleware/Authentication.php index a708d1f6d2..7f03d15002 100644 --- a/src/Http/Middleware/Authentication.php +++ b/src/Http/Middleware/Authentication.php @@ -7,6 +7,7 @@ namespace PhpMyAdmin\Http\Middleware; use Fig\Http\Message\StatusCodeInterface; use PhpMyAdmin\Config; use PhpMyAdmin\Config\Settings\Server; +use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\Container\ContainerBuilder; use PhpMyAdmin\DatabaseInterface; use PhpMyAdmin\Dbal\Connection; @@ -20,6 +21,7 @@ use PhpMyAdmin\Plugins\AuthenticationPlugin; use PhpMyAdmin\Plugins\AuthenticationPluginFactory; use PhpMyAdmin\ResponseRenderer; use PhpMyAdmin\Template; +use PhpMyAdmin\Tracking\Tracker; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; @@ -70,6 +72,15 @@ final class Authentication implements MiddlewareInterface } $this->connectToDatabaseServer(DatabaseInterface::getInstance(), $authPlugin, $currentServer); + + // Relation should only be initialized after the connection is successful + /** @var Relation $relation */ + $relation = ContainerBuilder::getContainer()->get('relation'); + $relation->initRelationParamsCache(); + + // Tracker can only be activated after the relation has been initialized + Tracker::enable(); + $authPlugin->rememberCredentials(); assert($request instanceof ServerRequest); $authPlugin->checkTwoFactor($request); diff --git a/src/Http/Middleware/MinimumCommonRedirection.php b/src/Http/Middleware/MinimumCommonRedirection.php index ef48a67825..68aef62eb0 100644 --- a/src/Http/Middleware/MinimumCommonRedirection.php +++ b/src/Http/Middleware/MinimumCommonRedirection.php @@ -12,7 +12,6 @@ use PhpMyAdmin\Http\ServerRequest; use PhpMyAdmin\ResponseRenderer; use PhpMyAdmin\Routing\Routing; use PhpMyAdmin\Theme\ThemeManager; -use PhpMyAdmin\Tracking\Tracker; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; @@ -36,7 +35,6 @@ final class MinimumCommonRedirection implements MiddlewareInterface /** @var ThemeManager $themeManager */ $themeManager = $container->get(ThemeManager::class); $this->config->loadUserPreferences($themeManager, true); - Tracker::enable(); assert($request instanceof ServerRequest); try { diff --git a/src/Http/Middleware/SetupPageRedirection.php b/src/Http/Middleware/SetupPageRedirection.php index 2b782a811e..b40fd336db 100644 --- a/src/Http/Middleware/SetupPageRedirection.php +++ b/src/Http/Middleware/SetupPageRedirection.php @@ -13,7 +13,6 @@ use PhpMyAdmin\Http\ServerRequest; use PhpMyAdmin\ResponseRenderer; use PhpMyAdmin\Routing\Routing; use PhpMyAdmin\Theme\ThemeManager; -use PhpMyAdmin\Tracking\Tracker; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; @@ -39,7 +38,6 @@ final class SetupPageRedirection implements MiddlewareInterface /** @var ThemeManager $themeManager */ $themeManager = $container->get(ThemeManager::class); $this->config->loadUserPreferences($themeManager, true); - Tracker::enable(); $this->setupPageBootstrap(); assert($request instanceof ServerRequest); diff --git a/src/Http/Middleware/TrackerEnabling.php b/src/Http/Middleware/TrackerEnabling.php deleted file mode 100644 index 07edd8af23..0000000000 --- a/src/Http/Middleware/TrackerEnabling.php +++ /dev/null @@ -1,22 +0,0 @@ -handle($request); - } -} diff --git a/src/Http/Middleware/UrlRedirection.php b/src/Http/Middleware/UrlRedirection.php index c132208aca..056a963d45 100644 --- a/src/Http/Middleware/UrlRedirection.php +++ b/src/Http/Middleware/UrlRedirection.php @@ -7,7 +7,6 @@ namespace PhpMyAdmin\Http\Middleware; use PhpMyAdmin\Config; use PhpMyAdmin\Container\ContainerBuilder; use PhpMyAdmin\Theme\ThemeManager; -use PhpMyAdmin\Tracking\Tracker; use PhpMyAdmin\UrlRedirector; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -32,7 +31,6 @@ final class UrlRedirection implements MiddlewareInterface /** @var ThemeManager $themeManager */ $themeManager = $container->get(ThemeManager::class); $this->config->loadUserPreferences($themeManager, true); - Tracker::enable(); return UrlRedirector::redirect($this->getUrlParam($request->getQueryParams()['url'] ?? null)); } diff --git a/src/Http/Middleware/ZeroConfPostConnection.php b/src/Http/Middleware/ZeroConfPostConnection.php deleted file mode 100644 index 692dcd99bb..0000000000 --- a/src/Http/Middleware/ZeroConfPostConnection.php +++ /dev/null @@ -1,34 +0,0 @@ -config->getSettings(); - if (Current::$server > 0 && $settings->zeroConf) { - /** @var Relation $relation */ - $relation = ContainerBuilder::getContainer()->get('relation'); - DatabaseInterface::getInstance()->postConnectControl($relation); - } - - return $handler->handle($request); - } -} diff --git a/src/Tracking/Tracker.php b/src/Tracking/Tracker.php index 8f90ebdb83..7bf7f2b0a5 100644 --- a/src/Tracking/Tracker.php +++ b/src/Tracking/Tracker.php @@ -7,7 +7,6 @@ declare(strict_types=1); namespace PhpMyAdmin\Tracking; -use PhpMyAdmin\Cache; use PhpMyAdmin\Config; use PhpMyAdmin\ConfigStorage\Features\TrackingFeature; use PhpMyAdmin\ConfigStorage\Relation; @@ -43,7 +42,7 @@ use function trim; */ class Tracker { - public const TRACKER_ENABLED_CACHE_KEY = 'phpmyadmin.tracker.enabled'; + private static bool $enabled = false; /** * Cache to avoid quering tracking status multiple times. @@ -58,7 +57,17 @@ class Tracker */ public static function enable(): void { - Cache::set(self::TRACKER_ENABLED_CACHE_KEY, true); + self::$enabled = true; + } + + public static function disable(): void + { + self::$enabled = false; + } + + public static function isEnabled(): bool + { + return self::$enabled; } /** @@ -66,19 +75,12 @@ class Tracker */ public static function isActive(): bool { - $trackingEnabled = Cache::get(self::TRACKER_ENABLED_CACHE_KEY, false); - if (! $trackingEnabled) { + if (! self::$enabled) { return false; } - /** - * We need to avoid attempt to track any queries from {@link Relation::getRelationParameters()} - */ - Cache::set(self::TRACKER_ENABLED_CACHE_KEY, false); $relation = new Relation(DatabaseInterface::getInstance()); $relationParameters = $relation->getRelationParameters(); - /* Restore original state */ - Cache::set(self::TRACKER_ENABLED_CACHE_KEY, true); return $relationParameters->trackingFeature !== null; } @@ -91,8 +93,7 @@ class Tracker */ public static function isTracked(string $dbName, string $tableName): bool { - $trackingEnabled = Cache::get(self::TRACKER_ENABLED_CACHE_KEY, false); - if (! $trackingEnabled) { + if (! self::$enabled) { return false; } @@ -100,15 +101,9 @@ class Tracker return self::$trackingCache[$dbName][$tableName]; } - /** - * We need to avoid attempt to track any queries from {@link Relation::getRelationParameters()} - */ - Cache::set(self::TRACKER_ENABLED_CACHE_KEY, false); $dbi = DatabaseInterface::getInstance(); $relation = new Relation($dbi); $trackingFeature = $relation->getRelationParameters()->trackingFeature; - /* Restore original state */ - Cache::set(self::TRACKER_ENABLED_CACHE_KEY, true); if ($trackingFeature === null) { return false; } diff --git a/src/Tracking/TrackingChecker.php b/src/Tracking/TrackingChecker.php index 9cfdf3f491..e095f11242 100644 --- a/src/Tracking/TrackingChecker.php +++ b/src/Tracking/TrackingChecker.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace PhpMyAdmin\Tracking; -use PhpMyAdmin\Cache; use PhpMyAdmin\ConfigStorage\Features\TrackingFeature; use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\DatabaseInterface; @@ -50,8 +49,7 @@ class TrackingChecker /** @return TrackedTable[] */ public function getTrackedTables(string $dbName): array { - $trackingEnabled = Cache::get(Tracker::TRACKER_ENABLED_CACHE_KEY, false); - if (! $trackingEnabled) { + if (! Tracker::isEnabled()) { return []; } diff --git a/src/TwoFactor.php b/src/TwoFactor.php index 309916f205..cdd77001a8 100644 --- a/src/TwoFactor.php +++ b/src/TwoFactor.php @@ -55,10 +55,8 @@ class TwoFactor public function __construct(public string $user) { $dbi = DatabaseInterface::getInstance(); - $relation = new Relation($dbi); - $relation->initRelationParamsCache(); - $this->userPreferences = new UserPreferences($dbi, $relation, new Template()); + $this->userPreferences = new UserPreferences($dbi, new Relation($dbi), new Template()); $this->available = $this->getAvailableBackends(); $this->config = $this->readConfig(); $this->writable = ($this->config['type'] === 'db'); diff --git a/tests/classes/AbstractTestCase.php b/tests/classes/AbstractTestCase.php index ee1a31519e..88e20afb49 100644 --- a/tests/classes/AbstractTestCase.php +++ b/tests/classes/AbstractTestCase.php @@ -15,6 +15,7 @@ use PhpMyAdmin\LanguageManager; use PhpMyAdmin\SqlParser\Translator; use PhpMyAdmin\Template; use PhpMyAdmin\Tests\Stubs\DbiDummy; +use PhpMyAdmin\Tracking\Tracker; use PhpMyAdmin\UserPrivileges; use PhpMyAdmin\Utils\HttpRequest; use PHPUnit\Framework\TestCase; @@ -91,6 +92,7 @@ abstract class AbstractTestCase extends TestCase // Config before DBI $this->setGlobalConfig(); Cache::purge(); + Tracker::disable(); (new ReflectionProperty(Relation::class, 'cache'))->setValue(null, null); ContainerBuilder::$container = null; diff --git a/tests/classes/DatabaseInterfaceTest.php b/tests/classes/DatabaseInterfaceTest.php index d845495072..1b62cba63c 100644 --- a/tests/classes/DatabaseInterfaceTest.php +++ b/tests/classes/DatabaseInterfaceTest.php @@ -6,7 +6,6 @@ namespace PhpMyAdmin\Tests; use PhpMyAdmin\Config; use PhpMyAdmin\Config\Settings\Server; -use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\Current; use PhpMyAdmin\DatabaseInterface; use PhpMyAdmin\Dbal\Connection; @@ -105,24 +104,6 @@ class DatabaseInterfaceTest extends AbstractTestCase $this->assertInstanceOf(SystemDatabase::class, $sd); } - public function testPostConnectControlWithZeroConf(): void - { - Config::getInstance()->settings['ZeroConf'] = true; - $dbi = $this->createDatabaseInterface(); - $relationMock = $this->createMock(Relation::class); - $relationMock->expects($this->once())->method('initRelationParamsCache'); - $dbi->postConnectControl($relationMock); - } - - public function testPostConnectControlWithoutZeroConf(): void - { - Config::getInstance()->settings['ZeroConf'] = false; - $dbi = $this->createDatabaseInterface(); - $relationMock = $this->createMock(Relation::class); - $relationMock->expects($this->never())->method('initRelationParamsCache'); - $dbi->postConnectControl($relationMock); - } - /** * Tests for DBI::postConnect() method. * should not call setVersion method if cannot fetch version diff --git a/tests/classes/Tracking/TrackerTest.php b/tests/classes/Tracking/TrackerTest.php index 14a670fe53..74317719ea 100644 --- a/tests/classes/Tracking/TrackerTest.php +++ b/tests/classes/Tracking/TrackerTest.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace PhpMyAdmin\Tests\Tracking; -use PhpMyAdmin\Cache; use PhpMyAdmin\ColumnFull; use PhpMyAdmin\Config; use PhpMyAdmin\ConfigStorage\Relation; @@ -58,13 +57,11 @@ class TrackerTest extends AbstractTestCase */ public function testEnabled(): void { - $this->assertFalse( - Cache::has(Tracker::TRACKER_ENABLED_CACHE_KEY), - ); + $this->assertFalse(Tracker::isEnabled()); Tracker::enable(); - $this->assertTrue( - Cache::get(Tracker::TRACKER_ENABLED_CACHE_KEY), - ); + $this->assertTrue(Tracker::isEnabled()); + Tracker::disable(); + $this->assertFalse(Tracker::isEnabled()); } /** @@ -72,9 +69,7 @@ class TrackerTest extends AbstractTestCase */ public function testIsActive(): void { - $this->assertFalse( - Cache::has(Tracker::TRACKER_ENABLED_CACHE_KEY), - ); + $this->assertFalse(Tracker::isEnabled()); $this->assertFalse( Tracker::isActive(), @@ -106,9 +101,7 @@ class TrackerTest extends AbstractTestCase */ public function testIsTracked(): void { - $this->assertFalse( - Cache::has(Tracker::TRACKER_ENABLED_CACHE_KEY), - ); + $this->assertFalse(Tracker::isEnabled()); $this->assertFalse( Tracker::isTracked('', ''), diff --git a/tests/classes/Tracking/TrackingCheckerTest.php b/tests/classes/Tracking/TrackingCheckerTest.php index cc16831b12..bbd83483a9 100644 --- a/tests/classes/Tracking/TrackingCheckerTest.php +++ b/tests/classes/Tracking/TrackingCheckerTest.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace PhpMyAdmin\Tests\Tracking; -use PhpMyAdmin\Cache; use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\ConfigStorage\RelationParameters; use PhpMyAdmin\DatabaseInterface; @@ -46,9 +45,7 @@ class TrackingCheckerTest extends AbstractTestCase public function testGetTrackedTables(): void { - $this->assertFalse( - Cache::has(Tracker::TRACKER_ENABLED_CACHE_KEY), - ); + $this->assertFalse(Tracker::isEnabled()); $actual = $this->trackingChecker->getTrackedTables('dummyDb'); $this->assertEquals([], $actual); @@ -67,9 +64,7 @@ class TrackingCheckerTest extends AbstractTestCase public function testGetUntrackedTableNames(): void { - $this->assertFalse( - Cache::has(Tracker::TRACKER_ENABLED_CACHE_KEY), - ); + $this->assertFalse(Tracker::isEnabled()); $expectation = ['0', 'actor', 'untrackedTable']; $actual = $this->trackingChecker->getUntrackedTableNames('dummyDb'); diff --git a/tests/classes/TwoFactorTest.php b/tests/classes/TwoFactorTest.php index 60955d231c..d189926d83 100644 --- a/tests/classes/TwoFactorTest.php +++ b/tests/classes/TwoFactorTest.php @@ -7,6 +7,8 @@ namespace PhpMyAdmin\Tests; use CodeLts\U2F\U2FServer\RegistrationRequest; use CodeLts\U2F\U2FServer\SignRequest; use PhpMyAdmin\Config; +use PhpMyAdmin\ConfigStorage\Relation; +use PhpMyAdmin\ConfigStorage\RelationParameters; use PhpMyAdmin\Current; use PhpMyAdmin\DatabaseInterface; use PhpMyAdmin\Http\ServerRequest; @@ -17,6 +19,7 @@ use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\Attributes\RequiresPhpExtension; use Psr\Http\Message\ServerRequestInterface; +use ReflectionProperty; use function count; use function in_array; @@ -81,25 +84,13 @@ class TwoFactorTest extends AbstractTestCase $this->dbi = $this->createDatabaseInterface($this->dummyDbi); DatabaseInterface::$instance = $this->dbi; - $this->dummyDbi->removeDefaultResults(); - - $this->dummyDbi->addResult( - 'SHOW TABLES FROM `phpmyadmin`;', - [ - ['pma__userconfig'],// Minimal working setup for 2FA - ], - ['Tables_in_phpmyadmin'], - ); - - $this->dummyDbi->addResult( - 'SHOW TABLES FROM `phpmyadmin`', - [ - ['pma__userconfig'],// Minimal working setup for 2FA - ], - ['Tables_in_phpmyadmin'], - ); - - $this->dummyDbi->addResult('SELECT NULL FROM `pma__userconfig` LIMIT 0', [], ['NULL']); + $relationParameters = RelationParameters::fromArray([ + 'db' => 'phpmyadmin', + 'user' => 'groot', + 'userconfigwork' => true, + 'userconfig' => 'pma__userconfig', + ]); + (new ReflectionProperty(Relation::class, 'cache'))->setValue(null, $relationParameters); } /** @@ -118,7 +109,6 @@ class TwoFactorTest extends AbstractTestCase $config['settings'] = []; } - $this->dummyDbi->addSelectDb('phpmyadmin'); $this->loadResultForConfig($config); return new TwoFactor($user);