From: Timo Sirainen Date: Fri, 20 Apr 2012 19:27:01 +0000 (+0300) Subject: imapc: Added imapc_list_prefix setting to limit what mailboxes are accessed. X-Git-Tag: 2.1.5~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b08822564e0fcb8f3eafd2e4be06ae2efedff0cd;p=thirdparty%2Fdovecot%2Fcore.git imapc: Added imapc_list_prefix setting to limit what mailboxes are accessed. --- diff --git a/src/lib-storage/index/imapc/imapc-list.c b/src/lib-storage/index/imapc/imapc-list.c index 556b4a18a1..8f3da5a4c4 100644 --- a/src/lib-storage/index/imapc/imapc-list.c +++ b/src/lib-storage/index/imapc/imapc-list.c @@ -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, diff --git a/src/lib-storage/index/imapc/imapc-settings.c b/src/lib-storage/index/imapc/imapc-settings.c index 6832cdf95d..86172ae9c5 100644 --- a/src/lib-storage/index/imapc/imapc-settings.c +++ b/src/lib-storage/index/imapc/imapc-settings.c @@ -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 = "" }; diff --git a/src/lib-storage/index/imapc/imapc-settings.h b/src/lib-storage/index/imapc/imapc-settings.h index ae444037e5..070f8b790d 100644 --- a/src/lib-storage/index/imapc/imapc-settings.h +++ b/src/lib-storage/index/imapc/imapc-settings.h @@ -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;