annotate src/auth/auth-postfix-connection.c @ 22614:cf66220d281e

doveadm proxy: Don't crash if remote doesn't support log proxying
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Sat, 14 Oct 2017 12:54:18 +0300
parents 2e2563132d5f
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 19552
diff changeset
1 /* Copyright (c) 2011-2017 Dovecot authors, see the included COPYING file */
13912
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "auth-common.h"
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "ioloop.h"
15187
02451e967a06 Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents: 14681
diff changeset
5 #include "net.h"
13912
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "istream.h"
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "ostream.h"
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "llist.h"
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "str.h"
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "strescape.h"
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "str-sanitize.h"
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "master-service.h"
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "userdb.h"
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "auth-postfix-connection.h"
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include <unistd.h>
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #define MAX_INBUF_SIZE 1024
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #define MAX_OUTBUF_SIZE (1024*50)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 struct auth_postfix_connection {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 struct auth_postfix_connection *prev, *next;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 struct auth *auth;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 int refcount;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 int fd;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 char *path;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 struct istream *input;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 struct ostream *output;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 struct io *io;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 unsigned int destroyed:1;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 };
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 static void postfix_input(struct auth_postfix_connection *conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 static void auth_postfix_connection_ref(struct auth_postfix_connection *conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 static void auth_postfix_connection_destroy(struct auth_postfix_connection **_conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 static void auth_postfix_connection_unref(struct auth_postfix_connection **_conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 static struct auth_postfix_connection *auth_postfix_connections;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 static int
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 postfix_input_auth_request(struct auth_postfix_connection *conn,
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 const char *username,
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 struct auth_request **request_r, const char **error_r)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 struct auth_request *auth_request;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 auth_request = auth_request_new_dummy();
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 auth_request->id = 1;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 auth_request->context = conn;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 auth_postfix_connection_ref(conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
17735
c3da5ffaa0f2 auth: protocol-specific username settings weren't used for userdb lookups.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
54 (void)auth_request_import_info(auth_request, "service", "postfix");
c3da5ffaa0f2 auth: protocol-specific username settings weren't used for userdb lookups.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
55 auth_request_init(auth_request);
c3da5ffaa0f2 auth: protocol-specific username settings weren't used for userdb lookups.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
56
13912
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 if (!auth_request_set_username(auth_request, username, error_r)) {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 *request_r = auth_request;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 return FALSE;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 *request_r = auth_request;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 return TRUE;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 static void
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 user_callback(enum userdb_result result, struct auth_request *auth_request)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 struct auth_postfix_connection *conn = auth_request->context;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 string_t *str;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 const char *value;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
17042
eeadb7b5045b auth: Added userdb result_success/failure/tempfail and skip settings, similar to passdb's.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
72 if (auth_request->userdb_lookup_tempfailed)
13912
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 result = USERDB_RESULT_INTERNAL_FAILURE;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 str = t_str_new(128);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 switch (result) {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 case USERDB_RESULT_INTERNAL_FAILURE:
17042
eeadb7b5045b auth: Added userdb result_success/failure/tempfail and skip settings, similar to passdb's.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
78 if (auth_request->userdb_lookup_tempfailed)
15685
17f5257d60c1 auth: Code cleanup: Renamed auth-stream to auth-fields.
Timo Sirainen <tss@iki.fi>
parents: 15187
diff changeset
79 value = auth_fields_find(auth_request->userdb_reply, "reason");
13912
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 else
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 value = NULL;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 str_printfa(str, "400 %s",
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 value != NULL ? value: "Internal failure");
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 break;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 case USERDB_RESULT_USER_UNKNOWN:
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 str_append(str, "500 User not found");
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 break;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 case USERDB_RESULT_OK:
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 str_append(str, "200 1");
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 break;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 if (conn->auth->set->debug)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 i_debug("postfix out: %s", str_c(str));
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 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: 14133
diff changeset
97 o_stream_nsend(conn->output, str_data(str), str_len(str));
13912
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 i_assert(conn->io == NULL);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 if (!conn->destroyed)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 conn->io = io_add(conn->fd, IO_READ, postfix_input, conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 auth_request_unref(&auth_request);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 auth_postfix_connection_unref(&conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 static bool
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 postfix_input_user(struct auth_postfix_connection *conn, const char *username)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 struct auth_request *auth_request;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 const char *error;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 io_remove(&conn->io);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 if (!postfix_input_auth_request(conn, username,
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 &auth_request, &error)) {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 auth_request_log_info(auth_request, "postfix", "%s", error);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 user_callback(USERDB_RESULT_USER_UNKNOWN, auth_request);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 } else {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 auth_request_set_state(auth_request, AUTH_REQUEST_STATE_USERDB);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 auth_request_lookup_user(auth_request, user_callback);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 return TRUE;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 static bool
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 auth_postfix_input_line(struct auth_postfix_connection *conn, const char *line)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 if (conn->auth->set->debug)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 i_debug("postfix in: %s", line);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 if (strncasecmp(line, "get ", 4) == 0)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 return postfix_input_user(conn, line + 4);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 i_error("BUG: Unknown command in postfix socket: %s",
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 str_sanitize(line, 80));
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 return FALSE;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 static void postfix_input(struct auth_postfix_connection *conn)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 char *line;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 bool ret;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 switch (i_stream_read(conn->input)) {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 case 0:
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 return;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 case -1:
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 /* disconnected */
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 auth_postfix_connection_destroy(&conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 return;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 case -2:
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 /* buffer full */
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 i_error("BUG: Postfix sent us more than %d bytes",
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 (int)MAX_INBUF_SIZE);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 auth_postfix_connection_destroy(&conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 return;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 while ((line = i_stream_next_line(conn->input)) != NULL) {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 T_BEGIN {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 ret = auth_postfix_input_line(conn, line);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 } T_END;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 if (!ret) {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 auth_postfix_connection_destroy(&conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 return;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 struct auth_postfix_connection *
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 auth_postfix_connection_create(struct auth *auth, int fd)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 struct auth_postfix_connection *conn;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 conn = i_new(struct auth_postfix_connection, 1);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 conn->refcount = 1;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 conn->fd = fd;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 conn->auth = auth;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 conn->input = i_stream_create_fd(fd, MAX_INBUF_SIZE, FALSE);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 conn->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: 14133
diff changeset
181 o_stream_set_no_error_handling(conn->output, TRUE);
13912
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 conn->io = io_add(fd, IO_READ, postfix_input, conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 DLLIST_PREPEND(&auth_postfix_connections, conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 return conn;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 static void
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 auth_postfix_connection_destroy(struct auth_postfix_connection **_conn)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 struct auth_postfix_connection *conn = *_conn;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 *_conn = NULL;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 if (conn->destroyed)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 return;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 conn->destroyed = TRUE;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 DLLIST_REMOVE(&auth_postfix_connections, conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 if (conn->input != NULL)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 i_stream_close(conn->input);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 if (conn->output != NULL)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 o_stream_close(conn->output);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 if (conn->io != NULL)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 io_remove(&conn->io);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 if (conn->fd != -1) {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 if (close(conn->fd) < 0)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 i_error("close(%s): %m", conn->path);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 conn->fd = -1;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 master_service_client_connection_destroyed(master_service);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 auth_postfix_connection_unref(&conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 static void auth_postfix_connection_ref(struct auth_postfix_connection *conn)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 i_assert(conn->refcount > 0);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 conn->refcount++;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 static void
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 auth_postfix_connection_unref(struct auth_postfix_connection **_conn)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 struct auth_postfix_connection *conn = *_conn;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 *_conn = NULL;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 i_assert(conn->refcount > 0);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 if (--conn->refcount > 0)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 return;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 if (conn->input != NULL)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 i_stream_unref(&conn->input);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 if (conn->output != NULL)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 o_stream_unref(&conn->output);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 i_free(conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 void auth_postfix_connections_destroy_all(void)
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 struct auth_postfix_connection *conn;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 while (auth_postfix_connections != NULL) {
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 conn = auth_postfix_connections;
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 auth_postfix_connection_destroy(&conn);
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 }
f562bcaca215 auth: Implemented support for Postfix's "TCP map" sockets for user existence lookups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 }