auth_request_handle_failure(struct auth_request *request,
struct auth_stream_reply *reply)
{
- struct auth_request_handler *handler = request->context;
+ struct auth_request_handler *handler = request->handler;
if (request->delayed_failure) {
/* we came here from flush_failures() */
}
}
-static void auth_callback(struct auth_request *request,
- enum auth_client_result result,
- const void *auth_reply, size_t reply_size)
+void auth_request_handler_reply(struct auth_request *request,
+ enum auth_client_result result,
+ const void *auth_reply, size_t reply_size)
{
- struct auth_request_handler *handler = request->context;
+ struct auth_request_handler *handler = request->handler;
struct auth_stream_reply *reply;
string_t *str;
auth_request_handler_unref(&handler);
}
+void auth_request_handler_reply_continue(struct auth_request *request,
+ const void *reply, size_t reply_size)
+{
+ auth_request_handler_reply(request, AUTH_CLIENT_RESULT_CONTINUE,
+ reply, reply_size);
+}
+
static void auth_request_handler_auth_fail(struct auth_request_handler *handler,
struct auth_request *request,
const char *reason)
return FALSE;
}
- request = auth_request_new(mech, auth_callback, handler);
+ request = auth_request_new(mech);
request->handler = handler;
request->connect_uid = handler->connect_uid;
request->client_pid = handler->client_pid;
request->initial_response_len = buf->used;
}
- /* handler is referenced until auth_callback is called. */
+ /* handler is referenced until auth_request_handler_reply()
+ is called. */
handler->refcount++;
/* before we start authenticating, see if we need to wait first */
return TRUE;
}
- /* handler is referenced until auth_callback is called. */
+ /* handler is referenced until auth_request_handler_reply()
+ is called. */
handler->refcount++;
auth_request_continue(request, buf->data, buf->used);
return TRUE;
static void userdb_callback(enum userdb_result result,
struct auth_request *request)
{
- struct auth_request_handler *handler = request->context;
+ struct auth_request_handler *handler = request->handler;
struct auth_stream_reply *reply;
const char *value;
old client_id with master's id. */
auth_request_set_state(request, AUTH_REQUEST_STATE_USERDB);
request->id = id;
- request->context = handler;
request->master = master;
/* master and handler are referenced until userdb_callback i
aqueue_delete_tail(auth_failures);
i_assert(auth_request->state == AUTH_REQUEST_STATE_FINISHED);
- auth_request->callback(auth_request,
- AUTH_CLIENT_RESULT_FAILURE, NULL, 0);
+ auth_request_handler_reply(auth_request,
+ AUTH_CLIENT_RESULT_FAILURE, NULL, 0);
auth_request_unref(&auth_request);
}
}
struct auth_master_connection;
struct auth_stream_reply;
+enum auth_client_result {
+ AUTH_CLIENT_RESULT_CONTINUE = 1,
+ AUTH_CLIENT_RESULT_SUCCESS,
+ AUTH_CLIENT_RESULT_FAILURE
+};
+
typedef void
auth_request_callback_t(struct auth_stream_reply *reply, void *context);
const char *args);
bool auth_request_handler_auth_continue(struct auth_request_handler *handler,
const char *args);
+void auth_request_handler_reply(struct auth_request *request,
+ enum auth_client_result result,
+ const void *reply, size_t reply_size);
+void auth_request_handler_reply_continue(struct auth_request *request,
+ const void *reply, size_t reply_size);
bool auth_request_handler_master_request(struct auth_request_handler *handler,
struct auth_master_connection *master,
unsigned int id,
static void auth_request_userdb_reply_update_user(struct auth_request *request);
struct auth_request *
-auth_request_new(const struct mech_module *mech,
- mech_callback_t *callback, void *context)
+auth_request_new(const struct mech_module *mech)
{
struct auth_request *request;
request->set = global_auth_settings;
request->mech = mech;
request->mech_name = mech == NULL ? NULL : mech->mech_name;
- request->callback = callback;
- request->context = context;
return request;
}
auth_request_set_state(request, AUTH_REQUEST_STATE_FINISHED);
request->successful = TRUE;
auth_request_refresh_last_access(request);
- request->callback(request, AUTH_CLIENT_RESULT_SUCCESS,
- data, data_size);
+ auth_request_handler_reply(request, AUTH_CLIENT_RESULT_SUCCESS,
+ data, data_size);
}
void auth_request_fail(struct auth_request *request)
auth_request_set_state(request, AUTH_REQUEST_STATE_FINISHED);
auth_request_refresh_last_access(request);
- request->callback(request, AUTH_CLIENT_RESULT_FAILURE, NULL, 0);
+ auth_request_handler_reply(request, AUTH_CLIENT_RESULT_FAILURE,
+ NULL, 0);
}
void auth_request_internal_failure(struct auth_request *request)
struct auth_stream_reply *userdb_reply;
const struct mech_module *mech;
- struct auth_request_handler *handler;
const struct auth_settings *set;
struct auth_passdb *passdb;
struct auth_userdb *userdb;
+ /* passdb lookups have a handler, userdb lookups don't */
+ struct auth_request_handler *handler;
+ struct auth_master_connection *master;
+
unsigned int connect_uid;
unsigned int client_pid;
unsigned int id;
} private_callback;
const char *credentials_scheme;
- mech_callback_t *callback;
void *context;
- struct auth_master_connection *master;
unsigned int successful:1;
unsigned int passdb_failure:1;
extern unsigned int auth_request_state_count[AUTH_REQUEST_STATE_MAX];
struct auth_request *
-auth_request_new(const struct mech_module *mech,
- mech_callback_t *callback, void *context);
+auth_request_new(const struct mech_module *mech);
struct auth_request *auth_request_new_dummy(void);
void auth_request_init(struct auth_request *request);
struct auth *auth_request_get_auth(struct auth_request *request);
(struct cram_auth_request *)auth_request;
request->challenge = p_strdup(request->pool, get_cram_challenge());
- auth_request->callback(auth_request, AUTH_CLIENT_RESULT_CONTINUE,
- request->challenge, strlen(request->challenge));
+ auth_request_handler_reply_continue(auth_request, request->challenge,
+ strlen(request->challenge));
}
static struct auth_request *mech_cram_md5_auth_new(void)
}
request->authenticated = TRUE;
- auth_request->callback(auth_request,
- AUTH_CLIENT_RESULT_CONTINUE,
- request->rspauth,
- strlen(request->rspauth));
+ auth_request_handler_reply_continue(auth_request,
+ request->rspauth,
+ strlen(request->rspauth));
break;
case PASSDB_RESULT_INTERNAL_FAILURE:
auth_request_internal_failure(auth_request);
/* FIXME: there's no support for subsequent authentication */
challenge = get_digest_challenge(request);
- auth_request->callback(auth_request, AUTH_CLIENT_RESULT_CONTINUE,
- str_data(challenge), str_len(challenge));
+ auth_request_handler_reply_continue(auth_request, str_data(challenge),
+ str_len(challenge));
}
static struct auth_request *mech_digest_md5_auth_new(void)
}
if (ret == 0) {
- auth_request->callback(auth_request,
- AUTH_CLIENT_RESULT_CONTINUE,
- output_token.value, output_token.length);
+ auth_request_handler_reply_continue(auth_request,
+ output_token.value,
+ output_token.length);
}
(void)gss_release_buffer(&minor_status, &output_token);
return ret;
auth_request_log_debug(&request->auth_request, "gssapi",
"Negotiated security layer");
- request->auth_request.callback(&request->auth_request,
- AUTH_CLIENT_RESULT_CONTINUE,
- outbuf.value, outbuf.length);
+ auth_request_handler_reply_continue(&request->auth_request,
+ outbuf.value, outbuf.length);
(void)gss_release_buffer(&minor_status, &outbuf);
request->sasl_gssapi_state = GSS_STATE_UNWRAP;
if (data_size == 0) {
/* The client should go first */
- request->callback(request, AUTH_CLIENT_RESULT_CONTINUE,
- NULL, 0);
+ auth_request_handler_reply_continue(request, NULL, 0);
} else {
mech_gssapi_auth_continue(request, data, data_size);
}
return;
}
- request->callback(request, AUTH_CLIENT_RESULT_CONTINUE,
- prompt2, strlen(prompt2));
+ auth_request_handler_reply_continue(request, prompt2,
+ strlen(prompt2));
} else {
char *pass = p_strndup(unsafe_data_stack_pool, data, data_size);
auth_request_verify_plain(request, pass, plain_verify_callback);
static const char prompt1[] = "Username:";
if (data_size == 0) {
- request->callback(request, AUTH_CLIENT_RESULT_CONTINUE,
- prompt1, strlen(prompt1));
+ auth_request_handler_reply_continue(request, prompt1,
+ strlen(prompt1));
} else {
mech_login_auth_continue(request, data, data_size);
}
request->unicode_negotiated = flags & NTLMSSP_NEGOTIATE_UNICODE;
request->challenge = message->challenge;
- auth_request->callback(auth_request,
- AUTH_CLIENT_RESULT_CONTINUE,
- message, message_size);
+ auth_request_handler_reply_continue(auth_request, message,
+ message_size);
} else {
const struct ntlmssp_response *response =
(const struct ntlmssp_response *)data;
digest_name(request->state.algo),
request->state.seq, request->state.seed);
- auth_request->callback(auth_request,
- AUTH_CLIENT_RESULT_CONTINUE,
- answer, strlen(answer));
+ auth_request_handler_reply_continue(auth_request, answer,
+ strlen(answer));
}
static void
auth_request_fail(auth_request);
else {
token4 = mech_rpa_build_token4(request, &token4_size);
- auth_request->callback(auth_request,
- AUTH_CLIENT_RESULT_CONTINUE,
- token4, token4_size);
+ auth_request_handler_reply_continue(auth_request,
+ token4,
+ token4_size);
request->phase = 2;
}
break;
request->service_ucs2be = ucs2be_str(request->pool, service,
&request->service_len);
- auth_request->callback(auth_request, AUTH_CLIENT_RESULT_CONTINUE,
- token2, token2_size);
+ auth_request_handler_reply_continue(auth_request, token2, token2_size);
request->phase = 1;
}
answer = p_strdup_printf(request->pool, "%u %s",
request->state.seq, request->state.seed);
- auth_request->callback(auth_request,
- AUTH_CLIENT_RESULT_CONTINUE,
- answer, strlen(answer));
+ auth_request_handler_reply_continue(auth_request, answer,
+ strlen(answer));
}
static void
buffer_t *buf;
buf = t_base64_decode_str(token[1]);
- auth_request->callback(auth_request,
- AUTH_CLIENT_RESULT_CONTINUE,
- buf->data, buf->used);
+ auth_request_handler_reply_continue(auth_request, buf->data,
+ buf->used);
request->continued = TRUE;
return HR_OK;
} else if (strcmp(token[0], "NA") == 0) {
const unsigned char *data, size_t data_size)
{
if (data == NULL) {
- request->callback(request, AUTH_CLIENT_RESULT_CONTINUE,
- NULL, 0);
+ auth_request_handler_reply_continue(request, NULL, 0);
} else {
/* initial reply given, even if it was 0 bytes */
request->mech->auth_continue(request, data, data_size);
#include "auth-client-interface.h"
-enum auth_client_result {
- AUTH_CLIENT_RESULT_CONTINUE = 1,
- AUTH_CLIENT_RESULT_SUCCESS,
- AUTH_CLIENT_RESULT_FAILURE
-};
-
struct auth_settings;
struct auth_request;
-typedef void mech_callback_t(struct auth_request *request,
- enum auth_client_result result,
- const void *reply, size_t reply_size);
-
#include "auth-request.h"
+#include "auth-request-handler.h"
/* Used only for string sanitization. */
#define MAX_MECH_NAME_LEN 64