changeset 18370:b28de884c470

imapc: If authentication fails, preserve the error message as storage/list error. This isn't very helpful yet, because the mailbox list creation itself fails.
author Timo Sirainen <tss@iki.fi>
date Thu, 19 Mar 2015 00:38:01 +0200
parents fca7232724dd
children b900b50085fc
files src/lib-storage/index/imapc/imapc-list.c src/lib-storage/index/imapc/imapc-storage.c src/lib-storage/index/imapc/imapc-storage.h
diffstat 3 files changed, 39 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/imapc/imapc-list.c	Thu Mar 19 00:32:44 2015 +0200
+++ b/src/lib-storage/index/imapc/imapc-list.c	Thu Mar 19 00:38:01 2015 +0200
@@ -140,6 +140,8 @@
 		imapc_list_copy_error_from_reply(ctx->client->_list,
 						 MAIL_ERROR_PARAMS, reply);
 		ctx->ret = -1;
+	} else if (ctx->client->auth_failed) {
+		ctx->ret = -1;
 	} else {
 		mailbox_list_set_critical(&ctx->client->_list->list,
 			"imapc: Command failed: %s", reply->text_full);
@@ -270,6 +272,8 @@
 		imapc_list_sep_verify(list);
 	else if (reply->state == IMAPC_COMMAND_STATE_NO)
 		imapc_list_copy_error_from_reply(list, MAIL_ERROR_PARAMS, reply);
+	else if (list->client->auth_failed)
+		;
 	else if (!list->list.ns->user->deinitializing) {
 		mailbox_list_set_critical(&list->list,
 			"imapc: Command failed: %s", reply->text_full);
@@ -293,6 +297,8 @@
 int imapc_list_try_get_root_sep(struct imapc_mailbox_list *list, char *sep_r)
 {
 	if (list->root_sep == '\0') {
+		if (list->client->auth_failed)
+			return -1;
 		imapc_list_send_hierarcy_sep_lookup(list);
 		while (list->root_sep_pending)
 			imapc_client_run(list->client->client);
--- a/src/lib-storage/index/imapc/imapc-storage.c	Thu Mar 19 00:32:44 2015 +0200
+++ b/src/lib-storage/index/imapc/imapc-storage.c	Thu Mar 19 00:38:01 2015 +0200
@@ -110,6 +110,10 @@
 
 void imapc_simple_run(struct imapc_simple_context *sctx)
 {
+	if (sctx->client->auth_failed) {
+		imapc_client_disconnect(sctx->client->client);
+		sctx->ret = -1;
+	}
 	while (sctx->ret == -2)
 		imapc_client_run(sctx->client->client);
 }
@@ -138,6 +142,8 @@
 		imapc_copy_error_from_reply(ctx->client->_storage,
 					    MAIL_ERROR_PARAMS, reply);
 		ctx->ret = -1;
+	} else if (ctx->client->auth_failed) {
+		ctx->ret = -1;
 	} else {
 		mail_storage_set_critical(&ctx->client->_storage->storage,
 			"imapc: Command failed: %s", reply->text_full);
@@ -193,6 +199,28 @@
 	}
 }
 
+static void
+imapc_storage_client_login(const struct imapc_command_reply *reply,
+			   void *context)
+{
+	struct imapc_storage_client *client = context;
+
+	if (reply->state == IMAPC_COMMAND_STATE_OK)
+		return;
+
+	i_error("imapc: Authentication failed: %s", reply->text_full);
+	client->auth_failed = TRUE;
+
+	if (client->_storage != NULL) {
+		mail_storage_set_error(&client->_storage->storage,
+				       MAIL_ERROR_PERM, reply->text_full);
+	}
+	if (client->_list != NULL) {
+		mailbox_list_set_error(&client->_list->list,
+				       MAIL_ERROR_PERM, reply->text_full);
+	}
+}
+
 int imapc_storage_client_create(struct mail_namespace *ns,
 				const struct imapc_settings *imapc_set,
 				const struct mail_storage_settings *mail_set,
@@ -257,7 +285,7 @@
 	imapc_client_register_untagged(client->client,
 				       imapc_storage_client_untagged_cb, client);
 	/* start logging in immediately */
-	imapc_client_login(client->client, NULL, NULL);
+	imapc_client_login(client->client, imapc_storage_client_login, client);
 
 	*client_r = client;
 	return 0;
@@ -449,6 +477,8 @@
 		imapc_copy_error_from_reply(ctx->mbox->storage,
 					    MAIL_ERROR_NOTFOUND, reply);
 		ctx->ret = -1;
+	} else if (ctx->mbox->storage->client->auth_failed) {
+		ctx->ret = -1;
 	} else {
 		mail_storage_set_critical(ctx->mbox->box.storage,
 			"imapc: Opening mailbox '%s' failed: %s",
--- a/src/lib-storage/index/imapc/imapc-storage.h	Thu Mar 19 00:32:44 2015 +0200
+++ b/src/lib-storage/index/imapc/imapc-storage.h	Thu Mar 19 00:38:01 2015 +0200
@@ -50,6 +50,8 @@
 	struct imapc_client *client;
 
 	ARRAY(struct imapc_storage_event_callback) untagged_callbacks;
+
+	unsigned int auth_failed:1;
 };
 
 struct imapc_storage {