annotate src/lib-master/master-login-auth.c @ 22713:cb108f786fb4

Updated copyright notices to include the year 2018.
author Stephan Bosch <stephan.bosch@dovecot.fi>
date Mon, 01 Jan 2018 22:42:08 +0100
parents 25af9d4dad59
children 09248aab2b42
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 22311
diff changeset
1 /* Copyright (c) 2009-2018 Dovecot authors, see the included COPYING file */
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
15187
02451e967a06 Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents: 15049
diff changeset
4 #include "net.h"
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "ioloop.h"
15049
aa6027a0a78e Added support to perform token-based service process authentication.
Stephan Bosch <stephan@rename-it.nl>
parents: 14923
diff changeset
6 #include "hostpid.h"
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "istream.h"
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "ostream.h"
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
9 #include "llist.h"
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "hex-binary.h"
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "hash.h"
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "str.h"
22311
25af9d4dad59 global: Replaced t_strsplit_tab() calls with t_strsplit_tabescaped()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
13 #include "strescape.h"
11256
e08dd68309a9 auth/login related timeouts are now in one place and they make more sense.
Timo Sirainen <tss@iki.fi>
parents: 11248
diff changeset
14 #include "master-interface.h"
12367
9f179255b796 lib-master: Stop accepting new connections after auth-master gets disconnected.
Timo Sirainen <tss@iki.fi>
parents: 12329
diff changeset
15 #include "master-service.h"
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "master-auth.h"
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #include "master-login-auth.h"
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #define AUTH_MAX_INBUF_SIZE 8192
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 struct master_login_auth_request {
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
23 struct master_login_auth_request *prev, *next;
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
24
11248
1fd45deee948 lib-master: Don't crash after timeouting an auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 11097
diff changeset
25 unsigned int id;
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
26 time_t create_stamp;
11248
1fd45deee948 lib-master: Don't crash after timeouting an auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 11097
diff changeset
27
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
28 pid_t auth_pid;
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
29 unsigned int auth_id;
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
30 unsigned int client_pid;
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
31 uint8_t cookie[MASTER_AUTH_COOKIE_SIZE];
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
32
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 master_login_auth_request_callback_t *callback;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 void *context;
12405
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
35
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
36 unsigned int aborted:1;
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 };
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 struct master_login_auth {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 pool_t pool;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 const char *auth_socket_path;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 int refcount;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 int fd;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 struct io *io;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 struct istream *input;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 struct ostream *output;
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
48 struct timeout *to;
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 unsigned int id_counter;
14923
96fd2c3bf932 Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents: 14918
diff changeset
51 HASH_TABLE(void *, struct master_login_auth_request *) requests;
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
52 /* linked list of requests, ordered by create_stamp */
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
53 struct master_login_auth_request *request_head, *request_tail;
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
55 pid_t auth_server_pid;
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
56
15049
aa6027a0a78e Added support to perform token-based service process authentication.
Stephan Bosch <stephan@rename-it.nl>
parents: 14923
diff changeset
57 unsigned int request_auth_token:1;
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 unsigned int version_received:1;
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
59 unsigned int spid_received:1;
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 };
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
62 static void master_login_auth_set_timeout(struct master_login_auth *auth);
12405
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
63 static void master_login_auth_check_spids(struct master_login_auth *auth);
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
64
15049
aa6027a0a78e Added support to perform token-based service process authentication.
Stephan Bosch <stephan@rename-it.nl>
parents: 14923
diff changeset
65 struct master_login_auth *
aa6027a0a78e Added support to perform token-based service process authentication.
Stephan Bosch <stephan@rename-it.nl>
parents: 14923
diff changeset
66 master_login_auth_init(const char *auth_socket_path, bool request_auth_token)
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 struct master_login_auth *auth;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 pool_t pool;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 pool = pool_alloconly_create("master login auth", 1024);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 auth = p_new(pool, struct master_login_auth, 1);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 auth->pool = pool;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 auth->auth_socket_path = p_strdup(pool, auth_socket_path);
15049
aa6027a0a78e Added support to perform token-based service process authentication.
Stephan Bosch <stephan@rename-it.nl>
parents: 14923
diff changeset
75 auth->request_auth_token = request_auth_token;
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 auth->refcount = 1;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 auth->fd = -1;
14918
8eae4e205c82 Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents: 14917
diff changeset
78 hash_table_create_direct(&auth->requests, pool, 0);
12490
16dbbb57a4b2 lib-master: Try to use auth request ID numbers from wider range to ease debugging.
Timo Sirainen <tss@iki.fi>
parents: 12488
diff changeset
79 auth->id_counter = (rand() % 32767) * 131072U;
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 return auth;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82
12504
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
83 static void
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
84 request_internal_failure(struct master_login_auth_request *request,
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
85 const char *reason)
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
86 {
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
87 i_error("%s (client-pid=%u client-id=%u)",
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
88 reason, request->client_pid, request->auth_id);
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
89 request->callback(NULL, MASTER_AUTH_ERRMSG_INTERNAL_FAILURE,
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
90 request->context);
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
91 }
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
92
10473
a0d99b374aa4 imap, pop3: Close auth/config connections when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
93 void master_login_auth_disconnect(struct master_login_auth *auth)
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 {
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
95 struct master_login_auth_request *request;
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
97 while (auth->request_head != NULL) {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
98 request = auth->request_head;
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
99 DLLIST2_REMOVE(&auth->request_head,
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
100 &auth->request_tail, request);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
101
12504
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
102 request_internal_failure(request,
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
103 "Disconnected from auth server, aborting");
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 i_free(request);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 hash_table_clear(auth->requests, FALSE);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
108 if (auth->to != NULL)
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
109 timeout_remove(&auth->to);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 if (auth->io != NULL)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 io_remove(&auth->io);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 if (auth->fd != -1) {
20661
aa1ac716269e lib-master: Check for NULL in input/output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
113 if (auth->input != NULL)
aa1ac716269e lib-master: Check for NULL in input/output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
114 i_stream_destroy(&auth->input);
aa1ac716269e lib-master: Check for NULL in input/output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
115 if (auth->output != NULL)
aa1ac716269e lib-master: Check for NULL in input/output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
116 o_stream_destroy(&auth->output);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 net_disconnect(auth->fd);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 auth->fd = -1;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 auth->version_received = FALSE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 static void master_login_auth_unref(struct master_login_auth **_auth)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 struct master_login_auth *auth = *_auth;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 *_auth = NULL;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 i_assert(auth->refcount > 0);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 if (--auth->refcount > 0)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 hash_table_destroy(&auth->requests);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 pool_unref(&auth->pool);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 void master_login_auth_deinit(struct master_login_auth **_auth)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 struct master_login_auth *auth = *_auth;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 *_auth = NULL;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 master_login_auth_disconnect(auth);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 master_login_auth_unref(&auth);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
148 static unsigned int auth_get_next_timeout_secs(struct master_login_auth *auth)
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
149 {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
150 time_t expires;
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
151
11256
e08dd68309a9 auth/login related timeouts are now in one place and they make more sense.
Timo Sirainen <tss@iki.fi>
parents: 11248
diff changeset
152 expires = auth->request_head->create_stamp +
e08dd68309a9 auth/login related timeouts are now in one place and they make more sense.
Timo Sirainen <tss@iki.fi>
parents: 11248
diff changeset
153 MASTER_AUTH_LOOKUP_TIMEOUT_SECS;
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
154 return expires <= ioloop_time ? 0 : expires - ioloop_time;
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
155 }
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
156
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
157 static void master_login_auth_timeout(struct master_login_auth *auth)
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
158 {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
159 struct master_login_auth_request *request;
12504
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
160 const char *reason;
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
161
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
162 while (auth->request_head != NULL &&
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
163 auth_get_next_timeout_secs(auth) == 0) {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
164 request = auth->request_head;
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
165 DLLIST2_REMOVE(&auth->request_head,
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
166 &auth->request_tail, request);
14923
96fd2c3bf932 Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents: 14918
diff changeset
167 hash_table_remove(auth->requests, POINTER_CAST(request->id));
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
168
12504
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
169 reason = t_strdup_printf(
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
170 "Auth server request timed out after %u secs",
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
171 (unsigned int)(ioloop_time - request->create_stamp));
12504
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
172 request_internal_failure(request, reason);
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
173 i_free(request);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
174 }
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
175 timeout_remove(&auth->to);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
176 master_login_auth_set_timeout(auth);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
177 }
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
178
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
179 static void master_login_auth_set_timeout(struct master_login_auth *auth)
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
180 {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
181 i_assert(auth->to == NULL);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
182
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
183 if (auth->request_head != NULL) {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
184 auth->to = timeout_add(auth_get_next_timeout_secs(auth) * 1000,
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
185 master_login_auth_timeout, auth);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
186 }
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
187 }
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
188
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
189 static void
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
190 master_login_auth_request_remove(struct master_login_auth *auth,
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
191 struct master_login_auth_request *request)
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
192 {
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
193 bool update_timeout;
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
194
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
195 update_timeout = request->prev == NULL;
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
196
14923
96fd2c3bf932 Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents: 14918
diff changeset
197 hash_table_remove(auth->requests, POINTER_CAST(request->id));
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
198 DLLIST2_REMOVE(&auth->request_head, &auth->request_tail, request);
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
199
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
200 if (update_timeout) {
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
201 timeout_remove(&auth->to);
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
202 master_login_auth_set_timeout(auth);
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
203 }
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
204 }
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
205
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 static struct master_login_auth_request *
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 master_login_auth_lookup_request(struct master_login_auth *auth,
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 unsigned int id)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 struct master_login_auth_request *request;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211
14923
96fd2c3bf932 Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents: 14918
diff changeset
212 request = hash_table_lookup(auth->requests, POINTER_CAST(id));
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 if (request == NULL) {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 i_error("Auth server sent reply with unknown ID %u", id);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 return NULL;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 }
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
217 master_login_auth_request_remove(auth, request);
12405
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
218 if (request->aborted) {
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
219 request->callback(NULL, MASTER_AUTH_ERRMSG_INTERNAL_FAILURE,
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
220 request->context);
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
221 i_free(request);
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
222 return NULL;
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
223 }
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 return request;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 static bool
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 master_login_auth_input_user(struct master_login_auth *auth, const char *args)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 struct master_login_auth_request *request;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 const char *const *list;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 unsigned int id;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 /* <id> <userid> [..] */
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235
22311
25af9d4dad59 global: Replaced t_strsplit_tab() calls with t_strsplit_tabescaped()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
236 list = t_strsplit_tabescaped(args);
11086
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
237 if (list[0] == NULL || list[1] == NULL ||
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
238 str_to_uint(list[0], &id) < 0) {
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 i_error("Auth server sent corrupted USER line");
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 return FALSE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 request = master_login_auth_lookup_request(auth, id);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 if (request != NULL) {
11018
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
245 request->callback(list + 1, NULL, request->context);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 i_free(request);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 return TRUE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 static bool
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 master_login_auth_input_notfound(struct master_login_auth *auth,
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 const char *args)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 struct master_login_auth_request *request;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 unsigned int id;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257
11086
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
258 if (str_to_uint(args, &id) < 0) {
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
259 i_error("Auth server sent corrupted NOTFOUND line");
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
260 return FALSE;
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
261 }
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
262
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 request = master_login_auth_lookup_request(auth, id);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 if (request != NULL) {
12504
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
265 const char *reason = t_strdup_printf(
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
266 "Authenticated user not found from userdb, "
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
267 "auth lookup id=%u", id);
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
268 request_internal_failure(request, reason);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 i_free(request);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 return TRUE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 static bool
11018
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
275 master_login_auth_input_fail(struct master_login_auth *auth,
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
276 const char *args_line)
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 struct master_login_auth_request *request;
11018
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
279 const char *const *args, *error = NULL;
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
280 unsigned int i, id;
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281
22311
25af9d4dad59 global: Replaced t_strsplit_tab() calls with t_strsplit_tabescaped()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
282 args = t_strsplit_tabescaped(args_line);
11086
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
283 if (args[0] == NULL || str_to_uint(args[0], &id) < 0) {
11018
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
284 i_error("Auth server sent broken FAIL line");
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
285 return FALSE;
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
286 }
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
287 for (i = 1; args[i] != NULL; i++) {
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
288 if (strncmp(args[i], "reason=", 7) == 0)
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
289 error = args[i] + 7;
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
290 }
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 request = master_login_auth_lookup_request(auth, id);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 if (request != NULL) {
12504
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
294 if (error == NULL) {
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
295 request_internal_failure(request,
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
296 "Internal auth failure");
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
297 } else {
12552
6a0f3010d592 lib-master: Error message typofix.
Timo Sirainen <tss@iki.fi>
parents: 12504
diff changeset
298 i_error("Internal auth failure: %s "
12504
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
299 "(client-pid=%u client-id=%u)",
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
300 error, request->client_pid, request->auth_id);
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
301 request->callback(NULL, error, request->context);
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
302 }
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 i_free(request);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 return TRUE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 static void master_login_auth_input(struct master_login_auth *auth)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 const char *line;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 bool ret;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 switch (i_stream_read(auth->input)) {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 case 0:
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 case -1:
12367
9f179255b796 lib-master: Stop accepting new connections after auth-master gets disconnected.
Timo Sirainen <tss@iki.fi>
parents: 12329
diff changeset
317 /* disconnected. stop accepting new connections, because in
9f179255b796 lib-master: Stop accepting new connections after auth-master gets disconnected.
Timo Sirainen <tss@iki.fi>
parents: 12329
diff changeset
318 default configuration we no longer have permissions to
9f179255b796 lib-master: Stop accepting new connections after auth-master gets disconnected.
Timo Sirainen <tss@iki.fi>
parents: 12329
diff changeset
319 connect back to auth-master */
9f179255b796 lib-master: Stop accepting new connections after auth-master gets disconnected.
Timo Sirainen <tss@iki.fi>
parents: 12329
diff changeset
320 master_service_stop_new_connections(master_service);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 master_login_auth_disconnect(auth);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 case -2:
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 /* buffer full */
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 i_error("Auth server sent us too long line");
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 master_login_auth_disconnect(auth);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 if (!auth->version_received) {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 line = i_stream_next_line(auth->input);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 if (line == NULL)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 /* make sure the major version matches */
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 if (strncmp(line, "VERSION\t", 8) != 0 ||
11086
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
337 !str_uint_equals(t_strcut(line + 8, '\t'),
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
338 AUTH_MASTER_PROTOCOL_MAJOR_VERSION)) {
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 i_error("Authentication server not compatible with "
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 "master process (mixed old and new binaries?)");
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 master_login_auth_disconnect(auth);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 auth->version_received = TRUE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 }
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
346 if (!auth->spid_received) {
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
347 line = i_stream_next_line(auth->input);
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
348 if (line == NULL)
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
349 return;
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
350
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
351 if (strncmp(line, "SPID\t", 5) != 0 ||
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
352 str_to_pid(line + 5, &auth->auth_server_pid) < 0) {
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
353 i_error("Authentication server didn't "
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
354 "send valid SPID as expected: %s", line);
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
355 master_login_auth_disconnect(auth);
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
356 return;
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
357 }
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
358 auth->spid_received = TRUE;
12405
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
359 master_login_auth_check_spids(auth);
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
360 }
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 auth->refcount++;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 while ((line = i_stream_next_line(auth->input)) != NULL) {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364 if (strncmp(line, "USER\t", 5) == 0)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 ret = master_login_auth_input_user(auth, line + 5);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 else if (strncmp(line, "NOTFOUND\t", 9) == 0)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 ret = master_login_auth_input_notfound(auth, line + 9);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 else if (strncmp(line, "FAIL\t", 5) == 0)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 ret = master_login_auth_input_fail(auth, line + 5);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 else
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 ret = TRUE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 if (!ret || auth->input == NULL) {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 master_login_auth_disconnect(auth);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 break;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 master_login_auth_unref(&auth);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 static int
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 master_login_auth_connect(struct master_login_auth *auth)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 int fd;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 i_assert(auth->fd == -1);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387
10159
e027503ddb6b Use net_connect_unix_with_retries() instead of duplicating the code everywhere.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
388 fd = net_connect_unix_with_retries(auth->auth_socket_path, 1000);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 if (fd == -1) {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 i_error("net_connect_unix(%s) failed: %m",
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 auth->auth_socket_path);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 return -1;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 auth->fd = fd;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 auth->input = i_stream_create_fd(fd, AUTH_MAX_INBUF_SIZE, FALSE);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 auth->output = o_stream_create_fd(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
397 o_stream_set_no_error_handling(auth->output, TRUE);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 auth->io = io_add(fd, IO_READ, master_login_auth_input, auth);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 return 0;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401
12405
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
402 static bool
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
403 auth_request_check_spid(struct master_login_auth *auth,
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
404 struct master_login_auth_request *req)
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
405 {
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
406 if (auth->auth_server_pid != req->auth_pid && auth->spid_received) {
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
407 /* auth server was restarted. don't even attempt a login. */
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
408 i_warning("Auth server restarted (pid %u -> %u), aborting auth",
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
409 (unsigned int)req->auth_pid,
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
410 (unsigned int)auth->auth_server_pid);
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
411 return FALSE;
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
412 }
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
413 return TRUE;
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
414 }
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
415
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
416 static void master_login_auth_check_spids(struct master_login_auth *auth)
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
417 {
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
418 struct master_login_auth_request *req, *next;
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
419
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
420 for (req = auth->request_head; req != NULL; req = next) {
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
421 next = req->next;
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
422 if (!auth_request_check_spid(auth, req))
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
423 req->aborted = TRUE;
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
424 }
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
425 }
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
426
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
427 static void
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
428 master_login_auth_send_request(struct master_login_auth *auth,
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
429 struct master_login_auth_request *req)
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
430 {
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
431 string_t *str;
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
432
12405
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
433 if (!auth_request_check_spid(auth, req)) {
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
434 master_login_auth_request_remove(auth, req);
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
435 req->callback(NULL, MASTER_AUTH_ERRMSG_INTERNAL_FAILURE,
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
436 req->context);
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
437 i_free(req);
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
438 return;
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
439 }
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
440
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
441 str = t_str_new(128);
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
442 str_printfa(str, "REQUEST\t%u\t%u\t%u\t", req->id,
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
443 req->client_pid, req->auth_id);
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
444 binary_to_hex_append(str, req->cookie, sizeof(req->cookie));
16909
9ef23179892a auth: Added %{session_pid} variable for userdb lookups in login requests.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
445 str_printfa(str, "\tsession_pid=%s", my_pid);
15049
aa6027a0a78e Added support to perform token-based service process authentication.
Stephan Bosch <stephan@rename-it.nl>
parents: 14923
diff changeset
446 if (auth->request_auth_token)
16909
9ef23179892a auth: Added %{session_pid} variable for userdb lookups in login requests.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
447 str_append(str, "\trequest_auth_token");
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
448 str_append_c(str, '\n');
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
449 o_stream_nsend(auth->output, str_data(str), str_len(str));
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
450 }
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
451
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452 void master_login_auth_request(struct master_login_auth *auth,
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453 const struct master_auth_request *req,
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 master_login_auth_request_callback_t *callback,
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455 void *context)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 struct master_login_auth_request *login_req;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 unsigned int id;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460 if (auth->fd == -1) {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
461 if (master_login_auth_connect(auth) < 0) {
12367
9f179255b796 lib-master: Stop accepting new connections after auth-master gets disconnected.
Timo Sirainen <tss@iki.fi>
parents: 12329
diff changeset
462 /* we couldn't connect to auth now,
9f179255b796 lib-master: Stop accepting new connections after auth-master gets disconnected.
Timo Sirainen <tss@iki.fi>
parents: 12329
diff changeset
463 so we probably can't in future either. */
9f179255b796 lib-master: Stop accepting new connections after auth-master gets disconnected.
Timo Sirainen <tss@iki.fi>
parents: 12329
diff changeset
464 master_service_stop_new_connections(master_service);
11018
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
465 callback(NULL, MASTER_AUTH_ERRMSG_INTERNAL_FAILURE,
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
466 context);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468 }
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
469 o_stream_nsend_str(auth->output,
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
470 t_strdup_printf("VERSION\t%u\t%u\n",
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
471 AUTH_MASTER_PROTOCOL_MAJOR_VERSION,
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
472 AUTH_MASTER_PROTOCOL_MINOR_VERSION));
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
474
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
475 id = ++auth->id_counter;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
476 if (id == 0)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477 id++;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479 login_req = i_new(struct master_login_auth_request, 1);
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
480 login_req->create_stamp = ioloop_time;
11248
1fd45deee948 lib-master: Don't crash after timeouting an auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 11097
diff changeset
481 login_req->id = id;
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
482 login_req->auth_pid = req->auth_pid;
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
483 login_req->client_pid = req->client_pid;
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
484 login_req->auth_id = req->auth_id;
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
485 memcpy(login_req->cookie, req->cookie, sizeof(login_req->cookie));
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
486 login_req->callback = callback;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
487 login_req->context = context;
17489
f6e2fa1afa45 Added several asserts to make sure duplicates aren't inserted into hash table.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
488 i_assert(hash_table_lookup(auth->requests, POINTER_CAST(id)) == NULL);
14923
96fd2c3bf932 Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents: 14918
diff changeset
489 hash_table_insert(auth->requests, POINTER_CAST(id), login_req);
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
490 DLLIST2_APPEND(&auth->request_head, &auth->request_tail, login_req);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
491
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
492 if (auth->to == NULL)
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
493 master_login_auth_set_timeout(auth);
12137
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
494
12405
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
495 master_login_auth_send_request(auth, login_req);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
496 }
10199
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10159
diff changeset
497
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10159
diff changeset
498 unsigned int master_login_auth_request_count(struct master_login_auth *auth)
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10159
diff changeset
499 {
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10159
diff changeset
500 return hash_table_count(auth->requests);
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10159
diff changeset
501 }