Mercurial > dovecot > core-2.2
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 |
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 | 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 | 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 | 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 | 585 if (array_is_created(&client->all_seqs)) |
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 | 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 | 686 else if (client->io != NULL) { |
687 /* no more input until client has read | |
688 our output */ | |
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 | 691 /* If someone happens to flush output, we want to get |
692 our IO handler back in flush callback */ | |
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 | 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 }; |