Mercurial > dovecot > core-2.2
annotate src/doveadm/server-connection.c @ 22614:cf66220d281e
doveadm proxy: Don't crash if remote doesn't support log proxying
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sat, 14 Oct 2017 12:54:18 +0300 |
parents | a3632f4d817f |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21389
diff
changeset
|
1 /* Copyright (c) 2010-2017 Dovecot authors, see the included COPYING file */ |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
13036
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
5 #include "base64.h" |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "ioloop.h" |
15187
02451e967a06
Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
7 #include "net.h" |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "istream.h" |
22556
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
9 #include "istream-multiplex.h" |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "ostream.h" |
18254
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
11 #include "ostream-dot.h" |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include "str.h" |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include "strescape.h" |
15934
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
14 #include "iostream-ssl.h" |
13179
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
15 #include "master-service.h" |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
16 #include "master-service-settings.h" |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
17 #include "settings-parser.h" |
21784
b7f788e99e86
doveadm: Send and receive exit codes correctly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21390
diff
changeset
|
18 #include "doveadm.h" |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 #include "doveadm-print.h" |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 #include "doveadm-util.h" |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 #include "doveadm-server.h" |
13036
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
22 #include "doveadm-settings.h" |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 #include "server-connection.h" |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
16505
63092465c522
doveadm: Pass through the exit code from doveadm-server to client.
Timo Sirainen <tss@iki.fi>
parents:
16161
diff
changeset
|
25 #include <sysexits.h> |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 #include <unistd.h> |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
22556
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
28 #define DOVEADM_LOG_CHANNEL_ID 'L' |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
29 |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 #define MAX_INBUF_SIZE (1024*32) |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 enum server_reply_state { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 SERVER_REPLY_STATE_DONE = 0, |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 SERVER_REPLY_STATE_PRINT, |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 SERVER_REPLY_STATE_RET |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 }; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 struct server_connection { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 struct doveadm_server *server; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
13179
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
41 pool_t pool; |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
42 struct doveadm_settings *set; |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
43 |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 int fd; |
22555
e05ab5f8a8bc
doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22554
diff
changeset
|
45 unsigned int minor; |
e05ab5f8a8bc
doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22554
diff
changeset
|
46 |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 struct io *io; |
22556
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
48 struct io *io_log; |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 struct istream *input; |
22556
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
50 struct istream *log_input; |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 struct ostream *output; |
15934
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
52 struct ssl_iostream *ssl_iostream; |
20611
be966bc4b758
doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20610
diff
changeset
|
53 struct timeout *to_input; |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 |
18254
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
55 struct istream *cmd_input; |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
56 struct ostream *cmd_output; |
13179
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
57 const char *delayed_cmd; |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 server_cmd_callback_t *callback; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 void *context; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 enum server_reply_state state; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 unsigned int handshaked:1; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 unsigned int authenticated:1; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 unsigned int streaming:1; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 }; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 static struct server_connection *printing_conn = NULL; |
20612
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
69 static ARRAY(struct doveadm_server *) print_pending_servers = ARRAY_INIT; |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 static void server_connection_input(struct server_connection *conn); |
20610
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
72 static bool server_connection_input_one(struct server_connection *conn); |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 |
20612
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
74 static void server_set_print_pending(struct doveadm_server *server) |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 { |
20612
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
76 struct doveadm_server *const *serverp; |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
77 |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
78 if (!array_is_created(&print_pending_servers)) |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
79 i_array_init(&print_pending_servers, 16); |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
80 array_foreach(&print_pending_servers, serverp) { |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
81 if (*serverp == server) |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
82 return; |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
83 } |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
84 array_append(&print_pending_servers, &server, 1); |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
85 } |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
86 |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
87 static void server_print_connection_released(struct doveadm_server *server) |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
88 { |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 struct server_connection *const *conns; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 unsigned int i, count; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 conns = array_get(&server->connections, &count); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 for (i = 0; i < count; i++) { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 if (conns[i]->io != NULL) |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 continue; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 conns[i]->io = io_add(conns[i]->fd, IO_READ, |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 server_connection_input, conns[i]); |
20611
be966bc4b758
doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20610
diff
changeset
|
99 conns[i]->to_input = timeout_add_short(0, |
be966bc4b758
doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20610
diff
changeset
|
100 server_connection_input, conns[i]); |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 |
20612
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
104 static void print_connection_released(void) |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
105 { |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
106 struct doveadm_server *const *serverp; |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
107 |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
108 printing_conn = NULL; |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
109 if (!array_is_created(&print_pending_servers)) |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
110 return; |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
111 |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
112 array_foreach(&print_pending_servers, serverp) |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
113 server_print_connection_released(*serverp); |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
114 array_free(&print_pending_servers); |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
115 } |
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
116 |
18254
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
117 static int server_connection_send_cmd_input_more(struct server_connection *conn) |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
118 { |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
119 off_t ret; |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
120 |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
121 /* ostream-dot writes only up to max buffer size, so keep it non-zero */ |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
122 o_stream_set_max_buffer_size(conn->cmd_output, IO_BLOCK_SIZE); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
123 ret = o_stream_send_istream(conn->cmd_output, conn->cmd_input); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
124 o_stream_set_max_buffer_size(conn->cmd_output, (size_t)-1); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
125 |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
126 if (ret >= 0 && i_stream_have_bytes_left(conn->cmd_input)) { |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
127 o_stream_set_flush_pending(conn->cmd_output, TRUE); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
128 return 0; |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
129 } |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
130 if (conn->cmd_input->stream_errno != 0) { |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
131 i_error("read(%s) failed: %s", |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
132 i_stream_get_name(conn->cmd_input), |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
133 i_stream_get_error(conn->cmd_input)); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
134 } else if (conn->cmd_output->stream_errno != 0 || |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
135 o_stream_flush(conn->cmd_output) < 0) { |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
136 i_error("write(%s) failed: %s", |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
137 o_stream_get_name(conn->cmd_output), |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
138 o_stream_get_error(conn->cmd_output)); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
139 } |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
140 |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
141 i_stream_destroy(&conn->cmd_input); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
142 o_stream_destroy(&conn->cmd_output); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
143 return ret < 0 ? -1 : 1; |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
144 } |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
145 |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
146 static void server_connection_send_cmd_input(struct server_connection *conn) |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
147 { |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
148 if (conn->cmd_input == NULL) |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
149 return; |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
150 |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
151 conn->cmd_output = o_stream_create_dot(conn->output, TRUE); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
152 (void)server_connection_send_cmd_input_more(conn); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
153 } |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
154 |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
155 static int server_connection_output(struct server_connection *conn) |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
156 { |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
157 int ret; |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
158 |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
159 o_stream_cork(conn->output); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
160 ret = o_stream_flush(conn->output); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
161 if (ret > 0 && conn->cmd_input != NULL && conn->delayed_cmd == NULL) |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
162 ret = server_connection_send_cmd_input_more(conn); |
18616
e702b7a745e0
doveadm-server: Fixed potential crash if doveadm client disconnected
Timo Sirainen <tss@iki.fi>
parents:
18254
diff
changeset
|
163 o_stream_uncork(conn->output); |
18254
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
164 if (ret < 0) |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
165 server_connection_destroy(&conn); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
166 return ret; |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
167 } |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
168 |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 static void |
16667
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
170 server_connection_callback(struct server_connection *conn, |
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
171 int exit_code, const char *error) |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 server_cmd_callback_t *callback = conn->callback; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 conn->callback = NULL; |
16667
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
176 callback(exit_code, error, conn->context); |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 static void stream_data(string_t *str, const unsigned char *data, size_t size) |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 str_truncate(str, 0); |
20599
ad69150c10f9
doveadm: Streamline tabunescape
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
19552
diff
changeset
|
182 str_append_tabunescaped(str, data, size); |
ad69150c10f9
doveadm: Streamline tabunescape
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
19552
diff
changeset
|
183 doveadm_print_stream(str->data, str->used); |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 static void server_flush_field(struct server_connection *conn, string_t *str, |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 const unsigned char *data, size_t size) |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 if (conn->streaming) { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 conn->streaming = FALSE; |
15289
94c7e875f9b9
doveadm: Fixed printing large input from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
14299
diff
changeset
|
191 if (size > 0) |
94c7e875f9b9
doveadm: Fixed printing large input from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
14299
diff
changeset
|
192 stream_data(str, data, size); |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 doveadm_print_stream("", 0); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 } else { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 str_truncate(str, 0); |
20599
ad69150c10f9
doveadm: Streamline tabunescape
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
19552
diff
changeset
|
196 str_append_tabunescaped(str, data, size); |
20609
241194ca9c82
doveadm: Revert earlier NUL-printing change 793b024bf.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20603
diff
changeset
|
197 doveadm_print(str_c(str)); |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 static void |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 server_handle_input(struct server_connection *conn, |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 const unsigned char *data, size_t size) |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 string_t *str; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 size_t i, start; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 if (printing_conn == conn) { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 /* continue printing */ |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 } else if (printing_conn == NULL) { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 printing_conn = conn; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 } else { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 /* someone else is printing. don't continue until it |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 goes away */ |
20612
e8a85457b96d
doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20611
diff
changeset
|
215 server_set_print_pending(conn->server); |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 io_remove(&conn->io); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 return; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 if (data[size-1] == '\001') { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 /* last character is an escape */ |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 size--; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 str = t_str_new(128); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 for (i = start = 0; i < size; i++) { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 if (data[i] == '\n') { |
15923
8e54e73bdade
doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents:
15922
diff
changeset
|
228 if (i != start) { |
8e54e73bdade
doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents:
15922
diff
changeset
|
229 i_error("doveadm server sent broken print input"); |
8e54e73bdade
doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents:
15922
diff
changeset
|
230 server_connection_destroy(&conn); |
8e54e73bdade
doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents:
15922
diff
changeset
|
231 return; |
8e54e73bdade
doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents:
15922
diff
changeset
|
232 } |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 conn->state = SERVER_REPLY_STATE_RET; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 i_stream_skip(conn->input, i + 1); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 print_connection_released(); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 return; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 if (data[i] == '\t') { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 server_flush_field(conn, str, data + start, i - start); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 start = i + 1; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 if (start != size) { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 conn->streaming = TRUE; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 stream_data(str, data + start, size - start); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 i_stream_skip(conn->input, size); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 |
13528
1d8009c7b67e
doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents:
13327
diff
changeset
|
251 static void server_connection_authenticated(struct server_connection *conn) |
1d8009c7b67e
doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents:
13327
diff
changeset
|
252 { |
1d8009c7b67e
doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents:
13327
diff
changeset
|
253 conn->authenticated = TRUE; |
1d8009c7b67e
doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents:
13327
diff
changeset
|
254 if (conn->delayed_cmd != NULL) { |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14299
diff
changeset
|
255 o_stream_nsend_str(conn->output, conn->delayed_cmd); |
13528
1d8009c7b67e
doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents:
13327
diff
changeset
|
256 conn->delayed_cmd = NULL; |
18254
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
257 server_connection_send_cmd_input(conn); |
13528
1d8009c7b67e
doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents:
13327
diff
changeset
|
258 } |
1d8009c7b67e
doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents:
13327
diff
changeset
|
259 } |
1d8009c7b67e
doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents:
13327
diff
changeset
|
260 |
13036
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
261 static int |
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
262 server_connection_authenticate(struct server_connection *conn) |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 { |
13036
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
264 string_t *plain = t_str_new(128); |
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
265 string_t *cmd = t_str_new(128); |
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
266 |
13179
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
267 if (*conn->set->doveadm_password == '\0') { |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
268 i_error("doveadm_password not set, " |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
269 "can't authenticate to remote server"); |
13036
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
270 return -1; |
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
271 } |
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
272 |
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
273 str_append_c(plain, '\0'); |
18897
3bf5df6f63b2
doveadm: Added doveadm_username to specify the username for authentication.
Timo Sirainen <tss@iki.fi>
parents:
18616
diff
changeset
|
274 str_append(plain, conn->set->doveadm_username); |
13036
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
275 str_append_c(plain, '\0'); |
13179
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
276 str_append(plain, conn->set->doveadm_password); |
13036
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
277 |
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
278 str_append(cmd, "PLAIN\t"); |
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
279 base64_encode(plain->data, plain->used, cmd); |
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
280 str_append_c(cmd, '\n'); |
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
281 |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14299
diff
changeset
|
282 o_stream_nsend(conn->output, cmd->data, cmd->used); |
13036
6604f80abb02
doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
283 return 0; |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 |
16674
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
286 static void server_log_disconnect_error(struct server_connection *conn) |
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
287 { |
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
288 const char *error; |
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
289 |
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
290 error = conn->ssl_iostream == NULL ? NULL : |
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
291 ssl_iostream_get_last_error(conn->ssl_iostream); |
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
292 if (error == NULL) { |
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
293 error = conn->input->stream_errno == 0 ? "EOF" : |
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
294 strerror(conn->input->stream_errno); |
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
295 } |
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
296 i_error("doveadm server disconnected before handshake: %s", error); |
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
297 } |
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
298 |
22556
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
299 static void server_connection_print_log(struct server_connection *conn) |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
300 { |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
301 const char *line; |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
302 struct failure_context ctx; |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
303 i_zero(&ctx); |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
304 |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
305 while((line = i_stream_read_next_line(conn->log_input))!=NULL) { |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
306 /* skip empty lines */ |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
307 if (*line == '\0') continue; |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
308 |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
309 if (!doveadm_log_type_from_char(line[0], &ctx.type)) |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
310 i_warning("Doveadm server sent invalid log type 0x%02x", |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
311 line[0]); |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
312 line++; |
22587
36f70fbf6d2f
doveadm: Add remote(host) prefix to all proxied logs
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22556
diff
changeset
|
313 i_log_type(&ctx, "remote(%s): %s", conn->server->name, line); |
22556
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
314 } |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
315 } |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
316 |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
317 static void server_connection_start_multiplex(struct server_connection *conn) |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
318 { |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
319 struct istream *is = conn->input; |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
320 conn->input = i_stream_create_multiplex(is, MAX_INBUF_SIZE); |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
321 i_stream_unref(&is); |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
322 io_remove(&conn->io); |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
323 conn->io = io_add_istream(conn->input, server_connection_input, conn); |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
324 conn->log_input = i_stream_multiplex_add_channel(conn->input, DOVEADM_LOG_CHANNEL_ID); |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
325 conn->io_log = io_add_istream(conn->log_input, server_connection_print_log, conn); |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
326 i_stream_set_return_partial_line(conn->log_input, TRUE); |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
327 } |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
328 |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 static void server_connection_input(struct server_connection *conn) |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 const char *line; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 |
20611
be966bc4b758
doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20610
diff
changeset
|
333 if (conn->to_input != NULL) |
be966bc4b758
doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20610
diff
changeset
|
334 timeout_remove(&conn->to_input); |
be966bc4b758
doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20610
diff
changeset
|
335 |
22554
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
336 if (!conn->handshaked || !conn->authenticated) { |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
337 while((line = i_stream_read_next_line(conn->input)) != NULL) { |
22555
e05ab5f8a8bc
doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22554
diff
changeset
|
338 if (strncmp(line, "VERSION\t", 8) == 0) { |
e05ab5f8a8bc
doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22554
diff
changeset
|
339 if (!version_string_verify_full(line, "doveadm-client", |
e05ab5f8a8bc
doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22554
diff
changeset
|
340 DOVEADM_SERVER_PROTOCOL_VERSION_MAJOR, |
e05ab5f8a8bc
doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22554
diff
changeset
|
341 &conn->minor)) { |
e05ab5f8a8bc
doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22554
diff
changeset
|
342 i_error("doveadm server not compatible with this client" |
e05ab5f8a8bc
doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22554
diff
changeset
|
343 "(mixed old and new binaries?)"); |
e05ab5f8a8bc
doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22554
diff
changeset
|
344 server_connection_destroy(&conn); |
22595
a3632f4d817f
doveadm: Return after destroying connection
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22587
diff
changeset
|
345 return; |
22555
e05ab5f8a8bc
doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22554
diff
changeset
|
346 } |
e05ab5f8a8bc
doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22554
diff
changeset
|
347 continue; |
e05ab5f8a8bc
doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22554
diff
changeset
|
348 } |
22554
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
349 if (strcmp(line, "+") == 0) { |
22556
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
350 if (conn->minor > 0) |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
351 server_connection_start_multiplex(conn); |
22554
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
352 server_connection_authenticated(conn); |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
353 break; |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
354 } else if (strcmp(line, "-") == 0) { |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
355 if (!conn->handshaked && |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
356 server_connection_authenticate(conn) < 0) { |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
357 server_connection_destroy(&conn); |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
358 return; |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
359 } else if (conn->handshaked) { |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
360 i_error("doveadm authentication failed (%s)", |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
361 line+1); |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
362 server_connection_destroy(&conn); |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
363 return; |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
364 } |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
365 } else { |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
366 i_error("doveadm server sent invalid handshake: %s", |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
367 line); |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
368 server_connection_destroy(&conn); |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
369 return; |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
370 } |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
371 conn->handshaked = TRUE; |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
372 } |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
373 |
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
374 if (line == NULL) { |
16674
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
375 if (conn->input->eof || conn->input->stream_errno != 0) { |
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
376 server_log_disconnect_error(conn); |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
377 server_connection_destroy(&conn); |
16674
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
378 } |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
379 } |
22554
8c27d8d766bd
doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21784
diff
changeset
|
380 return; |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
381 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
382 |
15641
19403b3926f9
Several fixes to handling "istream input line too long" conditions.
Timo Sirainen <tss@iki.fi>
parents:
15578
diff
changeset
|
383 if (i_stream_read(conn->input) < 0) { |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
384 /* disconnected */ |
16674
c5c3eba6ae14
doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16667
diff
changeset
|
385 server_log_disconnect_error(conn); |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
386 server_connection_destroy(&conn); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
387 return; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
388 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
389 |
20610
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
390 while (server_connection_input_one(conn)) ; |
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
391 } |
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
392 |
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
393 static bool server_connection_input_one(struct server_connection *conn) |
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
394 { |
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
395 const unsigned char *data; |
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
396 size_t size; |
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
397 const char *line; |
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
398 int exit_code; |
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
399 |
13179
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
400 data = i_stream_get_data(conn->input, &size); |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
401 if (size == 0) |
20610
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
402 return FALSE; |
13179
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
403 |
22556
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
404 /* check logs */ |
22614
cf66220d281e
doveadm proxy: Don't crash if remote doesn't support log proxying
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22595
diff
changeset
|
405 if (conn->log_input != NULL) |
cf66220d281e
doveadm proxy: Don't crash if remote doesn't support log proxying
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22595
diff
changeset
|
406 (void)server_connection_print_log(conn); |
22556
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
407 |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
408 switch (conn->state) { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
409 case SERVER_REPLY_STATE_DONE: |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
410 i_error("doveadm server sent unexpected input"); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
411 server_connection_destroy(&conn); |
20610
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
412 return FALSE; |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
413 case SERVER_REPLY_STATE_PRINT: |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
414 server_handle_input(conn, data, size); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
415 if (conn->state != SERVER_REPLY_STATE_RET) |
20610
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
416 return FALSE; |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 /* fall through */ |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
418 case SERVER_REPLY_STATE_RET: |
14299
9d47d53650be
doveadm: Handle -NOUSER replies from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
419 line = i_stream_next_line(conn->input); |
9d47d53650be
doveadm: Handle -NOUSER replies from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
420 if (line == NULL) |
20610
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
421 return FALSE; |
14299
9d47d53650be
doveadm: Handle -NOUSER replies from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
422 if (line[0] == '+') |
16667
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
423 server_connection_callback(conn, 0, ""); |
14299
9d47d53650be
doveadm: Handle -NOUSER replies from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
424 else if (line[0] == '-') { |
16505
63092465c522
doveadm: Pass through the exit code from doveadm-server to client.
Timo Sirainen <tss@iki.fi>
parents:
16161
diff
changeset
|
425 line++; |
21784
b7f788e99e86
doveadm: Send and receive exit codes correctly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21390
diff
changeset
|
426 exit_code = doveadm_str_to_exit_code(line); |
b7f788e99e86
doveadm: Send and receive exit codes correctly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21390
diff
changeset
|
427 if (exit_code == DOVEADM_EX_UNKNOWN && |
b7f788e99e86
doveadm: Send and receive exit codes correctly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21390
diff
changeset
|
428 str_to_int(line, &exit_code) < 0) { |
16505
63092465c522
doveadm: Pass through the exit code from doveadm-server to client.
Timo Sirainen <tss@iki.fi>
parents:
16161
diff
changeset
|
429 /* old doveadm-server */ |
63092465c522
doveadm: Pass through the exit code from doveadm-server to client.
Timo Sirainen <tss@iki.fi>
parents:
16161
diff
changeset
|
430 exit_code = EX_TEMPFAIL; |
63092465c522
doveadm: Pass through the exit code from doveadm-server to client.
Timo Sirainen <tss@iki.fi>
parents:
16161
diff
changeset
|
431 } |
16667
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
432 server_connection_callback(conn, exit_code, line); |
15923
8e54e73bdade
doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents:
15922
diff
changeset
|
433 } else { |
8e54e73bdade
doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents:
15922
diff
changeset
|
434 i_error("doveadm server sent broken input " |
8e54e73bdade
doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents:
15922
diff
changeset
|
435 "(expected cmd reply): %s", line); |
8e54e73bdade
doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents:
15922
diff
changeset
|
436 server_connection_destroy(&conn); |
20610
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
437 return FALSE; |
15923
8e54e73bdade
doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents:
15922
diff
changeset
|
438 } |
15520
275a57b8dc70
doveadm: Don't disconnect from server too early while there are still commands.
Timo Sirainen <tss@iki.fi>
parents:
15289
diff
changeset
|
439 if (conn->callback == NULL) { |
275a57b8dc70
doveadm: Don't disconnect from server too early while there are still commands.
Timo Sirainen <tss@iki.fi>
parents:
15289
diff
changeset
|
440 /* we're finished, close the connection */ |
275a57b8dc70
doveadm: Don't disconnect from server too early while there are still commands.
Timo Sirainen <tss@iki.fi>
parents:
15289
diff
changeset
|
441 server_connection_destroy(&conn); |
20610
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
442 return FALSE; |
15520
275a57b8dc70
doveadm: Don't disconnect from server too early while there are still commands.
Timo Sirainen <tss@iki.fi>
parents:
15289
diff
changeset
|
443 } |
20610
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
444 return TRUE; |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
445 } |
20610
faa75dd3298b
doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20609
diff
changeset
|
446 i_unreached(); |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
447 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
448 |
13179
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
449 static int server_connection_read_settings(struct server_connection *conn) |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
450 { |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
451 const struct setting_parser_info *set_roots[] = { |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
452 &doveadm_setting_parser_info, |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
453 NULL |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
454 }; |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
455 struct master_service_settings_input input; |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
456 struct master_service_settings_output output; |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
457 const char *error; |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18897
diff
changeset
|
458 in_port_t port; |
13179
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
459 void *set; |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
460 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20612
diff
changeset
|
461 i_zero(&input); |
13179
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
462 input.roots = set_roots; |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
463 input.service = "doveadm"; |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
464 |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
465 (void)net_getsockname(conn->fd, &input.local_ip, &port); |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
466 (void)net_getpeername(conn->fd, &input.remote_ip, &port); |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
467 |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
468 if (master_service_settings_read(master_service, &input, |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
469 &output, &error) < 0) { |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
470 i_error("Error reading configuration: %s", error); |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
471 return -1; |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
472 } |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
473 set = master_service_settings_get_others(master_service)[0]; |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
474 conn->set = settings_dup(&doveadm_setting_parser_info, set, conn->pool); |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
475 return 0; |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
476 } |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
477 |
16154
970914436288
lib-ssl-iostream: ssl_iostream_set_handshake_callback() API changed.
Timo Sirainen <tss@iki.fi>
parents:
16145
diff
changeset
|
478 static int server_connection_ssl_handshaked(const char **error_r, void *context) |
15934
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
479 { |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
480 struct server_connection *conn = context; |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
481 const char *host, *p; |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
482 |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
483 host = conn->server->name; |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
484 p = strrchr(host, ':'); |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
485 if (p != NULL) |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
486 host = t_strdup_until(host, p); |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
487 |
16161
ef939a32de27
lib-ssl-iostream: Simplified certificate validation. Also give better error messages.
Timo Sirainen <tss@iki.fi>
parents:
16159
diff
changeset
|
488 if (ssl_iostream_check_cert_validity(conn->ssl_iostream, host, error_r) < 0) |
16156
4e9851e24c28
lib-ssl-iostream: If handshake callback fails, close the iostreams immediately.
Timo Sirainen <tss@iki.fi>
parents:
16154
diff
changeset
|
489 return -1; |
16161
ef939a32de27
lib-ssl-iostream: Simplified certificate validation. Also give better error messages.
Timo Sirainen <tss@iki.fi>
parents:
16159
diff
changeset
|
490 if (doveadm_debug) |
ef939a32de27
lib-ssl-iostream: Simplified certificate validation. Also give better error messages.
Timo Sirainen <tss@iki.fi>
parents:
16159
diff
changeset
|
491 i_debug("%s: SSL handshake successful", conn->server->name); |
ef939a32de27
lib-ssl-iostream: Simplified certificate validation. Also give better error messages.
Timo Sirainen <tss@iki.fi>
parents:
16159
diff
changeset
|
492 return 0; |
15934
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
493 } |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
494 |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
495 static int server_connection_init_ssl(struct server_connection *conn) |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
496 { |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
497 struct ssl_iostream_settings ssl_set; |
16145
02f6b66458b1
lib-ssl-iostream: API changes to return error strings if init() functions fail.
Timo Sirainen <tss@iki.fi>
parents:
15934
diff
changeset
|
498 const char *error; |
15934
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
499 |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
500 if (conn->server->ssl_ctx == NULL) |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
501 return 0; |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
502 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20612
diff
changeset
|
503 i_zero(&ssl_set); |
15934
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
504 ssl_set.verify_remote_cert = TRUE; |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
505 ssl_set.require_valid_cert = TRUE; |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
506 ssl_set.verbose_invalid_cert = TRUE; |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
507 |
16159
f4bac0352464
lib-ssl-iostream: Added support for TLS SNI, which caused some API changes.
Timo Sirainen <tss@iki.fi>
parents:
16156
diff
changeset
|
508 if (io_stream_create_ssl_client(conn->server->ssl_ctx, |
f4bac0352464
lib-ssl-iostream: Added support for TLS SNI, which caused some API changes.
Timo Sirainen <tss@iki.fi>
parents:
16156
diff
changeset
|
509 conn->server->name, &ssl_set, |
f4bac0352464
lib-ssl-iostream: Added support for TLS SNI, which caused some API changes.
Timo Sirainen <tss@iki.fi>
parents:
16156
diff
changeset
|
510 &conn->input, &conn->output, |
f4bac0352464
lib-ssl-iostream: Added support for TLS SNI, which caused some API changes.
Timo Sirainen <tss@iki.fi>
parents:
16156
diff
changeset
|
511 &conn->ssl_iostream, &error) < 0) { |
16145
02f6b66458b1
lib-ssl-iostream: API changes to return error strings if init() functions fail.
Timo Sirainen <tss@iki.fi>
parents:
15934
diff
changeset
|
512 i_error("Couldn't initialize SSL client: %s", error); |
15934
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
513 return -1; |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
514 } |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
515 ssl_iostream_set_handshake_callback(conn->ssl_iostream, |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
516 server_connection_ssl_handshaked, |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
517 conn); |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
518 if (ssl_iostream_handshake(conn->ssl_iostream) < 0) { |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
519 i_error("SSL handshake failed: %s", |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
520 ssl_iostream_get_last_error(conn->ssl_iostream)); |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
521 return -1; |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
522 } |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
523 return 0; |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
524 } |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
525 |
14682
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
526 int server_connection_create(struct doveadm_server *server, |
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
527 struct server_connection **conn_r) |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
528 { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
529 struct server_connection *conn; |
13179
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
530 pool_t pool; |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
531 |
13179
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
532 pool = pool_alloconly_create("doveadm server connection", 1024*16); |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
533 conn = p_new(pool, struct server_connection, 1); |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
534 conn->pool = pool; |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
535 conn->server = server; |
15922
b2bc9dd5f8d9
doveadm: When connecting to doveadm socket without :port, use doveadm_port setting.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
536 conn->fd = doveadm_connect_with_default_port(server->name, |
b2bc9dd5f8d9
doveadm: When connecting to doveadm socket without :port, use doveadm_port setting.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
537 doveadm_settings->doveadm_port); |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
538 net_set_nonblock(conn->fd, TRUE); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
539 conn->io = io_add(conn->fd, IO_READ, server_connection_input, conn); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
540 conn->input = i_stream_create_fd(conn->fd, MAX_INBUF_SIZE, FALSE); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
541 conn->output = o_stream_create_fd(conn->fd, (size_t)-1, FALSE); |
18254
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
542 o_stream_set_flush_callback(conn->output, server_connection_output, conn); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
543 |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
544 i_stream_set_name(conn->input, server->name); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
545 o_stream_set_name(conn->output, server->name); |
15934
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
546 |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
547 array_append(&conn->server->connections, &conn, 1); |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
548 |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
549 if (server_connection_read_settings(conn) < 0 || |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
550 server_connection_init_ssl(conn) < 0) { |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
551 server_connection_destroy(&conn); |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
552 return -1; |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
553 } |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
554 |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14299
diff
changeset
|
555 o_stream_set_no_error_handling(conn->output, TRUE); |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
556 conn->state = SERVER_REPLY_STATE_DONE; |
22555
e05ab5f8a8bc
doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22554
diff
changeset
|
557 o_stream_nsend_str(conn->output, DOVEADM_SERVER_PROTOCOL_VERSION_LINE"\n"); |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
558 |
14682
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
559 *conn_r = conn; |
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
560 return 0; |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
561 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
562 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
563 void server_connection_destroy(struct server_connection **_conn) |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
564 { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
565 struct server_connection *conn = *_conn; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
566 struct server_connection *const *conns; |
16667
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
567 const char *error; |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
568 unsigned int i, count; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
569 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
570 *_conn = NULL; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
571 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
572 conns = array_get(&conn->server->connections, &count); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
573 for (i = 0; i < count; i++) { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
574 if (conns[i] == conn) { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
575 array_delete(&conn->server->connections, i, 1); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
576 break; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
577 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
578 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
579 |
16667
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
580 if (conn->callback != NULL) { |
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
581 error = conn->ssl_iostream == NULL ? NULL : |
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
582 ssl_iostream_get_last_error(conn->ssl_iostream); |
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
583 if (error == NULL) { |
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
584 error = conn->input->stream_errno == 0 ? "EOF" : |
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
585 strerror(conn->input->stream_errno); |
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
586 } |
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
587 server_connection_callback(conn, SERVER_EXIT_CODE_DISCONNECTED, |
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
588 error); |
07557a9c59b1
doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents:
16505
diff
changeset
|
589 } |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
590 if (printing_conn == conn) |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
591 print_connection_released(); |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
592 |
20611
be966bc4b758
doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20610
diff
changeset
|
593 if (conn->to_input != NULL) |
be966bc4b758
doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20610
diff
changeset
|
594 timeout_remove(&conn->to_input); |
15929
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
595 if (conn->input != NULL) |
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
596 i_stream_destroy(&conn->input); |
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
597 if (conn->output != NULL) |
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
598 o_stream_destroy(&conn->output); |
18254
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
599 if (conn->cmd_input != NULL) |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
600 i_stream_destroy(&conn->cmd_input); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
601 /* close cmd_output after its parent, so the "." isn't sent */ |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
602 if (conn->cmd_output != NULL) |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
603 o_stream_destroy(&conn->cmd_output); |
15934
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
604 if (conn->ssl_iostream != NULL) |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
605 ssl_iostream_unref(&conn->ssl_iostream); |
22556
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
606 if (conn->io_log != NULL) |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
607 io_remove(&conn->io_log); |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
608 /* make sure all logs got consumed */ |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
609 if (conn->log_input != NULL) { |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
610 server_connection_print_log(conn); |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
611 i_stream_unref(&conn->log_input); |
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
612 } |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
613 if (conn->io != NULL) |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
614 io_remove(&conn->io); |
15929
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
615 if (conn->fd != -1) { |
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
616 if (close(conn->fd) < 0) |
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
617 i_error("close(server) failed: %m"); |
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
618 } |
22556
ba71422dc32f
doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22555
diff
changeset
|
619 |
13179
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
620 pool_unref(&conn->pool); |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
621 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
622 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
623 struct doveadm_server * |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
624 server_connection_get_server(struct server_connection *conn) |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
625 { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
626 return conn->server; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
627 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
628 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
629 void server_connection_cmd(struct server_connection *conn, const char *line, |
18254
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
630 struct istream *cmd_input, |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
631 server_cmd_callback_t *callback, void *context) |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
632 { |
13179
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
633 i_assert(conn->delayed_cmd == NULL); |
09eb79247e71
doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents:
13036
diff
changeset
|
634 |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
635 conn->state = SERVER_REPLY_STATE_PRINT; |
18254
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
636 if (cmd_input != NULL) { |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
637 i_assert(conn->cmd_input == NULL); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
638 i_stream_ref(cmd_input); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
639 conn->cmd_input = cmd_input; |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
640 } |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
641 if (!conn->authenticated) |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
642 conn->delayed_cmd = p_strdup(conn->pool, line); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
643 else { |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14299
diff
changeset
|
644 o_stream_nsend_str(conn->output, line); |
18254
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
645 server_connection_send_cmd_input(conn); |
22a5eda76490
doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
646 } |
11897
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
647 conn->callback = callback; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
648 conn->context = context; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
649 } |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
650 |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
651 bool server_connection_is_idle(struct server_connection *conn) |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
652 { |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
653 return conn->callback == NULL; |
b60e225386bf
doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
654 } |
15924
08edb5716823
dsync: Added tcp:host[:port] target for syncing via doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15923
diff
changeset
|
655 |
15929
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
656 void server_connection_extract(struct server_connection *conn, |
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
657 struct istream **istream_r, |
15934
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
658 struct ostream **ostream_r, |
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
659 struct ssl_iostream **ssl_iostream_r) |
15924
08edb5716823
dsync: Added tcp:host[:port] target for syncing via doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15923
diff
changeset
|
660 { |
15929
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
661 *istream_r = conn->input; |
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
662 *ostream_r = conn->output; |
15934
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
663 *ssl_iostream_r = conn->ssl_iostream; |
15929
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
664 |
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
665 conn->input = NULL; |
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
666 conn->output = NULL; |
15934
95ecdd9e13bf
dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents:
15929
diff
changeset
|
667 conn->ssl_iostream = NULL; |
15929
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
668 if (conn->io != NULL) |
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
669 io_remove(&conn->io); |
1841a4b95783
dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15924
diff
changeset
|
670 conn->fd = -1; |
15924
08edb5716823
dsync: Added tcp:host[:port] target for syncing via doveadm-server.
Timo Sirainen <tss@iki.fi>
parents:
15923
diff
changeset
|
671 } |