From d5b5b26c68487dc1276588fde969a683c772f963 Mon Sep 17 00:00:00 2001 From: Manuel Selbach <manuel_selbach@yahoo.de> Date: Fri, 24 Apr 2020 14:21:11 +0200 Subject: [PATCH] [BUGFIX] Allow more characters for MySQL / MariaDB database name With this change it is possible to use a wider set of characters. Please have a look at the official documentation of MySQL / MariaDB. e.g.: https://dev.mysql.com/doc/refman/5.5/en/identifiers.html https://dev.mysql.com/doc/refman/5.6/en/identifiers.html https://dev.mysql.com/doc/refman/5.7/en/identifiers.html https://dev.mysql.com/doc/refman/8.0/en/identifiers.html https://mariadb.com/kb/en/identifier-names/ The mentioned characters in chapter "Quoted" (ASCII and Extended) are supported by now. Furthermore the database name is quoted during the installation process for creating / dropping a database. If, for example a `.` is used in the name, a notification will be shown. e.g.: ``` Unable to create database Database with name "foo.test@bla123" could not be created. Either your database name contains a reserved keyword or your database user does not have sufficient permissions to create it or the database already exists. Please choose an existing (empty) database, choose another name or contact administration. ``` Resolves: #91167 Releases: master Change-Id: I2df93f5c2238c2f0ca5ab8020ca8eebd10fdf58f Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64312 Tested-by: TYPO3com <noreply@typo3.com> Tested-by: Benni Mack <benni@typo3.org> Tested-by: Manuel Selbach <manuel_selbach@yahoo.de> Reviewed-by: Benni Mack <benni@typo3.org> Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de> Reviewed-by: Oliver Hader <oliver.hader@typo3.org> Reviewed-by: Manuel Selbach <manuel_selbach@yahoo.de> --- .../Controller/InstallerController.php | 18 ++++++++----- .../DatabaseCheck/Platform/MySql.php | 27 +++++++++++++++++++ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/typo3/sysext/install/Classes/Controller/InstallerController.php b/typo3/sysext/install/Classes/Controller/InstallerController.php index 89b8cf0986fc..1f1f28f18eba 100644 --- a/typo3/sysext/install/Classes/Controller/InstallerController.php +++ b/typo3/sysext/install/Classes/Controller/InstallerController.php @@ -667,10 +667,11 @@ class InstallerController if ($success === false) { // remove the database again if we created it if ($request->getParsedBody()['install']['values']['type'] === 'new') { - GeneralUtility::makeInstance(ConnectionPool::class) - ->getConnectionByName(ConnectionPool::DEFAULT_CONNECTION_NAME) + $connection = GeneralUtility::makeInstance(ConnectionPool::class) + ->getConnectionByName(ConnectionPool::DEFAULT_CONNECTION_NAME); + $connection ->getSchemaManager() - ->dropDatabase($databaseName); + ->dropDatabase($connection->quoteIdentifier($databaseName)); } $this->configurationManager->removeLocalConfigurationKeysByPath(['DB/Connections/Default/dbname']); @@ -1210,9 +1211,14 @@ For each website you need a TypoScript template on the main page of your website $platform = GeneralUtility::makeInstance(ConnectionPool::class) ->getConnectionByName(ConnectionPool::DEFAULT_CONNECTION_NAME) ->getDatabasePlatform(); - GeneralUtility::makeInstance(ConnectionPool::class) - ->getConnectionByName(ConnectionPool::DEFAULT_CONNECTION_NAME) - ->exec(PlatformInformation::getDatabaseCreateStatementWithCharset($platform, $dbName)); + $connection = GeneralUtility::makeInstance(ConnectionPool::class) + ->getConnectionByName(ConnectionPool::DEFAULT_CONNECTION_NAME); + $connection->exec( + PlatformInformation::getDatabaseCreateStatementWithCharset( + $platform, + $connection->quoteIdentifier($dbName) + ) + ); $this->configurationManager ->setLocalConfigurationValueByPath('DB/Connections/Default/dbname', $dbName); } catch (DBALException $e) { diff --git a/typo3/sysext/install/Classes/SystemEnvironment/DatabaseCheck/Platform/MySql.php b/typo3/sysext/install/Classes/SystemEnvironment/DatabaseCheck/Platform/MySql.php index 96659cd41c7c..330b61b4404c 100644 --- a/typo3/sysext/install/Classes/SystemEnvironment/DatabaseCheck/Platform/MySql.php +++ b/typo3/sysext/install/Classes/SystemEnvironment/DatabaseCheck/Platform/MySql.php @@ -219,4 +219,31 @@ class MySql extends AbstractPlatform )); } } + + /** + * Validate the database name + * + * @param string $databaseName + * @return bool + */ + public static function isValidDatabaseName(string $databaseName): bool + { + return strlen($databaseName) <= static::SCHEMA_NAME_MAX_LENGTH && preg_match('/^[\x{0001}-\x{FFFF}]*$/u', $databaseName); + } + + protected function checkDatabaseName(Connection $connection): void + { + if (static::isValidDatabaseName($connection->getDatabase())) { + return; + } + + $this->messageQueue->enqueue( + new FlashMessage( + 'The given database name must not be longer than ' . static::SCHEMA_NAME_MAX_LENGTH . ' characters' + . ' and consist of the Unicode Basic Multilingual Plane (BMP), except U+0000', + 'Database name not valid', + FlashMessage::ERROR + ) + ); + } } -- GitLab