From: Timo Sirainen Date: Sat, 13 Mar 2010 18:00:32 +0000 (+0200) Subject: auth: Cleaned up struct auth_passdb/auth_userdb. X-Git-Tag: 2.0.beta4~71 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3cf67672fdc87583cb23ce088c95bb5dee60e74d;p=thirdparty%2Fdovecot%2Fcore.git auth: Cleaned up struct auth_passdb/auth_userdb. --HG-- branch : HEAD --- diff --git a/src/auth/auth-request.c b/src/auth/auth-request.c index 45c9d08d9b..8731864413 100644 --- a/src/auth/auth-request.c +++ b/src/auth/auth-request.c @@ -340,7 +340,7 @@ static bool auth_request_master_lookup_finish(struct auth_request *request) 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; } @@ -360,7 +360,8 @@ auth_request_handle_passdb_callback(enum passdb_result *result, 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. */ @@ -376,7 +377,7 @@ auth_request_handle_passdb_callback(enum passdb_result *result, 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; @@ -1368,7 +1369,7 @@ int auth_request_password_verify(struct auth_request *request, 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; } @@ -1473,10 +1474,10 @@ auth_request_get_var_expand_table(const struct auth_request *auth_request, } 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; diff --git a/src/auth/auth-settings.c b/src/auth/auth-settings.c index 249a3dc7b5..d93498d260 100644 --- a/src/auth/auth-settings.c +++ b/src/auth/auth-settings.c @@ -110,8 +110,17 @@ static const struct setting_define auth_passdb_setting_defines[] = { 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), @@ -133,8 +142,14 @@ static const struct setting_define auth_userdb_setting_defines[] = { 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), diff --git a/src/auth/auth-worker-client.c b/src/auth/auth-worker-client.c index 31340acde9..ad42066f1f 100644 --- a/src/auth/auth-worker-client.c +++ b/src/auth/auth-worker-client.c @@ -165,13 +165,13 @@ auth_worker_handle_passv(struct auth_worker_client *client, } 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) { @@ -264,7 +264,7 @@ auth_worker_handle_passl(struct auth_worker_client *client, 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"); @@ -328,7 +328,7 @@ auth_worker_handle_setcred(struct auth_worker_client *client, 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"); diff --git a/src/auth/auth.h b/src/auth/auth.h index af880561b2..babc53e41b 100644 --- a/src/auth/auth.h +++ b/src/auth/auth.h @@ -9,23 +9,15 @@ struct auth_passdb { 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; }; diff --git a/src/auth/passdb-blocking.c b/src/auth/passdb-blocking.c index 5a7ca461cd..0b3f39edae 100644 --- a/src/auth/passdb-blocking.c +++ b/src/auth/passdb-blocking.c @@ -80,7 +80,7 @@ void passdb_blocking_verify_plain(struct auth_request *request) 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); @@ -122,7 +122,7 @@ void passdb_blocking_lookup_credentials(struct auth_request *request) 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); @@ -150,7 +150,7 @@ void passdb_blocking_set_credentials(struct auth_request *request, 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); diff --git a/src/auth/passdb.c b/src/auth/passdb.c index 2c8d190bd0..e22d33fddf 100644 --- a/src/auth/passdb.c +++ b/src/auth/passdb.c @@ -157,17 +157,15 @@ void passdb_handle_credentials(enum passdb_result result, 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); @@ -179,9 +177,9 @@ passdb_preinit(struct auth *auth, struct auth_passdb_settings *set) } 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) { @@ -189,8 +187,9 @@ passdb_preinit(struct auth *auth, struct auth_passdb_settings *set) 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; } @@ -198,7 +197,7 @@ passdb_preinit(struct auth *auth, struct auth_passdb_settings *set) 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); diff --git a/src/auth/passdb.h b/src/auth/passdb.h index 21b5ab8d60..4b2400cc9f 100644 --- a/src/auth/passdb.h +++ b/src/auth/passdb.h @@ -61,6 +61,8 @@ struct passdb_module { /* 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; }; diff --git a/src/auth/userdb-blocking.c b/src/auth/userdb-blocking.c index b6371f47a8..45b7c7d1ae 100644 --- a/src/auth/userdb-blocking.c +++ b/src/auth/userdb-blocking.c @@ -44,7 +44,7 @@ void userdb_blocking_lookup(struct auth_request *request) 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); @@ -79,7 +79,7 @@ userdb_blocking_iter_init(struct auth_userdb *userdb, 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); diff --git a/src/auth/userdb.c b/src/auth/userdb.c index 13e44b22d4..5475cf885f 100644 --- a/src/auth/userdb.c +++ b/src/auth/userdb.c @@ -108,16 +108,15 @@ gid_t userdb_parse_gid(struct auth_request *request, const char *str) 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); @@ -129,9 +128,9 @@ void userdb_preinit(struct auth *auth, struct auth_userdb_settings *set) } 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) { @@ -139,15 +138,16 @@ void userdb_preinit(struct auth *auth, struct auth_userdb_settings *set) 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) diff --git a/src/auth/userdb.h b/src/auth/userdb.h index b6ebf4a306..5aaf65d941 100644 --- a/src/auth/userdb.h +++ b/src/auth/userdb.h @@ -27,6 +27,8 @@ struct userdb_module { /* 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; };