]> source.dussan.org Git - nextcloud-server.git/commitdiff
OC_Util: Add fallbacks to check if current locale is UTF8
authorNaoto Kobayashi <naoto.kobayashi4c@gmail.com>
Mon, 15 Nov 2021 15:40:52 +0000 (00:40 +0900)
committerNaoto Kobayashi <naoto.kobayashi4c@gmail.com>
Mon, 15 Nov 2021 15:40:52 +0000 (00:40 +0900)
Using escapeshellcmd to get current locale causes error
if the function is disabled.

Add fallbacks to prevent the error.

Signed-off-by: Naoto Kobayashi <naoto.kobayashi4c@gmail.com>
lib/private/legacy/OC_Util.php
tests/lib/UtilTest.php

index 75c337f8baa968aba514e8035397252cbac671d1..ff9a3bb1af79be305870f457b61f54df8503934b 100644 (file)
@@ -1238,6 +1238,21 @@ class OC_Util {
                return $content !== $testContent && $fallbackContent !== $testContent;
        }
 
+       /**
+        * Check if current locale is non-UTF8
+        *
+        * @return bool
+        */
+       private static function isNonUTF8Locale() {
+               if (function_exists("escapeshellcmd")) {
+                       return ('' === escapeshellcmd('§'));
+               } else if (function_exists("escapeshellarg")) {
+                       return ('\'\'' === escapeshellarg('§'));
+               } else {
+                       return (0 === preg_match('/utf-?8/i', setlocale(LC_CTYPE, 0)));
+               }
+       }
+
        /**
         * Check if the setlocal call does not work. This can happen if the right
         * local packages are not available on the server.
@@ -1245,13 +1260,13 @@ class OC_Util {
         * @return bool
         */
        public static function isSetLocaleWorking() {
-               if ('' === escapeshellcmd('§')) {
+               if (self::isNonUTF8Locale()) {
                        // Borrowed from \Patchwork\Utf8\Bootup::initLocale
                        setlocale(LC_ALL, 'C.UTF-8', 'C');
                        setlocale(LC_CTYPE, 'en_US.UTF-8', 'fr_FR.UTF-8', 'es_ES.UTF-8', 'de_DE.UTF-8', 'ru_RU.UTF-8', 'pt_BR.UTF-8', 'it_IT.UTF-8', 'ja_JP.UTF-8', 'zh_CN.UTF-8', '0');
 
                        // Check again
-                       if ('' === escapeshellcmd('§')) {
+                       if (self::isNonUTF8Locale()) {
                                return false;
                        }
                }
index 65147ed52c9d3f81d4a1d20efeaa12f6164a9ea5..bb328c5998d25d8c24f28a033155dae0db837c7e 100644 (file)
@@ -74,13 +74,15 @@ class UtilTest extends \Test\TestCase {
                $this->assertEquals("/%C2%A7%23%40test%25%26%5E%C3%A4/-child", $result);
        }
 
-       public function testIsSetLocaleWorking() {
-               // OC_Util::isSetLocaleWorking() assumes escapeshellcmd('§') returns '' with non-UTF-8 locale.
+       public function testIsNonUTF8Locale() {
+               // OC_Util::isNonUTF8Locale() assumes escapeshellcmd('§') returns '' with non-UTF-8 locale.
                $locale = setlocale(LC_CTYPE, 0);
                setlocale(LC_CTYPE, 'C');
                $this->assertEquals('', escapeshellcmd('§'));
+               $this->assertEquals('\'\'', escapeshellarg('§'));
                setlocale(LC_CTYPE, 'C.UTF-8');
                $this->assertEquals('§', escapeshellcmd('§'));
+               $this->assertEquals('\'§\'', escapeshellarg('§'));
                setlocale(LC_CTYPE, $locale);
        }