]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Introduce several callbacks in auth-request-handler
authorMarkus Valentin <markus.valentin@open-xchange.com>
Fri, 27 Mar 2020 10:05:22 +0000 (11:05 +0100)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Fri, 24 Apr 2020 12:00:22 +0000 (12:00 +0000)
This adds three callbacks and their default implementations. This
change is meant to decouple the code for better testability of
auth-mechanims.

src/auth/auth-request-handler-private.h
src/auth/auth-request-handler.c
src/auth/auth-request-handler.h
src/auth/auth-request.c
src/auth/auth-request.h
src/auth/passdb.h

index 6a29078f13902c3e622e192203ed71d51134a53c..4d733dfb16e7b301bbdc09264749f718623bc3da 100644 (file)
@@ -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;
index 773e9bb3cd78a2e909e0e6e13204daf690b19f9d..f10aa54e4b9b4e2faa48918c390455f44aaf2d03 100644 (file)
@@ -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);
index 9a0ee2d9c5eb163d9f22533d18098cda3b9ef7dd..6b601b3f30b1b1388b7b912492b03206060729ac 100644 (file)
@@ -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,
index ffe9f7127193881f1f0a931cf07d069ac3beaef7..253774f9f7b4c45ae76cd4c1ed5e0af73282da0a 100644 (file)
@@ -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;
index be09c4d9a75f9307ebf0ec333b6b7bff0a1c2e8c..976f0ad714227711d9e652eeb6a74d243de0fa1c 100644 (file)
@@ -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);
index 7625f57f4ab5f6f91864af7d6824403ec70f177b..b405aa7e3f45da63cf3510c24c84fefaa5af71fc 100644 (file)
@@ -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,