auth-settings.c revision ab90f702ceedb7ba445a9a592be0b213b27cbafa
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2005-2012 Dovecot authors, see the included COPYING file */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "lib.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "array.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "settings-parser.h"
5d60e31c7b701b606067a20bc88dcc8a6de7bbd6Timo Sirainen#include "master-service-private.h"
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#include "master-service-settings.h"
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen#include "service-settings.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "auth-settings.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include <stddef.h>
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
d477acb83e14a776ece4ca94dcd1869e75d0c6eeTimo Sirainenstatic bool auth_settings_check(void *_set, pool_t pool, const char **error_r);
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainenstatic bool auth_passdb_settings_check(void *_set, pool_t pool, const char **error_r);
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainenstatic bool auth_userdb_settings_check(void *_set, pool_t pool, const char **error_r);
d477acb83e14a776ece4ca94dcd1869e75d0c6eeTimo Sirainen
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen/* <settings checks> */
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainenstatic struct file_listener_settings auth_unix_listeners_array[] = {
daa7e7459749ae8f82cd3eed9c44522d81c609a3Timo Sirainen { "login/login", 0666, "", "" },
ab90f702ceedb7ba445a9a592be0b213b27cbafaStephan Bosch { "token-login/token-login", 0666, "", "" },
bbadd5331f534017cf62d5183003b3d9fdad079eTimo Sirainen { "auth-login", 0600, "$default_internal_user", "" },
373492be949e159fda651807b3acda2c5c077027Timo Sirainen { "auth-client", 0600, "", "" },
72f5f2c5c6905b5d3f389b424313e2c450dfad96Timo Sirainen { "auth-userdb", 0666, "$default_internal_user", "" },
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen { "auth-master", 0600, "", "" }
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen};
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainenstatic struct file_listener_settings *auth_unix_listeners[] = {
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen &auth_unix_listeners_array[0],
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen &auth_unix_listeners_array[1],
373492be949e159fda651807b3acda2c5c077027Timo Sirainen &auth_unix_listeners_array[2],
bbadd5331f534017cf62d5183003b3d9fdad079eTimo Sirainen &auth_unix_listeners_array[3],
ab90f702ceedb7ba445a9a592be0b213b27cbafaStephan Bosch &auth_unix_listeners_array[4],
ab90f702ceedb7ba445a9a592be0b213b27cbafaStephan Bosch &auth_unix_listeners_array[5]
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen};
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainenstatic buffer_t auth_unix_listeners_buf = {
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen auth_unix_listeners, sizeof(auth_unix_listeners), { 0, }
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen};
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen/* </settings checks> */
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainenstruct service_settings auth_service_settings = {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .name = "auth",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .protocol = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .type = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .executable = "auth",
635df5b4cbcd7b24c825e01d9dd66d3a4274c4c7Timo Sirainen .user = "$default_internal_user",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .group = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .privileged_group = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .extra_groups = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .chroot = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .drop_priv_before_exec = FALSE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .process_min_avail = 0,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .process_limit = 1,
51fb710488efa419a2964335c30451c62b9633b1Timo Sirainen .client_limit = 0,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .service_count = 0,
93a7d1ee4b518b5c85f9721dc6539e4dab6aae00Timo Sirainen .idle_kill = 0,
f7f25f9e1a38678d0e97d2e609beac16285fac6bTimo Sirainen .vsz_limit = (uoff_t)-1,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .unix_listeners = { { &auth_unix_listeners_buf,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen sizeof(auth_unix_listeners[0]) } },
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .fifo_listeners = ARRAY_INIT,
35fcdde46a71ac151c2518d48c841019f1181bb2Timo Sirainen .inet_listeners = ARRAY_INIT,
35fcdde46a71ac151c2518d48c841019f1181bb2Timo Sirainen
35fcdde46a71ac151c2518d48c841019f1181bb2Timo Sirainen .process_limit_1 = TRUE
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen};
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen/* <settings checks> */
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainenstatic struct file_listener_settings auth_worker_unix_listeners_array[] = {
635df5b4cbcd7b24c825e01d9dd66d3a4274c4c7Timo Sirainen { "auth-worker", 0600, "$default_internal_user", "" }
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen};
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainenstatic struct file_listener_settings *auth_worker_unix_listeners[] = {
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen &auth_worker_unix_listeners_array[0]
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen};
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainenstatic buffer_t auth_worker_unix_listeners_buf = {
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen auth_worker_unix_listeners, sizeof(auth_worker_unix_listeners), { 0, }
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen};
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen/* </settings checks> */
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainenstruct service_settings auth_worker_service_settings = {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .name = "auth-worker",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .protocol = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .type = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .executable = "auth -w",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .user = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .group = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .privileged_group = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .extra_groups = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .chroot = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .drop_priv_before_exec = FALSE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .process_min_avail = 0,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .process_limit = 0,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .client_limit = 1,
ba8498efbf886ca8b69fdb20c0ba2f5dba9416e3Timo Sirainen .service_count = 1,
93a7d1ee4b518b5c85f9721dc6539e4dab6aae00Timo Sirainen .idle_kill = 0,
f7f25f9e1a38678d0e97d2e609beac16285fac6bTimo Sirainen .vsz_limit = (uoff_t)-1,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .unix_listeners = { { &auth_worker_unix_listeners_buf,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen sizeof(auth_worker_unix_listeners[0]) } },
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .fifo_listeners = ARRAY_INIT,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .inet_listeners = ARRAY_INIT
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen};
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#undef DEF
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#define DEF(type, name) \
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen { type, #name, offsetof(struct auth_passdb_settings, name), NULL }
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainenstatic const struct setting_define auth_passdb_setting_defines[] = {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, driver),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, args),
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen DEF(SET_STR, default_fields),
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen DEF(SET_STR, override_fields),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, deny),
380dbb60ae291cbe39d1f710284562ca9167150bTimo Sirainen DEF(SET_BOOL, pass),
380dbb60ae291cbe39d1f710284562ca9167150bTimo Sirainen DEF(SET_BOOL, master),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen SETTING_DEFINE_LIST_END
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen};
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
1b823b2b7790a1e1b7974fcf11a4c48a28e70f37Timo Sirainenstatic const struct auth_passdb_settings auth_passdb_default_settings = {
3cf67672fdc87583cb23ce088c95bb5dee60e74dTimo Sirainen .driver = "",
3cf67672fdc87583cb23ce088c95bb5dee60e74dTimo Sirainen .args = "",
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen .default_fields = "",
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen .override_fields = "",
3cf67672fdc87583cb23ce088c95bb5dee60e74dTimo Sirainen .deny = FALSE,
3cf67672fdc87583cb23ce088c95bb5dee60e74dTimo Sirainen .pass = FALSE,
3cf67672fdc87583cb23ce088c95bb5dee60e74dTimo Sirainen .master = FALSE
3cf67672fdc87583cb23ce088c95bb5dee60e74dTimo Sirainen};
3cf67672fdc87583cb23ce088c95bb5dee60e74dTimo Sirainen
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainenconst struct setting_parser_info auth_passdb_setting_parser_info = {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .defines = auth_passdb_setting_defines,
1b823b2b7790a1e1b7974fcf11a4c48a28e70f37Timo Sirainen .defaults = &auth_passdb_default_settings,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen .type_offset = (size_t)-1,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .struct_size = sizeof(struct auth_passdb_settings),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .parent_offset = (size_t)-1,
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen .parent = &auth_setting_parser_info,
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen .check_func = auth_passdb_settings_check
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen};
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#undef DEF
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#define DEF(type, name) \
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen { type, #name, offsetof(struct auth_userdb_settings, name), NULL }
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainenstatic const struct setting_define auth_userdb_setting_defines[] = {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, driver),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, args),
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen DEF(SET_STR, default_fields),
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen DEF(SET_STR, override_fields),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen SETTING_DEFINE_LIST_END
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen};
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
1b823b2b7790a1e1b7974fcf11a4c48a28e70f37Timo Sirainenstatic const struct auth_userdb_settings auth_userdb_default_settings = {
3cf67672fdc87583cb23ce088c95bb5dee60e74dTimo Sirainen .driver = "",
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen .args = "",
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen .default_fields = "",
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen .override_fields = ""
3cf67672fdc87583cb23ce088c95bb5dee60e74dTimo Sirainen};
3cf67672fdc87583cb23ce088c95bb5dee60e74dTimo Sirainen
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainenconst struct setting_parser_info auth_userdb_setting_parser_info = {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .defines = auth_userdb_setting_defines,
1b823b2b7790a1e1b7974fcf11a4c48a28e70f37Timo Sirainen .defaults = &auth_userdb_default_settings,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen .type_offset = (size_t)-1,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .struct_size = sizeof(struct auth_userdb_settings),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .parent_offset = (size_t)-1,
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen .parent = &auth_setting_parser_info,
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen .check_func = auth_userdb_settings_check
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen};
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
57d2429fae575e96ca276355af675deb66b76d00Timo Sirainen/* we're kind of kludging here to avoid "auth_" prefix in the struct fields */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#undef DEF
401b0787fff2dc986a5321ddb32acb1947ff66b0Timo Sirainen#undef DEF_NOPREFIX
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#undef DEFLIST
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#define DEF(type, name) \
57d2429fae575e96ca276355af675deb66b76d00Timo Sirainen { type, "auth_"#name, offsetof(struct auth_settings, name), NULL }
401b0787fff2dc986a5321ddb32acb1947ff66b0Timo Sirainen#define DEF_NOPREFIX(type, name) \
401b0787fff2dc986a5321ddb32acb1947ff66b0Timo Sirainen { type, #name, offsetof(struct auth_settings, name), NULL }
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#define DEFLIST(field, name, defines) \
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen { SET_DEFLIST, name, offsetof(struct auth_settings, field), defines }
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainenstatic const struct setting_define auth_setting_defines[] = {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, mechanisms),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, realms),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, default_realm),
61618d4c58080570f689614fec204ae14e90cef2Timo Sirainen DEF(SET_SIZE, cache_size),
50e20db49f29917fe9adcf1b56b11badf28bd0e4Timo Sirainen DEF(SET_TIME, cache_ttl),
50e20db49f29917fe9adcf1b56b11badf28bd0e4Timo Sirainen DEF(SET_TIME, cache_negative_ttl),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, username_chars),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, username_translation),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, username_format),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, master_user_separator),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, anonymous_username),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, krb5_keytab),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, gssapi_hostname),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, winbind_helper_path),
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen DEF(SET_STR, proxy_self),
50e20db49f29917fe9adcf1b56b11badf28bd0e4Timo Sirainen DEF(SET_TIME, failure_delay),
a7f5035eebbd138a5436a2eb2ce1fa5fd3d269fbTimo Sirainen DEF(SET_UINT, first_valid_uid),
a7f5035eebbd138a5436a2eb2ce1fa5fd3d269fbTimo Sirainen DEF(SET_UINT, last_valid_uid),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, verbose),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, debug),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, debug_passwords),
c6f894e1522f7b0b6068c228900914073c145175Timo Sirainen DEF(SET_ENUM, verbose_passwords),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, ssl_require_client_cert),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, ssl_username_from_cert),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, use_winbind),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_UINT, worker_max_count),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEFLIST(passdbs, "passdb", &auth_passdb_setting_parser_info),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEFLIST(userdbs, "userdb", &auth_userdb_setting_parser_info),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
1da01eaa962be13cee75771064e2256b1a82d90aTimo Sirainen DEF_NOPREFIX(SET_STR, base_dir),
401b0787fff2dc986a5321ddb32acb1947ff66b0Timo Sirainen DEF_NOPREFIX(SET_BOOL, verbose_proctitle),
401b0787fff2dc986a5321ddb32acb1947ff66b0Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen SETTING_DEFINE_LIST_END
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen};
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainenstatic const struct auth_settings auth_default_settings = {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .mechanisms = "plain",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .realms = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .default_realm = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .cache_size = 0,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .cache_ttl = 60*60,
f2df3069766c747cbf020fea5d3a4261949064b0Timo Sirainen .cache_negative_ttl = 60*60,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .username_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .username_translation = "",
062ea54b7775d0c92ed67b9b1f4d93fa8ec80c84Timo Sirainen .username_format = "%Lu",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .master_user_separator = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .anonymous_username = "anonymous",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .krb5_keytab = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .gssapi_hostname = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .winbind_helper_path = "/usr/bin/ntlm_auth",
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen .proxy_self = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .failure_delay = 2,
a7f5035eebbd138a5436a2eb2ce1fa5fd3d269fbTimo Sirainen .first_valid_uid = 500,
a7f5035eebbd138a5436a2eb2ce1fa5fd3d269fbTimo Sirainen .last_valid_uid = 0,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .verbose = FALSE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .debug = FALSE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .debug_passwords = FALSE,
c6f894e1522f7b0b6068c228900914073c145175Timo Sirainen .verbose_passwords = "no:plain:sha1",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .ssl_require_client_cert = FALSE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .ssl_username_from_cert = FALSE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .use_winbind = FALSE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .worker_max_count = 30,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .passdbs = ARRAY_INIT,
401b0787fff2dc986a5321ddb32acb1947ff66b0Timo Sirainen .userdbs = ARRAY_INIT,
401b0787fff2dc986a5321ddb32acb1947ff66b0Timo Sirainen
1da01eaa962be13cee75771064e2256b1a82d90aTimo Sirainen .base_dir = PKG_RUNDIR,
401b0787fff2dc986a5321ddb32acb1947ff66b0Timo Sirainen .verbose_proctitle = FALSE
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen};
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainenconst struct setting_parser_info auth_setting_parser_info = {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .module_name = "auth",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .defines = auth_setting_defines,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .defaults = &auth_default_settings,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .type_offset = (size_t)-1,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .struct_size = sizeof(struct auth_settings),
383d0e8c24451468d6bea17e4b55d74de744abe6Timo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .parent_offset = (size_t)-1,
383d0e8c24451468d6bea17e4b55d74de744abe6Timo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .check_func = auth_settings_check
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen};
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
d477acb83e14a776ece4ca94dcd1869e75d0c6eeTimo Sirainen/* <settings checks> */
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainenstatic bool
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainenauth_settings_set_self_ips(struct auth_settings *set, pool_t pool,
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen const char **error_r)
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen{
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen const char *const *tmp;
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen ARRAY(struct ip_addr) ips_array;
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen struct ip_addr *ips;
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen unsigned int ips_count;
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen int ret;
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen if (*set->proxy_self == '\0') {
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen set->proxy_self_ips = p_new(pool, struct ip_addr, 1);
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen return TRUE;
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen }
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen p_array_init(&ips_array, pool, 4);
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen tmp = t_strsplit_spaces(set->proxy_self, " ");
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen for (; *tmp != NULL; tmp++) {
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen ret = net_gethostbyname(*tmp, &ips, &ips_count);
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen if (ret != 0) {
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen *error_r = t_strdup_printf("auth_proxy_self_ips: "
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen "gethostbyname(%s) failed: %s",
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen *tmp, net_gethosterror(ret));
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen }
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen array_append(&ips_array, ips, ips_count);
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen }
31a574fda352ef4f71dbff9c30e15e4744e132c0Timo Sirainen array_append_zero(&ips_array);
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen set->proxy_self_ips = array_idx(&ips_array, 0);
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen return TRUE;
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen}
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainenstatic bool auth_settings_check(void *_set, pool_t pool,
4fc74bba3548987b7e8597491cd9fafc1f701be6Timo Sirainen const char **error_r)
d477acb83e14a776ece4ca94dcd1869e75d0c6eeTimo Sirainen{
d477acb83e14a776ece4ca94dcd1869e75d0c6eeTimo Sirainen struct auth_settings *set = _set;
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen const char *p;
d477acb83e14a776ece4ca94dcd1869e75d0c6eeTimo Sirainen
15f526e5ac611b4532568d131fcd0abf664abe41Timo Sirainen if (set->debug_passwords)
15f526e5ac611b4532568d131fcd0abf664abe41Timo Sirainen set->debug = TRUE;
15f526e5ac611b4532568d131fcd0abf664abe41Timo Sirainen if (set->debug)
15f526e5ac611b4532568d131fcd0abf664abe41Timo Sirainen set->verbose = TRUE;
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen if (set->worker_max_count == 0) {
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen *error_r = "auth_worker_max_count must be above zero";
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen return FALSE;
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen }
f93c833d644ecff0b0f80bee4f1cdde3e697b5c8Timo Sirainen
6bd263caf006edc75205f446fa0283c6f364941bTimo Sirainen if (set->cache_size > 0 && set->cache_size < 1024) {
4fc74bba3548987b7e8597491cd9fafc1f701be6Timo Sirainen /* probably a configuration error.
4fc74bba3548987b7e8597491cd9fafc1f701be6Timo Sirainen older versions used megabyte numbers */
4fc74bba3548987b7e8597491cd9fafc1f701be6Timo Sirainen *error_r = t_strdup_printf("auth_cache_size value is too small "
4fc74bba3548987b7e8597491cd9fafc1f701be6Timo Sirainen "(%"PRIuUOFF_T" bytes)",
4fc74bba3548987b7e8597491cd9fafc1f701be6Timo Sirainen set->cache_size);
4fc74bba3548987b7e8597491cd9fafc1f701be6Timo Sirainen return FALSE;
4fc74bba3548987b7e8597491cd9fafc1f701be6Timo Sirainen }
4fc74bba3548987b7e8597491cd9fafc1f701be6Timo Sirainen
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen if (*set->username_chars == '\0') {
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen /* all chars are allowed */
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen memset(set->username_chars_map, 1,
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen sizeof(set->username_chars_map));
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen } else {
0f62889d833767acf9c2ad010c3269806b4cfae3Timo Sirainen for (p = set->username_chars; *p != '\0'; p++)
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen set->username_chars_map[(int)(uint8_t)*p] = 1;
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen }
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen if (*set->username_translation != '\0') {
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen p = set->username_translation;
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen for (; *p != '\0' && p[1] != '\0'; p += 2)
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen set->username_translation_map[(int)(uint8_t)*p] = p[1];
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen }
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen set->realms_arr =
7289c5600711b45f30fe289ab5b0293b51d87041Timo Sirainen (const char *const *)p_strsplit_spaces(pool, set->realms, " ");
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen if (!auth_settings_set_self_ips(set, pool, error_r))
738cfeb96c4b9cd92aa3c791d77734c2745cdd1aTimo Sirainen return FALSE;
d477acb83e14a776ece4ca94dcd1869e75d0c6eeTimo Sirainen return TRUE;
d477acb83e14a776ece4ca94dcd1869e75d0c6eeTimo Sirainen}
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainenstatic bool
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainenauth_passdb_settings_check(void *_set, pool_t pool ATTR_UNUSED,
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen const char **error_r)
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen{
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen struct auth_passdb_settings *set = _set;
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen if (set->driver == NULL || *set->driver == '\0') {
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen *error_r = "passdb is missing driver";
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen return FALSE;
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen }
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen return TRUE;
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen}
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainenstatic bool
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainenauth_userdb_settings_check(void *_set, pool_t pool ATTR_UNUSED,
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen const char **error_r)
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen{
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen struct auth_userdb_settings *set = _set;
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen if (set->driver == NULL || *set->driver == '\0') {
272aca0a772140d3a45a425a3fd67854ae2ccec2Timo Sirainen *error_r = "userdb is missing driver";
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen return FALSE;
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen }
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen return TRUE;
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen}
d477acb83e14a776ece4ca94dcd1869e75d0c6eeTimo Sirainen/* </settings checks> */
d477acb83e14a776ece4ca94dcd1869e75d0c6eeTimo Sirainen
1d22eaac93de41319918a1fc6de42bb302e25c1aTimo Sirainenstruct auth_settings *global_auth_settings;
1d22eaac93de41319918a1fc6de42bb302e25c1aTimo Sirainen
5d60e31c7b701b606067a20bc88dcc8a6de7bbd6Timo Sirainenstruct auth_settings *
5d60e31c7b701b606067a20bc88dcc8a6de7bbd6Timo Sirainenauth_settings_read(const char *service, pool_t pool,
5d60e31c7b701b606067a20bc88dcc8a6de7bbd6Timo Sirainen struct master_service_settings_output *output_r)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen static const struct setting_parser_info *set_roots[] = {
2024157e8de36edd31f5fd72f5ea7364a0955fa7Timo Sirainen &auth_setting_parser_info,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen NULL
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen };
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen struct master_service_settings_input input;
5d60e31c7b701b606067a20bc88dcc8a6de7bbd6Timo Sirainen struct setting_parser_context *set_parser;
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen struct auth_settings *set;
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen const char *error;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen memset(&input, 0, sizeof(input));
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen input.roots = set_roots;
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen input.module = "auth";
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen input.service = service;
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen if (master_service_settings_read(master_service, &input,
5d60e31c7b701b606067a20bc88dcc8a6de7bbd6Timo Sirainen output_r, &error) < 0)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen i_fatal("Error reading configuration: %s", error);
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen pool_ref(pool);
5d60e31c7b701b606067a20bc88dcc8a6de7bbd6Timo Sirainen set_parser = settings_parser_dup(master_service->set_parser, pool);
5d60e31c7b701b606067a20bc88dcc8a6de7bbd6Timo Sirainen if (!settings_parser_check(set_parser, pool, &error))
5d60e31c7b701b606067a20bc88dcc8a6de7bbd6Timo Sirainen i_unreached();
5d60e31c7b701b606067a20bc88dcc8a6de7bbd6Timo Sirainen
9d002e700183db29073954db349913e5e025e8a9Timo Sirainen set = settings_parser_get_list(set_parser)[MASTER_SERVICE_INTERNAL_SET_PARSERS];
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen settings_parser_deinit(&set_parser);
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen return set;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen}