annotate src/login-common/login-proxy.c @ 22715:20415dd0b85a

dsync: Add per-mailbox sync lock that is always used. Both importing and exporting gets the lock before they even sync the mailbox. The lock is kept until the import/export finishes. This guarantees that no matter how dsync is run, two dsyncs can't be working on the same mailbox at the same time. This lock is in addition to the optional per-user lock enabled by the -l parameter. If the -l parameter is used, the same lock timeout is used for the per-mailbox lock. Otherwise 30s timeout is used. This should help to avoid email duplication when replication is enabled for public namespaces, and maybe in some other rare situations as well.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 28 Dec 2017 14:10:23 +0200
parents cb108f786fb4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 22478
diff changeset
1 /* Copyright (c) 2004-2018 Dovecot authors, see the included COPYING file */
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
10549
9ae939146ff7 login-common: Renamed common.h to login-common.h
Timo Sirainen <tss@iki.fi>
parents: 10224
diff changeset
3 #include "login-common.h"
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "ioloop.h"
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "istream.h"
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "ostream.h"
7119
8c6a7af67e8c Replaced clients hash with a linked list.
Timo Sirainen <tss@iki.fi>
parents: 7117
diff changeset
7 #include "llist.h"
20841
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
8 #include "array.h"
15501
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
9 #include "str.h"
20841
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
10 #include "strescape.h"
7117
769181a20483 Make sure all user input is sanitized before it's logged.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
11 #include "str-sanitize.h"
9774
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
12 #include "time-util.h"
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
13 #include "master-service.h"
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
14 #include "ipc-server.h"
14292
817ef4c9f1f3 Added director_username_hash setting to specify what part of the username is hashed.
Timo Sirainen <tss@iki.fi>
parents: 14258
diff changeset
15 #include "mail-user-hash.h"
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "client-common.h"
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
17 #include "ssl-proxy.h"
9774
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
18 #include "login-proxy-state.h"
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #include "login-proxy.h"
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
21
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
22 #define MAX_PROXY_INPUT_SIZE 4096
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 #define OUTBUF_THRESHOLD 1024
10171
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
24 #define LOGIN_PROXY_DIE_IDLE_SECS 2
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
25 #define LOGIN_PROXY_IPC_PATH "ipc-proxy"
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
26 #define LOGIN_PROXY_IPC_NAME "proxy"
19327
a98aaaf55b13 login proxy: Separate admin kicks, director kicks and shutdowns in log messages.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
27 #define KILLED_BY_ADMIN_REASON "Kicked by admin"
a98aaaf55b13 login proxy: Separate admin kicks, director kicks and shutdowns in log messages.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
28 #define KILLED_BY_DIRECTOR_REASON "Kicked via director"
a98aaaf55b13 login proxy: Separate admin kicks, director kicks and shutdowns in log messages.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
29 #define KILLED_BY_SHUTDOWN_REASON "Process shutting down"
14258
53b23557ec54 login proxy: Don't assume host is down unless last success was >30s before last failure.
Timo Sirainen <tss@iki.fi>
parents: 14207
diff changeset
30 #define PROXY_IMMEDIATE_FAILURE_SECS 30
17991
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
31 #define PROXY_CONNECT_RETRY_MSECS 1000
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
32 #define PROXY_DISCONNECT_INTERVAL_MSECS 100
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 struct login_proxy {
7119
8c6a7af67e8c Replaced clients hash with a linked list.
Timo Sirainen <tss@iki.fi>
parents: 7117
diff changeset
35 struct login_proxy *prev, *next;
8c6a7af67e8c Replaced clients hash with a linked list.
Timo Sirainen <tss@iki.fi>
parents: 7117
diff changeset
36
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
37 struct client *client;
3049
7f503848533e s/proxy/server/ for variables describing remote server.
Timo Sirainen <tss@iki.fi>
parents: 2790
diff changeset
38 int client_fd, server_fd;
7f503848533e s/proxy/server/ for variables describing remote server.
Timo Sirainen <tss@iki.fi>
parents: 2790
diff changeset
39 struct io *client_io, *server_io;
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
40 struct istream *client_input, *server_input;
3049
7f503848533e s/proxy/server/ for variables describing remote server.
Timo Sirainen <tss@iki.fi>
parents: 2790
diff changeset
41 struct ostream *client_output, *server_output;
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
42 struct ssl_proxy *ssl_server_proxy;
10171
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
43 time_t last_io;
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44
9774
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
45 struct timeval created;
11324
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
46 struct timeout *to, *to_notify;
9774
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
47 struct login_proxy_record *state_rec;
9773
8e099a00f8a9 login proxy: Added client_proxy passdb extra field to specify proxy's connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 9756
diff changeset
48
17503
75d254897442 login proxy: If passdb returns "source_ip" extra field, use it for outgoing connections.
Timo Sirainen <tss@iki.fi>
parents: 17440
diff changeset
49 struct ip_addr ip, source_ip;
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
50 char *host;
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
51 in_port_t port;
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
52 unsigned int connect_timeout_msecs;
11324
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
53 unsigned int notify_refresh_secs;
17991
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
54 unsigned int reconnect_count;
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
55 enum login_proxy_ssl_flags ssl_flags;
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
56
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
57 proxy_callback_t *callback;
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
58
16085
a4ea6946c621 login proxy: Stop proxy_timeout only after successfully logged in (not after connected).
Timo Sirainen <tss@iki.fi>
parents: 15887
diff changeset
59 unsigned int connected:1;
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
60 unsigned int destroying:1;
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
61 unsigned int disconnecting:1;
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
62 unsigned int delayed_disconnect:1;
19087
1a4445b58279 login proxy: Always keep proxy->state_rec available.
Timo Sirainen <tss@iki.fi>
parents: 19086
diff changeset
63 unsigned int num_waiting_connections_updated:1;
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 };
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65
9774
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
66 static struct login_proxy_state *proxy_state;
7119
8c6a7af67e8c Replaced clients hash with a linked list.
Timo Sirainen <tss@iki.fi>
parents: 7117
diff changeset
67 static struct login_proxy *login_proxies = NULL;
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
68 static struct login_proxy *login_proxies_pending = NULL;
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
69 static struct login_proxy *login_proxies_disconnecting = NULL;
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
70 static struct ipc_server *login_proxy_ipc_server;
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
71
17991
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
72 static int login_proxy_connect(struct login_proxy *proxy);
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
73 static void login_proxy_disconnect(struct login_proxy *proxy);
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
74 static void login_proxy_ipc_cmd(struct ipc_cmd *cmd, const char *line);
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
75 static void login_proxy_free_final(struct login_proxy *proxy);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
13043
d1c2cc4c513d login proxy: Show in disconnect reason who did the disconnection and possible error.
Timo Sirainen <tss@iki.fi>
parents: 13041
diff changeset
77 static void
14629
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14576
diff changeset
78 login_proxy_free_reason(struct login_proxy **_proxy, const char *reason)
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14576
diff changeset
79 ATTR_NULL(2);
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
80 static void
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
81 login_proxy_free_delayed(struct login_proxy **_proxy, const char *reason)
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
82 ATTR_NULL(2);
13043
d1c2cc4c513d login proxy: Show in disconnect reason who did the disconnection and possible error.
Timo Sirainen <tss@iki.fi>
parents: 13041
diff changeset
83
19352
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
84 static void login_proxy_free_errstr(struct login_proxy **_proxy,
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
85 const char *errstr, bool server)
13043
d1c2cc4c513d login proxy: Show in disconnect reason who did the disconnection and possible error.
Timo Sirainen <tss@iki.fi>
parents: 13041
diff changeset
86 {
19351
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
87 struct login_proxy *proxy = *_proxy;
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
88 string_t *reason = t_str_new(128);
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
89
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
90 str_printfa(reason, "Disconnected by %s", server ? "server" : "client");
19352
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
91 if (errstr[0] != '\0')
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
92 str_printfa(reason, ": %s", errstr);
13043
d1c2cc4c513d login proxy: Show in disconnect reason who did the disconnection and possible error.
Timo Sirainen <tss@iki.fi>
parents: 13041
diff changeset
93
19351
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
94 str_printfa(reason, "(%ds idle, in=%"PRIuUOFF_T", out=%"PRIuUOFF_T,
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
95 (int)(ioloop_time - proxy->last_io),
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
96 proxy->server_output->offset, proxy->client_output->offset);
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
97 if (o_stream_get_buffer_used_size(proxy->client_output) > 0) {
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
98 str_printfa(reason, "+%"PRIuSIZE_T,
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
99 o_stream_get_buffer_used_size(proxy->client_output));
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
100 }
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
101 if (proxy->server_io == NULL)
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
102 str_append(reason, ", client output blocked");
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
103 if (proxy->client_io == NULL)
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
104 str_append(reason, ", server output blocked");
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
105 str_append_c(reason, ')');
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
106 if (server)
19351
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
107 login_proxy_free_delayed(_proxy, str_c(reason));
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
108 else
19351
9dd14c376418 login proxy: Include some extra information in disconnect log lines.
Timo Sirainen <tss@iki.fi>
parents: 19327
diff changeset
109 login_proxy_free_reason(_proxy, str_c(reason));
13043
d1c2cc4c513d login proxy: Show in disconnect reason who did the disconnection and possible error.
Timo Sirainen <tss@iki.fi>
parents: 13041
diff changeset
110 }
d1c2cc4c513d login proxy: Show in disconnect reason who did the disconnection and possible error.
Timo Sirainen <tss@iki.fi>
parents: 13041
diff changeset
111
19352
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
112 static void login_proxy_free_errno(struct login_proxy **_proxy,
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
113 int err, bool server)
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
114 {
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
115 const char *errstr;
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
116
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
117 errstr = err == 0 || err == EPIPE ? "" : strerror(err);
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
118 login_proxy_free_errstr(_proxy, errstr, server);
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
119 }
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
120
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
121 static void login_proxy_free_ostream(struct login_proxy **_proxy,
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
122 struct ostream *output, bool server)
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
123 {
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
124 const char *errstr;
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
125
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
126 errstr = output->stream_errno == 0 ||
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
127 output->stream_errno == EPIPE ? "" :
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
128 o_stream_get_error(output);
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
129 login_proxy_free_errstr(_proxy, errstr, server);
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
130 }
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
131
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
132 static void server_input(struct login_proxy *proxy)
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 {
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 unsigned char buf[OUTBUF_THRESHOLD];
16880
2d3d73d03fe2 login proxy: Use corking when writing data.
Timo Sirainen <tss@iki.fi>
parents: 16345
diff changeset
135 ssize_t ret, ret2;
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136
10171
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
137 proxy->last_io = ioloop_time;
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 if (o_stream_get_buffer_used_size(proxy->client_output) >
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 OUTBUF_THRESHOLD) {
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 /* client's output buffer is already quite full.
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 don't send more until we're below threshold. */
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3049
diff changeset
142 io_remove(&proxy->server_io);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 return;
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 }
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145
3049
7f503848533e s/proxy/server/ for variables describing remote server.
Timo Sirainen <tss@iki.fi>
parents: 2790
diff changeset
146 ret = net_receive(proxy->server_fd, buf, sizeof(buf));
16880
2d3d73d03fe2 login proxy: Use corking when writing data.
Timo Sirainen <tss@iki.fi>
parents: 16345
diff changeset
147 if (ret < 0) {
19085
6b901abc1819 login proxy: Small code cleanup
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
148 login_proxy_free_errno(&proxy, errno, TRUE);
16880
2d3d73d03fe2 login proxy: Use corking when writing data.
Timo Sirainen <tss@iki.fi>
parents: 16345
diff changeset
149 return;
2d3d73d03fe2 login proxy: Use corking when writing data.
Timo Sirainen <tss@iki.fi>
parents: 16345
diff changeset
150 }
2d3d73d03fe2 login proxy: Use corking when writing data.
Timo Sirainen <tss@iki.fi>
parents: 16345
diff changeset
151 o_stream_cork(proxy->client_output);
2d3d73d03fe2 login proxy: Use corking when writing data.
Timo Sirainen <tss@iki.fi>
parents: 16345
diff changeset
152 ret2 = o_stream_send(proxy->client_output, buf, ret);
2d3d73d03fe2 login proxy: Use corking when writing data.
Timo Sirainen <tss@iki.fi>
parents: 16345
diff changeset
153 o_stream_uncork(proxy->client_output);
19352
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
154 if (ret2 != ret)
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
155 login_proxy_free_ostream(&proxy, proxy->client_output, FALSE);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 }
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
158 static void proxy_client_input(struct login_proxy *proxy)
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 {
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
160 const unsigned char *data;
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
161 size_t size;
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
162 ssize_t ret;
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163
10171
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
164 proxy->last_io = ioloop_time;
3049
7f503848533e s/proxy/server/ for variables describing remote server.
Timo Sirainen <tss@iki.fi>
parents: 2790
diff changeset
165 if (o_stream_get_buffer_used_size(proxy->server_output) >
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 OUTBUF_THRESHOLD) {
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 /* proxy's output buffer is already quite full.
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 don't send more until we're below threshold. */
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3049
diff changeset
169 io_remove(&proxy->client_io);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 return;
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 }
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
173 if (i_stream_read_data(proxy->client_input, &data, &size, 0) < 0) {
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
174 const char *errstr = i_stream_get_error(proxy->client_input);
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
175 login_proxy_free_errstr(&proxy, errstr, FALSE);
16880
2d3d73d03fe2 login proxy: Use corking when writing data.
Timo Sirainen <tss@iki.fi>
parents: 16345
diff changeset
176 return;
2d3d73d03fe2 login proxy: Use corking when writing data.
Timo Sirainen <tss@iki.fi>
parents: 16345
diff changeset
177 }
17440
6a9508d28d34 login proxy: Fixed connection hanging due to wrong ostream cork pairing
Timo Sirainen <tss@iki.fi>
parents: 17419
diff changeset
178 o_stream_cork(proxy->server_output);
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
179 ret = o_stream_send(proxy->server_output, data, size);
16880
2d3d73d03fe2 login proxy: Use corking when writing data.
Timo Sirainen <tss@iki.fi>
parents: 16345
diff changeset
180 o_stream_uncork(proxy->server_output);
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
181 if (ret != (ssize_t)size)
19352
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
182 login_proxy_free_ostream(&proxy, proxy->server_output, TRUE);
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
183 else
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
184 i_stream_skip(proxy->client_input, ret);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 }
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
187 static void proxy_client_disconnected_input(struct login_proxy *proxy)
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
188 {
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
189 /* we're already disconnected from server. either wait for
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
190 disconnection timeout or for client to disconnect itself. */
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
191 if (i_stream_read(proxy->client_input) < 0)
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
192 login_proxy_free_final(proxy);
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
193 else {
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
194 i_stream_skip(proxy->client_input,
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
195 i_stream_get_data_size(proxy->client_input));
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
196 }
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
197 }
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
198
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
199 static int server_output(struct login_proxy *proxy)
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 {
10171
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
201 proxy->last_io = ioloop_time;
20475
591863def76d login-proxy: cork+uncork in flush callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19964
diff changeset
202 o_stream_cork(proxy->server_output);
3049
7f503848533e s/proxy/server/ for variables describing remote server.
Timo Sirainen <tss@iki.fi>
parents: 2790
diff changeset
203 if (o_stream_flush(proxy->server_output) < 0) {
19352
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
204 login_proxy_free_ostream(&proxy, proxy->server_output, TRUE);
2790
02c0b8d532c2 Changed ostream's flush callback to have return value which can tell if
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
205 return 1;
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 }
20475
591863def76d login-proxy: cork+uncork in flush callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19964
diff changeset
207 o_stream_uncork(proxy->server_output);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 if (proxy->client_io == NULL &&
3049
7f503848533e s/proxy/server/ for variables describing remote server.
Timo Sirainen <tss@iki.fi>
parents: 2790
diff changeset
210 o_stream_get_buffer_used_size(proxy->server_output) <
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 OUTBUF_THRESHOLD) {
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 /* there's again space in proxy's output buffer, so we can
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 read more from client. */
19834
785dec1e0a0e login-proxy: Use io_add_istream() for adding client_input io.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19752
diff changeset
214 proxy->client_io = io_add_istream(proxy->client_input,
785dec1e0a0e login-proxy: Use io_add_istream() for adding client_input io.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19752
diff changeset
215 proxy_client_input, proxy);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 }
2790
02c0b8d532c2 Changed ostream's flush callback to have return value which can tell if
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
217 return 1;
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 }
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
220 static int proxy_client_output(struct login_proxy *proxy)
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 {
10171
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
222 proxy->last_io = ioloop_time;
20475
591863def76d login-proxy: cork+uncork in flush callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19964
diff changeset
223 o_stream_cork(proxy->client_output);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 if (o_stream_flush(proxy->client_output) < 0) {
19352
e7f71caad9c5 login proxy: If writing to ostream fails, log the ostream's error string.
Timo Sirainen <tss@iki.fi>
parents: 19351
diff changeset
225 login_proxy_free_ostream(&proxy, proxy->client_output, FALSE);
2790
02c0b8d532c2 Changed ostream's flush callback to have return value which can tell if
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
226 return 1;
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 }
20475
591863def76d login-proxy: cork+uncork in flush callbacks
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19964
diff changeset
228 o_stream_uncork(proxy->client_output);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229
3049
7f503848533e s/proxy/server/ for variables describing remote server.
Timo Sirainen <tss@iki.fi>
parents: 2790
diff changeset
230 if (proxy->server_io == NULL &&
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 o_stream_get_buffer_used_size(proxy->client_output) <
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 OUTBUF_THRESHOLD) {
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 /* there's again space in client's output buffer, so we can
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 read more from proxy. */
3049
7f503848533e s/proxy/server/ for variables describing remote server.
Timo Sirainen <tss@iki.fi>
parents: 2790
diff changeset
235 proxy->server_io =
7f503848533e s/proxy/server/ for variables describing remote server.
Timo Sirainen <tss@iki.fi>
parents: 2790
diff changeset
236 io_add(proxy->server_fd, IO_READ, server_input, proxy);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 }
2790
02c0b8d532c2 Changed ostream's flush callback to have return value which can tell if
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
238 return 1;
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 }
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
241 static void proxy_prelogin_input(struct login_proxy *proxy)
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 {
10612
6b3dc91ae0c5 login: Proxy code API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
243 proxy->callback(proxy->client);
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
244 }
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
245
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
246 static void proxy_plain_connected(struct login_proxy *proxy)
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
247 {
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
248 proxy->server_input =
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
249 i_stream_create_fd(proxy->server_fd, MAX_PROXY_INPUT_SIZE,
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
250 FALSE);
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
251 proxy->server_output =
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
252 o_stream_create_fd(proxy->server_fd, (size_t)-1, FALSE);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
253 o_stream_set_no_error_handling(proxy->server_output, TRUE);
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
254
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
255 proxy->server_io =
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
256 io_add(proxy->server_fd, IO_READ, proxy_prelogin_input, proxy);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 }
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258
9774
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
259 static void proxy_fail_connect(struct login_proxy *proxy)
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
260 {
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
261 if (timeval_cmp(&proxy->created, &proxy->state_rec->last_success) < 0) {
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
262 /* there was a successful connection done since we started
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
263 connecting. perhaps this is just a temporary one-off
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
264 failure. */
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
265 } else {
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
266 proxy->state_rec->last_failure = ioloop_timeval;
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
267 }
19086
c98fbc17fa4e login proxy: Added asserts to track that num_waiting_connections are correct.
Timo Sirainen <tss@iki.fi>
parents: 19085
diff changeset
268 i_assert(proxy->state_rec->num_waiting_connections > 0);
9774
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
269 proxy->state_rec->num_waiting_connections--;
19087
1a4445b58279 login proxy: Always keep proxy->state_rec available.
Timo Sirainen <tss@iki.fi>
parents: 19086
diff changeset
270 proxy->num_waiting_connections_updated = TRUE;
9774
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
271 }
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
272
15501
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
273 static void
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
274 proxy_log_connect_error(struct login_proxy *proxy)
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
275 {
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
276 string_t *str = t_str_new(128);
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
277 struct ip_addr local_ip;
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
278 in_port_t local_port;
15501
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
279
16085
a4ea6946c621 login proxy: Stop proxy_timeout only after successfully logged in (not after connected).
Timo Sirainen <tss@iki.fi>
parents: 15887
diff changeset
280 str_printfa(str, "proxy(%s): ", proxy->client->virtual_user);
a4ea6946c621 login proxy: Stop proxy_timeout only after successfully logged in (not after connected).
Timo Sirainen <tss@iki.fi>
parents: 15887
diff changeset
281 if (!proxy->connected) {
a4ea6946c621 login proxy: Stop proxy_timeout only after successfully logged in (not after connected).
Timo Sirainen <tss@iki.fi>
parents: 15887
diff changeset
282 str_printfa(str, "connect(%s, %u) failed: %m",
a4ea6946c621 login proxy: Stop proxy_timeout only after successfully logged in (not after connected).
Timo Sirainen <tss@iki.fi>
parents: 15887
diff changeset
283 proxy->host, proxy->port);
a4ea6946c621 login proxy: Stop proxy_timeout only after successfully logged in (not after connected).
Timo Sirainen <tss@iki.fi>
parents: 15887
diff changeset
284 } else {
21722
5571a8162b42 *-login: Add client.proxy_get_state() for providing human-readable proxy state
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
285 str_printfa(str, "Login for %s:%u timed out in state=%s",
16345
8a0abbf545ce login-proxy: If login fails with timeout, log what the proxying state was.
Timo Sirainen <tss@iki.fi>
parents: 16344
diff changeset
286 proxy->host, proxy->port,
21722
5571a8162b42 *-login: Add client.proxy_get_state() for providing human-readable proxy state
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
287 client_proxy_get_state(proxy->client));
16085
a4ea6946c621 login proxy: Stop proxy_timeout only after successfully logged in (not after connected).
Timo Sirainen <tss@iki.fi>
parents: 15887
diff changeset
288 }
a4ea6946c621 login proxy: Stop proxy_timeout only after successfully logged in (not after connected).
Timo Sirainen <tss@iki.fi>
parents: 15887
diff changeset
289 str_printfa(str, " (after %u secs",
15501
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
290 (unsigned int)(ioloop_time - proxy->created.tv_sec));
17991
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
291 if (proxy->reconnect_count > 0)
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
292 str_printfa(str, ", %u reconnects", proxy->reconnect_count);
15501
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
293
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
294 if (proxy->server_fd != -1 &&
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
295 net_getsockname(proxy->server_fd, &local_ip, &local_port) == 0) {
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
296 str_printfa(str, ", local=%s:%u",
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
297 net_ip2addr(&local_ip), local_port);
17503
75d254897442 login proxy: If passdb returns "source_ip" extra field, use it for outgoing connections.
Timo Sirainen <tss@iki.fi>
parents: 17440
diff changeset
298 } else if (proxy->source_ip.family != 0) {
75d254897442 login proxy: If passdb returns "source_ip" extra field, use it for outgoing connections.
Timo Sirainen <tss@iki.fi>
parents: 17440
diff changeset
299 str_printfa(str, ", local=%s",
75d254897442 login proxy: If passdb returns "source_ip" extra field, use it for outgoing connections.
Timo Sirainen <tss@iki.fi>
parents: 17440
diff changeset
300 net_ip2addr(&proxy->source_ip));
15501
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
301 }
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
302
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
303 str_append_c(str, ')');
19964
dd0b73d89761 login-proxy: When logging failures, include the client info prefix.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19834
diff changeset
304 client_log_err(proxy->client, str_c(str));
15501
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
305 }
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
306
17991
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
307 static void proxy_reconnect_timeout(struct login_proxy *proxy)
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
308 {
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
309 timeout_remove(&proxy->to);
20772
bef12bcca22a login proxy: Don't leak connections if reconnect fails with "Host is down"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20765
diff changeset
310 if (login_proxy_connect(proxy) < 0)
bef12bcca22a login proxy: Don't leak connections if reconnect fails with "Host is down"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20765
diff changeset
311 login_proxy_free(&proxy);
17991
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
312 }
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
313
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
314 static bool proxy_try_reconnect(struct login_proxy *proxy)
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
315 {
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
316 int since_started_msecs, left_msecs;
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
317
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
318 since_started_msecs =
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
319 timeval_diff_msecs(&ioloop_timeval, &proxy->created);
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
320 if (since_started_msecs < 0)
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
321 return FALSE; /* time moved backwards */
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
322 left_msecs = proxy->connect_timeout_msecs - since_started_msecs;
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
323 if (left_msecs <= 0)
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
324 return FALSE;
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
325
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
326 login_proxy_disconnect(proxy);
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
327 proxy->to = timeout_add(I_MIN(PROXY_CONNECT_RETRY_MSECS, left_msecs),
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
328 proxy_reconnect_timeout, proxy);
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
329 proxy->reconnect_count++;
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
330 return TRUE;
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
331 }
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
332
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
333 static void proxy_wait_connect(struct login_proxy *proxy)
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 {
15501
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
335 errno = net_geterror(proxy->server_fd);
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
336 if (errno != 0) {
9774
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
337 proxy_fail_connect(proxy);
17991
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
338 if (!proxy_try_reconnect(proxy)) {
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
339 proxy_log_connect_error(proxy);
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
340 login_proxy_free(&proxy);
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
341 }
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 return;
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 }
16085
a4ea6946c621 login proxy: Stop proxy_timeout only after successfully logged in (not after connected).
Timo Sirainen <tss@iki.fi>
parents: 15887
diff changeset
344 proxy->connected = TRUE;
19087
1a4445b58279 login proxy: Always keep proxy->state_rec available.
Timo Sirainen <tss@iki.fi>
parents: 19086
diff changeset
345 proxy->num_waiting_connections_updated = TRUE;
9774
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
346 proxy->state_rec->last_success = ioloop_timeval;
19086
c98fbc17fa4e login proxy: Added asserts to track that num_waiting_connections are correct.
Timo Sirainen <tss@iki.fi>
parents: 19085
diff changeset
347 i_assert(proxy->state_rec->num_waiting_connections > 0);
9774
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
348 proxy->state_rec->num_waiting_connections--;
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
349 proxy->state_rec->num_proxying_connections++;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
350 proxy->state_rec->num_disconnects_since_ts = 0;
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
352 if ((proxy->ssl_flags & PROXY_SSL_FLAG_YES) != 0 &&
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
353 (proxy->ssl_flags & PROXY_SSL_FLAG_STARTTLS) == 0) {
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
354 if (login_proxy_starttls(proxy) < 0) {
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
355 login_proxy_free(&proxy);
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
356 return;
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
357 }
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
358 } else {
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
359 io_remove(&proxy->server_io);
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
360 proxy_plain_connected(proxy);
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
361 }
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 }
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363
9773
8e099a00f8a9 login proxy: Added client_proxy passdb extra field to specify proxy's connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 9756
diff changeset
364 static void proxy_connect_timeout(struct login_proxy *proxy)
8e099a00f8a9 login proxy: Added client_proxy passdb extra field to specify proxy's connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 9756
diff changeset
365 {
15501
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
366 errno = ETIMEDOUT;
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
367 proxy_log_connect_error(proxy);
16344
cda830ebf6ee login-proxy: Don't crash if connect() succeeds but login fails with timeout.
Timo Sirainen <tss@iki.fi>
parents: 16085
diff changeset
368 if (!proxy->connected)
cda830ebf6ee login-proxy: Don't crash if connect() succeeds but login fails with timeout.
Timo Sirainen <tss@iki.fi>
parents: 16085
diff changeset
369 proxy_fail_connect(proxy);
9773
8e099a00f8a9 login proxy: Added client_proxy passdb extra field to specify proxy's connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 9756
diff changeset
370 login_proxy_free(&proxy);
8e099a00f8a9 login proxy: Added client_proxy passdb extra field to specify proxy's connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 9756
diff changeset
371 }
8e099a00f8a9 login proxy: Added client_proxy passdb extra field to specify proxy's connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 9756
diff changeset
372
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
373 static int login_proxy_connect(struct login_proxy *proxy)
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
374 {
19087
1a4445b58279 login proxy: Always keep proxy->state_rec available.
Timo Sirainen <tss@iki.fi>
parents: 19086
diff changeset
375 struct login_proxy_record *rec = proxy->state_rec;
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
376
20615
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
377 /* this needs to be done early, since login_proxy_free() shrinks
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
378 num_waiting_connections. */
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
379 proxy->num_waiting_connections_updated = FALSE;
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
380 rec->num_waiting_connections++;
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
381
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
382 if (proxy->ip.family == 0 &&
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
383 net_addr2ip(proxy->host, &proxy->ip) < 0) {
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
384 client_log_err(proxy->client, t_strdup_printf(
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
385 "proxy(%s): BUG: host %s is not an IP "
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
386 "(auth should have changed it)",
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
387 proxy->client->virtual_user, proxy->host));
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
388 return -1;
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
389 }
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
390
17991
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
391 if (rec->last_success.tv_sec == 0) {
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
392 /* first connect to this IP. don't start immediately failing
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
393 the check below. */
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
394 rec->last_success.tv_sec = ioloop_timeval.tv_sec - 1;
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
395 }
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
396 if (timeval_cmp(&rec->last_failure, &rec->last_success) > 0 &&
14258
53b23557ec54 login proxy: Don't assume host is down unless last success was >30s before last failure.
Timo Sirainen <tss@iki.fi>
parents: 14207
diff changeset
397 rec->last_failure.tv_sec - rec->last_success.tv_sec > PROXY_IMMEDIATE_FAILURE_SECS &&
20765
7ce2585c47e2 login-proxy: Fixed "Host is down" never reseting itself.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20615
diff changeset
398 rec->num_waiting_connections > 1) {
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
399 /* the server is down. fail immediately */
19964
dd0b73d89761 login-proxy: When logging failures, include the client info prefix.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19834
diff changeset
400 client_log_err(proxy->client, t_strdup_printf(
dd0b73d89761 login-proxy: When logging failures, include the client info prefix.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19834
diff changeset
401 "proxy(%s): Host %s:%u is down",
dd0b73d89761 login-proxy: When logging failures, include the client info prefix.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19834
diff changeset
402 proxy->client->virtual_user, proxy->host, proxy->port));
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
403 return -1;
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
404 }
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
405
17503
75d254897442 login proxy: If passdb returns "source_ip" extra field, use it for outgoing connections.
Timo Sirainen <tss@iki.fi>
parents: 17440
diff changeset
406 proxy->server_fd = net_connect_ip(&proxy->ip, proxy->port,
75d254897442 login proxy: If passdb returns "source_ip" extra field, use it for outgoing connections.
Timo Sirainen <tss@iki.fi>
parents: 17440
diff changeset
407 proxy->source_ip.family == 0 ? NULL :
75d254897442 login proxy: If passdb returns "source_ip" extra field, use it for outgoing connections.
Timo Sirainen <tss@iki.fi>
parents: 17440
diff changeset
408 &proxy->source_ip);
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
409 if (proxy->server_fd == -1) {
15501
9d63f882194d login proxy: For connect() failures log also the used local IP:port if available.
Timo Sirainen <tss@iki.fi>
parents: 14518
diff changeset
410 proxy_log_connect_error(proxy);
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
411 return -1;
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
412 }
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
413 proxy->server_io = io_add(proxy->server_fd, IO_WRITE,
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
414 proxy_wait_connect, proxy);
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
415 if (proxy->connect_timeout_msecs != 0) {
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
416 proxy->to = timeout_add(proxy->connect_timeout_msecs,
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
417 proxy_connect_timeout, proxy);
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
418 }
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
419 return 0;
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
420 }
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
421
10612
6b3dc91ae0c5 login: Proxy code API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
422 int login_proxy_new(struct client *client,
6b3dc91ae0c5 login: Proxy code API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
423 const struct login_proxy_settings *set,
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
424 proxy_callback_t *callback)
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 {
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 struct login_proxy *proxy;
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
428 i_assert(client->login_proxy == NULL);
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
429
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
430 if (set->host == NULL || *set->host == '\0') {
19964
dd0b73d89761 login-proxy: When logging failures, include the client info prefix.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19834
diff changeset
431 client_log_err(client, t_strdup_printf(
dd0b73d89761 login-proxy: When logging failures, include the client info prefix.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19834
diff changeset
432 "proxy(%s): host not given", client->virtual_user));
10612
6b3dc91ae0c5 login: Proxy code API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
433 return -1;
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 }
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435
15887
48c1c58948f5 proxying cleanup: Send TTL=1 (instead of TTL=0) as "no more proxying".
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
436 if (client->proxy_ttl <= 1) {
19964
dd0b73d89761 login-proxy: When logging failures, include the client info prefix.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19834
diff changeset
437 client_log_err(client, t_strdup_printf(
dd0b73d89761 login-proxy: When logging failures, include the client info prefix.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19834
diff changeset
438 "proxy(%s): TTL reached zero - "
dd0b73d89761 login-proxy: When logging failures, include the client info prefix.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19834
diff changeset
439 "proxies appear to be looping?", client->virtual_user));
14162
ba06ea38c722 imap/pop3/lmtp proxy: Implemented detection of proxy loops with TTL.
Timo Sirainen <tss@iki.fi>
parents: 14157
diff changeset
440 return -1;
ba06ea38c722 imap/pop3/lmtp proxy: Implemented detection of proxy loops with TTL.
Timo Sirainen <tss@iki.fi>
parents: 14157
diff changeset
441 }
ba06ea38c722 imap/pop3/lmtp proxy: Implemented detection of proxy loops with TTL.
Timo Sirainen <tss@iki.fi>
parents: 14157
diff changeset
442
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
443 proxy = i_new(struct login_proxy, 1);
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
444 proxy->client = client;
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
445 proxy->client_fd = -1;
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
446 proxy->server_fd = -1;
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
447 proxy->created = ioloop_timeval;
14518
773ca397d799 SSL proxying: Remote's host never matched cert, because auth process changed it to IP.
Timo Sirainen <tss@iki.fi>
parents: 14516
diff changeset
448 proxy->ip = set->ip;
17503
75d254897442 login proxy: If passdb returns "source_ip" extra field, use it for outgoing connections.
Timo Sirainen <tss@iki.fi>
parents: 17440
diff changeset
449 proxy->source_ip = set->source_ip;
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
450 proxy->host = i_strdup(set->host);
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
451 proxy->port = set->port;
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
452 proxy->connect_timeout_msecs = set->connect_timeout_msecs;
11324
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
453 proxy->notify_refresh_secs = set->notify_refresh_secs;
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
454 proxy->ssl_flags = set->ssl_flags;
19087
1a4445b58279 login proxy: Always keep proxy->state_rec available.
Timo Sirainen <tss@iki.fi>
parents: 19086
diff changeset
455 proxy->state_rec = login_proxy_state_get(proxy_state, &proxy->ip,
1a4445b58279 login proxy: Always keep proxy->state_rec available.
Timo Sirainen <tss@iki.fi>
parents: 19086
diff changeset
456 proxy->port);
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
457 client_ref(client);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458
20615
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
459 if (login_proxy_connect(proxy) < 0) {
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
460 login_proxy_free(&proxy);
dbd3bbba0f49 login-proxy: Fixed assert-crash/hang on connect errors.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20475
diff changeset
461 return -1;
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 }
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
464 DLLIST_PREPEND(&login_proxies_pending, proxy);
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
465
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
466 proxy->callback = callback;
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
467 client->login_proxy = proxy;
10612
6b3dc91ae0c5 login: Proxy code API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
468 return 0;
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
469 }
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
470
17991
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
471 static void login_proxy_disconnect(struct login_proxy *proxy)
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
472 {
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
473 if (proxy->to != NULL)
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
474 timeout_remove(&proxy->to);
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
475 if (proxy->to_notify != NULL)
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
476 timeout_remove(&proxy->to_notify);
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
477
19087
1a4445b58279 login proxy: Always keep proxy->state_rec available.
Timo Sirainen <tss@iki.fi>
parents: 19086
diff changeset
478 if (!proxy->num_waiting_connections_updated) {
19086
c98fbc17fa4e login proxy: Added asserts to track that num_waiting_connections are correct.
Timo Sirainen <tss@iki.fi>
parents: 19085
diff changeset
479 i_assert(proxy->state_rec->num_waiting_connections > 0);
17991
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
480 proxy->state_rec->num_waiting_connections--;
19086
c98fbc17fa4e login proxy: Added asserts to track that num_waiting_connections are correct.
Timo Sirainen <tss@iki.fi>
parents: 19085
diff changeset
481 }
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
482 if (proxy->connected) {
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
483 i_assert(proxy->state_rec->num_proxying_connections > 0);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
484 proxy->state_rec->num_proxying_connections--;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
485 }
17991
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
486
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
487 if (proxy->server_io != NULL)
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
488 io_remove(&proxy->server_io);
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
489 if (proxy->server_input != NULL)
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
490 i_stream_destroy(&proxy->server_input);
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
491 if (proxy->server_output != NULL)
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
492 o_stream_destroy(&proxy->server_output);
20772
bef12bcca22a login proxy: Don't leak connections if reconnect fails with "Host is down"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20765
diff changeset
493 if (proxy->server_fd != -1) {
17991
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
494 net_disconnect(proxy->server_fd);
20772
bef12bcca22a login proxy: Don't leak connections if reconnect fails with "Host is down"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20765
diff changeset
495 proxy->server_fd = -1;
bef12bcca22a login proxy: Don't leak connections if reconnect fails with "Host is down"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20765
diff changeset
496 }
17991
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
497 }
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
498
19088
574ba1f25346 login proxy: Code cleanup - separate login_proxy_free_final()
Timo Sirainen <tss@iki.fi>
parents: 19087
diff changeset
499 static void login_proxy_free_final(struct login_proxy *proxy)
574ba1f25346 login proxy: Code cleanup - separate login_proxy_free_final()
Timo Sirainen <tss@iki.fi>
parents: 19087
diff changeset
500 {
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
501 if (proxy->delayed_disconnect) {
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
502 DLLIST_REMOVE(&login_proxies_disconnecting, proxy);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
503
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
504 i_assert(proxy->state_rec->num_delayed_client_disconnects > 0);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
505 if (--proxy->state_rec->num_delayed_client_disconnects == 0)
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
506 proxy->state_rec->num_disconnects_since_ts = 0;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
507 timeout_remove(&proxy->to);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
508 }
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
509
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
510 if (proxy->client_io != NULL)
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
511 io_remove(&proxy->client_io);
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
512 if (proxy->client_input != NULL)
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
513 i_stream_destroy(&proxy->client_input);
19088
574ba1f25346 login proxy: Code cleanup - separate login_proxy_free_final()
Timo Sirainen <tss@iki.fi>
parents: 19087
diff changeset
514 if (proxy->client_output != NULL)
574ba1f25346 login proxy: Code cleanup - separate login_proxy_free_final()
Timo Sirainen <tss@iki.fi>
parents: 19087
diff changeset
515 o_stream_destroy(&proxy->client_output);
574ba1f25346 login proxy: Code cleanup - separate login_proxy_free_final()
Timo Sirainen <tss@iki.fi>
parents: 19087
diff changeset
516 if (proxy->client_fd != -1)
574ba1f25346 login proxy: Code cleanup - separate login_proxy_free_final()
Timo Sirainen <tss@iki.fi>
parents: 19087
diff changeset
517 net_disconnect(proxy->client_fd);
20917
5f64a857e0d7 login proxy: Hanging outgoing SSL connections caused using already-freed memory
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20842
diff changeset
518 if (proxy->ssl_server_proxy != NULL) {
5f64a857e0d7 login proxy: Hanging outgoing SSL connections caused using already-freed memory
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20842
diff changeset
519 ssl_proxy_destroy(proxy->ssl_server_proxy);
19088
574ba1f25346 login proxy: Code cleanup - separate login_proxy_free_final()
Timo Sirainen <tss@iki.fi>
parents: 19087
diff changeset
520 ssl_proxy_free(&proxy->ssl_server_proxy);
20917
5f64a857e0d7 login proxy: Hanging outgoing SSL connections caused using already-freed memory
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20842
diff changeset
521 }
19088
574ba1f25346 login proxy: Code cleanup - separate login_proxy_free_final()
Timo Sirainen <tss@iki.fi>
parents: 19087
diff changeset
522 i_free(proxy->host);
574ba1f25346 login proxy: Code cleanup - separate login_proxy_free_final()
Timo Sirainen <tss@iki.fi>
parents: 19087
diff changeset
523 i_free(proxy);
574ba1f25346 login proxy: Code cleanup - separate login_proxy_free_final()
Timo Sirainen <tss@iki.fi>
parents: 19087
diff changeset
524 }
574ba1f25346 login proxy: Code cleanup - separate login_proxy_free_final()
Timo Sirainen <tss@iki.fi>
parents: 19087
diff changeset
525
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
526 static unsigned int login_proxy_delay_disconnect(struct login_proxy *proxy)
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
527 {
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
528 struct login_proxy_record *rec = proxy->state_rec;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
529 const unsigned int max_delay =
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
530 proxy->client->set->login_proxy_max_disconnect_delay;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
531 struct timeval disconnect_time_offset;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
532 unsigned int max_disconnects_per_sec, delay_msecs_since_ts, max_conns;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
533 int delay_msecs;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
534
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
535 if (rec->num_disconnects_since_ts == 0) {
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
536 rec->disconnect_timestamp = ioloop_timeval;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
537 /* start from a slightly random timestamp. this way all proxy
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
538 processes will disconnect at slightly different times to
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
539 spread the load. */
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
540 timeval_add_msecs(&rec->disconnect_timestamp,
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
541 rand() % PROXY_DISCONNECT_INTERVAL_MSECS);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
542 }
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
543 rec->num_disconnects_since_ts++;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
544 if (proxy->to != NULL) {
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
545 /* we were already lazily disconnecting this */
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
546 return 0;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
547 }
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
548 if (max_delay == 0) {
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
549 /* delaying is disabled */
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
550 return 0;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
551 }
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
552 max_conns = rec->num_proxying_connections + rec->num_disconnects_since_ts;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
553 max_disconnects_per_sec = (max_conns + max_delay-1) / max_delay;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
554 if (rec->num_disconnects_since_ts <= max_disconnects_per_sec &&
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
555 rec->num_delayed_client_disconnects == 0) {
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
556 /* wait delaying until we have 1 second's worth of clients
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
557 disconnected */
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
558 return 0;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
559 }
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
560
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
561 /* see at which time we should be disconnecting the client.
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
562 do it in 100ms intervals so the timeouts are triggered together. */
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
563 disconnect_time_offset = rec->disconnect_timestamp;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
564 delay_msecs_since_ts = PROXY_DISCONNECT_INTERVAL_MSECS *
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
565 (max_delay * rec->num_disconnects_since_ts *
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
566 (1000/PROXY_DISCONNECT_INTERVAL_MSECS) / max_conns);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
567 timeval_add_msecs(&disconnect_time_offset, delay_msecs_since_ts);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
568 delay_msecs = timeval_diff_msecs(&disconnect_time_offset, &ioloop_timeval);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
569 if (delay_msecs <= 0) {
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
570 /* we already reached the time */
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
571 return 0;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
572 }
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
573
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
574 rec->num_delayed_client_disconnects++;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
575 proxy->delayed_disconnect = TRUE;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
576 proxy->to = timeout_add(delay_msecs, login_proxy_free_final, proxy);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
577 DLLIST_PREPEND(&login_proxies_disconnecting, proxy);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
578 return delay_msecs;
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
579 }
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
580
14629
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14576
diff changeset
581 static void ATTR_NULL(2)
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
582 login_proxy_free_full(struct login_proxy **_proxy, const char *reason,
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
583 bool delayed)
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
584 {
8583
2ff2cac3578b imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
585 struct login_proxy *proxy = *_proxy;
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
586 struct client *client = proxy->client;
4123
8df011c2cdc4 Show client IP properly also with SSL connections.
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
587 const char *ipstr;
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
588 unsigned int delay_ms = 0;
2786
9aaa737f8215 Logging changes.
Timo Sirainen <tss@iki.fi>
parents: 2773
diff changeset
589
8583
2ff2cac3578b imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
590 *_proxy = NULL;
2ff2cac3578b imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
591
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
592 if (proxy->destroying)
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
593 return;
4669
d84a7bd63862 Reference counter fixing for client while it's being used in login proxy.
Timo Sirainen <tss@iki.fi>
parents: 4538
diff changeset
594 proxy->destroying = TRUE;
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
595
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
596 /* we'll disconnect server side in any case. */
17991
52ad54b23e24 login proxy: If proxy_timeout is set, try to reconnect until the timeout is reached.
Timo Sirainen <tss@iki.fi>
parents: 17503
diff changeset
597 login_proxy_disconnect(proxy);
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
598
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
599 if (proxy->client_fd != -1) {
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
600 /* detached proxy */
7119
8c6a7af67e8c Replaced clients hash with a linked list.
Timo Sirainen <tss@iki.fi>
parents: 7117
diff changeset
601 DLLIST_REMOVE(&login_proxies, proxy);
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
602
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
603 if (delayed)
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
604 delay_ms = login_proxy_delay_disconnect(proxy);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
605
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
606 ipstr = net_ip2addr(&proxy->client->ip);
14301
49b832c5de0e login proxy: Log "disconnecting" message also with login_log_format_elements.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
607 client_log(proxy->client, t_strdup_printf(
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
608 "proxy(%s): disconnecting %s%s%s",
14301
49b832c5de0e login proxy: Log "disconnecting" message also with login_log_format_elements.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
609 proxy->client->virtual_user,
49b832c5de0e login proxy: Log "disconnecting" message also with login_log_format_elements.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
610 ipstr != NULL ? ipstr : "",
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
611 reason == NULL ? "" : t_strdup_printf(" (%s)", reason),
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
612 delay_ms == 0 ? "" : t_strdup_printf(" - disconnecting client in %ums", delay_ms)));
2786
9aaa737f8215 Logging changes.
Timo Sirainen <tss@iki.fi>
parents: 2773
diff changeset
613
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
614 if (proxy->client_io != NULL)
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3049
diff changeset
615 io_remove(&proxy->client_io);
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
616 } else {
4669
d84a7bd63862 Reference counter fixing for client while it's being used in login proxy.
Timo Sirainen <tss@iki.fi>
parents: 4538
diff changeset
617 i_assert(proxy->client_io == NULL);
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
618 i_assert(proxy->client_input == NULL);
4669
d84a7bd63862 Reference counter fixing for client while it's being used in login proxy.
Timo Sirainen <tss@iki.fi>
parents: 4538
diff changeset
619 i_assert(proxy->client_output == NULL);
19088
574ba1f25346 login proxy: Code cleanup - separate login_proxy_free_final()
Timo Sirainen <tss@iki.fi>
parents: 19087
diff changeset
620 i_assert(proxy->client_fd == -1);
4669
d84a7bd63862 Reference counter fixing for client while it's being used in login proxy.
Timo Sirainen <tss@iki.fi>
parents: 4538
diff changeset
621
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
622 DLLIST_REMOVE(&login_proxies_pending, proxy);
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
623
10616
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
624 if (proxy->callback != NULL)
23956a9b915b login: Proxying supports now doing DNS lookups for host names.
Timo Sirainen <tss@iki.fi>
parents: 10612
diff changeset
625 proxy->callback(proxy->client);
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
626 }
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
627 if (delay_ms == 0)
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
628 login_proxy_free_final(proxy);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
629 else {
19834
785dec1e0a0e login-proxy: Use io_add_istream() for adding client_input io.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19752
diff changeset
630 proxy->client_io = io_add_istream(proxy->client_input,
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
631 proxy_client_disconnected_input, proxy);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
632 }
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4123
diff changeset
633
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
634 client->login_proxy = NULL;
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
635 client_unref(&client);
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4123
diff changeset
636 }
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4123
diff changeset
637
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
638 static void ATTR_NULL(2)
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
639 login_proxy_free_reason(struct login_proxy **_proxy, const char *reason)
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
640 {
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
641 login_proxy_free_full(_proxy, reason, FALSE);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
642 }
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
643
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
644 static void ATTR_NULL(2)
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
645 login_proxy_free_delayed(struct login_proxy **_proxy, const char *reason)
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
646 {
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
647 login_proxy_free_full(_proxy, reason, TRUE);
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
648 }
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
649
13043
d1c2cc4c513d login proxy: Show in disconnect reason who did the disconnection and possible error.
Timo Sirainen <tss@iki.fi>
parents: 13041
diff changeset
650 void login_proxy_free(struct login_proxy **_proxy)
d1c2cc4c513d login proxy: Show in disconnect reason who did the disconnection and possible error.
Timo Sirainen <tss@iki.fi>
parents: 13041
diff changeset
651 {
d1c2cc4c513d login proxy: Show in disconnect reason who did the disconnection and possible error.
Timo Sirainen <tss@iki.fi>
parents: 13041
diff changeset
652 login_proxy_free_reason(_proxy, NULL);
d1c2cc4c513d login proxy: Show in disconnect reason who did the disconnection and possible error.
Timo Sirainen <tss@iki.fi>
parents: 13041
diff changeset
653 }
d1c2cc4c513d login proxy: Show in disconnect reason who did the disconnection and possible error.
Timo Sirainen <tss@iki.fi>
parents: 13041
diff changeset
654
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7119
diff changeset
655 bool login_proxy_is_ourself(const struct client *client, const char *host,
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
656 in_port_t port, const char *destuser)
6472
6afb29dc9273 If proxy points to the same host/port/user combination as we currently have,
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
657 {
6afb29dc9273 If proxy points to the same host/port/user combination as we currently have,
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
658 struct ip_addr ip;
6afb29dc9273 If proxy points to the same host/port/user combination as we currently have,
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
659
6afb29dc9273 If proxy points to the same host/port/user combination as we currently have,
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
660 if (port != client->local_port)
6afb29dc9273 If proxy points to the same host/port/user combination as we currently have,
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
661 return FALSE;
6afb29dc9273 If proxy points to the same host/port/user combination as we currently have,
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
662
6afb29dc9273 If proxy points to the same host/port/user combination as we currently have,
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
663 if (net_addr2ip(host, &ip) < 0)
6afb29dc9273 If proxy points to the same host/port/user combination as we currently have,
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
664 return FALSE;
6afb29dc9273 If proxy points to the same host/port/user combination as we currently have,
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
665 if (!net_ip_compare(&ip, &client->local_ip))
6afb29dc9273 If proxy points to the same host/port/user combination as we currently have,
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
666 return FALSE;
6afb29dc9273 If proxy points to the same host/port/user combination as we currently have,
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
667
6afb29dc9273 If proxy points to the same host/port/user combination as we currently have,
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
668 return strcmp(client->virtual_user, destuser) == 0;
6afb29dc9273 If proxy points to the same host/port/user combination as we currently have,
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
669 }
6afb29dc9273 If proxy points to the same host/port/user combination as we currently have,
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
670
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
671 struct istream *login_proxy_get_istream(struct login_proxy *proxy)
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
672 {
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
673 return proxy->disconnecting ? NULL : proxy->server_input;
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
674 }
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
675
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
676 struct ostream *login_proxy_get_ostream(struct login_proxy *proxy)
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
677 {
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
678 return proxy->server_output;
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
679 }
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
680
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7119
diff changeset
681 const char *login_proxy_get_host(const struct login_proxy *proxy)
5048
5c0a5cf4626d Forgot to commit for the "log proxy destination" change.
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
682 {
5c0a5cf4626d Forgot to commit for the "log proxy destination" change.
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
683 return proxy->host;
5c0a5cf4626d Forgot to commit for the "log proxy destination" change.
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
684 }
5c0a5cf4626d Forgot to commit for the "log proxy destination" change.
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
685
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
686 in_port_t login_proxy_get_port(const struct login_proxy *proxy)
5048
5c0a5cf4626d Forgot to commit for the "log proxy destination" change.
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
687 {
5c0a5cf4626d Forgot to commit for the "log proxy destination" change.
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
688 return proxy->port;
5c0a5cf4626d Forgot to commit for the "log proxy destination" change.
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
689 }
5c0a5cf4626d Forgot to commit for the "log proxy destination" change.
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
690
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
691 enum login_proxy_ssl_flags
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
692 login_proxy_get_ssl_flags(const struct login_proxy *proxy)
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
693 {
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
694 return proxy->ssl_flags;
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
695 }
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
696
11324
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
697 static void login_proxy_notify(struct login_proxy *proxy)
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
698 {
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
699 login_proxy_state_notify(proxy_state, proxy->client->proxy_user);
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
700 }
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
701
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
702 void login_proxy_detach(struct login_proxy *proxy)
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
703 {
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
704 struct client *client = proxy->client;
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
705 const unsigned char *data;
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
706 size_t size;
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
707
21765
91b94ecaa39d login-common: Add preproxy pool
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21722
diff changeset
708 if (proxy->client->preproxy_pool != NULL)
91b94ecaa39d login-common: Add preproxy pool
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21722
diff changeset
709 pool_unref(&proxy->client->preproxy_pool);
91b94ecaa39d login-common: Add preproxy pool
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21722
diff changeset
710
4669
d84a7bd63862 Reference counter fixing for client while it's being used in login proxy.
Timo Sirainen <tss@iki.fi>
parents: 4538
diff changeset
711 i_assert(proxy->client_fd == -1);
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
712 i_assert(proxy->server_input != NULL);
4669
d84a7bd63862 Reference counter fixing for client while it's being used in login proxy.
Timo Sirainen <tss@iki.fi>
parents: 4538
diff changeset
713 i_assert(proxy->server_output != NULL);
d84a7bd63862 Reference counter fixing for client while it's being used in login proxy.
Timo Sirainen <tss@iki.fi>
parents: 4538
diff changeset
714
16085
a4ea6946c621 login proxy: Stop proxy_timeout only after successfully logged in (not after connected).
Timo Sirainen <tss@iki.fi>
parents: 15887
diff changeset
715 if (proxy->to != NULL)
a4ea6946c621 login proxy: Stop proxy_timeout only after successfully logged in (not after connected).
Timo Sirainen <tss@iki.fi>
parents: 15887
diff changeset
716 timeout_remove(&proxy->to);
a4ea6946c621 login proxy: Stop proxy_timeout only after successfully logged in (not after connected).
Timo Sirainen <tss@iki.fi>
parents: 15887
diff changeset
717
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
718 proxy->client_fd = i_stream_get_fd(client->input);
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
719 proxy->client_input = client->input;
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
720 proxy->client_output = client->output;
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
721
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
722 i_stream_set_persistent_buffers(client->input, FALSE);
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
723 o_stream_set_max_buffer_size(client->output, (size_t)-1);
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
724 o_stream_set_flush_callback(client->output, proxy_client_output, proxy);
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
725 client->input = NULL;
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
726 client->output = NULL;
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
727
19752
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
728 /* send all pending client input to proxy */
d9a6a40ecf15 login-proxy: Preserve client's istream even after login.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
729 data = i_stream_get_data(proxy->client_input, &size);
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
730 if (size != 0)
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
731 o_stream_nsend(proxy->server_output, data, size);
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
732
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
733 /* from now on, just do dummy proxying */
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3049
diff changeset
734 io_remove(&proxy->server_io);
4036
bb6a724a3396 Minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
735 proxy->server_io =
bb6a724a3396 Minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
736 io_add(proxy->server_fd, IO_READ, server_input, proxy);
bb6a724a3396 Minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
737 proxy->client_io =
19834
785dec1e0a0e login-proxy: Use io_add_istream() for adding client_input io.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19752
diff changeset
738 io_add_istream(proxy->client_input, proxy_client_input, proxy);
3049
7f503848533e s/proxy/server/ for variables describing remote server.
Timo Sirainen <tss@iki.fi>
parents: 2790
diff changeset
739 o_stream_set_flush_callback(proxy->server_output, server_output, proxy);
4669
d84a7bd63862 Reference counter fixing for client while it's being used in login proxy.
Timo Sirainen <tss@iki.fi>
parents: 4538
diff changeset
740 i_stream_destroy(&proxy->server_input);
d84a7bd63862 Reference counter fixing for client while it's being used in login proxy.
Timo Sirainen <tss@iki.fi>
parents: 4538
diff changeset
741
11324
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
742 if (proxy->notify_refresh_secs != 0) {
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
743 proxy->to_notify =
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
744 timeout_add(proxy->notify_refresh_secs * 1000,
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
745 login_proxy_notify, proxy);
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
746 }
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
747
4669
d84a7bd63862 Reference counter fixing for client while it's being used in login proxy.
Timo Sirainen <tss@iki.fi>
parents: 4538
diff changeset
748 proxy->callback = NULL;
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
749
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
750 if (login_proxy_ipc_server == NULL) {
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
751 login_proxy_ipc_server =
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
752 ipc_server_init(LOGIN_PROXY_IPC_PATH,
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
753 LOGIN_PROXY_IPC_NAME,
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
754 login_proxy_ipc_cmd);
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
755 }
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
756
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
757 DLLIST_REMOVE(&login_proxies_pending, proxy);
7119
8c6a7af67e8c Replaced clients hash with a linked list.
Timo Sirainen <tss@iki.fi>
parents: 7117
diff changeset
758 DLLIST_PREPEND(&login_proxies, proxy);
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
759
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
760 client->fd = -1;
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
761 client->login_proxy = NULL;
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
762 }
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
763
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
764 static int login_proxy_ssl_handshaked(void *context)
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
765 {
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
766 struct login_proxy *proxy = context;
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
767
13675
7e3afd2252fd login proxy: Verify that remote hostname matches SSL cert, unless ssl=any-cert
Timo Sirainen <tss@iki.fi>
parents: 13670
diff changeset
768 if ((proxy->ssl_flags & PROXY_SSL_FLAG_ANY_CERT) != 0)
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
769 return 0;
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
770
13675
7e3afd2252fd login proxy: Verify that remote hostname matches SSL cert, unless ssl=any-cert
Timo Sirainen <tss@iki.fi>
parents: 13670
diff changeset
771 if (ssl_proxy_has_broken_client_cert(proxy->ssl_server_proxy)) {
7e3afd2252fd login proxy: Verify that remote hostname matches SSL cert, unless ssl=any-cert
Timo Sirainen <tss@iki.fi>
parents: 13670
diff changeset
772 client_log_err(proxy->client, t_strdup_printf(
14516
36cde186aec6 *-login: If client certificate isn't valid, log the reason why.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
773 "proxy: Received invalid SSL certificate from %s:%u: %s",
36cde186aec6 *-login: If client certificate isn't valid, log the reason why.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
774 proxy->host, proxy->port,
36cde186aec6 *-login: If client certificate isn't valid, log the reason why.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
775 ssl_proxy_get_cert_error(proxy->ssl_server_proxy)));
13675
7e3afd2252fd login proxy: Verify that remote hostname matches SSL cert, unless ssl=any-cert
Timo Sirainen <tss@iki.fi>
parents: 13670
diff changeset
776 } else if (!ssl_proxy_has_valid_client_cert(proxy->ssl_server_proxy)) {
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
777 client_log_err(proxy->client, t_strdup_printf(
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
778 "proxy: SSL certificate not received from %s:%u",
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
779 proxy->host, proxy->port));
13675
7e3afd2252fd login proxy: Verify that remote hostname matches SSL cert, unless ssl=any-cert
Timo Sirainen <tss@iki.fi>
parents: 13670
diff changeset
780 } else if (ssl_proxy_cert_match_name(proxy->ssl_server_proxy,
7e3afd2252fd login proxy: Verify that remote hostname matches SSL cert, unless ssl=any-cert
Timo Sirainen <tss@iki.fi>
parents: 13670
diff changeset
781 proxy->host) < 0) {
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
782 client_log_err(proxy->client, t_strdup_printf(
13675
7e3afd2252fd login proxy: Verify that remote hostname matches SSL cert, unless ssl=any-cert
Timo Sirainen <tss@iki.fi>
parents: 13670
diff changeset
783 "proxy: hostname doesn't match SSL certificate at %s:%u",
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
784 proxy->host, proxy->port));
13675
7e3afd2252fd login proxy: Verify that remote hostname matches SSL cert, unless ssl=any-cert
Timo Sirainen <tss@iki.fi>
parents: 13670
diff changeset
785 } else {
7e3afd2252fd login proxy: Verify that remote hostname matches SSL cert, unless ssl=any-cert
Timo Sirainen <tss@iki.fi>
parents: 13670
diff changeset
786 return 0;
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
787 }
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
788 proxy->disconnecting = TRUE;
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
789 return -1;
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
790 }
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
791
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
792 int login_proxy_starttls(struct login_proxy *proxy)
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
793 {
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
794 int fd;
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
795
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
796 if (proxy->server_input != NULL)
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
797 i_stream_destroy(&proxy->server_input);
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
798 if (proxy->server_output != NULL)
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
799 o_stream_destroy(&proxy->server_output);
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
800 io_remove(&proxy->server_io);
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
801
10224
3f1c47797dee ssl: Don't start handshake until client has been set.
Timo Sirainen <tss@iki.fi>
parents: 10171
diff changeset
802 fd = ssl_proxy_client_alloc(proxy->server_fd, &proxy->client->ip,
14368
842e5124038d *-login: Another crashfix
Timo Sirainen <tss@iki.fi>
parents: 14301
diff changeset
803 proxy->client->pool, proxy->client->set,
14728
983c6ff12cc9 Moved ssl_* settings from login-common to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 14688
diff changeset
804 proxy->client->ssl_set,
10224
3f1c47797dee ssl: Don't start handshake until client has been set.
Timo Sirainen <tss@iki.fi>
parents: 10171
diff changeset
805 login_proxy_ssl_handshaked, proxy,
3f1c47797dee ssl: Don't start handshake until client has been set.
Timo Sirainen <tss@iki.fi>
parents: 10171
diff changeset
806 &proxy->ssl_server_proxy);
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
807 if (fd < 0) {
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
808 client_log_err(proxy->client, t_strdup_printf(
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
809 "proxy: SSL handshake failed to %s:%u",
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
810 proxy->host, proxy->port));
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
811 return -1;
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
812 }
9929
d60fa42fbaac *-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents: 9774
diff changeset
813 ssl_proxy_set_client(proxy->ssl_server_proxy, proxy->client);
10224
3f1c47797dee ssl: Don't start handshake until client has been set.
Timo Sirainen <tss@iki.fi>
parents: 10171
diff changeset
814 ssl_proxy_start(proxy->ssl_server_proxy);
9165
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
815
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
816 proxy->server_fd = fd;
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
817 proxy_plain_connected(proxy);
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
818 return 0;
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
819 }
96678e83eab6 imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
820
10171
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
821 static void proxy_kill_idle(struct login_proxy *proxy)
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
822 {
19327
a98aaaf55b13 login proxy: Separate admin kicks, director kicks and shutdowns in log messages.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
823 login_proxy_free_reason(&proxy, KILLED_BY_SHUTDOWN_REASON);
10171
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
824 }
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
825
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
826 void login_proxy_kill_idle(void)
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
827 {
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
828 struct login_proxy *proxy, *next;
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
829 time_t now = time(NULL);
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
830 time_t stop_timestamp = now - LOGIN_PROXY_DIE_IDLE_SECS;
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
831 unsigned int stop_msecs;
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
832
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
833 for (proxy = login_proxies; proxy != NULL; proxy = next) {
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
834 next = proxy->next;
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
835
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
836 if (proxy->last_io <= stop_timestamp)
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
837 proxy_kill_idle(proxy);
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
838 else {
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
839 i_assert(proxy->to == NULL);
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
840 stop_msecs = (proxy->last_io - stop_timestamp) * 1000;
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
841 proxy->to = timeout_add(stop_msecs,
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
842 proxy_kill_idle, proxy);
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
843 }
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
844 }
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
845 }
7f0ccd367351 Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents: 10087
diff changeset
846
20842
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
847 static bool
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
848 want_kick_virtual_user(struct client *client, const char *const *args,
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
849 unsigned int key_idx ATTR_UNUSED)
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
850 {
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
851 return str_array_find(args, client->virtual_user);
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
852 }
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
853
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
854 static bool
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
855 want_kick_alt_username(struct client *client, const char *const *args,
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
856 unsigned int key_idx)
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
857 {
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
858 unsigned int i;
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
859
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
860 if (client->alt_usernames == NULL)
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
861 return FALSE;
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
862 for (i = 0; i < key_idx; i++) {
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
863 if (client->alt_usernames[i] == NULL)
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
864 return FALSE;
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
865 }
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
866 return str_array_find(args, client->alt_usernames[i]);
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
867 }
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
868
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
869 static void
20842
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
870 login_proxy_cmd_kick_full(struct ipc_cmd *cmd, const char *const *args,
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
871 bool (*want_kick)(struct client *, const char *const *,
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
872 unsigned int), unsigned int key_idx)
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
873 {
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
874 struct login_proxy *proxy, *next;
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
875 unsigned int count = 0;
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
876
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
877 if (args[0] == NULL) {
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
878 ipc_cmd_fail(&cmd, "Missing parameter");
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
879 return;
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
880 }
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
881
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
882 for (proxy = login_proxies; proxy != NULL; proxy = next) {
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
883 next = proxy->next;
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
884
20842
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
885 if (want_kick(proxy->client, args, key_idx)) {
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
886 login_proxy_free_delayed(&proxy, KILLED_BY_ADMIN_REASON);
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
887 count++;
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
888 }
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
889 }
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
890 for (proxy = login_proxies_pending; proxy != NULL; proxy = next) {
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
891 next = proxy->next;
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
892
20842
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
893 if (want_kick(proxy->client, args, key_idx)) {
13049
936f6c2ddfdd doveadm proxy: s/kill/kick/ and related internal code changes.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
894 client_destroy(proxy->client, "Connection kicked");
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
895 count++;
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
896 }
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
897 }
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
898 ipc_cmd_success_reply(&cmd, t_strdup_printf("%u", count));
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
899 }
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
900
20842
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
901 static void
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
902 login_proxy_cmd_kick(struct ipc_cmd *cmd, const char *const *args)
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
903 {
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
904 login_proxy_cmd_kick_full(cmd, args, want_kick_virtual_user, 0);
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
905 }
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
906
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
907 static void
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
908 login_proxy_cmd_kick_alt(struct ipc_cmd *cmd, const char *const *args)
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
909 {
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
910 char *const *fields;
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
911 unsigned int i, count;
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
912
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
913 if (args[0] == NULL) {
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
914 ipc_cmd_fail(&cmd, "Missing parameter");
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
915 return;
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
916 }
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
917 fields = array_get(&global_alt_usernames, &count);
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
918 for (i = 0; i < count; i++) {
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
919 if (strcmp(fields[i], args[0]) == 0)
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
920 break;
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
921 }
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
922 if (i == count) {
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
923 /* field doesn't exist, but it's not an error necessarily */
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
924 ipc_cmd_success_reply(&cmd, "0");
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
925 return;
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
926 }
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
927
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
928 login_proxy_cmd_kick_full(cmd, args+1, want_kick_alt_username, i);
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
929 }
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
930
14292
817ef4c9f1f3 Added director_username_hash setting to specify what part of the username is hashed.
Timo Sirainen <tss@iki.fi>
parents: 14258
diff changeset
931 static unsigned int director_username_hash(struct client *client)
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
932 {
22478
c647979828d1 *-login: Cache director_username_hash between KICK-DIRECTOR-HASH commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22311
diff changeset
933 if (client->director_username_hash_cache != 0) {
c647979828d1 *-login: Cache director_username_hash between KICK-DIRECTOR-HASH commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22311
diff changeset
934 /* already set */
c647979828d1 *-login: Cache director_username_hash between KICK-DIRECTOR-HASH commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22311
diff changeset
935 } else {
c647979828d1 *-login: Cache director_username_hash between KICK-DIRECTOR-HASH commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22311
diff changeset
936 client->director_username_hash_cache =
c647979828d1 *-login: Cache director_username_hash between KICK-DIRECTOR-HASH commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22311
diff changeset
937 mail_user_hash(client->virtual_user,
c647979828d1 *-login: Cache director_username_hash between KICK-DIRECTOR-HASH commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22311
diff changeset
938 client->set->director_username_hash);
c647979828d1 *-login: Cache director_username_hash between KICK-DIRECTOR-HASH commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22311
diff changeset
939 }
c647979828d1 *-login: Cache director_username_hash between KICK-DIRECTOR-HASH commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22311
diff changeset
940 return client->director_username_hash_cache;
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
941 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
942
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
943 static void
13049
936f6c2ddfdd doveadm proxy: s/kill/kick/ and related internal code changes.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
944 login_proxy_cmd_kick_director_hash(struct ipc_cmd *cmd, const char *const *args)
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
945 {
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
946 struct login_proxy *proxy, *next;
17419
8aa0cd95d6a8 director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
947 struct ip_addr except_ip;
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
948 unsigned int hash, count = 0;
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
949
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
950 if (args[0] == NULL || str_to_uint(args[0], &hash) < 0) {
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
951 ipc_cmd_fail(&cmd, "Invalid parameters");
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
952 return;
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
953 }
17419
8aa0cd95d6a8 director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
954 /* optional except_ip parameter specifies that we're not killing the
8aa0cd95d6a8 director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
955 connections that are proxying to the except_ip backend */
8aa0cd95d6a8 director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
956 except_ip.family = 0;
8aa0cd95d6a8 director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
957 if (args[1] != NULL && args[1][0] != '\0' &&
8aa0cd95d6a8 director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
958 net_addr2ip(args[1], &except_ip) < 0) {
8aa0cd95d6a8 director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
959 ipc_cmd_fail(&cmd, "Invalid except_ip parameter");
8aa0cd95d6a8 director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
960 return;
8aa0cd95d6a8 director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
961 }
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
962
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
963 for (proxy = login_proxies; proxy != NULL; proxy = next) {
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
964 next = proxy->next;
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
965
17419
8aa0cd95d6a8 director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
966 if (director_username_hash(proxy->client) == hash &&
8aa0cd95d6a8 director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
967 !net_ip_compare(&proxy->ip, &except_ip)) {
19327
a98aaaf55b13 login proxy: Separate admin kicks, director kicks and shutdowns in log messages.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
968 login_proxy_free_delayed(&proxy, KILLED_BY_DIRECTOR_REASON);
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
969 count++;
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
970 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
971 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
972 for (proxy = login_proxies_pending; proxy != NULL; proxy = next) {
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
973 next = proxy->next;
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
974
17419
8aa0cd95d6a8 director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
975 if (director_username_hash(proxy->client) == hash &&
8aa0cd95d6a8 director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
976 !net_ip_compare(&proxy->ip, &except_ip)) {
13049
936f6c2ddfdd doveadm proxy: s/kill/kick/ and related internal code changes.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
977 client_destroy(proxy->client, "Connection kicked");
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
978 count++;
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
979 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
980 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
981 ipc_cmd_success_reply(&cmd, t_strdup_printf("%u", count));
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
982 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 13043
diff changeset
983
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
984 static void
20841
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
985 login_proxy_cmd_list_reply(struct ipc_cmd *cmd, string_t *str,
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
986 struct login_proxy *proxy)
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
987 {
20841
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
988 unsigned int i, alt_count = array_count(&global_alt_usernames);
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
989
20841
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
990 str_truncate(str, 0);
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
991 str_append_tabescaped(str, proxy->client->virtual_user);
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
992 str_append_c(str, '\t');
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
993 i = 0;
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
994 if (proxy->client->alt_usernames != NULL) {
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
995 for (; proxy->client->alt_usernames[i] != NULL; i++) {
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
996 str_append_tabescaped(str, proxy->client->alt_usernames[i]);
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
997 str_append_c(str, '\t');
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
998 }
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
999 i_assert(i <= alt_count);
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1000 }
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1001 for (; i < alt_count; i++)
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1002 str_append_c(str, '\t');
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1003
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1004 str_printfa(str, "%s\t%s\t%s\t%u", login_binary->protocol,
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1005 net_ip2addr(&proxy->client->ip),
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1006 net_ip2addr(&proxy->ip), proxy->port);
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1007 ipc_cmd_send(cmd, str_c(str));
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1008 }
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1009
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1010 static void
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1011 login_proxy_cmd_list(struct ipc_cmd *cmd, const char *const *args ATTR_UNUSED)
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1012 {
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1013 struct login_proxy *proxy;
20841
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1014 char *const *fieldp;
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1015 string_t *str = t_str_new(64);
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1016
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1017 str_append(str, "username\t");
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1018 array_foreach(&global_alt_usernames, fieldp) {
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1019 str_append_tabescaped(str, *fieldp);
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1020 str_append_c(str, '\t');
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1021 }
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1022 str_append(str, "service\tsrc-ip\tdest-ip\tdest-port");
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1023
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1024 ipc_cmd_send(cmd, str_c(str));
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1025
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1026 for (proxy = login_proxies; proxy != NULL; proxy = proxy->next)
20841
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1027 login_proxy_cmd_list_reply(cmd, str, proxy);
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1028 for (proxy = login_proxies_pending; proxy != NULL; proxy = proxy->next)
20841
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1029 login_proxy_cmd_list_reply(cmd, str, proxy);
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1030 ipc_cmd_success(&cmd);
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1031 }
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1032
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1033 static void login_proxy_ipc_cmd(struct ipc_cmd *cmd, const char *line)
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1034 {
22311
25af9d4dad59 global: Replaced t_strsplit_tab() calls with t_strsplit_tabescaped()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21765
diff changeset
1035 const char *const *args = t_strsplit_tabescaped(line);
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1036 const char *name = args[0];
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1037
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1038 args++;
13049
936f6c2ddfdd doveadm proxy: s/kill/kick/ and related internal code changes.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
1039 if (strcmp(name, "KICK") == 0)
936f6c2ddfdd doveadm proxy: s/kill/kick/ and related internal code changes.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
1040 login_proxy_cmd_kick(cmd, args);
20842
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
1041 else if (strcmp(name, "KICK-ALT") == 0)
8c389aa81c15 doveadm proxy kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20841
diff changeset
1042 login_proxy_cmd_kick_alt(cmd, args);
13049
936f6c2ddfdd doveadm proxy: s/kill/kick/ and related internal code changes.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
1043 else if (strcmp(name, "KICK-DIRECTOR-HASH") == 0)
936f6c2ddfdd doveadm proxy: s/kill/kick/ and related internal code changes.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
1044 login_proxy_cmd_kick_director_hash(cmd, args);
20841
c3cc30b7eda6 doveadm proxy list: Show all user_* fields in output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20772
diff changeset
1045 else if (strcmp(name, "LIST-FULL") == 0)
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1046 login_proxy_cmd_list(cmd, args);
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1047 else
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1048 ipc_cmd_fail(&cmd, "Unknown command");
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1049 }
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1050
11324
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
1051 void login_proxy_init(const char *proxy_notify_pipe_path)
9774
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
1052 {
11324
c872378a8de6 login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents: 10616
diff changeset
1053 proxy_state = login_proxy_state_init(proxy_notify_pipe_path);
9774
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
1054 }
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
1055
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1056 void login_proxy_deinit(void)
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1057 {
8583
2ff2cac3578b imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
1058 struct login_proxy *proxy;
2ff2cac3578b imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
1059
2ff2cac3578b imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
1060 while (login_proxies != NULL) {
2ff2cac3578b imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
1061 proxy = login_proxies;
19327
a98aaaf55b13 login proxy: Separate admin kicks, director kicks and shutdowns in log messages.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
1062 login_proxy_free_reason(&proxy, KILLED_BY_SHUTDOWN_REASON);
8583
2ff2cac3578b imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
1063 }
19107
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
1064 while (login_proxies_disconnecting != NULL)
2eeef1619161 login proxy: Added delayed disconnection of clients on server mass-disconnect.
Timo Sirainen <tss@iki.fi>
parents: 19088
diff changeset
1065 login_proxy_free_final(login_proxies_disconnecting);
13041
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1066 if (login_proxy_ipc_server != NULL)
e4f7fb3b5a9c login proxy: Connect to IPC server and implement KILL and LIST commands.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1067 ipc_server_deinit(&login_proxy_ipc_server);
9774
da0a48b243a2 login-proxy: If proxy destination is known to be down, fail immediately.
Timo Sirainen <tss@iki.fi>
parents: 9773
diff changeset
1068 login_proxy_state_deinit(&proxy_state);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1069 }