annotate src/lib-master/master-login-auth.c @ 17489:f6e2fa1afa45

Added several asserts to make sure duplicates aren't inserted into hash table. The previous commit hopefully fixed the problem causing auth and login processes to sometimes die with "key not found from hash" error, but if not maybe one of these will catch it.
author Timo Sirainen <tss@iki.fi>
date Fri, 13 Jun 2014 15:14:44 +0300
parents add8c00fb3cc
children 3009a1a6f6d5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17130
add8c00fb3cc Updated copyright notices to include year 2014.
Timo Sirainen <tss@iki.fi>
parents: 16909
diff changeset
1 /* Copyright (c) 2009-2014 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"
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
13 #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
14 #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
15 #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
16 #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
17
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #include <stdlib.h>
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) {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 i_stream_destroy(&auth->input);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 o_stream_destroy(&auth->output);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 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
117 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
118 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 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
120 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 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
123 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 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
125
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 *_auth = NULL;
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 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
129 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
130 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 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
133 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
134 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 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
137 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 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
139
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 *_auth = NULL;
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 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
143 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
144 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
146 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
147 {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
148 time_t expires;
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
149
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
150 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
151 MASTER_AUTH_LOOKUP_TIMEOUT_SECS;
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
152 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
153 }
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
154
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
155 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
156 {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
157 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
158 const char *reason;
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
159
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
160 while (auth->request_head != NULL &&
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
161 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
162 request = auth->request_head;
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
163 DLLIST2_REMOVE(&auth->request_head,
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
164 &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
165 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
166
12504
c6b0e643d2dc Log login pid/id for internal failures to allow matching errors between processes.
Timo Sirainen <tss@iki.fi>
parents: 12490
diff changeset
167 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
168 "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
169 (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
170 request_internal_failure(request, reason);
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
171 i_free(request);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
172 }
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
173 timeout_remove(&auth->to);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
174 master_login_auth_set_timeout(auth);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
175 }
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
176
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
177 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
178 {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
179 i_assert(auth->to == NULL);
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 if (auth->request_head != NULL) {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
182 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
183 master_login_auth_timeout, auth);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
184 }
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
185 }
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
186
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
187 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
188 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
189 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
190 {
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 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
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 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
194
14923
96fd2c3bf932 Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents: 14918
diff changeset
195 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
196 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
197
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 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
199 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
200 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
201 }
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 }
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
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 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
205 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
206 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
207 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 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
209
14923
96fd2c3bf932 Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents: 14918
diff changeset
210 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
211 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
212 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
213 return NULL;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 }
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
215 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
216 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
217 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
218 request->context);
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
219 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
220 return NULL;
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
221 }
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 return request;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 static bool
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 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
227 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 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
229 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
230 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
231
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 /* <id> <userid> [..] */
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233
14471
fc8031c5e691 Use t_strsplit_tab() wherever possible
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
234 list = t_strsplit_tab(args);
11086
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
235 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
236 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
237 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
238 return FALSE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 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
242 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
243 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
244 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
245 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 return TRUE;
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
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 static bool
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 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
251 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
252 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 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
254 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
255
11086
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
256 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
257 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
258 return FALSE;
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
259 }
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
260
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 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
262 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
263 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
264 "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
265 "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
266 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
267 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
268 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 return TRUE;
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
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 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
273 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
274 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
275 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 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
277 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
278 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
279
14471
fc8031c5e691 Use t_strsplit_tab() wherever possible
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
280 args = t_strsplit_tab(args_line);
11086
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
281 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
282 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
283 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
284 }
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
285 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
286 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
287 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
288 }
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 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
291 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
292 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
293 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
294 "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
295 } else {
12552
6a0f3010d592 lib-master: Error message typofix.
Timo Sirainen <tss@iki.fi>
parents: 12504
diff changeset
296 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
297 "(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
298 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
299 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
300 }
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 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
302 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 return TRUE;
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
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 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
307 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 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
309 bool ret;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 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
312 case 0:
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 case -1:
12367
9f179255b796 lib-master: Stop accepting new connections after auth-master gets disconnected.
Timo Sirainen <tss@iki.fi>
parents: 12329
diff changeset
315 /* 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
316 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
317 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
318 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
319 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
320 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 case -2:
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 /* buffer full */
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 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
324 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
325 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 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
329 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
330 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
331 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 /* 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
334 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
335 !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
336 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
337 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
338 "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
339 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
340 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 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
343 }
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
344 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
345 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
346 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
347 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
348
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 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
350 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
351 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
352 "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
353 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
354 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
355 }
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 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
357 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
358 }
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 auth->refcount++;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 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
362 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
363 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
364 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
365 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
366 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
367 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
368 else
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 ret = TRUE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 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
372 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
373 break;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 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
377 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 static int
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 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
381 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 int fd;
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 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
385
10159
e027503ddb6b Use net_connect_unix_with_retries() instead of duplicating the code everywhere.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
386 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
387 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
388 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
389 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
390 return -1;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 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
393 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
394 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
395 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
396 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
397 return 0;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399
12405
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
400 static bool
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
401 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
402 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
403 {
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
404 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
405 /* 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
406 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
407 (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
408 (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
409 return FALSE;
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
410 }
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
411 return TRUE;
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
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
414 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
415 {
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
416 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
417
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
418 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
419 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
420 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
421 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
422 }
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
423 }
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
424
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
425 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
426 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
427 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
428 {
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 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
430
12405
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
431 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
432 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
433 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
434 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
435 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
436 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
437 }
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
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 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
440 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
441 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
442 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
443 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
444 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
445 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
446 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
447 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
448 }
16330c0c8ef4 lib-master: When finishing auth, don't send REQUEST if auth process has restarted.
Timo Sirainen <tss@iki.fi>
parents: 11256
diff changeset
449
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 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
451 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
452 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
453 void *context)
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455 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
456 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
457
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 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
459 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
460 /* 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
461 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
462 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
463 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
464 context);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466 }
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
467 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
468 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
469 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
470 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
471 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
472
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473 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
474 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
475 id++;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
476
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477 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
478 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
479 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
480 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
481 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
482 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
483 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
484 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
485 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
486 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
487 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
488 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
489
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
490 if (auth->to == NULL)
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
491 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
492
12405
e72ab743b8df lib-master: Don't wait for handshake before sending auth-master request.
Timo Sirainen <tss@iki.fi>
parents: 12367
diff changeset
493 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
494 }
10199
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10159
diff changeset
495
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10159
diff changeset
496 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
497 {
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10159
diff changeset
498 return hash_table_count(auth->requests);
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10159
diff changeset
499 }