#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)
#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;
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,
#ifdef PASSDB_PASSWD_FILE
#include "str.h"
+#include "settings.h"
#include "auth-cache.h"
#include "password-scheme.h"
#include "db-passwd-file.h"
struct passdb_module module;
struct db_passwd_file *pwf;
- const char *username_format;
};
static int
*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",
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);
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);
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)
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,
#include "istream.h"
#include "str.h"
+#include "settings.h"
#include "auth-cache.h"
#include "db-passwd-file.h"
struct userdb_module module;
struct db_passwd_file *pwf;
- const char *username_format;
};
static int
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);
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)
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,