diff --git a/src/lib-sieve-tool/sieve-tool.c b/src/lib-sieve-tool/sieve-tool.c index 5c60c6931461786084348055c85e9c8e776c3439..c2320f0e40b0671d36c8988c31dd1b598e32ddd2 100644 --- a/src/lib-sieve-tool/sieve-tool.c +++ b/src/lib-sieve-tool/sieve-tool.c @@ -258,7 +258,7 @@ sieve_tool_init_finish(struct sieve_tool *tool, bool init_mailstore, service_input.username = username; tool->storage_service = mail_storage_service_init( - master_service, NULL, storage_service_flags); + master_service, storage_service_flags); if (mail_storage_service_lookup_next( tool->storage_service, &service_input, &tool->mail_user_dovecot, &errstr) <= 0) @@ -350,9 +350,11 @@ void sieve_tool_init_mail_user(struct sieve_tool *tool, struct mail_namespace *ns = NULL; const char *home = NULL, *errstr = NULL; + struct master_service_settings_instance *set_instance = + mail_storage_service_user_get_settings_instance(mail_user_dovecot->service_user); struct mail_storage_service_input input = { .username = username, - .unexpanded_set_parser = mail_user_dovecot->unexpanded_set_parser, + .set_instance = set_instance, .no_userdb_lookup = TRUE, }; if (mail_storage_service_lookup_next(tool->storage_service, &input, diff --git a/src/lib-sieve/sieve-message.c b/src/lib-sieve/sieve-message.c index 229b2ea7ba248b5b0d93b36df0d5b16163385c30..0169ce20436efe5a9dd3a2906f7da41d01786358 100644 --- a/src/lib-sieve/sieve-message.c +++ b/src/lib-sieve/sieve-message.c @@ -347,9 +347,10 @@ int sieve_message_substitute struct mail_storage_service_ctx *storage_service = mail_storage_service_user_get_service_ctx( mail_user->service_user); + struct master_service_settings_instance *set_instance = + mail_storage_service_user_get_settings_instance(mail_user->service_user); msgctx->raw_mail_user = - raw_storage_create_from_set(storage_service, - mail_user->unexpanded_set_parser); + raw_storage_create_from_set(storage_service, set_instance); } i_stream_seek(input, 0); diff --git a/src/lib-sieve/util/edit-mail.c b/src/lib-sieve/util/edit-mail.c index e5c525c9df328f99d1354f4457f1bf92ba212ffd..d4ad6395b96f4f1d0f5e209362e833f0ca902a6b 100644 --- a/src/lib-sieve/util/edit-mail.c +++ b/src/lib-sieve/util/edit-mail.c @@ -52,9 +52,10 @@ static struct mail_user *edit_mail_raw_storage_get(struct mail_user *mail_user) struct mail_storage_service_ctx *storage_service = mail_storage_service_user_get_service_ctx( mail_user->service_user); + struct master_service_settings_instance *set_instance = + mail_storage_service_user_get_settings_instance(mail_user->service_user); edit_mail_user = - raw_storage_create_from_set(storage_service, - mail_user->unexpanded_set_parser); + raw_storage_create_from_set(storage_service, set_instance); } edit_mail_refcount++; diff --git a/src/lib-sieve/util/mail-raw.c b/src/lib-sieve/util/mail-raw.c index 8a33b04ed0efb6e7a70b06c2de41a7316e02ea79..0ef20592a2cda15c5b1bd8fa1e566f8446656506 100644 --- a/src/lib-sieve/util/mail-raw.c +++ b/src/lib-sieve/util/mail-raw.c @@ -140,8 +140,9 @@ struct mail_user *mail_raw_user_create(struct mail_user *mail_user) struct mail_storage_service_ctx *storage_service = mail_storage_service_user_get_service_ctx( mail_user->service_user); - return raw_storage_create_from_set(storage_service, - mail_user->unexpanded_set_parser); + struct master_service_settings_instance *set_instance = + mail_storage_service_user_get_settings_instance(mail_user->service_user); + return raw_storage_create_from_set(storage_service, set_instance); } /* diff --git a/src/lib-sieve/util/test-edit-mail.c b/src/lib-sieve/util/test-edit-mail.c index 0ead824c8a80d05f563ecd456f060556a7f685e2..4051d664a399dce5d1f961a344541a5b11958ed3 100644 --- a/src/lib-sieve/util/test-edit-mail.c +++ b/src/lib-sieve/util/test-edit-mail.c @@ -64,7 +64,7 @@ static int test_init_mail_user(void) }; mail_storage_service = mail_storage_service_init( - master_service, NULL, + master_service, (MAIL_STORAGE_SERVICE_FLAG_NO_RESTRICT_ACCESS | MAIL_STORAGE_SERVICE_FLAG_NO_LOG_INIT | MAIL_STORAGE_SERVICE_FLAG_NO_PLUGINS)); diff --git a/src/managesieve-login/client.c b/src/managesieve-login/client.c index eaad9f7c870b1a24637f6563a9828947e2911d41..1f478889681b1c17362b799e7142d51bc4fd0411 100644 --- a/src/managesieve-login/client.c +++ b/src/managesieve-login/client.c @@ -11,6 +11,7 @@ #include "strescape.h" #include "base64.h" #include "master-service.h" +#include "master-service-settings.h" #include "auth-client.h" #include "managesieve-parser.h" @@ -373,15 +374,22 @@ static struct client *managesieve_client_alloc(pool_t pool) return &msieve_client->common; } -static void managesieve_client_create(struct client *client, void **other_sets) +static int managesieve_client_create(struct client *client) { struct managesieve_client *msieve_client = (struct managesieve_client *)client; + const char *error; - msieve_client->set = other_sets[0]; + if (master_service_settings_get(client->event, + &managesieve_login_setting_parser_info, 0, + &msieve_client->set, &error) < 0) { + e_error(client->event, "%s", error); + return -1; + } msieve_client->parser = managesieve_parser_create( msieve_client->common.input, MAX_MANAGESIEVE_LINE); client->io = io_add(client->fd, IO_READ, client_input, client); + return 0; } static void managesieve_client_destroy(struct client *client) @@ -390,6 +398,7 @@ static void managesieve_client_destroy(struct client *client) (struct managesieve_client *)client; managesieve_parser_destroy(&managesieve_client->parser); + master_service_settings_free(managesieve_client->set); } static void managesieve_client_notify_auth_ready(struct client *client) @@ -499,7 +508,6 @@ managesieve_client_notify_disconnect(struct client *client, static void managesieve_login_preinit(void) { - login_set_roots = managesieve_login_settings_set_roots; } static void managesieve_login_init(void) diff --git a/src/managesieve-login/managesieve-login-settings.c b/src/managesieve-login/managesieve-login-settings.c index 811c10565495c3825af4ca8f3388be5dcabdd73b..440b1b58d30e9d908a75ef5bb54d17726f4897a7 100644 --- a/src/managesieve-login/managesieve-login-settings.c +++ b/src/managesieve-login/managesieve-login-settings.c @@ -104,22 +104,20 @@ static const struct setting_parser_info *managesieve_login_setting_dependencies[ NULL }; -static const struct setting_parser_info managesieve_login_setting_parser_info = { - .module_name = "managesieve-login", +const struct setting_parser_info managesieve_login_setting_parser_info = { + .name = "managesieve_login", + .defines = managesieve_login_setting_defines, .defaults = &managesieve_login_default_settings, - .type_offset = (size_t)-1, .struct_size = sizeof(struct managesieve_login_settings), - - .parent_offset = (size_t)-1, + .pool_offset1 = 1 + offsetof(struct managesieve_login_settings, pool), .parent = NULL, .dependencies = managesieve_login_setting_dependencies }; const struct setting_parser_info *managesieve_login_settings_set_roots[] = { - &login_setting_parser_info, &managesieve_login_setting_parser_info, NULL }; diff --git a/src/managesieve-login/managesieve-login-settings.h b/src/managesieve-login/managesieve-login-settings.h index c6f4826e0657bf0ae36c329c5e321a3cb8eddc51..aef5472ba7d180df82b338b444f28d9ae6a95f84 100644 --- a/src/managesieve-login/managesieve-login-settings.h +++ b/src/managesieve-login/managesieve-login-settings.h @@ -2,12 +2,13 @@ #define MANAGESIEVE_LOGIN_SETTINGS_H struct managesieve_login_settings { + pool_t pool; const char *managesieve_implementation_string; const char *managesieve_sieve_capability; const char *managesieve_notify_capability; }; -extern const struct setting_parser_info *managesieve_login_settings_set_roots[]; +extern const struct setting_parser_info managesieve_login_setting_parser_info; #ifdef _CONFIG_PLUGIN void managesieve_login_settings_init(void); diff --git a/src/managesieve/main.c b/src/managesieve/main.c index 4ce612deb6f4877e79c73a3b361188f08b24673c..7c280b5f33626b2a56a2387ff1b1801c9ca16712 100644 --- a/src/managesieve/main.c +++ b/src/managesieve/main.c @@ -149,7 +149,6 @@ client_create_from_input(const struct mail_storage_service_input *input, struct client *client; struct managesieve_settings *set; struct event *event; - const char *error; event = event_create(NULL); event_add_category(event, &event_category_managesieve); @@ -168,18 +167,16 @@ client_create_from_input(const struct mail_storage_service_input *input, } restrict_access_allow_coredumps(TRUE); - set = master_service_settings_get_root_set(master_service, - &managesieve_setting_parser_info); - if (set->verbose_proctitle) - verbose_proctitle = TRUE; - - if (mail_user_var_expand(mail_user, &managesieve_setting_parser_info, - set, &error) <= 0) { - e_error(event, "Failed to expand settings: %s", error); + if (master_service_settings_instance_get(mail_user->event, + mail_user->set_instance, + &managesieve_setting_parser_info, 0, + &set, error_r) < 0) { mail_user_unref(&mail_user); event_unref(&event); return -1; } + if (set->verbose_proctitle) + verbose_proctitle = TRUE; client = client_create(fd_in, fd_out, input->session_id, event, mail_user, set); @@ -302,10 +299,6 @@ static void client_connected(struct master_service_connection *conn) int main(int argc, char *argv[]) { - static const struct setting_parser_info *set_roots[] = { - &managesieve_setting_parser_info, - NULL - }; struct login_server_settings login_set; enum master_service_flags service_flags = 0; enum mail_storage_service_flags storage_service_flags = 0; @@ -382,7 +375,7 @@ int main(int argc, char *argv[]) storage_service = mail_storage_service_init(master_service, - set_roots, storage_service_flags); + storage_service_flags); master_service_init_finish(master_service); /* NOTE: login_set.*_socket_path are now invalid due to data stack having been freed */ diff --git a/src/managesieve/managesieve-capabilities.c b/src/managesieve/managesieve-capabilities.c index 68ddf0f055cdb4d7ec48439969f6f15258ad78ba..24042af95fc931e1e1027b108c1486a16823c359 100644 --- a/src/managesieve/managesieve-capabilities.c +++ b/src/managesieve/managesieve-capabilities.c @@ -11,6 +11,7 @@ #include "sieve.h" +#include "managesieve-settings.h" #include "managesieve-capabilities.h" #include <stddef.h> @@ -20,52 +21,16 @@ * Global plugin settings */ -struct plugin_settings { - ARRAY(const char *) plugin_envs; -}; - -static const struct setting_parser_info **plugin_set_roots; - -static const struct setting_define plugin_setting_defines[] = { - { .type = SET_STRLIST, .key = "plugin", - .offset = offsetof(struct plugin_settings, plugin_envs) }, - - SETTING_DEFINE_LIST_END -}; - -static const struct setting_parser_info plugin_setting_parser_info = { - .module_name = "managesieve", - .defines = plugin_setting_defines, - - .type_offset = (size_t)-1, - .struct_size = sizeof(struct plugin_settings), - - .parent_offset = (size_t)-1, -}; - -static const struct setting_parser_info *default_plugin_set_roots[] = { - &plugin_setting_parser_info, - NULL -}; - -static const struct setting_parser_info **plugin_set_roots = - default_plugin_set_roots; -static struct plugin_settings *plugin_settings_read(void) +static const struct plugin_settings *plugin_settings_read(void) { - struct master_service_settings_input input; - struct master_service_settings_output output; const char *error; - i_zero(&input); - input.roots = plugin_set_roots; - input.disable_check_settings = TRUE; - if (master_service_settings_read(master_service, &input, - &output, &error) < 0) + if (master_service_settings_read_simple(master_service, &error) < 0) i_fatal("Error reading configuration: %s", error); - return master_service_settings_get_root_set(master_service, - plugin_set_roots[0]); + return master_service_settings_get_or_fatal(NULL, + &managesieve_plugin_setting_parser_info); } static const char * @@ -136,5 +101,6 @@ void managesieve_capabilities_dump(void) sieve_get_capabilities(svinst, "notify")); } + master_service_settings_free(global_plugin_settings); sieve_deinit(&svinst); } diff --git a/src/managesieve/managesieve-client.c b/src/managesieve/managesieve-client.c index 53cfd21175b4152ab396e3141d0f93f0f60e552b..90630afdbee6a2b5eb7f8d63a8b2087feb5871c5 100644 --- a/src/managesieve/managesieve-client.c +++ b/src/managesieve/managesieve-client.c @@ -14,6 +14,7 @@ #include "var-expand.h" #include "time-util.h" #include "master-service.h" +#include "master-service-settings.h" #include "mail-storage-service.h" #include "mail-namespace.h" @@ -280,6 +281,7 @@ void client_destroy(struct client *client, const char *reason) event_unref(&client->cmd.event); pool_unref(&client->cmd.pool); + master_service_settings_free(client->set); managesieve_client_count--; DLLIST_REMOVE(&managesieve_clients, client); diff --git a/src/managesieve/managesieve-settings.c b/src/managesieve/managesieve-settings.c index 7b0fae5a164da7ced81607d09e4162125aad2649..7580a2479ec897c3fb5250caf50b82f347e81252 100644 --- a/src/managesieve/managesieve-settings.c +++ b/src/managesieve/managesieve-settings.c @@ -108,22 +108,38 @@ static const struct setting_parser_info *managesieve_setting_dependencies[] = { }; const struct setting_parser_info managesieve_setting_parser_info = { - .module_name = "managesieve", + .name = "managesieve", + .defines = managesieve_setting_defines, .defaults = &managesieve_default_settings, - .type_offset = (size_t)-1, .struct_size = sizeof(struct managesieve_settings), - - .parent_offset = (size_t)-1, + .pool_offset1 = 1 + offsetof(struct managesieve_settings, pool), .parent = NULL, .check_func = managesieve_settings_verify, .dependencies = managesieve_setting_dependencies }; +static const struct setting_define plugin_setting_defines[] = { + { .type = SET_STRLIST, .key = "plugin", + .offset = offsetof(struct plugin_settings, plugin_envs) }, + + SETTING_DEFINE_LIST_END +}; + +const struct setting_parser_info managesieve_plugin_setting_parser_info = { + .name = "managesieve_plugin", + + .defines = plugin_setting_defines, + + .struct_size = sizeof(struct plugin_settings), + .pool_offset1 = 1 + offsetof(struct plugin_settings, pool), +}; + const struct setting_parser_info *managesieve_settings_set_roots[] = { &managesieve_setting_parser_info, + &managesieve_plugin_setting_parser_info, NULL }; diff --git a/src/managesieve/managesieve-settings.h b/src/managesieve/managesieve-settings.h index a72338b90e6ea1e405a4e02de46f7c19d02c7dd2..b00905af92f41e8b453c6ec90dfa4edc9e2e1462 100644 --- a/src/managesieve/managesieve-settings.h +++ b/src/managesieve/managesieve-settings.h @@ -10,6 +10,7 @@ enum managesieve_client_workarounds { /* </settings checks> */ struct managesieve_settings { + pool_t pool; bool mail_debug; bool verbose_proctitle; const char *rawlog_dir; @@ -24,6 +25,12 @@ struct managesieve_settings { enum managesieve_client_workarounds parsed_workarounds; }; +struct plugin_settings { + pool_t pool; + ARRAY(const char *) plugin_envs; +}; + extern const struct setting_parser_info managesieve_setting_parser_info; +extern const struct setting_parser_info managesieve_plugin_setting_parser_info; #endif diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c index 662c977a34f3f8a3824c332383b560f2e3e778de..14b4fcd9aa490e193eef3c7444e63d9a293bbdf8 100644 --- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c +++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c @@ -113,7 +113,7 @@ doveadm_sieve_cmd_run(struct doveadm_mail_cmd_context *_ctx, svenv.flags = SIEVE_FLAG_HOME_RELATIVE; ctx->svinst = sieve_init(&svenv, &sieve_callbacks, (void *)ctx, - user->mail_debug); + user->set->mail_debug); ctx->storage = sieve_storage_create_main( ctx->svinst, user, SIEVE_STORAGE_FLAG_READWRITE, &error); diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c index eab140447c7e6867f22efe52a7456e4bfce921cf..f540bbea27d60b05e9bc82fd3db6dc960bb76fe3 100644 --- a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c +++ b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c @@ -93,7 +93,7 @@ mail_sieve_user_init(struct mail_user *user, struct sieve_storage **svstorage_r) svenv.flags = SIEVE_FLAG_HOME_RELATIVE; suser->svinst = sieve_init(&svenv, &mail_sieve_callbacks, - user, user->mail_debug); + user, user->set->mail_debug); suser->sieve_storage = sieve_storage_create_main(suser->svinst, user, storage_flags, NULL); diff --git a/src/plugins/imap-filter-sieve/imap-filter-sieve.c b/src/plugins/imap-filter-sieve/imap-filter-sieve.c index 62519f4c70ccf52a3d3f8cb3e394aaa4b7ce80a0..32ccf5f905f57d8493bafa47004a5900ea056149 100644 --- a/src/plugins/imap-filter-sieve/imap-filter-sieve.c +++ b/src/plugins/imap-filter-sieve/imap-filter-sieve.c @@ -79,20 +79,17 @@ imap_filter_sieve_get_svinst(struct imap_filter_sieve_context *sctx) struct imap_filter_sieve_user *ifsuser = IMAP_FILTER_SIEVE_USER_CONTEXT_REQUIRE(user); struct sieve_environment svenv; - const struct mail_storage_settings *mail_set; - bool debug = user->mail_debug; + bool debug = user->set->mail_debug; if (ifsuser->svinst != NULL) return ifsuser->svinst; - mail_set = mail_user_set_get_storage_set(user); - ifsuser->dup_db = mail_duplicate_db_init(user, DUPLICATE_DB_NAME); i_zero(&svenv); svenv.username = user->username; (void)mail_user_get_home(user, &svenv.home_dir); - svenv.hostname = mail_set->hostname; + svenv.hostname = user->set->hostname; svenv.base_dir = user->set->base_dir; svenv.event_parent = ifsuser->client->event; svenv.flags = SIEVE_FLAG_HOME_RELATIVE; @@ -570,14 +567,10 @@ imap_filter_sieve_smtp_start(const struct sieve_script_env *senv, struct imap_filter_sieve_user *ifsuser = IMAP_FILTER_SIEVE_USER_CONTEXT_REQUIRE(user); const struct smtp_submit_settings *smtp_set = ifsuser->client->smtp_set; - struct ssl_iostream_settings ssl_set; struct smtp_submit_input submit_input; - i_zero(&ssl_set); - mail_user_init_ssl_client_settings(user, &ssl_set); - i_zero(&submit_input); - submit_input.ssl = &ssl_set; + submit_input.ssl = user->ssl_set; return (void *)smtp_submit_init_simple(&submit_input, smtp_set, mail_from); diff --git a/src/plugins/imapsieve/imap-sieve.c b/src/plugins/imapsieve/imap-sieve.c index e6cc24a51fb569661261c56e485f9b93264e3f28..9b259dc9041633f82ec8a60cd0ac57746bb140ee 100644 --- a/src/plugins/imapsieve/imap-sieve.c +++ b/src/plugins/imapsieve/imap-sieve.c @@ -67,9 +67,7 @@ struct imap_sieve *imap_sieve_init(struct client *client) struct sieve_environment svenv; struct imap_sieve *isieve; struct mail_user *user = client->user; - const struct mail_storage_settings *mail_set = - mail_user_set_get_storage_set(user); - bool debug = user->mail_debug; + bool debug = user->set->mail_debug; pool_t pool; pool = pool_alloconly_create("imap_sieve", 256); @@ -82,7 +80,7 @@ struct imap_sieve *imap_sieve_init(struct client *client) i_zero(&svenv); svenv.username = user->username; (void)mail_user_get_home(user, &svenv.home_dir); - svenv.hostname = mail_set->hostname; + svenv.hostname = user->set->hostname; svenv.base_dir = user->set->base_dir; svenv.event_parent = client->event; svenv.flags = SIEVE_FLAG_HOME_RELATIVE; @@ -164,14 +162,10 @@ imap_sieve_smtp_start(const struct sieve_script_env *senv, struct imap_sieve *isieve = isctx->isieve; struct mail_user *user = isieve->client->user; const struct smtp_submit_settings *smtp_set = isieve->client->smtp_set; - struct ssl_iostream_settings ssl_set; struct smtp_submit_input submit_input; - i_zero(&ssl_set); - mail_user_init_ssl_client_settings(user, &ssl_set); - i_zero(&submit_input); - submit_input.ssl = &ssl_set; + submit_input.ssl = user->ssl_set; return smtp_submit_init_simple(&submit_input, smtp_set, mail_from); } diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c index 4e79c1f1b58b711acd868a47eb2c0e7402ab6344..1eb0a35c24a12084286b31eaf5d42cdc12b487cb 100644 --- a/src/plugins/lda-sieve/lda-sieve-plugin.c +++ b/src/plugins/lda-sieve/lda-sieve-plugin.c @@ -81,14 +81,10 @@ lda_sieve_smtp_start(const struct sieve_script_env *senv, struct mail_deliver_context *dctx = (struct mail_deliver_context *)senv->script_context; struct mail_user *user = dctx->rcpt_user; - struct ssl_iostream_settings ssl_set; struct smtp_submit_input submit_input; - - i_zero(&ssl_set); - mail_user_init_ssl_client_settings(user, &ssl_set); i_zero(&submit_input); - submit_input.ssl = &ssl_set; + submit_input.ssl = user->ssl_set; return (void *)smtp_submit_init_simple(&submit_input, dctx->smtp_set, mail_from); @@ -1049,9 +1045,7 @@ lda_sieve_deliver_mail(struct mail_deliver_context *mdctx, struct mail_storage **storage_r) { struct lda_sieve_run_context srctx; - const struct mail_storage_settings *mail_set = - mail_user_set_get_storage_set(mdctx->rcpt_user); - bool debug = mdctx->rcpt_user->mail_debug; + bool debug = mdctx->rcpt_user->set->mail_debug; struct sieve_environment svenv; int ret = 0; @@ -1066,7 +1060,7 @@ lda_sieve_deliver_mail(struct mail_deliver_context *mdctx, memset((void*)&svenv, 0, sizeof(svenv)); svenv.username = mdctx->rcpt_user->username; svenv.home_dir = srctx.home_dir; - svenv.hostname = mail_set->hostname; + svenv.hostname = mdctx->rcpt_user->set->hostname; svenv.base_dir = mdctx->rcpt_user->set->base_dir; svenv.temp_dir = mdctx->rcpt_user->set->mail_temp_dir; svenv.event_parent = mdctx->event; diff --git a/src/testsuite/testsuite-mailstore.c b/src/testsuite/testsuite-mailstore.c index bcf99606b6114b01cd72ca3aefab89a42d30f601..e456bbba6828fe34346015e37af345a9fb8e5145 100644 --- a/src/testsuite/testsuite-mailstore.c +++ b/src/testsuite/testsuite-mailstore.c @@ -86,9 +86,11 @@ void testsuite_mailstore_init(void) t_strconcat("home=", cwd, NULL), NULL, }; + struct master_service_settings_instance *set_instance = + mail_storage_service_user_get_settings_instance(mail_user_dovecot->service_user); struct mail_storage_service_input input = { .username = "testsuite-mail-user@example.org", - .unexpanded_set_parser = mail_user_dovecot->unexpanded_set_parser, + .set_instance = set_instance, .no_userdb_lookup = TRUE, .userdb_fields = userdb_fields, };