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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
1d0cff9ae4cd Minor code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 8302
diff changeset
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
96dab004a87a fixes. maybe it works now.
Timo Sirainen <tss@iki.fi>
parents: 1702
diff changeset
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
1d0cff9ae4cd Minor code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 8302
diff changeset
129 /* if a command starts an authentication, stop processing further
1d0cff9ae4cd Minor code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 8302
diff changeset
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
83df1d1bbb05 Fixes, patch by Andrey Panin
Timo Sirainen <tss@iki.fi>
parents: 2268
diff changeset
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 }