Mercurial > dovecot > core-2.2
changeset 11354:f70433791464 HEAD
login: Tell auth process to free aborted auth requests.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 20 May 2010 13:17:30 +0200 |
parents | 1bc3d5589c5a |
children | ef1de95396d4 |
files | src/auth/auth-client-connection.c src/auth/auth-request-handler.c src/auth/auth-request-handler.h src/lib-auth/auth-client-request.c src/lib-auth/auth-client.h src/login-common/sasl-server.c |
diffstat | 6 files changed, 56 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/auth/auth-client-connection.c Thu May 20 12:37:15 2010 +0200 +++ b/src/auth/auth-client-connection.c Thu May 20 13:17:30 2010 +0200 @@ -166,6 +166,20 @@ } static bool +auth_client_cancel(struct auth_client_connection *conn, const char *line) +{ + unsigned int client_id; + + if (str_to_uint(line, &client_id) < 0) { + i_error("BUG: Authentication client sent broken CANCEL"); + return FALSE; + } + + auth_request_handler_cancel_request(conn->request_handler, client_id); + return TRUE; +} + +static bool auth_client_handle_line(struct auth_client_connection *conn, const char *line) { if (strncmp(line, "AUTH\t", 5) == 0) { @@ -186,6 +200,11 @@ return auth_request_handler_auth_continue(conn->request_handler, line + 5); } + if (strncmp(line, "CANCEL\t", 7) == 0) { + if (conn->auth->set->debug) + i_debug("client in: %s", line); + return auth_client_cancel(conn, line + 7); + } i_error("BUG: Authentication client sent unknown command: %s", str_sanitize(line, 80));
--- a/src/auth/auth-request-handler.c Thu May 20 12:37:15 2010 +0200 +++ b/src/auth/auth-request-handler.c Thu May 20 13:17:30 2010 +0200 @@ -587,6 +587,16 @@ return TRUE; } +void auth_request_handler_cancel_request(struct auth_request_handler *handler, + unsigned int client_id) +{ + struct auth_request *request; + + request = hash_table_lookup(handler->requests, POINTER_CAST(client_id)); + if (request != NULL) + auth_request_handler_remove(handler, request); +} + void auth_request_handler_flush_failures(bool flush_all) { struct auth_request **auth_requests, *auth_request;
--- a/src/auth/auth-request-handler.h Thu May 20 12:37:15 2010 +0200 +++ b/src/auth/auth-request-handler.h Thu May 20 13:17:30 2010 +0200 @@ -37,6 +37,8 @@ struct auth_master_connection *master, unsigned int id, unsigned int client_id); +void auth_request_handler_cancel_request(struct auth_request_handler *handler, + unsigned int client_id); void auth_request_handler_flush_failures(bool flush_all);
--- a/src/lib-auth/auth-client-request.c Thu May 20 12:37:15 2010 +0200 +++ b/src/lib-auth/auth-client-request.c Thu May 20 13:17:30 2010 +0200 @@ -115,9 +115,13 @@ void auth_client_request_abort(struct auth_client_request **_request) { struct auth_client_request *request = *_request; + const char *str = t_strdup_printf("CANCEL\t%u\n", request->id); *_request = NULL; + if (o_stream_send_str(request->conn->output, str) < 0) + i_error("Error sending request to auth server: %m"); + request->callback(request, AUTH_REQUEST_STATUS_FAIL, NULL, NULL, request->context); request->callback = NULL; @@ -176,3 +180,11 @@ if (status != AUTH_REQUEST_STATUS_CONTINUE) pool_unref(&request->pool); } + +void auth_client_send_cancel(struct auth_client *client, unsigned int id) +{ + const char *str = t_strdup_printf("CANCEL\t%u\n", id); + + if (o_stream_send_str(client->conn->output, str) < 0) + i_error("Error sending request to auth server: %m"); +}
--- a/src/lib-auth/auth-client.h Thu May 20 12:37:15 2010 +0200 +++ b/src/lib-auth/auth-client.h Thu May 20 13:17:30 2010 +0200 @@ -91,4 +91,7 @@ /* Return cookie of the server that handled this request. */ const char *auth_client_request_get_cookie(struct auth_client_request *request); +/* Tell auth process to drop specified request from memory */ +void auth_client_send_cancel(struct auth_client *client, unsigned int id); + #endif
--- a/src/login-common/sasl-server.c Thu May 20 12:37:15 2010 +0200 +++ b/src/login-common/sasl-server.c Thu May 20 13:17:30 2010 +0200 @@ -139,6 +139,15 @@ master_auth_callback, client, &client->master_tag); } +static void master_abort_request(struct anvil_request *anvil_request) +{ + const char *cookie; + + cookie = binary_to_hex(anvil_request->cookie, + sizeof(anvil_request->cookie)); + auth_client_send_cancel(auth_client, anvil_request->auth_id); +} + static void anvil_lookup_callback(const char *reply, void *context) { struct anvil_request *req = context; @@ -155,6 +164,7 @@ set->mail_max_userip_connections); call_client_callback(client, SASL_SERVER_REPLY_MASTER_FAILED, errmsg, NULL); + master_abort_request(req); } i_free(req); }