From afde21bdc508f51a2d20e9c19f1dba718ec2c0de Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Sun, 30 May 2004 07:50:06 +0300 Subject: [PATCH] PLAIN auth fallbacking works now with initial responses --HG-- branch : HEAD --- src/lib-auth/auth-server-request.c | 70 +++++++++++++++++------------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/src/lib-auth/auth-server-request.c b/src/lib-auth/auth-server-request.c index f343bd3e50..86d404bc73 100644 --- a/src/lib-auth/auth-server-request.c +++ b/src/lib-auth/auth-server-request.c @@ -30,6 +30,44 @@ struct auth_request { unsigned int retrying:1; }; +static int auth_server_send_new_request(struct auth_server_connection *conn, + struct auth_request *request); + +static struct auth_server_connection * +get_next_plain_server(struct auth_server_connection *conn) +{ + conn = conn->next; + while (conn != NULL) { + if (conn->has_plain_mech) + return conn; + conn = conn->next; + } + return NULL; +} + +static void +auth_server_request_check_retry(struct auth_request *request, + const unsigned char *data, size_t data_size) +{ + if (strcmp(request->mech, "PLAIN") == 0 && + request->plaintext_data == NULL && request->conn != NULL) { + request->next_conn = get_next_plain_server(request->conn); + if (request->next_conn != NULL) { + /* plaintext authentication - save the data so we can + try it for the next */ + request->plaintext_data = i_malloc(data_size); + memcpy(request->plaintext_data, data, data_size); + request->plaintext_data_size = data_size; + + hash_insert(request->next_conn->requests, + POINTER_CAST(request->id), request); + auth_server_send_new_request(request->next_conn, + request); + request->retrying = TRUE; + } + } +} + static int auth_server_send_new_request(struct auth_server_connection *conn, struct auth_request *request) { @@ -76,6 +114,8 @@ static int auth_server_send_new_request(struct auth_server_connection *conn, return FALSE; } + auth_server_request_check_retry(request, request->initial_resp_data, + request->initial_resp_size); return TRUE; } @@ -99,18 +139,6 @@ static void auth_server_send_continue(struct auth_server_connection *conn, } } -static struct auth_server_connection * -get_next_plain_server(struct auth_server_connection *conn) -{ - conn = conn->next; - while (conn != NULL) { - if (conn->has_plain_mech) - return conn; - conn = conn->next; - } - return NULL; -} - void auth_server_request_handle_reply(struct auth_server_connection *conn, struct auth_client_request_reply *reply, const unsigned char *data) @@ -255,23 +283,7 @@ void auth_client_request_continue(struct auth_request *request, { auth_server_send_continue(request->conn, request, data, data_size); - if (strcmp(request->mech, "PLAIN") == 0 && - request->plaintext_data == NULL && request->conn != NULL) { - request->next_conn = get_next_plain_server(request->conn); - if (request->next_conn != NULL) { - /* plaintext authentication - save the data so we can - try it for the next */ - request->plaintext_data = i_malloc(data_size); - memcpy(request->plaintext_data, data, data_size); - request->plaintext_data_size = data_size; - - hash_insert(request->next_conn->requests, - POINTER_CAST(request->id), request); - auth_server_send_new_request(request->next_conn, - request); - request->retrying = TRUE; - } - } + auth_server_request_check_retry(request, data, data_size); } void auth_client_request_abort(struct auth_request *request) -- 2.47.3