sasl_sources = \
${sasl_server_mechanisms} \
sasl-server-request.c \
- sasl-server-mech.c
+ sasl-server-mech.c \
+ sasl-server.c
auth_common_sources = \
auth.c \
#include "auth.h"
#include "auth-common.h"
#include "auth-sasl.h"
+#include "auth-sasl-oauth2.h"
#include "auth-request.h"
#include "auth-request-handler.h"
+struct sasl_server *auth_sasl_server;
+
/*
* Request
*/
void auth_sasl_request_init(struct auth_request *request,
const struct sasl_server_mech_def *mech)
{
- sasl_server_request_create(&request->sasl.req, mech,
+ sasl_server_request_create(&request->sasl.req, auth_sasl_server, mech,
auth_sasl_translate_protocol_name(request),
request->mech_event);
}
}
return NULL;
}
+
+/*
+ * Global
+ */
+
+void auth_sasl_preinit(void)
+{
+ auth_sasl_oauth2_initialize();
+ auth_sasl_server = sasl_server_init(auth_event);
+}
+
+void auth_sasl_init(void)
+{
+}
+
+void auth_sasl_deinit(void)
+{
+ sasl_server_deinit(&auth_sasl_server);
+}
const char *mech_name;
};
+extern struct sasl_server *auth_sasl_server;
+
/*
* Request
*/
const struct auth_sasl_mech_module *
auth_sasl_mech_module_find(const char *name);
+/*
+ * Global
+ */
+
+void auth_sasl_preinit(void);
+void auth_sasl_init(void);
+void auth_sasl_deinit(void);
+
#endif
#include "otp.h"
#include "mech-otp.h"
#include "auth.h"
+#include "auth-sasl.h"
#include "auth-penalty.h"
#include "auth-token.h"
#include "auth-request-handler.h"
#include "auth-master-connection.h"
#include "auth-client-connection.h"
#include "auth-policy.h"
-#include "auth-sasl-oauth2.h"
#include "db-oauth2.h"
#include <unistd.h>
auth_penalty = auth_penalty_init(AUTH_PENALTY_ANVIL_PATH);
dict_drivers_register_builtin();
- mech_init(global_auth_settings);
- auth_sasl_oauth2_initialize();
- mech_reg = mech_register_init(global_auth_settings);
+ auth_sasl_preinit();
auths_preinit(NULL, global_auth_settings, mech_reg, protocols);
listeners_init();
child_wait_init();
auth_worker_connection_init();
auths_init();
+ auth_sasl_init();
auth_request_handler_init();
auth_policy_init();
the whole data structures containing them. */
module_dir_unload(&modules);
+ auth_sasl_deinit();
+
userdbs_deinit();
passdbs_deinit();
passdb_cache_deinit();
struct sasl_server_request {
pool_t pool;
+ struct sasl_server *server;
struct sasl_server_req_ctx *rctx;
struct sasl_server_mech_request *mech;
sasl_server_mech_passdb_callback_t *passdb_callback;
};
+struct sasl_server {
+ pool_t pool;
+ struct event *event;
+
+ unsigned int requests;
+};
+
#endif
*/
void sasl_server_request_create(struct sasl_server_req_ctx *rctx,
+ struct sasl_server *server,
const struct sasl_server_mech_def *mech,
const char *protocol,
struct event *event_parent)
pool = request->pool;
req = p_new(pool, struct sasl_server_request, 1);
req->pool = pool;
+ req->server = server;
req->rctx = rctx;
+ server->requests++;
+
struct sasl_server_mech_request *mreq;
if (mech->auth_new != NULL)
if (req == NULL)
return;
+ struct sasl_server *server = req->server;
struct sasl_server_mech_request *mreq = req->mech;
+ i_assert(server->requests > 0);
+ server->requests--;
+
if (mreq->mech->auth_free != NULL)
mreq->mech->auth_free(mreq);
}
--- /dev/null
+/* Copyright (c) 2023 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+
+#include "sasl-server-private.h"
+
+static struct event_category event_category_sasl_server = {
+ .name = "sasl-server"
+};
+
+/*
+ * Server
+ */
+
+struct sasl_server *sasl_server_init(struct event *event_parent)
+{
+ struct sasl_server *server;
+ pool_t pool;
+
+ pool = pool_alloconly_create(MEMPOOL_GROWING"sasl_server", 2048);
+ server = p_new(pool, struct sasl_server, 1);
+ server->pool = pool;
+
+ server->event = event_create(event_parent);
+ event_add_category(server->event, &event_category_sasl_server);
+ event_set_append_log_prefix(server->event, "sasl: ");
+
+ return server;
+}
+
+void sasl_server_deinit(struct sasl_server **_server)
+{
+ struct sasl_server *server = *_server;
+
+ if (server == NULL)
+ return;
+ *_server = NULL;
+
+ i_assert(server->requests == 0);
+
+ event_unref(&server->event);
+ pool_unref(&server->pool);
+}
struct sasl_server_mech_def;
struct sasl_server_request;
struct sasl_server_req_ctx;
+struct sasl_server;
enum sasl_passdb_result_status {
SASL_PASSDB_RESULT_INTERNAL_FAILURE = -1,
};
void sasl_server_request_create(struct sasl_server_req_ctx *rctx,
+ struct sasl_server *server,
const struct sasl_server_mech_def *mech,
const char *protocol,
struct event *event_parent);
void sasl_server_request_input(struct sasl_server_req_ctx *rctx,
const unsigned char *data, size_t data_size);
+/*
+ * Server
+ */
+
+struct sasl_server *sasl_server_init(struct event *event_parent);
+void sasl_server_deinit(struct sasl_server **_server);
+
#endif
#include "auth-token.h"
#include "auth-penalty.h"
#include "sasl-server-protected.h" // FIXME: remove
-#include "auth-sasl-oauth2.h"
#include "otp.h"
#include "mech-otp.h"
#include "db-oauth2.h"
password_schemes_register_all();
password_schemes_allow_weak(TRUE);
- auth_sasl_oauth2_initialize();
+ auth_sasl_preinit();
auths_preinit(simple_set.event, global_auth_settings, mech_reg, protocols);
auths_init();
auth_token_init();
+ auth_sasl_init();
auth_penalty = auth_penalty_init("missing");
}
mech_deinit(global_auth_settings);
mech_register_deinit(&mech_reg);
auths_free();
+ auth_sasl_deinit();
settings_free(global_auth_settings);
settings_simple_deinit(&simple_set);
i_unlink_if_exists("auth-token-secret.dat");
#include "master-service.h"
#include "sasl-server-private.h" // FIXME: remove
#include "auth-common.h"
+#include "auth-sasl.h"
#include "auth-request.h"
#include "auth-request-handler-private.h"
#include "auth-settings.h"