diff src/pop3-login/pop3-proxy.c @ 2835:39c315e7697d HEAD

Keep proxy_user stored until proxy is destroyed.
author Timo Sirainen <tss@iki.fi>
date Wed, 27 Oct 2004 17:20:21 +0300
parents 9aaa737f8215
children 4e5b1a1494c5
line wrap: on
line diff
--- a/src/pop3-login/pop3-proxy.c	Tue Oct 26 07:38:40 2004 +0300
+++ b/src/pop3-login/pop3-proxy.c	Wed Oct 27 17:20:21 2004 +0300
@@ -46,7 +46,8 @@
 	if (line == NULL)
 		return;
 
-	if (client->proxy_user != NULL) {
+	switch (client->proxy_state) {
+	case 0:
 		/* this is a banner */
 		if (strncmp(line, "+OK", 3) != 0) {
 			i_error("pop3-proxy(%s): "
@@ -63,52 +64,67 @@
 		str_append(str, "\r\n");
 		(void)o_stream_send(output, str_data(str), str_len(str));
 
-		i_free(client->proxy_user);
-		client->proxy_user = NULL;
-	} else if (strncmp(line, "+OK", 3) == 0) {
-		if (client->proxy_password != NULL) {
-			/* USER successful, send PASS */
-			str = t_str_new(128);
-			str_append(str, "PASS ");
-			str_append(str, client->proxy_password);
-			str_append(str, "\r\n");
-			(void)o_stream_send(output, str_data(str),
-					    str_len(str));
+		client->proxy_state++;
+		return;
+	case 1:
+		if (strncmp(line, "+OK", 3) != 0)
+			break;
+
+		/* USER successful, send PASS */
+		str = t_str_new(128);
+		str_append(str, "PASS ");
+		str_append(str, client->proxy_password);
+		str_append(str, "\r\n");
+		(void)o_stream_send(output, str_data(str),
+				    str_len(str));
 
-			safe_memset(client->proxy_password, 0,
-				    strlen(client->proxy_password));
-			i_free(client->proxy_password);
-			client->proxy_password = NULL;
-		} else {
-			/* Login successful. Send this line to client. */
-			(void)o_stream_send_str(client->output, line);
-			(void)o_stream_send(client->output, "\r\n", 2);
+		safe_memset(client->proxy_password, 0,
+			    strlen(client->proxy_password));
+		i_free(client->proxy_password);
+		client->proxy_password = NULL;
+
+		client->proxy_state++;
+		return;
+	case 2:
+		/* Login successful. Send this line to client. */
+		(void)o_stream_send_str(client->output, line);
+		(void)o_stream_send(client->output, "\r\n", 2);
+
+		login_proxy_detach(client->proxy, client->input,
+				   client->output);
 
-			login_proxy_detach(client->proxy, client->input,
-					   client->output);
+		client->proxy = NULL;
+		client->input = NULL;
+		client->output = NULL;
+		client->common.fd = -1;
+		client_destroy(client,
+			       t_strdup_printf("proxy(%s): started",
+					       client->common.virtual_user));
+		return;
+	}
+
+	/* Login failed. Send our own failure reply so client can't
+	   figure out if user exists or not just by looking at the
+	   reply string. */
+	client_send_line(client, "-ERR "AUTH_FAILED_MSG);
 
-			client->proxy = NULL;
-			client->input = NULL;
-			client->output = NULL;
-			client->common.fd = -1;
-			client_destroy(client,
-				t_strdup_printf("proxy(%s): started",
-						client->common.virtual_user));
-		}
-	} else {
-		/* Login failed. Send our own failure reply so client can't
-		   figure out if user exists or not just by looking at the
-		   reply string. */
-		client_send_line(client, "-ERR "AUTH_FAILED_MSG);
+	/* allow client input again */
+	i_assert(client->io == NULL);
+	client->io = io_add(client->common.fd, IO_READ,
+			    client_input, client);
+
+	login_proxy_free(client->proxy);
+	client->proxy = NULL;
 
-		/* allow client input again */
-		i_assert(client->io == NULL);
-		client->io = io_add(client->common.fd, IO_READ,
-				    client_input, client);
+	if (client->proxy_password != NULL) {
+		safe_memset(client->proxy_password, 0,
+			    strlen(client->proxy_password));
+		i_free(client->proxy_password);
+		client->proxy_password = NULL;
+	}
 
-		login_proxy_free(client->proxy);
-		client->proxy = NULL;
-	}
+	i_free(client->proxy_user);
+	client->proxy_user = NULL;
 }
 
 int pop3_proxy_new(struct pop3_client *client, const char *host,
@@ -127,6 +143,7 @@
 	if (client->proxy == NULL)
 		return -1;
 
+	client->proxy_state = 0;
 	client->proxy_user = i_strdup(user);
 	client->proxy_password = i_strdup(password);