login-settings.c revision a04a1eae9899b33264706cad9fc59fb28428ef31
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2005-2011 Dovecot authors, see the included COPYING file */
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainenstatic bool login_settings_check(void *_set, pool_t pool, const char **error_r);
507ea0bc5b25efb4c96033a19dec66689a50ebd0Baofeng Wang { type, #name, offsetof(struct login_settings, name), NULL }
eb568e46e82bc814ca3384236a483691a12f9c54Baofeng Wangstatic const struct setting_define login_setting_defines[] = {
202468f94e6c6c8b5d3d98ee74e01bb0d0bb04aaTimo Sirainenstatic const struct login_settings login_default_settings = {
83172e28d4ac684dfed83f7c9db933493d7c5922Timo Sirainen .login_log_format_elements = "user=<%u> method=%m rip=%r lip=%l mpid=%e %c",
3a54211bd6c4dc3f8687c16020770551cf83a548Teemu Huovila .ssl_cipher_list = "ALL:!LOW:!SSLv2:!EXP:!aNULL",
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainenconst struct setting_parser_info login_setting_parser_info = {
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainenstatic const struct setting_parser_info *default_login_set_roots[] = {
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainenconst struct setting_parser_info **login_set_roots = default_login_set_roots;
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainenstatic struct master_service_settings_cache *set_cache;
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen/* <settings checks> */
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainenstatic int ssl_settings_check(void *_set ATTR_UNUSED, const char **error_r)
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen *error_r = t_strdup_printf("SSL support not compiled in but ssl=%s",
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen *error_r = "ssl enabled, but ssl_cert not set";
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen *error_r = "ssl enabled, but ssl_key not set";
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";
507ea0bc5b25efb4c96033a19dec66689a50ebd0Baofeng Wangstatic bool login_settings_check(void *_set, pool_t pool, const char **error_r)
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen p_strsplit(pool, set->login_log_format_elements, " ");
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen /* if we require valid cert, make sure we also ask for it */
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen /* disabled */
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen } else if (strcmp(set->ssl, "required") == 0) {
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen *error_r = t_strdup_printf("Unknown ssl setting value: %s",
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen/* </settings checks> */
78f87ea1d30f3f54bdf8560ea947ab7ee094283aTeemu Huovilastatic const struct var_expand_table *
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainenlogin_set_var_expand_table(const struct master_service_settings_input *input)
b04e76cbc807707d299055be79500f8ff131da43Timo Sirainen static struct var_expand_table static_tab[] = {
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen tab[1].value = net_ip2addr(&input->remote_ip);
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen unsigned int i, count;
62fc0b4f07eb6f18a3bff4b1fccb636e6fae3cf4Timo Sirainen set_cache = master_service_settings_cache_init(master_service,
3448096d5b1cd324ed5132045de0345cd7120a25Timo Sirainen if (master_service_settings_cache_read(set_cache, &input, NULL,
fdf70410de49eadfbb77997bb60ebba19aee4752Teemu Huovila i_fatal("Error reading configuration: %s", error);
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen cache_sets = settings_parser_get_list(parser) + 1;
568fec5b1e629f25d288b48007485b9aa4a018b1Timo Sirainen for (count = 0; input.roots[count] != NULL; count++) ;
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;
b6b06530d654f0436bfbaefc1e988d53fff0cbeeTimo Sirainen settings_var_expand(&login_setting_parser_info, sets[0], pool,