Mercurial > dovecot > core-2.2
annotate src/pop3-login/client.c @ 22715:20415dd0b85a
dsync: Add per-mailbox sync lock that is always used.
Both importing and exporting gets the lock before they even sync the
mailbox. The lock is kept until the import/export finishes. This guarantees
that no matter how dsync is run, two dsyncs can't be working on the same
mailbox at the same time.
This lock is in addition to the optional per-user lock enabled by the -l
parameter. If the -l parameter is used, the same lock timeout is used for
the per-mailbox lock. Otherwise 30s timeout is used.
This should help to avoid email duplication when replication is enabled for
public namespaces, and maybe in some other rare situations as well.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 28 Dec 2017 14:10:23 +0200 |
parents | cb108f786fb4 |
children |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22242
diff
changeset
|
1 /* Copyright (c) 2002-2018 Dovecot authors, see the included COPYING file */ |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
10549
9ae939146ff7
login-common: Renamed common.h to login-common.h
Timo Sirainen <tss@iki.fi>
parents:
10404
diff
changeset
|
3 #include "login-common.h" |
2622
033d2fd1cd38
Replaced timestamp in APOP challenge with 128 bits of randomness.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
4 #include "base64.h" |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "buffer.h" |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "ioloop.h" |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "istream.h" |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "ostream.h" |
2622
033d2fd1cd38
Replaced timestamp in APOP challenge with 128 bits of randomness.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
9 #include "randgen.h" |
10111
9a71228ea41c
imap-login: If imap_capability is set, use it.
Timo Sirainen <tss@iki.fi>
parents:
10037
diff
changeset
|
10 #include "hostpid.h" |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include "safe-memset.h" |
9754
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
12 #include "str.h" |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include "strescape.h" |
10171
7f0ccd367351
Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents:
10170
diff
changeset
|
14 #include "master-service.h" |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include "client.h" |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #include "client-authenticate.h" |
1702
43815588dd6b
Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents:
1499
diff
changeset
|
17 #include "auth-client.h" |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 #include "ssl-proxy.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
|
19 #include "pop3-proxy.h" |
10111
9a71228ea41c
imap-login: If imap_capability is set, use it.
Timo Sirainen <tss@iki.fi>
parents:
10037
diff
changeset
|
20 #include "pop3-login-settings.h" |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 /* Disconnect client when it sends too many bad commands */ |
18295
2589f9c5cc04
pop3-login: Disconnect client on 3rd invalid command (not 11th).
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
23 #define CLIENT_MAX_BAD_COMMANDS 3 |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3581
diff
changeset
|
25 static bool cmd_stls(struct pop3_client *client) |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 { |
14146
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
27 client_cmd_starttls(&client->common); |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 return TRUE; |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 } |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3581
diff
changeset
|
31 static bool cmd_quit(struct pop3_client *client) |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 { |
14146
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
33 client_send_reply(&client->common, POP3_CMD_REPLY_OK, "Logging out"); |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
34 client_destroy(&client->common, "Aborted login"); |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 return TRUE; |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 } |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 |
14209
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
38 static bool cmd_xclient(struct pop3_client *client, const char *args) |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
39 { |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
40 const char *const *tmp; |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18893
diff
changeset
|
41 in_port_t remote_port; |
14209
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
42 bool args_ok = TRUE; |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
43 |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
44 if (!client->common.trusted) { |
19952
23e80adaf2ef
pop3-login: XCLIENT / XOIP no longer return -ERR for untrusted IP ranges.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
45 client_send_reply(&client->common, POP3_CMD_REPLY_OK, |
23e80adaf2ef
pop3-login: XCLIENT / XOIP no longer return -ERR for untrusted IP ranges.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
46 "You are not from trusted IP - ignoring"); |
14209
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
47 return TRUE; |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
48 } |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
49 for (tmp = t_strsplit(args, " "); *tmp != NULL; tmp++) { |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
50 if (strncasecmp(*tmp, "ADDR=", 5) == 0) { |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
51 if (net_addr2ip(*tmp + 5, &client->common.ip) < 0) |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
52 args_ok = FALSE; |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
53 } else if (strncasecmp(*tmp, "PORT=", 5) == 0) { |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18893
diff
changeset
|
54 if (net_str2port(*tmp + 5, &remote_port) < 0) |
14209
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
55 args_ok = FALSE; |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
56 else |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
57 client->common.remote_port = remote_port; |
14302
5bbcf636bbeb
Added a "session ID" string for imap/pop3 connections, available in %{session} variable.
Timo Sirainen <tss@iki.fi>
parents:
14209
diff
changeset
|
58 } else if (strncasecmp(*tmp, "SESSION=", 8) == 0) { |
18045
0a5bd3b09ca5
*-login: And actually make the previous changes work.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
59 const char *value = *tmp + 8; |
0a5bd3b09ca5
*-login: And actually make the previous changes work.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
60 |
0a5bd3b09ca5
*-login: And actually make the previous changes work.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
61 if (strlen(value) <= LOGIN_MAX_SESSION_ID_LEN) { |
0a5bd3b09ca5
*-login: And actually make the previous changes work.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
62 client->common.session_id = |
0a5bd3b09ca5
*-login: And actually make the previous changes work.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
63 p_strdup(client->common.pool, value); |
0a5bd3b09ca5
*-login: And actually make the previous changes work.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
64 } |
14162
ba06ea38c722
imap/pop3/lmtp proxy: Implemented detection of proxy loops with TTL.
Timo Sirainen <tss@iki.fi>
parents:
14152
diff
changeset
|
65 } else if (strncasecmp(*tmp, "TTL=", 4) == 0) { |
ba06ea38c722
imap/pop3/lmtp proxy: Implemented detection of proxy loops with TTL.
Timo Sirainen <tss@iki.fi>
parents:
14152
diff
changeset
|
66 if (str_to_uint(*tmp + 4, &client->common.proxy_ttl) < 0) |
ba06ea38c722
imap/pop3/lmtp proxy: Implemented detection of proxy loops with TTL.
Timo Sirainen <tss@iki.fi>
parents:
14152
diff
changeset
|
67 args_ok = FALSE; |
21775
347d2414ef01
pop3-login: Add FORWARD for XCLIENT
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21724
diff
changeset
|
68 } else if (strncasecmp(*tmp, "FORWARD=", 8) == 0) { |
347d2414ef01
pop3-login: Add FORWARD for XCLIENT
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21724
diff
changeset
|
69 size_t value_len = strlen((*tmp)+8); |
347d2414ef01
pop3-login: Add FORWARD for XCLIENT
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21724
diff
changeset
|
70 client->common.forward_fields = |
347d2414ef01
pop3-login: Add FORWARD for XCLIENT
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21724
diff
changeset
|
71 str_new(client->common.preproxy_pool, |
347d2414ef01
pop3-login: Add FORWARD for XCLIENT
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21724
diff
changeset
|
72 MAX_BASE64_DECODED_SIZE(value_len)); |
347d2414ef01
pop3-login: Add FORWARD for XCLIENT
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21724
diff
changeset
|
73 if (base64_decode((*tmp)+8, value_len, NULL, |
347d2414ef01
pop3-login: Add FORWARD for XCLIENT
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21724
diff
changeset
|
74 client->common.forward_fields) < 0) |
347d2414ef01
pop3-login: Add FORWARD for XCLIENT
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21724
diff
changeset
|
75 args_ok = FALSE; |
14209
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
76 } |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
77 } |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
78 if (!args_ok) { |
14152
eb1aecd05cea
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14146
diff
changeset
|
79 client_send_reply(&client->common, POP3_CMD_REPLY_ERROR, |
eb1aecd05cea
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14146
diff
changeset
|
80 "Invalid parameters"); |
14209
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
81 return TRUE; |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
82 } |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
83 |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
84 /* args ok, set them and reset the state */ |
14152
eb1aecd05cea
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14146
diff
changeset
|
85 client_send_reply(&client->common, POP3_CMD_REPLY_OK, "Updated"); |
14209
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
86 return TRUE; |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
87 } |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
88 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3581
diff
changeset
|
89 static bool client_command_execute(struct pop3_client *client, const char *cmd, |
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3581
diff
changeset
|
90 const char *args) |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 { |
2058
0a1755f79392
cleanup: str_*case(t_strdup_noconst(str)) -> t_str_*case(str)
Timo Sirainen <tss@iki.fi>
parents:
2027
diff
changeset
|
92 cmd = t_str_ucase(cmd); |
1059
d805c2f1d6a9
Support for CAPA command (rfc2449).
Timo Sirainen <tss@iki.fi>
parents:
1054
diff
changeset
|
93 if (strcmp(cmd, "CAPA") == 0) |
d805c2f1d6a9
Support for CAPA command (rfc2449).
Timo Sirainen <tss@iki.fi>
parents:
1054
diff
changeset
|
94 return cmd_capa(client, args); |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 if (strcmp(cmd, "USER") == 0) |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 return cmd_user(client, args); |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 if (strcmp(cmd, "PASS") == 0) |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 return cmd_pass(client, args); |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 if (strcmp(cmd, "AUTH") == 0) |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 return cmd_auth(client, args); |
2267
d2e186f716d8
Added APOP authentication for POP3. Patch by Andrey Panin.
Timo Sirainen <tss@iki.fi>
parents:
2097
diff
changeset
|
101 if (strcmp(cmd, "APOP") == 0) |
d2e186f716d8
Added APOP authentication for POP3. Patch by Andrey Panin.
Timo Sirainen <tss@iki.fi>
parents:
2097
diff
changeset
|
102 return cmd_apop(client, args); |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 if (strcmp(cmd, "STLS") == 0) |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 return cmd_stls(client); |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 if (strcmp(cmd, "QUIT") == 0) |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 return cmd_quit(client); |
14209
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
107 if (strcmp(cmd, "XCLIENT") == 0) |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
108 return cmd_xclient(client, args); |
18795
0bcd3e9e77d4
pop3-login: Added support for Zimbra proxy's XOIP command.
Timo Sirainen <tss@iki.fi>
parents:
18295
diff
changeset
|
109 if (strcmp(cmd, "XOIP") == 0) { |
0bcd3e9e77d4
pop3-login: Added support for Zimbra proxy's XOIP command.
Timo Sirainen <tss@iki.fi>
parents:
18295
diff
changeset
|
110 /* Compatibility with Zimbra's patched nginx */ |
0bcd3e9e77d4
pop3-login: Added support for Zimbra proxy's XOIP command.
Timo Sirainen <tss@iki.fi>
parents:
18295
diff
changeset
|
111 return cmd_xclient(client, t_strconcat("ADDR=", args, NULL)); |
0bcd3e9e77d4
pop3-login: Added support for Zimbra proxy's XOIP command.
Timo Sirainen <tss@iki.fi>
parents:
18295
diff
changeset
|
112 } |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 |
14146
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
114 client_send_reply(&client->common, POP3_CMD_REPLY_ERROR, |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
115 "Unknown command."); |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 return FALSE; |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 } |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
119 static void pop3_client_input(struct client *client) |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 { |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
121 i_assert(!client->authenticating); |
8350 | 122 |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 if (!client_read(client)) |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 return; |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 |
1714 | 126 client_ref(client); |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 o_stream_cork(client->output); |
8350 | 129 /* if a command starts an authentication, stop processing further |
130 commands until the authentication is finished. */ | |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
131 while (!client->output->closed && !client->authenticating && |
22240
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
132 auth_client_is_connected(auth_client)) { |
22241
5f3709d309b9
*-login: Add client_vfuncs.input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22240
diff
changeset
|
133 if (!client->v.input_next_cmd(client)) |
21518
ee615b26803d
pop3-login: Code cleanup - Make sure destroying client stops processing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
134 break; |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 } |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 |
10395
aba3cb15f082
pop3-login: Don't crash in QUIT command.
Timo Sirainen <tss@iki.fi>
parents:
10171
diff
changeset
|
137 if (auth_client != NULL && !auth_client_is_connected(auth_client)) |
10170
47fdfd49af13
*-login: Make sure input isn't being handled while not connected to auth process.
Timo Sirainen <tss@iki.fi>
parents:
10111
diff
changeset
|
138 client->input_blocked = TRUE; |
47fdfd49af13
*-login: Make sure input isn't being handled while not connected to auth process.
Timo Sirainen <tss@iki.fi>
parents:
10111
diff
changeset
|
139 |
9929
d60fa42fbaac
*-login: Fixes to SSL/login proxy connection counting.
Timo Sirainen <tss@iki.fi>
parents:
9781
diff
changeset
|
140 if (client_unref(&client)) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2289
diff
changeset
|
141 o_stream_uncork(client->output); |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 } |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 |
22240
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
144 static bool pop3_client_input_next_cmd(struct client *client) |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
145 { |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
146 struct pop3_client *pop3_client = (struct pop3_client *)client; |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
147 char *line, *args; |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
148 |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
149 if ((line = i_stream_next_line(client->input)) == NULL) |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
150 return FALSE; |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
151 |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
152 args = strchr(line, ' '); |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
153 if (args != NULL) |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
154 *args++ = '\0'; |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
155 |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
156 if (client_command_execute(pop3_client, line, |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
157 args != NULL ? args : "")) |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
158 client->bad_counter = 0; |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
159 else if (++client->bad_counter >= CLIENT_MAX_BAD_COMMANDS) { |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
160 client_send_reply(client, POP3_CMD_REPLY_ERROR, |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
161 "Too many invalid bad commands."); |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
162 client_destroy(client, |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
163 "Disconnected: Too many bad commands"); |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
164 return FALSE; |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
165 } |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
166 return TRUE; |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
167 } |
9e0fdc2a683e
pop3-login: Cleanup - move command handling to pop3_client_input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21970
diff
changeset
|
168 |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
169 static struct client *pop3_client_alloc(pool_t pool) |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 { |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
171 struct pop3_client *pop3_client; |
1897
1e6ed8045f2b
Changed hash_foreach() to iterator.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
172 |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
173 pop3_client = p_new(pool, struct pop3_client, 1); |
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
174 return &pop3_client->common; |
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
175 } |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 |
10111
9a71228ea41c
imap-login: If imap_capability is set, use it.
Timo Sirainen <tss@iki.fi>
parents:
10037
diff
changeset
|
177 static void pop3_client_create(struct client *client ATTR_UNUSED, |
9a71228ea41c
imap-login: If imap_capability is set, use it.
Timo Sirainen <tss@iki.fi>
parents:
10037
diff
changeset
|
178 void **other_sets ATTR_UNUSED) |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
179 { |
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
180 } |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
182 static void pop3_client_destroy(struct client *client) |
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
183 { |
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
184 struct pop3_client *pop3_client = (struct pop3_client *)client; |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 |
9765
935b9cfc1905
*-login: Call client_vfuncs.destroy() on client_destroy(), not on unref.
Timo Sirainen <tss@iki.fi>
parents:
9756
diff
changeset
|
186 i_free_and_null(pop3_client->last_user); |
935b9cfc1905
*-login: Call client_vfuncs.destroy() on client_destroy(), not on unref.
Timo Sirainen <tss@iki.fi>
parents:
9756
diff
changeset
|
187 i_free_and_null(pop3_client->apop_challenge); |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 } |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 |
2289 | 190 static char *get_apop_challenge(struct pop3_client *client) |
2267
d2e186f716d8
Added APOP authentication for POP3. Patch by Andrey Panin.
Timo Sirainen <tss@iki.fi>
parents:
2097
diff
changeset
|
191 { |
2622
033d2fd1cd38
Replaced timestamp in APOP challenge with 128 bits of randomness.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
192 unsigned char buffer[16]; |
10404
f8151445662e
Removed buffer_create_static_hard().
Timo Sirainen <tss@iki.fi>
parents:
10395
diff
changeset
|
193 unsigned char buffer_base64[MAX_BASE64_ENCODED_SIZE(sizeof(buffer)) + 1]; |
f8151445662e
Removed buffer_create_static_hard().
Timo Sirainen <tss@iki.fi>
parents:
10395
diff
changeset
|
194 buffer_t buf; |
2267
d2e186f716d8
Added APOP authentication for POP3. Patch by Andrey Panin.
Timo Sirainen <tss@iki.fi>
parents:
2097
diff
changeset
|
195 |
12012
eed1426f55a9
pop3: Show APOP challenge only when APOP auth mechanism is enabled.
Timo Sirainen <tss@iki.fi>
parents:
11156
diff
changeset
|
196 if (auth_client_find_mech(auth_client, "APOP") == NULL) { |
eed1426f55a9
pop3: Show APOP challenge only when APOP auth mechanism is enabled.
Timo Sirainen <tss@iki.fi>
parents:
11156
diff
changeset
|
197 /* disabled, no need to present the challenge */ |
eed1426f55a9
pop3: Show APOP challenge only when APOP auth mechanism is enabled.
Timo Sirainen <tss@iki.fi>
parents:
11156
diff
changeset
|
198 return NULL; |
eed1426f55a9
pop3: Show APOP challenge only when APOP auth mechanism is enabled.
Timo Sirainen <tss@iki.fi>
parents:
11156
diff
changeset
|
199 } |
eed1426f55a9
pop3: Show APOP challenge only when APOP auth mechanism is enabled.
Timo Sirainen <tss@iki.fi>
parents:
11156
diff
changeset
|
200 |
9984
097588a7903c
lib-auth: Changed API to connect to only a single specified auth socket.
Timo Sirainen <tss@iki.fi>
parents:
9929
diff
changeset
|
201 auth_client_get_connect_id(auth_client, &client->apop_server_pid, |
097588a7903c
lib-auth: Changed API to connect to only a single specified auth socket.
Timo Sirainen <tss@iki.fi>
parents:
9929
diff
changeset
|
202 &client->apop_connect_uid); |
2267
d2e186f716d8
Added APOP authentication for POP3. Patch by Andrey Panin.
Timo Sirainen <tss@iki.fi>
parents:
2097
diff
changeset
|
203 |
2622
033d2fd1cd38
Replaced timestamp in APOP challenge with 128 bits of randomness.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
204 random_fill(buffer, sizeof(buffer)); |
15034
7efef678bca8
Renamed buffer_create_*data() to buffer_create_from_*data() for consistency.
Timo Sirainen <tss@iki.fi>
parents:
14576
diff
changeset
|
205 buffer_create_from_data(&buf, buffer_base64, sizeof(buffer_base64)); |
10404
f8151445662e
Removed buffer_create_static_hard().
Timo Sirainen <tss@iki.fi>
parents:
10395
diff
changeset
|
206 base64_encode(buffer, sizeof(buffer), &buf); |
f8151445662e
Removed buffer_create_static_hard().
Timo Sirainen <tss@iki.fi>
parents:
10395
diff
changeset
|
207 buffer_append_c(&buf, '\0'); |
2622
033d2fd1cd38
Replaced timestamp in APOP challenge with 128 bits of randomness.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
208 |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6475
diff
changeset
|
209 return i_strdup_printf("<%x.%x.%lx.%s@%s>", |
9984
097588a7903c
lib-auth: Changed API to connect to only a single specified auth socket.
Timo Sirainen <tss@iki.fi>
parents:
9929
diff
changeset
|
210 client->apop_server_pid, |
097588a7903c
lib-auth: Changed API to connect to only a single specified auth socket.
Timo Sirainen <tss@iki.fi>
parents:
9929
diff
changeset
|
211 client->apop_connect_uid, |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6475
diff
changeset
|
212 (unsigned long)ioloop_time, |
10404
f8151445662e
Removed buffer_create_static_hard().
Timo Sirainen <tss@iki.fi>
parents:
10395
diff
changeset
|
213 (const char *)buf.data, my_hostname); |
2267
d2e186f716d8
Added APOP authentication for POP3. Patch by Andrey Panin.
Timo Sirainen <tss@iki.fi>
parents:
2097
diff
changeset
|
214 } |
d2e186f716d8
Added APOP authentication for POP3. Patch by Andrey Panin.
Timo Sirainen <tss@iki.fi>
parents:
2097
diff
changeset
|
215 |
14146
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
216 static void pop3_client_notify_auth_ready(struct client *client) |
7099
3f5b7bebfd82
Use separate per-client timeouts instead of going through all clients in one
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
217 { |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
218 struct pop3_client *pop3_client = (struct pop3_client *)client; |
14209
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
219 string_t *str; |
7099
3f5b7bebfd82
Use separate per-client timeouts instead of going through all clients in one
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
220 |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
221 client->io = io_add(client->fd, IO_READ, client_input, client); |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 |
14209
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
223 str = t_str_new(128); |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
224 if (client->trusted) { |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
225 /* Dovecot extension to avoid extra roundtrip for CAPA */ |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
226 str_append(str, "[XCLIENT] "); |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
227 } |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
228 str_append(str, client->set->login_greeting); |
14226
864187d19761
pop3-login: Fixed APOP authentication, broken by recent changes.
Timo Sirainen <tss@iki.fi>
parents:
14217
diff
changeset
|
229 |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
230 pop3_client->apop_challenge = get_apop_challenge(pop3_client); |
14209
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
231 if (pop3_client->apop_challenge != NULL) |
35ed77dd500e
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
232 str_printfa(str, " %s", pop3_client->apop_challenge); |
14152
eb1aecd05cea
pop3-login: Implemented XCLIENT command for forwarding client ip/port from proxy.
Timo Sirainen <tss@iki.fi>
parents:
14146
diff
changeset
|
233 client_send_reply(client, POP3_CMD_REPLY_OK, str_c(str)); |
21909
57ce096eab4b
*-login: Minor logging cleanup if client is disconnected before sending banner.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21775
diff
changeset
|
234 |
57ce096eab4b
*-login: Minor logging cleanup if client is disconnected before sending banner.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21775
diff
changeset
|
235 client->banner_sent = TRUE; |
14146
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
236 } |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
237 |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
238 static void |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
239 pop3_client_notify_starttls(struct client *client, |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
240 bool success, const char *text) |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
241 { |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
242 if (success) |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
243 client_send_reply(client, POP3_CMD_REPLY_OK, text); |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
244 else |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
245 client_send_reply(client, POP3_CMD_REPLY_ERROR, text); |
7438
65fbb6226141
Log clearly with "auth failed, # attempts" if user gets disconnected before
Timo Sirainen <tss@iki.fi>
parents:
7137
diff
changeset
|
246 } |
65fbb6226141
Log clearly with "auth failed, # attempts" if user gets disconnected before
Timo Sirainen <tss@iki.fi>
parents:
7137
diff
changeset
|
247 |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
248 static void pop3_client_starttls(struct client *client ATTR_UNUSED) |
1049
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 { |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 } |
c41787e8c3f4
Moved common login process code to login-common, created pop3-login.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 |
14146
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
252 void client_send_reply(struct client *client, enum pop3_cmd_reply reply, |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
253 const char *text) |
9754
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
254 { |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
255 const char *prefix = "-ERR"; |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
256 |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
257 switch (reply) { |
14146
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
258 case POP3_CMD_REPLY_OK: |
9754
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
259 prefix = "+OK"; |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
260 break; |
14146
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
261 case POP3_CMD_REPLY_TEMPFAIL: |
15785
7e292b8352d9
pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
262 prefix = "-ERR [SYS/TEMP]"; |
7e292b8352d9
pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
263 break; |
7e292b8352d9
pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
264 case POP3_CMD_REPLY_AUTH_ERROR: |
18893
86b75d360241
imap/pop3-login: If auth failure reason already begins with [resp-code], don't prefix it with another one.
Timo Sirainen <tss@iki.fi>
parents:
18795
diff
changeset
|
265 if (text[0] == '[') |
86b75d360241
imap/pop3-login: If auth failure reason already begins with [resp-code], don't prefix it with another one.
Timo Sirainen <tss@iki.fi>
parents:
18795
diff
changeset
|
266 prefix = "-ERR"; |
86b75d360241
imap/pop3-login: If auth failure reason already begins with [resp-code], don't prefix it with another one.
Timo Sirainen <tss@iki.fi>
parents:
18795
diff
changeset
|
267 else |
86b75d360241
imap/pop3-login: If auth failure reason already begins with [resp-code], don't prefix it with another one.
Timo Sirainen <tss@iki.fi>
parents:
18795
diff
changeset
|
268 prefix = "-ERR [AUTH]"; |
9754
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
269 break; |
14146
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
270 case POP3_CMD_REPLY_ERROR: |
9754
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
271 break; |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
272 } |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
273 |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
274 T_BEGIN { |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
275 string_t *line = t_str_new(256); |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
276 |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
277 str_append(line, prefix); |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
278 str_append_c(line, ' '); |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
279 str_append(line, text); |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
280 str_append(line, "\r\n"); |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
281 |
14146
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
282 client_send_raw_data(client, str_data(line), str_len(line)); |
9754
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
283 } T_END; |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
284 } |
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
285 |
14146
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
286 static void |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
287 pop3_client_notify_disconnect(struct client *client, |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
288 enum client_disconnect_reason reason, |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
289 const char *text) |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
290 { |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
291 if (reason == CLIENT_DISCONNECT_INTERNAL_ERROR) |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
292 client_send_reply(client, POP3_CMD_REPLY_TEMPFAIL, text); |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
293 else |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
294 client_send_reply(client, POP3_CMD_REPLY_ERROR, text); |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
295 } |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
296 |
10171
7f0ccd367351
Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents:
10170
diff
changeset
|
297 static void pop3_login_die(void) |
7f0ccd367351
Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents:
10170
diff
changeset
|
298 { |
7f0ccd367351
Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents:
10170
diff
changeset
|
299 /* do nothing. pop3 connections typically die pretty quick anyway. */ |
7f0ccd367351
Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents:
10170
diff
changeset
|
300 } |
9754
b9ad5b841f7e
*-login: Use a common client_send_line() API.
Timo Sirainen <tss@iki.fi>
parents:
9603
diff
changeset
|
301 |
12890
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
302 static void pop3_login_preinit(void) |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
303 { |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
304 login_set_roots = pop3_login_setting_roots; |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
305 } |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
306 |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
307 static void pop3_login_init(void) |
7137
c33c87781ab4
Added clients_init() and clients_deinit() back (for Managesieve).
Timo Sirainen <tss@iki.fi>
parents:
7102
diff
changeset
|
308 { |
10171
7f0ccd367351
Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents:
10170
diff
changeset
|
309 /* override the default login_die() */ |
7f0ccd367351
Handle shutdown_clients globally for all services.
Timo Sirainen <tss@iki.fi>
parents:
10170
diff
changeset
|
310 master_service_set_die_callback(master_service, pop3_login_die); |
7137
c33c87781ab4
Added clients_init() and clients_deinit() back (for Managesieve).
Timo Sirainen <tss@iki.fi>
parents:
7102
diff
changeset
|
311 } |
c33c87781ab4
Added clients_init() and clients_deinit() back (for Managesieve).
Timo Sirainen <tss@iki.fi>
parents:
7102
diff
changeset
|
312 |
12890
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
313 static void pop3_login_deinit(void) |
7137
c33c87781ab4
Added clients_init() and clients_deinit() back (for Managesieve).
Timo Sirainen <tss@iki.fi>
parents:
7102
diff
changeset
|
314 { |
c33c87781ab4
Added clients_init() and clients_deinit() back (for Managesieve).
Timo Sirainen <tss@iki.fi>
parents:
7102
diff
changeset
|
315 clients_destroy_all(); |
c33c87781ab4
Added clients_init() and clients_deinit() back (for Managesieve).
Timo Sirainen <tss@iki.fi>
parents:
7102
diff
changeset
|
316 } |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
317 |
12890
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
318 static struct client_vfuncs pop3_client_vfuncs = { |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
319 pop3_client_alloc, |
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
320 pop3_client_create, |
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
321 pop3_client_destroy, |
14146
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
322 pop3_client_notify_auth_ready, |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
323 pop3_client_notify_disconnect, |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
324 NULL, |
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
325 pop3_client_notify_starttls, |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
326 pop3_client_starttls, |
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
327 pop3_client_input, |
9767
50df3e60ab85
*-login: Abstract out SASL continue reply sending (for managesieve).
Timo Sirainen <tss@iki.fi>
parents:
9765
diff
changeset
|
328 NULL, |
9781
19912e4a2fb3
*-login: Allow backend to parse SASL responses from client (for managesieve).
Timo Sirainen <tss@iki.fi>
parents:
9767
diff
changeset
|
329 NULL, |
14146
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
330 pop3_client_auth_result, |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
331 pop3_proxy_reset, |
14146
e456e1bce47f
login-common API made more extensible for different kinds of protocols.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
332 pop3_proxy_parse_line, |
21722
5571a8162b42
*-login: Add client.proxy_get_state() for providing human-readable proxy state
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21518
diff
changeset
|
333 pop3_proxy_error, |
21724
dce69a67f3b2
pop3-login: Log proxy state as human-readable string.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21722
diff
changeset
|
334 pop3_proxy_get_state, |
21970
866421afc7b7
*-login: Add client_vfuncs.send_raw_data()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21909
diff
changeset
|
335 client_common_send_raw_data, |
22241
5f3709d309b9
*-login: Add client_vfuncs.input_next_cmd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22240
diff
changeset
|
336 pop3_client_input_next_cmd, |
22242
589993f80eda
*-login: Add client_vfuncs.free() that is called when client refcount=0
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22241
diff
changeset
|
337 client_common_default_free, |
9756
e30495ae11de
*-login: Moved most of the common code to login-common.
Timo Sirainen <tss@iki.fi>
parents:
9754
diff
changeset
|
338 }; |
12890
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
339 |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
340 static const struct login_binary pop3_login_binary = { |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
341 .protocol = "pop3", |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
342 .process_name = "pop3-login", |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
343 .default_port = 110, |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
344 .default_ssl_port = 995, |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
345 |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
346 .client_vfuncs = &pop3_client_vfuncs, |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
347 .preinit = pop3_login_preinit, |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
348 .init = pop3_login_init, |
13767
4ecb77154ac7
login: Use AUTH_REQUEST_FLAG_SUPPORT_FINAL_RESP if protocol supports it.
Timo Sirainen <tss@iki.fi>
parents:
12890
diff
changeset
|
349 .deinit = pop3_login_deinit, |
4ecb77154ac7
login: Use AUTH_REQUEST_FLAG_SUPPORT_FINAL_RESP if protocol supports it.
Timo Sirainen <tss@iki.fi>
parents:
12890
diff
changeset
|
350 |
4ecb77154ac7
login: Use AUTH_REQUEST_FLAG_SUPPORT_FINAL_RESP if protocol supports it.
Timo Sirainen <tss@iki.fi>
parents:
12890
diff
changeset
|
351 .sasl_support_final_reply = FALSE |
12890
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
352 }; |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
353 |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
354 int main(int argc, char *argv[]) |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
355 { |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
356 return login_binary_run(&pop3_login_binary, argc, argv); |
6f0396e35fd9
login-common API redesign so that the library doesn't refer to nonexistent variables.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
357 } |