dovecot-1.2: Implemented imap-response-codes draft.
dovecot at dovecot.org
dovecot at dovecot.org
Sat Nov 15 21:00:01 EET 2008
details: http://hg.dovecot.org/dovecot-1.2/rev/abd0ef855a33
changeset: 8411:abd0ef855a33
user: Timo Sirainen <tss at iki.fi>
date: Sat Nov 15 20:59:54 2008 +0200
description:
Implemented imap-response-codes draft.
diffstat:
19 files changed, 112 insertions(+), 35 deletions(-)
src/imap-login/client-authenticate.c | 18 +++++----
src/imap/client.c | 4 +-
src/imap/cmd-copy.c | 4 +-
src/imap/cmd-fetch.c | 5 ++
src/imap/cmd-search.c | 6 ++-
src/imap/cmd-status.c | 11 ++++-
src/imap/commands-util.c | 44 +++++++++++++++++++++--
src/lib-storage/index/cydir/cydir-storage.c | 4 +-
src/lib-storage/index/dbox/dbox-storage.c | 10 ++---
src/lib-storage/index/index-search.c | 3 +
src/lib-storage/index/maildir/maildir-storage.c | 6 +--
src/lib-storage/index/mbox/mbox-storage.c | 6 +--
src/lib-storage/list/mailbox-list-fs.c | 2 -
src/lib-storage/list/mailbox-list-maildir.c | 2 -
src/lib-storage/mail-error.h | 9 +++-
src/lib-storage/mail-storage-private.h | 2 +
src/lib-storage/mail-storage.c | 5 ++
src/lib-storage/mail-storage.h | 4 ++
src/lib-storage/mailbox-list.c | 2 -
diffs (truncated from 463 to 300 lines):
diff -r 3c0d14ec17a5 -r abd0ef855a33 src/imap-login/client-authenticate.c
--- a/src/imap-login/client-authenticate.c Sat Nov 15 20:23:46 2008 +0200
+++ b/src/imap-login/client-authenticate.c Sat Nov 15 20:59:54 2008 +0200
@@ -18,6 +18,7 @@
#include <stdlib.h>
#define IMAP_SERVICE_NAME "imap"
+#define IMAP_AUTH_FAILED_MSG "[AUTHENTICATIONFAILED] "AUTH_FAILED_MSG
const char *client_authenticate_get_capabilities(bool secured)
{
@@ -178,10 +179,12 @@ static bool client_handle_args(struct im
reply = t_str_new(128);
if (reason != NULL)
str_printfa(reply, "NO %s", reason);
- else if (temp || proxy_self)
- str_append(reply, "NO "AUTH_TEMP_FAILED_MSG);
- else
- str_append(reply, "NO "AUTH_FAILED_MSG);
+ else if (temp || proxy_self) {
+ str_append(reply, "NO [UNAVAILABLE] "
+ AUTH_TEMP_FAILED_MSG);
+ } else {
+ str_append(reply, "NO "IMAP_AUTH_FAILED_MSG);
+ }
client_send_tagline(client, str_c(reply));
} else {
/* normal login/failure */
@@ -227,8 +230,8 @@ static void sasl_callback(struct client
}
msg = reply == SASL_SERVER_REPLY_AUTH_FAILED ? "NO " : "BAD ";
- msg = t_strconcat(msg, data != NULL ? data : AUTH_FAILED_MSG,
- NULL);
+ msg = t_strconcat(msg, data != NULL ? data :
+ IMAP_AUTH_FAILED_MSG, NULL);
client_send_tagline(client, msg);
if (!client->destroyed)
@@ -334,7 +337,8 @@ int cmd_login(struct imap_client *client
"* BAD [ALERT] Plaintext authentication is disabled, "
"but your client sent password in plaintext anyway. "
"If anyone was listening, the password was exposed.");
- client_send_tagline(client, "NO "AUTH_PLAINTEXT_DISABLED_MSG);
+ client_send_tagline(client, "NO [CLIENTBUG] "
+ AUTH_PLAINTEXT_DISABLED_MSG);
return 1;
}
diff -r 3c0d14ec17a5 -r abd0ef855a33 src/imap/client.c
--- a/src/imap/client.c Sat Nov 15 20:23:46 2008 +0200
+++ b/src/imap/client.c Sat Nov 15 20:59:54 2008 +0200
@@ -409,8 +409,8 @@ static bool client_command_check_ambigui
}
if (broken_client) {
- client_send_line(cmd->client,
- "* BAD Command pipelining results in ambiguity.");
+ client_send_line(cmd->client, "* BAD [CLIENTBUG] "
+ "Command pipelining results in ambiguity.");
}
return TRUE;
diff -r 3c0d14ec17a5 -r abd0ef855a33 src/imap/cmd-copy.c
--- a/src/imap/cmd-copy.c Sat Nov 15 20:23:46 2008 +0200
+++ b/src/imap/cmd-copy.c Sat Nov 15 20:59:54 2008 +0200
@@ -171,8 +171,8 @@ bool cmd_copy(struct client_command_cont
return cmd_sync(cmd, sync_flags, imap_flags, msg);
else if (ret == 0) {
/* some messages were expunged, sync them */
- return cmd_sync(cmd, 0, 0,
- "NO Some of the requested messages no longer exist.");
+ return cmd_sync(cmd, 0, 0, "NO [EXPUNGEISSUED] "
+ "Some of the requested messages no longer exist.");
} else {
client_send_storage_error(cmd, storage);
return TRUE;
diff -r 3c0d14ec17a5 -r abd0ef855a33 src/imap/cmd-fetch.c
--- a/src/imap/cmd-fetch.c Sat Nov 15 20:23:46 2008 +0200
+++ b/src/imap/cmd-fetch.c Sat Nov 15 20:59:54 2008 +0200
@@ -131,6 +131,11 @@ static bool cmd_fetch_finish(struct imap
struct client_command_context *cmd = ctx->cmd;
static const char *ok_message = "OK Fetch completed.";
+ if (ctx->partial_fetch) {
+ ok_message = "OK [EXPUNGEISSUED] "
+ "Some messages were already expunged.";
+ }
+
if (imap_fetch_deinit(ctx) < 0)
ctx->failed = TRUE;
diff -r 3c0d14ec17a5 -r abd0ef855a33 src/imap/cmd-search.c
--- a/src/imap/cmd-search.c Sat Nov 15 20:23:46 2008 +0200
+++ b/src/imap/cmd-search.c Sat Nov 15 20:59:54 2008 +0200
@@ -366,7 +366,7 @@ static bool cmd_search_more(struct clien
const struct seq_range *range;
unsigned int count;
uint32_t id, id_min, id_max;
- bool tryagain, minmax;
+ bool tryagain, minmax, lost_data;
if (cmd->cancel) {
(void)imap_search_deinit(ctx);
@@ -440,6 +440,7 @@ static bool cmd_search_more(struct clien
}
}
+ lost_data = mailbox_search_seen_lost_data(ctx->search_ctx);
if (imap_search_deinit(ctx) < 0) {
client_send_storage_error(cmd,
mailbox_get_storage(cmd->client->mailbox));
@@ -459,7 +460,8 @@ static bool cmd_search_more(struct clien
if (!cmd->uid || ctx->have_seqsets)
sync_flags |= MAILBOX_SYNC_FLAG_NO_EXPUNGES;
return cmd_sync(cmd, sync_flags, 0,
- t_strdup_printf("OK Search completed (%d.%03d secs).",
+ t_strdup_printf("OK %sSearch completed (%d.%03d secs).",
+ lost_data ? "[EXPUNGEISSUED] " : "",
(int)end_time.tv_sec,
(int)(end_time.tv_usec/1000)));
}
diff -r 3c0d14ec17a5 -r abd0ef855a33 src/imap/cmd-status.c
--- a/src/imap/cmd-status.c Sat Nov 15 20:23:46 2008 +0200
+++ b/src/imap/cmd-status.c Sat Nov 15 20:59:54 2008 +0200
@@ -13,6 +13,7 @@ bool cmd_status(struct client_command_co
enum mailbox_status_items items;
struct mail_storage *storage;
const char *mailbox, *real_mailbox;
+ bool selected_mailbox;
/* <mailbox> <status items> */
if (!client_read_args(cmd, 2, 0, &args))
@@ -33,13 +34,19 @@ bool cmd_status(struct client_command_co
if (storage == NULL)
return TRUE;
+ selected_mailbox = client->mailbox != NULL &&
+ mailbox_equals(client->mailbox, storage, real_mailbox);
if (!imap_status_get(client, storage, real_mailbox, items, &status)) {
client_send_storage_error(cmd, storage);
return TRUE;
}
imap_status_send(client, mailbox, items, &status);
- client_send_tagline(cmd, "OK Status completed.");
-
+ if (!selected_mailbox)
+ client_send_tagline(cmd, "OK Status completed.");
+ else {
+ client_send_tagline(cmd, "OK [CLIENTBUG] "
+ "Status on selected mailbox completed.");
+ }
return TRUE;
}
diff -r 3c0d14ec17a5 -r abd0ef855a33 src/imap/commands-util.c
--- a/src/imap/commands-util.c Sat Nov 15 20:23:46 2008 +0200
+++ b/src/imap/commands-util.c Sat Nov 15 20:59:54 2008 +0200
@@ -143,6 +143,46 @@ bool client_verify_open_mailbox(struct c
}
}
+static const char *
+get_error_string(const char *error_string, enum mail_error error)
+{
+ const char *resp_code = NULL;
+
+ switch (error) {
+ case MAIL_ERROR_NONE:
+ break;
+ case MAIL_ERROR_TEMP:
+ resp_code = "SERVERBUG";
+ break;
+ case MAIL_ERROR_NOTPOSSIBLE:
+ case MAIL_ERROR_PARAMS:
+ resp_code = "CANNOT";
+ break;
+ case MAIL_ERROR_PERM:
+ resp_code = "ACL";
+ break;
+ case MAIL_ERROR_NOSPACE:
+ resp_code = "OVERQUOTA";
+ break;
+ case MAIL_ERROR_NOTFOUND:
+ resp_code = "NONEXISTENT";
+ break;
+ case MAIL_ERROR_EXISTS:
+ resp_code = "ALREADYEXISTS";
+ break;
+ case MAIL_ERROR_EXPUNGED:
+ resp_code = "EXPUNGEISSUED";
+ break;
+ case MAIL_ERROR_INUSE:
+ resp_code = "INUSE";
+ break;
+ }
+ if (resp_code == NULL || *error_string == '[')
+ return t_strconcat("NO ", error_string, NULL);
+ else
+ return t_strdup_printf("NO [%s] %s", resp_code, error_string);
+}
+
void client_send_list_error(struct client_command_context *cmd,
struct mailbox_list *list)
{
@@ -150,7 +190,7 @@ void client_send_list_error(struct clien
enum mail_error error;
error_string = mailbox_list_get_last_error(list, &error);
- client_send_tagline(cmd, t_strconcat("NO ", error_string, NULL));
+ client_send_tagline(cmd, get_error_string(error_string, error));
}
void client_send_storage_error(struct client_command_context *cmd,
@@ -168,7 +208,7 @@ void client_send_storage_error(struct cl
}
error_string = mail_storage_get_last_error(storage, &error);
- client_send_tagline(cmd, t_strconcat("NO ", error_string, NULL));
+ client_send_tagline(cmd, get_error_string(error_string, error));
}
void client_send_untagged_storage_error(struct client *client,
diff -r 3c0d14ec17a5 -r abd0ef855a33 src/lib-storage/index/cydir/cydir-storage.c
--- a/src/lib-storage/index/cydir/cydir-storage.c Sat Nov 15 20:23:46 2008 +0200
+++ b/src/lib-storage/index/cydir/cydir-storage.c Sat Nov 15 20:59:54 2008 +0200
@@ -224,7 +224,7 @@ static int cydir_mailbox_create(struct m
path = mailbox_list_get_path(_storage->list, name,
MAILBOX_LIST_PATH_TYPE_MAILBOX);
if (stat(path, &st) == 0) {
- mail_storage_set_error(_storage, MAIL_ERROR_NOTPOSSIBLE,
+ mail_storage_set_error(_storage, MAIL_ERROR_EXISTS,
"Mailbox already exists");
return -1;
}
@@ -293,7 +293,7 @@ cydir_delete_nonrecursive(struct mailbox
}
if (!unlinked_something) {
- mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE,
+ mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND,
t_strdup_printf("Directory %s isn't empty, "
"can't delete it.", name));
return -1;
diff -r 3c0d14ec17a5 -r abd0ef855a33 src/lib-storage/index/dbox/dbox-storage.c
--- a/src/lib-storage/index/dbox/dbox-storage.c Sat Nov 15 20:23:46 2008 +0200
+++ b/src/lib-storage/index/dbox/dbox-storage.c Sat Nov 15 20:59:54 2008 +0200
@@ -344,7 +344,7 @@ static int dbox_mailbox_create(struct ma
directory ? MAILBOX_LIST_PATH_TYPE_DIR :
MAILBOX_LIST_PATH_TYPE_MAILBOX);
if (stat(path, &st) == 0) {
- mail_storage_set_error(_storage, MAIL_ERROR_NOTPOSSIBLE,
+ mail_storage_set_error(_storage, MAIL_ERROR_EXISTS,
"Mailbox already exists");
return -1;
}
@@ -355,7 +355,7 @@ static int dbox_mailbox_create(struct ma
it. */
alt_path = directory ? NULL : dbox_get_alt_path(storage, path);
if (alt_path != NULL && stat(alt_path, &st) == 0) {
- mail_storage_set_error(_storage, MAIL_ERROR_NOTPOSSIBLE,
+ mail_storage_set_error(_storage, MAIL_ERROR_EXISTS,
"Mailbox already exists");
return -1;
}
@@ -426,7 +426,7 @@ dbox_delete_nonrecursive(struct mailbox_
}
if (!unlinked_something) {
- mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE,
+ mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND,
t_strdup_printf("Directory %s isn't empty, "
"can't delete it.", name));
return -1;
@@ -501,7 +501,7 @@ dbox_list_delete_mailbox(struct mailbox_
else if (errno == ENOTEMPTY) {
if (deleted)
return 0;
- mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE,
+ mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND,
t_strdup_printf("Directory %s isn't empty, "
"can't delete it.", name));
} else if (!mailbox_list_set_error_from_errno(list)) {
@@ -547,7 +547,7 @@ dbox_list_rename_mailbox_pre(struct mail
if (stat(alt_newpath, &st) == 0) {
/* race condition or a directory left there lying around?
safest to just report error. */
- mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE,
+ mailbox_list_set_error(list, MAIL_ERROR_EXISTS,
"Target mailbox already exists");
return -1;
} else if (errno != ENOENT) {
diff -r 3c0d14ec17a5 -r abd0ef855a33 src/lib-storage/index/index-search.c
--- a/src/lib-storage/index/index-search.c Sat Nov 15 20:23:46 2008 +0200
+++ b/src/lib-storage/index/index-search.c Sat Nov 15 20:59:54 2008 +0200
@@ -1207,6 +1207,9 @@ int index_storage_search_next_nonblock(s
} else T_BEGIN {
ret = search_match_next(ctx) ? 1 : 0;
+ if (ctx->mail->expunged)
More information about the dovecot-cvs
mailing list