Mercurial > dovecot > core-2.2
annotate src/director/login-connection.c @ 22645:57e7fafb10c5
director: Avoid str_printfa() in login_host_callback()
Optimizes the CPU usage.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sat, 04 Nov 2017 02:17:55 +0200 |
parents | 2ed6735ffc7a |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21389
diff
changeset
|
1 /* Copyright (c) 2010-2017 Dovecot authors, see the included COPYING file */ |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "ioloop.h" |
15187
02451e967a06
Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
5 #include "net.h" |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
6 #include "str.h" |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
7 #include "istream.h" |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "ostream.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "llist.h" |
22311
25af9d4dad59
global: Replaced t_strsplit_tab() calls with t_strsplit_tabescaped()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
10 #include "strescape.h" |
11430
c82a7922fca9
director: Update connection counts also on login connection deinit.
Timo Sirainen <tss@iki.fi>
parents:
11326
diff
changeset
|
11 #include "master-service.h" |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include "director.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include "director-request.h" |
22644
2ed6735ffc7a
director: Change request callback to take mail_host parameter
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22311
diff
changeset
|
14 #include "mail-host.h" |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include "auth-connection.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #include "login-connection.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 #include <unistd.h> |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
20 #define AUTHREPLY_PROTOCOL_MAJOR_VERSION 1 |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
21 #define AUTHREPLY_PROTOCOL_MINOR_VERSION 0 |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
22 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 struct login_connection { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 struct login_connection *prev, *next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 int refcount; |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
27 enum login_connection_type type; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 int fd; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 struct io *io; |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
31 struct istream *input; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 struct ostream *output; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 struct auth_connection *auth; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 struct director *dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
36 unsigned int handshaked:1; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 unsigned int destroyed:1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 struct login_host_request { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 struct login_connection *conn; |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
42 char *line, *username; |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
43 |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
44 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:
18675
diff
changeset
|
45 in_port_t local_port; |
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18675
diff
changeset
|
46 in_port_t dest_port; |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
47 bool director_proxy_maybe; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 static struct login_connection *login_connections; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
52 static void auth_input_line(const char *line, void *context); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 static void login_connection_unref(struct login_connection **_conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 static void login_connection_input(struct login_connection *conn) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 { |
18670
d54dc360cd3c
director: Minor code cleanup - allow access to auth connection's ostream directly.
Timo Sirainen <tss@iki.fi>
parents:
18669
diff
changeset
|
57 struct ostream *output; |
18669
67fdd6f962f5
director: Reverted previous e178413a905d commit after all - do it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
18666
diff
changeset
|
58 unsigned char buf[4096]; |
67fdd6f962f5
director: Reverted previous e178413a905d commit after all - do it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
18666
diff
changeset
|
59 ssize_t ret; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 |
18669
67fdd6f962f5
director: Reverted previous e178413a905d commit after all - do it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
18666
diff
changeset
|
61 ret = read(conn->fd, buf, sizeof(buf)); |
67fdd6f962f5
director: Reverted previous e178413a905d commit after all - do it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
18666
diff
changeset
|
62 if (ret <= 0) { |
67fdd6f962f5
director: Reverted previous e178413a905d commit after all - do it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
18666
diff
changeset
|
63 if (ret < 0) { |
67fdd6f962f5
director: Reverted previous e178413a905d commit after all - do it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
18666
diff
changeset
|
64 if (errno == EAGAIN) |
67fdd6f962f5
director: Reverted previous e178413a905d commit after all - do it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
18666
diff
changeset
|
65 return; |
67fdd6f962f5
director: Reverted previous e178413a905d commit after all - do it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
18666
diff
changeset
|
66 if (errno != ECONNRESET) |
67fdd6f962f5
director: Reverted previous e178413a905d commit after all - do it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
18666
diff
changeset
|
67 i_error("read(login connection) failed: %m"); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 login_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 } |
18670
d54dc360cd3c
director: Minor code cleanup - allow access to auth connection's ostream directly.
Timo Sirainen <tss@iki.fi>
parents:
18669
diff
changeset
|
72 output = auth_connection_get_output(conn->auth); |
d54dc360cd3c
director: Minor code cleanup - allow access to auth connection's ostream directly.
Timo Sirainen <tss@iki.fi>
parents:
18669
diff
changeset
|
73 o_stream_nsend(output, buf, ret); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
76 static void login_connection_authreply_input(struct login_connection *conn) |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
77 { |
20693
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
78 bool bail = FALSE; |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
79 const char *line; |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
80 |
20693
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
81 while (!bail && (line = i_stream_read_next_line(conn->input)) != NULL) T_BEGIN { |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
82 if (!conn->handshaked) { |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
83 if (!version_string_verify(line, "director-authreply-client", |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
84 AUTHREPLY_PROTOCOL_MAJOR_VERSION)) { |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
85 i_error("authreply client sent invalid handshake: %s", line); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
86 login_connection_deinit(&conn); |
20693
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
87 bail = TRUE; /* don't return from within a T_BEGIN {...} T_END */ |
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
88 } else { |
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
89 conn->handshaked = TRUE; |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
90 } |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
91 } else { |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
92 auth_input_line(line, conn); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
93 } |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
94 } T_END; |
20693
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
95 |
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
96 if (bail) |
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
97 return; |
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
98 |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
99 if (conn->input->eof) { |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
100 if (conn->input->stream_errno != 0 && |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
101 conn->input->stream_errno != ECONNRESET) { |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
102 i_error("read(authreply connection) failed: %s", |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
103 i_stream_get_error(conn->input)); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
104 } |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
105 login_connection_deinit(&conn); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
106 } |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
107 } |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
108 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 static void |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 login_connection_send_line(struct login_connection *conn, const char *line) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 struct const_iovec iov[2]; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 if (conn->destroyed) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 iov[0].iov_base = line; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 iov[0].iov_len = strlen(line); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 iov[1].iov_base = "\n"; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 iov[1].iov_len = 1; |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
121 o_stream_nsendv(conn->output, iov, N_ELEMENTS(iov)); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
124 static bool login_host_request_is_self(struct login_host_request *request, |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
125 const struct ip_addr *dest_ip) |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
126 { |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
127 if (!net_ip_compare(dest_ip, &request->local_ip)) |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
128 return FALSE; |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
129 if (request->dest_port != 0 && request->local_port != 0 && |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
130 request->dest_port != request->local_port) |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
131 return FALSE; |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
132 return TRUE; |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
133 } |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
134 |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
135 static void |
22644
2ed6735ffc7a
director: Change request callback to take mail_host parameter
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22311
diff
changeset
|
136 login_host_callback(const struct mail_host *host, const char *hostname, |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
137 const char *errormsg, void *context) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 struct login_host_request *request = context; |
11325
2a5336ad86cd
director: Tell login proxy to notify director of open connections every director_user_expire/2 secs.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
140 struct director *dir = request->conn->dir; |
16785
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
141 const char *line, *line_params; |
11325
2a5336ad86cd
director: Tell login proxy to notify director of open connections every director_user_expire/2 secs.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
142 unsigned int secs; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 |
22644
2ed6735ffc7a
director: Change request callback to take mail_host parameter
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22311
diff
changeset
|
144 if (host == NULL) { |
16785
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
145 if (strncmp(request->line, "OK\t", 3) == 0) |
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
146 line_params = request->line + 3; |
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
147 else if (strncmp(request->line, "PASS\t", 5) == 0) |
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
148 line_params = request->line + 5; |
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
149 else |
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
150 i_panic("BUG: Unexpected line: %s", request->line); |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
151 |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
152 i_error("director: User %s host lookup failed: %s", |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
153 request->username, errormsg); |
16785
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
154 line = t_strconcat("FAIL\t", t_strcut(line_params, '\t'), |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
155 "\ttemp", NULL); |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
156 } else if (request->director_proxy_maybe && |
22644
2ed6735ffc7a
director: Change request callback to take mail_host parameter
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22311
diff
changeset
|
157 login_host_request_is_self(request, &host->ip)) { |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
158 line = request->line; |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
159 } else { |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
160 string_t *str = t_str_new(64); |
22645
57e7fafb10c5
director: Avoid str_printfa() in login_host_callback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22644
diff
changeset
|
161 char secs_buf[MAX_INT_STRLEN]; |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
162 |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
163 secs = dir->set->director_user_expire / 2; |
22645
57e7fafb10c5
director: Avoid str_printfa() in login_host_callback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22644
diff
changeset
|
164 str_append(str, request->line); |
57e7fafb10c5
director: Avoid str_printfa() in login_host_callback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22644
diff
changeset
|
165 str_append(str, "\tproxy_refresh="); |
57e7fafb10c5
director: Avoid str_printfa() in login_host_callback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22644
diff
changeset
|
166 str_append(str, dec2str_buf(secs_buf, secs)); |
57e7fafb10c5
director: Avoid str_printfa() in login_host_callback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22644
diff
changeset
|
167 str_append(str, "\thost="); |
19438
f643e85f42ec
director: Don't treat empty hostname the same as having it.
Timo Sirainen <tss@iki.fi>
parents:
19310
diff
changeset
|
168 if (hostname == NULL || hostname[0] == '\0') |
22645
57e7fafb10c5
director: Avoid str_printfa() in login_host_callback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22644
diff
changeset
|
169 str_append(str, host->ip_str); |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
170 else { |
22645
57e7fafb10c5
director: Avoid str_printfa() in login_host_callback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22644
diff
changeset
|
171 str_append(str, hostname); |
57e7fafb10c5
director: Avoid str_printfa() in login_host_callback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22644
diff
changeset
|
172 str_append(str, "\thostip="); |
57e7fafb10c5
director: Avoid str_printfa() in login_host_callback()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22644
diff
changeset
|
173 str_append(str, host->ip_str); |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
174 } |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
175 line = str_c(str); |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
176 } |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
177 login_connection_send_line(request->conn, line); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 login_connection_unref(&request->conn); |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
180 i_free(request->username); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 i_free(request->line); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 i_free(request); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 static void auth_input_line(const char *line, void *context) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 struct login_connection *conn = context; |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
188 struct login_host_request *request, temp_request; |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17467
diff
changeset
|
189 const char *const *args, *line_params, *username = NULL, *tag = ""; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 bool proxy = FALSE, host = FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 if (line == NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 /* auth connection died -> kill also this login connection */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 login_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 } |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
197 if (conn->type != LOGIN_CONNECTION_TYPE_USERDB && |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
198 strncmp(line, "OK\t", 3) == 0) |
11714
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
199 line_params = line + 3; |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
200 else if (conn->type == LOGIN_CONNECTION_TYPE_USERDB && |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
201 strncmp(line, "PASS\t", 5) == 0) |
11714
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
202 line_params = line + 5; |
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
203 else { |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 login_connection_send_line(conn, line); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 /* OK <id> [<parameters>] */ |
22311
25af9d4dad59
global: Replaced t_strsplit_tab() calls with t_strsplit_tabescaped()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
209 args = t_strsplit_tabescaped(line_params); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 if (*args != NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 /* we should always get here, but in case we don't just |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 forward as-is and let login process handle the error. */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 args++; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20693
diff
changeset
|
216 i_zero(&temp_request); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 for (; *args != NULL; args++) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 if (strncmp(*args, "proxy", 5) == 0 && |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 ((*args)[5] == '=' || (*args)[5] == '\0')) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 proxy = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 else if (strncmp(*args, "host=", 5) == 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 host = TRUE; |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
223 else if (strncmp(*args, "lip=", 4) == 0) { |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
224 if (net_addr2ip((*args) + 4, &temp_request.local_ip) < 0) |
18503
333533e2d231
director: Log error if auth sends invalid lip/lport/port parameter.
Timo Sirainen <tss@iki.fi>
parents:
18498
diff
changeset
|
225 i_error("auth sent invalid lip field: %s", (*args) + 6); |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
226 } else if (strncmp(*args, "lport=", 6) == 0) { |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18675
diff
changeset
|
227 if (net_str2port((*args) + 6, &temp_request.local_port) < 0) |
18503
333533e2d231
director: Log error if auth sends invalid lip/lport/port parameter.
Timo Sirainen <tss@iki.fi>
parents:
18498
diff
changeset
|
228 i_error("auth sent invalid lport field: %s", (*args) + 6); |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
229 } else if (strncmp(*args, "port=", 5) == 0) { |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18675
diff
changeset
|
230 if (net_str2port((*args) + 5, &temp_request.dest_port) < 0) |
18503
333533e2d231
director: Log error if auth sends invalid lip/lport/port parameter.
Timo Sirainen <tss@iki.fi>
parents:
18498
diff
changeset
|
231 i_error("auth sent invalid port field: %s", (*args) + 6); |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
232 } else if (strncmp(*args, "destuser=", 9) == 0) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 username = *args + 9; |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17467
diff
changeset
|
234 else if (strncmp(*args, "director_tag=", 13) == 0) |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17467
diff
changeset
|
235 tag = *args + 13; |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
236 else if (strncmp(*args, "director_proxy_maybe", 20) == 0 && |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
237 ((*args)[20] == '=' || (*args)[20] == '\0')) |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
238 temp_request.director_proxy_maybe = TRUE; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 else if (strncmp(*args, "user=", 5) == 0) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 if (username == NULL) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 username = *args + 5; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 } |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
244 if ((!proxy && !temp_request.director_proxy_maybe) || |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
245 host || username == NULL) { |
17467
899cf87a687c
director: Fixed crash if master_user_separator is set, but we didn't do a proxy lookup.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
246 login_connection_send_line(conn, line); |
899cf87a687c
director: Fixed crash if master_user_separator is set, but we didn't do a proxy lookup.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
247 return; |
899cf87a687c
director: Fixed crash if master_user_separator is set, but we didn't do a proxy lookup.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
248 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 if (*conn->dir->set->master_user_separator != '\0') { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 /* with master user logins we still want to use only the |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 login username */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 username = t_strcut(username, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 *conn->dir->set->master_user_separator); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 /* we need to add the host. the lookup might be asynchronous */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 request = i_new(struct login_host_request, 1); |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
258 *request = temp_request; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 request->conn = conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 request->line = i_strdup(line); |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
261 request->username = i_strdup(username); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 conn->refcount++; |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17467
diff
changeset
|
264 director_request(conn->dir, username, tag, login_host_callback, request); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
265 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 struct login_connection * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 login_connection_init(struct director *dir, int fd, |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
269 struct auth_connection *auth, |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
270 enum login_connection_type type) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 struct login_connection *conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 conn = i_new(struct login_connection, 1); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 conn->refcount = 1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 conn->fd = fd; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 conn->dir = dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 conn->output = o_stream_create_fd(conn->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:
14471
diff
changeset
|
279 o_stream_set_no_error_handling(conn->output, TRUE); |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
280 if (type != LOGIN_CONNECTION_TYPE_AUTHREPLY) { |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
281 i_assert(auth != NULL); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
282 conn->auth = auth; |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
283 conn->io = io_add(conn->fd, IO_READ, |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
284 login_connection_input, conn); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
285 auth_connection_set_callback(conn->auth, auth_input_line, conn); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
286 } else { |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
287 i_assert(auth == NULL); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
288 conn->input = i_stream_create_fd(conn->fd, IO_BLOCK_SIZE, FALSE); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
289 conn->io = io_add(conn->fd, IO_READ, |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
290 login_connection_authreply_input, conn); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
291 o_stream_nsend_str(conn->output, t_strdup_printf( |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
292 "VERSION\tdirector-authreply-server\t%d\t%d\n", |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
293 AUTHREPLY_PROTOCOL_MAJOR_VERSION, |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
294 AUTHREPLY_PROTOCOL_MINOR_VERSION)); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
295 } |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
296 conn->type = type; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 DLLIST_PREPEND(&login_connections, conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 return conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 void login_connection_deinit(struct login_connection **_conn) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 struct login_connection *conn = *_conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 *_conn = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 if (conn->destroyed) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 conn->destroyed = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 DLLIST_REMOVE(&login_connections, conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 io_remove(&conn->io); |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
314 if (conn->input != NULL) |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
315 i_stream_destroy(&conn->input); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
316 o_stream_destroy(&conn->output); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 if (close(conn->fd) < 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 i_error("close(login connection) failed: %m"); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 conn->fd = -1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
321 if (conn->auth != NULL) |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
322 auth_connection_deinit(&conn->auth); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 login_connection_unref(&conn); |
11430
c82a7922fca9
director: Update connection counts also on login connection deinit.
Timo Sirainen <tss@iki.fi>
parents:
11326
diff
changeset
|
324 |
c82a7922fca9
director: Update connection counts also on login connection deinit.
Timo Sirainen <tss@iki.fi>
parents:
11326
diff
changeset
|
325 master_service_client_connection_destroyed(master_service); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 static void login_connection_unref(struct login_connection **_conn) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 struct login_connection *conn = *_conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 *_conn = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 i_assert(conn->refcount > 0); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 if (--conn->refcount == 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 i_free(conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 void login_connections_deinit(void) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
341 while (login_connections != NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 struct login_connection *conn = login_connections; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 login_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 } |