Mercurial > dovecot > core-2.2
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 {