Mercurial > dovecot > core-2.2
changeset 21889:35f589fd7a93
lib-imap-client: Call login_callback on all authentication failures
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Fri, 31 Mar 2017 10:49:50 +0300 |
parents | dffc319d8397 |
children | a22fe3e86e90 |
files | src/lib-imap-client/imapc-connection.c |
diffstat | 1 files changed, 14 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-imap-client/imapc-connection.c Fri Mar 31 10:12:58 2017 +0300 +++ b/src/lib-imap-client/imapc-connection.c Fri Mar 31 10:49:50 2017 +0300 @@ -142,6 +142,9 @@ static int imapc_connection_ssl_init(struct imapc_connection *conn); static void imapc_command_free(struct imapc_command *cmd); static void imapc_command_send_more(struct imapc_connection *conn); +static void +imapc_login_callback(struct imapc_connection *conn, + const struct imapc_command_reply *reply); static void imapc_auth_ok(struct imapc_connection *conn) @@ -157,10 +160,11 @@ } static void -imapc_auth_failed(struct imapc_connection *conn, +imapc_auth_failed(struct imapc_connection *conn, const struct imapc_command_reply *reply, const char *error) { i_error("imapc(%s): Authentication failed: %s", conn->name, error); + imapc_login_callback(conn, reply); if (conn->client->state_change_callback == NULL) return; @@ -818,9 +822,7 @@ const struct imapc_command_reply *reply) { if (reply->state != IMAPC_COMMAND_STATE_OK) { - imapc_auth_failed(conn, reply->text_full); - if (conn->login_callback != NULL) - imapc_login_callback(conn, reply); + imapc_auth_failed(conn, reply, reply->text_full); imapc_connection_disconnect(conn); return; } @@ -882,14 +884,14 @@ buf = buffer_create_dynamic(pool_datastack_create(), MAX_BASE64_DECODED_SIZE(input_len)); if (base64_decode(reply->text_full, input_len, NULL, buf) < 0) { - imapc_auth_failed(conn, + imapc_auth_failed(conn, reply, t_strdup_printf("Server sent non-base64 input for AUTHENTICATE: %s", reply->text_full)); } else if (dsasl_client_input(conn->sasl_client, buf->data, buf->used, &error) < 0) { - imapc_auth_failed(conn, error); + imapc_auth_failed(conn, reply, error); } else if (dsasl_client_output(conn->sasl_client, &sasl_output, &sasl_output_len, &error) < 0) { - imapc_auth_failed(conn, error); + imapc_auth_failed(conn, reply, error); } else { string_t *imap_output = t_str_new(MAX_BASE64_ENCODED_SIZE(sasl_output_len)+2); @@ -961,7 +963,11 @@ if (set->sasl_mechanisms != NULL && set->sasl_mechanisms[0] != '\0') { if (imapc_connection_get_sasl_mech(conn, &sasl_mech, &error) < 0) { - imapc_auth_failed(conn, error); + struct imapc_command_reply reply; + i_zero(&reply); + reply.state = IMAPC_COMMAND_STATE_DISCONNECTED; + reply.text_full = ""; + imapc_auth_failed(conn, &reply, error); imapc_connection_disconnect(conn); return; }