dovecot-2.0: Fixed creating mailboxes over \noselect mailboxes.
dovecot at dovecot.org
dovecot at dovecot.org
Mon Feb 15 02:09:17 EET 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/14b287a3523e
changeset: 10716:14b287a3523e
user: Timo Sirainen <tss at iki.fi>
date: Mon Feb 15 02:08:02 2010 +0200
description:
Fixed creating mailboxes over \noselect mailboxes.
diffstat:
src/imap/cmd-rename.c | 2 +-
src/imap/imap-commands-util.c | 14 +++++++++++---
src/imap/imap-commands-util.h | 4 +++-
src/lib-storage/list/mailbox-list-fs.c | 15 +++++++++++++++
4 files changed, 30 insertions(+), 5 deletions(-)
diffs (106 lines):
diff -r be5590207f20 -r 14b287a3523e src/imap/cmd-rename.c
--- a/src/imap/cmd-rename.c Mon Feb 15 02:03:42 2010 +0200
+++ b/src/imap/cmd-rename.c Mon Feb 15 02:08:02 2010 +0200
@@ -21,7 +21,7 @@
return TRUE;
new_ns = client_find_namespace(cmd, &newname,
- CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST);
+ CLIENT_VERIFY_MAILBOX_DIR_SHOULD_NOT_EXIST);
if (new_ns == NULL)
return TRUE;
diff -r be5590207f20 -r 14b287a3523e src/imap/imap-commands-util.c
--- a/src/imap/imap-commands-util.c Mon Feb 15 02:03:42 2010 +0200
+++ b/src/imap/imap-commands-util.c Mon Feb 15 02:08:02 2010 +0200
@@ -91,14 +91,22 @@
switch (mailbox_status) {
case MAILBOX_NAME_EXISTS_MAILBOX:
+ case MAILBOX_NAME_EXISTS_DIR:
switch (mode) {
+ case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST:
+ case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE:
+ if (mailbox_status == MAILBOX_NAME_EXISTS_DIR)
+ break;
+ return ns;
case CLIENT_VERIFY_MAILBOX_NONE:
case CLIENT_VERIFY_MAILBOX_NAME:
- case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST:
case CLIENT_VERIFY_MAILBOX_DIR_SHOULD_EXIST:
- case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE:
return ns;
case CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST:
+ if (mailbox_status == MAILBOX_NAME_EXISTS_DIR)
+ return ns;
+ break;
+ case CLIENT_VERIFY_MAILBOX_DIR_SHOULD_NOT_EXIST:
break;
}
@@ -108,11 +116,11 @@
break;
case MAILBOX_NAME_VALID:
- case MAILBOX_NAME_EXISTS_DIR:
resp_code = "";
switch (mode) {
case CLIENT_VERIFY_MAILBOX_NAME:
case CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST:
+ case CLIENT_VERIFY_MAILBOX_DIR_SHOULD_NOT_EXIST:
case CLIENT_VERIFY_MAILBOX_DIR_SHOULD_EXIST:
return ns;
case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST:
diff -r be5590207f20 -r 14b287a3523e src/imap/imap-commands-util.h
--- a/src/imap/imap-commands-util.h Mon Feb 15 02:03:42 2010 +0200
+++ b/src/imap/imap-commands-util.h Mon Feb 15 02:08:02 2010 +0200
@@ -13,7 +13,9 @@
/* If mailbox doesn't exist, fail with [TRYCREATE] resp code */
CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE,
/* If mailbox exists, fail with [ALREADYEXISTS] resp code */
- CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST
+ CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST,
+ /* If dir/mailbox exists, fail with [ALREADYEXISTS] resp code */
+ CLIENT_VERIFY_MAILBOX_DIR_SHOULD_NOT_EXIST
};
struct msgset_generator_context {
diff -r be5590207f20 -r 14b287a3523e src/lib-storage/list/mailbox-list-fs.c
--- a/src/lib-storage/list/mailbox-list-fs.c Mon Feb 15 02:03:42 2010 +0200
+++ b/src/lib-storage/list/mailbox-list-fs.c Mon Feb 15 02:08:02 2010 +0200
@@ -317,6 +317,16 @@
name, set);
}
+static int mailbox_is_selectable(struct mailbox_list *list, const char *name)
+{
+ enum mailbox_info_flags flags;
+
+ if (mailbox_list_mailbox(list, name, &flags) < 0)
+ return -1;
+
+ return (flags & (MAILBOX_NOSELECT | MAILBOX_NONEXISTENT)) == 0 ? 1 : 0;
+}
+
static int
fs_list_create_mailbox_dir(struct mailbox_list *list, const char *name,
bool directory)
@@ -326,6 +336,7 @@
mode_t mode;
gid_t gid;
bool create_parent_dir;
+ int ret;
/* make sure the alt path doesn't exist yet. it shouldn't (except with
race conditions with RENAME/DELETE), but if something crashed and
@@ -361,6 +372,10 @@
else if (errno == EEXIST) {
if (create_parent_dir)
return 0;
+ if (!directory && *list->set.mailbox_dir_name == '\0') {
+ if ((ret = mailbox_is_selectable(list, name)) <= 0)
+ return ret;
+ }
mailbox_list_set_error(list, MAIL_ERROR_EXISTS,
"Mailbox already exists");
} else if (errno == ENOTDIR) {
More information about the dovecot-cvs
mailing list