]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts plugin: Added fts_autoindex_exclude settings.
authorBaofeng Wang <baofeng.wang@dovecot.fi>
Fri, 10 Jun 2016 11:31:00 +0000 (14:31 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 27 Jun 2016 20:52:23 +0000 (23:52 +0300)
fts_autoindex_exclude setting specifies special-use flag or mailbox name to
be excluded.

 - If a name starts with '\', it's treated as a case-insensitive special-use
flag.

 - Multiple names can be specified with serial numbers, for example:

  plugin {
    fts_autoindex_exclude = \Junk
    fts_autoindex_exclude2 = \Trash
    fts_autoindex_exclude3 = DUMPSTER
    fts_autoindex_exclude4 = New folder
  }

src/plugins/fts/fts-storage.c

index 32dcd309ecf31e0d20d4819d79d969f2af050c69..37229c5f464a591038993b0cfad3eae18769cd46 100644 (file)
@@ -6,6 +6,7 @@
 #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"
@@ -39,6 +40,7 @@ struct fts_mailbox_list {
 struct fts_mailbox {
        union mailbox_module_context module_ctx;
        struct fts_backend_update_context *sync_update_ctx;
+       bool fts_mailbox_excluded;
 };
 
 struct fts_transaction_context {
@@ -629,7 +631,7 @@ fts_transaction_commit(struct mailbox_transaction_context *t,
        bool autoindex;
        int ret = 0;
 
-       autoindex = ft->mails_saved &&
+       autoindex = ft->mails_saved && !fbox->fts_mailbox_excluded &&
                mail_user_plugin_getenv_bool(box->storage->user,
                                        "fts_autoindex");
 
@@ -726,6 +728,60 @@ 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+1];
+       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_append(&patterns, &str, 1);
+
+               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_idx(&patterns, 0);
+}
+
+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 TRUE;
+
+       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 (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);
@@ -738,6 +794,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);
 
        v->get_status = fts_mailbox_get_status;
        v->search_init = fts_mailbox_search_init;