annotate src/plugins/pop3-migration/pop3-migration-plugin.c @ 22453:6eb5a6930614

pop3-migration: Fail if all IMAP mails were matched by size, but POP3 had extra mails This makes the handling same as what happens when the same situation happens and the last mails were matched by headers. That's an error, unless pop3_migration_ignore_*_uidls=yes.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 04 Sep 2017 19:37:12 +0300
parents 566bd6b3b348
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21389
diff changeset
1 /* Copyright (c) 2007-2017 Dovecot authors, see the included COPYING file */
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "istream.h"
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "istream-header-filter.h"
19616
af9448bcbfd9 pop3-migration: When failing because some messages couldn't be matched, show the first message's number and UIDL
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19615
diff changeset
7 #include "str.h"
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "sha1.h"
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
9 #include "message-size.h"
19691
69502e2013f3 pop3-migration: Use message_header_hash_more() instead of duplicating the code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19672
diff changeset
10 #include "message-header-hash.h"
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
11 #include "message-header-parser.h"
19635
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
12 #include "mail-cache.h"
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "mail-namespace.h"
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "mail-search-build.h"
19635
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
15 #include "index-storage.h"
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
16 #include "index-mail.h"
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #include "pop3-migration-plugin.h"
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #define POP3_MIGRATION_CONTEXT(obj) \
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 MODULE_CONTEXT(obj, pop3_migration_storage_module)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 #define POP3_MIGRATION_MAIL_CONTEXT(obj) \
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 MODULE_CONTEXT(obj, pop3_migration_mail_module)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
24 struct msg_map_common {
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
25 /* sha1(header) - set only when needed */
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
26 unsigned char hdr_sha1[SHA1_RESULTLEN];
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
27 unsigned int hdr_sha1_set:1;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
28 };
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
29
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 struct pop3_uidl_map {
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
31 struct msg_map_common common;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
32
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 uint32_t pop3_seq;
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
34 uint32_t imap_uid;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 /* UIDL */
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 const char *pop3_uidl;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 /* LIST size */
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 uoff_t size;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 };
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 struct imap_msg_map {
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
43 struct msg_map_common common;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
44
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
45 uint32_t uid, pop3_seq;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 uoff_t psize;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 const char *pop3_uidl;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 };
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 struct pop3_migration_mail_storage {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 union mail_storage_module_context module_ctx;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 const char *pop3_box_vname;
14920
a097ef0a9d6d Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents: 14835
diff changeset
54 ARRAY(struct pop3_uidl_map) pop3_uidl_map;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 unsigned int all_mailboxes:1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 unsigned int pop3_all_hdr_sha1_set:1;
17124
1c298212ab70 pop3-migration: If UIDLs can't be set, fail unless pop3_migration_ignore_missing_uidls=yes.
Timo Sirainen <tss@iki.fi>
parents: 17123
diff changeset
58 unsigned int ignore_missing_uidls:1;
22452
566bd6b3b348 pop3-migration: Add pop3_migration_ignore_extra_uidls=yes setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22451
diff changeset
59 unsigned int ignore_extra_uidls:1;
19615
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
60 unsigned int skip_size_check:1;
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
61 unsigned int skip_uidl_cache:1;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 };
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 struct pop3_migration_mailbox {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 union mailbox_module_context module_ctx;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
14920
a097ef0a9d6d Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents: 14835
diff changeset
67 ARRAY(struct imap_msg_map) imap_msg_map;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 unsigned int first_unfound_idx;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69
19635
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
70 struct mail_cache_field cache_field;
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
71
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
72 unsigned int cache_field_registered:1;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 unsigned int uidl_synced:1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 unsigned int uidl_sync_failed:1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 };
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
19614
87d9089d2c76 pop3-migration: Ignore Return-Path: header when matching UIDLs by header hashes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
77 /* NOTE: these headers must be sorted */
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 static const char *hdr_hash_skip_headers[] = {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 "Content-Length",
19614
87d9089d2c76 pop3-migration: Ignore Return-Path: header when matching UIDLs by header hashes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
80 "Return-Path", /* Yahoo IMAP has Return-Path, Yahoo POP3 doesn't */
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 "Status",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 "X-IMAP",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 "X-IMAPbase",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 "X-Keywords",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 "X-Message-Flag",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 "X-Status",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 "X-UID",
19618
591fa1448786 pop3-migration: Ignore X-Yahoo-Newman-Property: header
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19617
diff changeset
88 "X-UIDL",
591fa1448786 pop3-migration: Ignore X-Yahoo-Newman-Property: header
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19617
diff changeset
89 "X-Yahoo-Newman-Property"
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 };
15199
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
91 const char *pop3_migration_plugin_version = DOVECOT_ABI_VERSION;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 static MODULE_CONTEXT_DEFINE_INIT(pop3_migration_storage_module,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 &mail_storage_module_register);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 static MODULE_CONTEXT_DEFINE_INIT(pop3_migration_mail_module,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 &mail_module_register);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 static int imap_msg_map_uid_cmp(const struct imap_msg_map *map1,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 const struct imap_msg_map *map2)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 if (map1->uid < map2->uid)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 return -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 if (map1->uid > map2->uid)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 return 1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 static int pop3_uidl_map_pop3_seq_cmp(const struct pop3_uidl_map *map1,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 const struct pop3_uidl_map *map2)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 if (map1->pop3_seq < map2->pop3_seq)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 return -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 if (map1->pop3_seq > map2->pop3_seq)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 return 1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
118 static int pop3_uidl_map_uidl_cmp(const struct pop3_uidl_map *map1,
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
119 const struct pop3_uidl_map *map2)
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
120 {
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
121 return strcmp(map1->pop3_uidl, map2->pop3_uidl);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
122 }
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
123
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
124 static int imap_msg_map_uidl_cmp(const struct imap_msg_map *map1,
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
125 const struct imap_msg_map *map2)
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
126 {
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
127 return null_strcmp(map1->pop3_uidl, map2->pop3_uidl);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
128 }
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
129
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 static int pop3_uidl_map_hdr_cmp(const struct pop3_uidl_map *map1,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 const struct pop3_uidl_map *map2)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 {
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
133 return memcmp(map1->common.hdr_sha1, map2->common.hdr_sha1,
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
134 sizeof(map1->common.hdr_sha1));
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 static int imap_msg_map_hdr_cmp(const struct imap_msg_map *map1,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 const struct imap_msg_map *map2)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 {
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
140 return memcmp(map1->common.hdr_sha1, map2->common.hdr_sha1,
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
141 sizeof(map1->common.hdr_sha1));
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
144 struct pop3_hdr_context {
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
145 bool have_eoh;
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
146 bool stop;
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
147 };
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
148
19624
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
149 static bool header_name_is_valid(const char *name)
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
150 {
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
151 unsigned int i;
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
152
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
153 for (i = 0; name[i] != '\0'; i++) {
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
154 if ((uint8_t)name[i] <= 0x20 || name[i] >= 0x7f)
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
155 return FALSE;
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
156 }
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
157 return TRUE;
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
158 }
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
159
22265
66e02e3235d3 pop3-migration: Drop lines with only spaces or tabs from comparison
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22263
diff changeset
160 static bool header_value_want_skip(const struct message_header_line *hdr)
66e02e3235d3 pop3-migration: Drop lines with only spaces or tabs from comparison
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22263
diff changeset
161 {
66e02e3235d3 pop3-migration: Drop lines with only spaces or tabs from comparison
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22263
diff changeset
162 for (size_t i = 0; i < hdr->value_len; i++) {
66e02e3235d3 pop3-migration: Drop lines with only spaces or tabs from comparison
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22263
diff changeset
163 if (hdr->value[i] != ' ' && hdr->value[i] != '\t')
66e02e3235d3 pop3-migration: Drop lines with only spaces or tabs from comparison
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22263
diff changeset
164 return FALSE;
66e02e3235d3 pop3-migration: Drop lines with only spaces or tabs from comparison
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22263
diff changeset
165 }
66e02e3235d3 pop3-migration: Drop lines with only spaces or tabs from comparison
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22263
diff changeset
166 /* "header: \r\n \r\n" - Zimbra's BODY[HEADER] strips this line away. */
66e02e3235d3 pop3-migration: Drop lines with only spaces or tabs from comparison
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22263
diff changeset
167 return TRUE;
66e02e3235d3 pop3-migration: Drop lines with only spaces or tabs from comparison
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22263
diff changeset
168 }
66e02e3235d3 pop3-migration: Drop lines with only spaces or tabs from comparison
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22263
diff changeset
169
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
170 static void
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
171 pop3_header_filter_callback(struct header_filter_istream *input ATTR_UNUSED,
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
172 struct message_header_line *hdr,
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
173 bool *matched, struct pop3_hdr_context *ctx)
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 {
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
175 if (hdr == NULL)
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
176 return;
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
177 if (hdr->eoh) {
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
178 ctx->have_eoh = TRUE;
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
179 if (ctx->stop) {
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
180 /* matched is handled differently for eoh by
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
181 istream-header-filter. a design bug I guess.. */
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
182 *matched = FALSE;
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
183 }
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
184 } else {
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
185 if (strspn(hdr->name, "\r") == hdr->name_len) {
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
186 /* CR+CR+LF - some servers stop the header processing
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
187 here while others don't. To make sure they can be
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
188 matched correctly we want to stop here entirely. */
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
189 ctx->stop = TRUE;
22451
e2b9cadf91e4 pop3-migration: Strip away invalid header lines.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22450
diff changeset
190 } else if (!hdr->continued && hdr->middle_len == 0) {
e2b9cadf91e4 pop3-migration: Strip away invalid header lines.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22450
diff changeset
191 /* not a valid "key: value" header -
e2b9cadf91e4 pop3-migration: Strip away invalid header lines.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22450
diff changeset
192 Zimbra's BODY[HEADER] strips this line away. */
e2b9cadf91e4 pop3-migration: Strip away invalid header lines.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22450
diff changeset
193 *matched = TRUE;
22265
66e02e3235d3 pop3-migration: Drop lines with only spaces or tabs from comparison
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22263
diff changeset
194 } else if (hdr->continued && header_value_want_skip(hdr)) {
66e02e3235d3 pop3-migration: Drop lines with only spaces or tabs from comparison
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22263
diff changeset
195 *matched = TRUE;
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
196 }
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
197 if (ctx->stop)
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
198 *matched = TRUE;
19624
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
199 else if (!header_name_is_valid(hdr->name)) {
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
200 /* Yahoo IMAP drops headers with invalid names, while
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
201 Yahoo POP3 preserves them. Drop them all. */
259d971afa5a pop3-migration: Filter out headers with invalid names.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19623
diff changeset
202 *matched = TRUE;
22263
096f0c8b9cb1 pop3-migration: Replace trailing whitespace removal with new header hashing version
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22195
diff changeset
203 }
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
204 }
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
205 }
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
206
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
207 int pop3_migration_get_hdr_sha1(uint32_t mail_seq, struct istream *input,
20328
7e016f5e8cb4 [LEN] to [static LEN] on some function parameters
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 19693
diff changeset
208 unsigned char sha1_r[STATIC_ARRAY SHA1_RESULTLEN],
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
209 bool *have_eoh_r)
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
210 {
19623
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
211 const unsigned char *data;
19691
69502e2013f3 pop3-migration: Use message_header_hash_more() instead of duplicating the code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19672
diff changeset
212 size_t size;
20769
efadeff4ab8d lib-mail: message_header_hash_more() now allows input in any slices.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20767
diff changeset
213 struct message_header_hash_context hash_ctx;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 struct sha1_ctxt sha1_ctx;
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
215 struct pop3_hdr_context hdr_ctx;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 20769
diff changeset
217 i_zero(&hdr_ctx);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 /* hide headers that might change or be different in IMAP vs. POP3 */
20744
cf26a89ceb9a pop3-migration: Avoid unnecessarily using stream's hdr_size.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20730
diff changeset
219 input = i_stream_create_header_filter(input, HEADER_FILTER_HIDE_BODY |
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 HEADER_FILTER_EXCLUDE | HEADER_FILTER_NO_CR,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 hdr_hash_skip_headers,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 N_ELEMENTS(hdr_hash_skip_headers),
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
223 pop3_header_filter_callback, &hdr_ctx);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 sha1_init(&sha1_ctx);
22263
096f0c8b9cb1 pop3-migration: Replace trailing whitespace removal with new header hashing version
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22195
diff changeset
226 i_zero(&hash_ctx);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 while (i_stream_read_data(input, &data, &size, 0) > 0) {
22263
096f0c8b9cb1 pop3-migration: Replace trailing whitespace removal with new header hashing version
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22195
diff changeset
228 message_header_hash_more(&hash_ctx, &hash_method_sha1, &sha1_ctx,
096f0c8b9cb1 pop3-migration: Replace trailing whitespace removal with new header hashing version
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22195
diff changeset
229 MESSAGE_HEADER_HASH_MAX_VERSION,
19691
69502e2013f3 pop3-migration: Use message_header_hash_more() instead of duplicating the code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19672
diff changeset
230 data, size);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 i_stream_skip(input, size);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 if (input->stream_errno != 0) {
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
234 i_error("pop3_migration: Failed to read header for msg %u: %s",
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
235 mail_seq, i_stream_get_error(input));
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 i_stream_unref(&input);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 return -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 }
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
239 sha1_result(&sha1_ctx, sha1_r);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 i_stream_unref(&input);
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
241
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
242 *have_eoh_r = hdr_ctx.have_eoh;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245
19635
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
246 static unsigned int get_cache_idx(struct mail *mail)
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
247 {
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
248 struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(mail->box);
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
249
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
250 if (mbox->cache_field_registered)
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
251 return mbox->cache_field.idx;
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
252
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
253 mbox->cache_field.name = "pop3-migration.hdr";
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
254 mbox->cache_field.type = MAIL_CACHE_FIELD_FIXED_SIZE;
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
255 mbox->cache_field.field_size = SHA1_RESULTLEN;
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
256 mail_cache_register_fields(mail->box->cache, &mbox->cache_field, 1);
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
257 mbox->cache_field_registered = TRUE;
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
258 return mbox->cache_field.idx;
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
259 }
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
260
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
261 static int
20328
7e016f5e8cb4 [LEN] to [static LEN] on some function parameters
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 19693
diff changeset
262 get_hdr_sha1(struct mail *mail, unsigned char sha1_r[STATIC_ARRAY SHA1_RESULTLEN])
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
263 {
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
264 struct istream *input;
19693
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
265 const char *errstr;
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
266 enum mail_error error;
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
267 bool have_eoh;
20730
a21e038e54c7 pop3-migration-plugin: Add to index after successful retry
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20560
diff changeset
268 int ret;
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
269
20744
cf26a89ceb9a pop3-migration: Avoid unnecessarily using stream's hdr_size.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20730
diff changeset
270 if (mail_get_hdr_stream(mail, NULL, &input) < 0) {
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21649
diff changeset
271 errstr = mailbox_get_last_internal_error(mail->box, &error);
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
272 i_error("pop3_migration: Failed to get header for msg %u: %s",
19693
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
273 mail->seq, errstr);
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
274 return error == MAIL_ERROR_EXPUNGED ? 0 : -1;
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
275 }
20744
cf26a89ceb9a pop3-migration: Avoid unnecessarily using stream's hdr_size.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20730
diff changeset
276 if (pop3_migration_get_hdr_sha1(mail->seq, input, sha1_r, &have_eoh) < 0)
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
277 return -1;
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
278 if (have_eoh) {
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
279 struct index_mail *imail = (struct index_mail *)mail;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
280
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
281 index_mail_cache_add_idx(imail, get_cache_idx(mail),
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
282 sha1_r, SHA1_RESULTLEN);
19693
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
283 return 1;
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
284 }
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
285
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
286 /* The empty "end of headers" line is missing. Either this means that
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
287 the headers ended unexpectedly (which is ok) or that the remote
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
288 server is buggy. Some servers have problems with
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
289
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
290 1) header line continuations that contain only whitespace and
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
291 2) headers that have no ":". The header gets truncated when such
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
292 line is reached.
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
293
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
294 At least Oracle IMS IMAP FETCH BODY[HEADER] handles 1) by not
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
295 returning the whitespace line and 2) by returning the line but
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
296 truncating the rest. POP3 TOP instead returns the entire header.
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
297 This causes the IMAP and POP3 hashes not to match.
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
298
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
299 If there's LF+CR+CR+LF in the middle of headers, Courier IMAP's
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
300 FETCH BODY[HEADER] stops after that, but Courier POP3's TOP doesn't.
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
301
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
302 So we'll try to avoid this by falling back to full FETCH BODY[]
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
303 (and/or RETR) and we'll parse the header ourself from it. This
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
304 should work around any similar bugs in all IMAP/POP3 servers. */
20744
cf26a89ceb9a pop3-migration: Avoid unnecessarily using stream's hdr_size.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20730
diff changeset
305 if (mail_get_stream_because(mail, NULL, NULL, "pop3-migration", &input) < 0) {
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21649
diff changeset
306 errstr = mailbox_get_last_internal_error(mail->box, &error);
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
307 i_error("pop3_migration: Failed to get body for msg %u: %s",
19693
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
308 mail->seq, errstr);
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
309 return error == MAIL_ERROR_EXPUNGED ? 0 : -1;
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
310 }
20744
cf26a89ceb9a pop3-migration: Avoid unnecessarily using stream's hdr_size.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20730
diff changeset
311 ret = pop3_migration_get_hdr_sha1(mail->seq, input, sha1_r, &have_eoh);
20730
a21e038e54c7 pop3-migration-plugin: Add to index after successful retry
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20560
diff changeset
312 if (ret == 0) {
a21e038e54c7 pop3-migration-plugin: Add to index after successful retry
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20560
diff changeset
313 if (!have_eoh)
a21e038e54c7 pop3-migration-plugin: Add to index after successful retry
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20560
diff changeset
314 i_warning("pop3_migration: Truncated email with UID %u stored as truncated", mail->uid);
a21e038e54c7 pop3-migration-plugin: Add to index after successful retry
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20560
diff changeset
315 struct index_mail *imail = (struct index_mail *)mail;
a21e038e54c7 pop3-migration-plugin: Add to index after successful retry
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20560
diff changeset
316 index_mail_cache_add_idx(imail, get_cache_idx(mail),
a21e038e54c7 pop3-migration-plugin: Add to index after successful retry
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20560
diff changeset
317 sha1_r, SHA1_RESULTLEN);
a21e038e54c7 pop3-migration-plugin: Add to index after successful retry
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20560
diff changeset
318 return 1;
a21e038e54c7 pop3-migration-plugin: Add to index after successful retry
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20560
diff changeset
319 } else {
a21e038e54c7 pop3-migration-plugin: Add to index after successful retry
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20560
diff changeset
320 return -1;
a21e038e54c7 pop3-migration-plugin: Add to index after successful retry
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20560
diff changeset
321 }
17122
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
322 }
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
323
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
324 static bool
19635
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
325 get_cached_hdr_sha1(struct mail *mail, buffer_t *cache_buf,
20328
7e016f5e8cb4 [LEN] to [static LEN] on some function parameters
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 19693
diff changeset
326 unsigned char sha1_r[STATIC_ARRAY SHA1_RESULTLEN])
19635
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
327 {
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
328 struct index_mail *imail = (struct index_mail *)mail;
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
329
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
330 buffer_set_used_size(cache_buf, 0);
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
331 if (index_mail_cache_lookup_field(imail, cache_buf,
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
332 get_cache_idx(mail)) > 0 &&
19635
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
333 cache_buf->used == SHA1_RESULTLEN) {
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
334 memcpy(sha1_r, cache_buf->data, cache_buf->used);
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
335 return TRUE;
19635
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
336 }
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
337 return FALSE;
19635
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
338 }
3712091cf4d0 pop3-migration: Add calculated header hashes to local cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19625
diff changeset
339
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
340 static struct mailbox *pop3_mailbox_alloc(struct mail_storage *storage)
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 struct pop3_migration_mail_storage *mstorage =
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 POP3_MIGRATION_CONTEXT(storage);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 struct mail_namespace *ns;
21878
e78a42ead488 global: Add mailbox_set_reason() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21814
diff changeset
345 struct mailbox *box;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 ns = mail_namespace_find(storage->user->namespaces,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 mstorage->pop3_box_vname);
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
349 i_assert(ns != NULL);
21878
e78a42ead488 global: Add mailbox_set_reason() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21814
diff changeset
350 box = mailbox_alloc(ns->list, mstorage->pop3_box_vname,
e78a42ead488 global: Add mailbox_set_reason() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21814
diff changeset
351 MAILBOX_FLAG_READONLY | MAILBOX_FLAG_POP3_SESSION);
e78a42ead488 global: Add mailbox_set_reason() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21814
diff changeset
352 mailbox_set_reason(box, "pop3_migration");
e78a42ead488 global: Add mailbox_set_reason() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21814
diff changeset
353 return box;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
356 static int pop3_map_read(struct mail_storage *storage, struct mailbox *pop3_box)
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 struct pop3_migration_mail_storage *mstorage =
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 POP3_MIGRATION_CONTEXT(storage);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 struct mailbox_transaction_context *t;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 struct mail_search_args *search_args;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 struct mail_search_context *ctx;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 struct mail *mail;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364 struct pop3_uidl_map *map;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 const char *uidl;
19615
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
366 uoff_t size = (uoff_t)-1;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 int ret = 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 if (array_is_created(&mstorage->pop3_uidl_map)) {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 /* already read these, just reset the imap_uids */
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 array_foreach_modifiable(&mstorage->pop3_uidl_map, map)
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
372 map->imap_uid = 0;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 i_array_init(&mstorage->pop3_uidl_map, 128);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 if (mailbox_sync(pop3_box, 0) < 0) {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 i_error("pop3_migration: Couldn't sync mailbox %s: %s",
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21649
diff changeset
379 pop3_box->vname, mailbox_get_last_internal_error(pop3_box, NULL));
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 return -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 t = mailbox_transaction_begin(pop3_box, 0);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 search_args = mail_search_build_init();
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 mail_search_build_add_all(search_args);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 ctx = mailbox_search_init(t, search_args, NULL,
19615
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
387 mstorage->skip_size_check ? 0 :
18912
64568a033fc8 pop3-migration: Fetch physical sizes instead of virtual sizes so pop3c uses LIST
Timo Sirainen <tss@iki.fi>
parents: 18911
diff changeset
388 MAIL_FETCH_PHYSICAL_SIZE, NULL);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 mail_search_args_unref(&search_args);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 while (mailbox_search_next(ctx, &mail)) {
18911
4bebfbb32410 pop3-migration: Use LIST instead of RETRs to get the messages' sizes.
Timo Sirainen <tss@iki.fi>
parents: 18909
diff changeset
392 /* get the size with LIST instead of RETR */
4bebfbb32410 pop3-migration: Use LIST instead of RETRs to get the messages' sizes.
Timo Sirainen <tss@iki.fi>
parents: 18909
diff changeset
393 mail->lookup_abort = MAIL_LOOKUP_ABORT_READ_MAIL;
4bebfbb32410 pop3-migration: Use LIST instead of RETRs to get the messages' sizes.
Timo Sirainen <tss@iki.fi>
parents: 18909
diff changeset
394
19615
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
395 if (mstorage->skip_size_check)
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
396 ;
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
397 else if (mail_get_physical_size(mail, &size) < 0) {
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 i_error("pop3_migration: Failed to get size for msg %u: %s",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 mail->seq,
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21649
diff changeset
400 mailbox_get_last_internal_error(pop3_box, NULL));
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 ret = -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 break;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 }
21649
78f38a28086e lib-storage, pop3-migration: Reset lookup_abort before continuing to search
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
404 mail->lookup_abort = MAIL_LOOKUP_ABORT_NEVER;
78f38a28086e lib-storage, pop3-migration: Reset lookup_abort before continuing to search
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
405
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 if (mail_get_special(mail, MAIL_FETCH_UIDL_BACKEND, &uidl) < 0) {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407 i_error("pop3_migration: Failed to get UIDL for msg %u: %s",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 mail->seq,
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21649
diff changeset
409 mailbox_get_last_internal_error(pop3_box, NULL));
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 ret = -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 break;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 if (*uidl == '\0') {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 i_warning("pop3_migration: UIDL for msg %u is empty",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415 mail->seq);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 continue;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 map = array_append_space(&mstorage->pop3_uidl_map);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 map->pop3_seq = mail->seq;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 map->pop3_uidl = p_strdup(storage->pool, uidl);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 map->size = size;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
425 if (mailbox_search_deinit(&ctx) < 0) {
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
426 i_error("pop3_migration: Failed to search all POP3 mails: %s",
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21649
diff changeset
427 mailbox_get_last_internal_error(pop3_box, NULL));
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428 ret = -1;
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
429 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 (void)mailbox_transaction_commit(&t);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 return ret;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
434 static void
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
435 pop3_map_read_cached_hdr_hashes(struct mailbox_transaction_context *t,
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
436 struct mail_search_args *search_args,
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
437 struct array *msg_map)
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
438 {
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
439 struct mail_search_context *ctx;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
440 struct mail *mail;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
441 struct msg_map_common *map;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
442 buffer_t *cache_buf;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
443
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
444 ctx = mailbox_search_init(t, search_args, NULL, 0, NULL);
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
445 cache_buf = buffer_create_dynamic(pool_datastack_create(), SHA1_RESULTLEN);
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
446
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
447 while (mailbox_search_next(ctx, &mail)) {
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
448 map = array_idx_modifiable_i(msg_map, mail->seq-1);
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
449
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
450 if (get_cached_hdr_sha1(mail, cache_buf, map->hdr_sha1))
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
451 map->hdr_sha1_set = TRUE;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
452 }
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
453
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
454 if (mailbox_search_deinit(&ctx) < 0) {
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
455 i_warning("pop3_migration: Failed to search all cached POP3 header hashes: %s - ignoring",
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21649
diff changeset
456 mailbox_get_last_internal_error(t->box, NULL));
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
457 }
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
458 }
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
459
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
460 static void map_remove_found_seqs(struct mail_search_arg *search_arg,
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
461 struct array *msg_map, uint32_t seq1)
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
462 {
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
463 const struct msg_map_common *map;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
464 uint32_t seq, count = array_count_i(msg_map);
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
465
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
466 i_assert(search_arg->type == SEARCH_SEQSET);
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
467
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
468 for (seq = seq1; seq <= count; seq++) {
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
469 map = array_idx_i(msg_map, seq-1);
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
470 if (map->hdr_sha1_set)
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
471 seq_range_array_remove(&search_arg->value.seqset, seq);
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
472 }
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
473 }
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
474
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
475 static int
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
476 map_read_hdr_hashes(struct mailbox *box, struct array *msg_map, uint32_t seq1)
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
477 {
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
478 struct mailbox_transaction_context *t;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
479 struct mail_search_args *search_args;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
480 struct mail_search_context *ctx;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
481 struct mail *mail;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
482 struct msg_map_common *map;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
483 int ret = 0;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
484
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
485 t = mailbox_transaction_begin(box, 0);
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
486 /* get all the cached hashes */
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
487 search_args = mail_search_build_init();
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
488 mail_search_build_add_seqset(search_args, seq1, array_count_i(msg_map));
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
489 pop3_map_read_cached_hdr_hashes(t, search_args, msg_map);
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
490 /* read all the non-cached hashes. doing this in two passes allows
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
491 us to set wanted_fields=MAIL_FETCH_STREAM_HEADER, which allows
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
492 prefetching to work without downloading all the headers even
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
493 for mails that already are cached. */
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
494 map_remove_found_seqs(search_args->args, msg_map, seq1);
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
495 ctx = mailbox_search_init(t, search_args, NULL,
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
496 MAIL_FETCH_STREAM_HEADER, NULL);
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
497 mail_search_args_unref(&search_args);
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
498
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
499 while (mailbox_search_next(ctx, &mail)) {
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
500 map = array_idx_modifiable_i(msg_map, mail->seq-1);
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
501
19693
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
502 if ((ret = get_hdr_sha1(mail, map->hdr_sha1)) < 0) {
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
503 ret = -1;
19647
8f2ba9ebc463 pop3-migration: If reading message header for hashing fails, fail immediately.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19646
diff changeset
504 break;
8f2ba9ebc463 pop3-migration: If reading message header for hashing fails, fail immediately.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19646
diff changeset
505 }
19693
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
506 if (ret > 0)
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
507 map->hdr_sha1_set = TRUE;
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
508 }
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
509
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
510 if (mailbox_search_deinit(&ctx) < 0) {
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
511 i_error("pop3_migration: Failed to search all mail headers: %s",
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21649
diff changeset
512 mailbox_get_last_internal_error(box, NULL));
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
513 ret = -1;
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
514 }
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
515 (void)mailbox_transaction_commit(&t);
19693
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
516 return ret < 0 ? -1 : 0;
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
517 }
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
518
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
519 static int
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
520 pop3_map_read_hdr_hashes(struct mail_storage *storage, struct mailbox *pop3_box,
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
521 unsigned first_seq)
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
522 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
523 struct pop3_migration_mail_storage *mstorage =
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
524 POP3_MIGRATION_CONTEXT(storage);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 if (mstorage->pop3_all_hdr_sha1_set)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
528 if (mstorage->all_mailboxes) {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
529 /* we may be matching against multiple mailboxes.
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
530 read all the hashes only once. */
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531 first_seq = 1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
534 if (map_read_hdr_hashes(pop3_box, &mstorage->pop3_uidl_map.arr,
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
535 first_seq) < 0)
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
536 return -1;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
537
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
538 if (first_seq == 1)
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
539 mstorage->pop3_all_hdr_sha1_set = TRUE;
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
540 return 0;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
541 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
542
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
543 static int imap_map_read(struct mailbox *box)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
544 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
545 struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(box);
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
546 struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(box);
19615
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
547 struct pop3_migration_mail_storage *mstorage =
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
548 POP3_MIGRATION_CONTEXT(box->storage);
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
549 const unsigned int uidl_cache_idx =
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
550 ibox->cache_fields[MAIL_CACHE_POP3_UIDL].idx;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
551 struct mailbox_status status;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
552 struct mailbox_transaction_context *t;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
553 struct mail_search_args *search_args;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
554 struct mail_search_context *ctx;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
555 struct mail *mail;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
556 struct imap_msg_map *map;
19615
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
557 uoff_t psize = (uoff_t)-1;
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
558 string_t *uidl;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
559 int ret = 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
560
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561 mailbox_get_open_status(box, STATUS_MESSAGES, &status);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
562
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
563 i_assert(!array_is_created(&mbox->imap_msg_map));
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
564 p_array_init(&mbox->imap_msg_map, box->pool, status.messages);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
565
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566 t = mailbox_transaction_begin(box, 0);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
567 search_args = mail_search_build_init();
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
568 mail_search_build_add_all(search_args);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
569 ctx = mailbox_search_init(t, search_args, NULL,
19615
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
570 mstorage->skip_size_check ? 0 :
14402
87cd04f35f82 pop3-replication: Don't request virtual size from IMAP mailbox, we don't need it.
Timo Sirainen <tss@iki.fi>
parents: 14401
diff changeset
571 MAIL_FETCH_PHYSICAL_SIZE, NULL);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
572 mail_search_args_unref(&search_args);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
573
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
574 uidl = t_str_new(64);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
575 while (mailbox_search_next(ctx, &mail)) {
19615
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
576 if (mstorage->skip_size_check)
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
577 ;
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
578 else if (mail_get_physical_size(mail, &psize) < 0) {
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
579 i_error("pop3_migration: Failed to get psize for imap uid %u: %s",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
580 mail->uid,
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21649
diff changeset
581 mailbox_get_last_internal_error(box, NULL));
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
582 ret = -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
583 break;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
584 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
585
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
586 if (!mstorage->skip_uidl_cache) {
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
587 str_truncate(uidl, 0);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
588 (void)mail_cache_lookup_field(mail->transaction->cache_view,
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
589 uidl, mail->seq, uidl_cache_idx);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
590 }
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
591
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
592 map = array_append_space(&mbox->imap_msg_map);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
593 map->uid = mail->uid;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
594 map->psize = psize;
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
595 map->pop3_uidl = p_strdup_empty(box->pool, str_c(uidl));
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
596 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
597
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
598 if (mailbox_search_deinit(&ctx) < 0) {
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
599 i_error("pop3_migration: Failed to search all IMAP mails: %s",
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21649
diff changeset
600 mailbox_get_last_internal_error(box, NULL));
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
601 ret = -1;
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
602 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
603 (void)mailbox_transaction_commit(&t);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
604 return ret;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
605 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
606
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
607 static int imap_map_read_hdr_hashes(struct mailbox *box)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
608 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
609 struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(box);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
610
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
611 return map_read_hdr_hashes(box, &mbox->imap_msg_map.arr,
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
612 mbox->first_unfound_idx+1);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
613 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
614
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
615 static void pop3_uidl_assign_cached(struct mailbox *box)
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
616 {
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
617 struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(box);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
618 struct pop3_migration_mail_storage *mstorage =
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
619 POP3_MIGRATION_CONTEXT(box->storage);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
620 struct pop3_uidl_map *pop3_map;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
621 struct imap_msg_map *imap_map;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
622 unsigned int imap_idx, pop3_idx, pop3_count, imap_count;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
623 int ret;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
624
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
625 if (mstorage->skip_uidl_cache)
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
626 return;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
627
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
628 array_sort(&mstorage->pop3_uidl_map, pop3_uidl_map_uidl_cmp);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
629 array_sort(&mbox->imap_msg_map, imap_msg_map_uidl_cmp);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
630
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
631 pop3_map = array_get_modifiable(&mstorage->pop3_uidl_map, &pop3_count);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
632 imap_map = array_get_modifiable(&mbox->imap_msg_map, &imap_count);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
633
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
634 /* see if we can match the messages using sizes */
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
635 for (imap_idx = pop3_idx = 0; imap_idx < imap_count; imap_idx++) {
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
636 if (imap_map[imap_idx].pop3_uidl == NULL)
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
637 continue;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
638
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
639 ret = 1;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
640 for (; pop3_idx < pop3_count; pop3_idx++) {
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
641 ret = strcmp(imap_map[imap_idx].pop3_uidl,
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
642 pop3_map[pop3_idx].pop3_uidl);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
643 if (ret >= 0)
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
644 break;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
645 }
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
646 if (ret == 0) {
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
647 imap_map[imap_idx].pop3_seq =
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
648 pop3_map[pop3_idx].pop3_seq;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
649 pop3_map[pop3_idx].imap_uid = imap_map[imap_idx].uid;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
650 }
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
651 }
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
652 }
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
653
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 static bool pop3_uidl_assign_by_size(struct mailbox *box)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
655 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
656 struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(box);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
657 struct pop3_migration_mail_storage *mstorage =
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
658 POP3_MIGRATION_CONTEXT(box->storage);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
659 struct pop3_uidl_map *pop3_map;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
660 struct imap_msg_map *imap_map;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
661 unsigned int i, pop3_count, imap_count, count;
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
662 unsigned int size_match = 0, uidl_match = 0;
19644
defab5b9af2a pop3-migration: Don't even try to match message sizes with pop3_migration_skip_size_check=yes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19640
diff changeset
663
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
664 pop3_map = array_get_modifiable(&mstorage->pop3_uidl_map, &pop3_count);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
665 imap_map = array_get_modifiable(&mbox->imap_msg_map, &imap_count);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
666 count = I_MIN(pop3_count, imap_count);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
667
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
668 /* see if we can match the messages using sizes */
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
669 for (i = 0; i < count; i++) {
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
670 if (imap_map[i].pop3_uidl != NULL) {
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
671 /* some of the UIDLs were already found cached. */
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
672 if (strcmp(pop3_map[i].pop3_uidl, imap_map[i].pop3_uidl) == 0) {
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
673 uidl_match++;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
674 continue;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
675 }
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
676 /* mismatch - can't trust the sizes */
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
677 break;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
678 }
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
679
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
680 if (pop3_map[i].size != imap_map[i].psize ||
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
681 mstorage->skip_size_check)
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
682 break;
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
683 if (i+1 < count && pop3_map[i].size == pop3_map[i+1].size) {
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
684 /* two messages with same size, don't trust them */
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
685 break;
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
686 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
688 size_match++;
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
689 pop3_map[i].imap_uid = imap_map[i].uid;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
690 imap_map[i].pop3_uidl = pop3_map[i].pop3_uidl;
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
691 imap_map[i].pop3_seq = pop3_map[i].pop3_seq;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
692 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
693 mbox->first_unfound_idx = i;
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
694 if (box->storage->user->mail_debug) {
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
695 i_debug("pop3_migration: cached uidls=%u, size matches=%u, total=%u",
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
696 uidl_match, size_match, count);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
697 }
22453
6eb5a6930614 pop3-migration: Fail if all IMAP mails were matched by size, but POP3 had extra mails
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22452
diff changeset
698 return i == count && imap_count == pop3_count;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
699 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
700
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
701 static int
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
702 pop3_uidl_assign_by_hdr_hash(struct mailbox *box, struct mailbox *pop3_box)
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
703 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
704 struct pop3_migration_mail_storage *mstorage =
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
705 POP3_MIGRATION_CONTEXT(box->storage);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
706 struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(box);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
707 struct pop3_uidl_map *pop3_map;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
708 struct imap_msg_map *imap_map;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
709 unsigned int pop3_idx, imap_idx, pop3_count, imap_count;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
710 unsigned int first_seq, missing_uids_count;
20767
6140ec208b4b pop3-migration: "first POP3 msg" warning didn't actually show the first one.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20746
diff changeset
711 uint32_t first_missing_idx = 0, first_missing_seq = (uint32_t)-1;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
712 int ret;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
713
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
714 first_seq = mbox->first_unfound_idx+1;
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
715 if (pop3_map_read_hdr_hashes(box->storage, pop3_box, first_seq) < 0 ||
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
716 imap_map_read_hdr_hashes(box) < 0)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
717 return -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
718
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
719 array_sort(&mstorage->pop3_uidl_map, pop3_uidl_map_hdr_cmp);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
720 array_sort(&mbox->imap_msg_map, imap_msg_map_hdr_cmp);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
721
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
722 pop3_map = array_get_modifiable(&mstorage->pop3_uidl_map, &pop3_count);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
723 imap_map = array_get_modifiable(&mbox->imap_msg_map, &imap_count);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
724
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
725 pop3_idx = imap_idx = 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
726 while (pop3_idx < pop3_count && imap_idx < imap_count) {
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
727 if (!pop3_map[pop3_idx].common.hdr_sha1_set ||
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
728 pop3_map[pop3_idx].imap_uid != 0) {
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
729 pop3_idx++;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
730 continue;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
731 }
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
732 if (!imap_map[imap_idx].common.hdr_sha1_set ||
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
733 imap_map[imap_idx].pop3_uidl != NULL) {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
734 imap_idx++;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
735 continue;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
736 }
19640
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
737 ret = memcmp(pop3_map[pop3_idx].common.hdr_sha1,
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
738 imap_map[imap_idx].common.hdr_sha1,
b6dafead7c40 pop3-migration: Cached header hashes weren't actually being used for imapc.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19635
diff changeset
739 sizeof(pop3_map[pop3_idx].common.hdr_sha1));
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
740 if (ret < 0)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
741 pop3_idx++;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
742 else if (ret > 0)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
743 imap_idx++;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
744 else {
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
745 pop3_map[pop3_idx].imap_uid = imap_map[imap_idx].uid;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
746 imap_map[imap_idx].pop3_uidl =
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
747 pop3_map[pop3_idx].pop3_uidl;
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
748 imap_map[imap_idx].pop3_seq =
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
749 pop3_map[pop3_idx].pop3_seq;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
750 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
751 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
752 missing_uids_count = 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
753 for (pop3_idx = 0; pop3_idx < pop3_count; pop3_idx++) {
19693
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
754 if (pop3_map[pop3_idx].imap_uid != 0) {
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
755 /* matched */
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
756 } else if (!pop3_map[pop3_idx].common.hdr_sha1_set) {
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
757 /* we treated this mail as expunged - ignore */
dacdabcd8085 pop3-migration: Ignore mails returned as expunged by pop3c.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19691
diff changeset
758 } else {
20767
6140ec208b4b pop3-migration: "first POP3 msg" warning didn't actually show the first one.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20746
diff changeset
759 uint32_t seq = pop3_map[pop3_idx].pop3_seq;
6140ec208b4b pop3-migration: "first POP3 msg" warning didn't actually show the first one.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20746
diff changeset
760 if (first_missing_seq > seq) {
6140ec208b4b pop3-migration: "first POP3 msg" warning didn't actually show the first one.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20746
diff changeset
761 first_missing_seq = seq;
19617
7b0a093df334 pop3-migration: When logging the first missing POP3 mail, it logged a wrong mail
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19616
diff changeset
762 first_missing_idx = pop3_idx;
20767
6140ec208b4b pop3-migration: "first POP3 msg" warning didn't actually show the first one.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20746
diff changeset
763 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
764 missing_uids_count++;
18908
b51dfee18fd2 pop3-migration: Show the first message's number and UIDL which wasn't found from IMAP.
Timo Sirainen <tss@iki.fi>
parents: 18624
diff changeset
765 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
766 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
767 if (missing_uids_count > 0 && !mstorage->all_mailboxes) {
19616
af9448bcbfd9 pop3-migration: When failing because some messages couldn't be matched, show the first message's number and UIDL
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19615
diff changeset
768 string_t *str = t_str_new(128);
22452
566bd6b3b348 pop3-migration: Add pop3_migration_ignore_extra_uidls=yes setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22451
diff changeset
769 bool all_imap_mails_found = FALSE;
19616
af9448bcbfd9 pop3-migration: When failing because some messages couldn't be matched, show the first message's number and UIDL
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19615
diff changeset
770
af9448bcbfd9 pop3-migration: When failing because some messages couldn't be matched, show the first message's number and UIDL
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19615
diff changeset
771 str_printfa(str, "pop3_migration: %u POP3 messages have no "
af9448bcbfd9 pop3-migration: When failing because some messages couldn't be matched, show the first message's number and UIDL
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19615
diff changeset
772 "matching IMAP messages (first POP3 msg %u UIDL %s)",
20767
6140ec208b4b pop3-migration: "first POP3 msg" warning didn't actually show the first one.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20746
diff changeset
773 missing_uids_count, first_missing_seq,
19616
af9448bcbfd9 pop3-migration: When failing because some messages couldn't be matched, show the first message's number and UIDL
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19615
diff changeset
774 pop3_map[first_missing_idx].pop3_uidl);
19619
c1ba198e8b50 pop3-migration: If we matched all the IMAP (but not all POP3) messages, log about it.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19618
diff changeset
775 if (imap_count + missing_uids_count == pop3_count) {
c1ba198e8b50 pop3-migration: If we matched all the IMAP (but not all POP3) messages, log about it.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19618
diff changeset
776 str_append(str, " - all IMAP messages were found "
c1ba198e8b50 pop3-migration: If we matched all the IMAP (but not all POP3) messages, log about it.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19618
diff changeset
777 "(POP3 contains more than IMAP INBOX - you may want to set pop3_migration_all_mailboxes=yes)");
22452
566bd6b3b348 pop3-migration: Add pop3_migration_ignore_extra_uidls=yes setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22451
diff changeset
778 all_imap_mails_found = TRUE;
19619
c1ba198e8b50 pop3-migration: If we matched all the IMAP (but not all POP3) messages, log about it.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19618
diff changeset
779 }
22452
566bd6b3b348 pop3-migration: Add pop3_migration_ignore_extra_uidls=yes setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22451
diff changeset
780 if (all_imap_mails_found && mstorage->ignore_extra_uidls) {
566bd6b3b348 pop3-migration: Add pop3_migration_ignore_extra_uidls=yes setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22451
diff changeset
781 /* pop3 had more mails than imap. maybe it was just
566bd6b3b348 pop3-migration: Add pop3_migration_ignore_extra_uidls=yes setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22451
diff changeset
782 that a new mail was just delivered. */
566bd6b3b348 pop3-migration: Add pop3_migration_ignore_extra_uidls=yes setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22451
diff changeset
783 } else if (!mstorage->ignore_missing_uidls) {
566bd6b3b348 pop3-migration: Add pop3_migration_ignore_extra_uidls=yes setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22451
diff changeset
784 str_append(str, " - set pop3_migration_ignore_missing_uidls=yes");
566bd6b3b348 pop3-migration: Add pop3_migration_ignore_extra_uidls=yes setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22451
diff changeset
785 if (all_imap_mails_found)
566bd6b3b348 pop3-migration: Add pop3_migration_ignore_extra_uidls=yes setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22451
diff changeset
786 str_append(str, " or pop3_migration_ignore_extra_uidls=yes");
566bd6b3b348 pop3-migration: Add pop3_migration_ignore_extra_uidls=yes setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22451
diff changeset
787 i_error("%s to continue anyway", str_c(str));
17124
1c298212ab70 pop3-migration: If UIDLs can't be set, fail unless pop3_migration_ignore_missing_uidls=yes.
Timo Sirainen <tss@iki.fi>
parents: 17123
diff changeset
788 return -1;
1c298212ab70 pop3-migration: If UIDLs can't be set, fail unless pop3_migration_ignore_missing_uidls=yes.
Timo Sirainen <tss@iki.fi>
parents: 17123
diff changeset
789 }
19616
af9448bcbfd9 pop3-migration: When failing because some messages couldn't be matched, show the first message's number and UIDL
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19615
diff changeset
790 i_warning("%s", str_c(str));
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
791 } else if (box->storage->user->mail_debug) {
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
792 i_debug("pop3_migration: %u mails matched by headers", pop3_count);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
793 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
794 array_sort(&mstorage->pop3_uidl_map, pop3_uidl_map_pop3_seq_cmp);
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
795 array_sort(&mbox->imap_msg_map, imap_msg_map_uid_cmp);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
796 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
797 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
798
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
799 static void imap_uidls_add_to_cache(struct mailbox *box)
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
800 {
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
801 struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(box);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
802 struct mailbox_transaction_context *t;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
803 struct mail *mail;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
804 struct index_mail *imail;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
805 struct imap_msg_map *imap_map;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
806 unsigned int i, count;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
807 unsigned int field_idx;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
808
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
809 t = mailbox_transaction_begin(box, 0);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
810 mail = mail_alloc(t, 0, NULL);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
811 imail = (struct index_mail *)mail;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
812 field_idx = imail->ibox->cache_fields[MAIL_CACHE_POP3_UIDL].idx;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
813
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
814 imap_map = array_get_modifiable(&mbox->imap_msg_map, &count);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
815 for (i = 0; i < count; i++) {
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
816 if (imap_map[i].pop3_uidl == NULL)
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
817 continue;
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
818
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
819 if (!mail_set_uid(mail, imap_map[i].uid))
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
820 i_unreached();
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
821 if (mail_cache_field_can_add(t->cache_trans, mail->seq, field_idx)) {
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
822 index_mail_cache_add_idx(imail, field_idx,
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
823 imap_map[i].pop3_uidl, strlen(imap_map[i].pop3_uidl)+1);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
824 }
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
825 }
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
826 mail_free(&mail);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
827 (void)mailbox_transaction_commit(&t);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
828 }
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
829
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
830 static int pop3_migration_uidl_sync(struct mailbox *box)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
831 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
832 struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(box);
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
833 struct pop3_migration_mail_storage *mstorage =
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
834 POP3_MIGRATION_CONTEXT(box->storage);
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
835 struct mailbox *pop3_box;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
836
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
837 pop3_box = pop3_mailbox_alloc(box->storage);
14835
ab6a4455b27d pop3-migration: Avoid disconnection from POP3 server due to idling.
Timo Sirainen <tss@iki.fi>
parents: 14423
diff changeset
838 /* the POP3 server isn't connected to yet. handle all IMAP traffic
ab6a4455b27d pop3-migration: Avoid disconnection from POP3 server due to idling.
Timo Sirainen <tss@iki.fi>
parents: 14423
diff changeset
839 first before connecting, so POP3 server won't disconnect us due to
ab6a4455b27d pop3-migration: Avoid disconnection from POP3 server due to idling.
Timo Sirainen <tss@iki.fi>
parents: 14423
diff changeset
840 idling. */
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
841 if (imap_map_read(box) < 0 ||
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
842 pop3_map_read(box->storage, pop3_box) < 0) {
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
843 mailbox_free(&pop3_box);
14835
ab6a4455b27d pop3-migration: Avoid disconnection from POP3 server due to idling.
Timo Sirainen <tss@iki.fi>
parents: 14423
diff changeset
844 return -1;
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
845 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
846
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
847 pop3_uidl_assign_cached(box);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
848
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
849 array_sort(&mstorage->pop3_uidl_map, pop3_uidl_map_pop3_seq_cmp);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
850 array_sort(&mbox->imap_msg_map, imap_msg_map_uid_cmp);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
851
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
852 if (!pop3_uidl_assign_by_size(box)) {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
853 /* everything wasn't assigned, figure out the rest with
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
854 header hashes */
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
855 if (pop3_uidl_assign_by_hdr_hash(box, pop3_box) < 0) {
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
856 mailbox_free(&pop3_box);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
857 return -1;
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
858 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
859 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
860
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
861 if (!mstorage->skip_uidl_cache)
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
862 imap_uidls_add_to_cache(box);
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
863
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
864 mbox->uidl_synced = TRUE;
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
865 mailbox_free(&pop3_box);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
866 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
867 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
868
19654
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
869 static int pop3_migration_uidl_sync_if_needed(struct mailbox *box)
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
870 {
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
871 struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(box);
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
872
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
873 if (mbox->uidl_synced)
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
874 return 0;
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
875
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
876 if (mbox->uidl_sync_failed ||
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
877 pop3_migration_uidl_sync(box) < 0) {
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
878 mbox->uidl_sync_failed = TRUE;
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
879 mail_storage_set_error(box->storage, MAIL_ERROR_TEMP,
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
880 "POP3 UIDLs couldn't be synced");
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
881 return -1;
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
882 }
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
883 return 0;
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
884 }
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
885
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
886 static int
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
887 pop3_migration_get_special(struct mail *_mail, enum mail_fetch_field field,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
888 const char **value_r)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
889 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
890 struct mail_private *mail = (struct mail_private *)_mail;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
891 union mail_module_context *mmail = POP3_MIGRATION_MAIL_CONTEXT(mail);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
892 struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(_mail->box);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
893 struct imap_msg_map map_key, *map;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
894
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
895 if (field == MAIL_FETCH_UIDL_BACKEND ||
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
896 field == MAIL_FETCH_POP3_ORDER) {
19654
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
897 if (pop3_migration_uidl_sync_if_needed(_mail->box) < 0)
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
898 return -1;
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
899
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 20769
diff changeset
900 i_zero(&map_key);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
901 map_key.uid = _mail->uid;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
902 map = array_bsearch(&mbox->imap_msg_map, &map_key,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
903 imap_msg_map_uid_cmp);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
904 if (map != NULL && map->pop3_uidl != NULL) {
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
905 if (field == MAIL_FETCH_UIDL_BACKEND)
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
906 *value_r = map->pop3_uidl;
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
907 else
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
908 *value_r = t_strdup_printf("%u", map->pop3_seq);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
909 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
910 }
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
911 /* not found from POP3 server, fallback to default */
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
912 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
913 return mmail->super.get_special(_mail, field, value_r);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
914 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
915
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
916 static void pop3_migration_mail_allocated(struct mail *_mail)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
917 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
918 struct pop3_migration_mail_storage *mstorage =
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
919 POP3_MIGRATION_CONTEXT(_mail->box->storage);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
920 struct mail_private *mail = (struct mail_private *)_mail;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
921 struct mail_vfuncs *v = mail->vlast;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
922 union mail_module_context *mmail;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
923 struct mail_namespace *ns;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
924
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
925 if (mstorage == NULL ||
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
926 (!mstorage->all_mailboxes && !_mail->box->inbox_user)) {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
927 /* assigns UIDLs only for INBOX */
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
928 return;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
929 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
930
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
931 ns = mail_namespace_find(_mail->box->storage->user->namespaces,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
932 mstorage->pop3_box_vname);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
933 if (ns == mailbox_get_namespace(_mail->box)) {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
934 /* we're accessing the pop3-migration namespace itself */
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
935 return;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
936 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
937
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
938 mmail = p_new(mail->pool, union mail_module_context, 1);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
939 mmail->super = *v;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
940 mail->vlast = &mmail->super;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
941
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
942 v->get_special = pop3_migration_get_special;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
943 MODULE_CONTEXT_SET_SELF(mail, pop3_migration_mail_module, mmail);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
944 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
945
19654
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
946 static struct mail_search_context *
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
947 pop3_migration_mailbox_search_init(struct mailbox_transaction_context *t,
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
948 struct mail_search_args *args,
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
949 const enum mail_sort_type *sort_program,
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
950 enum mail_fetch_field wanted_fields,
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
951 struct mailbox_header_lookup_ctx *wanted_headers)
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
952 {
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
953 struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(t->box);
19672
e7849490acd9 pop3-migration: Fix to 5407a86 - don't sync POP3 UIDLs when we don't need to
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19654
diff changeset
954 struct pop3_migration_mail_storage *mstorage =
e7849490acd9 pop3-migration: Fix to 5407a86 - don't sync POP3 UIDLs when we don't need to
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19654
diff changeset
955 POP3_MIGRATION_CONTEXT(t->box->storage);
19654
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
956
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
957 if ((wanted_fields & (MAIL_FETCH_UIDL_BACKEND |
19672
e7849490acd9 pop3-migration: Fix to 5407a86 - don't sync POP3 UIDLs when we don't need to
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19654
diff changeset
958 MAIL_FETCH_POP3_ORDER)) != 0 &&
e7849490acd9 pop3-migration: Fix to 5407a86 - don't sync POP3 UIDLs when we don't need to
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19654
diff changeset
959 (mstorage->all_mailboxes || t->box->inbox_user)) {
19654
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
960 /* Start POP3 UIDL syncing before the search, so we'll do it
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
961 before we start sending any FETCH BODY[]s to IMAP. It
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
962 shouldn't matter much, except this works around a bug in
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
963 Yahoo IMAP where it sometimes breaks its state when doing
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
964 a FETCH BODY[] followed by FETCH BODY[HEADER].. */
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
965 (void)pop3_migration_uidl_sync_if_needed(t->box);
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
966 }
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
967
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
968 return mbox->module_ctx.super.search_init(t, args, sort_program,
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
969 wanted_fields, wanted_headers);
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
970 }
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
971
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
972 static void pop3_migration_mailbox_allocated(struct mailbox *box)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
973 {
20746
6c827dbef85e pop3-migration: Fixed crash when not specifying pop3_migration_mailbox setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20744
diff changeset
974 struct pop3_migration_mail_storage *mstorage =
6c827dbef85e pop3-migration: Fixed crash when not specifying pop3_migration_mailbox setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20744
diff changeset
975 POP3_MIGRATION_CONTEXT(box->storage);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
976 struct mailbox_vfuncs *v = box->vlast;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
977 struct pop3_migration_mailbox *mbox;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
978
20746
6c827dbef85e pop3-migration: Fixed crash when not specifying pop3_migration_mailbox setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20744
diff changeset
979 if (mstorage == NULL)
6c827dbef85e pop3-migration: Fixed crash when not specifying pop3_migration_mailbox setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20744
diff changeset
980 return;
6c827dbef85e pop3-migration: Fixed crash when not specifying pop3_migration_mailbox setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20744
diff changeset
981
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
982 mbox = p_new(box->pool, struct pop3_migration_mailbox, 1);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
983 mbox->module_ctx.super = *v;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
984 box->vlast = &mbox->module_ctx.super;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
985
19654
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
986 v->search_init = pop3_migration_mailbox_search_init;
ff56bb2c713c pop3-migration: Perform UIDL syncing a bit earlier to work around Yahoo IMAP bug.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19647
diff changeset
987
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
988 MODULE_CONTEXT_SET(box, pop3_migration_storage_module, mbox);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
989 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
990
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
991 static void pop3_migration_mail_storage_destroy(struct mail_storage *storage)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
992 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
993 struct pop3_migration_mail_storage *mstorage =
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
994 POP3_MIGRATION_CONTEXT(storage);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
995
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
996 if (array_is_created(&mstorage->pop3_uidl_map))
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
997 array_free(&mstorage->pop3_uidl_map);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
998
15272
ca10d2e8d8e3 lib-storage: Moved mail attribute dict to struct mail_storage.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
999 mstorage->module_ctx.super.destroy(storage);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1000 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1001
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1002 static void pop3_migration_mail_storage_created(struct mail_storage *storage)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1003 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1004 struct pop3_migration_mail_storage *mstorage;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1005 struct mail_storage_vfuncs *v = storage->vlast;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1006 const char *pop3_box_vname;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1007
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1008 pop3_box_vname = mail_user_plugin_getenv(storage->user,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1009 "pop3_migration_mailbox");
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
1010 if (pop3_box_vname == NULL) {
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
1011 if (storage->user->mail_debug)
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
1012 i_debug("pop3_migration: No pop3_migration_mailbox setting - disabled");
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1013 return;
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
1014 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1015
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1016 mstorage = p_new(storage->pool, struct pop3_migration_mail_storage, 1);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1017 mstorage->module_ctx.super = *v;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1018 storage->vlast = &mstorage->module_ctx.super;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1019 v->destroy = pop3_migration_mail_storage_destroy;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1020
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1021 mstorage->pop3_box_vname = p_strdup(storage->pool, pop3_box_vname);
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
1022 mstorage->all_mailboxes =
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
1023 mail_user_plugin_getenv(storage->user,
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
1024 "pop3_migration_all_mailboxes") != NULL;
17124
1c298212ab70 pop3-migration: If UIDLs can't be set, fail unless pop3_migration_ignore_missing_uidls=yes.
Timo Sirainen <tss@iki.fi>
parents: 17123
diff changeset
1025 mstorage->ignore_missing_uidls =
1c298212ab70 pop3-migration: If UIDLs can't be set, fail unless pop3_migration_ignore_missing_uidls=yes.
Timo Sirainen <tss@iki.fi>
parents: 17123
diff changeset
1026 mail_user_plugin_getenv(storage->user,
1c298212ab70 pop3-migration: If UIDLs can't be set, fail unless pop3_migration_ignore_missing_uidls=yes.
Timo Sirainen <tss@iki.fi>
parents: 17123
diff changeset
1027 "pop3_migration_ignore_missing_uidls") != NULL;
22452
566bd6b3b348 pop3-migration: Add pop3_migration_ignore_extra_uidls=yes setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22451
diff changeset
1028 mstorage->ignore_extra_uidls =
566bd6b3b348 pop3-migration: Add pop3_migration_ignore_extra_uidls=yes setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22451
diff changeset
1029 mail_user_plugin_getenv(storage->user,
566bd6b3b348 pop3-migration: Add pop3_migration_ignore_extra_uidls=yes setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22451
diff changeset
1030 "pop3_migration_ignore_extra_uidls") != NULL;
19615
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
1031 mstorage->skip_size_check =
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
1032 mail_user_plugin_getenv(storage->user,
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
1033 "pop3_migration_skip_size_check") != NULL;
22450
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
1034 mstorage->skip_uidl_cache =
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
1035 mail_user_plugin_getenv(storage->user,
1ff8f91dafba pop3-migration: Try to assign UIDLs based on dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22449
diff changeset
1036 "pop3_migration_skip_uidl_cache") != NULL;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1037
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1038 MODULE_CONTEXT_SET(storage, pop3_migration_storage_module, mstorage);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1039 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1040
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1041 static struct mail_storage_hooks pop3_migration_mail_storage_hooks = {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1042 .mail_allocated = pop3_migration_mail_allocated,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1043 .mailbox_allocated = pop3_migration_mailbox_allocated,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1044 .mail_storage_created = pop3_migration_mail_storage_created
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1045 };
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1046
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1047 void pop3_migration_plugin_init(struct module *module)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1048 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1049 mail_storage_hooks_add(module, &pop3_migration_mail_storage_hooks);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1050 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1051
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1052 void pop3_migration_plugin_deinit(void)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1053 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1054 mail_storage_hooks_remove(&pop3_migration_mail_storage_hooks);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1055 }