auth-client-request.c revision d03a871a77f8ec36f48f5fea98d810e51b186fdb
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Copyright (c) 2003-2012 Dovecot authors, see the included COPYING file */
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen unsigned int id;
d7095f3a4466fbb78b2d5eb3d322bc15a5b0ab1fTimo Sirainenstatic void auth_server_send_new_request(struct auth_server_connection *conn,
e6d7d19c328e7043ad35d5a52c1617bde915a16fTimo Sirainen struct auth_request_info *info = &request->request_info;
9315dd69233d554452df0c12bc57002d2042a8f4Timo Sirainen if ((info->flags & AUTH_REQUEST_FLAG_SUPPORT_FINAL_RESP) != 0)
9315dd69233d554452df0c12bc57002d2042a8f4Timo Sirainen if ((info->flags & AUTH_REQUEST_FLAG_SECURED) != 0)
9315dd69233d554452df0c12bc57002d2042a8f4Timo Sirainen if ((info->flags & AUTH_REQUEST_FLAG_NO_PENALTY) != 0)
538c58fc95200fcc5e91abdda8b912b574a2f968Timo Sirainen if ((info->flags & AUTH_REQUEST_FLAG_VALID_CLIENT_CERT) != 0)
d482b35af87f5fd872bad007da0475813a401a49Timo Sirainen str_append_tabescaped(str, info->cert_username);
d482b35af87f5fd872bad007da0475813a401a49Timo Sirainen str_printfa(str, "\tlip=%s", net_ip2addr(&info->local_ip));
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen str_printfa(str, "\trip=%s", net_ip2addr(&info->remote_ip));
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen str_printfa(str, "\tlport=%u", info->local_port);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen str_printfa(str, "\trport=%u", info->remote_port);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen str_append_tabescaped(str, info->initial_resp_base64);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen if (o_stream_send(conn->output, str_data(str), str_len(str)) < 0)
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen i_error("Error sending request to auth server: %m");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenauth_client_request_new(struct auth_client *client,
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen auth_request_callback_t *callback, void *context)
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen pool = pool_alloconly_create("auth client request", 512);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen request = p_new(pool, struct auth_client_request, 1);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen request->request_info.mech = p_strdup(pool, request_info->mech);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen request->request_info.service = p_strdup(pool, request_info->service);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen p_strdup_empty(pool, request_info->session_id);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen p_strdup_empty(pool, request_info->cert_username);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen p_strdup_empty(pool, request_info->initial_resp_base64);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen auth_server_connection_add_request(request->conn, request);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen auth_server_send_new_request(request->conn, request);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainenvoid auth_client_request_continue(struct auth_client_request *request,
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen prefix = t_strdup_printf("CONT\t%u\t", request->id);
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen if (o_stream_sendv(request->conn->output, iov, 3) < 0)
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen i_error("Error sending continue request to auth server: %m");
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainencall_callback(struct auth_client_request *request,
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen const char *const *args)
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen auth_request_callback_t *callback = request->callback;
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen callback(request, status, data_base64, args, request->context);
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainenvoid auth_client_request_abort(struct auth_client_request **_request)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct auth_client_request *request = *_request;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen auth_client_send_cancel(request->conn->client, request->id);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen call_callback(request, AUTH_REQUEST_STATUS_ABORT, NULL, NULL);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenunsigned int auth_client_request_get_id(struct auth_client_request *request)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenauth_client_request_get_server_pid(struct auth_client_request *request)
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainenconst char *auth_client_request_get_cookie(struct auth_client_request *request)
9887c39c5ba429169389153ca99de49e084a73f0Timo Sirainenbool auth_client_request_is_aborted(struct auth_client_request *request)
03dbd273251103f745c08966f1809c02870390ffTimo Sirainentime_t auth_client_request_get_create_time(struct auth_client_request *request)
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainenvoid auth_client_request_server_input(struct auth_client_request *request,
d7095f3a4466fbb78b2d5eb3d322bc15a5b0ab1fTimo Sirainen const char *const *args)
41bb0aa8e357876bc9a1916a37c9e3e78e5f8185Timo Sirainen /* aborted already */
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen call_callback(request, status, base64_data, args);
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainenvoid auth_client_send_cancel(struct auth_client *client, unsigned int id)
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen const char *str = t_strdup_printf("CANCEL\t%u\n", id);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen if (o_stream_send_str(client->conn->output, str) < 0)
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen i_error("Error sending request to auth server: %m");