dovecot-2.0-sslstream: imap: Don't send NONEXISTENT resp code to...
dovecot at dovecot.org
dovecot at dovecot.org
Sat Feb 13 02:56:40 EET 2010
details: http://hg.dovecot.org/dovecot-2.0-sslstream/rev/b79bc02aec6d
changeset: 10392:b79bc02aec6d
user: Timo Sirainen <tss at iki.fi>
date: Mon Nov 23 15:01:45 2009 -0500
description:
imap: Don't send NONEXISTENT resp code to non-delete operations.
diffstat:
8 files changed, 33 insertions(+), 17 deletions(-)
src/imap/cmd-list.c | 2 +-
src/imap/cmd-status.c | 2 +-
src/imap/imap-commands-util.c | 21 ++++++++++++++-------
src/imap/imap-commands-util.h | 3 ++-
src/imap/imap-commands.c | 6 +++---
src/imap/imap-commands.h | 7 ++++++-
src/imap/imap-status.c | 6 ++++--
src/imap/imap-status.h | 3 ++-
diffs (187 lines):
diff -r ce0ff560cd80 -r b79bc02aec6d src/imap/cmd-list.c
--- a/src/imap/cmd-list.c Mon Nov 23 14:51:03 2009 -0500
+++ b/src/imap/cmd-list.c Mon Nov 23 15:01:45 2009 -0500
@@ -320,7 +320,7 @@ static void list_send_status(struct cmd_
const char *storage_name, *error;
storage_name = mail_namespace_get_storage_name(ctx->ns, name);
- if (imap_status_get(ctx->cmd->client, ctx->ns, storage_name,
+ if (imap_status_get(ctx->cmd, ctx->ns, storage_name,
ctx->status_items, &status, &error) < 0) {
client_send_line(ctx->cmd->client,
t_strconcat("* ", error, NULL));
diff -r ce0ff560cd80 -r b79bc02aec6d src/imap/cmd-status.c
--- a/src/imap/cmd-status.c Mon Nov 23 14:51:03 2009 -0500
+++ b/src/imap/cmd-status.c Mon Nov 23 15:01:45 2009 -0500
@@ -38,7 +38,7 @@ bool cmd_status(struct client_command_co
selected_mailbox = client->mailbox != NULL &&
mailbox_equals(client->mailbox, ns, real_mailbox);
- if (imap_status_get(client, ns, real_mailbox, items,
+ if (imap_status_get(cmd, ns, real_mailbox, items,
&status, &error) < 0) {
client_send_tagline(cmd, error);
return TRUE;
diff -r ce0ff560cd80 -r b79bc02aec6d src/imap/imap-commands-util.c
--- a/src/imap/imap-commands-util.c Mon Nov 23 14:51:03 2009 -0500
+++ b/src/imap/imap-commands-util.c Mon Nov 23 15:01:45 2009 -0500
@@ -111,23 +111,26 @@ client_find_namespace(struct client_comm
break;
case MAILBOX_NAME_VALID:
+ resp_code = "";
switch (mode) {
case CLIENT_VERIFY_MAILBOX_NAME:
case CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST:
return ns;
case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST:
- resp_code = IMAP_RESP_CODE_NONEXISTENT;
+ if ((cmd->cmd_flags & COMMAND_FLAG_USE_NONEXISTENT) != 0)
+ resp_code = IMAP_RESP_CODE_NONEXISTENT;
break;
case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE:
resp_code = "TRYCREATE";
break;
default:
- resp_code = NULL;
i_unreached();
}
+ if (*resp_code != '\0')
+ resp_code = t_strconcat("[", resp_code, "] ", NULL);
client_send_tagline(cmd, t_strconcat(
- "NO [", resp_code, "] Mailbox doesn't exist: ",
+ "NO ", resp_code, "Mailbox doesn't exist: ",
str_sanitize(orig_mailbox, MAILBOX_MAX_NAME_LEN),
NULL));
break;
@@ -161,7 +164,8 @@ bool client_verify_open_mailbox(struct c
}
const char *
-imap_get_error_string(const char *error_string, enum mail_error error)
+imap_get_error_string(struct client_command_context *cmd,
+ const char *error_string, enum mail_error error)
{
const char *resp_code = NULL;
@@ -182,7 +186,8 @@ imap_get_error_string(const char *error_
resp_code = IMAP_RESP_CODE_OVERQUOTA;
break;
case MAIL_ERROR_NOTFOUND:
- resp_code = IMAP_RESP_CODE_NONEXISTENT;
+ if ((cmd->cmd_flags & COMMAND_FLAG_USE_NONEXISTENT) != 0)
+ resp_code = IMAP_RESP_CODE_NONEXISTENT;
break;
case MAIL_ERROR_EXISTS:
resp_code = IMAP_RESP_CODE_ALREADYEXISTS;
@@ -207,7 +212,8 @@ void client_send_list_error(struct clien
enum mail_error error;
error_string = mailbox_list_get_last_error(list, &error);
- client_send_tagline(cmd, imap_get_error_string(error_string, error));
+ client_send_tagline(cmd, imap_get_error_string(cmd, error_string,
+ error));
}
void client_send_storage_error(struct client_command_context *cmd,
@@ -225,7 +231,8 @@ void client_send_storage_error(struct cl
}
error_string = mail_storage_get_last_error(storage, &error);
- client_send_tagline(cmd, imap_get_error_string(error_string, error));
+ client_send_tagline(cmd, imap_get_error_string(cmd, error_string,
+ error));
}
void client_send_untagged_storage_error(struct client *client,
diff -r ce0ff560cd80 -r b79bc02aec6d src/imap/imap-commands-util.h
--- a/src/imap/imap-commands-util.h Mon Nov 23 14:51:03 2009 -0500
+++ b/src/imap/imap-commands-util.h Mon Nov 23 15:01:45 2009 -0500
@@ -33,7 +33,8 @@ bool client_verify_open_mailbox(struct c
bool client_verify_open_mailbox(struct client_command_context *cmd);
const char *
-imap_get_error_string(const char *error_string, enum mail_error error);
+imap_get_error_string(struct client_command_context *cmd,
+ const char *error_string, enum mail_error error);
/* Send last mailbox list error message to client. */
void client_send_list_error(struct client_command_context *cmd,
diff -r ce0ff560cd80 -r b79bc02aec6d src/imap/imap-commands.c
--- a/src/imap/imap-commands.c Mon Nov 23 14:51:03 2009 -0500
+++ b/src/imap/imap-commands.c Mon Nov 23 15:01:45 2009 -0500
@@ -15,14 +15,14 @@ static const struct command imap4rev1_co
{ "APPEND", cmd_append, COMMAND_FLAG_BREAKS_SEQS },
{ "EXAMINE", cmd_examine, COMMAND_FLAG_BREAKS_MAILBOX },
{ "CREATE", cmd_create, 0 },
- { "DELETE", cmd_delete, 0 },
- { "RENAME", cmd_rename, 0 },
+ { "DELETE", cmd_delete, COMMAND_FLAG_USE_NONEXISTENT },
+ { "RENAME", cmd_rename, COMMAND_FLAG_USE_NONEXISTENT },
{ "LIST", cmd_list, 0 },
{ "LSUB", cmd_lsub, 0 },
{ "SELECT", cmd_select, COMMAND_FLAG_BREAKS_MAILBOX },
{ "STATUS", cmd_status, 0 },
{ "SUBSCRIBE", cmd_subscribe, 0 },
- { "UNSUBSCRIBE", cmd_unsubscribe, 0 },
+ { "UNSUBSCRIBE", cmd_unsubscribe, COMMAND_FLAG_USE_NONEXISTENT },
{ "CHECK", cmd_check, COMMAND_FLAG_BREAKS_SEQS },
{ "CLOSE", cmd_close, COMMAND_FLAG_BREAKS_MAILBOX },
diff -r ce0ff560cd80 -r b79bc02aec6d src/imap/imap-commands.h
--- a/src/imap/imap-commands.h Mon Nov 23 14:51:03 2009 -0500
+++ b/src/imap/imap-commands.h Mon Nov 23 15:01:45 2009 -0500
@@ -24,7 +24,12 @@ enum command_flags {
COMMAND_FLAG_USES_SEQS,
/* Command requires mailbox syncing before it can do its job. */
- COMMAND_FLAG_REQUIRES_SYNC = 0x08
+ COMMAND_FLAG_REQUIRES_SYNC = 0x08,
+ /* Command allows replying with [NONEXISTENT] imap resp code.
+ Dovecot internally returns it for all kinds of commands,
+ but unfortunately RFC 5530 specifies it only for "delete something"
+ operations. */
+ COMMAND_FLAG_USE_NONEXISTENT = 0x10
};
struct command {
diff -r ce0ff560cd80 -r b79bc02aec6d src/imap/imap-status.c
--- a/src/imap/imap-status.c Mon Nov 23 14:51:03 2009 -0500
+++ b/src/imap/imap-status.c Mon Nov 23 15:01:45 2009 -0500
@@ -49,10 +49,12 @@ int imap_status_parse_items(struct clien
return 0;
}
-int imap_status_get(struct client *client, struct mail_namespace *ns,
+int imap_status_get(struct client_command_context *cmd,
+ struct mail_namespace *ns,
const char *mailbox, enum mailbox_status_items items,
struct mailbox_status *status_r, const char **error_r)
{
+ struct client *client = cmd->client;
struct mailbox *box;
enum mail_error error;
int ret;
@@ -77,7 +79,7 @@ int imap_status_get(struct client *clien
if (ret < 0) {
struct mail_storage *storage = mailbox_get_storage(box);
*error_r = mail_storage_get_last_error(storage, &error);
- *error_r = imap_get_error_string(*error_r, error);
+ *error_r = imap_get_error_string(cmd, *error_r, error);
}
mailbox_close(&box);
return ret;
diff -r ce0ff560cd80 -r b79bc02aec6d src/imap/imap-status.h
--- a/src/imap/imap-status.h Mon Nov 23 14:51:03 2009 -0500
+++ b/src/imap/imap-status.h Mon Nov 23 15:01:45 2009 -0500
@@ -4,7 +4,8 @@ int imap_status_parse_items(struct clien
int imap_status_parse_items(struct client_command_context *cmd,
const struct imap_arg *args,
enum mailbox_status_items *items_r);
-int imap_status_get(struct client *client, struct mail_namespace *ns,
+int imap_status_get(struct client_command_context *cmd,
+ struct mail_namespace *ns,
const char *mailbox, enum mailbox_status_items items,
struct mailbox_status *status_r, const char **error_r);
void imap_status_send(struct client *client, const char *mailbox,
More information about the dovecot-cvs
mailing list