Collabora stolpert auf CentOS über Sonderzeichen im Dateinamen

Wer unter CentOS / RedHat 7 die Collabora Online Development Edition (CODE) betreibt, um zum Beispiel unter Nextcloud Dokumente kollaborativ zu editieren, kämpft seit ein paar Tagen (Stand 2020-06-22) mit dem Phänomen, dass das Bearbeiten von Dateien mit Sonderzeichen im Dateinamen fehlschlägt. Das WebGUI liefert dabei die Fehlermeldung Failed to load the document. Please ensure the file type is supported and not corrupted, and try again.

Wenn man Logging in der /etc/loolwsd/loolwsd.xml aktiviert hat, sieht man dies auch im Logfile:

[ kit_004 ] ERR  Failed to load: file:///user/docs/Ymsg0IKZzRq3Knor/test%C3%A4.docx, error: Unsupported URL <file:///user/docs/Ymsg0IKZzRq3Knor/test%C3%A4.docx>: "type detection failed"| kit/Kit.cpp:1725
[ kit_004 ] ERR  Failed to get LoKitDocument instance for [file:///user/docs/Ymsg0IKZzRq3Knor/test%C3%A4.docx].| kit/ChildSession.cpp:632
[ kit_004 ] ERR  error: cmd=load kind=faileddocloading| ./common/Session.hpp:125

Bei der Google-Suche stösst man auf Hinweise, dass entweder die locale falsch gesetzt sein soll, oder dass die gesetzte locale auf dem System fehlt. Wir hatten laut localectl die locale korrekt auf LANG=en_US.UTF-8 gesetzt - dies schien also nicht das Problem zu sein.

Am Ende hat der Blick in den Source Code von Collabora geholfen: Die locale wird durch loolwsd gesetzt, und bisher wurde dafür en_US.UTF8 verwendet. Ab Version 4.2.4-3 wurde das aber auf C.UTF8 geändert:

commit 15ced64d323e10660e60abbbcfa7386780dcfb4e
Author: Andras Timar <andras.timar@collabora.com>
Date:   Thu May 28 11:04:29 2020 +0200

    use C.UTF-8 locale rather than en_US.UTF-8

    because en_US.UTF-8 is not present in minimal
    environments such as docker images

    Change-Id: I9edcb44df8a8f33117b2c5f1d2fa9e330bfc1770
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/95018
    Tested-by: Jenkins
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
    Reviewed-by: Jan Holesovsky <kendy@collabora.com>
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 57b7c926f..e016bd01b 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -3609,8 +3609,8 @@ int LOOLWSD::innerMain()
     initializeSSL();

     // Force a uniform UTF-8 locale for ourselves & our children.
-    ::setenv("LC_ALL", "en_US.UTF-8", 1);
-    setlocale(LC_ALL, "en_US.UTF-8");
+    ::setenv("LC_ALL", "C.UTF-8", 1);
+    setlocale(LC_ALL, "C.UTF-8");

 #if !MOBILEAPP
     // We use the same option set for both parent and child loolwsd,

C.UTF8 ist unter CentOS / RedHat 7 allerdings nicht verfügbar, was man mittels localectl list-locales | grep -i ^c.utf8$ prüfen kann.

Gute Nachricht: Das Problem wurde erkannt, der Fix ist auch schon unterwegs, und wird hoffentlich in einer der nächsten Versionen (ab 4.2.4-6) mitgeliefert:

commit cbdc9a8c9f227e50a8c56f7beb2d417bf616f1f0
Author: Andras Timar <andras.timar@collabora.com>
Date:   Sun Jun 21 10:49:23 2020 +0200

    fall back to en_US.UTF-8 if C.UTF-8 does not exist

    It turned out that C.UTF-8 is not supported on RH7/CentOS7.
    We started to use C.UTF-8 because it was widely available and we
    could shave off locale data in Ubuntu based docker images and
    AppImage. With this patch we fall back en_US.UTF-8 if C.UTF-8 does
    not exist and add some logging.

    Change-Id: Idea0ae885dc8cdd9ef33279bd90eb882a656d75c
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/96791
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
    Reviewed-by: Aron Budea <aron.budea@collabora.com>
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 5c77a8a12..9a701f262 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -3669,8 +3669,20 @@ int LOOLWSD::innerMain()
     initializeSSL();

     // Force a uniform UTF-8 locale for ourselves & our children.
-    ::setenv("LC_ALL", "C.UTF-8", 1);
-    setlocale(LC_ALL, "C.UTF-8");
+    char* locale = std::setlocale(LC_ALL, "C.UTF-8");
+    if (!locale)
+    {
+        // rhbz#1590680 - C.UTF-8 is unsupported on RH7
+        LOG_WRN("Could not set locale to C.UTF-8, will try en_US.UTF-8");
+        locale = std::setlocale(LC_ALL, "en_US.UTF-8");
+        if (!locale)
+            LOG_WRN("Could not set locale to en_US.UTF-8. Without UTF-8 support documents with non-ASCII file names cannot be opened.");
+    }
+    if (locale)
+    {
+        LOG_INF("Locale is set to " + std::string(locale));
+        ::setenv("LC_ALL", locale, 1);
+    }

Fazit also: Abwarten und Updates einspielen.


Related Posts

Published by

Markus Frei

Markus Frei

von der Linuxfabrik GmbH.