]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Added imapc_list_prefix setting to limit what mailboxes are accessed.
authorTimo Sirainen <tss@iki.fi>
Fri, 20 Apr 2012 19:27:01 +0000 (22:27 +0300)
committerTimo Sirainen <tss@iki.fi>
Fri, 20 Apr 2012 19:27:01 +0000 (22:27 +0300)
src/lib-storage/index/imapc/imapc-list.c
src/lib-storage/index/imapc/imapc-settings.c
src/lib-storage/index/imapc/imapc-settings.h

index 556b4a18a153bdae614f78f521845c840e7c5e2a..8f3da5a4c432e0fa6c928e4a2d5f74b054f3047a 100644 (file)
@@ -92,7 +92,7 @@ imapc_list_update_tree(struct imapc_mailbox_list *list,
 
        T_BEGIN {
                const char *vname =
-                       mailbox_list_default_get_vname(&list->list, name);
+                       mailbox_list_get_vname(&list->list, name);
 
                if ((info_flags & MAILBOX_NONEXISTENT) != 0)
                        node = mailbox_tree_lookup(tree, vname);
@@ -191,6 +191,37 @@ static char imapc_list_get_hierarchy_sep(struct mailbox_list *_list)
        return list->sep;
 }
 
+static const char *
+imapc_list_get_storage_name(struct mailbox_list *_list, const char *vname)
+{
+       struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
+       const char *prefix = list->storage->set->imapc_list_prefix;
+       const char *storage_name;
+
+       storage_name = mailbox_list_default_get_storage_name(_list, vname);
+       if (*prefix != '\0') {
+               storage_name = t_strdup_printf("%s%c%s", prefix, list->sep,
+                                              storage_name);
+       }
+       return storage_name;
+}
+
+static const char *
+imapc_list_get_vname(struct mailbox_list *_list, const char *storage_name)
+{
+       struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
+       const char *prefix = list->storage->set->imapc_list_prefix;
+       unsigned int prefix_len;
+
+       if (*prefix != '\0') {
+               prefix_len = strlen(prefix);
+               i_assert(strncmp(prefix, storage_name, prefix_len) == 0 &&
+                        storage_name[prefix_len] == list->sep);
+               storage_name += prefix_len+1;
+       }
+       return mailbox_list_default_get_vname(_list, storage_name);
+}
+
 static struct mailbox_list *imapc_list_get_fs(struct imapc_mailbox_list *list)
 {
        struct mailbox_list_settings list_set;
@@ -313,14 +344,22 @@ static int imapc_list_refresh(struct imapc_mailbox_list *list)
 {
        struct imapc_command *cmd;
        struct imapc_simple_context ctx;
+       const char *pattern;
 
        i_assert(list->sep != '\0');
 
        if (list->refreshed_mailboxes)
                return 0;
 
+       if (*list->storage->set->imapc_list_prefix == '\0')
+               pattern = "*";
+       else {
+               pattern = t_strdup_printf("%s%c*",
+                       list->storage->set->imapc_list_prefix, list->sep);
+       }
+
        cmd = imapc_list_simple_context_init(&ctx, list);
-       imapc_command_send(cmd, "LIST \"\" *");
+       imapc_command_sendf(cmd, "LIST \"\" %s", pattern);
        mailbox_tree_deinit(&list->mailboxes);
        list->mailboxes = mailbox_tree_init(list->sep);
 
@@ -611,7 +650,7 @@ int imapc_list_get_mailbox_flags(struct mailbox_list *_list, const char *name,
 
        i_assert(list->sep != '\0');
 
-       vname = mailbox_list_default_get_vname(_list, name);
+       vname = mailbox_list_get_vname(_list, name);
        if (!list->refreshed_mailboxes) {
                node = mailbox_tree_lookup(list->mailboxes, vname);
                if (node != NULL)
@@ -646,8 +685,8 @@ struct mailbox_list imapc_mailbox_list = {
                imapc_is_valid_existing_name,
                imapc_is_valid_create_name,
                imapc_list_get_hierarchy_sep,
-               mailbox_list_default_get_vname,
-               mailbox_list_default_get_storage_name,
+               imapc_list_get_vname,
+               imapc_list_get_storage_name,
                imapc_list_get_path,
                imapc_list_get_temp_prefix,
                imapc_list_join_refpattern,
index 6832cdf95da27f0dc9eacf5d1bdc835d6c92bed4..86172ae9c5f3fd90a9426860217b07843617d9a8 100644 (file)
@@ -27,6 +27,7 @@ static const struct setting_define imapc_setting_defines[] = {
 
        DEF(SET_STR, imapc_features),
        DEF(SET_STR, imapc_rawlog_dir),
+       DEF(SET_STR, imapc_list_prefix),
        DEF(SET_STR, ssl_crypto_device),
 
        SETTING_DEFINE_LIST_END
@@ -46,6 +47,7 @@ static const struct imapc_settings imapc_default_settings = {
 
        .imapc_features = "",
        .imapc_rawlog_dir = "",
+       .imapc_list_prefix = "",
        .ssl_crypto_device = ""
 };
 
index ae444037e5d7804852ce5fde36f28b8f075b6f45..070f8b790da9e782ac11551618c0440f0e3c815f 100644 (file)
@@ -22,6 +22,7 @@ struct imapc_settings {
 
        const char *imapc_features;
        const char *imapc_rawlog_dir;
+       const char *imapc_list_prefix;
        const char *ssl_crypto_device;
 
        enum imapc_features parsed_features;