From: Marco Bettini Date: Thu, 25 Jan 2024 09:42:21 +0000 (+0000) Subject: lib-language: Replace fts_languages with the names from language filter array X-Git-Tag: 2.4.1~999 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dd39265e5227bc4c0306893d5ca342d913b1ae82;p=thirdparty%2Fdovecot%2Fcore.git lib-language: Replace fts_languages with the names from language filter array --- diff --git a/src/lib-language/language.c b/src/lib-language/language.c index 4b2755d960..c19c4f0616 100644 --- a/src/lib-language/language.c +++ b/src/lib-language/language.c @@ -58,7 +58,7 @@ const struct language languages_builtin [] = { }; const struct language language_data = { - "data" + LANGUAGE_DATA }; #ifdef HAVE_LANG_EXTTEXTCAT @@ -172,17 +172,20 @@ void language_list_add(struct language_list *list, } bool language_list_add_names(struct language_list *list, - const char *names, + const ARRAY_TYPE(lang_settings) *languages, const char **unknown_name_r) { - const char *const *langs; - const struct language *lang; - - for (langs = t_strsplit_spaces(names, ", "); *langs != NULL; langs++) { - lang = language_find(*langs); + struct lang_settings *entry; + array_foreach_elem(languages, entry) { + /* Data pseudo-language does not belong to the constructed list, + skip it. */ + if (strcmp(entry->name, LANGUAGE_DATA) == 0) + continue; + + const struct language *lang = language_find(entry->name); if (lang == NULL) { /* unknown language */ - *unknown_name_r = *langs; + *unknown_name_r = entry->name; return FALSE; } if (language_list_find(list, lang->name) == NULL) diff --git a/src/lib-language/language.h b/src/lib-language/language.h index 1efcc1266a..4394288bbd 100644 --- a/src/lib-language/language.h +++ b/src/lib-language/language.h @@ -1,6 +1,8 @@ #ifndef LANGUAGE_H #define LANGUAGE_H +#include "lang-settings.h" + struct language_list; enum language_detect_result { @@ -53,7 +55,7 @@ void language_list_add(struct language_list *list, Duplicates are ignored. Returns TRUE if ok, FALSE and unknown_name if an unknown language was found from the list. */ bool language_list_add_names(struct language_list *list, - const char *names, + const ARRAY_TYPE(lang_settings) *names, const char **unknown_name_r); /* Return an array of all wanted languages. */ diff --git a/src/lib-language/test-language.c b/src/lib-language/test-language.c index c343cc11dc..576c4c26b5 100644 --- a/src/lib-language/test-language.c +++ b/src/lib-language/test-language.c @@ -1,6 +1,7 @@ /* Copyright (c) 2014-2018 Dovecot authors, see the included COPYING file */ #include "lib.h" +#include "array.h" #include "test-common.h" #include "language.h" /* TODO: These checks will not work without proper libtextcat configuration. @@ -11,6 +12,19 @@ const struct language_settings settings = { .textcat_data_path = TEXTCAT_DATADIR"/", }; +static ARRAY_TYPE(lang_settings) *to_array(const char *values) +{ + ARRAY_TYPE(lang_settings) *array = t_new(ARRAY_TYPE(lang_settings), 1); + t_array_init(array, 8); + const char **value = t_strsplit_spaces(values, ", "); + for (; *value != NULL; value++) { + struct lang_settings *set = t_new(struct lang_settings, 1); + set->name = *value; + array_push_back(array, &set); + } + return array; +} + /* Detect Finnish. fi--utf8 */ static void test_language_detect_finnish(void) { @@ -28,7 +42,7 @@ static void test_language_detect_finnish(void) const char *unknown, *error; test_begin("language detect Finnish"); lp = language_list_init(&settings); - test_assert(language_list_add_names(lp, names, &unknown) == TRUE); + test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE); test_assert(language_detect(lp, finnish, sizeof(finnish)-1, &lang_r, &error) == LANGUAGE_DETECT_RESULT_OK); test_assert(strcmp(lang_r->name, "fi") == 0); @@ -55,7 +69,7 @@ static void test_language_detect_english(void) const char *unknown, *error; test_begin("language detect English"); lp = language_list_init(&settings); - test_assert(language_list_add_names(lp, names, &unknown) == TRUE); + test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE); test_assert(language_detect(lp, english, sizeof(english)-1, &lang_r, &error) == LANGUAGE_DETECT_RESULT_OK); test_assert(strcmp(lang_r->name, "en") == 0); @@ -90,7 +104,7 @@ static void test_language_detect_french(void) const char *unknown, *error; test_begin("language detect French"); lp = language_list_init(&settings); - test_assert(language_list_add_names(lp, names, &unknown) == TRUE); + test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE); test_assert(language_detect(lp, french, sizeof(french)-1, &lang_r, &error) == LANGUAGE_DETECT_RESULT_OK); test_assert(strcmp(lang_r->name, "fr") == 0); @@ -127,7 +141,7 @@ static void test_language_detect_german(void) const char *unknown, *error; test_begin("language detect German"); lp = language_list_init(&settings); - test_assert(language_list_add_names(lp, names, &unknown) == TRUE); + test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE); test_assert(language_detect(lp, german, sizeof(german)-1, &lang_r, &error) == LANGUAGE_DETECT_RESULT_OK); test_assert(strcmp(lang_r->name, "de") == 0); @@ -153,7 +167,7 @@ static void test_language_detect_swedish(void) const char *unknown, *error; test_begin("language detect Swedish"); lp = language_list_init(&settings); - test_assert(language_list_add_names(lp, names, &unknown) == TRUE); + test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE); test_assert(language_detect(lp, swedish, sizeof(swedish)-1, &lang_r, &error) == LANGUAGE_DETECT_RESULT_OK); test_assert(strcmp(lang_r->name, "sv") == 0); @@ -177,7 +191,7 @@ static void test_language_detect_bokmal(void) const char *unknown, *error; test_begin("language detect Bokmal as Norwegian"); lp = language_list_init(&settings); - test_assert(language_list_add_names(lp, names, &unknown) == TRUE); + test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE); test_assert(language_detect(lp, bokmal, sizeof(bokmal)-1, &lang_r, &error) == LANGUAGE_DETECT_RESULT_OK); test_assert(strcmp(lang_r->name, "no") == 0); @@ -201,7 +215,7 @@ static void test_language_detect_nynorsk(void) const char *unknown, *error; test_begin("language detect Nynorsk as Norwegian"); lp = language_list_init(&settings); - test_assert(language_list_add_names(lp, names, &unknown) == TRUE); + test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE); test_assert(language_detect(lp, nynorsk, sizeof(nynorsk)-1, &lang_r, &error) == LANGUAGE_DETECT_RESULT_OK); test_assert(strcmp(lang_r->name, "no") == 0); @@ -226,7 +240,7 @@ static void test_language_detect_finnish_as_english(void) const char *unknown, *error; test_begin("language detect Finnish as English"); lp = language_list_init(&settings); - test_assert(language_list_add_names(lp, names, &unknown) == TRUE); + test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE); test_assert(language_detect(lp, finnish, sizeof(finnish)-1, &lang_r, &error) == LANGUAGE_DETECT_RESULT_OK); test_assert(strcmp(lang_r->name, "en") == 0); @@ -253,7 +267,7 @@ static void test_language_detect_na(void) const char *unknown, *error; test_begin("language detect not available"); lp = language_list_init(&settings); - test_assert(language_list_add_names(lp, names, &unknown) == TRUE); + test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE); test_assert(language_detect(lp, english, sizeof(english)-1, &lang_r, &error) == LANGUAGE_DETECT_RESULT_UNKNOWN); language_list_deinit(&lp); @@ -273,7 +287,7 @@ static void test_language_detect_unknown(void) const char *unknown, *error; test_begin("language detect unknown"); lp = language_list_init(&settings); - test_assert(language_list_add_names(lp, names, &unknown) == TRUE); + test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE); test_assert(language_detect(lp, klingon, sizeof(klingon), &lang_r, &error) == LANGUAGE_DETECT_RESULT_UNKNOWN); language_list_deinit(&lp); diff --git a/src/lib-storage/lang-user.c b/src/lib-storage/lang-user.c index b9fa42f7c5..670cb17143 100644 --- a/src/lib-storage/lang-user.c +++ b/src/lib-storage/lang-user.c @@ -58,28 +58,22 @@ static const char *const *str_keyvalues_to_array(const char *str) static int lang_user_init_languages(struct lang_user *luser, const char **error_r) { - const char *languages, *unknown; - - languages = mail_user_plugin_getenv(user, "fts_languages"); - if (languages == NULL) { - *error_r = "fts_languages setting is missing"; - return -1; - } + const ARRAY_TYPE(lang_settings) *langs = &luser->set->parsed_languages; + i_assert(!array_is_empty(langs)); struct language_settings lang_settings = { .textcat_config_path = luser->set->textcat_config_path, }; luser->lang_list = language_list_init(&lang_settings); - if (!language_list_add_names(luser->lang_list, languages, &unknown)) { + const char *unknown_lang; + if (!language_list_add_names(luser->lang_list, langs, &unknown_lang)) { *error_r = t_strdup_printf( - "fts_languages: Unknown language '%s'", unknown); - return -1; - } - if (array_count(language_list_get_all(luser->lang_list)) == 0) { - *error_r = "fts_languages setting is empty"; + "language %s: Unknown language", unknown_lang); return -1; } + + i_assert(!array_is_empty(language_list_get_all(luser->lang_list))); return 0; }