Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/pop3-login/pop3-proxy.c @ 8999:afc1b0ef120d HEAD
When :MAILBOXDIR= was empty, we might have appended extra '/' to it, which caused problems.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 30 Apr 2009 20:00:09 -0400 |
parents | f43bebab3dac |
children | e3ccd235a7e5 |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
8583
diff
changeset
|
1 /* Copyright (c) 2004-2009 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 |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
14 #define PROXY_FAILURE_MSG "-ERR [IN-USE] "AUTH_TEMP_FAILED_MSG |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
15 |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
16 static void proxy_free_password(struct pop3_client *client) |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
17 { |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
18 if (client->proxy_password == NULL) |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
19 return; |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
20 |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
21 safe_memset(client->proxy_password, 0, strlen(client->proxy_password)); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
22 i_free_and_null(client->proxy_password); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
23 } |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
24 |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
25 static void proxy_failed(struct pop3_client *client, bool send_line) |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
26 { |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
27 if (send_line) |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
28 client_send_line(client, PROXY_FAILURE_MSG); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
29 |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
30 login_proxy_free(&client->proxy); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
31 proxy_free_password(client); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
32 i_free_and_null(client->proxy_user); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
33 i_free_and_null(client->proxy_master_user); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
34 |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
35 /* call this last - it may destroy the client */ |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
36 client_auth_failed(client, TRUE); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
37 } |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
38 |
8546
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
39 static void get_plain_auth(struct pop3_client *client, string_t *dest) |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
40 { |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
41 string_t *str; |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
42 |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
43 str = t_str_new(128); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
44 str_append(str, client->proxy_user); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
45 str_append_c(str, '\0'); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
46 str_append(str, client->proxy_master_user); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
47 str_append_c(str, '\0'); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
48 str_append(str, client->proxy_password); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
49 base64_encode(str_data(str), str_len(str), dest); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
50 } |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
51 |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
52 static void proxy_send_login(struct pop3_client *client, struct ostream *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
|
53 { |
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
|
54 string_t *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
|
55 |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
56 str = t_str_new(128); |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
57 if (client->proxy_master_user == NULL) { |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
58 /* send USER command */ |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
59 str_append(str, "USER "); |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
60 str_append(str, client->proxy_user); |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
61 str_append(str, "\r\n"); |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
62 } else { |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
63 /* master user login - use AUTH PLAIN. */ |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
64 str_append(str, "AUTH PLAIN\r\n"); |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
65 } |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
66 (void)o_stream_send(output, str_data(str), str_len(str)); |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
67 client->proxy_state = POP3_PROXY_LOGIN1; |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
68 } |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
69 |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
70 static int proxy_input_line(struct pop3_client *client, const char *line) |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
71 { |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
72 struct ostream *output; |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
73 enum login_proxy_ssl_flags ssl_flags; |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
74 string_t *str; |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
75 |
5138
20302f49eda3
Don't crash if the remote server disconnects before we're logged in.
Timo Sirainen <tss@iki.fi>
parents:
5046
diff
changeset
|
76 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
|
77 |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
78 output = login_proxy_get_ostream(client->proxy); |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
79 switch (client->proxy_state) { |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
80 case POP3_PROXY_BANNER: |
2773
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
81 /* 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
|
82 if (strncmp(line, "+OK", 3) != 0) { |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
83 client_syslog_err(&client->common, t_strdup_printf( |
7117
769181a20483
Make sure all user input is sanitized before it's logged.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
84 "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
|
85 str_sanitize(line, 160))); |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
86 proxy_failed(client, TRUE); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
87 return -1; |
2773
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
88 } |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
89 |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
90 ssl_flags = login_proxy_get_ssl_flags(client->proxy); |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
91 if ((ssl_flags & PROXY_SSL_FLAG_STARTTLS) == 0) { |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
92 proxy_send_login(client, output); |
8546
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
93 } else { |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
94 (void)o_stream_send_str(output, "STLS\r\n"); |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
95 client->proxy_state = POP3_PROXY_STARTTLS; |
8546
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
96 } |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
97 return 0; |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
98 case POP3_PROXY_STARTTLS: |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
99 if (strncmp(line, "+OK", 3) != 0) { |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
100 client_syslog_err(&client->common, t_strdup_printf( |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
101 "proxy: Remote STLS failed: %s", |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
102 str_sanitize(line, 160))); |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
103 proxy_failed(client, TRUE); |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
104 return -1; |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
105 } |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
106 if (login_proxy_starttls(client->proxy) < 0) { |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
107 proxy_failed(client, TRUE); |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
108 return -1; |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
109 } |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
110 /* i/ostreams changed. */ |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
111 output = login_proxy_get_ostream(client->proxy); |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
112 proxy_send_login(client, output); |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
113 return 1; |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
114 case POP3_PROXY_LOGIN1: |
8546
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
115 str = t_str_new(128); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
116 if (client->proxy_master_user == NULL) { |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
117 if (strncmp(line, "+OK", 3) != 0) |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
118 break; |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
119 |
8546
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
120 /* USER successful, send PASS */ |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
121 str_append(str, "PASS "); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
122 str_append(str, client->proxy_password); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
123 str_append(str, "\r\n"); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
124 } else { |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
125 if (*line != '+') |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
126 break; |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
127 /* AUTH successful, send the authentication data */ |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
128 get_plain_auth(client, str); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
129 str_append(str, "\r\n"); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
130 } |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
131 (void)o_stream_send(output, str_data(str), str_len(str)); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
132 proxy_free_password(client); |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
133 client->proxy_state = POP3_PROXY_LOGIN2; |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
134 return 0; |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
135 case POP3_PROXY_LOGIN2: |
2850
4e5b1a1494c5
Check that PASS replies with OK.
Timo Sirainen <tss@iki.fi>
parents:
2835
diff
changeset
|
136 if (strncmp(line, "+OK", 3) != 0) |
4e5b1a1494c5
Check that PASS replies with OK.
Timo Sirainen <tss@iki.fi>
parents:
2835
diff
changeset
|
137 break; |
4e5b1a1494c5
Check that PASS replies with OK.
Timo Sirainen <tss@iki.fi>
parents:
2835
diff
changeset
|
138 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
139 /* 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
|
140 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
|
141 (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
|
142 |
8097
4d6cc7bb3426
Proxy: Log destuser in the "proxying" line if it's different from username.
Timo Sirainen <tss@iki.fi>
parents:
7927
diff
changeset
|
143 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
|
144 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
|
145 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
|
146 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
|
147 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
|
148 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
|
149 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
|
150 /* 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
|
151 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
|
152 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
|
153 } |
8546
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
154 if (client->proxy_master_user != NULL) { |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
155 str_printfa(str, " (master %s)", |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
156 client->proxy_master_user); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
157 } |
5046
f2cc68a3a198
Log the proxy destination host:port.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
158 |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7454
diff
changeset
|
159 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
|
160 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
|
161 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
162 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
|
163 client->common.input = NULL; |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
164 client->output = NULL; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
165 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
|
166 client_destroy_success(client, str_c(str)); |
8775
98e1115cd8f0
pop3-login: Don't crash after successful login.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
167 return 1; |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
168 } |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
169 |
8926
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
170 /* Login failed. Pass through the error message to client. |
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
171 |
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
172 If the backend server isn't Dovecot, the error message may |
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
173 be different from Dovecot's "user doesn't exist" error. This |
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
174 would allow an attacker to find out what users exist in the |
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
175 system. |
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
176 |
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
177 The optimal way to handle this would be to replace the |
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
178 backend's "password failed" error message with Dovecot's |
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
179 AUTH_FAILED_MSG, but this would require a new setting and |
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
180 the sysadmin to actually bother setting it properly. |
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
181 |
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
182 So for now we'll just forward the error message. This |
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
183 shouldn't be a real problem since of course everyone will |
415089905616
imap-login: Use [resp-codes] to figure out when to replace remote's auth failed message with ours.
Timo Sirainen <tss@iki.fi>
parents:
8775
diff
changeset
|
184 be using only Dovecot as their backend :) */ |
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
|
185 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
|
186 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
|
187 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
|
188 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
|
189 |
8123
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
190 if (verbose_auth) { |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
191 str = t_str_new(128); |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
192 str_printfa(str, "proxy(%s): Login failed to %s:%u", |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
193 client->common.virtual_user, |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
194 login_proxy_get_host(client->proxy), |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
195 login_proxy_get_port(client->proxy)); |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
196 if (strcmp(client->common.virtual_user, |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
197 client->proxy_user) != 0) { |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
198 /* remote username is different, log it */ |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
199 str_append_c(str, '/'); |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
200 str_append(str, client->proxy_user); |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
201 } |
8546
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
202 if (client->proxy_master_user != NULL) { |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
203 str_printfa(str, " (master %s)", |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
204 client->proxy_master_user); |
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
205 } |
8123
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
206 str_append(str, ": "); |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
207 if (strncmp(line, "-ERR ", 5) == 0) |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
208 str_append(str, line + 5); |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
209 else |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
210 str_append(str, line); |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
211 i_info("%s", str_c(str)); |
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
212 } |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
213 proxy_failed(client, FALSE); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
214 return -1; |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
215 } |
8123
26b67708b365
imap/pop3-proxy: If auth_verbose=yes, log proxy login failures.
Timo Sirainen <tss@iki.fi>
parents:
8097
diff
changeset
|
216 |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
217 static void proxy_input(struct pop3_client *client) |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
218 { |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
219 struct istream *input; |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
220 const char *line; |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
221 |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
222 if (client->proxy == NULL) { |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
223 /* we're just freeing the proxy */ |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
224 return; |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
225 } |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
226 |
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
227 input = login_proxy_get_istream(client->proxy); |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
228 if (input == NULL) { |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
229 if (client->destroyed) { |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
230 /* we came here from client_destroy() */ |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
231 return; |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
232 } |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
233 |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
234 /* failed for some reason, probably server disconnected */ |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
235 proxy_failed(client, TRUE); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
236 return; |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
237 } |
2773
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
238 |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
239 i_assert(!client->destroyed); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
240 |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
241 switch (i_stream_read(input)) { |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
242 case -2: |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
243 client_syslog_err(&client->common, |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
244 "proxy: Remote input buffer full"); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
245 proxy_failed(client, TRUE); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
246 return; |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
247 case -1: |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
248 client_syslog_err(&client->common, |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
249 "proxy: Remote disconnected"); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
250 proxy_failed(client, TRUE); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
251 return; |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
252 } |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
253 |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
254 while ((line = i_stream_next_line(input)) != NULL) { |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
255 if (proxy_input_line(client, line) != 0) |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
256 break; |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
257 } |
2773
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
258 } |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
259 |
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 int pop3_proxy_new(struct pop3_client *client, const char *host, |
8546
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
261 unsigned int port, const char *user, const char *master_user, |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
262 const char *password, enum login_proxy_ssl_flags ssl_flags) |
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 { |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 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
|
265 i_assert(!client->destroyed); |
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 if (password == NULL) { |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
268 client_syslog_err(&client->common, "proxy: password not given"); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
269 client_send_line(client, PROXY_FAILURE_MSG); |
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 return -1; |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 } |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 |
4560
507088c0d511
Fixes for handling near-full connection queues.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
273 i_assert(client->refcount > 1); |
507088c0d511
Fixes for handling near-full connection queues.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
274 connection_queue_add(1); |
507088c0d511
Fixes for handling near-full connection queues.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
275 |
4770
88c29111fcee
Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents:
4669
diff
changeset
|
276 if (client->destroyed) { |
88c29111fcee
Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents:
4669
diff
changeset
|
277 /* 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
|
278 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
|
279 return -1; |
88c29111fcee
Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents:
4669
diff
changeset
|
280 } |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
281 if (login_proxy_is_ourself(&client->common, host, port, user)) { |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
282 client_syslog_err(&client->common, "Proxying loops to itself"); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
283 client_send_line(client, PROXY_FAILURE_MSG); |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
284 return -1; |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
285 } |
4770
88c29111fcee
Crashfixes and more asserts. Mostly related to use of AUTHENTICATE/AUTH
Timo Sirainen <tss@iki.fi>
parents:
4669
diff
changeset
|
286 |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
287 client->proxy = login_proxy_new(&client->common, host, port, ssl_flags, |
2773
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
288 proxy_input, client); |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
289 if (client->proxy == NULL) { |
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
290 client_send_line(client, PROXY_FAILURE_MSG); |
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 return -1; |
8583
2ff2cac3578b
imap/pop3-login: Cleaned up proxying code. Don't disconnect client on proxy failures.
Timo Sirainen <tss@iki.fi>
parents:
8546
diff
changeset
|
292 } |
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 |
8985
f43bebab3dac
imap/pop3 proxy: Support SSL/TLS connections to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
8926
diff
changeset
|
294 client->proxy_state = POP3_PROXY_BANNER; |
2773
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
295 client->proxy_user = i_strdup(user); |
8546
50f49805b13b
imap/pop3 proxy: Support master user logins.
Timo Sirainen <tss@iki.fi>
parents:
8123
diff
changeset
|
296 client->proxy_master_user = i_strdup(master_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
|
297 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
|
298 |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
299 /* 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
|
300 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
|
301 io_remove(&client->io); |
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 return 0; |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 } |