# HG changeset patch # User Timo Sirainen # Date 1259006657 18000 # Node ID 3efdbaab2960f546de70ab7f25dac86dcdb43e7e # Parent 76294bdecd5ab1500ff597e585c6b2aa283c03e2 imap: Don't send NONEXISTENT resp code to non-delete operations. diff -r 76294bdecd5a -r 3efdbaab2960 src/imap/commands-util.c --- 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, diff -r 76294bdecd5a -r 3efdbaab2960 src/imap/commands.c --- 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 }, diff -r 76294bdecd5a -r 3efdbaab2960 src/imap/commands.h --- 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 {