From: Timo Sirainen Date: Thu, 18 Jan 2024 00:11:19 +0000 (-0500) Subject: auth: passdb/userdb passwd-file - Convert to new settings X-Git-Tag: 2.4.1~1090 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8fe03234be51ea82b0d1ea81ad4e8fb41ddd234b;p=thirdparty%2Fdovecot%2Fcore.git auth: passdb/userdb passwd-file - Convert to new settings --- diff --git a/src/auth/db-passwd-file.c b/src/auth/db-passwd-file.c index c92986ac2e..fa5c0018f1 100644 --- a/src/auth/db-passwd-file.c +++ b/src/auth/db-passwd-file.c @@ -14,6 +14,7 @@ #include "str.h" #include "eacces-error.h" #include "ioloop.h" +#include "settings.h" #include #include @@ -23,6 +24,38 @@ #define PARSE_TIME_STARTUP_WARN_SECS 60 #define PARSE_TIME_RELOAD_WARN_SECS 10 +#undef DEF +#define DEF(type, name) \ + SETTING_DEFINE_STRUCT_##type(#name, name, struct passwd_file_settings) + +static const struct setting_define passwd_file_setting_defines[] = { + { .type = SET_FILTER_NAME, .key = "passdb_passwd_file", }, + { .type = SET_FILTER_NAME, .key = "userdb_passwd_file", }, + DEF(STR_NOVARS, passwd_file_path), + + SETTING_DEFINE_LIST_END +}; + +static const struct passwd_file_settings passwd_file_default_settings = { + .passwd_file_path = "", +}; + +static const struct setting_keyvalue passwd_file_default_settings_keyvalue[] = { + { "passdb_passwd_file/passdb_default_password_scheme", "CRYPT" }, + { NULL, NULL } +}; + +const struct setting_parser_info passwd_file_setting_parser_info = { + .name = "passwd_file", + + .defines = passwd_file_setting_defines, + .defaults = &passwd_file_default_settings, + .default_settings = passwd_file_default_settings_keyvalue, + + .struct_size = sizeof(struct passwd_file_settings), + .pool_offset1 = 1 + offsetof(struct passwd_file_settings, pool), +}; + static struct db_passwd_file *passwd_files; static void ATTR_NULL(3) diff --git a/src/auth/db-passwd-file.h b/src/auth/db-passwd-file.h index 498f9c374e..07235e8307 100644 --- a/src/auth/db-passwd-file.h +++ b/src/auth/db-passwd-file.h @@ -3,9 +3,6 @@ #include "hash.h" -#define PASSWD_FILE_DEFAULT_USERNAME_FORMAT "%u" -#define PASSWD_FILE_DEFAULT_SCHEME "CRYPT" - struct passwd_user { uid_t uid; gid_t gid; @@ -45,6 +42,13 @@ struct db_passwd_file { bool userdb_warn_missing:1; }; +struct passwd_file_settings { + pool_t pool; + const char *passwd_file_path; +}; + +extern const struct setting_parser_info passwd_file_setting_parser_info; + int db_passwd_file_lookup(struct db_passwd_file *db, struct auth_request *request, const char *username_format, diff --git a/src/auth/passdb-passwd-file.c b/src/auth/passdb-passwd-file.c index d702fc3695..97d959b1d5 100644 --- a/src/auth/passdb-passwd-file.c +++ b/src/auth/passdb-passwd-file.c @@ -6,6 +6,7 @@ #ifdef PASSDB_PASSWD_FILE #include "str.h" +#include "settings.h" #include "auth-cache.h" #include "password-scheme.h" #include "db-passwd-file.h" @@ -14,7 +15,6 @@ struct passwd_file_passdb_module { struct passdb_module module; struct db_passwd_file *pwf; - const char *username_format; }; static int @@ -57,7 +57,7 @@ static int passwd_file_save_results(struct auth_request *request, *crypted_pass_r = pu->password != NULL ? pu->password : ""; *scheme_r = password_get_scheme(crypted_pass_r); if (*scheme_r == NULL) - *scheme_r = request->passdb->passdb->default_pass_scheme; + *scheme_r = request->passdb->set->default_password_scheme; /* save the password so cache can use it */ auth_request_set_field(request, "password", @@ -83,7 +83,7 @@ passwd_file_verify_plain(struct auth_request *request, const char *password, int ret; ret = db_passwd_file_lookup(module->pwf, request, - module->username_format, &pu); + request->set->username_format, &pu); if (ret <= 0) { callback(ret < 0 ? PASSDB_RESULT_INTERNAL_FAILURE : PASSDB_RESULT_USER_UNKNOWN, request); @@ -113,7 +113,7 @@ passwd_file_lookup_credentials(struct auth_request *request, int ret; ret = db_passwd_file_lookup(module->pwf, request, - module->username_format, &pu); + request->set->username_format, &pu); if (ret <= 0) { callback(ret < 0 ? PASSDB_RESULT_INTERNAL_FAILURE : PASSDB_RESULT_USER_UNKNOWN, NULL, 0, request); @@ -129,51 +129,24 @@ passwd_file_lookup_credentials(struct auth_request *request, callback, request); } -static struct passdb_module * -passwd_file_preinit(pool_t pool, const char *args) +static int +passwd_file_preinit(pool_t pool, struct event *event, + struct passdb_module **module_r, const char **error_r) { struct passwd_file_passdb_module *module; - const char *scheme = PASSWD_FILE_DEFAULT_SCHEME; - const char *format = PASSWD_FILE_DEFAULT_USERNAME_FORMAT; - const char *key, *value; + const struct passwd_file_settings *set; - while (*args != '\0') { - if (*args == '/') - break; - - key = args; - value = strchr(key, '='); - if (value == NULL) { - value = ""; - args = strchr(key, ' '); - } else { - key = t_strdup_until(key, value); - args = strchr(++value, ' '); - if (args != NULL) - value = t_strdup_until(value, args); - } - if (args == NULL) - args = ""; - else - args++; - - if (strcmp(key, "scheme") == 0) - scheme = p_strdup(pool, value); - else if (strcmp(key, "username_format") == 0) - format = p_strdup(pool, value); - else - i_fatal("passdb passwd-file: Unknown setting: %s", key); - } - - if (*args == '\0') - i_fatal("passdb passwd-file: Missing args"); + if (settings_get(event, &passwd_file_setting_parser_info, 0, + &set, error_r) < 0) + return -1; module = p_new(pool, struct passwd_file_passdb_module, 1); - module->pwf = db_passwd_file_init(args, FALSE, + module->pwf = db_passwd_file_init(set->passwd_file_path, FALSE, global_auth_settings->debug); - module->username_format = format; - module->module.default_pass_scheme = scheme; - return &module->module; + settings_free(set); + + *module_r = &module->module; + return 0; } static void passwd_file_init(struct passdb_module *_module) @@ -195,7 +168,7 @@ static void passwd_file_deinit(struct passdb_module *_module) struct passdb_module_interface passdb_passwd_file = { .name = "passwd-file", - .preinit_legacy = passwd_file_preinit, + .preinit = passwd_file_preinit, .init = passwd_file_init, .deinit = passwd_file_deinit, diff --git a/src/auth/userdb-passwd-file.c b/src/auth/userdb-passwd-file.c index ded45a054c..f9ff16450d 100644 --- a/src/auth/userdb-passwd-file.c +++ b/src/auth/userdb-passwd-file.c @@ -7,6 +7,7 @@ #include "istream.h" #include "str.h" +#include "settings.h" #include "auth-cache.h" #include "db-passwd-file.h" @@ -24,7 +25,6 @@ struct passwd_file_userdb_module { struct userdb_module module; struct db_passwd_file *pwf; - const char *username_format; }; static int @@ -71,7 +71,7 @@ static void passwd_file_lookup(struct auth_request *auth_request, int ret; ret = db_passwd_file_lookup(module->pwf, auth_request, - module->username_format, &pu); + auth_request->set->username_format, &pu); if (ret <= 0 || pu->uid == 0) { callback(ret < 0 ? USERDB_RESULT_INTERNAL_FAILURE : USERDB_RESULT_USER_UNKNOWN, auth_request); @@ -181,32 +181,24 @@ static int passwd_file_iterate_deinit(struct userdb_iterate_context *_ctx) return ret; } -static struct userdb_module * -passwd_file_preinit(pool_t pool, const char *args) +static int +passwd_file_preinit(pool_t pool, struct event *event, + struct userdb_module **module_r, const char **error_r) { struct passwd_file_userdb_module *module; - const char *format = PASSWD_FILE_DEFAULT_USERNAME_FORMAT; - const char *p; - - if (str_begins(args, "username_format=", &args)) { - p = strchr(args, ' '); - if (p == NULL) { - format = p_strdup(pool, args); - args = ""; - } else { - format = p_strdup_until(pool, args, p); - args = p + 1; - } - } + const struct passwd_file_settings *set; - if (*args == '\0') - i_fatal("userdb passwd-file: Missing args"); + if (settings_get(event, &passwd_file_setting_parser_info, 0, + &set, error_r) < 0) + return -1; module = p_new(pool, struct passwd_file_userdb_module, 1); - module->pwf = db_passwd_file_init(args, TRUE, + module->pwf = db_passwd_file_init(set->passwd_file_path, TRUE, global_auth_settings->debug); - module->username_format = format; - return &module->module; + settings_free(set); + + *module_r = &module->module; + return 0; } static void passwd_file_init(struct userdb_module *_module) @@ -228,7 +220,7 @@ static void passwd_file_deinit(struct userdb_module *_module) struct userdb_module_interface userdb_passwd_file = { .name = "passwd-file", - .preinit_legacy = passwd_file_preinit, + .preinit = passwd_file_preinit, .init = passwd_file_init, .deinit = passwd_file_deinit,