request->last_access = ioloop_time;
request->session_pid = (pid_t)-1;
request->set = global_auth_settings;
+ request->protocol_set = global_auth_settings;
request->event = event_create(parent_event);
auth_request_fields_init(request);
auth = auth_request_get_auth(request);
request->set = auth->protocol_set;
+ request->protocol_set = auth->protocol_set;
request->passdb = auth->passdbs;
request->userdb = auth->userdbs;
}
request->passdb_cache_result = AUTH_REQUEST_CACHE_NONE;
+ /* use passdb-specific settings during the passdb lookup */
+ request->set = request->passdb->auth_set;
+
event = event_create(request->event);
event_add_str(event, "passdb", request->passdb->set->name);
event_add_str(event, "passdb_id", dec2str(request->passdb->passdb->id));
e_debug(e->event(), "Finished passdb lookup");
event_unref(&event);
array_pop_back(&request->authdb_event);
+
+ /* restore protocol-specific settings */
+ request->set = request->protocol_set;
}
void auth_request_userdb_lookup_begin(struct auth_request *request)
enum passdb_result passdb_result;
const struct mech_module *mech;
+ /* Protocol-specific settings */
+ const struct auth_settings *protocol_set;
+ /* Currently active settings. May be the same as protocol_set, but
+ changes to passdb and userdb specific settings. */
const struct auth_settings *set;
struct auth_passdb *passdb;
struct auth_userdb *userdb;
{
struct auth_passdb *auth_passdb, **dest;
+ /* Lookup passdb-specific auth_settings */
+ struct event *event = event_create(auth_event);
+ event_add_str(event, "protocol", auth->protocol);
+ event_add_str(event, "passdb", set->name);
+ event_set_ptr(event, SETTINGS_EVENT_FILTER_NAME,
+ p_strconcat(event_get_pool(event), "passdb_",
+ set->driver, NULL));
+
auth_passdb = p_new(auth->pool, struct auth_passdb, 1);
+ auth_passdb->auth_set =
+ settings_get_or_fatal(event, &auth_setting_parser_info);
+ event_unref(&event);
+
auth_passdb->set = set;
auth_passdb->skip = auth_passdb_skip_parse(set->skip);
auth_passdb->result_success =
}
}
+static void auth_passdb_deinit(struct auth_passdb *passdb)
+{
+ settings_free(passdb->auth_set);
+ passdb_deinit(passdb->passdb);
+}
+
static void
auth_userdb_preinit(struct auth *auth, const struct auth_userdb_settings *set)
{
struct auth_userdb *userdb;
for (passdb = auth->masterdbs; passdb != NULL; passdb = passdb->next)
- passdb_deinit(passdb->passdb);
+ auth_passdb_deinit(passdb);
for (passdb = auth->passdbs; passdb != NULL; passdb = passdb->next)
- passdb_deinit(passdb->passdb);
+ auth_passdb_deinit(passdb);
for (userdb = auth->userdbs; userdb != NULL; userdb = userdb->next)
userdb_deinit(userdb->userdb);
struct auth_passdb {
struct auth_passdb *next;
+ const struct auth_settings *auth_set;
const struct auth_passdb_settings *set;
struct passdb_module *passdb;
request->mech_password = NULL;
request->state = AUTH_REQUEST_STATE_NEW;
request->set = global_auth_settings;
+ request->protocol_set = global_auth_settings;
request->connect_uid = running_test;
request->passdb = auth->passdbs;
request->userdb = auth->userdbs;