From: Stephan Bosch Date: Sun, 26 Mar 2023 17:13:23 +0000 (+0200) Subject: auth: sasl-server - Add iterator for the mechanism registry X-Git-Tag: 2.4.2~220 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6eb097da47387a6ff4cf8e52cd08afd05b90b7f7;p=thirdparty%2Fdovecot%2Fcore.git auth: sasl-server - Add iterator for the mechanism registry --- diff --git a/src/auth/sasl-server-mech.c b/src/auth/sasl-server-mech.c index df1049840c..b7c38a2883 100644 --- a/src/auth/sasl-server-mech.c +++ b/src/auth/sasl-server-mech.c @@ -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); +} diff --git a/src/auth/sasl-server.h b/src/auth/sasl-server.h index 5f4a22ec8e..ab2a5c9609 100644 --- a/src/auth/sasl-server.h +++ b/src/auth/sasl-server.h @@ -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 */