Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/pop3-login/pop3-proxy.c @ 7927:2351a81ce699 HEAD
If commands are pipelined after the login command, pass them to the
IMAP/POP3 process so it can process the command instead of discarding it.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 21 Jun 2008 12:23:08 +0300 |
parents | 053ec63146cb |
children | 4d6cc7bb3426 |
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; |
5046
f2cc68a3a198
Log the proxy destination host:port.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
18 const char *line, *msg; |
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 |
5046
f2cc68a3a198
Log the proxy destination host:port.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
105 msg = t_strdup_printf("proxy(%s): started proxying to %s:%u", |
f2cc68a3a198
Log the proxy destination host:port.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
106 client->common.virtual_user, |
f2cc68a3a198
Log the proxy destination host:port.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
107 login_proxy_get_host(client->proxy), |
f2cc68a3a198
Log the proxy destination host:port.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
108 login_proxy_get_port(client->proxy)); |
f2cc68a3a198
Log the proxy destination host:port.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
109 |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7454
diff
changeset
|
110 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
|
111 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
|
112 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
113 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
|
114 client->common.input = NULL; |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
115 client->output = NULL; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
116 client->common.fd = -1; |
7438
65fbb6226141
Log clearly with "auth failed, # attempts" if user gets disconnected before
Timo Sirainen <tss@iki.fi>
parents:
7216
diff
changeset
|
117 client_destroy_success(client, msg); |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
118 return; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
119 } |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
120 |
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
|
121 /* 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
|
122 (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
|
123 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
|
124 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
|
125 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
|
126 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
|
127 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
128 /* allow client input again */ |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
129 i_assert(client->io == NULL); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
130 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
|
131 client_input, client); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
132 |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
133 login_proxy_free(client->proxy); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
134 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
|
135 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
136 if (client->proxy_password != NULL) { |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
137 safe_memset(client->proxy_password, 0, |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
138 strlen(client->proxy_password)); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
139 i_free(client->proxy_password); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
140 client->proxy_password = NULL; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
141 } |
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 i_free(client->proxy_user); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
144 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
|
145 } |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
146 |
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 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
|
148 unsigned int port, const char *user, const char *password) |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 { |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 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
|
151 i_assert(!client->destroyed); |
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 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
|
154 client_syslog(&client->common, "proxy: password not given"); |
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 return -1; |
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 |
4560
507088c0d511
Fixes for handling near-full connection queues.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
158 i_assert(client->refcount > 1); |
507088c0d511
Fixes for handling near-full connection queues.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
159 connection_queue_add(1); |
507088c0d511
Fixes for handling near-full connection queues.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
160 |
4770
88c29111fcee
Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents:
4669
diff
changeset
|
161 if (client->destroyed) { |
88c29111fcee
Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents:
4669
diff
changeset
|
162 /* 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
|
163 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
|
164 return -1; |
88c29111fcee
Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents:
4669
diff
changeset
|
165 } |
88c29111fcee
Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents:
4669
diff
changeset
|
166 |
2773
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
167 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
|
168 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
|
169 if (client->proxy == NULL) |
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 return -1; |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
172 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
|
173 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
|
174 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
|
175 |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
176 /* 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
|
177 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
|
178 io_remove(&client->io); |
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 return 0; |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 } |