dovecot-2.1: imap, pop3: Added -t parameter to specify post-logi...

dovecot at dovecot.org dovecot at dovecot.org
Fri Jan 20 17:43:06 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/9015f0b8fa4d
changeset: 13964:9015f0b8fa4d
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Jan 20 17:42:47 2012 +0200
description:
imap, pop3: Added -t parameter to specify post-login script timeout.

diffstat:

 src/imap/main.c               |  27 ++++++++++++++++++---------
 src/lib-master/master-login.c |  23 ++++++++++++-----------
 src/lib-master/master-login.h |  17 +++++++++++++----
 src/pop3/main.c               |  27 ++++++++++++++++++---------
 4 files changed, 61 insertions(+), 33 deletions(-)

diffs (222 lines):

diff -r db37a5818b92 -r 9015f0b8fa4d src/imap/main.c
--- a/src/imap/main.c	Fri Jan 20 17:42:15 2012 +0200
+++ b/src/imap/main.c	Fri Jan 20 17:42:47 2012 +0200
@@ -306,11 +306,15 @@
 		&imap_setting_parser_info,
 		NULL
 	};
+	struct master_login_settings login_set;
 	enum master_service_flags service_flags = 0;
 	enum mail_storage_service_flags storage_service_flags = 0;
-	const char *postlogin_socket_path, *username = NULL;
+	const char *username = NULL;
 	int c;
 
+	memset(&login_set, 0, sizeof(login_set));
+	login_set.postlogin_timeout_secs = MASTER_POSTLOGIN_TIMEOUT_DEFAULT;
+
 	if (IS_STANDALONE() && getuid() == 0 &&
 	    net_getpeername(1, NULL, NULL) == 0) {
 		printf("* BAD [ALERT] imap binary must not be started from "
@@ -328,9 +332,14 @@
 	}
 
 	master_service = master_service_init("imap", service_flags,
-					     &argc, &argv, "u:");
+					     &argc, &argv, "t:u:");
 	while ((c = master_getopt(master_service)) > 0) {
 		switch (c) {
+		case 't':
+			if (str_to_uint(optarg, &login_set.postlogin_timeout_secs) < 0 ||
+			    login_set.postlogin_timeout_secs == 0)
+				i_fatal("Invalid -t parameter: %s", optarg);
+			break;
 		case 'u':
 			storage_service_flags |=
 				MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
@@ -340,8 +349,12 @@
 			return FATAL_DEFAULT;
 		}
 	}
-	postlogin_socket_path = argv[optind] == NULL ? NULL :
-		t_abspath(argv[optind]);
+
+	login_set.auth_socket_path = t_abspath("auth-master");
+	if (argv[optind] != NULL)
+		login_set.postlogin_socket_path = t_abspath(argv[optind]);
+	login_set.callback = login_client_connected;
+	login_set.failure_callback = login_client_failed;
 
 	master_service_init_finish(master_service);
 	master_service_set_die_callback(master_service, imap_die);
@@ -363,11 +376,7 @@
 			main_stdio_run(username);
 		} T_END;
 	} else {
-		master_login = master_login_init(master_service,
-						 t_abspath("auth-master"),
-						 postlogin_socket_path,
-						 login_client_connected,
-						 login_client_failed);
+		master_login = master_login_init(master_service, &login_set);
 		io_loop_set_running(current_ioloop);
 	}
 
diff -r db37a5818b92 -r 9015f0b8fa4d src/lib-master/master-login.c
--- a/src/lib-master/master-login.c	Fri Jan 20 17:42:15 2012 +0200
+++ b/src/lib-master/master-login.c	Fri Jan 20 17:42:47 2012 +0200
@@ -15,8 +15,6 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
-#define MASTER_LOGIN_POSTLOGIN_TIMEOUT_MSECS (60*1000)
-
 #define master_login_conn_is_closed(conn) \
 	((conn)->fd == -1)
 #define master_login_conn_has_clients(conn) \
@@ -51,6 +49,7 @@
 	struct master_login_connection *conns;
 	struct master_login_auth *auth;
 	char *postlogin_socket_path;
+	unsigned int postlogin_timeout_secs;
 
 	unsigned int stopping:1;
 };
@@ -59,19 +58,21 @@
 static void master_login_conn_unref(struct master_login_connection **_conn);
 
 struct master_login *
