Mercurial > dovecot > core-2.2
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 |
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 | 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 | 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 | 735 proxy->server_io = |
736 io_add(proxy->server_fd, IO_READ, server_input, proxy); | |
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 | 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 } |