dovecot-2.0-sslstream: dsync: Added handshaking to proxy protocol.

dovecot at dovecot.org dovecot at dovecot.org
Sat Feb 13 02:56:33 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0-sslstream/rev/a339eeca23fb
changeset: 10362:a339eeca23fb
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Nov 18 15:19:39 2009 -0500
description:
dsync: Added handshaking to proxy protocol.

diffstat:

4 files changed, 32 insertions(+), 2 deletions(-)
src/dsync/dsync-proxy-client.c |   16 +++++++++++++++-
src/dsync/dsync-proxy-server.c |   15 ++++++++++++++-
src/dsync/dsync-proxy-server.h |    1 +
src/dsync/dsync-proxy.h        |    2 ++

diffs (95 lines):

diff -r def159693f9a -r a339eeca23fb src/dsync/dsync-proxy-client.c
--- a/src/dsync/dsync-proxy-client.c	Wed Nov 18 15:12:01 2009 -0500
+++ b/src/dsync/dsync-proxy-client.c	Wed Nov 18 15:19:39 2009 -0500
@@ -64,6 +64,7 @@ struct proxy_client_dsync_worker {
 	ARRAY_DEFINE(request_array, struct proxy_client_request);
 	struct aqueue *request_queue;
 
+	unsigned int handshake_received:1;
 	unsigned int finished:1;
 };
 
@@ -101,7 +102,19 @@ proxy_client_worker_read_line(struct pro
 			return -1;
 		}
 	}
-	return *line_r != NULL ? 1 : 0;
+	if (*line_r == NULL)
+		return 0;
+
+	if (!worker->handshake_received) {
+		if (strcmp(*line_r, DSYNC_PROXY_SERVER_GREETING_LINE) != 0) {
+			i_error("Invalid server handshake: %s", *line_r);
+			dsync_worker_set_failure(&worker->worker);
+			return -1;
+		}
+		worker->handshake_received = TRUE;
+		return proxy_client_worker_read_line(worker, line_r);
+	}
+	return 1;
 }
 
 static void
@@ -283,6 +296,7 @@ struct dsync_worker *dsync_worker_init_p
 	worker->io = io_add(fd_in, IO_READ, proxy_client_worker_input, worker);
 	worker->input = i_stream_create_fd(fd_in, (size_t)-1, FALSE);
 	worker->output = o_stream_create_fd(fd_out, (size_t)-1, FALSE);
+	o_stream_send_str(worker->output, DSYNC_PROXY_CLIENT_GREETING_LINE"\n");
 	/* we'll keep the output corked until flush is needed */
 	o_stream_cork(worker->output);
 	o_stream_set_flush_callback(worker->output, proxy_client_worker_output,
diff -r def159693f9a -r a339eeca23fb src/dsync/dsync-proxy-server.c
--- a/src/dsync/dsync-proxy-server.c	Wed Nov 18 15:12:01 2009 -0500
+++ b/src/dsync/dsync-proxy-server.c	Wed Nov 18 15:19:39 2009 -0500
@@ -31,7 +31,19 @@ proxy_server_read_line(struct dsync_prox
 			return -1;
 		}
 	}
-	return *line_r != NULL ? 1 : 0;
+	if (*line_r == NULL)
+		return 0;
+
+	if (!server->handshake_received) {
+		if (strcmp(*line_r, DSYNC_PROXY_CLIENT_GREETING_LINE) != 0) {
+			i_error("Invalid client handshake: %s", *line_r);
+			master_service_stop(master_service);
+			return -1;
+		}
+		server->handshake_received = TRUE;
+		return proxy_server_read_line(server, line_r);
+	}
+	return 1;
 }
 
 static int proxy_server_run_cmd(struct dsync_proxy_server *server)
@@ -162,6 +174,7 @@ dsync_proxy_server_init(int fd_in, int f
 				 dsync_proxy_server_timeout, NULL);
 	o_stream_set_flush_callback(server->output, proxy_server_output,
 				    server);
+	o_stream_send_str(server->output, DSYNC_PROXY_SERVER_GREETING_LINE"\n");
 	fd_set_nonblock(fd_in, TRUE);
 	fd_set_nonblock(fd_out, TRUE);
 	return server;
diff -r def159693f9a -r a339eeca23fb src/dsync/dsync-proxy-server.h
--- a/src/dsync/dsync-proxy-server.h	Wed Nov 18 15:12:01 2009 -0500
+++ b/src/dsync/dsync-proxy-server.h	Wed Nov 18 15:19:39 2009 -0500
@@ -30,6 +30,7 @@ struct dsync_proxy_server {
 	bool get_input_last_lf;
 	uint32_t get_uid;
 
+	unsigned int handshake_received:1;
 	unsigned int subs_sending_unsubscriptions:1;
 	unsigned int finished:1;
 };
diff -r def159693f9a -r a339eeca23fb src/dsync/dsync-proxy.h
--- a/src/dsync/dsync-proxy.h	Wed Nov 18 15:12:01 2009 -0500
+++ b/src/dsync/dsync-proxy.h	Wed Nov 18 15:19:39 2009 -0500
@@ -4,6 +4,8 @@
 #include "dsync-data.h"
 
 #define DSYNC_PROXY_TIMEOUT_MSECS (15*60*1000)
+#define DSYNC_PROXY_CLIENT_GREETING_LINE "dsync-client\t1"
+#define DSYNC_PROXY_SERVER_GREETING_LINE "dsync-server\t1"
 
 struct dsync_message;
 struct dsync_mailbox;


More information about the dovecot-cvs mailing list