auth-settings.c revision 6523f54d1521edf894880f2d45e75cef5dd31c3d
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2005-2013 Dovecot authors, see the included COPYING file */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#include "lib.h"
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#include "array.h"
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#include "settings-parser.h"
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#include "master-service-private.h"
af99ca825f4b7674ec6dd0269bbca665775205aaTimo Sirainen#include "master-service-settings.h"
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#include "service-settings.h"
b10c3f9ed997748fdbb03b9daadc8c31eed02120Timo Sirainen#include "auth-settings.h"
06fda713b84e857dbc3e80f401a54085c9b0ed16Timo Sirainen
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen#include <stddef.h>
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic bool auth_settings_check(void *_set, pool_t pool, const char **error_r);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic bool auth_passdb_settings_check(void *_set, pool_t pool, const char **error_r);
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainenstatic bool auth_userdb_settings_check(void *_set, pool_t pool, const char **error_r);
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen/* <settings checks> */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic struct file_listener_settings auth_unix_listeners_array[] = {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen { "login/login", 0666, "", "" },
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen { "token-login/tokenlogin", 0666, "", "" },
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen { "auth-login", 0600, "$default_internal_user", "" },
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen { "auth-client", 0600, "$default_internal_user", "" },
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen { "auth-userdb", 0666, "$default_internal_user", "" },
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen { "auth-master", 0600, "", "" }
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen};
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainenstatic struct file_listener_settings *auth_unix_listeners[] = {
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen &auth_unix_listeners_array[0],
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen &auth_unix_listeners_array[1],
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen &auth_unix_listeners_array[2],
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen &auth_unix_listeners_array[3],
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen &auth_unix_listeners_array[4],
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen &auth_unix_listeners_array[5]
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen};
b10c3f9ed997748fdbb03b9daadc8c31eed02120Timo Sirainenstatic buffer_t auth_unix_listeners_buf = {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen auth_unix_listeners, sizeof(auth_unix_listeners), { 0, }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen};
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen/* </settings checks> */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstruct service_settings auth_service_settings = {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .name = "auth",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .protocol = "",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .type = "",
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen .executable = "auth",
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen .user = "$default_internal_user",
b10c3f9ed997748fdbb03b9daadc8c31eed02120Timo Sirainen .group = "",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .privileged_group = "",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .extra_groups = "",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .chroot = "",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .drop_priv_before_exec = FALSE,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .process_min_avail = 0,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .process_limit = 1,
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen .client_limit = 0,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .service_count = 0,
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen .idle_kill = 0,
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen .vsz_limit = (uoff_t)-1,
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen .unix_listeners = { { &auth_unix_listeners_buf,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen sizeof(auth_unix_listeners[0]) } },
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .fifo_listeners = ARRAY_INIT,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .inet_listeners = ARRAY_INIT,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .process_limit_1 = TRUE
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen};
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen/* <settings checks> */
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainenstatic struct file_listener_settings auth_worker_unix_listeners_array[] = {
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen { "auth-worker", 0600, "$default_internal_user", "" }
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen};
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainenstatic struct file_listener_settings *auth_worker_unix_listeners[] = {
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen &auth_worker_unix_listeners_array[0]
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen};
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic buffer_t auth_worker_unix_listeners_buf = {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen auth_worker_unix_listeners, sizeof(auth_worker_unix_listeners), { 0, }
35ef661bd85c64834e3e34eeeb3c393b81108760Timo Sirainen};
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen/* </settings checks> */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
35ef661bd85c64834e3e34eeeb3c393b81108760Timo Sirainenstruct service_settings auth_worker_service_settings = {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .name = "auth-worker",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .protocol = "",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .type = "",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .executable = "auth -w",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .user = "",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .group = "",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .privileged_group = "",
c39c3d8089fbdd8eb34646c25167aa4551064cf4Timo Sirainen .extra_groups = "",
c39c3d8089fbdd8eb34646c25167aa4551064cf4Timo Sirainen .chroot = "",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
bd63b5b860658b01b1f46f26d406e1e4a9dc019aTimo Sirainen .drop_priv_before_exec = FALSE,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .process_min_avail = 0,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .process_limit = 0,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .client_limit = 1,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .service_count = 1,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .idle_kill = 0,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .vsz_limit = (uoff_t)-1,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .unix_listeners = { { &auth_worker_unix_listeners_buf,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen sizeof(auth_worker_unix_listeners[0]) } },
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .fifo_listeners = ARRAY_INIT,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .inet_listeners = ARRAY_INIT
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen};
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#undef DEF
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#define DEF(type, name) \
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen { type, #name, offsetof(struct auth_passdb_settings, name), NULL }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic const struct setting_define auth_passdb_setting_defines[] = {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_STR, driver),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_STR, args),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_STR, default_fields),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_STR, override_fields),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_ENUM, skip),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_ENUM, result_success),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_ENUM, result_failure),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_ENUM, result_internalfail),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_BOOL, deny),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_BOOL, pass),
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen DEF(SET_BOOL, master),
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen SETTING_DEFINE_LIST_END
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen};
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic const struct auth_passdb_settings auth_passdb_default_settings = {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .driver = "",
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen .args = "",
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen .default_fields = "",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .override_fields = "",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .skip = "never:authenticated:unauthenticated",
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen .result_success = "return-ok:return:return-fail:continue:continue-ok:continue-fail",
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen .result_failure = "continue:return:return-ok:return-fail:continue-ok:continue-fail",
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen .result_internalfail = "continue:return:return-ok:return-fail:continue-ok:continue-fail",
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen .deny = FALSE,
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen .pass = FALSE,
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen .master = FALSE
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen};
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainenconst struct setting_parser_info auth_passdb_setting_parser_info = {
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen .defines = auth_passdb_setting_defines,
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen .defaults = &auth_passdb_default_settings,
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen .type_offset = (size_t)-1,
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen .struct_size = sizeof(struct auth_passdb_settings),
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen .parent_offset = (size_t)-1,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .parent = &auth_setting_parser_info,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .check_func = auth_passdb_settings_check
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen};
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen#undef DEF
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen#define DEF(type, name) \
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen { type, #name, offsetof(struct auth_userdb_settings, name), NULL }
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen
44ef49403ac7bddac84a1e322d170ed53cd37c95Timo Sirainenstatic const struct setting_define auth_userdb_setting_defines[] = {
44ef49403ac7bddac84a1e322d170ed53cd37c95Timo Sirainen DEF(SET_STR, driver),
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen DEF(SET_STR, args),
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen DEF(SET_STR, default_fields),
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen DEF(SET_STR, override_fields),
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen SETTING_DEFINE_LIST_END
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen};
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainenstatic const struct auth_userdb_settings auth_userdb_default_settings = {
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen .driver = "",
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen .args = "",
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen .default_fields = "",
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen .override_fields = ""
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen};
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainenconst struct setting_parser_info auth_userdb_setting_parser_info = {
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .defines = auth_userdb_setting_defines,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .defaults = &auth_userdb_default_settings,
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen
9625595c47c665f5aee57ebfcb1fcbe9ad1bf3a0Martti Rannanjärvi .type_offset = (size_t)-1,
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen .struct_size = sizeof(struct auth_userdb_settings),
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen .parent_offset = (size_t)-1,
06fda713b84e857dbc3e80f401a54085c9b0ed16Timo Sirainen .parent = &auth_setting_parser_info,
b75eba4f65c7630d3691f07d22ff4bdfcac5054dTimo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen .check_func = auth_userdb_settings_check
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen};
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
efe78d3ba24fc866af1c79b9223dc0809ba26cadStephan Bosch/* we're kind of kludging here to avoid "auth_" prefix in the struct fields */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#undef DEF
061046c9aa2eec5c6c2f148ec95a4e51db3d8fd2Timo Sirainen#undef DEF_NOPREFIX
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#undef DEFLIST
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#define DEF(type, name) \
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen { type, "auth_"#name, offsetof(struct auth_settings, name), NULL }
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen#define DEF_NOPREFIX(type, name) \
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen { type, #name, offsetof(struct auth_settings, name), NULL }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#define DEFLIST(field, name, defines) \
efe78d3ba24fc866af1c79b9223dc0809ba26cadStephan Bosch { SET_DEFLIST, name, offsetof(struct auth_settings, field), defines }
3858a7a5da361c35f1e6e50c8e3214dc0cf379d6Phil Carmody
b75eba4f65c7630d3691f07d22ff4bdfcac5054dTimo Sirainenstatic const struct setting_define auth_setting_defines[] = {
06fda713b84e857dbc3e80f401a54085c9b0ed16Timo Sirainen DEF(SET_STR, mechanisms),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_STR, realms),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_STR, default_realm),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_SIZE, cache_size),
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen DEF(SET_TIME, cache_ttl),
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen DEF(SET_TIME, cache_negative_ttl),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_STR, username_chars),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_STR, username_translation),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_STR, username_format),
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen DEF(SET_STR, master_user_separator),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_STR, anonymous_username),
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen DEF(SET_STR, krb5_keytab),
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen DEF(SET_STR, gssapi_hostname),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_STR, winbind_helper_path),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_STR, proxy_self),
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen DEF(SET_TIME, failure_delay),
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen DEF(SET_BOOL, verbose),
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen DEF(SET_BOOL, debug),
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen DEF(SET_BOOL, debug_passwords),
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen DEF(SET_ENUM, verbose_passwords),
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen DEF(SET_BOOL, ssl_require_client_cert),
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen DEF(SET_BOOL, ssl_username_from_cert),
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen DEF(SET_BOOL, use_winbind),
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen DEF(SET_UINT, worker_max_count),
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen DEFLIST(passdbs, "passdb", &auth_passdb_setting_parser_info),
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen DEFLIST(userdbs, "userdb", &auth_userdb_setting_parser_info),
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen DEF_NOPREFIX(SET_STR, base_dir),
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen DEF_NOPREFIX(SET_BOOL, verbose_proctitle),
9625595c47c665f5aee57ebfcb1fcbe9ad1bf3a0Martti Rannanjärvi DEF_NOPREFIX(SET_UINT, first_valid_uid),
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen DEF_NOPREFIX(SET_UINT, last_valid_uid),
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen
a58963a8bdac0438a31abc03711e8870b4dfa4f4Timo Sirainen SETTING_DEFINE_LIST_END
a58963a8bdac0438a31abc03711e8870b4dfa4f4Timo Sirainen};
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen
2bc67190c90d08703ceb421fc8dcf16780020886Aki Tuomistatic const struct auth_settings auth_default_settings = {
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .mechanisms = "plain",
061046c9aa2eec5c6c2f148ec95a4e51db3d8fd2Timo Sirainen .realms = "",
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi .default_realm = "",
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .cache_size = 0,
a58963a8bdac0438a31abc03711e8870b4dfa4f4Timo Sirainen .cache_ttl = 60*60,
a58963a8bdac0438a31abc03711e8870b4dfa4f4Timo Sirainen .cache_negative_ttl = 60*60,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .username_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@",
061046c9aa2eec5c6c2f148ec95a4e51db3d8fd2Timo Sirainen .username_translation = "",
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .username_format = "%Lu",
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen .master_user_separator = "",
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen .anonymous_username = "anonymous",
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen .krb5_keytab = "",
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen .gssapi_hostname = "",
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen .winbind_helper_path = "/usr/bin/ntlm_auth",
a58963a8bdac0438a31abc03711e8870b4dfa4f4Timo Sirainen .proxy_self = "",
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen .failure_delay = 2,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .verbose = FALSE,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .debug = FALSE,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .debug_passwords = FALSE,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .verbose_passwords = "no:plain:sha1",
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .ssl_require_client_cert = FALSE,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .ssl_username_from_cert = FALSE,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .use_winbind = FALSE,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .worker_max_count = 30,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .passdbs = ARRAY_INIT,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .userdbs = ARRAY_INIT,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen .base_dir = PKG_RUNDIR,
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen .verbose_proctitle = FALSE,
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen .first_valid_uid = 500,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .last_valid_uid = 0,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen};
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen
061046c9aa2eec5c6c2f148ec95a4e51db3d8fd2Timo Sirainenconst struct setting_parser_info auth_setting_parser_info = {
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi .module_name = "auth",
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .defines = auth_setting_defines,
a58963a8bdac0438a31abc03711e8870b4dfa4f4Timo Sirainen .defaults = &auth_default_settings,
a58963a8bdac0438a31abc03711e8870b4dfa4f4Timo Sirainen
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen .type_offset = (size_t)-1,
061046c9aa2eec5c6c2f148ec95a4e51db3d8fd2Timo Sirainen .struct_size = sizeof(struct auth_settings),
2bc67190c90d08703ceb421fc8dcf16780020886Aki Tuomi
2bc67190c90d08703ceb421fc8dcf16780020886Aki Tuomi .parent_offset = (size_t)-1,
2bc67190c90d08703ceb421fc8dcf16780020886Aki Tuomi
2bc67190c90d08703ceb421fc8dcf16780020886Aki Tuomi .check_func = auth_settings_check
2bc67190c90d08703ceb421fc8dcf16780020886Aki Tuomi};
2bc67190c90d08703ceb421fc8dcf16780020886Aki Tuomi
2bc67190c90d08703ceb421fc8dcf16780020886Aki Tuomi/* <settings checks> */
2bc67190c90d08703ceb421fc8dcf16780020886Aki Tuomistatic bool
2bc67190c90d08703ceb421fc8dcf16780020886Aki Tuomiauth_settings_set_self_ips(struct auth_settings *set, pool_t pool,
2bc67190c90d08703ceb421fc8dcf16780020886Aki Tuomi const char **error_r)
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen{
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen const char *const *tmp;
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen ARRAY(struct ip_addr) ips_array;
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen struct ip_addr *ips;
9625595c47c665f5aee57ebfcb1fcbe9ad1bf3a0Martti Rannanjärvi unsigned int ips_count;
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen int ret;
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen if (*set->proxy_self == '\0') {
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen set->proxy_self_ips = p_new(pool, struct ip_addr, 1);
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen return TRUE;
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen }
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen p_array_init(&ips_array, pool, 4);
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen tmp = t_strsplit_spaces(set->proxy_self, " ");
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen for (; *tmp != NULL; tmp++) {
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen ret = net_gethostbyname(*tmp, &ips, &ips_count);
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen if (ret != 0) {
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen *error_r = t_strdup_printf("auth_proxy_self_ips: "
1c3dc4c08ced3948f52c3c6c171ed77310b2cbfdTimo Sirainen "gethostbyname(%s) failed: %s",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen *tmp, net_gethosterror(ret));
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen array_append(&ips_array, ips, ips_count);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
61cf001f1944d92eb25f113ba4c08985d6e30d53Timo Sirainen array_append_zero(&ips_array);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen set->proxy_self_ips = array_idx(&ips_array, 0);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen return TRUE;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen}
1c3dc4c08ced3948f52c3c6c171ed77310b2cbfdTimo Sirainen
61cf001f1944d92eb25f113ba4c08985d6e30d53Timo Sirainenstatic bool auth_settings_check(void *_set, pool_t pool,
61cf001f1944d92eb25f113ba4c08985d6e30d53Timo Sirainen const char **error_r)
61cf001f1944d92eb25f113ba4c08985d6e30d53Timo Sirainen{
61cf001f1944d92eb25f113ba4c08985d6e30d53Timo Sirainen struct auth_settings *set = _set;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen const char *p;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
1c3dc4c08ced3948f52c3c6c171ed77310b2cbfdTimo Sirainen if (set->debug_passwords)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen set->debug = TRUE;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (set->debug)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen set->verbose = TRUE;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (set->worker_max_count == 0) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen *error_r = "auth_worker_max_count must be above zero";
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen return FALSE;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
b215322367dbd94df3e2e4bb643b53460e6adc51Timo Sirainen if (set->cache_size > 0 && set->cache_size < 1024) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen /* probably a configuration error.
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen older versions used megabyte numbers */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen *error_r = t_strdup_printf("auth_cache_size value is too small "
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen "(%"PRIuUOFF_T" bytes)",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen set->cache_size);
b10c3f9ed997748fdbb03b9daadc8c31eed02120Timo Sirainen return FALSE;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (*set->username_chars == '\0') {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen /* all chars are allowed */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen memset(set->username_chars_map, 1,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen sizeof(set->username_chars_map));
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi } else {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen for (p = set->username_chars; *p != '\0'; p++)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen set->username_chars_map[(int)(uint8_t)*p] = 1;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (*set->username_translation != '\0') {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen p = set->username_translation;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen for (; *p != '\0' && p[1] != '\0'; p += 2)
b215322367dbd94df3e2e4bb643b53460e6adc51Timo Sirainen set->username_translation_map[(int)(uint8_t)*p] = p[1];
b3070aca2aa0dbdcc7f30e6e2bb1f0455127a343Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen set->realms_arr =
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen (const char *const *)p_strsplit_spaces(pool, set->realms, " ");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
7e8bfb5b0af9606f131fc440e61f3752da335ac9Timo Sirainen if (!auth_settings_set_self_ips(set, pool, error_r))
7e8bfb5b0af9606f131fc440e61f3752da335ac9Timo Sirainen return FALSE;
7e8bfb5b0af9606f131fc440e61f3752da335ac9Timo Sirainen return TRUE;
b215322367dbd94df3e2e4bb643b53460e6adc51Timo Sirainen}
b215322367dbd94df3e2e4bb643b53460e6adc51Timo Sirainen
b215322367dbd94df3e2e4bb643b53460e6adc51Timo Sirainenstatic bool
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenauth_passdb_settings_check(void *_set, pool_t pool ATTR_UNUSED,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen const char **error_r)
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi{
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen struct auth_passdb_settings *set = _set;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (set->driver == NULL || *set->driver == '\0') {
4d690a42c4dd10d6508e499c5bab58c45a49d1f3Timo Sirainen *error_r = "passdb is missing driver";
4d690a42c4dd10d6508e499c5bab58c45a49d1f3Timo Sirainen return FALSE;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (set->pass && strcmp(set->result_success, "return-ok") != 0) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen *error_r = "Obsolete pass=yes setting mixed with non-default result_success";
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi return FALSE;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen return TRUE;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen}
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic bool
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenauth_userdb_settings_check(void *_set, pool_t pool ATTR_UNUSED,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen const char **error_r)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen{
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen struct auth_userdb_settings *set = _set;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (set->driver == NULL || *set->driver == '\0') {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen *error_r = "userdb is missing driver";
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen return FALSE;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen return TRUE;
ba57ea2c696f9e9aae909f073069848876a641f4Timo Sirainen}
ba57ea2c696f9e9aae909f073069848876a641f4Timo Sirainen/* </settings checks> */
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstruct auth_settings *global_auth_settings;
ba57ea2c696f9e9aae909f073069848876a641f4Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstruct auth_settings *
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenauth_settings_read(const char *service, pool_t pool,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen struct master_service_settings_output *output_r)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen{
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen static const struct setting_parser_info *set_roots[] = {
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen &auth_setting_parser_info,
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen NULL
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen };
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen struct master_service_settings_input input;
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen struct setting_parser_context *set_parser;
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen const char *error;
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen void **sets;
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen memset(&input, 0, sizeof(input));
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen input.roots = set_roots;
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen input.module = "auth";
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen input.service = service;
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen if (master_service_settings_read(master_service, &input,
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen output_r, &error) < 0)
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen i_fatal("Error reading configuration: %s", error);
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen pool_ref(pool);
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen set_parser = settings_parser_dup(master_service->set_parser, pool);
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen if (!settings_parser_check(set_parser, pool, &error))
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen i_unreached();
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen
bf7dc750b95039981c0e9d728f313d50cf38a156Martti Rannanjärvi sets = master_service_settings_parser_get_others(master_service,
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen set_parser);
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen settings_parser_deinit(&set_parser);
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen return sets[0];
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen}
9abc6ac61e70b809f7e1c352c7a3ad1081994d2eTimo Sirainen