auth_request->refcount = 1;
auth_request->last_access = ioloop_time;
+ if (auth == NULL) {
+ auth = p_new(pool, struct auth, 1);
+ auth->set = global_auth_settings;
+ }
auth_request->auth = auth;
auth_request->passdb = auth->passdbs;
auth_request->userdb = auth->userdbs;
}
/* </settings checks> */
+struct auth_settings *global_auth_settings;
+
struct auth_settings *
auth_settings_read(struct master_service *service)
{
const char *const *realms_arr;
};
+extern struct auth_settings *global_auth_settings;
+
struct auth_settings *auth_settings_read(struct master_service *service);
#endif
};
struct auth_worker_connection {
- struct auth *auth;
int fd;
struct io *io;
auth_worker_request_send(conn, request);
}
-static struct auth_worker_connection *auth_worker_create(struct auth *auth)
+static struct auth_worker_connection *auth_worker_create(void)
{
struct auth_worker_connection *conn;
int fd;
- if (array_count(&connections) >= auth->set->worker_max_count)
+ if (array_count(&connections) >= global_auth_settings->worker_max_count)
return NULL;
fd = net_connect_unix_with_retries(worker_socket_path, 5000);
}
conn = i_new(struct auth_worker_connection, 1);
- conn->auth = auth;
conn->fd = fd;
conn->input = i_stream_create_fd(fd, AUTH_WORKER_MAX_LINE_LENGTH,
FALSE);
const char *reason, bool restart)
{
struct auth_worker_connection *conn = *_conn;
- struct auth *auth = conn->auth;
struct auth_worker_connection *const *conns;
unsigned int idx;
i_free(conn);
if (idle_count == 0 && restart) {
- conn = auth_worker_create(auth);
+ conn = auth_worker_create();
auth_worker_request_send_next(conn);
}
}
}
struct auth_worker_connection *
-auth_worker_call(struct auth *auth, pool_t pool,
- struct auth_stream_reply *data,
+auth_worker_call(pool_t pool, struct auth_stream_reply *data,
auth_worker_callback_t *callback, void *context)
{
struct auth_worker_connection *conn;
conn = auth_worker_find_free();
if (conn == NULL) {
/* no free connections, create a new one */
- conn = auth_worker_create(auth);
+ conn = auth_worker_create();
}
}
if (conn != NULL)
typedef bool auth_worker_callback_t(const char *reply, void *context);
struct auth_worker_connection *
-auth_worker_call(struct auth *auth, pool_t pool,
- struct auth_stream_reply *data,
+auth_worker_call(pool_t pool, struct auth_stream_reply *data,
auth_worker_callback_t *callback, void *context);
void auth_worker_server_resume_input(struct auth_worker_connection *conn);
#define PASSWORD_HIDDEN_STR "<hidden>"
struct auth_passdb {
- struct auth *auth;
+ pool_t pool;
struct auth_passdb *next;
/* id is used by blocking passdb to identify the passdb */
};
struct auth_userdb {
- struct auth *auth;
+ pool_t pool;
struct auth_userdb *next;
unsigned int num;
static struct auth *auth;
static ARRAY_DEFINE(listen_fd_types, enum auth_socket_type);
-static void main_preinit(struct auth_settings *set)
+static void main_preinit(void)
{
struct module_dir_load_settings mod_set;
memset(&mod_set, 0, sizeof(mod_set));
mod_set.version = master_service_get_version_string(master_service);
mod_set.require_init_funcs = TRUE;
- mod_set.debug = set->debug;
+ mod_set.debug = global_auth_settings->debug;
modules = module_dir_load(AUTH_MODULE_DIR, NULL, &mod_set);
module_dir_init(modules);
- auth = auth_preinit(set);
+ auth = auth_preinit(global_auth_settings);
/* Password lookups etc. may require roots, allow it. */
restrict_access_by_env(NULL, FALSE);
}
}
- main_preinit(auth_settings_read(master_service));
+ global_auth_settings = auth_settings_read(master_service);
+ main_preinit();
master_service_init_finish(master_service);
main_init();
auth_request_export(request, reply);
auth_request_ref(request);
- auth_worker_call(request->auth, request->pool, reply,
- verify_plain_callback, request);
+ auth_worker_call(request->pool, reply, verify_plain_callback, request);
}
static bool lookup_credentials_callback(const char *reply, void *context)
auth_request_export(request, reply);
auth_request_ref(request);
- auth_worker_call(request->auth, request->pool, reply,
+ auth_worker_call(request->pool, reply,
lookup_credentials_callback, request);
}
auth_request_export(request, reply);
auth_request_ref(request);
- auth_worker_call(request->auth, request->pool, reply,
+ auth_worker_call(request->pool, reply,
set_credentials_callback, request);
}
{
struct passdb_module *module;
- module = p_new(auth_passdb->auth->pool, struct passdb_module, 1);
+ module = p_new(auth_passdb->pool, struct passdb_module, 1);
module->default_pass_scheme = "PLAIN"; /* same reason as PAM */
if (strncmp(args, "cache_key=", 10) == 0) {
module->cache_key =
- auth_cache_parse_key(auth_passdb->auth->pool,
- args + 10);
+ auth_cache_parse_key(auth_passdb->pool, args + 10);
} else if (*args != '\0')
i_fatal("passdb bsdauth: Unknown setting: %s", args);
return module;
{
struct checkpassword_passdb_module *module;
- module = p_new(auth_passdb->auth->pool,
+ module = p_new(auth_passdb->pool,
struct checkpassword_passdb_module, 1);
- module->checkpassword_path = p_strdup(auth_passdb->auth->pool, args);
+ module->checkpassword_path = p_strdup(auth_passdb->pool, args);
module->checkpassword_reply_path =
PKG_LIBEXECDIR"/checkpassword-reply";
struct ldap_passdb_module *module;
struct ldap_connection *conn;
- module = p_new(auth_passdb->auth->pool, struct ldap_passdb_module, 1);
+ module = p_new(auth_passdb->pool, struct ldap_passdb_module, 1);
module->conn = conn = db_ldap_init(args);
conn->pass_attr_map =
hash_table_create(default_pool, conn->pool, 0, str_hash,
conn->pass_attr_map,
conn->set.auth_bind ? "password" : NULL);
module->module.cache_key =
- auth_cache_parse_key(auth_passdb->auth->pool,
+ auth_cache_parse_key(auth_passdb->pool,
t_strconcat(conn->set.base,
conn->set.pass_filter, NULL));
module->module.default_pass_scheme = conn->set.default_pass_scheme;
const char *const *t_args;
int i;
- module = p_new(auth_passdb->auth->pool, struct pam_passdb_module, 1);
+ module = p_new(auth_passdb->pool, struct pam_passdb_module, 1);
module->service_name = "dovecot";
/* we're caching the password by using directly the plaintext password
given by the auth mechanism */
module->pam_setcred = TRUE;
else if (strncmp(t_args[i], "cache_key=", 10) == 0) {
module->module.cache_key =
- auth_cache_parse_key(auth_passdb->auth->pool,
+ auth_cache_parse_key(auth_passdb->pool,
t_args[i] + 10);
} else if (strcmp(t_args[i], "blocking=yes") == 0) {
/* ignore, for backwards compatibility */
module->requests_left = atoi(t_args[i] + 13);
} else if (t_args[i+1] == NULL) {
module->service_name =
- p_strdup(auth_passdb->auth->pool, t_args[i]);
+ p_strdup(auth_passdb->pool, t_args[i]);
} else {
i_fatal("passdb pam: Unknown setting: %s", t_args[i]);
}
struct passwd_file_passdb_module {
struct passdb_module module;
- struct auth *auth;
struct db_passwd_file *pwf;
};
args++;
if (strcmp(key, "scheme") == 0)
- scheme = p_strdup(auth_passdb->auth->pool, value);
+ scheme = p_strdup(auth_passdb->pool, value);
else if (strcmp(key, "username_format") == 0)
- format = p_strdup(auth_passdb->auth->pool, value);
+ format = p_strdup(auth_passdb->pool, value);
else
i_fatal("passdb passwd-file: Unknown setting: %s", key);
}
if (*args == '\0')
i_fatal("passdb passwd-file: Missing args");
- module = p_new(auth_passdb->auth->pool,
- struct passwd_file_passdb_module, 1);
- module->auth = auth_passdb->auth;
+ module = p_new(auth_passdb->pool, struct passwd_file_passdb_module, 1);
module->pwf = db_passwd_file_init(args, format, FALSE,
- module->auth->set->debug);
+ global_auth_settings->debug);
if (!module->pwf->vars)
module->module.cache_key = format;
else {
module->module.cache_key =
- auth_cache_parse_key(auth_passdb->auth->pool,
+ auth_cache_parse_key(auth_passdb->pool,
t_strconcat(format, module->pwf->path, NULL));
}
struct sql_passdb_module *module;
struct sql_connection *conn;
- module = p_new(auth_passdb->auth->pool, struct sql_passdb_module, 1);
+ module = p_new(auth_passdb->pool, struct sql_passdb_module, 1);
module->conn = conn = db_sql_init(args);
module->module.cache_key =
- auth_cache_parse_key(auth_passdb->auth->pool,
+ auth_cache_parse_key(auth_passdb->pool,
conn->set.password_query);
module->module.default_pass_scheme = conn->set.default_pass_scheme;
return &module->module;
struct vpopmail_passdb_module *module;
const char *const *tmp;
- module = p_new(auth_passdb->auth->pool,
- struct vpopmail_passdb_module, 1);
+ module = p_new(auth_passdb->pool, struct vpopmail_passdb_module, 1);
module->module.default_pass_scheme = VPOPMAIL_DEFAULT_PASS_SCHEME;
tmp = t_strsplit_spaces(args, " ");
for (; *tmp != NULL; tmp++) {
if (strncmp(*tmp, "cache_key=", 10) == 0) {
module->module.cache_key =
- auth_cache_parse_key(auth_passdb->auth->pool,
+ auth_cache_parse_key(auth_passdb->pool,
*tmp + 10);
} else if (strncmp(*tmp, "webmail=", 8) == 0) {
if (net_addr2ip(*tmp + 8, &module->webmail_ip) < 0)
struct auth_passdb *auth_passdb, **dest;
auth_passdb = p_new(auth->pool, struct auth_passdb, 1);
- auth_passdb->auth = auth;
+ auth_passdb->pool = auth->pool;
auth_passdb->args = set->args == NULL ? "" :
p_strdup(auth->pool, set->args);
auth_passdb->deny = set->deny;
auth_request_export(request, reply);
auth_request_ref(request);
- auth_worker_call(request->auth, request->pool, reply,
- user_callback, request);
+ auth_worker_call(request->pool, reply, user_callback, request);
}
static bool iter_callback(const char *reply, void *context)
ctx->ctx.context = context;
ctx->pool = pool;
- ctx->conn = auth_worker_call(userdb->auth, pool, reply,
- iter_callback, ctx);
+ ctx->conn = auth_worker_call(pool, reply, iter_callback, ctx);
return &ctx->ctx;
}
{
struct checkpassword_userdb_module *module;
- module = p_new(auth_userdb->auth->pool,
+ module = p_new(auth_userdb->pool,
struct checkpassword_userdb_module, 1);
- module->checkpassword_path = p_strdup(auth_userdb->auth->pool, args);
+ module->checkpassword_path = p_strdup(auth_userdb->pool, args);
module->checkpassword_reply_path =
PKG_LIBEXECDIR"/checkpassword-reply";
struct ldap_userdb_iterate_context {
struct userdb_iterate_context ctx;
struct userdb_iter_ldap_request request;
- struct auth *auth;
+ pool_t pool;
struct ldap_connection *conn;
bool continued, in_callback;
};
ctx->ctx.userdb = userdb->userdb;
ctx->ctx.callback = callback;
ctx->ctx.context = context;
- ctx->auth = userdb->auth;
ctx->conn = conn;
request = &ctx->request;
request->ctx = ctx;
- request->request.request.auth_request =
- auth_request_new_dummy(userdb->auth);
+ request->request.request.auth_request = auth_request_new_dummy(NULL);
request->request.base = conn->set.base;
request->request.filter = conn->set.iterate_filter;
request->request.attributes = conn->iterate_attr_names;
- if (userdb->auth->set->debug) {
+ if (global_auth_settings->debug) {
i_debug("ldap: iterate: base=%s scope=%s filter=%s fields=%s",
conn->set.base, conn->set.scope,
request->request.filter, attr_names == NULL ? "(all)" :
struct ldap_userdb_module *module;
struct ldap_connection *conn;
- module = p_new(auth_userdb->auth->pool, struct ldap_userdb_module, 1);
+ module = p_new(auth_userdb->pool, struct ldap_userdb_module, 1);
module->conn = conn = db_ldap_init(args);
conn->user_attr_map =
hash_table_create(default_pool, conn->pool, 0, str_hash,
&conn->iterate_attr_names,
conn->iterate_attr_map, NULL);
module->module.cache_key =
- auth_cache_parse_key(auth_userdb->auth->pool,
+ auth_cache_parse_key(auth_userdb->pool,
t_strconcat(conn->set.base,
conn->set.user_filter, NULL));
return &module->module;
{
struct nss_userdb_module *module;
const char *const *tmp;
- pool_t pool = auth_userdb->auth->pool;
+ pool_t pool = auth_userdb->pool;
module = p_new(pool, struct nss_userdb_module, 1);
module->bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
struct passwd_file_userdb_module {
struct userdb_module module;
- struct auth *auth;
struct db_passwd_file *pwf;
};
format = args;
args = "";
} else {
- format = p_strdup_until(auth_userdb->auth->pool,
- args, p);
+ format = p_strdup_until(auth_userdb->pool, args, p);
args = p + 1;
}
}
if (*args == '\0')
i_fatal("userdb passwd-file: Missing args");
- module = p_new(auth_userdb->auth->pool,
- struct passwd_file_userdb_module, 1);
- module->auth = auth_userdb->auth;
+ module = p_new(auth_userdb->pool, struct passwd_file_userdb_module, 1);
module->pwf = db_passwd_file_init(args, format, TRUE,
- module->auth->set->debug);
+ global_auth_settings->debug);
if (!module->pwf->vars)
module->module.cache_key = PASSWD_FILE_CACHE_KEY;
else {
module->module.cache_key =
- auth_cache_parse_key(auth_userdb->auth->pool,
+ auth_cache_parse_key(auth_userdb->pool,
t_strconcat(PASSWD_FILE_CACHE_KEY,
module->pwf->path,
NULL));
struct passwd_userdb_module *module;
const char *value;
- module = p_new(auth_userdb->auth->pool, struct passwd_userdb_module, 1);
+ module = p_new(auth_userdb->pool, struct passwd_userdb_module, 1);
module->module.cache_key = USER_CACHE_KEY;
- module->tmpl = userdb_static_template_build(auth_userdb->auth->pool,
+ module->tmpl = userdb_static_template_build(auth_userdb->pool,
"passwd", args);
if (userdb_static_template_remove(module->tmpl, "blocking",
{
struct sql_userdb_module *module;
- module = p_new(auth_userdb->auth->pool, struct sql_userdb_module, 1);
+ module = p_new(auth_userdb->pool, struct sql_userdb_module, 1);
module->conn = db_sql_init(args);
module->module.cache_key =
- auth_cache_parse_key(auth_userdb->auth->pool,
+ auth_cache_parse_key(auth_userdb->pool,
module->conn->set.user_query);
return &module->module;
}
struct static_userdb_module *module;
const char *value;
- module = p_new(auth_userdb->auth->pool, struct static_userdb_module, 1);
- module->tmpl = userdb_static_template_build(auth_userdb->auth->pool,
+ module = p_new(auth_userdb->pool, struct static_userdb_module, 1);
+ module->tmpl = userdb_static_template_build(auth_userdb->pool,
"static", args);
if (userdb_static_template_remove(module->tmpl, "allow_all_users",
{
struct vpopmail_userdb_module *module;
const char *const *tmp, *p;
- pool_t pool = auth_userdb->auth->pool;
+ pool_t pool = auth_userdb->pool;
module = p_new(pool, struct vpopmail_userdb_module, 1);
struct auth_userdb *auth_userdb, **dest;
auth_userdb = p_new(auth->pool, struct auth_userdb, 1);
- auth_userdb->auth = auth;
+ auth_userdb->pool = auth->pool;
auth_userdb->args = set->args == NULL ? "" :
p_strdup(auth->pool, set->args);