From: Timo Sirainen Date: Fri, 29 Jul 2011 11:29:01 +0000 (+0300) Subject: lib-storage: Added auto_boxes parameter to mailbox_exists(). X-Git-Tag: 2.1.alpha1~198 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cff1f182205e674285cf3ff446a0dcf7afea277d;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Added auto_boxes parameter to mailbox_exists(). --- diff --git a/src/imap/cmd-subscribe.c b/src/imap/cmd-subscribe.c index f8a38221bb..92856810b3 100644 --- a/src/imap/cmd-subscribe.c +++ b/src/imap/cmd-subscribe.c @@ -11,7 +11,7 @@ subscribe_is_valid_name(struct client_command_context *cmd, struct mailbox *box) enum mailbox_existence existence; int ret; - if ((ret = mailbox_exists(box, &existence)) < 0) { + if ((ret = mailbox_exists(box, TRUE, &existence)) < 0) { client_send_storage_error(cmd, mailbox_get_storage(box)); return FALSE; } diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index 46defead1e..fb129818ec 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -151,20 +151,23 @@ index_mailbox_alloc_index(struct mailbox *box) box->index_prefix); } -int index_storage_mailbox_exists(struct mailbox *box, +int index_storage_mailbox_exists(struct mailbox *box, bool auto_boxes, enum mailbox_existence *existence_r) { - return index_storage_mailbox_exists_full(box, NULL, existence_r); + return index_storage_mailbox_exists_full(box, auto_boxes, + NULL, existence_r); } -int index_storage_mailbox_exists_full(struct mailbox *box, const char *subdir, +int index_storage_mailbox_exists_full(struct mailbox *box, bool auto_boxes, + const char *subdir, enum mailbox_existence *existence_r) { struct stat st; const char *path, *path2; if (strcmp(box->name, "INBOX") == 0 && - (box->list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) { + (box->list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0 && + auto_boxes) { /* INBOX always exists */ *existence_r = MAILBOX_EXISTENCE_SELECT; return 0; diff --git a/src/lib-storage/index/index-storage.h b/src/lib-storage/index/index-storage.h index 5479508649..08d8078760 100644 --- a/src/lib-storage/index/index-storage.h +++ b/src/lib-storage/index/index-storage.h @@ -57,9 +57,10 @@ void index_storage_lock_notify_reset(struct mailbox *box); void index_storage_mailbox_alloc(struct mailbox *box, const char *vname, enum mailbox_flags flags, const char *index_prefix); -int index_storage_mailbox_exists(struct mailbox *box, +int index_storage_mailbox_exists(struct mailbox *box, bool auto_boxes, enum mailbox_existence *existence_r); -int index_storage_mailbox_exists_full(struct mailbox *box, const char *subdir, +int index_storage_mailbox_exists_full(struct mailbox *box, bool auto_boxes, + const char *subdir, enum mailbox_existence *existence_r); int index_storage_mailbox_open(struct mailbox *box, bool move_to_memory); int index_storage_mailbox_enable(struct mailbox *box, diff --git a/src/lib-storage/index/maildir/maildir-storage.c b/src/lib-storage/index/maildir/maildir-storage.c index 10f6d27a88..2aacedbd65 100644 --- a/src/lib-storage/index/maildir/maildir-storage.c +++ b/src/lib-storage/index/maildir/maildir-storage.c @@ -323,10 +323,11 @@ static bool maildir_storage_is_readonly(struct mailbox *box) return FALSE; } -static int maildir_mailbox_exists(struct mailbox *box, +static int maildir_mailbox_exists(struct mailbox *box, bool auto_boxes, enum mailbox_existence *existence_r) { - return index_storage_mailbox_exists_full(box, "cur", existence_r); + return index_storage_mailbox_exists_full(box, auto_boxes, + "cur", existence_r); } static int maildir_mailbox_open(struct mailbox *box) diff --git a/src/lib-storage/list/mailbox-list-fs-iter.c b/src/lib-storage/list/mailbox-list-fs-iter.c index cf4a390399..ea4087f88f 100644 --- a/src/lib-storage/list/mailbox-list-fs-iter.c +++ b/src/lib-storage/list/mailbox-list-fs-iter.c @@ -563,10 +563,12 @@ list_file(struct fs_list_iterate_context *ctx, if (!MAILBOX_INFO_FLAGS_FINISHED(ctx->info.flags)) { struct mailbox *box; enum mailbox_existence existence; + bool auto_boxes = + (ctx->ctx.flags & MAILBOX_LIST_ITER_NO_AUTO_BOXES) == 0; box = mailbox_alloc(ctx->ctx.list, list_path, MAILBOX_FLAG_KEEP_RECENT); - ret = mailbox_exists(box, &existence); + ret = mailbox_exists(box, auto_boxes, &existence); mailbox_free(&box); if (ret < 0) { diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index b2479b4d89..66206dfe1b 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -107,7 +107,8 @@ struct mailbox_vfuncs { bool (*is_readonly)(struct mailbox *box); int (*enable)(struct mailbox *box, enum mailbox_feature features); - int (*exists)(struct mailbox *box, enum mailbox_existence *existence_r); + int (*exists)(struct mailbox *box, bool auto_boxes, + enum mailbox_existence *existence_r); int (*open)(struct mailbox *box); void (*close)(struct mailbox *box); void (*free)(struct mailbox *box); diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index dcf9859f92..4d5b04e6ea 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -622,7 +622,8 @@ static bool have_listable_namespace_prefix(struct mail_namespace *ns, return FALSE; } -int mailbox_exists(struct mailbox *box, enum mailbox_existence *existence_r) +int mailbox_exists(struct mailbox *box, bool auto_boxes, + enum mailbox_existence *existence_r) { if (!mailbox_list_is_valid_existing_name(box->list, box->name)) { /* report it as not selectable, since it exists but we won't @@ -638,7 +639,7 @@ int mailbox_exists(struct mailbox *box, enum mailbox_existence *existence_r) return 0; } - return box->v.exists(box, existence_r); + return box->v.exists(box, auto_boxes, existence_r); } static int mailbox_check_mismatching_separators(struct mailbox *box) diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index b0dc323970..bfd98f75fb 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -365,8 +365,11 @@ bool mail_storage_is_mailbox_file(struct mail_storage *storage) ATTR_PURE; with possibly different readonly-state. */ struct mailbox *mailbox_alloc(struct mailbox_list *list, const char *vname, enum mailbox_flags flags); -/* Get mailbox existence state */ -int mailbox_exists(struct mailbox *box, enum mailbox_existence *existence_r); +/* Get mailbox existence state. If auto_boxes=FALSE, return + MAILBOX_EXISTENCE_NONE for autocreated mailboxes that haven't been + physically created yet */ +int mailbox_exists(struct mailbox *box, bool auto_boxes, + enum mailbox_existence *existence_r); /* Open the mailbox. If this function isn't called explicitly, it's also called internally by lib-storage when necessary. */ int mailbox_open(struct mailbox *box); diff --git a/src/lib-storage/test-mailbox.c b/src/lib-storage/test-mailbox.c index 302abe172e..76ae44d4f3 100644 --- a/src/lib-storage/test-mailbox.c +++ b/src/lib-storage/test-mailbox.c @@ -21,6 +21,7 @@ static int test_mailbox_enable(struct mailbox *box, } static int test_mailbox_exists(struct mailbox *box ATTR_UNUSED, + bool auto_boxes ATTR_UNUSED, enum mailbox_existence *existence_r) { *existence_r = MAILBOX_EXISTENCE_SELECT; diff --git a/src/plugins/acl/acl-mailbox.c b/src/plugins/acl/acl-mailbox.c index 0ded8b9b64..0bf5c8d149 100644 --- a/src/plugins/acl/acl-mailbox.c +++ b/src/plugins/acl/acl-mailbox.c @@ -412,7 +412,7 @@ acl_transaction_commit(struct mailbox_transaction_context *ctx, return abox->module_ctx.super.transaction_commit(ctx, changes_r); } -static int acl_mailbox_exists(struct mailbox *box, +static int acl_mailbox_exists(struct mailbox *box, bool auto_boxes, enum mailbox_existence *existence_r) { struct acl_mailbox *abox = ACL_CONTEXT(box); @@ -432,7 +432,8 @@ static int acl_mailbox_exists(struct mailbox *box, if (strcmp(rights[i], MAIL_ACL_LOOKUP) == 0 || strcmp(rights[i], MAIL_ACL_READ) == 0 || strcmp(rights[i], MAIL_ACL_INSERT) == 0) - return abox->module_ctx.super.exists(box, existence_r); + return abox->module_ctx.super.exists(box, auto_boxes, + existence_r); } *existence_r = MAILBOX_EXISTENCE_NONE; return 0; diff --git a/src/plugins/autocreate/autocreate-plugin.c b/src/plugins/autocreate/autocreate-plugin.c index 309b025129..1c1b108b1d 100644 --- a/src/plugins/autocreate/autocreate-plugin.c +++ b/src/plugins/autocreate/autocreate-plugin.c @@ -133,17 +133,17 @@ static int autocreate_mailbox_open(struct mailbox *box) return ret; } -static int autocreate_mailbox_exists(struct mailbox *box, +static int autocreate_mailbox_exists(struct mailbox *box, bool auto_boxes, enum mailbox_existence *existence_r) { union mailbox_module_context *abox = AUTOCREATE_CONTEXT(box); - if (is_autocreated(box->storage->user, box->vname)) { + if (auto_boxes && is_autocreated(box->storage->user, box->vname)) { *existence_r = MAILBOX_EXISTENCE_SELECT; return 0; } - return abox->super.exists(box, existence_r); + return abox->super.exists(box, auto_boxes, existence_r); } static int diff --git a/src/plugins/virtual/virtual-storage.c b/src/plugins/virtual/virtual-storage.c index a64b3c477e..6cf3c8cdfc 100644 --- a/src/plugins/virtual/virtual-storage.c +++ b/src/plugins/virtual/virtual-storage.c @@ -259,10 +259,11 @@ static void virtual_mailbox_close_internal(struct virtual_mailbox *mbox) } } -static int virtual_mailbox_exists(struct mailbox *box, +static int virtual_mailbox_exists(struct mailbox *box, bool auto_boxes, enum mailbox_existence *existence_r) { - return index_storage_mailbox_exists_full(box, VIRTUAL_CONFIG_FNAME, + return index_storage_mailbox_exists_full(box, auto_boxes, + VIRTUAL_CONFIG_FNAME, existence_r); }