Lines Matching defs:auth

16 #include "master-auth.h"
17 #include "master-login-auth.h"
62 static void master_login_auth_set_timeout(struct master_login_auth *auth);
63 static void master_login_auth_check_spids(struct master_login_auth *auth);
68 struct master_login_auth *auth;
71 pool = pool_alloconly_create("master login auth", 1024);
72 auth = p_new(pool, struct master_login_auth, 1);
73 auth->pool = pool;
74 auth->auth_socket_path = p_strdup(pool, auth_socket_path);
75 auth->request_auth_token = request_auth_token;
76 auth->refcount = 1;
77 auth->fd = -1;
78 hash_table_create_direct(&auth->requests, pool, 0);
79 auth->id_counter = i_rand_limit(32767) * 131072U;
80 return auth;
93 void master_login_auth_disconnect(struct master_login_auth *auth)
97 while (auth->request_head != NULL) {
98 request = auth->request_head;
99 DLLIST2_REMOVE(&auth->request_head,
100 &auth->request_tail, request);
103 "Disconnected from auth server, aborting");
106 hash_table_clear(auth->requests, FALSE);
108 timeout_remove(&auth->to);
109 io_remove(&auth->io);
110 if (auth->fd != -1) {
111 i_stream_destroy(&auth->input);
112 o_stream_destroy(&auth->output);
114 net_disconnect(auth->fd);
115 auth->fd = -1;
117 auth->version_received = FALSE;
122 struct master_login_auth *auth = *_auth;
126 i_assert(auth->refcount > 0);
127 if (--auth->refcount > 0)
130 hash_table_destroy(&auth->requests);
131 pool_unref(&auth->pool);
136 struct master_login_auth *auth = *_auth;
140 master_login_auth_disconnect(auth);
141 master_login_auth_unref(&auth);
144 static unsigned int auth_get_next_timeout_secs(struct master_login_auth *auth)
148 expires = auth->request_head->create_stamp +
153 static void master_login_auth_timeout(struct master_login_auth *auth)
158 while (auth->request_head != NULL &&
159 auth_get_next_timeout_secs(auth) == 0) {
160 request = auth->request_head;
161 DLLIST2_REMOVE(&auth->request_head,
162 &auth->request_tail, request);
163 hash_table_remove(auth->requests, POINTER_CAST(request->id));
171 timeout_remove(&auth->to);
172 master_login_auth_set_timeout(auth);
175 static void master_login_auth_set_timeout(struct master_login_auth *auth)
177 i_assert(auth->to == NULL);
179 if (auth->request_head != NULL) {
180 auth->to = timeout_add(auth_get_next_timeout_secs(auth) * 1000,
181 master_login_auth_timeout, auth);
186 master_login_auth_request_remove(struct master_login_auth *auth,
193 hash_table_remove(auth->requests, POINTER_CAST(request->id));
194 DLLIST2_REMOVE(&auth->request_head, &auth->request_tail, request);
197 timeout_remove(&auth->to);
198 master_login_auth_set_timeout(auth);
203 master_login_auth_lookup_request(struct master_login_auth *auth,
208 request = hash_table_lookup(auth->requests, POINTER_CAST(id));
213 master_login_auth_request_remove(auth, request);
224 master_login_auth_input_user(struct master_login_auth *auth, const char *args)
239 request = master_login_auth_lookup_request(auth, id);
248 master_login_auth_input_notfound(struct master_login_auth *auth,
259 request = master_login_auth_lookup_request(auth, id);
263 "auth lookup id=%u", id);
271 master_login_auth_input_fail(struct master_login_auth *auth,
288 request = master_login_auth_lookup_request(auth, id);
292 "Internal auth failure");
294 i_error("Internal auth failure: %s "
304 static void master_login_auth_input(struct master_login_auth *auth)
309 switch (i_stream_read(auth->input)) {
315 connect back to auth-master */
317 master_login_auth_disconnect(auth);
322 master_login_auth_disconnect(auth);
326 if (!auth->version_received) {
327 line = i_stream_next_line(auth->input);
337 master_login_auth_disconnect(auth);
340 auth->version_received = TRUE;
342 if (!auth->spid_received) {
343 line = i_stream_next_line(auth->input);
348 str_to_pid(line + 5, &auth->auth_server_pid) < 0) {
351 master_login_auth_disconnect(auth);
354 auth->spid_received = TRUE;
355 master_login_auth_check_spids(auth);
358 auth->refcount++;
359 while ((line = i_stream_next_line(auth->input)) != NULL) {
361 ret = master_login_auth_input_user(auth, line + 5);
363 ret = master_login_auth_input_notfound(auth, line + 9);
365 ret = master_login_auth_input_fail(auth, line + 5);
369 if (!ret || auth->input == NULL) {
370 master_login_auth_disconnect(auth);
374 master_login_auth_unref(&auth);
378 master_login_auth_connect(struct master_login_auth *auth)
382 i_assert(auth->fd == -1);
384 fd = net_connect_unix_with_retries(auth->auth_socket_path, 1000);
387 auth->auth_socket_path);
390 auth->fd = fd;
391 auth->input = i_stream_create_fd(fd, AUTH_MAX_INBUF_SIZE);
392 auth->output = o_stream_create_fd(fd, (size_t)-1);
393 o_stream_set_no_error_handling(auth->output, TRUE);
394 auth->io = io_add(fd, IO_READ, master_login_auth_input, auth);
399 auth_request_check_spid(struct master_login_auth *auth,
402 if (auth->auth_server_pid != req->auth_pid && auth->spid_received) {
403 /* auth server was restarted. don't even attempt a login. */
404 i_warning("Auth server restarted (pid %u -> %u), aborting auth",
406 (unsigned int)auth->auth_server_pid);
412 static void master_login_auth_check_spids(struct master_login_auth *auth)
416 for (req = auth->request_head; req != NULL; req = next) {
418 if (!auth_request_check_spid(auth, req))
424 master_login_auth_send_request(struct master_login_auth *auth,
429 if (!auth_request_check_spid(auth, req)) {
430 master_login_auth_request_remove(auth, req);
442 if (auth->request_auth_token)
445 o_stream_nsend(auth->output, str_data(str), str_len(str));
448 void master_login_auth_request(struct master_login_auth *auth,
456 if (auth->fd == -1) {
457 if (master_login_auth_connect(auth) < 0) {
458 /* we couldn't connect to auth now,
465 o_stream_nsend_str(auth->output,
471 id = ++auth->id_counter;
484 i_assert(hash_table_lookup(auth->requests, POINTER_CAST(id)) == NULL);
485 hash_table_insert(auth->requests, POINTER_CAST(id), login_req);
486 DLLIST2_APPEND(&auth->request_head, &auth->request_tail, login_req);
488 if (auth->to == NULL)
489 master_login_auth_set_timeout(auth);
491 master_login_auth_send_request(auth, login_req);
494 unsigned int master_login_auth_request_count(struct master_login_auth *auth)
496 return hash_table_count(auth->requests);