Wraps auth_request_handler_reply_continue().
sasl_sources = \
${sasl_server_mechanisms} \
+ sasl-server-request.c \
sasl-server-mech.c
auth_common_sources = \
#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"
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)
/* 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)
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. */
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;
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);
}
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(
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);
}
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
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);
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;
}
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) {
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);
void mech_oauth2_initialize(void);
+/*
+ * Request
+ */
+
+void sasl_server_request_output(struct auth_request *request,
+ const void *data, size_t data_size);
+
#endif
--- /dev/null
+/* 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);
+}