Mercurial > dovecot > core-2.2
changeset 11576:99d56a37edd0 HEAD
mailbox list iter: Require MAILBOX_LIST_ITER_VIRTUAL_NAMES flag.
The backend code will be simplified later by removing two code paths for
virtual/non-virtual names.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 17 Jun 2010 21:09:24 +0100 |
parents | 6d0b4dfc0829 |
children | 334d9b18f437 |
files | src/imap/cmd-list.c src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c src/lib-storage/list/mailbox-list-maildir.c src/lib-storage/mailbox-list.c src/plugins/acl/acl-backend-vfile-acllist.c src/plugins/acl/acl-mailbox-list.c src/plugins/acl/acl-shared-storage.c |
diffstat | 7 files changed, 50 insertions(+), 35 deletions(-) [+] |
line wrap: on
line diff
--- a/src/imap/cmd-list.c Thu Jun 17 20:57:22 2010 +0100 +++ b/src/imap/cmd-list.c Thu Jun 17 21:09:24 2010 +0100 @@ -184,7 +184,8 @@ /* find the INBOX flags */ ns = mail_namespace_find_inbox(ctx->cmd->client->user->namespaces); - list_iter = mailbox_list_iter_init(ns->list, "INBOX", 0); + list_iter = mailbox_list_iter_init(ns->list, "INBOX", + MAILBOX_LIST_ITER_VIRTUAL_NAMES); info = mailbox_list_iter_next(list_iter); if (info != NULL) { i_assert(strcasecmp(info->name, "INBOX") == 0); @@ -197,7 +198,8 @@ static bool list_namespace_has_children(struct cmd_list_context *ctx) { enum mailbox_list_iter_flags list_flags = - MAILBOX_LIST_ITER_RETURN_NO_FLAGS; + MAILBOX_LIST_ITER_RETURN_NO_FLAGS | + MAILBOX_LIST_ITER_VIRTUAL_NAMES; struct mailbox_list_iterate_context *list_iter; const struct mailbox_info *info; bool ret = FALSE;
--- a/src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c Thu Jun 17 20:57:22 2010 +0100 +++ b/src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c Thu Jun 17 21:09:24 2010 +0100 @@ -457,7 +457,7 @@ static int rebuild_mailbox(struct mdbox_storage_rebuild_context *ctx, - struct mail_namespace *ns, const char *name) + struct mail_namespace *ns, const char *vname) { struct mailbox *box; struct mdbox_mailbox *mbox; @@ -466,8 +466,10 @@ struct mail_index_transaction *trans; struct dbox_sync_rebuild_context *rebuild_ctx; enum mail_error error; + const char *name; int ret; + name = mail_namespace_get_storage_name(ns, vname); box = mailbox_alloc(ns->list, name, MAILBOX_FLAG_READONLY | MAILBOX_FLAG_KEEP_RECENT | MAILBOX_FLAG_IGNORE_ACLS); @@ -518,6 +520,7 @@ ctx->default_list = ns->list; iter = mailbox_list_iter_init(ns->list, "*", + MAILBOX_LIST_ITER_VIRTUAL_NAMES | MAILBOX_LIST_ITER_RAW_LIST | MAILBOX_LIST_ITER_RETURN_NO_FLAGS); while ((info = mailbox_list_iter_next(iter)) != NULL) {
--- a/src/lib-storage/list/mailbox-list-maildir.c Thu Jun 17 20:57:22 2010 +0100 +++ b/src/lib-storage/list/mailbox-list-maildir.c Thu Jun 17 21:09:24 2010 +0100 @@ -5,6 +5,7 @@ #include "hostpid.h" #include "eacces-error.h" #include "mkdir-parents.h" +#include "str.h" #include "subscription-file.h" #include "mailbox-list-delete.h" #include "mailbox-list-maildir.h" @@ -467,16 +468,14 @@ struct mailbox_list_iterate_context *iter; const struct mailbox_info *info; ARRAY_DEFINE(names_arr, const char *); - const char *pattern, *oldpath, *newpath, *old_listname, *new_listname; - const char *const *names; - unsigned int i, count; - size_t oldnamelen; + const char *pattern, *oldpath, *newpath, *old_childname, *new_childname; + const char *const *names, *old_vname, *new_vname; + unsigned int i, count, old_vnamelen; pool_t pool; - char old_sep; + string_t *str; int ret; ret = 0; - oldnamelen = strlen(oldname); /* first get the list of the children and save them to memory, because we can't rely on readdir() not skipping files while the directory @@ -485,9 +484,16 @@ pool = pool_alloconly_create("Maildir++ children list", 1024); i_array_init(&names_arr, 64); - old_sep = mailbox_list_get_hierarchy_sep(oldlist); - pattern = t_strdup_printf("%s%c*", oldname, old_sep); + str = t_str_new(256); + old_vname = t_strdup(mail_namespace_get_vname(oldlist->ns, str, oldname)); + old_vnamelen = strlen(oldname); + + str_truncate(str, 0); + new_vname = t_strdup(mail_namespace_get_vname(newlist->ns, str, newname)); + + pattern = t_strdup_printf("%s%c*", old_vname, oldlist->ns->sep); iter = mailbox_list_iter_init(oldlist, pattern, + MAILBOX_LIST_ITER_VIRTUAL_NAMES | MAILBOX_LIST_ITER_RETURN_NO_FLAGS | MAILBOX_LIST_ITER_RAW_LIST); while ((info = mailbox_list_iter_next(iter)) != NULL) { @@ -495,9 +501,9 @@ /* verify that the prefix matches, otherwise we could have problems with mailbox names containing '%' and '*' chars */ - if (strncmp(info->name, oldname, oldnamelen) == 0 && - info->name[oldnamelen] == old_sep) { - name = p_strdup(pool, info->name + oldnamelen); + if (strncmp(info->name, old_vname, old_vnamelen) == 0 && + info->name[old_vnamelen] == oldlist->ns->sep) { + name = p_strdup(pool, info->name + old_vnamelen); array_append(&names_arr, &name, 1); } } @@ -509,17 +515,19 @@ } for (i = 0; i < count; i++) { - old_listname = t_strconcat(oldname, names[i], NULL); - if (strcmp(old_listname, newname) == 0) { + old_childname = mail_namespace_get_storage_name(oldlist->ns, + t_strconcat(old_vname, names[i], NULL)); + if (strcmp(old_childname, new_vname) == 0) { /* When doing RENAME "a" "a.b" we see "a.b" here. We don't want to rename it anymore to "a.b.b". */ continue; } - new_listname = t_strconcat(newname, names[i], NULL); - oldpath = mailbox_list_get_path(oldlist, old_listname, + new_childname = mail_namespace_get_storage_name(newlist->ns, + t_strconcat(new_vname, names[i], NULL)); + oldpath = mailbox_list_get_path(oldlist, old_childname, MAILBOX_LIST_PATH_TYPE_MAILBOX); - newpath = mailbox_list_get_path(newlist, new_listname, + newpath = mailbox_list_get_path(newlist, new_childname, MAILBOX_LIST_PATH_TYPE_MAILBOX); /* FIXME: it's possible to merge two mailboxes if either one of @@ -539,9 +547,9 @@ break; } - (void)rename_dir(oldlist, old_listname, newlist, new_listname, + (void)rename_dir(oldlist, old_childname, newlist, new_childname, MAILBOX_LIST_PATH_TYPE_CONTROL); - (void)rename_dir(oldlist, old_listname, newlist, new_listname, + (void)rename_dir(oldlist, old_childname, newlist, new_childname, MAILBOX_LIST_PATH_TYPE_INDEX); } array_free(&names_arr);
--- a/src/lib-storage/mailbox-list.c Thu Jun 17 20:57:22 2010 +0100 +++ b/src/lib-storage/mailbox-list.c Thu Jun 17 21:09:24 2010 +0100 @@ -787,6 +787,11 @@ { i_assert(*patterns != NULL); + /* we'll want to remove MAILBOX_LIST_ITER_VIRTUAL_NAMES flag completely. + this assert will be here until it's sure that there are no more + non-virtual users and it can be safely removed. (and if there are, + this assert can still be easily removed) */ + i_assert((flags & MAILBOX_LIST_ITER_VIRTUAL_NAMES) != 0); return list->v.iter_init(list, patterns, flags); }
--- a/src/plugins/acl/acl-backend-vfile-acllist.c Thu Jun 17 20:57:22 2010 +0100 +++ b/src/plugins/acl/acl-backend-vfile-acllist.c Thu Jun 17 21:09:24 2010 +0100 @@ -156,14 +156,17 @@ static int acllist_append(struct acl_backend_vfile *backend, struct ostream *output, - const char *name) + const char *vname) { struct acl_object *aclobj; struct acl_object_list_iter *iter; struct acl_rights rights; struct acl_backend_vfile_acllist acllist; + const char *name; int ret; + name = mail_namespace_get_storage_name(backend->backend.list->ns, + vname); acl_cache_flush(backend->backend.cache, name); aclobj = acl_object_init_from_name(&backend->backend, name); @@ -248,7 +251,9 @@ acllist_clear(backend, 0); backend->rebuilding_acllist = TRUE; - iter = mailbox_list_iter_init(list, "*", MAILBOX_LIST_ITER_RAW_LIST | + iter = mailbox_list_iter_init(list, "*", + MAILBOX_LIST_ITER_VIRTUAL_NAMES | + MAILBOX_LIST_ITER_RAW_LIST | MAILBOX_LIST_ITER_RETURN_NO_FLAGS); while ((info = mailbox_list_iter_next(iter)) != NULL) { if (acllist_append(backend, output, info->name) < 0) {
--- a/src/plugins/acl/acl-mailbox-list.c Thu Jun 17 20:57:22 2010 +0100 +++ b/src/plugins/acl/acl-mailbox-list.c Thu Jun 17 21:09:24 2010 +0100 @@ -224,21 +224,12 @@ { struct mail_namespace *ns = ctx->list->ns; unsigned int len; - char sep; - if ((ctx->flags & MAILBOX_LIST_ITER_VIRTUAL_NAMES) == 0) - sep = ns->sep; - else { - /* Mailbox names contain namespace prefix, - except when listing INBOX. */ - if (strncmp(name, ns->prefix, ns->prefix_len) == 0) - name += ns->prefix_len; - name = mail_namespace_fix_sep(ns, name); - sep = ns->real_sep; - } + if ((ctx->flags & MAILBOX_LIST_ITER_VIRTUAL_NAMES) != 0) + name = mail_namespace_get_storage_name(ns, name); len = strlen(name); - if (name[len-1] == sep) { + if (name[len-1] == ns->real_sep) { /* name ends with separator. this can happen if doing e.g. LIST "" foo/% and it lists "foo/". */ name = t_strndup(name, len-1);
--- a/src/plugins/acl/acl-shared-storage.c Thu Jun 17 20:57:22 2010 +0100 +++ b/src/plugins/acl/acl-shared-storage.c Thu Jun 17 21:09:24 2010 +0100 @@ -51,6 +51,7 @@ /* check if there are any mailboxes really visible to us */ iter = mailbox_list_iter_init(new_ns->list, "*", + MAILBOX_LIST_ITER_VIRTUAL_NAMES | MAILBOX_LIST_ITER_RETURN_NO_FLAGS); while ((info = mailbox_list_iter_next(iter)) != NULL) break;