annotate src/pop3-login/pop3-proxy.c @ 8097:4d6cc7bb3426 HEAD

Proxy: Log destuser in the "proxying" line if it's different from username.
author Timo Sirainen <tss@iki.fi>
date Thu, 14 Aug 2008 03:10:34 -0400
parents 2351a81ce699
children 26b67708b365
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7086
7ed926ed7aa4 Updated copyright notices to include year 2008.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1 /* Copyright (c) 2004-2008 Dovecot authors, see the included COPYING file */
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "common.h"
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "ioloop.h"
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
5 #include "istream.h"
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
6 #include "ostream.h"
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "base64.h"
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
8 #include "safe-memset.h"
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "str.h"
7117
769181a20483 Make sure all user input is sanitized before it's logged.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
10 #include "str-sanitize.h"
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "client.h"
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "pop3-proxy.h"
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
14 static void proxy_input(struct istream *input, struct ostream *output,
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4873
diff changeset
15 struct pop3_client *client)
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
16 {
2785
fc4b1ec1b3ef Use USER/PASS instad for AUTH PLAIN. Also don't require "+OK" to have
Timo Sirainen <tss@iki.fi>
parents: 2783
diff changeset
17 string_t *str;
8097
4d6cc7bb3426 Proxy: Log destuser in the "proxying" line if it's different from username.
Timo Sirainen <tss@iki.fi>
parents: 7927
diff changeset
18 const char *line;
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
19
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
20 if (input == NULL) {
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
21 if (client->io != NULL) {
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
22 /* remote authentication failed, we're just
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
23 freeing the proxy */
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
24 return;
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
25 }
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
26
5138
20302f49eda3 Don't crash if the remote server disconnects before we're logged in.
Timo Sirainen <tss@iki.fi>
parents: 5046
diff changeset
27 if (client->destroyed) {
20302f49eda3 Don't crash if the remote server disconnects before we're logged in.
Timo Sirainen <tss@iki.fi>
parents: 5046
diff changeset
28 /* we came here from client_destroy() */
20302f49eda3 Don't crash if the remote server disconnects before we're logged in.
Timo Sirainen <tss@iki.fi>
parents: 5046
diff changeset
29 return;
20302f49eda3 Don't crash if the remote server disconnects before we're logged in.
Timo Sirainen <tss@iki.fi>
parents: 5046
diff changeset
30 }
20302f49eda3 Don't crash if the remote server disconnects before we're logged in.
Timo Sirainen <tss@iki.fi>
parents: 5046
diff changeset
31
3054
a5dbe1e56c07 proxy: When we can't connect to remote server, show "Temporary login
Timo Sirainen <tss@iki.fi>
parents: 2850
diff changeset
32 /* failed for some reason, probably server disconnected */
3082
620a00db2c7c If login failed, send it as "-ERR [IN-USE]" rather as IMAP's "* BYE"..
Timo Sirainen <tss@iki.fi>
parents: 3054
diff changeset
33 client_send_line(client,
620a00db2c7c If login failed, send it as "-ERR [IN-USE]" rather as IMAP's "* BYE"..
Timo Sirainen <tss@iki.fi>
parents: 3054
diff changeset
34 "-ERR [IN-USE] Temporary login failure.");
7438
65fbb6226141 Log clearly with "auth failed, # attempts" if user gets disconnected before
Timo Sirainen <tss@iki.fi>
parents: 7216
diff changeset
35 client_destroy_success(client, NULL);
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
36 return;
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
37 }
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
38
5138
20302f49eda3 Don't crash if the remote server disconnects before we're logged in.
Timo Sirainen <tss@iki.fi>
parents: 5046
diff changeset
39 i_assert(!client->destroyed);
20302f49eda3 Don't crash if the remote server disconnects before we're logged in.
Timo Sirainen <tss@iki.fi>
parents: 5046
diff changeset
40
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
41 switch (i_stream_read(input)) {
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
42 case -2:
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
43 /* buffer full */
7117
769181a20483 Make sure all user input is sanitized before it's logged.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
44 client_syslog(&client->common,
769181a20483 Make sure all user input is sanitized before it's logged.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
45 "proxy: Remote input buffer full");
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
46 client_destroy_internal_failure(client);
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
47 return;
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
48 case -1:
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
49 /* disconnected */
7438
65fbb6226141 Log clearly with "auth failed, # attempts" if user gets disconnected before
Timo Sirainen <tss@iki.fi>
parents: 7216
diff changeset
50 client_destroy_success(client, "Proxy: Remote disconnected");
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
51 return;
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
52 }
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
53
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
54 line = i_stream_next_line(input);
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
55 if (line == NULL)
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
56 return;
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
57
2835
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
58 switch (client->proxy_state) {
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
59 case 0:
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
60 /* this is a banner */
2785
fc4b1ec1b3ef Use USER/PASS instad for AUTH PLAIN. Also don't require "+OK" to have
Timo Sirainen <tss@iki.fi>
parents: 2783
diff changeset
61 if (strncmp(line, "+OK", 3) != 0) {
7117
769181a20483 Make sure all user input is sanitized before it's logged.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
62 client_syslog(&client->common, t_strdup_printf(
769181a20483 Make sure all user input is sanitized before it's logged.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
63 "proxy: Remote returned invalid banner: %s",
769181a20483 Make sure all user input is sanitized before it's logged.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
64 str_sanitize(line, 160)));
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
65 client_destroy_internal_failure(client);
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
66 return;
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
67 }
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
68
2785
fc4b1ec1b3ef Use USER/PASS instad for AUTH PLAIN. Also don't require "+OK" to have
Timo Sirainen <tss@iki.fi>
parents: 2783
diff changeset
69 /* send USER command */
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
70 str = t_str_new(128);
2785
fc4b1ec1b3ef Use USER/PASS instad for AUTH PLAIN. Also don't require "+OK" to have
Timo Sirainen <tss@iki.fi>
parents: 2783
diff changeset
71 str_append(str, "USER ");
fc4b1ec1b3ef Use USER/PASS instad for AUTH PLAIN. Also don't require "+OK" to have
Timo Sirainen <tss@iki.fi>
parents: 2783
diff changeset
72 str_append(str, client->proxy_user);
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
73 str_append(str, "\r\n");
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
74 (void)o_stream_send(output, str_data(str), str_len(str));
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
75
2835
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
76 client->proxy_state++;
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
77 return;
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
78 case 1:
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
79 if (strncmp(line, "+OK", 3) != 0)
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
80 break;
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
81
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
82 /* USER successful, send PASS */
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
83 str = t_str_new(128);
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
84 str_append(str, "PASS ");
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
85 str_append(str, client->proxy_password);
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
86 str_append(str, "\r\n");
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
87 (void)o_stream_send(output, str_data(str),
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
88 str_len(str));
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
89
2835
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
90 safe_memset(client->proxy_password, 0,
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
91 strlen(client->proxy_password));
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
92 i_free(client->proxy_password);
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
93 client->proxy_password = NULL;
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
94
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
95 client->proxy_state++;
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
96 return;
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
97 case 2:
2850
4e5b1a1494c5 Check that PASS replies with OK.
Timo Sirainen <tss@iki.fi>
parents: 2835
diff changeset
98 if (strncmp(line, "+OK", 3) != 0)
4e5b1a1494c5 Check that PASS replies with OK.
Timo Sirainen <tss@iki.fi>
parents: 2835
diff changeset
99 break;
4e5b1a1494c5 Check that PASS replies with OK.
Timo Sirainen <tss@iki.fi>
parents: 2835
diff changeset
100
2835
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
101 /* Login successful. Send this line to client. */
7454
053ec63146cb Send the success reply in one write. Based on patch by Onno Molenkamp.
Timo Sirainen <tss@iki.fi>
parents: 7438
diff changeset
102 line = t_strconcat(line, "\r\n", NULL);
2835
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
103 (void)o_stream_send_str(client->output, line);
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
104
8097
4d6cc7bb3426 Proxy: Log destuser in the "proxying" line if it's different from username.
Timo Sirainen <tss@iki.fi>
parents: 7927
diff changeset
105 str = t_str_new(128);
4d6cc7bb3426 Proxy: Log destuser in the "proxying" line if it's different from username.
Timo Sirainen <tss@iki.fi>
parents: 7927
diff changeset
106 str_printfa(str, "proxy(%s): started proxying to %s:%u",
4d6cc7bb3426 Proxy: Log destuser in the "proxying" line if it's different from username.
Timo Sirainen <tss@iki.fi>
parents: 7927
diff changeset
107 client->common.virtual_user,
4d6cc7bb3426 Proxy: Log destuser in the "proxying" line if it's different from username.
Timo Sirainen <tss@iki.fi>
parents: 7927
diff changeset
108 login_proxy_get_host(client->proxy),
4d6cc7bb3426 Proxy: Log destuser in the "proxying" line if it's different from username.
Timo Sirainen <tss@iki.fi>
parents: 7927
diff changeset
109 login_proxy_get_port(client->proxy));
4d6cc7bb3426 Proxy: Log destuser in the "proxying" line if it's different from username.
Timo Sirainen <tss@iki.fi>
parents: 7927
diff changeset
110 if (strcmp(client->common.virtual_user,
4d6cc7bb3426 Proxy: Log destuser in the "proxying" line if it's different from username.
Timo Sirainen <tss@iki.fi>
parents: 7927
diff changeset
111 client->proxy_user) != 0) {
4d6cc7bb3426 Proxy: Log destuser in the "proxying" line if it's different from username.
Timo Sirainen <tss@iki.fi>
parents: 7927
diff changeset
112 /* remote username is different, log it */
4d6cc7bb3426 Proxy: Log destuser in the "proxying" line if it's different from username.
Timo Sirainen <tss@iki.fi>
parents: 7927
diff changeset
113 str_append_c(str, '/');
4d6cc7bb3426 Proxy: Log destuser in the "proxying" line if it's different from username.
Timo Sirainen <tss@iki.fi>
parents: 7927
diff changeset
114 str_append(str, client->proxy_user);
4d6cc7bb3426 Proxy: Log destuser in the "proxying" line if it's different from username.
Timo Sirainen <tss@iki.fi>
parents: 7927
diff changeset
115 }
5046
f2cc68a3a198 Log the proxy destination host:port.
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
116
7927
2351a81ce699 If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents: 7454
diff changeset
117 login_proxy_detach(client->proxy, client->common.input,
2835
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
118 client->output);
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
119
2835
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
120 client->proxy = NULL;
7927
2351a81ce699 If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents: 7454
diff changeset
121 client->common.input = NULL;
2835
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
122 client->output = NULL;
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
123 client->common.fd = -1;
8097
4d6cc7bb3426 Proxy: Log destuser in the "proxying" line if it's different from username.
Timo Sirainen <tss@iki.fi>
parents: 7927
diff changeset
124 client_destroy_success(client, str_c(str));
2835
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
125 return;
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
126 }
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
127
7216
56f8ac7a3a77 If proxy fails to log in to the backend server, forward the error message
Timo Sirainen <tss@iki.fi>
parents: 7117
diff changeset
128 /* Login failed. Pass through the error message to client
56f8ac7a3a77 If proxy fails to log in to the backend server, forward the error message
Timo Sirainen <tss@iki.fi>
parents: 7117
diff changeset
129 (see imap-proxy code for potential problems with this) */
56f8ac7a3a77 If proxy fails to log in to the backend server, forward the error message
Timo Sirainen <tss@iki.fi>
parents: 7117
diff changeset
130 if (strncmp(line, "-ERR ", 5) != 0)
56f8ac7a3a77 If proxy fails to log in to the backend server, forward the error message
Timo Sirainen <tss@iki.fi>
parents: 7117
diff changeset
131 client_send_line(client, "-ERR "AUTH_FAILED_MSG);
56f8ac7a3a77 If proxy fails to log in to the backend server, forward the error message
Timo Sirainen <tss@iki.fi>
parents: 7117
diff changeset
132 else
56f8ac7a3a77 If proxy fails to log in to the backend server, forward the error message
Timo Sirainen <tss@iki.fi>
parents: 7117
diff changeset
133 client_send_line(client, line);
2785
fc4b1ec1b3ef Use USER/PASS instad for AUTH PLAIN. Also don't require "+OK" to have
Timo Sirainen <tss@iki.fi>
parents: 2783
diff changeset
134
2835
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
135 /* allow client input again */
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
136 i_assert(client->io == NULL);
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
137 client->io = io_add(client->common.fd, IO_READ,
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
138 client_input, client);
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
139
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
140 login_proxy_free(client->proxy);
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
141 client->proxy = NULL;
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
142
2835
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
143 if (client->proxy_password != NULL) {
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
144 safe_memset(client->proxy_password, 0,
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
145 strlen(client->proxy_password));
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
146 i_free(client->proxy_password);
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
147 client->proxy_password = NULL;
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
148 }
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
149
2835
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
150 i_free(client->proxy_user);
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
151 client->proxy_user = NULL;
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
152 }
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
153
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 int pop3_proxy_new(struct pop3_client *client, const char *host,
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 unsigned int port, const char *user, const char *password)
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 {
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 i_assert(user != NULL);
4770
88c29111fcee Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents: 4669
diff changeset
158 i_assert(!client->destroyed);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 if (password == NULL) {
7117
769181a20483 Make sure all user input is sanitized before it's logged.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
161 client_syslog(&client->common, "proxy: password not given");
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 return -1;
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 }
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164
4560
507088c0d511 Fixes for handling near-full connection queues.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
165 i_assert(client->refcount > 1);
507088c0d511 Fixes for handling near-full connection queues.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
166 connection_queue_add(1);
507088c0d511 Fixes for handling near-full connection queues.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
167
4770
88c29111fcee Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents: 4669
diff changeset
168 if (client->destroyed) {
88c29111fcee Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents: 4669
diff changeset
169 /* connection_queue_add() decided that we were the oldest
88c29111fcee Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents: 4669
diff changeset
170 connection and killed us. */
88c29111fcee Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents: 4669
diff changeset
171 return -1;
88c29111fcee Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents: 4669
diff changeset
172 }
88c29111fcee Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents: 4669
diff changeset
173
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
174 client->proxy = login_proxy_new(&client->common, host, port,
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
175 proxy_input, client);
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
176 if (client->proxy == NULL)
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 return -1;
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178
2835
39c315e7697d Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 2786
diff changeset
179 client->proxy_state = 0;
2773
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
180 client->proxy_user = i_strdup(user);
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
181 client->proxy_password = i_strdup(password);
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
182
e624a9ad6a30 More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents: 2768
diff changeset
183 /* disable input until authentication is finished */
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3082
diff changeset
184 if (client->io != NULL)
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3082
diff changeset
185 io_remove(&client->io);
2768
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 return 0;
d344be0bb70f Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 }