login-settings.c revision 9d6307357b77c1006fff39f324d4f536d456b170
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2005-2010 Dovecot authors, see the included COPYING file */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
46552a931924c2d743f045e95b08c3ce6beda91aTimo Sirainen#include "login-common.h"
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen#include "hostpid.h"
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen#include "var-expand.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "settings-parser.h"
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen#include "master-service.h"
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#include "master-service-settings.h"
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen#include "master-service-settings-cache.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "login-settings.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include <stddef.h>
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include <unistd.h>
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
d63b4241643b6014d49ff356f14e0f3ee43068a8Timo Sirainenstatic bool login_settings_check(void *_set, pool_t pool, const char **error_r);
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#undef DEF
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#define DEF(type, name) \
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen { type, #name, offsetof(struct login_settings, name), NULL }
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainenstatic const struct setting_define login_setting_defines[] = {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, login_trusted_networks),
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen DEF(SET_STR_VARS, login_greeting),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, login_log_format_elements),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, login_log_format),
79977d368df2efc3f3dc0bbb260748b076538103Timo Sirainen DEF(SET_STR, login_access_sockets),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_ENUM, ssl),
277c0eea825eec176cddc029af68f5a4d942e16eTimo Sirainen DEF(SET_STR, ssl_ca),
02a0492affdff138f43903c19ca366363923044dTimo Sirainen DEF(SET_STR, ssl_cert),
02a0492affdff138f43903c19ca366363923044dTimo Sirainen DEF(SET_STR, ssl_key),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, ssl_key_password),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, ssl_parameters_file),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, ssl_cipher_list),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, ssl_cert_username_field),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, ssl_verify_client_cert),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, ssl_require_client_cert),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, ssl_username_from_cert),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, verbose_ssl),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, disable_plaintext_auth),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, verbose_auth),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, auth_debug),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_BOOL, verbose_proctitle),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen DEF(SET_UINT, mail_max_userip_connections),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen SETTING_DEFINE_LIST_END
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen};
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainenstatic const struct login_settings login_default_settings = {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .login_trusted_networks = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .login_greeting = PACKAGE_NAME" ready.",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .login_log_format_elements = "user=<%u> method=%m rip=%r lip=%l %c",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .login_log_format = "%$: %s",
79977d368df2efc3f3dc0bbb260748b076538103Timo Sirainen .login_access_sockets = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .ssl = "yes:no:required",
277c0eea825eec176cddc029af68f5a4d942e16eTimo Sirainen .ssl_ca = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .ssl_cert = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .ssl_key = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .ssl_key_password = "",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .ssl_parameters_file = "ssl-parameters.dat",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .ssl_cipher_list = "ALL:!LOW:!SSLv2:!EXP:!aNULL",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .ssl_cert_username_field = "commonName",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .ssl_verify_client_cert = FALSE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .ssl_require_client_cert = FALSE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .ssl_username_from_cert = FALSE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .verbose_ssl = FALSE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .disable_plaintext_auth = TRUE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .verbose_auth = FALSE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .auth_debug = FALSE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .verbose_proctitle = FALSE,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .mail_max_userip_connections = 10
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen};
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainenconst struct setting_parser_info login_setting_parser_info = {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .module_name = "login",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .defines = login_setting_defines,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .defaults = &login_default_settings,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .type_offset = (size_t)-1,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .struct_size = sizeof(struct login_settings),
383d0e8c24451468d6bea17e4b55d74de744abe6Timo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .parent_offset = (size_t)-1,
383d0e8c24451468d6bea17e4b55d74de744abe6Timo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .check_func = login_settings_check
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen};
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainenstatic const struct setting_parser_info *default_login_set_roots[] = {
7ceee001c11865a88a311c50c4430867b2d32ce6Timo Sirainen &login_setting_parser_info,
7ceee001c11865a88a311c50c4430867b2d32ce6Timo Sirainen NULL
7ceee001c11865a88a311c50c4430867b2d32ce6Timo Sirainen};
7ceee001c11865a88a311c50c4430867b2d32ce6Timo Sirainen
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainenconst struct setting_parser_info **login_set_roots = default_login_set_roots;
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainenstatic struct master_service_settings_cache *set_cache;
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen/* <settings checks> */
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainenstatic int ssl_settings_check(void *_set ATTR_UNUSED, const char **error_r)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen{
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen struct login_settings *set = _set;
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#ifndef HAVE_SSL
ce8a6f53ea3ce91b759a54b771e1779564de19a1Timo Sirainen *error_r = t_strdup_printf("SSL support not compiled in but ssl=%s",
ce8a6f53ea3ce91b759a54b771e1779564de19a1Timo Sirainen set->ssl);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen return FALSE;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#else
02a0492affdff138f43903c19ca366363923044dTimo Sirainen if (*set->ssl_cert == '\0') {
02a0492affdff138f43903c19ca366363923044dTimo Sirainen *error_r = "ssl enabled, but ssl_cert not set";
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen return FALSE;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen }
02a0492affdff138f43903c19ca366363923044dTimo Sirainen if (*set->ssl_key == '\0') {
02a0492affdff138f43903c19ca366363923044dTimo Sirainen *error_r = "ssl enabled, but ssl_key not set";
1cbc0c6372d24168962698c5f4d3e15df8943ebfTimo Sirainen return FALSE;
1cbc0c6372d24168962698c5f4d3e15df8943ebfTimo Sirainen }
277c0eea825eec176cddc029af68f5a4d942e16eTimo Sirainen if (set->ssl_verify_client_cert && *set->ssl_ca == '\0') {
277c0eea825eec176cddc029af68f5a4d942e16eTimo Sirainen *error_r = "ssl_verify_client_cert set, but ssl_ca not";
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen return FALSE;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen }
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen return TRUE;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#endif
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen}
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainenstatic bool login_settings_check(void *_set, pool_t pool, const char **error_r)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen{
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen struct login_settings *set = _set;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen set->log_format_elements_split =
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainen p_strsplit(pool, set->login_log_format_elements, " ");
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (set->ssl_require_client_cert || set->ssl_username_from_cert) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* if we require valid cert, make sure we also ask for it */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen set->ssl_verify_client_cert = TRUE;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen }
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen if (strcmp(set->ssl, "no") == 0) {
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen /* disabled */
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen } else if (strcmp(set->ssl, "yes") == 0) {
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen if (!ssl_settings_check(set, error_r))
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen return FALSE;
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen } else if (strcmp(set->ssl, "required") == 0) {
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen if (!ssl_settings_check(set, error_r))
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen return FALSE;
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen set->disable_plaintext_auth = TRUE;
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen } else {
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen *error_r = t_strdup_printf("Unknown ssl setting value: %s",
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen set->ssl);
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen return FALSE;
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen }
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen return TRUE;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen}
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen/* </settings checks> */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainenstatic const struct var_expand_table *
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainenlogin_set_var_expand_table(const struct master_service_settings_input *input)
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen{
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen static struct var_expand_table static_tab[] = {
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen { 'l', NULL, "lip" },
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen { 'r', NULL, "rip" },
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen { 'p', NULL, "pid" },
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen { 's', NULL, "service" },
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen { '\0', NULL, NULL }
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen };
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen struct var_expand_table *tab;
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen tab = t_malloc(sizeof(static_tab));
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen memcpy(tab, static_tab, sizeof(static_tab));
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen tab[0].value = net_ip2addr(&input->local_ip);
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen tab[1].value = net_ip2addr(&input->remote_ip);
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen tab[2].value = my_pid;
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen tab[3].value = input->service;
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen return tab;
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen}
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainenstruct login_settings *
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainenlogin_settings_read(pool_t pool,
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainen const struct ip_addr *local_ip,
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen const struct ip_addr *remote_ip,
71b5ad1df203c906d46960b0400564609b97a6c8Timo Sirainen const char *local_host,
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen void ***other_settings_r)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen{
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen struct master_service_settings_input input;
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen const char *error;
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen const struct setting_parser_context *parser;
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen void *const *cache_sets;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen void **sets;
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen unsigned int i, count;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen memset(&input, 0, sizeof(input));
7ceee001c11865a88a311c50c4430867b2d32ce6Timo Sirainen input.roots = login_set_roots;
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen input.module = login_process_name;
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen input.service = login_protocol;
71b5ad1df203c906d46960b0400564609b97a6c8Timo Sirainen input.local_host = local_host;
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainen if (local_ip != NULL)
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainen input.local_ip = *local_ip;
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainen if (remote_ip != NULL)
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainen input.remote_ip = *remote_ip;
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainen
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen if (set_cache == NULL) {
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen set_cache = master_service_settings_cache_init(master_service,
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen input.module,
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen input.service);
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen }
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen if (master_service_settings_cache_read(set_cache, &input,
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen &parser, &error) < 0)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen i_fatal("Error reading configuration: %s", error);
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen cache_sets = settings_parser_get_list(parser) + 1;
9d6307357b77c1006fff39f324d4f536d456b170Timo Sirainen for (count = 0; input.roots[count] != NULL; count++) ;
9d6307357b77c1006fff39f324d4f536d456b170Timo Sirainen i_assert(cache_sets[count] == NULL);
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen sets = p_new(pool, void *, count + 1);
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen for (i = 0; i < count; i++) {
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen sets[i] = settings_dup(input.roots[i], cache_sets[i], pool);
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen if (!settings_check(input.roots[i], pool, sets[i], &error)) {
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen const char *name = input.roots[i]->module_name;
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen i_fatal("settings_check(%s) failed: %s",
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen name != NULL ? name : "unknown", error);
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen }
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen }
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen settings_var_expand(&login_setting_parser_info, sets[0], pool,
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen login_set_var_expand_table(&input));
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen *other_settings_r = sets + 1;
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen return sets[0];
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen}
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainenvoid login_settings_deinit(void)
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen{
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen if (set_cache != NULL)
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen master_service_settings_cache_deinit(&set_cache);
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen}