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