]> source.dussan.org Git - nextcloud-server.git/commitdiff
Migrate MySQL utf8mb4 check to new SetupCheck API 42836/head
authorCôme Chilliet <come.chilliet@nextcloud.com>
Tue, 16 Jan 2024 10:30:08 +0000 (11:30 +0100)
committerCôme Chilliet <91878298+come-nc@users.noreply.github.com>
Tue, 23 Jan 2024 16:34:04 +0000 (17:34 +0100)
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
apps/settings/composer/composer/autoload_classmap.php
apps/settings/composer/composer/autoload_static.php
apps/settings/lib/AppInfo/Application.php
apps/settings/lib/Controller/CheckSetupController.php
apps/settings/lib/SetupChecks/MysqlUnicodeSupport.php [new file with mode: 0644]
apps/settings/tests/Controller/CheckSetupControllerTest.php
core/js/setupchecks.js
core/js/tests/specs/setupchecksSpec.js

index effa9c3b426f4c6a6a68500c17d35ea11c921c21..809530342086250321a7bfc6d1ff01c567d0e6b6 100644 (file)
@@ -95,6 +95,7 @@ return array(
     'OCA\\Settings\\SetupChecks\\LegacySSEKeyFormat' => $baseDir . '/../lib/SetupChecks/LegacySSEKeyFormat.php',
     'OCA\\Settings\\SetupChecks\\MaintenanceWindowStart' => $baseDir . '/../lib/SetupChecks/MaintenanceWindowStart.php',
     'OCA\\Settings\\SetupChecks\\MemcacheConfigured' => $baseDir . '/../lib/SetupChecks/MemcacheConfigured.php',
+    'OCA\\Settings\\SetupChecks\\MysqlUnicodeSupport' => $baseDir . '/../lib/SetupChecks/MysqlUnicodeSupport.php',
     'OCA\\Settings\\SetupChecks\\OverwriteCliUrl' => $baseDir . '/../lib/SetupChecks/OverwriteCliUrl.php',
     'OCA\\Settings\\SetupChecks\\PhpDefaultCharset' => $baseDir . '/../lib/SetupChecks/PhpDefaultCharset.php',
     'OCA\\Settings\\SetupChecks\\PhpDisabledFunctions' => $baseDir . '/../lib/SetupChecks/PhpDisabledFunctions.php',
index 20834644eb54caaa6ebb5afdaf9918b7c7c58106..9e23bbb47aeb432805197ac3b1fc8a39abaa2935 100644 (file)
@@ -110,6 +110,7 @@ class ComposerStaticInitSettings
         'OCA\\Settings\\SetupChecks\\LegacySSEKeyFormat' => __DIR__ . '/..' . '/../lib/SetupChecks/LegacySSEKeyFormat.php',
         'OCA\\Settings\\SetupChecks\\MaintenanceWindowStart' => __DIR__ . '/..' . '/../lib/SetupChecks/MaintenanceWindowStart.php',
         'OCA\\Settings\\SetupChecks\\MemcacheConfigured' => __DIR__ . '/..' . '/../lib/SetupChecks/MemcacheConfigured.php',
+        'OCA\\Settings\\SetupChecks\\MysqlUnicodeSupport' => __DIR__ . '/..' . '/../lib/SetupChecks/MysqlUnicodeSupport.php',
         'OCA\\Settings\\SetupChecks\\OverwriteCliUrl' => __DIR__ . '/..' . '/../lib/SetupChecks/OverwriteCliUrl.php',
         'OCA\\Settings\\SetupChecks\\PhpDefaultCharset' => __DIR__ . '/..' . '/../lib/SetupChecks/PhpDefaultCharset.php',
         'OCA\\Settings\\SetupChecks\\PhpDisabledFunctions' => __DIR__ . '/..' . '/../lib/SetupChecks/PhpDisabledFunctions.php',
index 2c3584e3c03d2759a86b801e7cfca87f95a2ba27..32cb3af3ef88ff3a3fc880c2c5a351e45404e605 100644 (file)
@@ -67,6 +67,7 @@ use OCA\Settings\SetupChecks\JavaScriptModules;
 use OCA\Settings\SetupChecks\LegacySSEKeyFormat;
 use OCA\Settings\SetupChecks\MaintenanceWindowStart;
 use OCA\Settings\SetupChecks\MemcacheConfigured;
+use OCA\Settings\SetupChecks\MysqlUnicodeSupport;
 use OCA\Settings\SetupChecks\OverwriteCliUrl;
 use OCA\Settings\SetupChecks\PhpDefaultCharset;
 use OCA\Settings\SetupChecks\PhpDisabledFunctions;
@@ -190,6 +191,7 @@ class Application extends App implements IBootstrap {
                $context->registerSetupCheck(LegacySSEKeyFormat::class);
                $context->registerSetupCheck(MaintenanceWindowStart::class);
                $context->registerSetupCheck(MemcacheConfigured::class);
+               $context->registerSetupCheck(MysqlUnicodeSupport::class);
                $context->registerSetupCheck(OverwriteCliUrl::class);
                $context->registerSetupCheck(PhpDefaultCharset::class);
                $context->registerSetupCheck(PhpDisabledFunctions::class);
index 21161be7cf2ec312423521dc759061b01d10b0c6..bc898060928b490c178a81e0702a373670fb6074 100644 (file)
@@ -202,10 +202,6 @@ Raw output
                return false;
        }
 
-       protected function isMysqlUsedWithoutUTF8MB4(): bool {
-               return ($this->config->getSystemValue('dbtype', 'sqlite') === 'mysql') && ($this->config->getSystemValue('mysql.utf8mb4', false) === false);
-       }
-
        protected function isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed(): bool {
                $objectStore = $this->config->getSystemValue('objectstore', null);
                $objectStoreMultibucket = $this->config->getSystemValue('objectstore_multibucket', null);
@@ -251,7 +247,6 @@ Raw output
                        [
                                'isFairUseOfFreePushService' => $this->isFairUseOfFreePushService(),
                                'reverseProxyDocs' => $this->urlGenerator->linkToDocs('admin-reverse-proxy'),
-                               'isMysqlUsedWithoutUTF8MB4' => $this->isMysqlUsedWithoutUTF8MB4(),
                                'isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed' => $this->isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed(),
                                'reverseProxyGeneratedURL' => $this->urlGenerator->getAbsoluteURL('index.php'),
                                'temporaryDirectoryWritable' => $this->isTemporaryDirectoryWritable(),
diff --git a/apps/settings/lib/SetupChecks/MysqlUnicodeSupport.php b/apps/settings/lib/SetupChecks/MysqlUnicodeSupport.php
new file mode 100644 (file)
index 0000000..c90081c
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2023 Côme Chilliet <come.chilliet@nextcloud.com>
+ *
+ * @author Côme Chilliet <come.chilliet@nextcloud.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+namespace OCA\Settings\SetupChecks;
+
+use OCP\IConfig;
+use OCP\IL10N;
+use OCP\IURLGenerator;
+use OCP\SetupCheck\ISetupCheck;
+use OCP\SetupCheck\SetupResult;
+
+class MysqlUnicodeSupport implements ISetupCheck {
+       public function __construct(
+               private IL10N $l10n,
+               private IConfig $config,
+               private IURLGenerator $urlGenerator,
+       ) {
+       }
+
+       public function getName(): string {
+               return $this->l10n->t('MySQL unicode support');
+       }
+
+       public function getCategory(): string {
+               return 'database';
+       }
+
+       public function run(): SetupResult {
+               if ($this->config->getSystemValueString('dbtype') !== 'mysql') {
+                       return SetupResult::success($this->l10n->t('You are not using MySQL'));
+               }
+               if ($this->config->getSystemValueBool('mysql.utf8mb4', false)) {
+                       return SetupResult::success($this->l10n->t('MySQL is used as database and does support 4-byte characters'));
+               } else {
+                       return SetupResult::warning(
+                               $this->l10n->t('MySQL is used as database but does not support 4-byte characters. To be able to handle 4-byte characters (like emojis) without issues in filenames or comments for example it is recommended to enable the 4-byte support in MySQL.'),
+                               $this->urlGenerator->linkToDocs('admin-mysql-utf8mb4'),
+                       );
+               }
+       }
+}
index bad15a721919f32c6057384a2938ea1685fbb482..b888e0ce7c80987eba9ccd9204f694ae598a4c8a 100644 (file)
@@ -118,7 +118,6 @@ class CheckSetupControllerTest extends TestCase {
                                'getCurlVersion',
                                'isPhpOutdated',
                                'isPHPMailerUsed',
-                               'isMysqlUsedWithoutUTF8MB4',
                                'isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed',
                        ])->getMock();
        }
@@ -142,11 +141,6 @@ class CheckSetupControllerTest extends TestCase {
                $this->request->expects($this->never())
                        ->method('getHeader');
 
-               $this->checkSetupController
-                       ->expects($this->once())
-                       ->method('isMysqlUsedWithoutUTF8MB4')
-                       ->willReturn(false);
-
                $this->checkSetupController
                        ->expects($this->once())
                        ->method('isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed')
@@ -186,7 +180,6 @@ class CheckSetupControllerTest extends TestCase {
                $expected = new DataResponse(
                        [
                                'reverseProxyDocs' => 'reverse-proxy-doc-link',
-                               'isMysqlUsedWithoutUTF8MB4' => false,
                                'isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed' => true,
                                'reverseProxyGeneratedURL' => 'https://server/index.php',
                                'isFairUseOfFreePushService' => false,
@@ -653,50 +646,6 @@ Array
                $this->assertEquals($expected, $this->checkSetupController->getFailedIntegrityCheckFiles());
        }
 
-       public function dataForIsMysqlUsedWithoutUTF8MB4() {
-               return [
-                       ['sqlite', false, false],
-                       ['sqlite', true, false],
-                       ['postgres', false, false],
-                       ['postgres', true, false],
-                       ['oci', false, false],
-                       ['oci', true, false],
-                       ['mysql', false, true],
-                       ['mysql', true, false],
-               ];
-       }
-
-       /**
-        * @dataProvider dataForIsMysqlUsedWithoutUTF8MB4
-        */
-       public function testIsMysqlUsedWithoutUTF8MB4(string $db, bool $useUTF8MB4, bool $expected) {
-               $this->config->method('getSystemValue')
-                       ->willReturnCallback(function ($key, $default) use ($db, $useUTF8MB4) {
-                               if ($key === 'dbtype') {
-                                       return $db;
-                               }
-                               if ($key === 'mysql.utf8mb4') {
-                                       return $useUTF8MB4;
-                               }
-                               return $default;
-                       });
-
-               $checkSetupController = new CheckSetupController(
-                       'settings',
-                       $this->request,
-                       $this->config,
-                       $this->urlGenerator,
-                       $this->l10n,
-                       $this->checker,
-                       $this->logger,
-                       $this->tempManager,
-                       $this->notificationManager,
-                       $this->setupCheckManager,
-               );
-
-               $this->assertSame($expected, $this->invokePrivate($checkSetupController, 'isMysqlUsedWithoutUTF8MB4'));
-       }
-
        public function dataForIsEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed() {
                return [
                        ['singlebucket', 'OC\\Files\\ObjectStore\\Swift', true],
index 0be5ceafd36ea7047068905c3246305ca99459b0..761fca14ed912cbcceeec6cec62e702e2bde7b59 100644 (file)
                                                });
                                        }
 
-                                       if (data.isMysqlUsedWithoutUTF8MB4) {
-                                               messages.push({
-                                                       msg: t('core', 'MySQL is used as database but does not support 4-byte characters. To be able to handle 4-byte characters (like emojis) without issues in filenames or comments for example it is recommended to enable the 4-byte support in MySQL. For further details read {linkstart}the documentation page about this ↗{linkend}.')
-                                                               .replace('{linkstart}', '<a target="_blank" rel="noreferrer noopener" class="external" href="' + OC.theme.docPlaceholderUrl.replace('PLACEHOLDER', 'admin-mysql-utf8mb4') + '">')
-                                                               .replace('{linkend}', '</a>'),
-                                                       type: OC.SetupChecks.MESSAGE_TYPE_WARNING
-                                               })
-                                       }
                                        if (!data.isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed) {
                                                messages.push({
                                                        msg: t('core', 'This instance uses an S3 based object store as primary storage. The uploaded files are stored temporarily on the server and thus it is recommended to have 50 GB of free space available in the temp directory of PHP. Check the logs for full details about the path and the available space. To improve this please change the temporary directory in the php.ini or make more space available in that path.'),
index 68325123efbd7b7b9cdc6b66d2963cfc0ce8021a..ef5ed8fbf4d084cfec5e85e8281e6b5c59083876 100644 (file)
@@ -224,7 +224,6 @@ describe('OC.SetupChecks tests', function() {
                                },
                                JSON.stringify({
                                        isFairUseOfFreePushService: true,
-                                       isMysqlUsedWithoutUTF8MB4: false,
                                        isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed: true,
                                        reverseProxyGeneratedURL: 'https://server',
                                        temporaryDirectoryWritable: true,
@@ -261,7 +260,6 @@ describe('OC.SetupChecks tests', function() {
                                },
                                JSON.stringify({
                                        isFairUseOfFreePushService: true,
-                                       isMysqlUsedWithoutUTF8MB4: false,
                                        isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed: true,
                                        reverseProxyGeneratedURL: 'https://server',
                                        temporaryDirectoryWritable: true,
@@ -298,7 +296,6 @@ describe('OC.SetupChecks tests', function() {
                                },
                                JSON.stringify({
                                        isFairUseOfFreePushService: true,
-                                       isMysqlUsedWithoutUTF8MB4: false,
                                        isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed: true,
                                        reverseProxyGeneratedURL: 'https://server',
                                        temporaryDirectoryWritable: true,
@@ -336,7 +333,6 @@ describe('OC.SetupChecks tests', function() {
                                JSON.stringify({
                                        isFairUseOfFreePushService: true,
                                        reverseProxyDocs: 'https://docs.nextcloud.com/foo/bar.html',
-                                       isMysqlUsedWithoutUTF8MB4: false,
                                        isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed: true,
                                        reverseProxyGeneratedURL: 'https://server',
                                        temporaryDirectoryWritable: true,
@@ -403,7 +399,6 @@ describe('OC.SetupChecks tests', function() {
                                },
                                JSON.stringify({
                                        isFairUseOfFreePushService: true,
-                                       isMysqlUsedWithoutUTF8MB4: false,
                                        isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed: true,
                                        reverseProxyGeneratedURL: 'https://server',
                                        temporaryDirectoryWritable: true,
@@ -435,41 +430,6 @@ describe('OC.SetupChecks tests', function() {
                        });
                });
 
-               it('should return an error if the php version is no longer supported', function(done) {
-                       var async = OC.SetupChecks.checkSetup();
-
-                       suite.server.requests[0].respond(
-                               200,
-                               {
-                                       'Content-Type': 'application/json',
-                               },
-                               JSON.stringify({
-                                       isFairUseOfFreePushService: true,
-                                       isMysqlUsedWithoutUTF8MB4: true,
-                                       isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed: true,
-                                       reverseProxyGeneratedURL: 'https://server',
-                                       temporaryDirectoryWritable: true,
-                                       generic: {
-                                               network: {
-                                                       "Internet connectivity": {
-                                                               severity: "success",
-                                                               description: null,
-                                                               linkToDoc: null
-                                                       }
-                                               },
-                                       },
-                               })
-                       );
-
-                       async.done(function( data, s, x ){
-                               expect(data).toEqual([{
-                                       msg: 'MySQL is used as database but does not support 4-byte characters. To be able to handle 4-byte characters (like emojis) without issues in filenames or comments for example it is recommended to enable the 4-byte support in MySQL. For further details read <a target="_blank" rel="noreferrer noopener" class="external" href="https://docs.example.org/admin-mysql-utf8mb4">the documentation page about this ↗</a>.',
-                                       type: OC.SetupChecks.MESSAGE_TYPE_WARNING
-                               }]);
-                               done();
-                       });
-               });
-
     // THe following test is invalid as the code in core/js/setupchecks.js is calling
     // window.location.protocol which always return http during tests
     // if there is a way to trick window.location.protocol during test, then we could re-activate it
@@ -484,7 +444,6 @@ describe('OC.SetupChecks tests', function() {
                                },
                                JSON.stringify({
                                        isFairUseOfFreePushService: true,
-                                       isMysqlUsedWithoutUTF8MB4: false,
                                        isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed: true,
                                        reverseProxyDocs: 'https://docs.nextcloud.com/foo/bar.html',
                                        reverseProxyGeneratedURL: 'http://server',
@@ -520,7 +479,6 @@ describe('OC.SetupChecks tests', function() {
                                },
                                JSON.stringify({
                                        isFairUseOfFreePushService: true,
-                                       isMysqlUsedWithoutUTF8MB4: false,
                                        isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed: true,
                                        reverseProxyDocs: 'https://docs.nextcloud.com/foo/bar.html',
                                        reverseProxyGeneratedURL: 'http://server',
@@ -553,7 +511,6 @@ describe('OC.SetupChecks tests', function() {
                                },
                                JSON.stringify({
                                        isFairUseOfFreePushService: true,
-                                       isMysqlUsedWithoutUTF8MB4: false,
                                        isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed: false,
                                        reverseProxyGeneratedURL: 'https://server',
                                        temporaryDirectoryWritable: true,
@@ -588,7 +545,6 @@ describe('OC.SetupChecks tests', function() {
                                },
                                JSON.stringify({
                                        isFairUseOfFreePushService: true,
-                                       isMysqlUsedWithoutUTF8MB4: false,
                                        isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed: true,
                                        reverseProxyGeneratedURL: 'https://server',
                                        temporaryDirectoryWritable: true,
@@ -630,7 +586,6 @@ describe('OC.SetupChecks tests', function() {
                                },
                                JSON.stringify({
                                        isFairUseOfFreePushService: true,
-                                       isMysqlUsedWithoutUTF8MB4: false,
                                        isEnoughTempSpaceAvailableIfS3PrimaryStorageIsUsed: true,
                                        reverseProxyGeneratedURL: 'https://server',
                                        temporaryDirectoryWritable: false,