annotate src/director/login-connection.c @ 22645:57e7fafb10c5

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