login-settings.c revision a04a1eae9899b33264706cad9fc59fb28428ef31
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2005-2011 Dovecot authors, see the included COPYING file */
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen#include "login-common.h"
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen#include "hostpid.h"
9d92ea347e1c098fa33ea517514dfdc0bb8995e2Timo Sirainen#include "var-expand.h"
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen#include "settings-parser.h"
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen#include "master-service.h"
507ea0bc5b25efb4c96033a19dec66689a50ebd0Baofeng Wang#include "master-service-settings.h"
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen#include "master-service-settings-cache.h"
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen#include "login-settings.h"
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen
507ea0bc5b25efb4c96033a19dec66689a50ebd0Baofeng Wang#include <stddef.h>
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen#include <unistd.h>
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainenstatic bool login_settings_check(void *_set, pool_t pool, const char **error_r);
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen
998395f6743fbecc07ee65ae08c416fa6cea9e09Teemu Huovila#undef DEF
507ea0bc5b25efb4c96033a19dec66689a50ebd0Baofeng Wang#define DEF(type, name) \
507ea0bc5b25efb4c96033a19dec66689a50ebd0Baofeng Wang { type, #name, offsetof(struct login_settings, name), NULL }
507ea0bc5b25efb4c96033a19dec66689a50ebd0Baofeng Wang
eb568e46e82bc814ca3384236a483691a12f9c54Baofeng Wangstatic const struct setting_define login_setting_defines[] = {
eb568e46e82bc814ca3384236a483691a12f9c54Baofeng Wang DEF(SET_STR, login_trusted_networks),
eb568e46e82bc814ca3384236a483691a12f9c54Baofeng Wang DEF(SET_STR_VARS, login_greeting),
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen DEF(SET_STR, login_log_format_elements),
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen DEF(SET_STR, login_log_format),
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen DEF(SET_STR, login_access_sockets),
3448096d5b1cd324ed5132045de0345cd7120a25Timo Sirainen
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen DEF(SET_ENUM, ssl),
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen DEF(SET_STR, ssl_ca),
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen DEF(SET_STR, ssl_cert),
19ed8f08b23d6ed204e6b27e5d1c0c6fe6bb11ddPhil Carmody DEF(SET_STR, ssl_key),
19ed8f08b23d6ed204e6b27e5d1c0c6fe6bb11ddPhil Carmody DEF(SET_STR, ssl_key_password),
19ed8f08b23d6ed204e6b27e5d1c0c6fe6bb11ddPhil Carmody DEF(SET_STR, ssl_cipher_list),
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen DEF(SET_STR, ssl_cert_username_field),
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen DEF(SET_BOOL, ssl_verify_client_cert),
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen DEF(SET_BOOL, auth_ssl_require_client_cert),
b04e76cbc807707d299055be79500f8ff131da43Timo Sirainen DEF(SET_BOOL, auth_ssl_username_from_cert),
b04e76cbc807707d299055be79500f8ff131da43Timo Sirainen DEF(SET_BOOL, verbose_ssl),
72c4ef3b44c50c662b37bba93b463b0caeb63a4fTimo Sirainen
0c5854b6891c59c1c3f443569bc823d7db571582Teemu Huovila DEF(SET_BOOL, disable_plaintext_auth),
19ed8f08b23d6ed204e6b27e5d1c0c6fe6bb11ddPhil Carmody DEF(SET_BOOL, verbose_auth),
19ed8f08b23d6ed204e6b27e5d1c0c6fe6bb11ddPhil Carmody DEF(SET_BOOL, auth_debug),
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen DEF(SET_BOOL, verbose_proctitle),
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen DEF(SET_UINT, mail_max_userip_connections),
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen SETTING_DEFINE_LIST_END
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen};
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen
202468f94e6c6c8b5d3d98ee74e01bb0d0bb04aaTimo Sirainenstatic const struct login_settings login_default_settings = {
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainen .login_trusted_networks = "",
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainen .login_greeting = PACKAGE_NAME" ready.",
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainen .login_log_format_elements = "user=<%u> method=%m rip=%r lip=%l mpid=%e %c",
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainen .login_log_format = "%$: %s",
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainen .login_access_sockets = "",
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen .ssl = "yes:no:required",
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen .ssl_ca = "",
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen .ssl_cert = "",
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen .ssl_key = "",
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen .ssl_key_password = "",
3a54211bd6c4dc3f8687c16020770551cf83a548Teemu Huovila .ssl_cipher_list = "ALL:!LOW:!SSLv2:!EXP:!aNULL",
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen .ssl_cert_username_field = "commonName",
3a54211bd6c4dc3f8687c16020770551cf83a548Teemu Huovila .ssl_verify_client_cert = FALSE,
3a54211bd6c4dc3f8687c16020770551cf83a548Teemu Huovila .auth_ssl_require_client_cert = FALSE,
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen .auth_ssl_username_from_cert = FALSE,
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen .verbose_ssl = FALSE,
f5c0d5cada4da23a167c38426d0c481a3e1d5583Timo Sirainen
f5c0d5cada4da23a167c38426d0c481a3e1d5583Timo Sirainen .disable_plaintext_auth = TRUE,
f5c0d5cada4da23a167c38426d0c481a3e1d5583Timo Sirainen .verbose_auth = FALSE,
f5c0d5cada4da23a167c38426d0c481a3e1d5583Timo Sirainen .auth_debug = FALSE,
f5c0d5cada4da23a167c38426d0c481a3e1d5583Timo Sirainen .verbose_proctitle = FALSE,
f5c0d5cada4da23a167c38426d0c481a3e1d5583Timo Sirainen
f5c0d5cada4da23a167c38426d0c481a3e1d5583Timo Sirainen .mail_max_userip_connections = 10
f5c0d5cada4da23a167c38426d0c481a3e1d5583Timo Sirainen};
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainenconst struct setting_parser_info login_setting_parser_info = {
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen .module_name = "login",
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen .defines = login_setting_defines,
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen .defaults = &login_default_settings,
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen
8b1a9a4d63b0abccdf7cb1acb8359d5396dd657bTimo Sirainen .type_offset = (size_t)-1,
2ac5f36aa7c2e7a07ba8815d43a6d7483f62e74cTimo Sirainen .struct_size = sizeof(struct login_settings),
2ac5f36aa7c2e7a07ba8815d43a6d7483f62e74cTimo Sirainen
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen .parent_offset = (size_t)-1,
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen .check_func = login_settings_check
8b1a9a4d63b0abccdf7cb1acb8359d5396dd657bTimo Sirainen};
507ea0bc5b25efb4c96033a19dec66689a50ebd0Baofeng Wang
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainenstatic const struct setting_parser_info *default_login_set_roots[] = {
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen &login_setting_parser_info,
8b1a9a4d63b0abccdf7cb1acb8359d5396dd657bTimo Sirainen NULL
507ea0bc5b25efb4c96033a19dec66689a50ebd0Baofeng Wang};
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainenconst struct setting_parser_info **login_set_roots = default_login_set_roots;
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainenstatic struct master_service_settings_cache *set_cache;
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen/* <settings checks> */
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainenstatic int ssl_settings_check(void *_set ATTR_UNUSED, const char **error_r)
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen{
8b1a9a4d63b0abccdf7cb1acb8359d5396dd657bTimo Sirainen struct login_settings *set = _set;
507ea0bc5b25efb4c96033a19dec66689a50ebd0Baofeng Wang
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen#ifndef HAVE_SSL
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen *error_r = t_strdup_printf("SSL support not compiled in but ssl=%s",
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen set->ssl);
8b1a9a4d63b0abccdf7cb1acb8359d5396dd657bTimo Sirainen return FALSE;
507ea0bc5b25efb4c96033a19dec66689a50ebd0Baofeng Wang#else
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen if (*set->ssl_cert == '\0') {
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen *error_r = "ssl enabled, but ssl_cert not set";
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen return FALSE;
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen }
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen if (*set->ssl_key == '\0') {
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen *error_r = "ssl enabled, but ssl_key not set";
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen return FALSE;
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen }
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen if (set->ssl_verify_client_cert && *set->ssl_ca == '\0') {
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen *error_r = "ssl_verify_client_cert set, but ssl_ca not";
8b1a9a4d63b0abccdf7cb1acb8359d5396dd657bTimo Sirainen return FALSE;
507ea0bc5b25efb4c96033a19dec66689a50ebd0Baofeng Wang }
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen return TRUE;
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen#endif
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen}
8b1a9a4d63b0abccdf7cb1acb8359d5396dd657bTimo Sirainen
507ea0bc5b25efb4c96033a19dec66689a50ebd0Baofeng Wangstatic bool login_settings_check(void *_set, pool_t pool, const char **error_r)
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen{
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen struct login_settings *set = _set;
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen
0c5854b6891c59c1c3f443569bc823d7db571582Teemu Huovila set->log_format_elements_split =
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen p_strsplit(pool, set->login_log_format_elements, " ");
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen if (set->auth_ssl_require_client_cert ||
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen set->auth_ssl_username_from_cert) {
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen /* if we require valid cert, make sure we also ask for it */
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen set->ssl_verify_client_cert = TRUE;
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen }
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen if (strcmp(set->ssl, "no") == 0) {
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen /* disabled */
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen } else if (strcmp(set->ssl, "yes") == 0) {
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen if (!ssl_settings_check(set, error_r))
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen return FALSE;
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen } else if (strcmp(set->ssl, "required") == 0) {
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen if (!ssl_settings_check(set, error_r))
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen return FALSE;
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen set->disable_plaintext_auth = TRUE;
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen } else {
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen *error_r = t_strdup_printf("Unknown ssl setting value: %s",
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen set->ssl);
3448096d5b1cd324ed5132045de0345cd7120a25Timo Sirainen return FALSE;
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen }
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen return TRUE;
19ed8f08b23d6ed204e6b27e5d1c0c6fe6bb11ddPhil Carmody}
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen/* </settings checks> */
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen
78f87ea1d30f3f54bdf8560ea947ab7ee094283aTeemu Huovilastatic const struct var_expand_table *
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainenlogin_set_var_expand_table(const struct master_service_settings_input *input)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen{
b04e76cbc807707d299055be79500f8ff131da43Timo Sirainen static struct var_expand_table static_tab[] = {
b04e76cbc807707d299055be79500f8ff131da43Timo Sirainen { 'l', NULL, "lip" },
0c5854b6891c59c1c3f443569bc823d7db571582Teemu Huovila { 'r', NULL, "rip" },
0c5854b6891c59c1c3f443569bc823d7db571582Teemu Huovila { 'p', NULL, "pid" },
0c5854b6891c59c1c3f443569bc823d7db571582Teemu Huovila { 's', NULL, "service" },
19ed8f08b23d6ed204e6b27e5d1c0c6fe6bb11ddPhil Carmody { '\0', NULL, NULL }
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen };
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen struct var_expand_table *tab;
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen tab = t_malloc(sizeof(static_tab));
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen memcpy(tab, static_tab, sizeof(static_tab));
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen tab[0].value = net_ip2addr(&input->local_ip);
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen tab[1].value = net_ip2addr(&input->remote_ip);
202468f94e6c6c8b5d3d98ee74e01bb0d0bb04aaTimo Sirainen tab[2].value = my_pid;
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainen tab[3].value = input->service;
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainen return tab;
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainen}
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainen
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainenstruct login_settings *
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenlogin_settings_read(pool_t pool,
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen const struct ip_addr *local_ip,
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen const struct ip_addr *remote_ip,
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen const char *local_name,
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen void ***other_settings_r)
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen{
3a54211bd6c4dc3f8687c16020770551cf83a548Teemu Huovila struct master_service_settings_input input;
3a54211bd6c4dc3f8687c16020770551cf83a548Teemu Huovila const char *error;
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen const struct setting_parser_context *parser;
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen void *const *cache_sets;
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen void **sets;
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen unsigned int i, count;
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen memset(&input, 0, sizeof(input));
f5c0d5cada4da23a167c38426d0c481a3e1d5583Timo Sirainen input.roots = login_set_roots;
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen input.module = login_binary.process_name;
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen input.service = login_binary.protocol;
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen input.local_name = local_name;
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen if (local_ip != NULL)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen input.local_ip = *local_ip;
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen if (remote_ip != NULL)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen input.remote_ip = *remote_ip;
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen if (set_cache == NULL) {
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen set_cache = master_service_settings_cache_init(master_service,
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen input.module,
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen input.service);
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen }
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen
3448096d5b1cd324ed5132045de0345cd7120a25Timo Sirainen if (master_service_settings_cache_read(set_cache, &input, NULL,
fdf70410de49eadfbb77997bb60ebba19aee4752Teemu Huovila &parser, &error) < 0)
fdf70410de49eadfbb77997bb60ebba19aee4752Teemu Huovila i_fatal("Error reading configuration: %s", error);
19ed8f08b23d6ed204e6b27e5d1c0c6fe6bb11ddPhil Carmody
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen cache_sets = settings_parser_get_list(parser) + 1;
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen for (count = 0; input.roots[count] != NULL; count++) ;
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen i_assert(cache_sets[count] == NULL);
fdf70410de49eadfbb77997bb60ebba19aee4752Teemu Huovila sets = p_new(pool, void *, count + 1);
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen for (i = 0; i < count; i++) {
b04e76cbc807707d299055be79500f8ff131da43Timo Sirainen sets[i] = settings_dup(input.roots[i], cache_sets[i], pool);
b04e76cbc807707d299055be79500f8ff131da43Timo Sirainen if (!settings_check(input.roots[i], pool, sets[i], &error)) {
0c5854b6891c59c1c3f443569bc823d7db571582Teemu Huovila const char *name = input.roots[i]->module_name;
0c5854b6891c59c1c3f443569bc823d7db571582Teemu Huovila i_fatal("settings_check(%s) failed: %s",
0c5854b6891c59c1c3f443569bc823d7db571582Teemu Huovila name != NULL ? name : "unknown", error);
19ed8f08b23d6ed204e6b27e5d1c0c6fe6bb11ddPhil Carmody }
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen }
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen settings_var_expand(&login_setting_parser_info, sets[0], pool,
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen login_set_var_expand_table(&input));
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen *other_settings_r = sets + 1;
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen return sets[0];
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen}
202468f94e6c6c8b5d3d98ee74e01bb0d0bb04aaTimo Sirainen
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainenvoid login_settings_deinit(void)
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainen{
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainen if (set_cache != NULL)
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainen master_service_settings_cache_deinit(&set_cache);
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainen}
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen