From: Stephan Bosch Date: Mon, 13 Mar 2023 23:21:23 +0000 (+0100) Subject: auth: auth-sasl - Add auth_sasl_request_output() X-Git-Tag: 2.4.2~285 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=60328359bad12d7108e627c7d05d26683238a34d;p=thirdparty%2Fdovecot%2Fcore.git auth: auth-sasl - Add auth_sasl_request_output() --- diff --git a/src/auth/auth-sasl.c b/src/auth/auth-sasl.c index 9ae6935210..282d8d2a82 100644 --- a/src/auth/auth-sasl.c +++ b/src/auth/auth-sasl.c @@ -1,9 +1,36 @@ /* Copyright (c) 2023 Dovecot authors, see the included COPYING file */ #include "lib.h" +#include "sasl-server-protected.h" // FIXME: Use public API only #include "auth.h" #include "auth-common.h" #include "auth-sasl.h" +#include "auth-request.h" + +/* + * Request + */ + +void +auth_sasl_request_output(struct auth_request *request, + const struct sasl_server_output *output) +{ + switch (output->status) { + case SASL_SERVER_OUTPUT_INTERNAL_FAILURE: + auth_request_internal_failure(request); + break; + case SASL_SERVER_OUTPUT_FAILURE: + auth_request_fail(request); + break; + case SASL_SERVER_OUTPUT_CONTINUE: + auth_request_handler_reply_continue(request, output->data, + output->data_size); + break; + case SASL_SERVER_OUTPUT_SUCCESS: + auth_request_success(request, output->data, output->data_size); + break; + } +} /* * Mechanisms diff --git a/src/auth/auth-sasl.h b/src/auth/auth-sasl.h index 30b71be944..9ea7f8d4d4 100644 --- a/src/auth/auth-sasl.h +++ b/src/auth/auth-sasl.h @@ -1,6 +1,9 @@ #ifndef AUTH_SASL_H #define AUTH_SASL_H +#include "auth-request.h" // FIXME: remove +#include "sasl-server.h" + /* Used only for string sanitization. */ #define AUTH_SASL_MAX_MECH_NAME_LEN 64 @@ -8,6 +11,14 @@ struct auth_sasl_mech_module { const char *mech_name; }; +/* + * Request + */ + +void +auth_sasl_request_output(struct auth_request *request, + const struct sasl_server_output *output); + /* * Mechanisms */ diff --git a/src/auth/sasl-server.h b/src/auth/sasl-server.h index 61052f37b8..063c85d537 100644 --- a/src/auth/sasl-server.h +++ b/src/auth/sasl-server.h @@ -18,4 +18,22 @@ enum mech_passdb_need { MECH_PASSDB_NEED_SET_CREDENTIALS }; +enum sasl_server_output_status { + /* Internal failure */ + SASL_SERVER_OUTPUT_INTERNAL_FAILURE = -2, + /* Authentication failed */ + SASL_SERVER_OUTPUT_FAILURE = -1, + /* Client is challlenged to continue authentication */ + SASL_SERVER_OUTPUT_CONTINUE = 0, + /* Authentication succeeded */ + SASL_SERVER_OUTPUT_SUCCESS = 1, +}; + +struct sasl_server_output { + enum sasl_server_output_status status; + + const void *data; + size_t data_size; +}; + #endif