From: Timo Sirainen Date: Sat, 3 Jul 2004 09:44:21 +0000 (+0300) Subject: If we're not connected to all auth sockets, wait before sending greeting so X-Git-Tag: 1.1.alpha1~3838 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=43f92093032829a1938672f0e32e20a0fae95a36;p=thirdparty%2Fdovecot%2Fcore.git If we're not connected to all auth sockets, wait before sending greeting so APOP challenge gets sent. --HG-- branch : HEAD --- diff --git a/src/pop3-login/client.c b/src/pop3-login/client.c index ae0e833d07..c102129745 100644 --- a/src/pop3-login/client.c +++ b/src/pop3-login/client.c @@ -163,13 +163,6 @@ void client_input(void *context) if (!client_read(client)) return; - if (!auth_client_is_connected(auth_client)) { - /* we're not yet connected to auth process - - don't allow any commands */ - client->input_blocked = TRUE; - return; - } - client_ref(client); o_stream_cork(client->output); @@ -236,8 +229,6 @@ static char *get_apop_challenge(void) { struct auth_connect_id id; - /* FIXME: breaks if we're not connected! */ - if (!auth_client_reserve_connection(auth_client, "APOP", &id)) return NULL; @@ -245,6 +236,16 @@ static char *get_apop_challenge(void) dec2str(ioloop_time), my_hostname); } +static void client_auth_ready(struct pop3_client *client) +{ + client->common.io = + io_add(client->common.fd, IO_READ, client_input, client); + + client->apop_challenge = get_apop_challenge(); + client_send_line(client, t_strconcat("+OK " PACKAGE " ready.", + client->apop_challenge, NULL)); +} + struct client *client_create(int fd, int ssl, const struct ip_addr *local_ip, const struct ip_addr *ip) { @@ -274,7 +275,6 @@ struct client *client_create(int fd, int ssl, const struct ip_addr *local_ip, client->common.local_ip = *local_ip; client->common.ip = *ip; client->common.fd = fd; - client->common.io = io_add(fd, IO_READ, client_input, client); client_open_streams(client, fd); client->last_input = ioloop_time; @@ -282,9 +282,9 @@ struct client *client_create(int fd, int ssl, const struct ip_addr *local_ip, main_ref(); - client->apop_challenge = get_apop_challenge(); - client_send_line(client, t_strconcat("+OK " PACKAGE " ready.", - client->apop_challenge, NULL)); + client->auth_connected = auth_client_is_connected(auth_client); + if (client->auth_connected) + client_auth_ready(client); client_set_title(client); return &client->common; } @@ -396,9 +396,9 @@ void clients_notify_auth_connected(void) while (hash_iterate(iter, &key, &value)) { struct pop3_client *client = key; - if (client->input_blocked) { - client->input_blocked = FALSE; - client_input(client); + if (!client->auth_connected) { + client->auth_connected = TRUE; + client_auth_ready(client); } } hash_iterate_deinit(iter); diff --git a/src/pop3-login/client.h b/src/pop3-login/client.h index bb22b8a617..d434568cfd 100644 --- a/src/pop3-login/client.h +++ b/src/pop3-login/client.h @@ -25,7 +25,7 @@ struct pop3_client { unsigned int tls:1; unsigned int secured:1; - unsigned int input_blocked:1; + unsigned int auth_connected:1; unsigned int destroyed:1; };