]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: sasl-server - Add sasl_server_request_output()
authorStephan Bosch <stephan.bosch@open-xchange.com>
Sat, 4 Mar 2023 01:31:39 +0000 (02:31 +0100)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Thu, 9 Oct 2025 08:41:22 +0000 (08:41 +0000)
Wraps auth_request_handler_reply_continue().

12 files changed:
src/auth/Makefile.am
src/auth/auth-request.h
src/auth/sasl-server-mech-cram-md5.c
src/auth/sasl-server-mech-digest-md5.c
src/auth/sasl-server-mech-gssapi.c
src/auth/sasl-server-mech-login.c
src/auth/sasl-server-mech-otp.c
src/auth/sasl-server-mech-scram.c
src/auth/sasl-server-mech-winbind.c
src/auth/sasl-server-mech.c
src/auth/sasl-server-protected.h
src/auth/sasl-server-request.c [new file with mode: 0644]

index a36350d786037694e1ff8051f9e05eacc378dff2..43c522bf237d9ceef000e0ae551ce2e9f04769a9 100644 (file)
@@ -94,6 +94,7 @@ sasl_server_mechanisms = \
 
 sasl_sources = \
        ${sasl_server_mechanisms} \
+       sasl-server-request.c \
        sasl-server-mech.c
 
 auth_common_sources = \
index 414283382a0754d5c9cbecb2507f1ce190597fa7..f3ce45309cd74b55ab60a9d4d405e05a0b3bad98 100644 (file)
@@ -11,6 +11,7 @@
 #include "sasl-server-protected.h" // FIXME: Use public API only
 #include "userdb.h"
 #include "passdb.h"
+#include "auth-sasl.h"
 #include "auth-request-var-expand.h"
 #include "password-scheme.h"
 
index b479b54a70340913c286ab918383a85387788075..49682fa763839ad2c62b4770ee811156c89350df 100644 (file)
@@ -161,8 +161,8 @@ mech_cram_md5_auth_initial(struct auth_request *auth_request,
                             auth_request);
 
        request->challenge = p_strdup(auth_request->pool, get_cram_challenge());
-       auth_request_handler_reply_continue(auth_request,  request->challenge,
-                                           strlen(request->challenge));
+       sasl_server_request_output(auth_request, request->challenge,
+                                  strlen(request->challenge));
 }
 
 static struct auth_request *mech_cram_md5_auth_new(void)
index a2b7211c32e8f43f5e0a9020f75f4163a278c0d9..f075f82ed8012b19e895c34e6df1c012feabe1a3 100644 (file)
@@ -599,8 +599,8 @@ mech_digest_md5_auth_initial(struct auth_request *auth_request,
        /* FIXME: there's no support for subsequent authentication */
 
        challenge = get_digest_challenge(request);
-       auth_request_handler_reply_continue(auth_request, str_data(challenge),
-                                           str_len(challenge));
+       sasl_server_request_output(auth_request, str_data(challenge),
+                                  str_len(challenge));
 }
 
 static struct auth_request *mech_digest_md5_auth_new(void)
