annotate src/lib-auth/auth-server-connection.c @ 4891:6ab2712f1a93 HEAD

Only imap binary was actually working.
author Timo Sirainen <tss@iki.fi>
date Sun, 10 Dec 2006 14:35:02 +0200
parents e67acfeb2fd5
children f98ee68ab23f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
1 /* Copyright (C) 2003-2004 Timo Sirainen */
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
4 #include "buffer.h"
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "hash.h"
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "ioloop.h"
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "istream.h"
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "ostream.h"
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "network.h"
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "auth-client.h"
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "auth-server-connection.h"
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "auth-server-request.h"
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include <unistd.h>
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
15 #include <stdlib.h>
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
1710
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
17 static void auth_server_connection_unref(struct auth_server_connection *conn);
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
18
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
19 static void update_available_auth_mechs(struct auth_server_connection *conn)
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 {
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
21 struct auth_client *client = conn->client;
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
22 const struct auth_mech_desc *mech;
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
23 struct auth_mech_desc *new_mech;
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
24 unsigned int i;
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
26 mech = conn->available_auth_mechs;
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
27 for (i = 0; i < conn->available_auth_mechs_count; i++) {
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
28 if (auth_client_find_mech(client, mech[i].name) == NULL) {
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
29 new_mech = buffer_append_space_unsafe(
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
30 client->available_auth_mechs, sizeof(*mech));
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
31 *new_mech = mech[i];
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
32 new_mech->name = i_strdup(mech[i].name);
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
33 }
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
34 }
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3707
diff changeset
37 static bool
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
38 auth_client_input_mech(struct auth_server_connection *conn, const char *args)
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 {
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
40 const char *const *list;
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
41 struct auth_mech_desc mech_desc;
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
42
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
43 if (conn->handshake_received) {
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
44 i_error("BUG: Authentication server already sent handshake");
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
45 return FALSE;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
46 }
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
47
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
48 list = t_strsplit(args, "\t");
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
49 if (list[0] == NULL) {
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
50 i_error("BUG: Authentication server sent broken MECH line");
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
51 return FALSE;
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
52 }
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
53
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
54 memset(&mech_desc, 0, sizeof(mech_desc));
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
55 mech_desc.name = p_strdup(conn->pool, list[0]);
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
56
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
57 if (strcmp(mech_desc.name, "PLAIN") == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
58 conn->has_plain_mech = TRUE;
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
59
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
60 for (list++; *list != NULL; list++) {
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
61 if (strcmp(*list, "private") == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
62 mech_desc.flags |= MECH_SEC_PRIVATE;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
63 else if (strcmp(*list, "anonymous") == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
64 mech_desc.flags |= MECH_SEC_ANONYMOUS;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
65 else if (strcmp(*list, "plaintext") == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
66 mech_desc.flags |= MECH_SEC_PLAINTEXT;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
67 else if (strcmp(*list, "dictionary") == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
68 mech_desc.flags |= MECH_SEC_DICTIONARY;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
69 else if (strcmp(*list, "active") == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
70 mech_desc.flags |= MECH_SEC_ACTIVE;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
71 else if (strcmp(*list, "forward-secrecy") == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
72 mech_desc.flags |= MECH_SEC_FORWARD_SECRECY;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
73 else if (strcmp(*list, "mutual-auth") == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
74 mech_desc.flags |= MECH_SEC_MUTUAL_AUTH;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
75 }
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
76 buffer_append(conn->auth_mechs_buf, &mech_desc, sizeof(mech_desc));
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
77 return TRUE;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
78 }
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
79
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3707
diff changeset
80 static bool
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
81 auth_client_input_spid(struct auth_server_connection *conn, const char *args)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
82 {
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
83 if (conn->handshake_received) {
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
84 i_error("BUG: Authentication server already sent handshake");
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
85 return FALSE;
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
86 }
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
87
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
88 conn->server_pid = (unsigned int)strtoul(args, NULL, 10);
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
89 return TRUE;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
90 }
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
91
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3707
diff changeset
92 static bool
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
93 auth_client_input_cuid(struct auth_server_connection *conn, const char *args)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
94 {
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
95 if (conn->handshake_received) {
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
96 i_error("BUG: Authentication server already sent handshake");
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
97 return FALSE;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
98 }
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
99
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
100 conn->connect_uid = (unsigned int)strtoul(args, NULL, 10);
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
101 return TRUE;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
102 }
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
103
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3707
diff changeset
104 static bool auth_client_input_done(struct auth_server_connection *conn)
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
105 {
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
106 conn->available_auth_mechs = conn->auth_mechs_buf->data;
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
107 conn->available_auth_mechs_count =
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
108 conn->auth_mechs_buf->used / sizeof(struct auth_mech_desc);
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
109
3707
c278d40d99e7 Give error message if auth server didn't return mechanism list.
Timo Sirainen <tss@iki.fi>
parents: 3533
diff changeset
110 if (conn->available_auth_mechs_count == 0) {
c278d40d99e7 Give error message if auth server didn't return mechanism list.
Timo Sirainen <tss@iki.fi>
parents: 3533
diff changeset
111 i_error("BUG: Authentication server returned no mechanisms");
c278d40d99e7 Give error message if auth server didn't return mechanism list.
Timo Sirainen <tss@iki.fi>
parents: 3533
diff changeset
112 return FALSE;
c278d40d99e7 Give error message if auth server didn't return mechanism list.
Timo Sirainen <tss@iki.fi>
parents: 3533
diff changeset
113 }
c278d40d99e7 Give error message if auth server didn't return mechanism list.
Timo Sirainen <tss@iki.fi>
parents: 3533
diff changeset
114
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 conn->handshake_received = TRUE;
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
116 conn->client->conn_waiting_handshake_count--;
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
117 update_available_auth_mechs(conn);
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118
1705
5121567de516 bugfixes
Timo Sirainen <tss@iki.fi>
parents: 1702
diff changeset
119 if (conn->client->connect_notify_callback != NULL &&
5121567de516 bugfixes
Timo Sirainen <tss@iki.fi>
parents: 1702
diff changeset
120 auth_client_is_connected(conn->client)) {
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 conn->client->connect_notify_callback(conn->client, TRUE,
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 conn->client->connect_notify_context);
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 }
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
124 return TRUE;
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 static void auth_client_input(void *context)
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 {
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 struct auth_server_connection *conn = context;
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
130 const char *line;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
131 int ret;
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 switch (i_stream_read(conn->input)) {
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 case 0:
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 return;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 case -1:
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 /* disconnected */
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
138 auth_server_connection_destroy(&conn, TRUE);
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 return;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 case -2:
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 /* buffer full - can't happen unless auth is buggy */
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 i_error("BUG: Auth server sent us more than %d bytes of data",
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
143 AUTH_CLIENT_MAX_LINE_LENGTH);
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
144 auth_server_connection_destroy(&conn, FALSE);
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 return;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147
2776
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
148 if (conn->version_received) {
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
149 line = i_stream_next_line(conn->input);
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
150 if (line == NULL)
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
151 return;
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
152
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
153 /* make sure the major version matches */
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
154 if (strncmp(line, "VERSION\t", 8) != 0 ||
2809
0b1bef51f207 Separate major/minor version with TAB instead of dot in VERSION.
Timo Sirainen <tss@iki.fi>
parents: 2776
diff changeset
155 atoi(t_strcut(line + 8, '\t')) !=
2776
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
156 AUTH_CLIENT_PROTOCOL_MAJOR_VERSION) {
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
157 i_error("Authentication server not compatible with "
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
158 "this client (mixed old and new binaries?)");
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
159 auth_server_connection_destroy(&conn, FALSE);
2776
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
160 return;
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
161 }
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
162 conn->version_received = TRUE;
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
163 }
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
164
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
165 conn->refcount++;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
166 while ((line = i_stream_next_line(conn->input)) != NULL) {
4769
e67acfeb2fd5 Reduce memory usage in case we read a lot of auth replies at once.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
167 t_push();
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
168 if (strncmp(line, "OK\t", 3) == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
169 ret = auth_client_input_ok(conn, line + 3);
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
170 else if (strncmp(line, "CONT\t", 5) == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
171 ret = auth_client_input_cont(conn, line + 5);
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
172 else if (strncmp(line, "FAIL\t", 5) == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
173 ret = auth_client_input_fail(conn, line + 5);
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
174 else if (strncmp(line, "MECH\t", 5) == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
175 ret = auth_client_input_mech(conn, line + 5);
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
176 else if (strncmp(line, "SPID\t", 5) == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
177 ret = auth_client_input_spid(conn, line + 5);
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
178 else if (strncmp(line, "CUID\t", 5) == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
179 ret = auth_client_input_cuid(conn, line + 5);
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
180 else if (strcmp(line, "DONE") == 0)
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
181 ret = auth_client_input_done(conn);
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
182 else {
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
183 /* ignore unknown command */
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
184 ret = TRUE;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
185 }
4769
e67acfeb2fd5 Reduce memory usage in case we read a lot of auth replies at once.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
186 t_pop();
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
188 if (!ret) {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
189 auth_server_connection_destroy(&conn, FALSE);
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
190 break;
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
191 }
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 }
1710
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
193 auth_server_connection_unref(conn);
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 struct auth_server_connection *
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 auth_server_connection_new(struct auth_client *client, const char *path)
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 {
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 struct auth_server_connection *conn;
2776
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
200 const char *handshake;
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 pool_t pool;
3533
3ec5c6665bec If UNIX socket connection fails with EAGAIN, try again for a while.
Timo Sirainen <tss@iki.fi>
parents: 2970
diff changeset
202 int fd, try;
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203
3533
3ec5c6665bec If UNIX socket connection fails with EAGAIN, try again for a while.
Timo Sirainen <tss@iki.fi>
parents: 2970
diff changeset
204 /* max. 1 second wait here. */
3ec5c6665bec If UNIX socket connection fails with EAGAIN, try again for a while.
Timo Sirainen <tss@iki.fi>
parents: 2970
diff changeset
205 for (try = 0; try < 10; try++) {
3ec5c6665bec If UNIX socket connection fails with EAGAIN, try again for a while.
Timo Sirainen <tss@iki.fi>
parents: 2970
diff changeset
206 fd = net_connect_unix(path);
3ec5c6665bec If UNIX socket connection fails with EAGAIN, try again for a while.
Timo Sirainen <tss@iki.fi>
parents: 2970
diff changeset
207 if (fd != -1 || errno != EAGAIN)
3ec5c6665bec If UNIX socket connection fails with EAGAIN, try again for a while.
Timo Sirainen <tss@iki.fi>
parents: 2970
diff changeset
208 break;
3ec5c6665bec If UNIX socket connection fails with EAGAIN, try again for a while.
Timo Sirainen <tss@iki.fi>
parents: 2970
diff changeset
209
3ec5c6665bec If UNIX socket connection fails with EAGAIN, try again for a while.
Timo Sirainen <tss@iki.fi>
parents: 2970
diff changeset
210 /* busy. wait for a while. */
3ec5c6665bec If UNIX socket connection fails with EAGAIN, try again for a while.
Timo Sirainen <tss@iki.fi>
parents: 2970
diff changeset
211 usleep(((rand() % 10) + 1) * 10000);
3ec5c6665bec If UNIX socket connection fails with EAGAIN, try again for a while.
Timo Sirainen <tss@iki.fi>
parents: 2970
diff changeset
212 }
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 if (fd == -1) {
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 i_error("Can't connect to auth server at %s: %m", path);
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 return NULL;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 /* use blocking connection since we depend on auth server -
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 if it's slow, just wait */
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 pool = pool_alloconly_create("Auth connection", 1024);
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 conn = p_new(pool, struct auth_server_connection, 1);
1710
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
223 conn->refcount = 1;
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 conn->pool = pool;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 conn->client = client;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 conn->path = p_strdup(pool, path);
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 conn->fd = fd;
2082
e22e3827a5f3 Allow using more easily outside dovecot.
Timo Sirainen <tss@iki.fi>
parents: 2077
diff changeset
229 if (client->ext_input_add == NULL)
e22e3827a5f3 Allow using more easily outside dovecot.
Timo Sirainen <tss@iki.fi>
parents: 2077
diff changeset
230 conn->io = io_add(fd, IO_READ, auth_client_input, conn);
e22e3827a5f3 Allow using more easily outside dovecot.
Timo Sirainen <tss@iki.fi>
parents: 2077
diff changeset
231 else {
e22e3827a5f3 Allow using more easily outside dovecot.
Timo Sirainen <tss@iki.fi>
parents: 2077
diff changeset
232 conn->ext_input_io =
e22e3827a5f3 Allow using more easily outside dovecot.
Timo Sirainen <tss@iki.fi>
parents: 2077
diff changeset
233 client->ext_input_add(fd, auth_client_input, conn);
e22e3827a5f3 Allow using more easily outside dovecot.
Timo Sirainen <tss@iki.fi>
parents: 2077
diff changeset
234 }
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
235 conn->input = i_stream_create_file(fd, default_pool,
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
236 AUTH_CLIENT_MAX_LINE_LENGTH, FALSE);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2267
diff changeset
237 conn->output = o_stream_create_file(fd, default_pool, (size_t)-1,
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 FALSE);
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 conn->requests = hash_create(default_pool, pool, 100, NULL, NULL);
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
240 conn->auth_mechs_buf = buffer_create_dynamic(default_pool, 256);
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 conn->next = client->connections;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 client->connections = conn;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244
2809
0b1bef51f207 Separate major/minor version with TAB instead of dot in VERSION.
Timo Sirainen <tss@iki.fi>
parents: 2776
diff changeset
245 handshake = t_strdup_printf("VERSION\t%u\t%u\nCPID\t%u\n",
2776
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
246 AUTH_CLIENT_PROTOCOL_MAJOR_VERSION,
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
247 AUTH_CLIENT_PROTOCOL_MINOR_VERSION,
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
248 client->pid);
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
249
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 client->conn_waiting_handshake_count++;
2776
150f8151c971 Added VERSION command and checking to authentication protocol.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
251 if (o_stream_send_str(conn->output, handshake) < 0) {
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 errno = conn->output->stream_errno;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 i_warning("Error sending handshake to auth server: %m");
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
254 auth_server_connection_destroy(&conn, TRUE);
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 return NULL;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 return conn;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
260 void auth_server_connection_destroy(struct auth_server_connection **_conn,
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3707
diff changeset
261 bool reconnect)
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
263 struct auth_server_connection *conn = *_conn;
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 struct auth_client *client = conn->client;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 struct auth_server_connection **pos;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
267 *_conn = NULL;
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
268
1710
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
269 if (conn->fd == -1)
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
270 return;
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
271
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 pos = &conn->client->connections;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 for (; *pos != NULL; pos = &(*pos)->next) {
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 if (*pos == conn) {
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 *pos = conn->next;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 break;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 if (!conn->handshake_received)
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 client->conn_waiting_handshake_count--;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282
2082
e22e3827a5f3 Allow using more easily outside dovecot.
Timo Sirainen <tss@iki.fi>
parents: 2077
diff changeset
283 if (conn->ext_input_io != NULL) {
e22e3827a5f3 Allow using more easily outside dovecot.
Timo Sirainen <tss@iki.fi>
parents: 2077
diff changeset
284 client->ext_input_remove(conn->ext_input_io);
e22e3827a5f3 Allow using more easily outside dovecot.
Timo Sirainen <tss@iki.fi>
parents: 2077
diff changeset
285 conn->ext_input_io = NULL;
e22e3827a5f3 Allow using more easily outside dovecot.
Timo Sirainen <tss@iki.fi>
parents: 2077
diff changeset
286 }
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
287 if (conn->io != NULL)
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
288 io_remove(&conn->io);
1710
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
289
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
290 i_stream_close(conn->input);
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
291 o_stream_close(conn->output);
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
292
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 if (close(conn->fd) < 0)
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 i_error("close(auth) failed: %m");
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 conn->fd = -1;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 auth_server_requests_remove_all(conn);
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
298 auth_server_connection_unref(conn);
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 if (reconnect)
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 auth_client_connect_missing_servers(client);
1705
5121567de516 bugfixes
Timo Sirainen <tss@iki.fi>
parents: 1702
diff changeset
302 else if (client->connect_notify_callback != NULL) {
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 client->connect_notify_callback(client,
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 auth_client_is_connected(client),
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 client->connect_notify_context);
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308
1710
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
309 static void auth_server_connection_unref(struct auth_server_connection *conn)
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
310 {
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
311 if (--conn->refcount > 0)
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
312 return;
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
313 i_assert(conn->refcount == 0);
1710
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
314
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
315 hash_destroy(conn->requests);
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
316 buffer_free(conn->auth_mechs_buf);
1710
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
317
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
318 i_stream_unref(&conn->input);
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
319 o_stream_unref(&conn->output);
1710
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
320 pool_unref(conn->pool);
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
321 }
Timo Sirainen <tss@iki.fi>
parents: 1705
diff changeset
322
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 struct auth_server_connection *
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 auth_server_connection_find_path(struct auth_client *client, const char *path)
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 {
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 struct auth_server_connection *conn;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 for (conn = client->connections; conn != NULL; conn = conn->next) {
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 if (strcmp(conn->path, path) == 0)
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 return conn;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 return NULL;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 struct auth_server_connection *
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 auth_server_connection_find_mech(struct auth_client *client,
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
338 const char *name, const char **error_r)
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 {
2970
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
340 struct auth_server_connection *conn, *match;
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
341 const struct auth_mech_desc *mech;
2970
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
342 unsigned int i, n, match_n;
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343
2970
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
344 /* find a connection which has this mechanism. if there are multiple
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
345 available connections to use, do round robin load balancing */
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
346 match = NULL; match_n = n = 0;
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
347 for (conn = client->connections; conn != NULL; conn = conn->next, n++) {
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
348 mech = conn->available_auth_mechs;
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
349 for (i = 0; i < conn->available_auth_mechs_count; i++) {
2970
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
350 if (strcasecmp(mech[i].name, name) == 0) {
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
351 if (n > client->last_used_auth_process) {
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
352 client->last_used_auth_process = n;
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
353 return conn;
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
354 }
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
355 if (match == NULL) {
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
356 match = conn;
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
357 match_n = n;
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
358 }
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
359 break;
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
360 }
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
361 }
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363
2970
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
364 if (match != NULL) {
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
365 client->last_used_auth_process = match_n;
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
366 return match;
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
367 }
e2876940968e Connect to available auth sockets by round robin.
Timo Sirainen <tss@iki.fi>
parents: 2809
diff changeset
368
2077
d5b20d679b8a Removed hardcoded mechanism lists. It's now possible to add them
Timo Sirainen <tss@iki.fi>
parents: 1710
diff changeset
369 if (auth_client_find_mech(client, name) == NULL)
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 *error_r = "Unsupported authentication mechanism";
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 else {
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 *error_r = "Authentication server isn't connected, "
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 "try again later..";
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 }
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 return NULL;
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 }