Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/pop3-login/pop3-proxy.c @ 4669:d84a7bd63862 HEAD
Reference counter fixing for client while it's being used in login proxy.
Fixes crashes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 14 Oct 2006 02:11:04 +0300 |
parents | 507088c0d511 |
children | 88c29111fcee |
rev | line source |
---|---|
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (C) 2004 Timo Sirainen */ |
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" |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "client.h" |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include "pop3-proxy.h" |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
2773
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
13 static void proxy_input(struct istream *input, struct ostream *output, |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
14 void *context) |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
15 { |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
16 struct pop3_client *client = context; |
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; |
2773
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
18 const char *line; |
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 |
3054
a5dbe1e56c07
proxy: When we can't connect to remote server, show "Temporary login
Timo Sirainen <tss@iki.fi>
parents:
2850
diff
changeset
|
27 /* 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
|
28 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
|
29 "-ERR [IN-USE] Temporary login failure."); |
3054
a5dbe1e56c07
proxy: When we can't connect to remote server, show "Temporary login
Timo Sirainen <tss@iki.fi>
parents:
2850
diff
changeset
|
30 client_destroy(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
|
31 return; |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
32 } |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
33 |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
34 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
|
35 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
|
36 /* buffer full */ |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
37 i_error("pop-proxy(%s): Remote input buffer full", |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
38 client->common.virtual_user); |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
39 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
|
40 return; |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
41 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
|
42 /* disconnected */ |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
43 client_destroy(client, "Proxy: Remote disconnected"); |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
44 return; |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
45 } |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
46 |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
47 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
|
48 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
|
49 return; |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
50 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
51 switch (client->proxy_state) { |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
52 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
|
53 /* 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
|
54 if (strncmp(line, "+OK", 3) != 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
|
55 i_error("pop3-proxy(%s): " |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
56 "Remote returned invalid banner: %s", |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
57 client->common.virtual_user, line); |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
58 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
|
59 return; |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
60 } |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
61 |
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
|
62 /* 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
|
63 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
|
64 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
|
65 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
|
66 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
|
67 (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
|
68 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
69 client->proxy_state++; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
70 return; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
71 case 1: |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
72 if (strncmp(line, "+OK", 3) != 0) |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
73 break; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
74 |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
75 /* USER successful, send PASS */ |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
76 str = t_str_new(128); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
77 str_append(str, "PASS "); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
78 str_append(str, client->proxy_password); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
79 str_append(str, "\r\n"); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
80 (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
|
81 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
|
82 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
83 safe_memset(client->proxy_password, 0, |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
84 strlen(client->proxy_password)); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
85 i_free(client->proxy_password); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
86 client->proxy_password = NULL; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
87 |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
88 client->proxy_state++; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
89 return; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
90 case 2: |
2850
4e5b1a1494c5
Check that PASS replies with OK.
Timo Sirainen <tss@iki.fi>
parents:
2835
diff
changeset
|
91 if (strncmp(line, "+OK", 3) != 0) |
4e5b1a1494c5
Check that PASS replies with OK.
Timo Sirainen <tss@iki.fi>
parents:
2835
diff
changeset
|
92 break; |
4e5b1a1494c5
Check that PASS replies with OK.
Timo Sirainen <tss@iki.fi>
parents:
2835
diff
changeset
|
93 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
94 /* Login successful. Send this line to client. */ |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
95 (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
|
96 (void)o_stream_send(client->output, "\r\n", 2); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
97 |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
98 login_proxy_detach(client->proxy, client->input, |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
99 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
|
100 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
101 client->proxy = NULL; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
102 client->input = NULL; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
103 client->output = NULL; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
104 client->common.fd = -1; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
105 client_destroy(client, |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
106 t_strdup_printf("proxy(%s): started", |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
107 client->common.virtual_user)); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
108 return; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
109 } |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
110 |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
111 /* Login failed. Send our own failure reply so client can't |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
112 figure out if user exists or not just by looking at the |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
113 reply string. */ |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
114 client_send_line(client, "-ERR "AUTH_FAILED_MSG); |
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
|
115 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
116 /* allow client input again */ |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
117 i_assert(client->io == NULL); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
118 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
|
119 client_input, client); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
120 |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
121 login_proxy_free(client->proxy); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
122 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
|
123 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
124 if (client->proxy_password != NULL) { |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
125 safe_memset(client->proxy_password, 0, |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
126 strlen(client->proxy_password)); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
127 i_free(client->proxy_password); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
128 client->proxy_password = NULL; |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
129 } |
2773
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
130 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
131 i_free(client->proxy_user); |
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
132 client->proxy_user = NULL; |
4669
d84a7bd63862
Reference counter fixing for client while it's being used in login proxy.
Timo Sirainen <tss@iki.fi>
parents:
4560
diff
changeset
|
133 |
d84a7bd63862
Reference counter fixing for client while it's being used in login proxy.
Timo Sirainen <tss@iki.fi>
parents:
4560
diff
changeset
|
134 client_unref(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
|
135 } |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
136 |
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 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
|
138 unsigned int port, const char *user, const char *password) |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 { |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 i_assert(user != NULL); |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 if (password == NULL) { |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 i_error("proxy(%s): password not given", |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 client->common.virtual_user); |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 return -1; |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 } |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 |
4560
507088c0d511
Fixes for handling near-full connection queues.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
148 i_assert(client->refcount > 1); |
507088c0d511
Fixes for handling near-full connection queues.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
149 connection_queue_add(1); |
507088c0d511
Fixes for handling near-full connection queues.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
150 |
4669
d84a7bd63862
Reference counter fixing for client while it's being used in login proxy.
Timo Sirainen <tss@iki.fi>
parents:
4560
diff
changeset
|
151 client_ref(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
|
152 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
|
153 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
|
154 if (client->proxy == NULL) |
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 |
2835
39c315e7697d
Keep proxy_user stored until proxy is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
2786
diff
changeset
|
157 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
|
158 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
|
159 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
|
160 |
e624a9ad6a30
More smart IMAP and POP3 proxies. Now if remote login fails, it just
Timo Sirainen <tss@iki.fi>
parents:
2768
diff
changeset
|
161 /* 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
|
162 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
|
163 io_remove(&client->io); |
2768
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 return 0; |
d344be0bb70f
Added IMAP and POP3 proxying support.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 } |