Mercurial > dovecot > core-2.2
annotate src/lmtp/lmtp-proxy.c @ 22545:425ee3581927
lmtp proxy: Avoid DNS lookup for "host" if passdb also returns "hostip"
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Fri, 08 Sep 2017 11:02:07 +0300 |
parents | 2e2563132d5f |
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) 2009-2017 Dovecot authors, see the included COPYING file */ |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "ioloop.h" |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "istream.h" |
17523
1b9356dbfca2
lmtp proxy: Make sure DATA stream size doesn't change unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
17513
diff
changeset
|
7 #include "istream-sized.h" |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "ostream.h" |
18438
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
9 #include "str.h" |
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
10 #include "time-util.h" |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include "lmtp-client.h" |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include "lmtp-proxy.h" |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #define LMTP_MAX_LINE_LEN 1024 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 struct lmtp_proxy_recipient { |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 struct lmtp_proxy_connection *conn; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 const char *address; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 const char *reply; |
18438
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
20 unsigned int idx; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 unsigned int rcpt_to_failed:1; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 unsigned int data_reply_received:1; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 }; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 struct lmtp_proxy_connection { |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 struct lmtp_proxy *proxy; |
14151
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
28 struct lmtp_proxy_rcpt_settings set; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 struct lmtp_client *client; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 struct istream *data_input; |
13846
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
32 struct timeout *to; |
10415 | 33 |
34 unsigned int finished:1; | |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 unsigned int failed:1; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 }; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 struct lmtp_proxy { |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 pool_t pool; |
14151
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
40 const char *mail_from; |
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
41 struct lmtp_proxy_settings set; |
10825
cc3f6adc1e0b
lmtp proxy: Added support for DNS lookups.
Timo Sirainen <tss@iki.fi>
parents:
10824
diff
changeset
|
42 |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14840
diff
changeset
|
43 ARRAY(struct lmtp_proxy_connection *) connections; |
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14840
diff
changeset
|
44 ARRAY(struct lmtp_proxy_recipient *) rcpt_to; |
10398
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
45 unsigned int next_data_reply_idx; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
13846
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
47 struct timeout *to_finish; |
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
48 struct istream *data_input; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 struct ostream *client_output; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 |
9900
22d27318bb18
lmtp client, proxy: Several bugfixes.
Timo Sirainen <tss@iki.fi>
parents:
9832
diff
changeset
|
51 unsigned int max_timeout_msecs; |
22d27318bb18
lmtp client, proxy: Several bugfixes.
Timo Sirainen <tss@iki.fi>
parents:
9832
diff
changeset
|
52 |
10400
96152031f5d9
lmtp proxy: More error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
10399
diff
changeset
|
53 lmtp_proxy_finish_callback_t *finish_callback; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 void *finish_context; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 unsigned int finished:1; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 }; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 |
10398
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
59 static void lmtp_conn_finish(void *context); |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 struct lmtp_proxy * |
14151
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
62 lmtp_proxy_init(const struct lmtp_proxy_settings *set, |
10825
cc3f6adc1e0b
lmtp proxy: Added support for DNS lookups.
Timo Sirainen <tss@iki.fi>
parents:
10824
diff
changeset
|
63 struct ostream *client_output) |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 { |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 struct lmtp_proxy *proxy; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 pool_t pool; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 |
15887
48c1c58948f5
proxying cleanup: Send TTL=1 (instead of TTL=0) as "no more proxying".
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
68 i_assert(set->proxy_ttl > 0); |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 o_stream_ref(client_output); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 pool = pool_alloconly_create("lmtp proxy", 1024); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 proxy = p_new(pool, struct lmtp_proxy, 1); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 proxy->pool = pool; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 proxy->client_output = client_output; |
14151
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
75 proxy->set.my_hostname = p_strdup(pool, set->my_hostname); |
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
76 proxy->set.dns_client_socket_path = |
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
77 p_strdup(pool, set->dns_client_socket_path); |
15005 | 78 proxy->set.session_id = p_strdup(pool, set->session_id); |
14151
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
79 proxy->set.source_ip = set->source_ip; |
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
80 proxy->set.source_port = set->source_port; |
14162
ba06ea38c722
imap/pop3/lmtp proxy: Implemented detection of proxy loops with TTL.
Timo Sirainen <tss@iki.fi>
parents:
14151
diff
changeset
|
81 proxy->set.proxy_ttl = set->proxy_ttl; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 i_array_init(&proxy->rcpt_to, 32); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 i_array_init(&proxy->connections, 32); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 return proxy; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 } |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 static void lmtp_proxy_connections_deinit(struct lmtp_proxy *proxy) |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 { |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 struct lmtp_proxy_connection *const *conns; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 |
10406 | 91 array_foreach(&proxy->connections, conns) { |
92 struct lmtp_proxy_connection *conn = *conns; | |
93 | |
94 lmtp_client_deinit(&conn->client); | |
10397
9500cfbe5dbf
lmtp proxy: Error handling fix.
Timo Sirainen <tss@iki.fi>
parents:
10396
diff
changeset
|
95 } |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 } |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 void lmtp_proxy_deinit(struct lmtp_proxy **_proxy) |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 { |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 struct lmtp_proxy *proxy = *_proxy; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 *_proxy = NULL; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 lmtp_proxy_connections_deinit(proxy); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 if (proxy->data_input != NULL) |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 i_stream_unref(&proxy->data_input); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 if (proxy->client_output != NULL) |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 o_stream_unref(&proxy->client_output); |
10824 | 109 if (proxy->to_finish != NULL) |
110 timeout_remove(&proxy->to_finish); | |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 array_free(&proxy->rcpt_to); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 array_free(&proxy->connections); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 pool_unref(&proxy->pool); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 } |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 void lmtp_proxy_mail_from(struct lmtp_proxy *proxy, const char *value) |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 { |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 proxy->mail_from = p_strdup(proxy->pool, value); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 } |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 static struct lmtp_proxy_connection * |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 lmtp_proxy_get_connection(struct lmtp_proxy *proxy, |
14151
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
123 const struct lmtp_proxy_rcpt_settings *set) |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 { |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 struct lmtp_proxy_connection *const *conns, *conn; |
10825
cc3f6adc1e0b
lmtp proxy: Added support for DNS lookups.
Timo Sirainen <tss@iki.fi>
parents:
10824
diff
changeset
|
126 struct lmtp_client_settings client_set; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 |
9900
22d27318bb18
lmtp client, proxy: Several bugfixes.
Timo Sirainen <tss@iki.fi>
parents:
9832
diff
changeset
|
128 i_assert(set->timeout_msecs > 0); |
22d27318bb18
lmtp client, proxy: Several bugfixes.
Timo Sirainen <tss@iki.fi>
parents:
9832
diff
changeset
|
129 |
10406 | 130 array_foreach(&proxy->connections, conns) { |
131 conn = *conns; | |
132 | |
133 if (conn->set.port == set->port && | |
134 strcmp(conn->set.host, set->host) == 0) | |
135 return conn; | |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 } |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 |
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:
19552
diff
changeset
|
138 i_zero(&client_set); |
10825
cc3f6adc1e0b
lmtp proxy: Added support for DNS lookups.
Timo Sirainen <tss@iki.fi>
parents:
10824
diff
changeset
|
139 client_set.mail_from = proxy->mail_from; |
14151
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
140 client_set.my_hostname = proxy->set.my_hostname; |
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
141 client_set.dns_client_socket_path = proxy->set.dns_client_socket_path; |
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
142 client_set.source_ip = proxy->set.source_ip; |
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
143 client_set.source_port = proxy->set.source_port; |
15887
48c1c58948f5
proxying cleanup: Send TTL=1 (instead of TTL=0) as "no more proxying".
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
144 client_set.proxy_ttl = proxy->set.proxy_ttl; |
14960
6d2a439a10a6
lmtp proxy: Forward proxy_timeout to backend and set mail_max_lock_timeout based on it.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
145 client_set.proxy_timeout_secs = set->timeout_msecs/1000; |
10825
cc3f6adc1e0b
lmtp proxy: Added support for DNS lookups.
Timo Sirainen <tss@iki.fi>
parents:
10824
diff
changeset
|
146 |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 conn = p_new(proxy->pool, struct lmtp_proxy_connection, 1); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 conn->proxy = proxy; |
22545
425ee3581927
lmtp proxy: Avoid DNS lookup for "host" if passdb also returns "hostip"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
149 if (set->hostip.family == 0) |
425ee3581927
lmtp proxy: Avoid DNS lookup for "host" if passdb also returns "hostip"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
150 conn->set.host = p_strdup(proxy->pool, set->host); |
425ee3581927
lmtp proxy: Avoid DNS lookup for "host" if passdb also returns "hostip"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
151 else |
425ee3581927
lmtp proxy: Avoid DNS lookup for "host" if passdb also returns "hostip"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
152 conn->set.host = p_strdup(proxy->pool, net_ip2addr(&set->hostip)); |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 conn->set.port = set->port; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 conn->set.timeout_msecs = set->timeout_msecs; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 array_append(&proxy->connections, &conn, 1); |
10825
cc3f6adc1e0b
lmtp proxy: Added support for DNS lookups.
Timo Sirainen <tss@iki.fi>
parents:
10824
diff
changeset
|
156 |
cc3f6adc1e0b
lmtp proxy: Added support for DNS lookups.
Timo Sirainen <tss@iki.fi>
parents:
10824
diff
changeset
|
157 conn->client = lmtp_client_init(&client_set, lmtp_conn_finish, conn); |
9900
22d27318bb18
lmtp client, proxy: Several bugfixes.
Timo Sirainen <tss@iki.fi>
parents:
9832
diff
changeset
|
158 if (lmtp_client_connect_tcp(conn->client, set->protocol, |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 conn->set.host, conn->set.port) < 0) |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 conn->failed = TRUE; |
9900
22d27318bb18
lmtp client, proxy: Several bugfixes.
Timo Sirainen <tss@iki.fi>
parents:
9832
diff
changeset
|
161 |
22d27318bb18
lmtp client, proxy: Several bugfixes.
Timo Sirainen <tss@iki.fi>
parents:
9832
diff
changeset
|
162 if (proxy->max_timeout_msecs < set->timeout_msecs) |
22d27318bb18
lmtp client, proxy: Several bugfixes.
Timo Sirainen <tss@iki.fi>
parents:
9832
diff
changeset
|
163 proxy->max_timeout_msecs = set->timeout_msecs; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 return conn; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 } |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 |
10398
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
167 static bool lmtp_proxy_send_data_replies(struct lmtp_proxy *proxy) |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 { |
10415 | 169 struct lmtp_proxy_recipient *const *rcpt; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 unsigned int i, count; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 o_stream_cork(proxy->client_output); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 rcpt = array_get(&proxy->rcpt_to, &count); |
10398
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
174 for (i = proxy->next_data_reply_idx; i < count; i++) { |
10415 | 175 if (!(rcpt[i]->rcpt_to_failed || rcpt[i]->data_reply_received)) |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 break; |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14162
diff
changeset
|
177 o_stream_nsend_str(proxy->client_output, |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14162
diff
changeset
|
178 t_strconcat(rcpt[i]->reply, "\r\n", NULL)); |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 } |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 o_stream_uncork(proxy->client_output); |
10398
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
181 proxy->next_data_reply_idx = i; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 return i == count; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 } |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 |
10415 | 186 static void lmtp_proxy_finish_timeout(struct lmtp_proxy *proxy) |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 { |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 i_assert(!proxy->finished); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 |
10415 | 190 timeout_remove(&proxy->to_finish); |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 proxy->finished = TRUE; |
13846
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
192 proxy->finish_callback(proxy->finish_context); |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 } |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 |
13846
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
195 static void lmtp_proxy_try_finish(struct lmtp_proxy *proxy) |
10415 | 196 { |
13846
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
197 if (proxy->finish_callback == NULL) { |
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
198 /* DATA command hasn't been sent yet */ |
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
199 return; |
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
200 } |
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
201 if (!lmtp_proxy_send_data_replies(proxy)) { |
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
202 /* we can't received reply from all clients yet */ |
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
203 return; |
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
204 } |
10415 | 205 /* do the actual finishing in a timeout handler, since the finish |
206 callback causes the proxy to be destroyed and the code leading up | |
207 to this function can be called from many different places. it's | |
208 easier this way rather than having all the callers check if the | |
209 proxy was already destroyed. */ | |
210 if (proxy->to_finish == NULL) { | |
211 proxy->to_finish = timeout_add(0, lmtp_proxy_finish_timeout, | |
212 proxy); | |
213 } | |
214 } | |
215 | |
10398
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
216 static void lmtp_conn_finish(void *context) |
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
217 { |
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
218 struct lmtp_proxy_connection *conn = context; |
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
219 |
10415 | 220 conn->finished = TRUE; |
13846
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
221 if (conn->to != NULL) |
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
222 timeout_remove(&conn->to); |
10399
8f6995923fbd
lmtp proxy: Don't crash if all RCPT TOs fail to a remote.
Timo Sirainen <tss@iki.fi>
parents:
10398
diff
changeset
|
223 if (conn->data_input != NULL) |
8f6995923fbd
lmtp proxy: Don't crash if all RCPT TOs fail to a remote.
Timo Sirainen <tss@iki.fi>
parents:
10398
diff
changeset
|
224 i_stream_unref(&conn->data_input); |
10398
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
225 lmtp_proxy_try_finish(conn->proxy); |
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
226 } |
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
227 |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 static void |
17866
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
229 lmtp_proxy_conn_rcpt_to(enum lmtp_client_result result, |
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
230 const char *reply, void *context) |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 { |
10398
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
232 struct lmtp_proxy_recipient *rcpt = context; |
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
233 struct lmtp_proxy_connection *conn = rcpt->conn; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 |
10398
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
235 i_assert(rcpt->reply == NULL); |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 |
10398
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
237 rcpt->reply = p_strdup(conn->proxy->pool, reply); |
17866
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
238 rcpt->rcpt_to_failed = result != LMTP_CLIENT_RESULT_OK; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 } |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 static void |
17866
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
242 lmtp_proxy_conn_data(enum lmtp_client_result result, |
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
243 const char *reply, void *context) |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 { |
10398
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
245 struct lmtp_proxy_recipient *rcpt = context; |
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
246 struct lmtp_proxy_connection *conn = rcpt->conn; |
18438
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
247 const struct lmtp_client_times *times = |
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
248 lmtp_client_get_times(conn->client); |
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
249 string_t *msg; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 |
10398
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
251 i_assert(!rcpt->rcpt_to_failed); |
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
252 i_assert(rcpt->reply != NULL); |
10396 | 253 |
14764
27dccff46fe9
lmtp proxy: Reset timeout each time receiving a reply lin for DATA.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
254 /* reset timeout in case there are a lot of RCPT TOs */ |
14766
569588ff7ef0
lmtp: Fixed previous change to make sure it doesn't crash on error handling.
Timo Sirainen <tss@iki.fi>
parents:
14764
diff
changeset
|
255 if (conn->to != NULL) |
569588ff7ef0
lmtp: Fixed previous change to make sure it doesn't crash on error handling.
Timo Sirainen <tss@iki.fi>
parents:
14764
diff
changeset
|
256 timeout_reset(conn->to); |
14764
27dccff46fe9
lmtp proxy: Reset timeout each time receiving a reply lin for DATA.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
257 |
10398
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
258 rcpt->reply = p_strdup(conn->proxy->pool, reply); |
a144e918938c
LMTP client API changes. Should be easier to use now.
Timo Sirainen <tss@iki.fi>
parents:
10397
diff
changeset
|
259 rcpt->data_reply_received = TRUE; |
11496
2d6cf78982dc
lmtp proxy: Fixed 30 second delay after finishing DATA.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
260 |
18438
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
261 msg = t_str_new(128); |
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
262 str_printfa(msg, "%s: ", conn->proxy->set.session_id); |
17866
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
263 switch (result) { |
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
264 case LMTP_CLIENT_RESULT_OK: |
18438
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
265 str_append(msg, "Sent message to"); |
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
266 break; |
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
267 case LMTP_CLIENT_RESULT_REMOTE_ERROR: |
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
268 case LMTP_CLIENT_RESULT_INTERNAL_ERROR: |
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
269 str_append(msg, "Failed to send message to"); |
17866
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
270 break; |
18438
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
271 } |
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
272 str_printfa(msg, " <%s> at %s:%u: %s (%u/%u at %u ms)", |
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
273 rcpt->address, conn->set.host, conn->set.port, reply, |
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
274 rcpt->idx + 1, array_count(&conn->proxy->rcpt_to), |
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
275 timeval_diff_msecs(&ioloop_timeval, ×->connect_started)); |
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
276 switch (result) { |
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
277 case LMTP_CLIENT_RESULT_OK: |
17866
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
278 case LMTP_CLIENT_RESULT_REMOTE_ERROR: |
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
279 /* the problem isn't with the proxy, it's with the remote side. |
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
280 so the remote side will log an error, while for us this is |
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
281 just an info event */ |
18438
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
282 i_info("%s", str_c(msg)); |
17866
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
283 break; |
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
284 case LMTP_CLIENT_RESULT_INTERNAL_ERROR: |
18438
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
285 i_error("%s", str_c(msg)); |
17866
f21d82a32ca8
lib-lda, lmtp: Separate internal errors from remote errors.
Timo Sirainen <tss@iki.fi>
parents:
17523
diff
changeset
|
286 break; |
17494
20e8ed98357b
lmtp: Proxying now logs successful and failed deliveries after DATA.
Timo Sirainen <tss@iki.fi>
parents:
17493
diff
changeset
|
287 } |
11496
2d6cf78982dc
lmtp proxy: Fixed 30 second delay after finishing DATA.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
288 lmtp_proxy_try_finish(conn->proxy); |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 } |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 int lmtp_proxy_add_rcpt(struct lmtp_proxy *proxy, const char *address, |
14151
1bc56eec3f8e
lmtp proxy: Send client's IP/port to destination server via XCLIENT if possible.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
292 const struct lmtp_proxy_rcpt_settings *set) |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 { |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 struct lmtp_proxy_connection *conn; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 struct lmtp_proxy_recipient *rcpt; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 conn = lmtp_proxy_get_connection(proxy, set); |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 if (conn->failed) |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 return -1; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 |
10415 | 301 rcpt = p_new(proxy->pool, struct lmtp_proxy_recipient, 1); |
18438
b64bcee2ffa0
lmtp proxy: Include in log messages how long it took to deliver the mail.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
302 rcpt->idx = array_count(&proxy->rcpt_to); |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 rcpt->conn = conn; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 rcpt->address = p_strdup(proxy->pool, address); |
10415 | 305 array_append(&proxy->rcpt_to, &rcpt, 1); |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 |
18074
3db5fbb216d3
lmtp: Added support for DSN ORCPT parameter.
Timo Sirainen <tss@iki.fi>
parents:
17866
diff
changeset
|
307 lmtp_client_add_rcpt_params(conn->client, address, &set->params, |
3db5fbb216d3
lmtp: Added support for DSN ORCPT parameter.
Timo Sirainen <tss@iki.fi>
parents:
17866
diff
changeset
|
308 lmtp_proxy_conn_rcpt_to, |
3db5fbb216d3
lmtp: Added support for DSN ORCPT parameter.
Timo Sirainen <tss@iki.fi>
parents:
17866
diff
changeset
|
309 lmtp_proxy_conn_data, rcpt); |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 return 0; |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 } |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 |
13846
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
313 static void lmtp_proxy_conn_timeout(struct lmtp_proxy_connection *conn) |
12240
1f784904111b
lmtp proxy: Avoid hanging at the end of message input.
Timo Sirainen <tss@iki.fi>
parents:
11496
diff
changeset
|
314 { |
13846
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
315 const char *line; |
10284
2ad1ad1e1083
lmtp proxy: Added data input timeout.
Timo Sirainen <tss@iki.fi>
parents:
10278
diff
changeset
|
316 |
13846
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
317 line = t_strdup_printf(ERRSTR_TEMP_REMOTE_FAILURE |
15000
bde62f77c65a
lmtp proxy: Include session ID string in timeout reply text.
Timo Sirainen <tss@iki.fi>
parents:
14766
diff
changeset
|
318 " (timeout while waiting for reply to %s) <%s>", |
bde62f77c65a
lmtp proxy: Include session ID string in timeout reply text.
Timo Sirainen <tss@iki.fi>
parents:
14766
diff
changeset
|
319 lmtp_client_state_to_string(conn->client), |
15005 | 320 conn->proxy->set.session_id); |
13846
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
321 lmtp_client_fail(conn->client, line); |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 } |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 void lmtp_proxy_start(struct lmtp_proxy *proxy, struct istream *data_input, |
10400
96152031f5d9
lmtp proxy: More error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
10399
diff
changeset
|
325 lmtp_proxy_finish_callback_t *callback, void *context) |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 { |
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 struct lmtp_proxy_connection *const *conns; |
17523
1b9356dbfca2
lmtp proxy: Make sure DATA stream size doesn't change unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
17513
diff
changeset
|
328 uoff_t size; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 |
13846
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
330 i_assert(data_input->seekable); |
17513
119adb7d2479
lmtp: Create all proxy DATA streams before reading from them.
Timo Sirainen <tss@iki.fi>
parents:
17494
diff
changeset
|
331 i_assert(proxy->data_input == NULL); |
13846
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
332 |
10400
96152031f5d9
lmtp proxy: More error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
10399
diff
changeset
|
333 proxy->finish_callback = callback; |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 proxy->finish_context = context; |
13846
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
335 proxy->data_input = data_input; |
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
336 i_stream_ref(proxy->data_input); |
17523
1b9356dbfca2
lmtp proxy: Make sure DATA stream size doesn't change unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
17513
diff
changeset
|
337 if (i_stream_get_size(proxy->data_input, TRUE, &size) < 0) { |
1b9356dbfca2
lmtp proxy: Make sure DATA stream size doesn't change unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
17513
diff
changeset
|
338 i_error("i_stream_get_size(data_input) failed: %s", |
1b9356dbfca2
lmtp proxy: Make sure DATA stream size doesn't change unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
17513
diff
changeset
|
339 i_stream_get_error(proxy->data_input)); |
1b9356dbfca2
lmtp proxy: Make sure DATA stream size doesn't change unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
17513
diff
changeset
|
340 size = (uoff_t)-1; |
1b9356dbfca2
lmtp proxy: Make sure DATA stream size doesn't change unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
17513
diff
changeset
|
341 } |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 |
17513
119adb7d2479
lmtp: Create all proxy DATA streams before reading from them.
Timo Sirainen <tss@iki.fi>
parents:
17494
diff
changeset
|
343 /* create the data_input streams first */ |
10406 | 344 array_foreach(&proxy->connections, conns) { |
345 struct lmtp_proxy_connection *conn = *conns; | |
346 | |
10415 | 347 if (conn->finished) { |
348 /* this connection had already failed */ | |
349 continue; | |
350 } | |
351 | |
13846
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
352 conn->to = timeout_add(proxy->max_timeout_msecs, |
51d87deb5c26
lmtp: Simplify LMTP proxying by first reading the whole input to memory/disk.
Timo Sirainen <tss@iki.fi>
parents:
13477
diff
changeset
|
353 lmtp_proxy_conn_timeout, conn); |
17523
1b9356dbfca2
lmtp proxy: Make sure DATA stream size doesn't change unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
17513
diff
changeset
|
354 if (size == (uoff_t)-1) |
1b9356dbfca2
lmtp proxy: Make sure DATA stream size doesn't change unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
17513
diff
changeset
|
355 conn->data_input = i_stream_create_limit(data_input, (uoff_t)-1); |
1b9356dbfca2
lmtp proxy: Make sure DATA stream size doesn't change unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
17513
diff
changeset
|
356 else |
1b9356dbfca2
lmtp proxy: Make sure DATA stream size doesn't change unexpectedly.
Timo Sirainen <tss@iki.fi>
parents:
17513
diff
changeset
|
357 conn->data_input = i_stream_create_sized(data_input, size); |
17513
119adb7d2479
lmtp: Create all proxy DATA streams before reading from them.
Timo Sirainen <tss@iki.fi>
parents:
17494
diff
changeset
|
358 } |
119adb7d2479
lmtp: Create all proxy DATA streams before reading from them.
Timo Sirainen <tss@iki.fi>
parents:
17494
diff
changeset
|
359 /* now that all the streams are created, start reading them |
119adb7d2479
lmtp: Create all proxy DATA streams before reading from them.
Timo Sirainen <tss@iki.fi>
parents:
17494
diff
changeset
|
360 (reading them earlier could have caused the data_input parent's |
119adb7d2479
lmtp: Create all proxy DATA streams before reading from them.
Timo Sirainen <tss@iki.fi>
parents:
17494
diff
changeset
|
361 offset to change) */ |
119adb7d2479
lmtp: Create all proxy DATA streams before reading from them.
Timo Sirainen <tss@iki.fi>
parents:
17494
diff
changeset
|
362 array_foreach(&proxy->connections, conns) { |
119adb7d2479
lmtp: Create all proxy DATA streams before reading from them.
Timo Sirainen <tss@iki.fi>
parents:
17494
diff
changeset
|
363 struct lmtp_proxy_connection *conn = *conns; |
10415 | 364 |
17513
119adb7d2479
lmtp: Create all proxy DATA streams before reading from them.
Timo Sirainen <tss@iki.fi>
parents:
17494
diff
changeset
|
365 if (conn->data_input != NULL) { |
119adb7d2479
lmtp: Create all proxy DATA streams before reading from them.
Timo Sirainen <tss@iki.fi>
parents:
17494
diff
changeset
|
366 lmtp_client_send(conn->client, conn->data_input); |
119adb7d2479
lmtp: Create all proxy DATA streams before reading from them.
Timo Sirainen <tss@iki.fi>
parents:
17494
diff
changeset
|
367 lmtp_client_send_more(conn->client); |
119adb7d2479
lmtp: Create all proxy DATA streams before reading from them.
Timo Sirainen <tss@iki.fi>
parents:
17494
diff
changeset
|
368 } |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
369 } |
15287
38727d3e90ec
lmtp: Fixed hanging on proxying if remote server was down.
Timo Sirainen <tss@iki.fi>
parents:
15000
diff
changeset
|
370 /* finish if all of the connections have already failed */ |
38727d3e90ec
lmtp: Fixed hanging on proxying if remote server was down.
Timo Sirainen <tss@iki.fi>
parents:
15000
diff
changeset
|
371 lmtp_proxy_try_finish(proxy); |
9832
3a16bec9c961
lmtp: Added initial support for proxying mails to other LMTP/SMTP servers.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
372 } |