request->skip_password_check = TRUE;
request->passdb_password = NULL;
- if (!request->passdb->pass) {
+ if (!request->passdb->set->pass) {
/* skip the passdb lookup, we're authenticated now. */
return TRUE;
}
strlen(request->passdb_password));
}
- if (request->passdb->deny && *result != PASSDB_RESULT_USER_UNKNOWN) {
+ if (request->passdb->set->deny &&
+ *result != PASSDB_RESULT_USER_UNKNOWN) {
/* deny passdb. we can get through this step only if the
lookup returned that user doesn't exist in it. internal
errors are fatal here. */
if (!auth_request_master_lookup_finish(request))
return FALSE;
} else {
- if (request->passdb->pass) {
+ if (request->passdb->set->pass) {
/* this wasn't the final passdb lookup,
continue to next passdb */
request->passdb = request->passdb->next;
return 1;
}
- if (request->passdb->deny) {
+ if (request->passdb->set->deny) {
/* this is a deny database, we don't care about the password */
return 0;
}
}
if (auth_request->userdb_lookup) {
tab[9].value = auth_request->userdb == NULL ? "" :
- dec2str(auth_request->userdb->num);
+ dec2str(auth_request->userdb->userdb->id);
} else {
tab[9].value = auth_request->passdb == NULL ? "" :
- dec2str(auth_request->passdb->id);
+ dec2str(auth_request->passdb->passdb->id);
}
tab[10].value = auth_request->mech_name == NULL ? "" :
auth_request->mech_name;
SETTING_DEFINE_LIST_END
};
+static const struct auth_passdb_settings auth_passdb_settings = {
+ .driver = "",
+ .args = "",
+ .deny = FALSE,
+ .pass = FALSE,
+ .master = FALSE
+};
+
const struct setting_parser_info auth_passdb_setting_parser_info = {
.defines = auth_passdb_setting_defines,
+ .defaults = &auth_passdb_settings,
.type_offset = (size_t)-1,
.struct_size = sizeof(struct auth_passdb_settings),
SETTING_DEFINE_LIST_END
};
+static const struct auth_userdb_settings auth_userdb_settings = {
+ .driver = "",
+ .args = ""
+};
+
const struct setting_parser_info auth_userdb_setting_parser_info = {
.defines = auth_userdb_setting_defines,
+ .defaults = &auth_userdb_settings,
.type_offset = (size_t)-1,
.struct_size = sizeof(struct auth_userdb_settings),
}
passdb = auth_request->passdb;
- while (passdb != NULL && passdb->id != passdb_id)
+ while (passdb != NULL && passdb->passdb->id != passdb_id)
passdb = passdb->next;
if (passdb == NULL) {
/* could be a masterdb */
passdb = auth_request->auth->masterdbs;
- while (passdb != NULL && passdb->id != passdb_id)
+ while (passdb != NULL && passdb->passdb->id != passdb_id)
passdb = passdb->next;
if (passdb == NULL) {
return;
}
- while (auth_request->passdb->id != passdb_id) {
+ while (auth_request->passdb->passdb->id != passdb_id) {
auth_request->passdb = auth_request->passdb->next;
if (auth_request->passdb == NULL) {
i_error("BUG: PASSL had invalid passdb ID");
return;
}
- while (auth_request->passdb->id != passdb_id) {
+ while (auth_request->passdb->passdb->id != passdb_id) {
auth_request->passdb = auth_request->passdb->next;
if (auth_request->passdb == NULL) {
i_error("BUG: SETCRED had invalid passdb ID");
pool_t pool;
struct auth_passdb *next;
- /* id is used by blocking passdb to identify the passdb */
- unsigned int id;
- const char *args;
+ const struct auth_passdb_settings *set;
struct passdb_module *passdb;
-
- /* if user is found from this passdb, deny authentication immediately */
- unsigned int deny:1;
- /* after a successful lookup, continue to next passdb */
- unsigned int pass:1;
};
struct auth_userdb {
pool_t pool;
struct auth_userdb *next;
- unsigned int num;
- const char *args;
+ const struct auth_userdb_settings *set;
struct userdb_module *userdb;
};
reply = auth_stream_reply_init(pool_datastack_create());
auth_stream_reply_add(reply, "PASSV", NULL);
- auth_stream_reply_add(reply, NULL, dec2str(request->passdb->id));
+ auth_stream_reply_add(reply, NULL, dec2str(request->passdb->passdb->id));
auth_stream_reply_add(reply, NULL, request->mech_password);
auth_request_export(request, reply);
reply = auth_stream_reply_init(pool_datastack_create());
auth_stream_reply_add(reply, "PASSL", NULL);
- auth_stream_reply_add(reply, NULL, dec2str(request->passdb->id));
+ auth_stream_reply_add(reply, NULL, dec2str(request->passdb->passdb->id));
auth_stream_reply_add(reply, NULL, request->credentials_scheme);
auth_request_export(request, reply);
reply = auth_stream_reply_init(pool_datastack_create());
auth_stream_reply_add(reply, "SETCRED", NULL);
- auth_stream_reply_add(reply, NULL, dec2str(request->passdb->id));
+ auth_stream_reply_add(reply, NULL, dec2str(request->passdb->passdb->id));
auth_stream_reply_add(reply, NULL, new_credentials);
auth_request_export(request, reply);
struct auth_passdb *
passdb_preinit(struct auth *auth, struct auth_passdb_settings *set)
{
+ static unsigned int auth_passdb_id = 0;
struct passdb_module_interface *iface;
- struct auth_passdb *auth_passdb, **dest;
+ struct auth_passdb *auth_passdb, **dest;
auth_passdb = p_new(auth->pool, struct auth_passdb, 1);
auth_passdb->pool = auth->pool;
- auth_passdb->args = set->args == NULL ? "" :
- p_strdup(auth->pool, set->args);
- auth_passdb->deny = set->deny;
+ auth_passdb->set = set;
- for (dest = &auth->passdbs; *dest != NULL; dest = &(*dest)->next)
- auth_passdb->id++;
+ for (dest = &auth->passdbs; *dest != NULL; dest = &(*dest)->next) ;
*dest = auth_passdb;
iface = passdb_interface_find(set->driver);
}
if (iface->preinit == NULL && iface->init == NULL &&
- *auth_passdb->args != '\0') {
+ *set->args != '\0') {
i_fatal("passdb %s: No args are supported: %s",
- set->driver, auth_passdb->args);
+ set->driver, set->args);
}
if (iface->preinit == NULL) {
p_new(auth->pool, struct passdb_module, 1);
} else {
auth_passdb->passdb =
- iface->preinit(auth_passdb, auth_passdb->args);
+ iface->preinit(auth_passdb, set->args);
}
+ auth_passdb->passdb->id = ++auth_passdb_id;
auth_passdb->passdb->iface = *iface;
return auth_passdb;
}
void passdb_init(struct auth_passdb *passdb)
{
if (passdb->passdb->iface.init != NULL)
- passdb->passdb->iface.init(passdb->passdb, passdb->args);
+ passdb->passdb->iface.init(passdb->passdb, passdb->set->args);
i_assert(passdb->passdb->default_pass_scheme != NULL ||
passdb->passdb->cache_key == NULL);
/* If blocking is set to TRUE, use child processes to access
this passdb. */
bool blocking;
+ /* id is used by blocking passdb to identify the passdb */
+ unsigned int id;
struct passdb_module_interface iface;
};
reply = auth_stream_reply_init(pool_datastack_create());
auth_stream_reply_add(reply, "USER", NULL);
- auth_stream_reply_add(reply, NULL, dec2str(request->userdb->num));
+ auth_stream_reply_add(reply, NULL, dec2str(request->userdb->userdb->id));
auth_request_export(request, reply);
auth_request_ref(request);
reply = auth_stream_reply_init(pool_datastack_create());
auth_stream_reply_add(reply, "LIST", NULL);
- auth_stream_reply_add(reply, NULL, dec2str(userdb->num));
+ auth_stream_reply_add(reply, NULL, dec2str(userdb->userdb->id));
pool = pool_alloconly_create("userdb iter", 512);
ctx = p_new(pool, struct blocking_userdb_iterate_context, 1);
void userdb_preinit(struct auth *auth, struct auth_userdb_settings *set)
{
+ static unsigned int auth_userdb_id = 0;
struct userdb_module_interface *iface;
struct auth_userdb *auth_userdb, **dest;
auth_userdb = p_new(auth->pool, struct auth_userdb, 1);
auth_userdb->pool = auth->pool;
- auth_userdb->args = set->args == NULL ? "" :
- p_strdup(auth->pool, set->args);
+ auth_userdb->set = set;
- for (dest = &auth->userdbs; *dest != NULL; dest = &(*dest)->next)
- auth_userdb->num++;
+ for (dest = &auth->userdbs; *dest != NULL; dest = &(*dest)->next) ;
*dest = auth_userdb;
iface = userdb_interface_find(set->driver);
}
if (iface->preinit == NULL && iface->init == NULL &&
- *auth_userdb->args != '\0') {
+ *auth_userdb->set->args != '\0') {
i_fatal("userdb %s: No args are supported: %s",
- set->driver, auth_userdb->args);
+ set->driver, auth_userdb->set->args);
}
if (iface->preinit == NULL) {
p_new(auth->pool, struct userdb_module, 1);
} else {
auth_userdb->userdb =
- iface->preinit(auth_userdb, auth_userdb->args);
+ iface->preinit(auth_userdb, auth_userdb->set->args);
}
+ auth_userdb->userdb->id = ++auth_userdb_id;
auth_userdb->userdb->iface = iface;
}
void userdb_init(struct auth_userdb *userdb)
{
if (userdb->userdb->iface->init != NULL)
- userdb->userdb->iface->init(userdb->userdb, userdb->args);
+ userdb->userdb->iface->init(userdb->userdb, userdb->set->args);
}
void userdb_deinit(struct auth_userdb *userdb)
/* If blocking is set to TRUE, use child processes to access
this userdb. */
bool blocking;
+ /* id is used by blocking userdb to identify the userdb */
+ unsigned int id;
const struct userdb_module_interface *iface;
};