]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: passdb/userdb passwd-file - Convert to new settings
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 18 Jan 2024 00:11:19 +0000 (19:11 -0500)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:11 +0000 (12:34 +0200)
src/auth/db-passwd-file.c
src/auth/db-passwd-file.h
src/auth/passdb-passwd-file.c
src/auth/userdb-passwd-file.c

index c92986ac2e8d43ee7d4ab9b29353c06049717556..fa5c0018f128c5a472ec3aea318c75250f0f21b8 100644 (file)
@@ -14,6 +14,7 @@
 #include "str.h"
 #include "eacces-error.h"
 #include "ioloop.h"
+#include "settings.h"
 
 #include <unistd.h>
 #include <fcntl.h>
 #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)
index 498f9c374e183c0cd7d0d06e68f62f06626b9567..07235e830742604c297257cc36ff90379d6ee8b4 100644 (file)
@@ -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,
index d702fc36951b1766f88dd80c2bbff3e6b1a582f0..97d959b1d5b61989ceb06f129ed0b97d4216ed89 100644 (file)
@@ -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,
 
index ded45a054ca7bb4b3b8adacb82c082311c117263..f9ff16450d9ab587fa101c48ce02462e06da5418 100644 (file)
@@ -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,