]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: sasl-server - Add iterator for the mechanism registry
authorStephan Bosch <stephan.bosch@open-xchange.com>
Sun, 26 Mar 2023 17:13:23 +0000 (19:13 +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.h

index df1049840cacd774ae0c8ea0db5399d6f413e840..b7c38a2883e78f4d1f185a5cf5e2be6b62c284e9 100644 (file)
@@ -262,3 +262,93 @@ void sasl_server_mech_unregister(struct sasl_server_instance *sinst,
 
        sasl_server_mech_reg_free(mech_reg);
 }
+
+/*
+ * Iterator
+ */
+
+struct sasl_server_mech_iter_prv {
+       struct sasl_server_mech_iter iter;
+
+       union {
+               struct sasl_server_mech_reg *reg;
+               struct sasl_server_mech_def_reg *def_reg;
+       };
+
+       bool instance:1;
+       bool ended:1;
+};
+
+struct sasl_server_mech_iter *
+sasl_server_mech_iter_new(struct sasl_server *server)
+{
+       struct sasl_server_mech_iter_prv *iterp;
+
+       iterp = i_new(struct sasl_server_mech_iter_prv, 1);
+       iterp->def_reg = server->mechs_head;
+
+       return &iterp->iter;
+}
+
+struct sasl_server_mech_iter *
+sasl_server_instance_mech_iter_new(struct sasl_server_instance *sinst)
+{
+       struct sasl_server_mech_iter_prv *iterp;
+
+       iterp = i_new(struct sasl_server_mech_iter_prv, 1);
+       iterp->reg = sinst->mechs_head;
+       iterp->instance = TRUE;
+
+       return &iterp->iter;
+}
+
+bool sasl_server_mech_iter_next(struct sasl_server_mech_iter *iter)
+{
+       struct sasl_server_mech_iter_prv *iterp =
+               container_of(iter, struct sasl_server_mech_iter_prv, iter);
+       const struct sasl_server_mech_def *def;
+
+       if (!iterp->instance) {
+               if (iterp->def_reg == NULL) {
+                       iterp->ended = TRUE;
+                       return FALSE;
+               }
+               def = iterp->def_reg->def;
+               iterp->def_reg = iterp->def_reg->next;
+       } else {
+               if (iterp->reg == NULL) {
+                       iterp->ended = TRUE;
+                       return FALSE;
+               }
+               def = iterp->reg->mech->def;
+               iterp->reg = iterp->reg->next;
+       }
+
+       iterp->iter.name = def->name;
+       iterp->iter.flags = def->flags;
+       iterp->iter.passdb_need = def->passdb_need;
+
+       return TRUE;
+}
+
+bool sasl_server_mech_iter_ended(struct sasl_server_mech_iter *iter)
+{
+       struct sasl_server_mech_iter_prv *iterp =
+               container_of(iter, struct sasl_server_mech_iter_prv, iter);
+
+       return iterp->ended;
+}
+
+void sasl_server_mech_iter_free(struct sasl_server_mech_iter **_iter)
+{
+       struct sasl_server_mech_iter *iter = *_iter;
+
+       if (iter == NULL)
+               return;
+       *_iter = NULL;
+
+       struct sasl_server_mech_iter_prv *iterp =
+               container_of(iter, struct sasl_server_mech_iter_prv, iter);
+
+       i_free(iterp);
+}
index 5f4a22ec8eda644097c9cc6f5b4b36514a63a11a..ab2a5c9609e8effee36a529bb5d8b6c7b4650ace 100644 (file)
@@ -153,6 +153,13 @@ void sasl_server_request_test_set_authid(struct sasl_server_req_ctx *rctx,
  * Mechanism
  */
 
+struct sasl_server_mech_iter {
+       const char *name;
+
+       enum sasl_mech_security_flags flags;
+       enum sasl_mech_passdb_need passdb_need;
+};
+
 const char * ATTR_PURE
 sasl_server_mech_get_name(const struct sasl_server_mech *mech);
 enum sasl_mech_security_flags ATTR_PURE
@@ -163,6 +170,14 @@ sasl_server_mech_get_passdb_need(const struct sasl_server_mech *mech);
 const struct sasl_server_mech *
 sasl_server_mech_find(struct sasl_server_instance *sinst, const char *name);
 
+struct sasl_server_mech_iter *
+sasl_server_mech_iter_new(struct sasl_server *server);
+struct sasl_server_mech_iter *
+sasl_server_instance_mech_iter_new(struct sasl_server_instance *sinst);
+bool sasl_server_mech_iter_next(struct sasl_server_mech_iter *iter);
+bool sasl_server_mech_iter_ended(struct sasl_server_mech_iter *iter);
+void sasl_server_mech_iter_free(struct sasl_server_mech_iter **_iter);
+
 /*
  * Instance
  */