Mercurial > dovecot > original-hg > dovecot-1.2
changeset 9492:3efdbaab2960 HEAD
imap: Don't send NONEXISTENT resp code to non-delete operations.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 23 Nov 2009 15:04:17 -0500 |
parents | 76294bdecd5a |
children | 8472e487da49 |
files | src/imap/commands-util.c src/imap/commands.c src/imap/commands.h |
diffstat | 3 files changed, 21 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/imap/commands-util.c Mon Nov 23 14:48:49 2009 -0500 +++ b/src/imap/commands-util.c Mon Nov 23 15:04:17 2009 -0500 @@ -129,23 +129,26 @@ break; case MAILBOX_NAME_VALID: + resp_code = ""; 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; + 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; @@ -180,7 +183,8 @@ } static const char * -get_error_string(const char *error_string, enum mail_error error) +get_error_string(struct client_command_context *cmd, + const char *error_string, enum mail_error error) { const char *resp_code = NULL; @@ -201,7 +205,8 @@ 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; @@ -226,7 +231,7 @@ enum mail_error error; error_string = mailbox_list_get_last_error(list, &error); - client_send_tagline(cmd, get_error_string(error_string, error)); + client_send_tagline(cmd, get_error_string(cmd, error_string, error)); } void client_send_storage_error(struct client_command_context *cmd, @@ -244,7 +249,7 @@ } error_string = mail_storage_get_last_error(storage, &error); - client_send_tagline(cmd, get_error_string(error_string, error)); + client_send_tagline(cmd, get_error_string(cmd, error_string, error)); } void client_send_untagged_storage_error(struct client *client,
--- a/src/imap/commands.c Mon Nov 23 14:48:49 2009 -0500 +++ b/src/imap/commands.c Mon Nov 23 15:04:17 2009 -0500 @@ -15,14 +15,14 @@ { "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 },
--- a/src/imap/commands.h Mon Nov 23 14:48:49 2009 -0500 +++ b/src/imap/commands.h Mon Nov 23 15:04:17 2009 -0500 @@ -23,7 +23,12 @@ 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 {