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