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