Mercurial > dovecot > core-2.2
annotate src/director/login-connection.c @ 22311:25af9d4dad59
global: Replaced t_strsplit_tab() calls with t_strsplit_tabescaped()
This is useful especially in auth code to support LFs in extra fields.
Other pieces of code were also tab-escaping strings, but never unescaping
them. Usually it didn't matter, because nobody would use the escaped
characters. Still, the code wasn't exactly behaving correctly.
One downside to this change is that it's now possible to pass through TABs,
CRs and LFs through the various protocols. In theory this shouldn't cause
any problems, but combined with other bugs this could trigger some security
problems.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 20 Oct 2016 17:45:44 +0300 |
parents | 2e2563132d5f |
children | 2ed6735ffc7a |
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" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include "auth-connection.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include "login-connection.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 #include <unistd.h> |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
19 #define AUTHREPLY_PROTOCOL_MAJOR_VERSION 1 |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
20 #define AUTHREPLY_PROTOCOL_MINOR_VERSION 0 |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
21 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 struct login_connection { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 struct login_connection *prev, *next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 int refcount; |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
26 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
|
27 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 int fd; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 struct io *io; |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
30 struct istream *input; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 struct ostream *output; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 struct auth_connection *auth; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 struct director *dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
35 unsigned int handshaked:1; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 unsigned int destroyed:1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 }; |
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 struct login_host_request { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 struct login_connection *conn; |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
41 char *line, *username; |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
42 |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
43 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
|
44 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
|
45 in_port_t dest_port; |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
46 bool director_proxy_maybe; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 }; |
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 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
|
50 |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
51 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
|
52 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
|
53 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 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
|
55 { |
18670
d54dc360cd3c
director: Minor code cleanup - allow access to auth connection's ostream directly.
Timo Sirainen <tss@iki.fi>
parents:
18669
diff
changeset
|
56 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
|
57 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
|
58 ssize_t ret; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 |
18669
67fdd6f962f5
director: Reverted previous e178413a905d commit after all - do it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
18666
diff
changeset
|
60 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
|
61 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
|
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 (errno == EAGAIN) |
67fdd6f962f5
director: Reverted previous e178413a905d commit after all - do it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
18666
diff
changeset
|
64 return; |
67fdd6f962f5
director: Reverted previous e178413a905d commit after all - do it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
18666
diff
changeset
|
65 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
|
66 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
|
67 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 login_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 } |
18670
d54dc360cd3c
director: Minor code cleanup - allow access to auth connection's ostream directly.
Timo Sirainen <tss@iki.fi>
parents:
18669
diff
changeset
|
71 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
|
72 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
|
73 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
75 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
|
76 { |
20693
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
77 bool bail = FALSE; |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
78 const char *line; |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
79 |
20693
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
80 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
|
81 if (!conn->handshaked) { |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
82 if (!version_string_verify(line, "director-authreply-client", |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
83 AUTHREPLY_PROTOCOL_MAJOR_VERSION)) { |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
84 i_error("authreply client sent invalid handshake: %s", line); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
85 login_connection_deinit(&conn); |
20693
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
86 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
|
87 } else { |
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
88 conn->handshaked = TRUE; |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
89 } |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
90 } else { |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
91 auth_input_line(line, conn); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
92 } |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
93 } T_END; |
20693
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
94 |
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
95 if (bail) |
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
96 return; |
fa67f1a329da
Fix control flow and T_BEGIN/T_END hygiene
Phil Carmody <phil@dovecot.fi>
parents:
19552
diff
changeset
|
97 |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
98 if (conn->input->eof) { |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
99 if (conn->input->stream_errno != 0 && |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
100 conn->input->stream_errno != ECONNRESET) { |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
101 i_error("read(authreply connection) failed: %s", |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
102 i_stream_get_error(conn->input)); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
103 } |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
104 login_connection_deinit(&conn); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
105 } |
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 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 static void |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 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
|
110 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 struct const_iovec iov[2]; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 if (conn->destroyed) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 iov[0].iov_base = line; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 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
|
118 iov[1].iov_base = "\n"; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 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
|
120 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
|
121 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
123 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
|
124 const struct ip_addr *dest_ip) |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
125 { |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
126 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
|
127 return FALSE; |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
128 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
|
129 request->dest_port != request->local_port) |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
130 return FALSE; |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
131 return TRUE; |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
132 } |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
133 |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
134 static void |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
135 login_host_callback(const struct ip_addr *ip, const char *hostname, |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
136 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
|
137 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 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
|
139 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
|
140 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
|
141 unsigned int secs; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
143 if (ip == NULL) { |
16785
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
144 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
|
145 line_params = request->line + 3; |
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
146 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
|
147 line_params = request->line + 5; |
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
148 else |
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
149 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
|
150 |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
151 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
|
152 request->username, errormsg); |
16785
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
153 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
|
154 "\ttemp", NULL); |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
155 } else if (request->director_proxy_maybe && |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
156 login_host_request_is_self(request, ip)) { |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
157 line = request->line; |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
158 } else { |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
159 string_t *str = t_str_new(64); |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
160 |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
161 secs = dir->set->director_user_expire / 2; |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
162 str_printfa(str, "%s\tproxy_refresh=%u\t", request->line, secs); |
19438
f643e85f42ec
director: Don't treat empty hostname the same as having it.
Timo Sirainen <tss@iki.fi>
parents:
19310
diff
changeset
|
163 if (hostname == NULL || hostname[0] == '\0') |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
164 str_printfa(str, "host=%s", net_ip2addr(ip)); |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
165 else { |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
166 str_printfa(str, "host=%s\thostip=%s", |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
167 hostname, net_ip2addr(ip)); |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
168 } |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
169 line = str_c(str); |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
170 } |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
171 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
|
172 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 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
|
174 i_free(request->username); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 i_free(request->line); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 i_free(request); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 } |
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 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
|
180 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 struct login_connection *conn = context; |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
182 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
|
183 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
|
184 bool proxy = FALSE, host = FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 if (line == NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 /* 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
|
188 login_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 } |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
191 if (conn->type != LOGIN_CONNECTION_TYPE_USERDB && |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
192 strncmp(line, "OK\t", 3) == 0) |
11714
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
193 line_params = line + 3; |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
194 else if (conn->type == LOGIN_CONNECTION_TYPE_USERDB && |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
195 strncmp(line, "PASS\t", 5) == 0) |
11714
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
196 line_params = line + 5; |
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
197 else { |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 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
|
199 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 /* 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
|
203 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
|
204 if (*args != NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 /* 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
|
206 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
|
207 args++; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 |
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
|
210 i_zero(&temp_request); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 for (; *args != NULL; args++) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 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
|
213 ((*args)[5] == '=' || (*args)[5] == '\0')) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 proxy = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 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
|
216 host = TRUE; |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
217 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
|
218 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
|
219 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
|
220 } 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
|
221 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
|
222 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
|
223 } 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
|
224 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
|
225 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
|
226 } 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
|
227 username = *args + 9; |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17467
diff
changeset
|
228 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
|
229 tag = *args + 13; |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
230 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
|
231 ((*args)[20] == '=' || (*args)[20] == '\0')) |
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
232 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
|
233 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
|
234 if (username == NULL) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 username = *args + 5; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 } |
18498
c5cdf42e398a
director: Implemented director_proxy_maybe passdb extra field.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
238 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
|
239 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
|
240 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
|
241 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
|
242 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 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
|
244 /* 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
|
245 login username */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 username = t_strcut(username, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 *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
|
248 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 /* 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
|
251 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
|
252 *request = temp_request; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 request->conn = conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 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
|
255 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
|
256 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 conn->refcount++; |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17467
diff
changeset
|
258 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
|
259 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 struct login_connection * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 login_connection_init(struct director *dir, int fd, |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
263 struct auth_connection *auth, |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
264 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
|
265 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 struct login_connection *conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 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
|
269 conn->refcount = 1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 conn->fd = fd; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 conn->dir = dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 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
|
273 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
|
274 if (type != LOGIN_CONNECTION_TYPE_AUTHREPLY) { |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
275 i_assert(auth != NULL); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
276 conn->auth = auth; |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
277 conn->io = io_add(conn->fd, IO_READ, |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
278 login_connection_input, conn); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
279 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
|
280 } else { |
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->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
|
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_authreply_input, conn); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
285 o_stream_nsend_str(conn->output, t_strdup_printf( |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
286 "VERSION\tdirector-authreply-server\t%d\t%d\n", |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
287 AUTHREPLY_PROTOCOL_MAJOR_VERSION, |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
288 AUTHREPLY_PROTOCOL_MINOR_VERSION)); |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
289 } |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
290 conn->type = type; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 DLLIST_PREPEND(&login_connections, conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 return conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 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
|
297 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 struct login_connection *conn = *_conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 *_conn = NULL; |
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 if (conn->destroyed) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 conn->destroyed = TRUE; |
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 DLLIST_REMOVE(&login_connections, conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 io_remove(&conn->io); |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
308 if (conn->input != NULL) |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
309 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
|
310 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
|
311 if (close(conn->fd) < 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 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
|
313 conn->fd = -1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 |
18675
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
315 if (conn->auth != NULL) |
52cdf321fa07
director: Added "authreply" socket type.
Timo Sirainen <tss@iki.fi>
parents:
18670
diff
changeset
|
316 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
|
317 login_connection_unref(&conn); |
11430
c82a7922fca9
director: Update connection counts also on login connection deinit.
Timo Sirainen <tss@iki.fi>
parents:
11326
diff
changeset
|
318 |
c82a7922fca9
director: Update connection counts also on login connection deinit.
Timo Sirainen <tss@iki.fi>
parents:
11326
diff
changeset
|
319 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
|
320 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 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
|
323 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 struct login_connection *conn = *_conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 *_conn = NULL; |
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 i_assert(conn->refcount > 0); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 if (--conn->refcount == 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 i_free(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 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 void login_connections_deinit(void) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 while (login_connections != NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 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
|
337 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 login_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 } |