static int
auth_server_lookup_request(struct auth_client_connection *conn,
- const char *id_arg, bool remove,
+ const char *id_arg, bool server_finished,
struct auth_client_request **request_r)
{
struct auth_client_request *request;
"Authentication server sent unknown id %u", id);
return 0;
}
- if (remove || auth_client_request_is_aborted(request))
- auth_client_connection_remove_request(request->conn, request);
+ if (request->server_finished) {
+ e_error(conn->conn.event,
+ "Authentication server sent finished id %u", id);
+ return 0;
+ }
+ if (server_finished)
+ request->server_finished = TRUE;
*request_r = request;
return 1;
ret = auth_server_lookup_request(conn, args[0], TRUE, &request);
if (ret <= 0)
return ret;
- auth_client_request_server_input(request, AUTH_REQUEST_STATUS_OK,
+ auth_client_request_server_input(&request, AUTH_REQUEST_STATUS_OK,
args + 1);
return 0;
}
ret = auth_server_lookup_request(conn, args[0], FALSE, &request);
if (ret <= 0)
return ret;
- auth_client_request_server_input(request, AUTH_REQUEST_STATUS_CONTINUE,
+ auth_client_request_server_input(&request, AUTH_REQUEST_STATUS_CONTINUE,
args + 1);
return 0;
}
ret = auth_server_lookup_request(conn, args[0], TRUE, &request);
if (ret <= 0)
return ret;
- auth_client_request_server_input(request, AUTH_REQUEST_STATUS_FAIL,
+ auth_client_request_server_input(&request, AUTH_REQUEST_STATUS_FAIL,
args + 1);
return 0;
}
oldest = created;
}
- auth_client_request_server_input(request,
+ auth_client_request_server_input(&request,
AUTH_REQUEST_STATUS_INTERNAL_FAIL,
temp_failure_args);
}
auth_request_callback_t *callback;
void *context;
+ bool server_finished:1;
bool removed:1;
};
bool auth_client_request_is_aborted(struct auth_client_request *request);
time_t auth_client_request_get_create_time(struct auth_client_request *request);
-void auth_client_request_server_input(struct auth_client_request *request,
+void auth_client_request_server_input(struct auth_client_request **_request,
enum auth_request_status status,
const char *const *args);
}
}
-void auth_client_request_server_input(struct auth_client_request *request,
+void auth_client_request_server_input(struct auth_client_request **_request,
enum auth_request_status status,
const char *const *args)
{
+ struct auth_client_request *request = *_request;
const char *const *tmp, *base64_data = NULL;
struct event_passthrough *e;
if (auth_client_request_is_aborted(request)) {
/* aborted already */
- return;
+ auth_client_request_free(_request);
+ return TRUE;
}
switch (status) {
call_callback(request, status, base64_data, args);
if (status != AUTH_REQUEST_STATUS_CONTINUE)
- auth_client_request_free(&request);
+ auth_client_request_free(_request);
}
void auth_client_send_cancel(struct auth_client *client, unsigned int id)