From e598dddbec961254588635578b443e786cc178f4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=B4me=20Chilliet?= <come.chilliet@fusiondirectory.org>
Date: Thu, 21 Nov 2019 11:40:02 +0100
Subject: [PATCH] :ambulance: fix(config) Forbid setting of unavailable locale

issue #6051
---
 include/class_Language.inc            | 20 ++++++++++++++++++++
 plugins/config/class_configInLdap.inc |  3 +++
 2 files changed, 23 insertions(+)

diff --git a/include/class_Language.inc b/include/class_Language.inc
index 773943771..c7afdb7e3 100644
--- a/include/class_Language.inc
+++ b/include/class_Language.inc
@@ -127,6 +127,26 @@ class Language
     return al2gt($langs);
   }
 
+  /*!
+   * \brief Checks if a locale is available
+   *
+   * \param string $lang Language locale to use
+   */
+  public static function isAvailable (string $lang): bool
+  {
+    /* Store current locale */
+    $locale = setlocale(LC_ALL, 0);
+
+    /* Try to switch */
+    list ($language, , $char) = parse_gettext_lang($lang);
+    $langset = setlocale(LC_ALL, $lang, $language.'.'.$char);
+
+    /* Set current locale back */
+    setlocale(LC_ALL, $locale);
+
+    return ($langset !== FALSE);
+  }
+
   /*!
    * \brief Get the language for the user connecting
    *
diff --git a/plugins/config/class_configInLdap.inc b/plugins/config/class_configInLdap.inc
index 24e784c76..1f5b5036f 100644
--- a/plugins/config/class_configInLdap.inc
+++ b/plugins/config/class_configInLdap.inc
@@ -533,6 +533,9 @@ class configInLdap extends simplePlugin
     if (($this->fdPasswordDefaultHash == 'sasl') && ($this->fdSaslRealm == '') && ($this->fdSaslExop == '')) {
       $messages[] = _('You need to fill saslRealm or saslExop in the configuration screen in order to use SASL');
     }
+    if ($this->attributesAccess['fdLanguage']->hasChanged() && ($this->fdLanguage != '') && !Language::isAvailable($this->fdLanguage)) {
+      $messages[] = sprintf(_('It seems the selected language "%s" is not installed on the system. Please install it or select an other one.'), $this->fdLanguage);
+    }
     return $messages;
   }
 
-- 
GitLab