Mercurial > dovecot > core-2.2
annotate src/director/login-connection.c @ 17467:899cf87a687c
director: Fixed crash if master_user_separator is set, but we didn't do a proxy lookup.
Found by Coverity
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 13 Jun 2014 00:57:06 +0300 |
parents | add8c00fb3cc |
children | a7e830b9b967 |
rev | line source |
---|---|
17130
add8c00fb3cc
Updated copyright notices to include year 2014.
Timo Sirainen <tss@iki.fi>
parents:
16785
diff
changeset
|
1 /* Copyright (c) 2010-2014 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" |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "ostream.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "llist.h" |
11430
c82a7922fca9
director: Update connection counts also on login connection deinit.
Timo Sirainen <tss@iki.fi>
parents:
11326
diff
changeset
|
8 #include "master-service.h" |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "director.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "director-request.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include "auth-connection.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include "login-connection.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include <unistd.h> |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 struct login_connection { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 struct login_connection *prev, *next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 int refcount; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 int fd; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 struct io *io; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 struct ostream *output; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 struct auth_connection *auth; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 struct director *dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 unsigned int destroyed:1; |
11714
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
28 unsigned int userdb:1; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 struct login_host_request { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 struct login_connection *conn; |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
33 char *line, *username; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 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
|
37 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 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
|
39 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 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
|
41 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 unsigned char buf[4096]; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 ssize_t ret; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 ret = read(conn->fd, buf, sizeof(buf)); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 if (ret <= 0) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 if (ret < 0) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 if (errno == EAGAIN) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 return; |
16614
ebbe00999da8
director: Don't log an error if login connection gets closed with ECONNRESET.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
50 if (errno != ECONNRESET) |
ebbe00999da8
director: Don't log an error if login connection gets closed with ECONNRESET.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
51 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
|
52 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 login_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 auth_connection_send(conn->auth, buf, ret); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 static void |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 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
|
61 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 struct const_iovec iov[2]; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 if (conn->destroyed) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 iov[0].iov_base = line; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 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
|
69 iov[1].iov_base = "\n"; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 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
|
71 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
|
72 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
74 static void |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
75 login_host_callback(const struct ip_addr *ip, const char *errormsg, |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
76 void *context) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 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
|
79 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
|
80 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
|
81 unsigned int secs; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
83 if (ip != NULL) { |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
84 secs = dir->set->director_user_expire / 2; |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
85 line = t_strdup_printf("%s\thost=%s\tproxy_refresh=%u", |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
86 request->line, net_ip2addr(ip), secs); |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
87 } else { |
16785
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
88 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
|
89 line_params = request->line + 3; |
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
90 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
|
91 line_params = request->line + 5; |
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
92 else |
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
93 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
|
94 |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
95 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
|
96 request->username, errormsg); |
16785
b135d723acf3
director: Don't assert-crash if PASS lookup fails.
Timo Sirainen <tss@iki.fi>
parents:
16614
diff
changeset
|
97 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
|
98 "\ttemp", NULL); |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
99 } |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
100 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
|
101 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 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
|
103 i_free(request->username); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 i_free(request->line); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 i_free(request); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 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
|
109 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 struct login_connection *conn = context; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 struct login_host_request *request; |
11714
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
112 const char *const *args, *line_params, *username = NULL; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 bool proxy = FALSE, host = FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 if (line == NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 /* 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
|
117 login_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 } |
11714
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
120 if (!conn->userdb && strncmp(line, "OK\t", 3) == 0) |
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
121 line_params = line + 3; |
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
122 else if (conn->userdb && strncmp(line, "PASS\t", 5) == 0) |
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
123 line_params = line + 5; |
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
124 else { |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 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
|
126 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 /* OK <id> [<parameters>] */ |
14471
fc8031c5e691
Use t_strsplit_tab() wherever possible
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
130 args = t_strsplit_tab(line_params); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 if (*args != NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 /* 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
|
133 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
|
134 args++; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 for (; *args != NULL; args++) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 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
|
139 ((*args)[5] == '=' || (*args)[5] == '\0')) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 proxy = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 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
|
142 host = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 else if (strncmp(*args, "destuser=", 9) == 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 username = *args + 9; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 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
|
146 if (username == NULL) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 username = *args + 5; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 } |
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
|
150 if (!proxy || host || username == NULL) { |
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
|
151 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
|
152 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
|
153 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 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
|
155 /* 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
|
156 login username */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 username = t_strcut(username, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 *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
|
159 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 /* 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
|
162 request = i_new(struct login_host_request, 1); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 request->conn = conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 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
|
165 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
|
166 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 conn->refcount++; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 director_request(conn->dir, username, login_host_callback, request); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 struct login_connection * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 login_connection_init(struct director *dir, int fd, |
11714
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
173 struct auth_connection *auth, bool userdb) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 struct login_connection *conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 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
|
178 conn->refcount = 1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 conn->fd = fd; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 conn->auth = auth; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 conn->dir = dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 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
|
183 o_stream_set_no_error_handling(conn->output, TRUE); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 conn->io = io_add(conn->fd, IO_READ, login_connection_input, conn); |
11714
1683324ac632
director: Added support for LMTP proxying.
Timo Sirainen <tss@iki.fi>
parents:
11430
diff
changeset
|
185 conn->userdb = userdb; |
11321
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 auth_connection_set_callback(conn->auth, auth_input_line, conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 DLLIST_PREPEND(&login_connections, conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 return conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 } |
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 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
|
193 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 struct login_connection *conn = *_conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 *_conn = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 if (conn->destroyed) |
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 conn->destroyed = TRUE; |
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 DLLIST_REMOVE(&login_connections, conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 io_remove(&conn->io); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14471
diff
changeset
|
204 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
|
205 if (close(conn->fd) < 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 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
|
207 conn->fd = -1; |
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 auth_connection_deinit(&conn->auth); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 login_connection_unref(&conn); |
11430
c82a7922fca9
director: Update connection counts also on login connection deinit.
Timo Sirainen <tss@iki.fi>
parents:
11326
diff
changeset
|
211 |
c82a7922fca9
director: Update connection counts also on login connection deinit.
Timo Sirainen <tss@iki.fi>
parents:
11326
diff
changeset
|
212 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
|
213 } |
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 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
|
216 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 struct login_connection *conn = *_conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 *_conn = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 i_assert(conn->refcount > 0); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 if (--conn->refcount == 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 i_free(conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 void login_connections_deinit(void) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 while (login_connections != NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 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
|
230 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 login_connection_deinit(&conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 } |