annotate src/pop3/pop3-client.c @ 22702:024c9456f8e5

pop3: Simplify logout format variable handling
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Mon, 04 Dec 2017 11:15:15 +0200
parents b4c9f96470ca
children fe760efc829a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21118
diff changeset
1 /* Copyright (c) 2002-2017 Dovecot authors, see the included COPYING file */
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
2
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
3 #include "pop3-common.h"
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
4 #include "array.h"
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
5 #include "ioloop.h"
15187
02451e967a06 Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
6 #include "net.h"
18990
cd2c95d82d4c Use io_stream_get_disconnect_reason() instead of duplicating its code all over the place.
Timo Sirainen <tss@iki.fi>
parents: 18979
diff changeset
7 #include "iostream.h"
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
8 #include "istream.h"
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
9 #include "ostream.h"
20731
5b1f69b37089 imap, pop3: Added rawlog_dir setting to store IMAP/POP3 traffic logs.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20671
diff changeset
10 #include "iostream-rawlog.h"
14563
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
11 #include "crc32.h"
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
12 #include "str.h"
9355
d6d4ec8ac06d imap, pop3 no longer assume that there's only a single client in process.
Timo Sirainen <tss@iki.fi>
parents: 9349
diff changeset
13 #include "llist.h"
9235
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9219
diff changeset
14 #include "hostpid.h"
15787
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
15 #include "file-dotlock.h"
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
16 #include "var-expand.h"
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
17 #include "master-service.h"
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
18 #include "mail-storage.h"
10130
d1384c2b08e5 Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
19 #include "mail-storage-service.h"
21816
869db4bcecdb lib-storage: Replace MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE with explicit mail_user_autoexpunge()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21815
diff changeset
20 #include "mail-autoexpunge.h"
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
21 #include "pop3-commands.h"
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
22 #include "mail-search-build.h"
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
23 #include "mail-namespace.h"
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
24
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
25 #include <unistd.h>
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
26
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
27 /* max. length of input command line (spec says 512) */
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
28 #define MAX_INBUF_SIZE 2048
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
29
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
30 /* Disconnect client when it sends too many bad commands in a row */
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
31 #define CLIENT_MAX_BAD_COMMANDS 20
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
32
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
33 /* Disconnect client after idling this many milliseconds */
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
34 #define CLIENT_IDLE_TIMEOUT_MSECS (10*60*1000)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
35 /* If client starts idling for this many milliseconds, commit the current
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
36 transaction. This allows the mailbox to become unlocked. */
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
37 #define CLIENT_COMMIT_TIMEOUT_MSECS (10*1000)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
38
15787
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
39 #define POP3_LOCK_FNAME "dovecot-pop3-session.lock"
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
40 #define POP3_SESSION_DOTLOCK_STALE_TIMEOUT_SECS (60*5)
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
41
14220
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
42 extern struct pop3_client_vfuncs pop3_client_vfuncs;
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
43
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
44 struct pop3_module_register pop3_module_register = { 0 };
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
45
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10093
diff changeset
46 struct client *pop3_clients;
10193
02e852b2c2c3 pop3: Added support for verbose_proctitle=yes
Timo Sirainen <tss@iki.fi>
parents: 10144
diff changeset
47 unsigned int pop3_client_count;
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
48
12990
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
49 static enum mail_sort_type pop3_sort_program[] = {
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
50 MAIL_SORT_POP3_ORDER,
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
51 MAIL_SORT_END
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
52 };
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
53
15787
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
54 static const struct dotlock_settings session_dotlock_set = {
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
55 .timeout = 10,
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
56 .stale_timeout = POP3_SESSION_DOTLOCK_STALE_TIMEOUT_SECS,
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
57 .lock_suffix = "",
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
58 .use_io_notify = TRUE
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
59 };
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
60
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
61 static void client_input(struct client *client);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
62 static int client_output(struct client *client);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
63
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
64 static void client_commit_timeout(struct client *client)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
65 {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
66 if (client->cmd != NULL) {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
67 /* Can't commit while commands are running */
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
68 return;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
69 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
70
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
71 (void)mailbox_transaction_commit(&client->trans);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
72 client->trans = mailbox_transaction_begin(client->mailbox, 0);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
73 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
74
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
75 static void client_idle_timeout(struct client *client)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
76 {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
77 if (client->cmd != NULL) {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
78 client_destroy(client,
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
79 "Disconnected for inactivity in reading our output");
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
80 } else {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
81 client_send_line(client, "-ERR Disconnected for inactivity.");
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
82 client_destroy(client, "Disconnected for inactivity");
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
83 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
84 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
85
12221
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
86 static int
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
87 pop3_mail_get_size(struct client *client, struct mail *mail, uoff_t *size_r)
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
88 {
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
89 int ret;
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
90
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
91 if (!client->set->pop3_fast_size_lookups)
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
92 return mail_get_virtual_size(mail, size_r);
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
93
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
94 /* first try to get the virtual size */
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
95 mail->lookup_abort = MAIL_LOOKUP_ABORT_READ_MAIL;
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
96 ret = mail_get_virtual_size(mail, size_r);
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
97 mail->lookup_abort = MAIL_LOOKUP_ABORT_NEVER;
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
98 if (ret == 0)
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
99 return 0;
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
100
21606
6f2e7eb1ee90 lib-storage: Add explicit MAIL_ERROR_LOOKUP_ABORT error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
101 if (mailbox_get_last_mail_error(mail->box) != MAIL_ERROR_LOOKUP_ABORTED)
12221
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
102 return -1;
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
103
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
104 /* virtual size not available with a fast lookup.
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
105 fallback to trying the physical size */
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
106 mail->lookup_abort = MAIL_LOOKUP_ABORT_READ_MAIL;
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
107 ret = mail_get_physical_size(mail, size_r);
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
108 mail->lookup_abort = MAIL_LOOKUP_ABORT_NEVER;
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
109 if (ret == 0)
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
110 return 0;
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
111
21606
6f2e7eb1ee90 lib-storage: Add explicit MAIL_ERROR_LOOKUP_ABORT error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
112 if (mailbox_get_last_mail_error(mail->box) != MAIL_ERROR_LOOKUP_ABORTED)
12221
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
113 return -1;
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
114
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
115 /* no way to quickly get the size. fallback to doing a slow virtual
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
116 size lookup */
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
117 return mail_get_virtual_size(mail, size_r);
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
118 }
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
119
12990
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
120 static void
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
121 msgnum_to_seq_map_add(ARRAY_TYPE(uint32_t) *msgnum_to_seq_map,
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
122 struct client *client, struct mail *mail,
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
123 unsigned int msgnum)
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
124 {
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
125 uint32_t seq;
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
126
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
127 if (mail->seq == msgnum+1)
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
128 return;
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
129
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
130 if (!array_is_created(msgnum_to_seq_map))
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
131 i_array_init(msgnum_to_seq_map, client->messages_count);
13560
69826dc7a959 pop3: Fixed POP3-order sorting.
Timo Sirainen <tss@iki.fi>
parents: 13304
diff changeset
132
69826dc7a959 pop3: Fixed POP3-order sorting.
Timo Sirainen <tss@iki.fi>
parents: 13304
diff changeset
133 /* add any messages between this and the previous one that had
69826dc7a959 pop3: Fixed POP3-order sorting.
Timo Sirainen <tss@iki.fi>
parents: 13304
diff changeset
134 a POP3 order defined */
69826dc7a959 pop3: Fixed POP3-order sorting.
Timo Sirainen <tss@iki.fi>
parents: 13304
diff changeset
135 seq = array_count(msgnum_to_seq_map) + 1;
69826dc7a959 pop3: Fixed POP3-order sorting.
Timo Sirainen <tss@iki.fi>
parents: 13304
diff changeset
136 for (; seq <= msgnum; seq++)
69826dc7a959 pop3: Fixed POP3-order sorting.
Timo Sirainen <tss@iki.fi>
parents: 13304
diff changeset
137 array_append(msgnum_to_seq_map, &seq, 1);
12990
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
138 array_append(msgnum_to_seq_map, &mail->seq, 1);
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
139 }
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
140
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
141 static int read_mailbox(struct client *client, uint32_t *failed_uid_r)
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
142 {
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
143 struct mailbox_status status;
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
144 struct mailbox_transaction_context *t;
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
145 struct mail_search_args *search_args;
16347
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
146 struct mail_search_arg *sarg;
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
147 struct mail_search_context *ctx;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
148 struct mail *mail;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
149 uoff_t size;
14920
a097ef0a9d6d Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents: 14688
diff changeset
150 ARRAY(uoff_t) message_sizes;
12990
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
151 ARRAY_TYPE(uint32_t) msgnum_to_seq_map = ARRAY_INIT;
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
152 unsigned int msgnum;
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
153 int ret = 1;
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
154
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
155 *failed_uid_r = 0;
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
156
12550
2c299c0e3bc8 lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents: 12496
diff changeset
157 mailbox_get_open_status(client->mailbox, STATUS_UIDVALIDITY, &status);
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
158 client->uid_validity = status.uidvalidity;
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
159 client->messages_count = status.messages;
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
160
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
161 t = mailbox_transaction_begin(client->mailbox, 0);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
162
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
163 search_args = mail_search_build_init();
16347
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
164 if (client->deleted_kw != NULL) {
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
165 sarg = mail_search_build_add(search_args, SEARCH_KEYWORDS);
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
166 sarg->match_not = TRUE;
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
167 sarg->value.str = p_strdup(search_args->pool,
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
168 client->set->pop3_deleted_flag);
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
169 i_array_init(&client->all_seqs, 32);
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
170 } else {
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
171 mail_search_build_add_all(search_args);
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
172 }
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
173 mail_search_args_init(search_args, client->mailbox, TRUE, NULL);
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
174
13072
d686decbc1a4 Merged changes from v2.0 tree.
Timo Sirainen <tss@iki.fi>
parents: 12870 13032
diff changeset
175 ctx = mailbox_search_init(t, search_args, pop3_sort_program,
13610
a70f6f04f1fe pop3: When pop3_fast_size_lookups=yes, don't assume we need to fetch virtual size.
Timo Sirainen <tss@iki.fi>
parents: 13560
diff changeset
176 client->set->pop3_fast_size_lookups ? 0 :
12870
1fbd59c48414 lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
177 MAIL_FETCH_VIRTUAL_SIZE, NULL);
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
178 mail_search_args_unref(&search_args);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
179
12990
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
180 client->last_seen_pop3_msn = 0;
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
181 client->total_size = 0;
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
182 i_array_init(&message_sizes, client->messages_count);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
183
12990
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
184 msgnum = 0;
12870
1fbd59c48414 lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
185 while (mailbox_search_next(ctx, &mail)) {
12221
c172f2a384f5 pop3: Added pop3_fast_size_lookups setting.
Timo Sirainen <tss@iki.fi>
parents: 12219
diff changeset
186 if (pop3_mail_get_size(client, mail, &size) < 0) {
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
187 ret = mail->expunged ? 0 : -1;
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
188 *failed_uid_r = mail->uid;
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
189 break;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
190 }
16347
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
191 if (array_is_created(&client->all_seqs))
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
192 seq_range_array_add(&client->all_seqs, mail->seq);
12990
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
193 msgnum_to_seq_map_add(&msgnum_to_seq_map, client, mail, msgnum);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
194
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
195 if ((mail_get_flags(mail) & MAIL_SEEN) != 0)
12990
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
196 client->last_seen_pop3_msn = msgnum + 1;
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
197 client->total_size += size;
19278
05e0700daea3 pop3: Fixed buffer overflow with handling pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
198 if (client->highest_seq < mail->seq)
05e0700daea3 pop3: Fixed buffer overflow with handling pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
199 client->highest_seq = mail->seq;
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
200
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
201 array_append(&message_sizes, &size, 1);
12990
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
202 msgnum++;
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
203 }
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
204
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
205 if (mailbox_search_deinit(&ctx) < 0)
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
206 ret = -1;
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
207
12990
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
208 if (ret <= 0) {
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
209 /* commit the transaction instead of rollbacking to make sure
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
210 we don't lose data (virtual sizes) added to cache file */
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
211 (void)mailbox_transaction_commit(&t);
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
212 array_free(&message_sizes);
12990
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
213 if (array_is_created(&msgnum_to_seq_map))
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
214 array_free(&msgnum_to_seq_map);
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
215 return ret;
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
216 }
16347
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
217 i_assert(msgnum <= client->messages_count);
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
218 client->messages_count = msgnum;
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
219
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
220 if (!array_is_created(&client->all_seqs)) {
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
221 i_array_init(&client->all_seqs, 1);
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
222 seq_range_array_add_range(&client->all_seqs, 1, msgnum);
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
223 }
12990
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
224
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
225 client->trans = t;
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
226 client->message_sizes =
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
227 buffer_free_without_data(&message_sizes.arr.buffer);
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
228 if (array_is_created(&msgnum_to_seq_map)) {
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
229 client->msgnum_to_seq_map_count =
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
230 array_count(&msgnum_to_seq_map);
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
231 client->msgnum_to_seq_map =
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
232 buffer_free_without_data(&msgnum_to_seq_map.arr.buffer);
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
233 }
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
234 return 1;
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
235 }
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
236
16347
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
237 static int init_pop3_deleted_flag(struct client *client, const char **error_r)
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
238 {
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
239 const char *deleted_keywords[2];
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
240
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
241 if (client->set->pop3_deleted_flag[0] == '\0')
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
242 return 0;
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
243
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
244 deleted_keywords[0] = client->set->pop3_deleted_flag;
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
245 deleted_keywords[1] = NULL;
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
246 if (mailbox_keywords_create(client->mailbox, deleted_keywords,
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
247 &client->deleted_kw) < 0) {
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
248 *error_r = t_strdup_printf(
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
249 "pop3_deleted_flags: Invalid keyword '%s': %s",
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
250 client->set->pop3_deleted_flag,
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21796
diff changeset
251 mailbox_get_last_internal_error(client->mailbox, NULL));
16347
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
252 return -1;
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
253 }
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
254 return 0;
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
255 }
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
256
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
257 static int init_mailbox(struct client *client, const char **error_r)
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
258 {
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
259 uint32_t failed_uid = 0, last_failed_uid = 0;
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
260 int i, ret = -1;
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
261
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
262 for (i = 0;; i++) {
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
263 if (mailbox_sync(client->mailbox,
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
264 MAILBOX_SYNC_FLAG_FULL_READ) < 0) {
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
265 ret = -1;
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
266 break;
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
267 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
268
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
269 ret = read_mailbox(client, &failed_uid);
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
270 if (ret > 0)
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
271 return 0;
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
272 if (i == 2)
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
273 break;
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
274
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
275 /* well, sync and try again. maybe it works the second time. */
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
276 last_failed_uid = failed_uid;
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
277 failed_uid = 0;
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
278 }
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
279
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
280 if (ret < 0) {
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21796
diff changeset
281 *error_r = mailbox_get_last_internal_error(client->mailbox, NULL);
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
282 client_send_storage_error(client);
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
283 } else {
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
284 if (failed_uid == last_failed_uid && failed_uid != 0) {
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
285 /* failed twice in same message */
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
286 *error_r = t_strdup_printf(
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
287 "Getting size of message UID=%u failed",
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
288 failed_uid);
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
289 } else {
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
290 *error_r = "Can't sync mailbox: "
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
291 "Messages keep getting expunged";
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
292 }
15785
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
293 client_send_line(client, "-ERR [SYS/TEMP] Couldn't sync mailbox.");
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
294 }
12219
0da6f86c0ef5 pop3: Code cleanup for mailbox opening code.
Timo Sirainen <tss@iki.fi>
parents: 11645
diff changeset
295 return -1;
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
296 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
297
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
298 static enum uidl_keys parse_uidl_keymask(const char *format)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
299 {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
300 enum uidl_keys mask = 0;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
301
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
302 for (; *format != '\0'; format++) {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
303 if (format[0] == '%' && format[1] != '\0') {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
304 switch (var_get_key(++format)) {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
305 case 'v':
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
306 mask |= UIDL_UIDVALIDITY;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
307 break;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
308 case 'u':
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
309 mask |= UIDL_UID;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
310 break;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
311 case 'm':
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
312 mask |= UIDL_MD5;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
313 break;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
314 case 'f':
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
315 mask |= UIDL_FILE_NAME;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
316 break;
10539
0462fcfb809a pop3: Added %g = GUID to pop3_uidl_format.
Timo Sirainen <tss@iki.fi>
parents: 10509
diff changeset
317 case 'g':
0462fcfb809a pop3: Added %g = GUID to pop3_uidl_format.
Timo Sirainen <tss@iki.fi>
parents: 10509
diff changeset
318 mask |= UIDL_GUID;
0462fcfb809a pop3: Added %g = GUID to pop3_uidl_format.
Timo Sirainen <tss@iki.fi>
parents: 10509
diff changeset
319 break;
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
320 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
321 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
322 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
323 return mask;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
324 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
325
15787
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
326 static void pop3_lock_session_refresh(struct client *client)
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
327 {
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
328 if (file_dotlock_touch(client->session_dotlock) < 0) {
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
329 client_send_line(client,
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
330 "-ERR [SYS/TEMP] Couldn't update POP3 session lock.");
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
331 client_destroy(client, "Couldn't lock POP3 session");
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
332 }
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
333 }
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
334
22216
415130854a53 pop3: move pop3 session locking out of client_create
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 21878
diff changeset
335 int pop3_lock_session(struct client *client)
15787
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
336 {
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
337 const struct mail_storage_settings *mail_set =
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
338 mail_storage_service_user_get_mail_set(client->service_user);
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
339 struct dotlock_settings dotlock_set;
19541
af2ddcf54f92 pop3: Make sure pop3_lock_session=yes creates the lock's directory if it's missing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19390
diff changeset
340 enum mailbox_list_path_type type;
15787
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
341 const char *dir, *path;
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
342 int ret;
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
343
19541
af2ddcf54f92 pop3: Make sure pop3_lock_session=yes creates the lock's directory if it's missing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19390
diff changeset
344 if (mailbox_list_get_root_path(client->inbox_ns->list,
af2ddcf54f92 pop3: Make sure pop3_lock_session=yes creates the lock's directory if it's missing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19390
diff changeset
345 MAILBOX_LIST_PATH_TYPE_INDEX, &dir)) {
af2ddcf54f92 pop3: Make sure pop3_lock_session=yes creates the lock's directory if it's missing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19390
diff changeset
346 type = MAILBOX_LIST_PATH_TYPE_INDEX;
af2ddcf54f92 pop3: Make sure pop3_lock_session=yes creates the lock's directory if it's missing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19390
diff changeset
347 } else if (mailbox_list_get_root_path(client->inbox_ns->list,
af2ddcf54f92 pop3: Make sure pop3_lock_session=yes creates the lock's directory if it's missing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19390
diff changeset
348 MAILBOX_LIST_PATH_TYPE_DIR, &dir)) {
af2ddcf54f92 pop3: Make sure pop3_lock_session=yes creates the lock's directory if it's missing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19390
diff changeset
349 type = MAILBOX_LIST_PATH_TYPE_DIR;
af2ddcf54f92 pop3: Make sure pop3_lock_session=yes creates the lock's directory if it's missing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19390
diff changeset
350 } else {
15787
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
351 i_error("pop3_lock_session: Storage has no root/index directory, "
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
352 "can't create a POP3 session lock file");
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
353 return -1;
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
354 }
19541
af2ddcf54f92 pop3: Make sure pop3_lock_session=yes creates the lock's directory if it's missing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19390
diff changeset
355 if (mailbox_list_mkdir_root(client->inbox_ns->list, dir, type) < 0) {
af2ddcf54f92 pop3: Make sure pop3_lock_session=yes creates the lock's directory if it's missing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19390
diff changeset
356 i_error("pop3_lock_session: Couldn't create root directory %s: %s",
21796
e9db2f82f290 global: Log mailbox_list internal errors
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21746
diff changeset
357 dir, mailbox_list_get_last_internal_error(client->inbox_ns->list, NULL));
19541
af2ddcf54f92 pop3: Make sure pop3_lock_session=yes creates the lock's directory if it's missing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19390
diff changeset
358 return -1;
af2ddcf54f92 pop3: Make sure pop3_lock_session=yes creates the lock's directory if it's missing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19390
diff changeset
359 }
15787
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
360 path = t_strdup_printf("%s/"POP3_LOCK_FNAME, dir);
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
361
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
362 dotlock_set = session_dotlock_set;
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
363 dotlock_set.use_excl_lock = mail_set->dotlock_use_excl;
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
364 dotlock_set.nfs_flush = mail_set->mail_nfs_storage;
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
365
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
366 ret = file_dotlock_create(&dotlock_set, path, 0,
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
367 &client->session_dotlock);
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
368 if (ret < 0)
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
369 i_error("file_dotlock_create(%s) failed: %m", path);
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
370 else if (ret > 0) {
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
371 client->to_session_dotlock_refresh =
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
372 timeout_add(POP3_SESSION_DOTLOCK_STALE_TIMEOUT_SECS*1000,
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
373 pop3_lock_session_refresh, client);
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
374 }
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
375 return ret;
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
376 }
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
377
22216
415130854a53 pop3: move pop3 session locking out of client_create
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 21878
diff changeset
378 struct client *client_create(int fd_in, int fd_out, const char *session_id,
415130854a53 pop3: move pop3 session locking out of client_create
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 21878
diff changeset
379 struct mail_user *user,
415130854a53 pop3: move pop3 session locking out of client_create
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 21878
diff changeset
380 struct mail_storage_service_user *service_user,
415130854a53 pop3: move pop3 session locking out of client_create
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 21878
diff changeset
381 const struct pop3_settings *set)
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
382 {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
383 struct client *client;
14220
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
384 pool_t pool;
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
385
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
386 /* always use nonblocking I/O */
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
387 net_set_nonblock(fd_in, TRUE);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
388 net_set_nonblock(fd_out, TRUE);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
389
14220
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
390 pool = pool_alloconly_create("pop3 client", 256);
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
391 client = p_new(pool, struct client, 1);
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
392 client->pool = pool;
10130
d1384c2b08e5 Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
393 client->service_user = service_user;
14220
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
394 client->v = pop3_client_vfuncs;
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
395 client->set = set;
14576
fbb1ecb9b888 Merged changes from v2.1 tree.
Timo Sirainen <tss@iki.fi>
parents: 14220 14563
diff changeset
396 client->session_id = p_strdup(pool, session_id);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
397 client->fd_in = fd_in;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
398 client->fd_out = fd_out;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
399 client->input = i_stream_create_fd(fd_in, MAX_INBUF_SIZE, FALSE);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
400 client->output = o_stream_create_fd(fd_out, (size_t)-1, FALSE);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14576
diff changeset
401 o_stream_set_no_error_handling(client->output, TRUE);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
402 o_stream_set_flush_callback(client->output, client_output, client);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
403
20731
5b1f69b37089 imap, pop3: Added rawlog_dir setting to store IMAP/POP3 traffic logs.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20671
diff changeset
404 if (set->rawlog_dir[0] != '\0') {
5b1f69b37089 imap, pop3: Added rawlog_dir setting to store IMAP/POP3 traffic logs.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20671
diff changeset
405 (void)iostream_rawlog_create(set->rawlog_dir, &client->input,
5b1f69b37089 imap, pop3: Added rawlog_dir setting to store IMAP/POP3 traffic logs.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20671
diff changeset
406 &client->output);
5b1f69b37089 imap, pop3: Added rawlog_dir setting to store IMAP/POP3 traffic logs.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20671
diff changeset
407 }
5b1f69b37089 imap, pop3: Added rawlog_dir setting to store IMAP/POP3 traffic logs.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20671
diff changeset
408
14220
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
409 p_array_init(&client->module_contexts, client->pool, 5);
17192
a1c153c70bb9 Use io_add_istream() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
410 client->io = io_add_istream(client->input, client_input, client);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
411 client->last_input = ioloop_time;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
412 client->to_idle = timeout_add(CLIENT_IDLE_TIMEOUT_MSECS,
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
413 client_idle_timeout, client);
15787
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
414 client->to_commit = timeout_add(CLIENT_COMMIT_TIMEOUT_MSECS,
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
415 client_commit_timeout, client);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
416
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
417 client->user = user;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
418
19389
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
419 client->mail_set = mail_user_set_get_storage_set(user);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
420 client->uidl_keymask =
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
421 parse_uidl_keymask(client->mail_set->pop3_uidl_format);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
422 if (client->uidl_keymask == 0)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
423 i_fatal("Invalid pop3_uidl_format");
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
424
14563
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
425 if (var_has_key(set->pop3_logout_format, 'u', "uidl_change")) {
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
426 /* logging uidl_change. we need hashes of the UIDLs */
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
427 client->message_uidls_save = TRUE;
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
428 } else if (strcmp(set->pop3_uidl_duplicates, "allow") != 0) {
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
429 /* UIDL duplicates aren't allowed, so we'll need to
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
430 keep track of them */
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
431 client->message_uidls_save = TRUE;
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
432 }
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
433
19389
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
434 pop3_client_count++;
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
435 DLLIST_PREPEND(&pop3_clients, client);
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
436
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
437 if (hook_client_created != NULL)
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
438 hook_client_created(&client);
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
439
22216
415130854a53 pop3: move pop3 session locking out of client_create
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents: 21878
diff changeset
440 return client;
19389
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
441 }
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
442
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
443 int client_init_mailbox(struct client *client, const char **error_r)
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
444 {
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
445 enum mailbox_flags flags;
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
446 const char *ident, *errmsg;
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
447
21721
f149ee35322e pop3: Set process title before syncing mailbox.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21671
diff changeset
448 /* refresh proctitle before a potentially long-running init_mailbox() */
f149ee35322e pop3: Set process title before syncing mailbox.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21671
diff changeset
449 pop3_refresh_proctitle();
f149ee35322e pop3: Set process title before syncing mailbox.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21671
diff changeset
450
19389
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
451 flags = MAILBOX_FLAG_POP3_SESSION;
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
452 if (!client->set->pop3_no_flag_updates)
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
453 flags |= MAILBOX_FLAG_DROP_RECENT;
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
454 client->mailbox = mailbox_alloc(client->inbox_ns->list, "INBOX", flags);
21878
e78a42ead488 global: Add mailbox_set_reason() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21816
diff changeset
455 mailbox_set_reason(client->mailbox, "POP3 INBOX");
19389
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
456 if (mailbox_open(client->mailbox) < 0) {
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
457 *error_r = t_strdup_printf("Couldn't open INBOX: %s",
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21796
diff changeset
458 mailbox_get_last_internal_error(client->mailbox, NULL));
19389
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
459 client_send_storage_error(client);
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
460 return -1;
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
461 }
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
462
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
463 if (init_pop3_deleted_flag(client, &errmsg) < 0 ||
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
464 init_mailbox(client, &errmsg) < 0) {
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
465 *error_r = t_strdup_printf("Couldn't init INBOX: %s", errmsg);
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
466 return -1;
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
467 }
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
468
5528fd720619 pop3: Send "OK Logged in" before reading mailbox.
Timo Sirainen <tss@iki.fi>
parents: 19278
diff changeset
469 if (!client->set->pop3_no_flag_updates && client->messages_count > 0)
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
470 client->seen_bitmask = i_malloc(MSGS_BITMASK_SIZE(client));
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
471
9235
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9219
diff changeset
472 ident = mail_user_get_anvil_userip_ident(client->user);
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9219
diff changeset
473 if (ident != NULL) {
9348
0c587f108916 lib-master has now a global master_service variable that all binaries use.
Timo Sirainen <tss@iki.fi>
parents: 9235
diff changeset
474 master_service_anvil_send(master_service, t_strconcat(
10144
19e67ad17398 Changed anvil ident string to have the protocol first, so username can contain '/' chars.
Timo Sirainen <tss@iki.fi>
parents: 10130
diff changeset
475 "CONNECT\t", my_pid, "\tpop3/", ident, "\n", NULL));
9235
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9219
diff changeset
476 client->anvil_sent = TRUE;
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9219
diff changeset
477 }
15786
35194cf0693e pop3: Minor code cleanup
Timo Sirainen <tss@iki.fi>
parents: 15785
diff changeset
478 return 0;
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
479 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
480
11152
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
481 static const char *client_build_uidl_change_string(struct client *client)
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
482 {
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
483 uint32_t i, old_hash, new_hash;
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
484 unsigned int old_msg_count, new_msg_count;
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
485
14563
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
486 if (client->message_uidls == NULL) {
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
487 /* UIDL command not given */
11152
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
488 return "";
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
489 }
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
490
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
491 /* 1..new-1 were probably left to mailbox by previous POP3 session */
12990
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
492 old_msg_count = client->lowest_retr_pop3_msn > 0 ?
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
493 client->lowest_retr_pop3_msn - 1 : client->messages_count;
11152
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
494 for (i = 0, old_hash = 0; i < old_msg_count; i++)
14563
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
495 old_hash ^= crc32_str(client->message_uidls[i]);
11152
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
496
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
497 /* assume all except deleted messages were sent to POP3 client */
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
498 if (!client->deleted) {
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
499 for (i = 0, new_hash = 0; i < client->messages_count; i++)
14563
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
500 new_hash ^= crc32_str(client->message_uidls[i]);
11152
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
501 } else {
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
502 for (i = 0, new_hash = 0; i < client->messages_count; i++) {
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
503 if (client->deleted_bitmask[i / CHAR_BIT] &
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
504 (1 << (i % CHAR_BIT)))
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
505 continue;
14563
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
506 new_hash ^= crc32_str(client->message_uidls[i]);
11152
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
507 }
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
508 }
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
509
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
510 new_msg_count = client->messages_count - client->deleted_count;
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
511 if (old_hash == new_hash && old_msg_count == new_msg_count)
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
512 return t_strdup_printf("%u/%08x", old_msg_count, old_hash);
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
513 else {
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
514 return t_strdup_printf("%u/%08x -> %u/%08x",
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
515 old_msg_count, old_hash,
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
516 new_msg_count, new_hash);
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
517 }
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
518 }
e019febd7eb3 pop3: Added %u=old/new UIDL hash to pop3_logout_format.
Timo Sirainen <tss@iki.fi>
parents: 11083
diff changeset
519
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
520 static const char *client_stats(struct client *client)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
521 {
22702
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
522 const char *uidl_change = "";
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
523 if (var_has_key(client->set->pop3_logout_format,
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
524 'o', "uidl_change"))
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
525 uidl_change = client_build_uidl_change_string(client);
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
526
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
527 const struct var_expand_table tab[] = {
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
528 { 'p', dec2str(client->top_bytes), "top_bytes" },
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
529 { 't', dec2str(client->top_count), "top_count" },
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
530 { 'b', dec2str(client->retr_bytes), "retr_bytes" },
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
531 { 'r', dec2str(client->retr_count), "retr_count" },
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
532 { 'd', !client->delete_success ? "0" :
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
533 dec2str(client->deleted_count), "deleted_count" },
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
534 { 'm', dec2str(client->messages_count), "message_count" },
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
535 { 's', dec2str(client->total_size), "message_bytes" },
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
536 { 'i', dec2str(client->input->v_offset), "input" },
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
537 { 'o', dec2str(client->output->offset), "output" },
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
538 { 'u', uidl_change, "uidl_change" },
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
539 { '\0', client->session_id, "session" },
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
540 { 'd', !client->delete_success ? "0" :
024c9456f8e5 pop3: Simplify logout format variable handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22220
diff changeset
541 dec2str(client->deleted_size), "deleted_bytes" },
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
542 { '\0', NULL, NULL }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
543 };
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
544 str = t_str_new(128);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
545 var_expand(str, client->set->pop3_logout_format, tab);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
546 return str_c(str);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
547 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
548
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
549 void client_destroy(struct client *client, const char *reason)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
550 {
14220
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
551 client->v.destroy(client, reason);
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
552 }
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
553
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
554 static void client_default_destroy(struct client *client, const char *reason)
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
555 {
21745
b5311039c179 pop3: Add client.destroyed boolean
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21721
diff changeset
556 i_assert(!client->destroyed);
b5311039c179 pop3: Add client.destroyed boolean
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21721
diff changeset
557
b5311039c179 pop3: Add client.destroyed boolean
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21721
diff changeset
558 client->destroyed = TRUE;
b5311039c179 pop3: Add client.destroyed boolean
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21721
diff changeset
559
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
560 if (client->seen_change_count > 0)
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14681
diff changeset
561 (void)client_update_mails(client);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
562
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
563 if (!client->disconnected) {
18990
cd2c95d82d4c Use io_stream_get_disconnect_reason() instead of duplicating its code all over the place.
Timo Sirainen <tss@iki.fi>
parents: 18979
diff changeset
564 if (reason == NULL) {
cd2c95d82d4c Use io_stream_get_disconnect_reason() instead of duplicating its code all over the place.
Timo Sirainen <tss@iki.fi>
parents: 18979
diff changeset
565 reason = io_stream_get_disconnect_reason(client->input,
cd2c95d82d4c Use io_stream_get_disconnect_reason() instead of duplicating its code all over the place.
Timo Sirainen <tss@iki.fi>
parents: 18979
diff changeset
566 client->output);
cd2c95d82d4c Use io_stream_get_disconnect_reason() instead of duplicating its code all over the place.
Timo Sirainen <tss@iki.fi>
parents: 18979
diff changeset
567 }
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
568 i_info("%s %s", reason, client_stats(client));
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
569 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
570
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
571 if (client->cmd != NULL) {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
572 /* deinitialize command */
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
573 i_stream_close(client->input);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
574 o_stream_close(client->output);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
575 client->cmd(client);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
576 i_assert(client->cmd == NULL);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
577 }
9355
d6d4ec8ac06d imap, pop3 no longer assume that there's only a single client in process.
Timo Sirainen <tss@iki.fi>
parents: 9349
diff changeset
578
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
579 if (client->trans != NULL) {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
580 /* client didn't QUIT, but we still want to save any changes
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
581 done in this transaction. especially the cached virtual
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
582 message sizes. */
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
583 (void)mailbox_transaction_commit(&client->trans);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
584 }
16528
1352949265cc pop3: Fixed crash at deinit
Timo Sirainen <tss@iki.fi>
parents: 16347
diff changeset
585 if (array_is_created(&client->all_seqs))
1352949265cc pop3: Fixed crash at deinit
Timo Sirainen <tss@iki.fi>
parents: 16347
diff changeset
586 array_free(&client->all_seqs);
16347
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
587 if (client->deleted_kw != NULL)
5984de096e3e pop3: Added pop3_deleted_flag setting.
Timo Sirainen <tss@iki.fi>
parents: 15895
diff changeset
588 mailbox_keywords_unref(&client->deleted_kw);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
589 if (client->mailbox != NULL)
10662
8b138b29dc01 lib-storage: Split mailbox_close() and mailbox_free() functionality.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
590 mailbox_free(&client->mailbox);
9235
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9219
diff changeset
591 if (client->anvil_sent) {
9348
0c587f108916 lib-master has now a global master_service variable that all binaries use.
Timo Sirainen <tss@iki.fi>
parents: 9235
diff changeset
592 master_service_anvil_send(master_service, t_strconcat(
10144
19e67ad17398 Changed anvil ident string to have the protocol first, so username can contain '/' chars.
Timo Sirainen <tss@iki.fi>
parents: 10130
diff changeset
593 "DISCONNECT\t", my_pid, "\tpop3/",
19e67ad17398 Changed anvil ident string to have the protocol first, so username can contain '/' chars.
Timo Sirainen <tss@iki.fi>
parents: 10130
diff changeset
594 mail_user_get_anvil_userip_ident(client->user),
9235
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9219
diff changeset
595 "\n", NULL));
2e2b957f1cca Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents: 9219
diff changeset
596 }
21746
574ad44a7c80 imap, pop3, indexer-worker: Add (deinit) to process title before autoexpunging runs.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21745
diff changeset
597
15787
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
598 if (client->session_dotlock != NULL)
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
599 file_dotlock_delete(&client->session_dotlock);
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
600 if (client->to_session_dotlock_refresh != NULL)
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
601 timeout_remove(&client->to_session_dotlock_refresh);
473c0389eb10 pop3_lock_session: Use a separate dovecot-pop3-session.lock file instead of mailbox lock.
Timo Sirainen <tss@iki.fi>
parents: 15786
diff changeset
602
14563
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
603 if (client->uidl_pool != NULL)
3a095892242b pop3: Added pop3_uidl_duplicates setting.
Timo Sirainen <tss@iki.fi>
parents: 14302
diff changeset
604 pool_unref(&client->uidl_pool);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
605 i_free(client->message_sizes);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
606 i_free(client->deleted_bitmask);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
607 i_free(client->seen_bitmask);
12990
c9b7e829c6a9 pop3: Added support for showing messages in "pop3 order".
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
608 i_free(client->msgnum_to_seq_map);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
609
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
610 if (client->io != NULL)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
611 io_remove(&client->io);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
612 timeout_remove(&client->to_idle);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
613 if (client->to_commit != NULL)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
614 timeout_remove(&client->to_commit);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
615
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
616 i_stream_destroy(&client->input);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
617 o_stream_destroy(&client->output);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
618
21118
ac02caa662f2 global: Use fd_close_maybe_stdio()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20933
diff changeset
619 fd_close_maybe_stdio(&client->fd_in, &client->fd_out);
21815
920e7214f3b4 pop3: Start autoexpunging only after client is disconnected
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21814
diff changeset
620
21816
869db4bcecdb lib-storage: Replace MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE with explicit mail_user_autoexpunge()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21815
diff changeset
621 /* Autoexpunging might run for a long time. Disconnect the client
869db4bcecdb lib-storage: Replace MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE with explicit mail_user_autoexpunge()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21815
diff changeset
622 before it starts, and refresh proctitle so it's clear that it's
869db4bcecdb lib-storage: Replace MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE with explicit mail_user_autoexpunge()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21815
diff changeset
623 doing autoexpunging. We've also sent DISCONNECT to anvil already,
869db4bcecdb lib-storage: Replace MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE with explicit mail_user_autoexpunge()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21815
diff changeset
624 because this is background work and shouldn't really be counted
869db4bcecdb lib-storage: Replace MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE with explicit mail_user_autoexpunge()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21815
diff changeset
625 as an active POP3 session for the user. */
21815
920e7214f3b4 pop3: Start autoexpunging only after client is disconnected
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21814
diff changeset
626 pop3_refresh_proctitle();
21816
869db4bcecdb lib-storage: Replace MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE with explicit mail_user_autoexpunge()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21815
diff changeset
627 mail_user_autoexpunge(client->user);
21815
920e7214f3b4 pop3: Start autoexpunging only after client is disconnected
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21814
diff changeset
628 mail_user_unref(&client->user);
21671
b4dd0868ecc0 global: Replace mail_storage_service_user_free() with _unref()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21606
diff changeset
629 mail_storage_service_user_unref(&client->service_user);
17482
53742463a9fe imap, pop3: Remove the client from clients-list at the very end of the destroy function.
Timo Sirainen <tss@iki.fi>
parents: 17192
diff changeset
630
53742463a9fe imap, pop3: Remove the client from clients-list at the very end of the destroy function.
Timo Sirainen <tss@iki.fi>
parents: 17192
diff changeset
631 pop3_client_count--;
53742463a9fe imap, pop3: Remove the client from clients-list at the very end of the destroy function.
Timo Sirainen <tss@iki.fi>
parents: 17192
diff changeset
632 DLLIST_REMOVE(&pop3_clients, client);
14220
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
633 pool_unref(&client->pool);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
634
9349
04cade277134 Added missing master_service_client_connection_destroyed() calls.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
635 master_service_client_connection_destroyed(master_service);
10193
02e852b2c2c3 pop3: Added support for verbose_proctitle=yes
Timo Sirainen <tss@iki.fi>
parents: 10144
diff changeset
636 pop3_refresh_proctitle();
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
637 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
638
11645
f4238836c566 imap, pop3: Forced disconnection of client didn't always close connection immediately.
Timo Sirainen <tss@iki.fi>
parents: 11565
diff changeset
639 static void client_destroy_timeout(struct client *client)
f4238836c566 imap, pop3: Forced disconnection of client didn't always close connection immediately.
Timo Sirainen <tss@iki.fi>
parents: 11565
diff changeset
640 {
f4238836c566 imap, pop3: Forced disconnection of client didn't always close connection immediately.
Timo Sirainen <tss@iki.fi>
parents: 11565
diff changeset
641 client_destroy(client, NULL);
f4238836c566 imap, pop3: Forced disconnection of client didn't always close connection immediately.
Timo Sirainen <tss@iki.fi>
parents: 11565
diff changeset
642 }
f4238836c566 imap, pop3: Forced disconnection of client didn't always close connection immediately.
Timo Sirainen <tss@iki.fi>
parents: 11565
diff changeset
643
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
644 void client_disconnect(struct client *client, const char *reason)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
645 {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
646 if (client->disconnected)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
647 return;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
648
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
649 client->disconnected = TRUE;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
650 i_info("Disconnected: %s %s", reason, client_stats(client));
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
651
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
652 (void)o_stream_flush(client->output);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
653
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
654 i_stream_close(client->input);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
655 o_stream_close(client->output);
11645
f4238836c566 imap, pop3: Forced disconnection of client didn't always close connection immediately.
Timo Sirainen <tss@iki.fi>
parents: 11565
diff changeset
656
f4238836c566 imap, pop3: Forced disconnection of client didn't always close connection immediately.
Timo Sirainen <tss@iki.fi>
parents: 11565
diff changeset
657 if (client->to_idle != NULL)
f4238836c566 imap, pop3: Forced disconnection of client didn't always close connection immediately.
Timo Sirainen <tss@iki.fi>
parents: 11565
diff changeset
658 timeout_remove(&client->to_idle);
f4238836c566 imap, pop3: Forced disconnection of client didn't always close connection immediately.
Timo Sirainen <tss@iki.fi>
parents: 11565
diff changeset
659 client->to_idle = timeout_add(0, client_destroy_timeout, client);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
660 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
661
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14681
diff changeset
662 void client_send_line(struct client *client, const char *fmt, ...)
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
663 {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
664 va_list va;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
665 ssize_t ret;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
666
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
667 if (client->output->closed)
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14681
diff changeset
668 return;
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
669
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
670 va_start(va, fmt);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
671
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
672 T_BEGIN {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
673 string_t *str;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
674
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
675 str = t_str_new(256);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
676 str_vprintfa(str, fmt, va);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
677 str_append(str, "\r\n");
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
678
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
679 ret = o_stream_send(client->output,
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
680 str_data(str), str_len(str));
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
681 i_assert(ret < 0 || (size_t)ret == str_len(str));
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
682 } T_END;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
683 if (ret >= 0) {
15895
dcbebe49922a pop3: Fixed infinite looping
Timo Sirainen <tss@iki.fi>
parents: 15787
diff changeset
684 if (!POP3_CLIENT_OUTPUT_FULL(client))
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
685 client->last_output = ioloop_time;
15895
dcbebe49922a pop3: Fixed infinite looping
Timo Sirainen <tss@iki.fi>
parents: 15787
diff changeset
686 else if (client->io != NULL) {
dcbebe49922a pop3: Fixed infinite looping
Timo Sirainen <tss@iki.fi>
parents: 15787
diff changeset
687 /* no more input until client has read
dcbebe49922a pop3: Fixed infinite looping
Timo Sirainen <tss@iki.fi>
parents: 15787
diff changeset
688 our output */
dcbebe49922a pop3: Fixed infinite looping
Timo Sirainen <tss@iki.fi>
parents: 15787
diff changeset
689 io_remove(&client->io);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
690
15895
dcbebe49922a pop3: Fixed infinite looping
Timo Sirainen <tss@iki.fi>
parents: 15787
diff changeset
691 /* If someone happens to flush output, we want to get
dcbebe49922a pop3: Fixed infinite looping
Timo Sirainen <tss@iki.fi>
parents: 15787
diff changeset
692 our IO handler back in flush callback */
dcbebe49922a pop3: Fixed infinite looping
Timo Sirainen <tss@iki.fi>
parents: 15787
diff changeset
693 o_stream_set_flush_pending(client->output, TRUE);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
694 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
695 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
696 va_end(va);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
697 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
698
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
699 void client_send_storage_error(struct client *client)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
700 {
15785
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
701 const char *errstr;
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
702 enum mail_error error;
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
703
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
704 if (mailbox_is_inconsistent(client->mailbox)) {
15785
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
705 client_send_line(client, "-ERR [SYS/TEMP] Mailbox is in inconsistent "
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
706 "state, please relogin.");
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
707 client_disconnect(client, "Mailbox is in inconsistent state.");
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
708 return;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
709 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
710
15785
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
711 errstr = mailbox_get_last_error(client->mailbox, &error);
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
712 switch (error) {
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
713 case MAIL_ERROR_TEMP:
17716
286da24ada43 Handle "out of disk space" and "out of user quota" as separate cases.
Timo Sirainen <tss@iki.fi>
parents: 17482
diff changeset
714 case MAIL_ERROR_NOQUOTA:
15785
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
715 case MAIL_ERROR_INUSE:
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
716 client_send_line(client, "-ERR [SYS/TEMP] %s", errstr);
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
717 break;
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
718 default:
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
719 client_send_line(client, "-ERR [SYS/PERM] %s", errstr);
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
720 break;
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
721 }
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
722 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
723
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
724 bool client_handle_input(struct client *client)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
725 {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
726 char *line, *args;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
727 int ret;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
728
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
729 o_stream_cork(client->output);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
730 while (!client->output->closed &&
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
731 (line = i_stream_next_line(client->input)) != NULL) {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
732 args = strchr(line, ' ');
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
733 if (args != NULL)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
734 *args++ = '\0';
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
735
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
736 T_BEGIN {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
737 ret = client_command_execute(client, line,
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
738 args != NULL ? args : "");
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
739 } T_END;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
740 if (ret >= 0) {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
741 client->bad_counter = 0;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
742 if (client->cmd != NULL) {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
743 o_stream_set_flush_pending(client->output,
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
744 TRUE);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
745 client->waiting_input = TRUE;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
746 break;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
747 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
748 } else if (++client->bad_counter > CLIENT_MAX_BAD_COMMANDS) {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
749 client_send_line(client, "-ERR Too many bad commands.");
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
750 client_disconnect(client, "Too many bad commands.");
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
751 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
752 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
753 o_stream_uncork(client->output);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
754
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
755 if (client->output->closed) {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
756 client_destroy(client, NULL);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
757 return FALSE;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
758 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
759 return TRUE;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
760 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
761
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
762 static void client_input(struct client *client)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
763 {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
764 if (client->cmd != NULL) {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
765 /* we're still processing a command. wait until it's
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
766 finished. */
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
767 io_remove(&client->io);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
768 client->waiting_input = TRUE;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
769 return;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
770 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
771
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
772 client->waiting_input = FALSE;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
773 client->last_input = ioloop_time;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
774 timeout_reset(client->to_idle);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
775 if (client->to_commit != NULL)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
776 timeout_reset(client->to_commit);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
777
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
778 switch (i_stream_read(client->input)) {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
779 case -1:
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
780 /* disconnected */
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
781 client_destroy(client, NULL);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
782 return;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
783 case -2:
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
784 /* line too long, kill it */
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
785 client_send_line(client, "-ERR Input line too long.");
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
786 client_destroy(client, "Input line too long");
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
787 return;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
788 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
789
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
790 (void)client_handle_input(client);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
791 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
792
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
793 static int client_output(struct client *client)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
794 {
12265
f3aa8be626fa imap, pop3: Cork TCP connection before trying to flush output in output callback.
Timo Sirainen <tss@iki.fi>
parents: 12221
diff changeset
795 o_stream_cork(client->output);
11039
0f98525e4567 Removed dead code.
Timo Sirainen <tss@iki.fi>
parents: 10690
diff changeset
796 if (o_stream_flush(client->output) < 0) {
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
797 client_destroy(client, NULL);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
798 return 1;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
799 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
800
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
801 client->last_output = ioloop_time;
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
802 timeout_reset(client->to_idle);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
803 if (client->to_commit != NULL)
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
804 timeout_reset(client->to_commit);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
805
12265
f3aa8be626fa imap, pop3: Cork TCP connection before trying to flush output in output callback.
Timo Sirainen <tss@iki.fi>
parents: 12221
diff changeset
806 if (client->cmd != NULL)
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
807 client->cmd(client);
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
808
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
809 if (client->cmd == NULL) {
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
810 if (o_stream_get_buffer_used_size(client->output) <
17737
d14f30ccd118 pop3: Fixed potential assert-crash on disconnect.
Timo Sirainen <tss@iki.fi>
parents: 17716
diff changeset
811 POP3_OUTBUF_THROTTLE_SIZE/2 && client->io == NULL &&
d14f30ccd118 pop3: Fixed potential assert-crash on disconnect.
Timo Sirainen <tss@iki.fi>
parents: 17716
diff changeset
812 !client->input->closed) {
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
813 /* enable input again */
17192
a1c153c70bb9 Use io_add_istream() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
814 client->io = io_add_istream(client->input, client_input,
a1c153c70bb9 Use io_add_istream() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
815 client);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
816 }
12315
5f9919f9e321 pop3: Don't crash if client disconnects in output handler.
Timo Sirainen <tss@iki.fi>
parents: 12294
diff changeset
817 if (client->io != NULL && client->waiting_input) {
5f9919f9e321 pop3: Don't crash if client disconnects in output handler.
Timo Sirainen <tss@iki.fi>
parents: 12294
diff changeset
818 if (!client_handle_input(client)) {
5f9919f9e321 pop3: Don't crash if client disconnects in output handler.
Timo Sirainen <tss@iki.fi>
parents: 12294
diff changeset
819 /* client got destroyed */
5f9919f9e321 pop3: Don't crash if client disconnects in output handler.
Timo Sirainen <tss@iki.fi>
parents: 12294
diff changeset
820 return 1;
5f9919f9e321 pop3: Don't crash if client disconnects in output handler.
Timo Sirainen <tss@iki.fi>
parents: 12294
diff changeset
821 }
5f9919f9e321 pop3: Don't crash if client disconnects in output handler.
Timo Sirainen <tss@iki.fi>
parents: 12294
diff changeset
822 }
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
823 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
824
12265
f3aa8be626fa imap, pop3: Cork TCP connection before trying to flush output in output callback.
Timo Sirainen <tss@iki.fi>
parents: 12221
diff changeset
825 o_stream_uncork(client->output);
12294
b8803a1e2dc2 pop3: Recent corking change caused hangs.
Timo Sirainen <tss@iki.fi>
parents: 12265
diff changeset
826 if (client->cmd != NULL) {
b8803a1e2dc2 pop3: Recent corking change caused hangs.
Timo Sirainen <tss@iki.fi>
parents: 12265
diff changeset
827 /* command not finished yet */
b8803a1e2dc2 pop3: Recent corking change caused hangs.
Timo Sirainen <tss@iki.fi>
parents: 12265
diff changeset
828 return 0;
b8803a1e2dc2 pop3: Recent corking change caused hangs.
Timo Sirainen <tss@iki.fi>
parents: 12265
diff changeset
829 } else if (client->io == NULL) {
b8803a1e2dc2 pop3: Recent corking change caused hangs.
Timo Sirainen <tss@iki.fi>
parents: 12265
diff changeset
830 /* data still in output buffer, get back here to add IO */
b8803a1e2dc2 pop3: Recent corking change caused hangs.
Timo Sirainen <tss@iki.fi>
parents: 12265
diff changeset
831 return 0;
b8803a1e2dc2 pop3: Recent corking change caused hangs.
Timo Sirainen <tss@iki.fi>
parents: 12265
diff changeset
832 } else {
b8803a1e2dc2 pop3: Recent corking change caused hangs.
Timo Sirainen <tss@iki.fi>
parents: 12265
diff changeset
833 return 1;
b8803a1e2dc2 pop3: Recent corking change caused hangs.
Timo Sirainen <tss@iki.fi>
parents: 12265
diff changeset
834 }
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
835 }
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
836
17841
576da94fd669 imap, pop3: Show user's proper log prefix when deinitializing users at exit.
Timo Sirainen <tss@iki.fi>
parents: 17737
diff changeset
837 void clients_destroy_all(struct mail_storage_service_ctx *storage_service)
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
838 {
9355
d6d4ec8ac06d imap, pop3 no longer assume that there's only a single client in process.
Timo Sirainen <tss@iki.fi>
parents: 9349
diff changeset
839 while (pop3_clients != NULL) {
d6d4ec8ac06d imap, pop3 no longer assume that there's only a single client in process.
Timo Sirainen <tss@iki.fi>
parents: 9349
diff changeset
840 if (pop3_clients->cmd == NULL) {
d6d4ec8ac06d imap, pop3 no longer assume that there's only a single client in process.
Timo Sirainen <tss@iki.fi>
parents: 9349
diff changeset
841 client_send_line(pop3_clients,
15785
7e292b8352d9 pop3: Use RFC 3206 [SYS/*] and [AUTH] response codes.
Timo Sirainen <tss@iki.fi>
parents: 15784
diff changeset
842 "-ERR [SYS/TEMP] Server shutting down.");
9355
d6d4ec8ac06d imap, pop3 no longer assume that there's only a single client in process.
Timo Sirainen <tss@iki.fi>
parents: 9349
diff changeset
843 }
17841
576da94fd669 imap, pop3: Show user's proper log prefix when deinitializing users at exit.
Timo Sirainen <tss@iki.fi>
parents: 17737
diff changeset
844 mail_storage_service_io_activate_user(pop3_clients->service_user);
9355
d6d4ec8ac06d imap, pop3 no longer assume that there's only a single client in process.
Timo Sirainen <tss@iki.fi>
parents: 9349
diff changeset
845 client_destroy(pop3_clients, "Server shutting down.");
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
846 }
17841
576da94fd669 imap, pop3: Show user's proper log prefix when deinitializing users at exit.
Timo Sirainen <tss@iki.fi>
parents: 17737
diff changeset
847 mail_storage_service_io_deactivate(storage_service);
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents:
diff changeset
848 }
14220
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
849
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
850 struct pop3_client_vfuncs pop3_client_vfuncs = {
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
851 client_default_destroy
771fab474b1c pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
852 };