enum sasl_mech_passdb_need
sasl_server_mech_get_passdb_need(const struct sasl_server_mech *mech)
{
- return mech->def->passdb_need;
+ return mech->reg->set.passdb_need;
}
/*
return mech_dreg;
}
+static void
+sasl_server_mech_def_merge_settings(
+ const struct sasl_server_mech_def *def,
+ struct sasl_server_mech_settings *set,
+ const struct sasl_server_mech_settings *new_set)
+{
+ if (new_set == NULL) {
+ if (def->passdb_need > set->passdb_need)
+ set->passdb_need = def->passdb_need;
+ return;
+ }
+ if (new_set->passdb_need > set->passdb_need &&
+ new_set->passdb_need > def->passdb_need)
+ set->passdb_need = new_set->passdb_need;
+ else
+ set->passdb_need = def->passdb_need;
+}
+
static struct sasl_server_mech_def_reg *
sasl_server_mech_register_def(struct sasl_server *server,
- const struct sasl_server_mech_def *def)
+ const struct sasl_server_mech_def *def,
+ const struct sasl_server_mech_settings *set)
{
struct sasl_server_mech_def_reg *mech_dreg;
if (mech_dreg != NULL) {
i_assert(mech_dreg->refcount > 0);
mech_dreg->refcount++;
+
+ sasl_server_mech_def_merge_settings(def, &mech_dreg->set, set);
return mech_dreg;
}
mech_dreg = p_new(server->pool, struct sasl_server_mech_def_reg, 1);
mech_dreg->def = def;
mech_dreg->refcount = 1;
+ sasl_server_mech_def_merge_settings(def, &mech_dreg->set, set);
DLLIST2_APPEND(&server->mechs_head, &server->mechs_tail, mech_dreg);
return mech_dreg;
static struct sasl_server_mech *
sasl_server_mech_register_common(struct sasl_server_instance *sinst,
- const struct sasl_server_mech_def *def)
+ const struct sasl_server_mech_def *def,
+ const struct sasl_server_mech_settings *set)
{
struct sasl_server_mech_def_reg *mech_dreg;
struct sasl_server_mech_reg *mech_reg;
i_assert(sasl_server_mech_reg_find(sinst, def->name) == NULL);
- mech_dreg = sasl_server_mech_register_def(sinst->server, def);
+ mech_dreg = sasl_server_mech_register_def(sinst->server, def, set);
mech_reg = p_new(sinst->pool, struct sasl_server_mech_reg, 1);
mech_reg->def_reg = mech_dreg;
+ sasl_server_mech_def_merge_settings(def, &mech_reg->set, set);
DLLIST_PREPEND_FULL(&mech_dreg->insts, mech_reg, def_prev, def_next);
struct sasl_server_mech *
sasl_server_mech_register(struct sasl_server_instance *sinst,
- const struct sasl_server_mech_def *def)
+ const struct sasl_server_mech_def *def,
+ const struct sasl_server_mech_settings *set)
{
struct sasl_server_mech *mech;
- mech = sasl_server_mech_register_common(sinst, def);
+ mech = sasl_server_mech_register_common(sinst, def, set);
DLLIST2_APPEND(&sinst->mechs_head, &sinst->mechs_tail, mech->reg);
return mech;
struct sasl_server_mech *
sasl_server_mech_register_hidden(struct sasl_server_instance *sinst,
- const struct sasl_server_mech_def *def)
+ const struct sasl_server_mech_def *def,
+ const struct sasl_server_mech_settings *set)
{
struct sasl_server_mech *mech;
- mech = sasl_server_mech_register_common(sinst, def);
+ mech = sasl_server_mech_register_common(sinst, def, set);
DLLIST_PREPEND(&sinst->mechs_hidden, mech->reg);
return mech;
struct sasl_server_mech_iter_prv *iterp =
container_of(iter, struct sasl_server_mech_iter_prv, iter);
const struct sasl_server_mech_def *def;
+ const struct sasl_server_mech_settings *set;
if (!iterp->instance) {
if (iterp->def_reg == NULL) {
return FALSE;
}
def = iterp->def_reg->def;
+ set = &iterp->def_reg->set;
iterp->def_reg = iterp->def_reg->next;
} else {
if (iterp->reg == NULL) {
return FALSE;
}
def = iterp->reg->mech->def;
+ set = &iterp->reg->set;
iterp->reg = iterp->reg->next;
}
iterp->iter.name = def->name;
iterp->iter.flags = def->flags;
- iterp->iter.passdb_need = def->passdb_need;
+ iterp->iter.passdb_need = set->passdb_need;
return TRUE;
}
const struct sasl_server_mech_funcs *funcs;
};
+struct sasl_server_mech_settings {
+ enum sasl_mech_passdb_need passdb_need;
+};
+
struct sasl_server_mech_data {
struct sasl_server *server;
pool_t pool;
struct sasl_server_mech * ATTR_NOWARN_UNUSED_RESULT
sasl_server_mech_register(struct sasl_server_instance *sinst,
- const struct sasl_server_mech_def *def);
+ const struct sasl_server_mech_def *def,
+ const struct sasl_server_mech_settings *set);
struct sasl_server_mech * ATTR_NOWARN_UNUSED_RESULT
sasl_server_mech_register_hidden(struct sasl_server_instance *sinst,
- const struct sasl_server_mech_def *def);
+ const struct sasl_server_mech_def *def,
+ const struct sasl_server_mech_settings *set);
void sasl_server_mech_unregister(struct sasl_server_instance *sinst,
const struct sasl_server_mech_def *def);