From: Markus Valentin Date: Fri, 27 Mar 2020 10:05:22 +0000 (+0100) Subject: auth: Introduce several callbacks in auth-request-handler X-Git-Tag: 2.3.11.2~176 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ccb14aa8411f2c393f9abed8b33098d6083fc2bf;p=thirdparty%2Fdovecot%2Fcore.git auth: Introduce several callbacks in auth-request-handler This adds three callbacks and their default implementations. This change is meant to decouple the code for better testability of auth-mechanims. --- diff --git a/src/auth/auth-request-handler-private.h b/src/auth/auth-request-handler-private.h index 6a29078f13..4d733dfb16 100644 --- a/src/auth/auth-request-handler-private.h +++ b/src/auth/auth-request-handler-private.h @@ -15,6 +15,9 @@ struct auth_request_handler { struct auth_client_connection *conn; auth_master_request_callback_t *master_callback; + auth_request_handler_reply_callback_t *reply_callback; + auth_request_handler_reply_continue_callback_t *reply_continue_callback; + verify_plain_continue_callback_t *verify_plain_continue_callback; bool destroyed:1; bool token_auth:1; diff --git a/src/auth/auth-request-handler.c b/src/auth/auth-request-handler.c index 773e9bb3cd..f10aa54e4b 100644 --- a/src/auth/auth-request-handler.c +++ b/src/auth/auth-request-handler.c @@ -27,6 +27,18 @@ static struct timeout *to_auth_failures; static void auth_failure_timeout(void *context) ATTR_NULL(1); + +static void +auth_request_handler_default_reply_callback(struct auth_request *request, + enum auth_client_result result, + const void *auth_reply, + size_t reply_size); + +static void +auth_request_handler_default_reply_continue(struct auth_request *request, + const void *reply, + size_t reply_size); + struct auth_request_handler * auth_request_handler_create(bool token_auth, auth_client_request_callback_t *callback, struct auth_client_connection *conn, @@ -45,6 +57,12 @@ auth_request_handler_create(bool token_auth, auth_client_request_callback_t *cal handler->conn = conn; handler->master_callback = master_callback; handler->token_auth = token_auth; + handler->reply_callback = + auth_request_handler_default_reply_callback; + handler->reply_continue_callback = + auth_request_handler_default_reply_continue; + handler->verify_plain_continue_callback = + auth_request_default_verify_plain_continue; return handler; } @@ -344,6 +362,16 @@ auth_request_handler_proxy_callback(bool success, struct auth_request *request) 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->handler; + handler->reply_callback(request, result, auth_reply, reply_size); +} + +static void +auth_request_handler_default_reply_callback(struct auth_request *request, + enum auth_client_result result, + const void *auth_reply, + size_t reply_size) { struct auth_request_handler *handler = request->handler; string_t *str; @@ -396,6 +424,14 @@ void auth_request_handler_reply(struct auth_request *request, void auth_request_handler_reply_continue(struct auth_request *request, const void *reply, size_t reply_size) +{ + request->handler->reply_continue_callback(request, reply, reply_size); +} + +static void +auth_request_handler_default_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); diff --git a/src/auth/auth-request-handler.h b/src/auth/auth-request-handler.h index 9a0ee2d9c5..6b601b3f30 100644 --- a/src/auth/auth-request-handler.h +++ b/src/auth/auth-request-handler.h @@ -17,6 +17,17 @@ auth_client_request_callback_t(const char *reply, struct auth_client_connection typedef void auth_master_request_callback_t(const char *reply, struct auth_master_connection *conn); +typedef void +auth_request_handler_reply_callback_t(struct auth_request *request, + enum auth_client_result result, + const void *auth_reply, + size_t reply_size); +typedef void +auth_request_handler_reply_continue_callback_t(struct auth_request *request, + const void *reply, + size_t reply_size); + + struct auth_request_handler * auth_request_handler_create(bool token_auth, auth_client_request_callback_t *callback, struct auth_client_connection *conn, diff --git a/src/auth/auth-request.c b/src/auth/auth-request.c index ffe9f71271..253774f9f7 100644 --- a/src/auth/auth-request.c +++ b/src/auth/auth-request.c @@ -16,6 +16,7 @@ #include "auth-cache.h" #include "auth-request.h" #include "auth-request-handler.h" +#include "auth-request-handler-private.h" #include "auth-request-stats.h" #include "auth-client-connection.h" #include "auth-master-connection.h" @@ -66,9 +67,6 @@ static void get_log_identifier(string_t *str, struct auth_request *auth_request) static void auth_request_userdb_import(struct auth_request *request, const char *args); -static -void auth_request_verify_plain_continue(struct auth_request *request, - verify_plain_callback_t *callback); static void auth_request_lookup_credentials_policy_continue(struct auth_request *request, lookup_credentials_callback_t *callback); @@ -1226,7 +1224,7 @@ void auth_request_policy_penalty_finish(void *context) switch(ctx->type) { case AUTH_POLICY_CHECK_TYPE_PLAIN: - auth_request_verify_plain_continue(ctx->request, ctx->callback_plain); + ctx->request->handler->verify_plain_continue_callback(ctx->request, ctx->callback_plain); return; case AUTH_POLICY_CHECK_TYPE_LOOKUP: auth_request_lookup_credentials_policy_continue(ctx->request, ctx->callback_lookup); @@ -1277,7 +1275,8 @@ void auth_request_verify_plain(struct auth_request *request, request->user_changed_by_lookup = FALSE; if (request->policy_processed || !request->set->policy_check_before_auth) { - auth_request_verify_plain_continue(request, callback); + request->handler->verify_plain_continue_callback(request, + callback); } else { ctx = p_new(request->pool, struct auth_policy_check_ctx, 1); ctx->request = request; @@ -1287,10 +1286,9 @@ void auth_request_verify_plain(struct auth_request *request, } } -static -void auth_request_verify_plain_continue(struct auth_request *request, - verify_plain_callback_t *callback) { - +void auth_request_default_verify_plain_continue(struct auth_request *request, + verify_plain_callback_t *callback) +{ struct auth_passdb *passdb; enum passdb_result result; const char *cache_key, *error; diff --git a/src/auth/auth-request.h b/src/auth/auth-request.h index be09c4d9a7..976f0ad714 100644 --- a/src/auth/auth-request.h +++ b/src/auth/auth-request.h @@ -296,6 +296,8 @@ void auth_request_set_credentials(struct auth_request *request, set_credentials_callback_t *callback); void auth_request_userdb_callback(enum userdb_result result, struct auth_request *request); +void auth_request_default_verify_plain_continue(struct auth_request *request, + verify_plain_callback_t *callback); void auth_request_refresh_last_access(struct auth_request *request); void auth_str_append(string_t *dest, const char *key, const char *value); diff --git a/src/auth/passdb.h b/src/auth/passdb.h index 7625f57f4a..b405aa7e3f 100644 --- a/src/auth/passdb.h +++ b/src/auth/passdb.h @@ -24,6 +24,8 @@ enum passdb_result { typedef void verify_plain_callback_t(enum passdb_result result, struct auth_request *request); +typedef void verify_plain_continue_callback_t(struct auth_request *request, + verify_plain_callback_t *callback); typedef void lookup_credentials_callback_t(enum passdb_result result, const unsigned char *credentials, size_t size,