for (dest = passdbs; *dest != NULL; dest = &(*dest)->next) ;
*dest = auth_passdb;
- auth_passdb->passdb = passdb_preinit(auth->pool, set);
+ auth_passdb->passdb = passdb_preinit(auth->pool, event, set);
/* make sure any %variables in default_fields exist in cache_key */
if (auth_passdb->passdb->default_cache_key != NULL) {
struct auth_passdb_pre_settings *passdb_pre_set;
}
struct passdb_module *
-passdb_preinit(pool_t pool, const struct auth_passdb_settings *set)
+passdb_preinit(pool_t pool, struct event *event,
+ const struct auth_passdb_settings *set)
{
static unsigned int auth_passdb_id = 0;
struct passdb_module_interface *iface;
struct passdb_module *passdb;
+ const char *error;
iface = passdb_interface_find(set->driver);
if (iface == NULL || iface->verify_plain == NULL) {
set->driver, set->args);
}
- if (iface->preinit_legacy == NULL)
- passdb = p_new(pool, struct passdb_module, 1);
- else
- passdb = iface->preinit_legacy(pool, set->args);
+ if (iface->preinit != NULL) {
+ if (set->args[0] != '\0')
+ i_fatal("passdb %s: passdb_args must be empty", set->name);
+ if (iface->preinit(pool, event, &passdb, &error) < 0)
+ i_fatal("passdb %s: %s", set->name, error);
+ passdb->default_pass_scheme =
+ set->default_password_scheme;
+ passdb->blocking = set->use_worker;
+ } else {
+ if (iface->preinit_legacy == NULL)
+ passdb = p_new(pool, struct passdb_module, 1);
+ else
+ passdb = iface->preinit_legacy(pool, set->args);
+ }
passdb->id = ++auth_passdb_id;
passdb->iface = *iface;
passdb->args = p_strdup(pool, set->args);
struct auth_request;
struct auth_passdb_settings;
+struct passdb_module;
enum passdb_result {
PASSDB_RESULT_INTERNAL_FAILURE = -1,
struct passdb_module_interface {
const char *name;
+ /* Create a new passdb_module based on the settings looked up via the
+ given event. */
+ int (*preinit)(pool_t pool, struct event *event,
+ struct passdb_module **module_r, const char **error_r);
struct passdb_module *(*preinit_legacy)(pool_t pool, const char *args);
void (*init)(struct passdb_module *module);
void (*deinit)(struct passdb_module *module);
struct auth_request *auth_request);
struct passdb_module *
-passdb_preinit(pool_t pool, const struct auth_passdb_settings *set);
+passdb_preinit(pool_t pool, struct event *event,
+ const struct auth_passdb_settings *set);
void passdb_init(struct passdb_module *passdb);
void passdb_deinit(struct passdb_module *passdb);
.deny = FALSE,
.master = FALSE,
};
- mock_passdb_mod = passdb_preinit(mock_pool, &set);
+ struct event *event = event_create(NULL);
+ mock_passdb_mod = passdb_preinit(mock_pool, event, &set);
+ event_unref(&event);
passdb_init(mock_passdb_mod);
}