-master_login_init(struct master_service *service, const char *auth_socket_path,
-		  const char *postlogin_socket_path,
-		  master_login_callback_t *callback,
-		  master_login_failure_callback_t *failure_callback)
+master_login_init(struct master_service *service,
+		  const struct master_login_settings *set)
 {
 	struct master_login *login;
 
+	i_assert(set->postlogin_socket_path == NULL ||
+		 set->postlogin_timeout_secs > 0);
+
 	login = i_new(struct master_login, 1);
 	login->service = service;
-	login->callback = callback;
-	login->failure_callback = failure_callback;
-	login->auth = master_login_auth_init(auth_socket_path);
-	login->postlogin_socket_path = i_strdup(postlogin_socket_path);
+	login->callback = set->callback;
+	login->failure_callback = set->failure_callback;
+	login->auth = master_login_auth_init(set->auth_socket_path);
+	login->postlogin_socket_path = i_strdup(set->postlogin_socket_path);
+	login->postlogin_timeout_secs = set->postlogin_timeout_secs;
 
 	i_assert(service->login == NULL);
 	service->login = login;
@@ -337,7 +338,7 @@
 	pl->username = i_strdup(auth_args[0]);
 	pl->fd = fd;
 	pl->io = io_add(fd, IO_READ, master_login_postlogin_input, pl);
-	pl->to = timeout_add(MASTER_LOGIN_POSTLOGIN_TIMEOUT_MSECS,
+	pl->to = timeout_add(login->postlogin_timeout_secs * 1000,
 			     master_login_postlogin_timeout, pl);
 	pl->input = str_new(default_pool, 512);
 	return 0;
diff -r db37a5818b92 -r 9015f0b8fa4d src/lib-master/master-login.h
--- a/src/lib-master/master-login.h	Fri Jan 20 17:42:15 2012 +0200
+++ b/src/lib-master/master-login.h	Fri Jan 20 17:42:47 2012 +0200
@@ -3,6 +3,8 @@
 
 #include "master-auth.h"
 
+#define MASTER_POSTLOGIN_TIMEOUT_DEFAULT 60
+
 struct master_login_client {
 	struct master_login_connection *conn;
 	int fd;
@@ -18,11 +20,18 @@
 master_login_failure_callback_t(const struct master_login_client *client,
 				const char *errormsg);
 
+struct master_login_settings {
+	const char *auth_socket_path;
+	const char *postlogin_socket_path;
+	unsigned int postlogin_timeout_secs;
+
+	master_login_callback_t *callback;
+	master_login_failure_callback_t *failure_callback;
+};
+
 struct master_login *
-master_login_init(struct master_service *service, const char *auth_socket_path,
-		  const char *postlogin_socket_path,
-		  master_login_callback_t *callback,
-		  master_login_failure_callback_t *failure_callback);
+master_login_init(struct master_service *service,
+		  const struct master_login_settings *set);
 void master_login_deinit(struct master_login **login);
 
 void master_login_add(struct master_login *login, int fd);
diff -r db37a5818b92 -r 9015f0b8fa4d src/pop3/main.c
--- a/src/pop3/main.c	Fri Jan 20 17:42:15 2012 +0200
+++ b/src/pop3/main.c	Fri Jan 20 17:42:47 2012 +0200
@@ -192,11 +192,15 @@
 		&pop3_setting_parser_info,
 		NULL
 	};
+	struct master_login_settings login_set;
 	enum master_service_flags service_flags = 0;
 	enum mail_storage_service_flags storage_service_flags = 0;
-	const char *postlogin_socket_path, *username = NULL;
+	const char *username = NULL;
 	int c;
 
+	memset(&login_set, 0, sizeof(login_set));
+	login_set.postlogin_timeout_secs = MASTER_POSTLOGIN_TIMEOUT_DEFAULT;
+
 	if (IS_STANDALONE() && getuid() == 0 &&
 	    net_getpeername(1, NULL, NULL) == 0) {
 		printf("-ERR pop3 binary must not be started from "
@@ -214,9 +218,14 @@
 	}
 
 	master_service = master_service_init("pop3", service_flags,
-					     &argc, &argv, "u:");
+					     &argc, &argv, "t:u:");
 	while ((c = master_getopt(master_service)) > 0) {
 		switch (c) {
+		case 't':
+			if (str_to_uint(optarg, &login_set.postlogin_timeout_secs) < 0 ||
+			    login_set.postlogin_timeout_secs == 0)
+				i_fatal("Invalid -t parameter: %s", optarg);
+			break;
 		case 'u':
 			storage_service_flags |=
 				MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
@@ -226,8 +235,12 @@
 			return FATAL_DEFAULT;
 		}
 	}
-	postlogin_socket_path = argv[optind] == NULL ? NULL :
-		t_abspath(argv[optind]);
+
+	login_set.auth_socket_path = t_abspath("auth-master");
+	if (argv[optind] != NULL)
+		login_set.postlogin_socket_path = t_abspath(argv[optind]);
+	login_set.callback = login_client_connected;
+	login_set.failure_callback = login_client_failed;
 
 	master_service_init_finish(master_service);
 	master_service_set_die_callback(master_service, pop3_die);
@@ -245,11 +258,7 @@
 			main_stdio_run(username);
 		} T_END;
 	} else {
-		master_login = master_login_init(master_service,
-						 t_abspath("auth-master"),
-						 postlogin_socket_path,
-						 login_client_connected,
-						 login_client_failed);
+		master_login = master_login_init(master_service, &login_set);
 		io_loop_set_running(current_ioloop);
 	}
 


More information about the dovecot-cvs mailing list