]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: sasl-server-mech - Add facilities for maintaining global mechanism state
authorStephan Bosch <stephan.bosch@open-xchange.com>
Tue, 24 Oct 2023 01:51:37 +0000 (03:51 +0200)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Thu, 9 Oct 2025 08:41:22 +0000 (08:41 +0000)
src/auth/sasl-server-mech.c
src/auth/sasl-server-private.h
src/auth/sasl-server-protected.h
src/auth/sasl-server.c

index 438ea121a670c645ecb4ec5d0c69c926705c585f..90a6decd01ff9efab3edb6c8c184ee011d2594b5 100644 (file)
@@ -45,6 +45,44 @@ void sasl_server_mech_generic_auth_initial(
        }
 }
 
+/*
+ * Global data
+ */
+
+static struct sasl_server_mech_data *
+sasl_server_mech_data_init(struct sasl_server *server,
+                          struct sasl_server_mech_def_reg *mech_dreg)
+{
+       struct sasl_server_mech_data *mdata;
+       const struct sasl_server_mech_def *mech_def = mech_dreg->def;
+
+       if (mech_def->funcs->data_new == NULL)
+               return NULL;
+       if (mech_dreg->data != NULL)
+               return mech_dreg->data;
+
+       mech_dreg->data = mdata = mech_def->funcs->data_new(server->pool);
+       mdata->pool = server->pool;
+       mdata->server = server;
+       mdata->def = mech_def;
+
+       return mdata;
+}
+
+static void
+sasl_server_mech_data_deinit(struct sasl_server_mech_def_reg *mech_dreg)
+{
+       struct sasl_server_mech_data *mdata = mech_dreg->data;
+
+       if (mdata == NULL)
+               return;
+       mech_dreg->data = NULL;
+
+       if (mdata->def->funcs->data_free == NULL)
+               return;
+       mdata->def->funcs->data_free(mdata);
+}
+
 /*
  * Registry
  */
@@ -168,6 +206,7 @@ sasl_server_mech_register_common(struct sasl_server_instance *sinst,
 
        mech = sasl_server_mech_create(sinst, def);
        mech->reg = mech_reg;
+       mech->data = sasl_server_mech_data_init(sinst->server, mech_dreg);
        mech_reg->mech = mech;
 
        return mech;
@@ -227,6 +266,7 @@ static void sasl_server_mech_reg_free(struct sasl_server_mech_reg *mech_reg)
 
                DLLIST2_REMOVE(&server->mechs_head, &server->mechs_tail,
                               mech_dreg);
+               sasl_server_mech_data_deinit(mech_dreg);
                mech_dreg->def = NULL;
        }
 }
@@ -292,6 +332,11 @@ void sasl_server_instance_mech_registry_free(
        sasl_server_mech_reg_list_free(sinst->mechs_hidden);
 }
 
+void sasl_server_mech_registry_free(struct sasl_server *server)
+{
+       i_assert(server->mechs_head == NULL);
+}
+
 /*
  * Iterator
  */
index 7e65426a0e3fa9162ded5dcb862d954a81030fdc..953ce3c9d90909b60d5315f69637102c7c24c77b 100644 (file)
@@ -80,4 +80,6 @@ struct sasl_server {
 void sasl_server_instance_mech_registry_free(
        struct sasl_server_instance *sinst);
 
+void sasl_server_mech_registry_free(struct sasl_server *server);
+
 #endif
index 2df4340b55dea3cf8e285c273469674e1ef7bed2..5abe4cd9341bb75339d3745fa0261cb06c65d7e8 100644 (file)
@@ -8,6 +8,7 @@
 struct auth_request;
 struct sasl_server_mech_funcs;
 struct sasl_server_mech_def;
+struct sasl_server_mech_data;
 struct sasl_server_mech_request;
 
 typedef void
@@ -22,6 +23,10 @@ struct sasl_server_mech_funcs {
                              const unsigned char *data, size_t data_size);
        void (*auth_free)(struct sasl_server_mech_request *req);
 
+       /* Global data shared between server instances */
+       struct sasl_server_mech_data *(*data_new)(pool_t pool);
+       void (*data_free)(struct sasl_server_mech_data *mdata);
+
        struct sasl_server_mech *(*mech_new)(pool_t pool);
        void (*mech_free)(struct sasl_server_mech *mech);
 };
@@ -50,11 +55,19 @@ struct mechanisms_register {
        buffer_t *handshake_cbind;
 };
 
+struct sasl_server_mech_data {
+       struct sasl_server *server;
+       pool_t pool;
+
+       const struct sasl_server_mech_def *def;
+};
+
 struct sasl_server_mech {
        struct sasl_server_instance *sinst;
        struct sasl_server_mech_reg *reg;
        pool_t pool;
        struct event *event;
+       struct sasl_server_mech_data *data;
 
        const struct sasl_server_mech_def *def;
 };
index f12028703168bd52ab4e3c29168f01d17aa411a4..7b48e0a30d4eee9296ea32d1562fcdf4a3216790 100644 (file)
@@ -109,6 +109,8 @@ void sasl_server_deinit(struct sasl_server **_server)
        i_assert(server->instances == NULL);
        i_assert(server->requests == 0);
 
+       sasl_server_mech_registry_free(server);
+
        event_unref(&server->event);
        pool_unref(&server->pool);
 }