index ce7b537df7fc3fdb97772f7d1c378d2702f6eb44..3c74fc2ef7b2d5b54a755d171dcf339ee3d0e4bf 100644 (file)
@@ -328,9 +328,9 @@ mech_gssapi_sec_context(struct gssapi_auth_request *request,
 
        if (ret == 0) {
                if (output_token.length > 0) {
-                       auth_request_handler_reply_continue(auth_request,
-                                                           output_token.value,
-                                                           output_token.length);
+                       sasl_server_request_output(auth_request,
+                                                  output_token.value,
+                                                  output_token.length);
                } else {
                        /* If there is no output token, go straight to wrap,
                           which is expecting an empty input token. */
@@ -375,8 +375,7 @@ mech_gssapi_wrap(struct gssapi_auth_request *request, gss_buffer_desc inbuf)
 
        e_debug(auth_request->mech_event, "Negotiated security layer");
 
-       auth_request_handler_reply_continue(auth_request, outbuf.value,
-                                           outbuf.length);
+       sasl_server_request_output(auth_request, outbuf.value, outbuf.length);
 
        (void)gss_release_buffer(&minor_status, &outbuf);
        request->sasl_gssapi_state = GSS_STATE_UNWRAP;
@@ -662,8 +661,7 @@ mech_gssapi_auth_initial(struct auth_request *auth_request,
 
        if (data_size == 0) {
                /* The client should go first */
-               auth_request_handler_reply_continue(auth_request,
-                                                   uchar_empty_ptr, 0);
+               sasl_server_request_output(auth_request, uchar_empty_ptr, 0);
        } else {
                mech_gssapi_auth_continue(auth_request, data, data_size);
        }
index 23cac3bd4723112881baa46ccb1b887704548d95..a7e0a9118b5850d0e2fefc010d540f8fe3e39cb6 100644 (file)
@@ -28,8 +28,7 @@ mech_login_auth_continue(struct auth_request *request,
                        return;
                }
 
-               auth_request_handler_reply_continue(request, prompt2,
-                                                   strlen(prompt2));
+               sasl_server_request_output(request, prompt2, strlen(prompt2));
        } else {
                char *pass = p_strndup(unsafe_data_stack_pool, data, data_size);
                auth_request_verify_plain(
@@ -45,8 +44,7 @@ mech_login_auth_initial(struct auth_request *request,
        static const char prompt1[] = "Username:";
 
        if (data_size == 0) {
-               auth_request_handler_reply_continue(request, prompt1,
-                                                   strlen(prompt1));
+               sasl_server_request_output(request, prompt1, strlen(prompt1));
        } else {
                mech_login_auth_continue(request, data, data_size);
        }
index 1be7bc6f720265c3e77e9ebf0c31af0a840a8b42..49d2bcca39d5b78edd8b09ad224a5454369354b3 100644 (file)
@@ -105,8 +105,7 @@ otp_send_challenge(struct otp_auth_request *request,
                                 digest_name(request->state.algo),
                                 request->state.seq, request->state.seed);
 
-       auth_request_handler_reply_continue(auth_request, answer,
-                                           strlen(answer));
+       sasl_server_request_output(auth_request, answer, strlen(answer));
 }
 
 static void
index 4ab018eb950c1e167100891e03b3e67dc936837f..10c2fd956c72fe4fae72a39e6fbdce0323aa42cb 100644 (file)
@@ -49,8 +49,7 @@ credentials_callback(enum passdb_result result,
                end = auth_scram_server_output(&request->scram_server,
                                               &output, &output_len);
                i_assert(!end);
-               auth_request_handler_reply_continue(auth_request,
-                                                   output, output_len);
+               sasl_server_request_output(auth_request, output, output_len);
                break;
        case PASSDB_RESULT_INTERNAL_FAILURE:
                auth_request_internal_failure(auth_request);
@@ -159,8 +158,7 @@ void mech_scram_auth_continue(struct auth_request *auth_request,
 
        if (!auth_scram_server_output(&request->scram_server,
                                      &output, &output_len)) {
-               auth_request_handler_reply_continue(auth_request,
-                                                   output, output_len);
+               sasl_server_request_output(auth_request, output, output_len);
                return;
        }
 
index ab375ada763ee34595128b0835ad54dfca518c92..9d554a93e558e16477927e7eb9f71c98bf4526d5 100644 (file)
@@ -232,8 +232,7 @@ do_auth_continue(struct winbind_auth_request *request,
 
                i_assert(token[1] != NULL);
                buf = t_base64_decode_str(token[1]);
-               auth_request_handler_reply_continue(auth_request, buf->data,
-                                                   buf->used);
+               sasl_server_request_output(auth_request, buf->data, buf->used);
                request->continued = TRUE;
                return HR_OK;
        } else if (strcmp(token[0], "NA") == 0) {
index d3d485f1a71122bb22e35164a7735df90a539ff8..46d595131827557819044b8e31cc25152d3f10e1 100644 (file)
@@ -9,7 +9,7 @@ void sasl_server_mech_generic_auth_initial(struct auth_request *request,
                                           size_t data_size)
 {
        if (data == NULL) {
-               auth_request_handler_reply_continue(request, uchar_empty_ptr, 0);
+               sasl_server_request_output(request, uchar_empty_ptr, 0);
        } else {
                /* initial reply given, even if it was 0 bytes */
                request->mech->auth_continue(request, data, data_size);
index 16fec6b9daa0323272d694a739fdaa1d65b7c2ec..616534dae4a1f3baf28ec6c4cbf56ecae91c1af8 100644 (file)
@@ -63,4 +63,11 @@ void mech_deinit(const struct auth_settings *set);
 
 void mech_oauth2_initialize(void);
 
+/*
+ * Request
+ */
+
+void sasl_server_request_output(struct auth_request *request,
+                               const void *data, size_t data_size);
+
 #endif
diff --git a/src/auth/sasl-server-request.c b/src/auth/sasl-server-request.c
new file mode 100644 (file)
index 0000000..7d22729
--- /dev/null
@@ -0,0 +1,21 @@
+/* Copyright (c) 2023 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "auth-request.h"
+
+#include "sasl-server-private.h"
+
+/*
+ * Mechanism API
+ */
+
+void sasl_server_request_output(struct auth_request *request,
+                               const void *data, size_t data_size)
+{
+       const struct sasl_server_output output = {
+               .status = SASL_SERVER_OUTPUT_CONTINUE,
+               .data = data,
+               .data_size = data_size,
+       };
+       auth_sasl_request_output(request, &output);
+}