dovecot-2.0: IMAP: Send [ALREADYEXISTS], [NONEXISTENT] and [TRYC...

dovecot at dovecot.org dovecot at dovecot.org
Tue Jun 16 04:45:42 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/8741d62d6b74
changeset: 9480:8741d62d6b74
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Jun 15 21:45:35 2009 -0400
description:
IMAP: Send [ALREADYEXISTS], [NONEXISTENT] and [TRYCREATE] resp-codes correctly.

diffstat:

7 files changed, 57 insertions(+), 20 deletions(-)
src/imap/cmd-append.c         |    3 ++-
src/imap/cmd-copy.c           |    3 ++-
src/imap/cmd-create.c         |    3 ++-
src/imap/cmd-rename.c         |    6 ++++--
src/imap/cmd-subscribe.c      |    6 +++++-
src/imap/imap-commands-util.c |   35 ++++++++++++++++++++++++++++-------
src/imap/imap-commands-util.h |   21 ++++++++++++++-------

diffs (175 lines):

diff -r 9291253df6de -r 8741d62d6b74 src/imap/cmd-append.c
--- a/src/imap/cmd-append.c	Mon Jun 15 21:22:30 2009 -0400
+++ b/src/imap/cmd-append.c	Mon Jun 15 21:45:35 2009 -0400
@@ -454,7 +454,8 @@ get_mailbox(struct client_command_contex
 	struct mail_namespace *ns;
 	struct mailbox *box;
 
-	if (!client_verify_mailbox_name(cmd, name, TRUE, FALSE))
+	if (!client_verify_mailbox_name(cmd, name,
+				CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE))
 		return NULL;
 
 	ns = client_find_namespace(cmd, &name);
diff -r 9291253df6de -r 8741d62d6b74 src/imap/cmd-copy.c
--- a/src/imap/cmd-copy.c	Mon Jun 15 21:22:30 2009 -0400
+++ b/src/imap/cmd-copy.c	Mon Jun 15 21:45:35 2009 -0400
@@ -113,7 +113,8 @@ bool cmd_copy(struct client_command_cont
 		return TRUE;
 
 	/* open the destination mailbox */
-	if (!client_verify_mailbox_name(cmd, mailbox, TRUE, FALSE))
+	if (!client_verify_mailbox_name(cmd, mailbox,
+				CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE))
 		return TRUE;
 
 	ret = imap_search_get_seqset(cmd, messageset, cmd->uid, &search_args);
diff -r 9291253df6de -r 8741d62d6b74 src/imap/cmd-create.c
--- a/src/imap/cmd-create.c	Mon Jun 15 21:22:30 2009 -0400
+++ b/src/imap/cmd-create.c	Mon Jun 15 21:45:35 2009 -0400
@@ -36,7 +36,8 @@ bool cmd_create(struct client_command_co
 		full_mailbox = t_strndup(full_mailbox, len-1);
 	}
 
-	if (!client_verify_mailbox_name(cmd, full_mailbox, FALSE, TRUE))
+	if (!client_verify_mailbox_name(cmd, full_mailbox,
+					CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST))
 		return TRUE;
 
 	storage = mail_namespace_get_default_storage(ns);
diff -r 9291253df6de -r 8741d62d6b74 src/imap/cmd-rename.c
--- a/src/imap/cmd-rename.c	Mon Jun 15 21:22:30 2009 -0400
+++ b/src/imap/cmd-rename.c	Mon Jun 15 21:45:35 2009 -0400
@@ -14,9 +14,11 @@ bool cmd_rename(struct client_command_co
 	if (!client_read_string_args(cmd, 2, &oldname, &newname))
 		return FALSE;
 
-	if (!client_verify_mailbox_name(cmd, oldname, TRUE, FALSE))
+	if (!client_verify_mailbox_name(cmd, oldname,
+					CLIENT_VERIFY_MAILBOX_SHOULD_EXIST))
 		return TRUE;
-	if (!client_verify_mailbox_name(cmd, newname, FALSE, TRUE))
+	if (!client_verify_mailbox_name(cmd, newname,
+					CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST))
 		return TRUE;
 
 	old_ns = client_find_namespace(cmd, &oldname);
diff -r 9291253df6de -r 8741d62d6b74 src/imap/cmd-subscribe.c
--- a/src/imap/cmd-subscribe.c	Mon Jun 15 21:22:30 2009 -0400
+++ b/src/imap/cmd-subscribe.c	Mon Jun 15 21:45:35 2009 -0400
@@ -68,9 +68,13 @@ bool cmd_subscribe_full(struct client_co
 	if (have_listable_namespace_prefix(cmd->client->user->namespaces,
 					   verify_name)) {
 		/* subscribing to a listable namespace prefix, allow it. */
+	} else if (subscribe) {
+		if (!client_verify_mailbox_name(cmd, verify_name,
+					CLIENT_VERIFY_MAILBOX_SHOULD_EXIST))
+			return TRUE;
 	} else {
 		if (!client_verify_mailbox_name(cmd, verify_name,
-						subscribe, FALSE))
+						CLIENT_VERIFY_MAILBOX_NAME))
 			return TRUE;
 	}
 
diff -r 9291253df6de -r 8741d62d6b74 src/imap/imap-commands-util.c
--- a/src/imap/imap-commands-util.c	Mon Jun 15 21:22:30 2009 -0400
+++ b/src/imap/imap-commands-util.c	Mon Jun 15 21:45:35 2009 -0400
@@ -34,11 +34,11 @@ client_find_namespace(struct client_comm
 
 bool client_verify_mailbox_name(struct client_command_context *cmd,
 				const char *mailbox,
-				bool should_exist, bool should_not_exist)
+				enum client_verify_mailbox_mode mode)
 {
 	struct mail_namespace *ns;
 	enum mailbox_name_status mailbox_status;
-	const char *orig_mailbox, *p;
+	const char *orig_mailbox, *p, *resp_code = NULL;
 
 	orig_mailbox = mailbox;
 	ns = client_find_namespace(cmd, &mailbox);
@@ -88,18 +88,39 @@ bool client_verify_mailbox_name(struct c
 
 	switch (mailbox_status) {
 	case MAILBOX_NAME_EXISTS:
-		if (should_exist || !should_not_exist)
+		switch (mode) {
+		case CLIENT_VERIFY_MAILBOX_NAME:
+		case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST:
+		case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE:
 			return TRUE;
-
-		client_send_tagline(cmd, "NO Mailbox exists.");
+		case CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST:
+			break;
+		}
+
+		if (mode == CLIENT_VERIFY_MAILBOX_NAME ||
+		    mode == CLIENT_VERIFY_MAILBOX_SHOULD_EXIST)
+			return TRUE;
+
+		client_send_tagline(cmd, t_strconcat(
+			"NO [", IMAP_RESP_CODE_ALREADYEXISTS,
+			"] Mailbox exists.", NULL));
 		break;
 
 	case MAILBOX_NAME_VALID:
-		if (!should_exist)
+		switch (mode) {
+		case CLIENT_VERIFY_MAILBOX_NAME:
+		case CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST:
 			return TRUE;
+		case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST:
+			resp_code = IMAP_RESP_CODE_NONEXISTENT;
+			break;
+		case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE:
+			resp_code = "TRYCREATE";
+			break;
+		}
 
 		client_send_tagline(cmd, t_strconcat(
-			"NO [TRYCREATE] Mailbox doesn't exist: ",
+			"NO [", resp_code, "] Mailbox doesn't exist: ",
 			str_sanitize(orig_mailbox, MAILBOX_MAX_NAME_LEN),
 			NULL));
 		break;
diff -r 9291253df6de -r 8741d62d6b74 src/imap/imap-commands-util.h
--- a/src/imap/imap-commands-util.h	Mon Jun 15 21:22:30 2009 -0400
+++ b/src/imap/imap-commands-util.h	Mon Jun 15 21:45:35 2009 -0400
@@ -1,5 +1,16 @@
 #ifndef IMAP_COMMANDS_UTIL_H
 #define IMAP_COMMANDS_UTIL_H
+
+enum client_verify_mailbox_mode {
+	/* Verify only that the mailbox name is valid */
+	CLIENT_VERIFY_MAILBOX_NAME,
+	/* If mailbox doesn't exist, fail with [NONEXISTENT] resp code */
+	CLIENT_VERIFY_MAILBOX_SHOULD_EXIST,
+	/* 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
+};
 
 struct msgset_generator_context {
 	string_t *str;
@@ -14,15 +25,11 @@ struct mail_namespace *
 struct mail_namespace *
 client_find_namespace(struct client_command_context *cmd, const char **mailbox);
 
-/* If should_exist is TRUE, this function returns TRUE if the mailbox
-   exists. If it doesn't exist but would be a valid mailbox name, the
-   error message is prefixed with [TRYCREATE].
-
-   If should_exist is FALSE, the should_not_exist specifies if we should
-   return TRUE or FALSE if mailbox doesn't exist. */
+/* Returns TRUE if verifications succeeds. If it fails, a tagged NO is sent to
+   client. */
 bool client_verify_mailbox_name(struct client_command_context *cmd,
 				const char *mailbox,
-				bool should_exist, bool should_not_exist);
+				enum client_verify_mailbox_mode mode);
 
 /* Returns TRUE if mailbox is selected. If not, sends "No mailbox selected"
    error message to client. */


More information about the dovecot-cvs mailing list