]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts: Use mailbox-match-plugin API for fts_autoindex_exclude
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 3 Aug 2021 14:38:33 +0000 (17:38 +0300)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Thu, 5 Aug 2021 12:34:46 +0000 (12:34 +0000)
This doesn't change the functionality, just deduplicates the code.

src/plugins/fts/fts-storage.c
src/plugins/fts/fts-user.c
src/plugins/fts/fts-user.h

index f5fe35dc1881710d5c022e4187a166a2cfdca38c..fad1e59fddb31db09c5ae90aa49d878063f4ac6b 100644 (file)
@@ -1,12 +1,10 @@
 /* Copyright (c) 2006-2018 Dovecot authors, see the included COPYING file */
 
 #include "lib.h"
-#include "array.h"
 #include "net.h"
 #include "str.h"
 #include "strescape.h"
 #include "write-full.h"
-#include "wildcard-match.h"
 #include "mail-search-build.h"
 #include "mail-storage-private.h"
 #include "mailbox-list-private.h"
@@ -16,6 +14,7 @@
 #include "fts-build-mail.h"
 #include "fts-search-serialize.h"
 #include "fts-plugin.h"
+#include "fts-user.h"
 #include "fts-storage.h"
 
 
@@ -792,61 +791,6 @@ static int fts_copy(struct mail_save_context *ctx, struct mail *mail)
        return 0;
 }
 
-static const char *const *fts_exclude_get_patterns(struct mail_user *user)
-{
-       ARRAY_TYPE(const_string) patterns;
-       const char *str;
-       char set_name[21 + MAX_INT_STRLEN];
-       unsigned int i;
-
-       str = mail_user_plugin_getenv(user, "fts_autoindex_exclude");
-       if (str == NULL)
-               return NULL;
-
-       t_array_init(&patterns, 16);
-       for (i = 2; str != NULL; i++) {
-               array_push_back(&patterns, &str);
-
-               if (i_snprintf(set_name, sizeof(set_name),
-                              "fts_autoindex_exclude%u", i) < 0)
-                       i_unreached();
-               str = mail_user_plugin_getenv(user, set_name);
-       }
-       array_append_zero(&patterns);
-       return array_front(&patterns);
-}
-
-static bool fts_autoindex_exclude_match(struct mailbox *box)
-{
-       const char *const *exclude_list;
-       unsigned int i;
-       const struct mailbox_settings *set;
-       const char *const *special_use;
-       struct mail_user *user = box->storage->user;
-
-       exclude_list = fts_exclude_get_patterns(user);
-       if (exclude_list == NULL)
-               return FALSE;
-
-       set = mailbox_settings_find(mailbox_get_namespace(box),
-                                   mailbox_get_vname(box));
-       special_use = set == NULL ? NULL :
-               t_strsplit_spaces(set->special_use, " ");
-       for (i = 0; exclude_list[i] != NULL; i++) {
-               if (exclude_list[i][0] == '\\') {
-                       /* \Special-use flag */
-                       if (special_use != NULL &&
-                           str_array_icase_find(special_use, exclude_list[i]))
-                               return TRUE;
-               } else {
-                       /* mailbox name with wildcards */
-                       if (wildcard_match(box->name, exclude_list[i]))
-                               return TRUE;
-               }
-       }
-       return FALSE;
-}
-
 void fts_mailbox_allocated(struct mailbox *box)
 {
        struct fts_mailbox_list *flist = FTS_LIST_CONTEXT(box->list);
@@ -859,7 +803,7 @@ void fts_mailbox_allocated(struct mailbox *box)
        fbox = p_new(box->pool, struct fts_mailbox, 1);
        fbox->module_ctx.super = *v;
        box->vlast = &fbox->module_ctx.super;
-       fbox->fts_mailbox_excluded = fts_autoindex_exclude_match(box);
+       fbox->fts_mailbox_excluded = fts_user_autoindex_exclude(box);
 
        v->get_status = fts_mailbox_get_status;
        v->search_init = fts_mailbox_search_init;
index 8f21bca80fb563b627947345288ee87654d0fe68..3c813cd9dda3bcfa69e5f3882c0aeedbc8a2c78b 100644 (file)
@@ -3,6 +3,8 @@
 #include "lib.h"
 #include "module-context.h"
 #include "mail-user.h"
+#include "mail-storage-private.h"
+#include "mailbox-match-plugin.h"
 #include "fts-language.h"
 #include "fts-filter.h"
 #include "fts-tokenizer.h"
@@ -18,6 +20,8 @@ struct fts_user {
        struct fts_language_list *lang_list;
        struct fts_user_language *data_lang;
        ARRAY_TYPE(fts_user_language) languages, data_languages;
+
+       struct mailbox_match_plugin *autoindex_exclude;
 };
 
 static MODULE_CONTEXT_DEFINE_INIT(fts_user_module,
@@ -336,6 +340,13 @@ struct fts_user_language *fts_user_get_data_lang(struct mail_user *user)
        return fuser->data_lang;
 }
 
+bool fts_user_autoindex_exclude(struct mailbox *box)
+{
+       struct fts_user *fuser = FTS_USER_CONTEXT(box->storage->user);
+
+       return mailbox_match_plugin_exclude(fuser->autoindex_exclude, box);
+}
+
 static void fts_user_language_free(struct fts_user_language *user_lang)
 {
        if (user_lang->filter != NULL)
@@ -357,6 +368,7 @@ static void fts_user_free(struct fts_user *fuser)
                array_foreach_elem(&fuser->languages, user_lang)
                        fts_user_language_free(user_lang);
        }
+       mailbox_match_plugin_deinit(&fuser->autoindex_exclude);
 }
 
 static int
@@ -392,6 +404,8 @@ int fts_mail_user_init(struct mail_user *user, bool initialize_libfts,
                        return -1;
                }
        }
+       fuser->autoindex_exclude =
+               mailbox_match_plugin_init(user, "fts_autoindex_exclude");
 
        MODULE_CONTEXT_SET(user, fts_user_module, fuser);
        return 0;
index e426d7b32c513cd8325f60628201b317198328d1..043f4e1106092a1386f13acf9aa8e464bbf86d89 100644 (file)
@@ -18,6 +18,8 @@ struct fts_user_language *fts_user_get_data_lang(struct mail_user *user);
 const ARRAY_TYPE(fts_user_language) *
 fts_user_get_data_languages(struct mail_user *user);
 
+bool fts_user_autoindex_exclude(struct mailbox *box);
+
 int fts_mail_user_init(struct mail_user *user, bool initialize_libfts,
                       const char **error_r);
 void fts_mail_user_deinit(struct mail_user *user);