annotate src/lib-master/master-login-auth.c @ 11097:0979e9e1e124 HEAD

lib-master: Added timeout for auth master lookups.
author Timo Sirainen <tss@iki.fi>
date Wed, 07 Apr 2010 03:43:02 +0300
parents 260e190306b0
children 1fd45deee948
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10582
615eef3139c2 Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 10473
diff changeset
1 /* Copyright (c) 2009-2010 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"
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "network.h"
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"
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #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
7 #include "ostream.h"
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
8 #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
9 #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
10 #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
11 #include "str.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 "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
13 #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
14
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #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
16
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #define AUTH_MAX_INBUF_SIZE 8192
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
18 #define AUTH_REQUEST_TIMEOUT_SECS (2*60)
10101
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 struct master_login_auth_request {
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
21 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
22
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
23 time_t create_stamp;
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 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
25 void *context;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 };
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 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
29 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
30 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
31 int refcount;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 int fd;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 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
35 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
36 struct ostream *output;
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
37 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
38
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 unsigned int id_counter;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 struct hash_table *requests;
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
41 /* 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
42 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
43
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 unsigned int version_received:1;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 };
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
47 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
48
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 struct master_login_auth *master_login_auth_init(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
50 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 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
52 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
53
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 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
55 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
56 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
57 auth->auth_socket_path = p_strdup(pool, 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
58 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
59 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
60 auth->requests = hash_table_create(default_pool, pool, 0, NULL, NULL);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 return auth;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63
10473
a0d99b374aa4 imap, pop3: Close auth/config connections when we stop accepting more connections.
Timo Sirainen <tss@iki.fi>
parents: 10199
diff changeset
64 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
65 {
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
66 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
67
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
68 while (auth->request_head != NULL) {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
69 request = auth->request_head;
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
70 DLLIST2_REMOVE(&auth->request_head,
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
71 &auth->request_tail, request);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
72
11018
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
73 request->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
74 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
75 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
76 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 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
78
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
79 if (auth->to != NULL)
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
80 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
81 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
82 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
83 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
84 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
85 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
86
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 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
88 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
89 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 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
91 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 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
94 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 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
96
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 *_auth = NULL;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 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
100 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
101 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 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
104 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
105 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 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
108 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 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
110
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 *_auth = NULL;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 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
114 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
115 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
117 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
118 {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
119 time_t expires;
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
120
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
121 expires = auth->request_head->create_stamp + AUTH_REQUEST_TIMEOUT_SECS;
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
122 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
123 }
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
124
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
125 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
126 {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
127 struct master_login_auth_request *request;
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
128
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
129 while (auth->request_head != NULL &&
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
130 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
131 request = auth->request_head;
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
132 DLLIST2_REMOVE(&auth->request_head,
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
133 &auth->request_tail, request);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
134
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
135 i_error("Auth server request timed out after %u secs",
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
136 (unsigned int)(ioloop_time - request->create_stamp));
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
137 request->callback(NULL, MASTER_AUTH_ERRMSG_INTERNAL_FAILURE,
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
138 request->context);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
139 i_free(request);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
140 }
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
141 timeout_remove(&auth->to);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
142 master_login_auth_set_timeout(auth);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
143 }
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
144
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
145 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
146 {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
147 i_assert(auth->to == NULL);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
148
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
149 if (auth->request_head != NULL) {
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
150 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
151 master_login_auth_timeout, auth);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
152 }
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
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 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
156 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
157 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
158 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 struct master_login_auth_request *request;
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
160 bool update_timeout;
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 request = hash_table_lookup(auth->requests, POINTER_CAST(id));
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 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
164 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
165 return NULL;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 }
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
167 update_timeout = request->prev == NULL;
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 hash_table_remove(auth->requests, POINTER_CAST(id));
11097
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
170 DLLIST2_REMOVE(&auth->request_head, &auth->request_tail, request);
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
171
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
172 if (update_timeout) {
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 }
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 return request;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 static bool
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 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
181 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 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
183 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
184 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
185
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 /* <id> <userid> [..] */
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 list = t_strsplit(args, "\t");
11086
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
189 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
190 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
191 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
192 return FALSE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 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
196 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
197 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
198 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
199 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 return TRUE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 static bool
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 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
205 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
206 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 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
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
11086
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
210 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
211 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
212 return FALSE;
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
213 }
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
214
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 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
216 if (request != NULL) {
10589
cab5f2e7b806 auth master lookups: If request isn't found, return FAIL instead of NOTFOUND.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
217 i_error("Authenticated user not found from userdb");
11018
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
218 request->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
219 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
220 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
221 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 return TRUE;
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
11018
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
226 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
227 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
228 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 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
230 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
231 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
232
11018
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
233 args = t_strsplit(args_line, "\t");
11086
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11018
diff changeset
234 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
235 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
236 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
237 }
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
238 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
239 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
240 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
241 }
10101
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 if (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
246 i_error("Internal auth failure");
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
247 request->callback(NULL, error != NULL ? error :
2e08ce368bc0 Added support for userdb lookup to fail with a reason (many API changes).
Timo Sirainen <tss@iki.fi>
parents: 10589
diff changeset
248 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
249 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
250 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
251 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 return TRUE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 }
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 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
256 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 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
258 bool ret;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 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
261 case 0:
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 case -1:
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 /* disconnected */
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 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
266 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 case -2:
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 /* buffer full */
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 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
270 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
271 return;
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 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
275 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
276 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
277 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 /* 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
280 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
281 !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
282 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
283 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
284 "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
285 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
286 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 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
289 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 auth->refcount++;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 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
293 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
294 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
295 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
296 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
297 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
298 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
299 else
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 ret = TRUE;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 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
303 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
304 break;
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 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 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
308 }
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 static int
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 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
312 {
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 int fd;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 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
316
10159
e027503ddb6b Use net_connect_unix_with_retries() instead of duplicating the code everywhere.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
317 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
318 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
319 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
320 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
321 return -1;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 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
324 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
325 auth->output = o_stream_create_fd(fd, (size_t)-1, FALSE);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 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
327 return 0;
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 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
331 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
332 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
333 void *context)
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 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
336 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
337 string_t *str;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 str = t_str_new(128);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 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
341 if (master_login_auth_connect(auth) < 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
342 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
343 context);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 return;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 str_printfa(str, "VERSION\t%u\t%u\n",
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 AUTH_MASTER_PROTOCOL_MAJOR_VERSION,
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 AUTH_MASTER_PROTOCOL_MINOR_VERSION);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 }
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 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
352 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
353 id++;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 str_printfa(str, "REQUEST\t%u\t%u\t%u\t", id,
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 req->client_pid, req->auth_id);
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 binary_to_hex_append(str, req->cookie, sizeof(req->cookie));
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 str_append_c(str, '\n');
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 o_stream_send(auth->output, str_data(str), str_len(str));
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 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
362 login_req->create_stamp = ioloop_time;
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 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
364 login_req->context = context;
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 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
366 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
367
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
368 if (auth->to == NULL)
0979e9e1e124 lib-master: Added timeout for auth master lookups.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
369 master_login_auth_set_timeout(auth);
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 }
10199
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10159
diff changeset
371
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10159
diff changeset
372 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
373 {
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10159
diff changeset
374 return hash_table_count(auth->requests);
9d13e9f78d52 lib-master: Fixes to handling master-login services.
Timo Sirainen <tss@iki.fi>
parents: 10159
diff changeset
375 }