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