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