dovecot-2.2: Read SSL settings only if service has SSL sockets o...

dovecot at dovecot.org dovecot at dovecot.org
Wed Sep 19 15:34:25 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/14df6be0111f
changeset: 15088:14df6be0111f
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Sep 19 15:34:00 2012 +0300
description:
Read SSL settings only if service has SSL sockets or MASTER_SERVICE_FLAG_USE_SSL_SETTINGS.

diffstat:

 src/auth/auth-settings.c                     |   7 +++--
 src/lib-master/master-service-private.h      |   1 +
 src/lib-master/master-service-settings.c     |  37 ++++++++++++++++++++-------
 src/lib-master/master-service-settings.h     |   7 ++---
 src/lib-master/master-service-ssl-settings.c |   2 +-
 src/lib-master/master-service.c              |   2 +
 src/lib-master/master-service.h              |   6 +++-
 src/lib-storage/mail-storage-service.c       |  18 +++++++++---
 src/lmtp/lmtp-settings.c                     |   4 +-
 src/login-common/login-settings.c            |   3 +-
 src/login-common/main.c                      |   3 +-
 11 files changed, 61 insertions(+), 29 deletions(-)

diffs (truncated from 303 to 300 lines):

diff -r 8c003fe6f5a6 -r 14df6be0111f src/auth/auth-settings.c
--- a/src/auth/auth-settings.c	Wed Sep 19 15:33:10 2012 +0300
+++ b/src/auth/auth-settings.c	Wed Sep 19 15:34:00 2012 +0300
@@ -392,8 +392,8 @@
 	};
  	struct master_service_settings_input input;
 	struct setting_parser_context *set_parser;
-	struct auth_settings *set;
 	const char *error;
+	void **sets;
 
 	memset(&input, 0, sizeof(input));
 	input.roots = set_roots;
@@ -408,7 +408,8 @@
 	if (!settings_parser_check(set_parser, pool, &error))
 		i_unreached();
 
-	set = settings_parser_get_list(set_parser)[MASTER_SERVICE_INTERNAL_SET_PARSERS];
+	sets = master_service_settings_parser_get_others(master_service,
+							 set_parser);
 	settings_parser_deinit(&set_parser);
-	return set;
+	return sets[0];
 }
diff -r 8c003fe6f5a6 -r 14df6be0111f src/lib-master/master-service-private.h
--- a/src/lib-master/master-service-private.h	Wed Sep 19 15:33:10 2012 +0300
+++ b/src/lib-master/master-service-private.h	Wed Sep 19 15:34:00 2012 +0300
@@ -70,6 +70,7 @@
 	unsigned int die_with_master:1;
 	unsigned int call_avail_overflow:1;
 	unsigned int config_path_is_default:1;
+	unsigned int want_ssl_settings:1;
 	unsigned int ssl_ctx_initialized:1;
 };
 
diff -r 8c003fe6f5a6 -r 14df6be0111f src/lib-master/master-service-settings.c
--- a/src/lib-master/master-service-settings.c	Wed Sep 19 15:33:10 2012 +0300
+++ b/src/lib-master/master-service-settings.c	Wed Sep 19 15:34:00 2012 +0300
@@ -116,7 +116,7 @@
 
 	/* @UNSAFE */
 	i = 0;
-	argv_max_count = 9 + (service->argc + 1) + 1;
+	argv_max_count = 11 + (service->argc + 1) + 1;
 	conf_argv = t_new(const char *, argv_max_count);
 	conf_argv[i++] = DOVECOT_CONFIG_BIN_PATH;
 	conf_argv[i++] = "-f";
@@ -126,6 +126,10 @@
 	if (input->module != NULL) {
 		conf_argv[i++] = "-m";
 		conf_argv[i++] = input->module;
+		if (service->want_ssl_settings) {
+			conf_argv[i++] = "-m";
+			conf_argv[i++] = "ssl";
+		}
 	}
 	if (input->parse_full_config)
 		conf_argv[i++] = "-p";
@@ -216,12 +220,15 @@
 }
 
 static void
-config_build_request(string_t *str,
+config_build_request(struct master_service *service, string_t *str,
 		     const struct master_service_settings_input *input)
 {
 	str_append(str, "REQ");
-	if (input->module != NULL)
+	if (input->module != NULL) {
 		str_printfa(str, "\tmodule=%s", input->module);
+		if (service->want_ssl_settings)
+			str_append(str, "\tmodule=ssl");
+	}
 	if (input->service != NULL)
 		str_printfa(str, "\tservice=%s", input->service);
 	if (input->username != NULL)
@@ -236,7 +243,8 @@
 }
 
 static int
-config_send_request(const struct master_service_settings_input *input,
+config_send_request(struct master_service *service,
+		    const struct master_service_settings_input *input,
 		    int fd, const char *path, const char **error_r)
 {
 	int ret;
@@ -246,7 +254,7 @@
 
 		str = t_str_new(128);
 		str_append(str, CONFIG_HANDSHAKE);
-		config_build_request(str, input);
+		config_build_request(service, str, input);
 		ret = write_full(fd, str_data(str), str_len(str));
 	} T_END;
 	if (ret < 0) {
@@ -352,7 +360,7 @@
 		if (fd == -1)
 			return -1;
 
-		if (config_send_request(input, fd, path, error_r) < 0) {
+		if (config_send_request(service, input, fd, path, error_r) < 0) {
 			i_close_fd(&fd);
 			config_exec_fallback(service, input);
 			return -1;
@@ -371,8 +379,10 @@
 	p_array_init(&all_roots, service->set_pool, 8);
 	tmp_root = &master_service_setting_parser_info;
 	array_append(&all_roots, &tmp_root, 1);
-	tmp_root = &master_service_ssl_setting_parser_info;
-	array_append(&all_roots, &tmp_root, 1);
+	if (service->want_ssl_settings) {
+		tmp_root = &master_service_ssl_setting_parser_info;
+		array_append(&all_roots, &tmp_root, 1);
+	}
 	if (input->roots != NULL) {
 		for (i = 0; input->roots[i] != NULL; i++)
 			array_append(&all_roots, &input->roots[i], 1);
@@ -498,8 +508,15 @@
 
 void **master_service_settings_get_others(struct master_service *service)
 {
-	return settings_parser_get_list(service->set_parser) +
-		MASTER_SERVICE_INTERNAL_SET_PARSERS;
+	return master_service_settings_parser_get_others(service,
+							 service->set_parser);
+}
+
+void **master_service_settings_parser_get_others(struct master_service *service,
+						 const struct setting_parser_context *set_parser)
+{
+	return settings_parser_get_list(set_parser) + 1 +
+		(service->want_ssl_settings ? 1 : 0);
 }
 
 struct setting_parser_context *
diff -r 8c003fe6f5a6 -r 14df6be0111f src/lib-master/master-service-settings.h
--- a/src/lib-master/master-service-settings.h	Wed Sep 19 15:33:10 2012 +0300
+++ b/src/lib-master/master-service-settings.h	Wed Sep 19 15:34:00 2012 +0300
@@ -3,11 +3,8 @@
 
 #include "network.h"
 
-/* Number of settings roots used by lib-master internally. Typically you should
-   use master_service_settings_get_others() to avoid knowing about this. */
-#define MASTER_SERVICE_INTERNAL_SET_PARSERS 2
-
 struct setting_parser_info;
+struct setting_parser_context;
 struct master_service;
 
 struct master_service_settings {
@@ -74,6 +71,8 @@
 const struct master_service_settings *
 master_service_settings_get(struct master_service *service);
 void **master_service_settings_get_others(struct master_service *service);
+void **master_service_settings_parser_get_others(struct master_service *service,
+						 const struct setting_parser_context *set_parser);
 struct setting_parser_context *
 master_service_get_settings_parser(struct master_service *service);
 
diff -r 8c003fe6f5a6 -r 14df6be0111f src/lib-master/master-service-ssl-settings.c
--- a/src/lib-master/master-service-ssl-settings.c	Wed Sep 19 15:33:10 2012 +0300
+++ b/src/lib-master/master-service-ssl-settings.c	Wed Sep 19 15:34:00 2012 +0300
@@ -51,7 +51,7 @@
 };
 
 const struct setting_parser_info master_service_ssl_setting_parser_info = {
-	.module_name = "master",
+	.module_name = "ssl",
 	.defines = master_service_ssl_setting_defines,
 	.defaults = &master_service_ssl_default_settings,
 
diff -r 8c003fe6f5a6 -r 14df6be0111f src/lib-master/master-service.c
--- a/src/lib-master/master-service.c	Wed Sep 19 15:33:10 2012 +0300
+++ b/src/lib-master/master-service.c	Wed Sep 19 15:34:00 2012 +0300
@@ -182,6 +182,8 @@
 		service->listener_names_count =
 			str_array_length((void *)service->listener_names);
 	}
+	service->want_ssl_settings = service->ssl_socket_count > 0 ||
+		(flags & MASTER_SERVICE_FLAG_USE_SSL_SETTINGS) != 0;
 
 	/* set up some kind of logging until we know exactly how and where
 	   we want to log */
diff -r 8c003fe6f5a6 -r 14df6be0111f src/lib-master/master-service.h
--- a/src/lib-master/master-service.h	Wed Sep 19 15:33:10 2012 +0300
+++ b/src/lib-master/master-service.h	Wed Sep 19 15:34:00 2012 +0300
@@ -22,7 +22,11 @@
 	MASTER_SERVICE_FLAG_NO_IDLE_DIE		= 0x80,
 	/* Show number of connections in process title
 	   (only if verbose_proctitle setting is enabled) */
-	MASTER_SERVICE_FLAG_UPDATE_PROCTITLE	= 0x100
+	MASTER_SERVICE_FLAG_UPDATE_PROCTITLE	= 0x100,
+	/* SSL settings are always looked up when we have ssl listeners.
+	   This flag enables looking up SSL settings even without ssl
+	   listeners (i.e. the service does STARTTLS). */
+	MASTER_SERVICE_FLAG_USE_SSL_SETTINGS	= 0x200
 };
 
 struct master_service_connection {
diff -r 8c003fe6f5a6 -r 14df6be0111f src/lib-storage/mail-storage-service.c
--- a/src/lib-storage/mail-storage-service.c	Wed Sep 19 15:33:10 2012 +0300
+++ b/src/lib-storage/mail-storage-service.c	Wed Sep 19 15:34:00 2012 +0300
@@ -950,6 +950,7 @@
 	const char *const *userdb_fields, *error;
 	struct auth_user_reply reply;
 	const struct setting_parser_context *set_parser;
+	void **sets;
 	pool_t user_pool, temp_pool;
 	int ret = 1;
 
@@ -973,7 +974,9 @@
 		master_service_init_log(ctx->service,
 			t_strconcat(ctx->service->name, ": ", NULL));
 	}
-	user_set = settings_parser_get_list(set_parser)[MASTER_SERVICE_INTERNAL_SET_PARSERS];
+	sets = master_service_settings_parser_get_others(master_service,
+							 set_parser);
+	user_set = sets[0];
 
 	if (ctx->conn == NULL)
 		mail_storage_service_first_init(ctx, user_info, user_set);
@@ -1007,7 +1010,9 @@
 	if (!settings_parser_check(user->set_parser, user_pool, &error))
 		i_panic("settings_parser_check() failed: %s", error);
 
-	user->user_set = settings_parser_get_list(user->set_parser)[MASTER_SERVICE_INTERNAL_SET_PARSERS];
+	sets = master_service_settings_parser_get_others(master_service,
+							 user->set_parser);
+	user->user_set = sets[0];
 	user->gid_source = "mail_gid setting";
 	user->uid_source = "mail_uid setting";
 
@@ -1189,6 +1194,7 @@
 	const struct setting_parser_context *set_parser;
 	const char *error;
 	pool_t temp_pool;
+	void **sets;
 
 	if (ctx->conn != NULL)
 		return;
@@ -1198,7 +1204,9 @@
 					       &user_info, &set_parser,
 					       &error) < 0)
 		i_fatal("%s", error);
-	user_set = settings_parser_get_list(set_parser)[MASTER_SERVICE_INTERNAL_SET_PARSERS];
+	sets = master_service_settings_parser_get_others(master_service,
+							 set_parser);
+	user_set = sets[0];
 
 	mail_storage_service_first_init(ctx, user_info, user_set);
 	pool_unref(&temp_pool);
@@ -1249,8 +1257,8 @@
 
 void **mail_storage_service_user_get_set(struct mail_storage_service_user *user)
 {
-	return settings_parser_get_list(user->set_parser) +
-		MASTER_SERVICE_INTERNAL_SET_PARSERS;
+	return master_service_settings_parser_get_others(master_service,
+							 user->set_parser);
 }
 
 const struct mail_storage_settings *
diff -r 8c003fe6f5a6 -r 14df6be0111f src/lmtp/lmtp-settings.c
--- a/src/lmtp/lmtp-settings.c	Wed Sep 19 15:33:10 2012 +0300
+++ b/src/lmtp/lmtp-settings.c	Wed Sep 19 15:34:00 2012 +0300
@@ -99,8 +99,8 @@
 {
 	void **sets;
 
-	sets = settings_parser_get_list(set_parser) +
-		MASTER_SERVICE_INTERNAL_SET_PARSERS;
+	sets = master_service_settings_parser_get_others(master_service,
+							 set_parser);
 	*lda_set_r = settings_dup(&lda_setting_parser_info, sets[1], pool);
 	*lmtp_set_r = settings_dup(&lmtp_setting_parser_info, sets[2], pool);
 }
diff -r 8c003fe6f5a6 -r 14df6be0111f src/login-common/login-settings.c
--- a/src/login-common/login-settings.c	Wed Sep 19 15:33:10 2012 +0300
+++ b/src/login-common/login-settings.c	Wed Sep 19 15:34:00 2012 +0300
@@ -179,8 +179,7 @@
 					       &parser, &error) < 0)
 		i_fatal("Error reading configuration: %s", error);
 
-	cache_sets = settings_parser_get_list(parser) +
-		MASTER_SERVICE_INTERNAL_SET_PARSERS;
+	cache_sets = master_service_settings_parser_get_others(master_service, parser);
 	for (count = 0; input.roots[count] != NULL; count++) ;
 	i_assert(cache_sets[count] == NULL);
 	sets = p_new(pool, void *, count + 1);
diff -r 8c003fe6f5a6 -r 14df6be0111f src/login-common/main.c
--- a/src/login-common/main.c	Wed Sep 19 15:33:10 2012 +0300
+++ b/src/login-common/main.c	Wed Sep 19 15:34:00 2012 +0300
@@ -364,7 +364,8 @@
 {
 	enum master_service_flags service_flags =
 		MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN |
-		MASTER_SERVICE_FLAG_TRACK_LOGIN_STATE;
+		MASTER_SERVICE_FLAG_TRACK_LOGIN_STATE |
+		MASTER_SERVICE_FLAG_USE_SSL_SETTINGS;


More information about the dovecot-cvs mailing list