annotate src/plugins/pop3-migration/pop3-migration-plugin.c @ 19623:7e08d7ae86be

pop3-migration: Convert all non-ASCII in headers to '?'
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Sun, 24 Jan 2016 19:23:59 +0200
parents c1ba198e8b50
children 259d971afa5a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19552
0f22db71df7a global: freshen copyright
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 18912
diff changeset
1 /* Copyright (c) 2007-2016 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"
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
10 #include "message-header-parser.h"
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "mail-namespace.h"
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "mail-search-build.h"
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "mail-storage-private.h"
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #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
15
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #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
17 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
18 #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
19 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
20
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 struct pop3_uidl_map {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 uint32_t pop3_seq;
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
23 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
24
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 /* UIDL */
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 const char *pop3_uidl;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 /* LIST size */
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 uoff_t size;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 /* sha1(TOP 0) - set only when needed */
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 unsigned char hdr_sha1[SHA1_RESULTLEN];
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 unsigned int hdr_sha1_set:1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 };
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 struct imap_msg_map {
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
35 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
36 uoff_t psize;
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
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 /* sha1(header) - set only when needed */
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 unsigned char hdr_sha1[SHA1_RESULTLEN];
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 unsigned int hdr_sha1_set:1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 };
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 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
45 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
46
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 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
48 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
49
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 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
51 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
52 unsigned int ignore_missing_uidls:1;
19615
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
53 unsigned int skip_size_check:1;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 };
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 struct pop3_migration_mailbox {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 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
58
14920
a097ef0a9d6d Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents: 14835
diff changeset
59 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
60 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
61
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 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
63 unsigned int uidl_sync_failed:1;
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
64 unsigned int uidl_ordered:1;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 };
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
19614
87d9089d2c76 pop3-migration: Ignore Return-Path: header when matching UIDLs by header hashes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
67 /* 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
68 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
69 "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
70 "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
71 "Status",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 "X-IMAP",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 "X-IMAPbase",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 "X-Keywords",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 "X-Message-Flag",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 "X-Status",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 "X-UID",
19618
591fa1448786 pop3-migration: Ignore X-Yahoo-Newman-Property: header
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19617
diff changeset
78 "X-UIDL",
591fa1448786 pop3-migration: Ignore X-Yahoo-Newman-Property: header
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19617
diff changeset
79 "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
80 };
15199
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
81 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
82
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 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
84 &mail_storage_module_register);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 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
86 &mail_module_register);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 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
89 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
90 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 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
92 return -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 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
94 return 1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 }
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 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
99 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
100 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 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
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->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
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_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
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 return memcmp(map1->hdr_sha1, map2->hdr_sha1, sizeof(map1->hdr_sha1));
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 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
115 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
116 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 return memcmp(map1->hdr_sha1, map2->hdr_sha1, sizeof(map1->hdr_sha1));
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
120 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
121 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
122 bool stop;
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
123 };
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
124
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
125 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
126 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
127 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
128 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
129 {
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
130 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
131 return;
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
132 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
133 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
134 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
135 /* 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
136 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
137 *matched = FALSE;
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
138 }
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
139 } else {
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
140 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
141 /* 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
142 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
143 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
144 ctx->stop = TRUE;
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
145 }
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
146 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
147 *matched = TRUE;
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
148 }
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
149 }
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
150
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
151 int pop3_migration_get_hdr_sha1(uint32_t mail_seq, struct istream *input,
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
152 uoff_t hdr_size,
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
153 unsigned char sha1_r[SHA1_RESULTLEN],
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
154 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
155 {
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
156 struct istream *input2;
19623
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
157 const unsigned char *data;
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
158 size_t i, start, size;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 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
160 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
161
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
162 memset(&hdr_ctx, 0, sizeof(hdr_ctx));
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
163 input2 = i_stream_create_limit(input, hdr_size);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 /* hide headers that might change or be different in IMAP vs. POP3 */
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
165 input = i_stream_create_header_filter(input2,
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 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
167 hdr_hash_skip_headers,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 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
169 pop3_header_filter_callback, &hdr_ctx);
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
170 i_stream_unref(&input2);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 sha1_init(&sha1_ctx);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 while (i_stream_read_data(input, &data, &size, 0) > 0) {
19623
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
174 /* - Dovecot IMAP replaces NULs with 0x80 character.
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
175 - Dovecot POP3 with outlook-no-nuls workaround replaces NULs
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
176 with 0x80 character.
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
177 - Zimbra replaces 8bit chars with '?' in header fetches,
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
178 but not body fetches.
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
179 - Yahoo replaces 8bit chars with '?' in partial header
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
180 fetches, but not POP3 TOP.
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
181
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
182 So we'll just replace all control and 8bit chars with '?',
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
183 which hopefully will satisfy everybody.
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
184 */
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
185 for (i = start = 0; i < size; i++) {
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
186 if (data[i] < 0x20 || data[i] >= 0x80) {
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
187 sha1_loop(&sha1_ctx, data + start, i-start);
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
188 sha1_loop(&sha1_ctx, "?", 1);
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
189 start = i+1;
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
190 }
17123
3839e4e62413 pop3-migration: Convert NULs to 0x80 chars in header when hashing.
Timo Sirainen <tss@iki.fi>
parents: 17122
diff changeset
191 }
19623
7e08d7ae86be pop3-migration: Convert all non-ASCII in headers to '?'
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19619
diff changeset
192 sha1_loop(&sha1_ctx, data + start, i-start);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 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
194 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 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
196 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
197 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
198 i_stream_unref(&input);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 return -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 }
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
201 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
202 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
203
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
204 *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
205 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207
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
208 static int
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
209 get_hdr_sha1(struct mail *mail, unsigned char sha1_r[SHA1_RESULTLEN])
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 {
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
211 struct istream *input;
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
212 struct message_size hdr_size;
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
213 bool have_eoh;
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
214
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
215 if (mail_get_hdr_stream(mail, &hdr_size, &input) < 0) {
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
216 i_error("pop3_migration: Failed to get header for msg %u: %s",
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
217 mail->seq, mailbox_get_last_error(mail->box, NULL));
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
218 return -1;
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
219 }
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
220 if (pop3_migration_get_hdr_sha1(mail->seq, input,
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
221 hdr_size.physical_size,
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
222 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
223 return -1;
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
224 if (have_eoh)
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
225 return 0;
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
226
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
227 /* 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
228 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
229 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
230
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
231 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
232 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
233 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
234
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
235 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
236 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
237 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
238 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
239
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
240 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
241 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
242
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
243 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
244 (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
245 should work around any similar bugs in all IMAP/POP3 servers. */
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
246 if (mail_get_stream(mail, &hdr_size, NULL, &input) < 0) {
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
247 i_error("pop3_migration: Failed to get body for msg %u: %s",
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
248 mail->seq, mailbox_get_last_error(mail->box, NULL));
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
249 return -1;
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
250 }
18909
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
251 return pop3_migration_get_hdr_sha1(mail->seq, input,
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
252 hdr_size.physical_size,
ab441df52e86 pop3-migration: Truncate header if there's line containing only CR(s).
Timo Sirainen <tss@iki.fi>
parents: 18908
diff changeset
253 sha1_r, &have_eoh);
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
254
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
255 }
18d0ce83bf7a pop3-migration: Work around IMAP/POP3 server bugs which truncate the header too early.
Timo Sirainen <tss@iki.fi>
parents: 16500
diff changeset
256
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
257 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
258 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 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
260 POP3_MIGRATION_CONTEXT(storage);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 struct mail_namespace *ns;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 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
264 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
265 i_assert(ns != NULL);
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
266 return mailbox_alloc(ns->list, mstorage->pop3_box_vname,
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
267 MAILBOX_FLAG_READONLY | MAILBOX_FLAG_POP3_SESSION);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
270 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
271 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 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
273 POP3_MIGRATION_CONTEXT(storage);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 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
275 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
276 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
277 struct mail *mail;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 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
279 const char *uidl;
19615
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
280 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
281 int ret = 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 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
284 /* 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
285 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
286 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
287 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 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
290
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 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
292 i_error("pop3_migration: Couldn't sync mailbox %s: %s",
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 pop3_box->vname, mailbox_get_last_error(pop3_box, NULL));
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 return -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 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
298 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
299 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
300 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
301 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
302 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
303 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
304
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 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
306 /* 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
307 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
308
19615
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
309 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
310 ;
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
311 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
312 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
313 mail->seq,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 mailbox_get_last_error(pop3_box, NULL));
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 ret = -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 break;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 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
319 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
320 mail->seq,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 mailbox_get_last_error(pop3_box, NULL));
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 ret = -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 break;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 if (*uidl == '\0') {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 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
327 mail->seq);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 continue;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 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
332 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
333 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
334 map->size = size;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
337 if (mailbox_search_deinit(&ctx) < 0) {
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
338 i_error("pop3_migration: Failed to search all POP3 mails: %s",
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
339 mailbox_get_last_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
340 ret = -1;
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
341 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 (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
343 return ret;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
346 static int
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
347 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
348 unsigned first_seq)
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 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
351 POP3_MIGRATION_CONTEXT(storage);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 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
353 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
354 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
355 struct mail *mail;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 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
357 int ret = 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 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
360 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 if (mstorage->all_mailboxes) {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 /* 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
363 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
364 first_seq = 1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
367 t = mailbox_transaction_begin(pop3_box, 0);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 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
369 mail_search_build_add_seqset(search_args, first_seq,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 array_count(&mstorage->pop3_uidl_map)+1);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 ctx = mailbox_search_init(t, search_args, NULL,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 MAIL_FETCH_STREAM_HEADER, NULL);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 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
374
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 while (mailbox_search_next(ctx, &mail)) {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 map = array_idx_modifiable(&mstorage->pop3_uidl_map,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 mail->seq-1);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 if (get_hdr_sha1(mail, map->hdr_sha1) < 0)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 ret = -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 else
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 map->hdr_sha1_set = TRUE;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
385 if (mailbox_search_deinit(&ctx) < 0) {
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
386 i_error("pop3_migration: Failed to search all POP3 mail hashes: %s",
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
387 mailbox_get_last_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
388 ret = -1;
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
389 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 (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
391 if (ret == 0 && first_seq == 1)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 mstorage->pop3_all_hdr_sha1_set = TRUE;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 return ret;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 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
397 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(box);
19615
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
399 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
400 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
401 struct mailbox_status status;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 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
403 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
404 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
405 struct mail *mail;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 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
407 uoff_t psize = (uoff_t)-1;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 int ret = 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 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
411
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 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
413 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
414
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415 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
416 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
417 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
418 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
419 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
420 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
421 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
422
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 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
424 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
425 ;
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
426 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
427 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
428 mail->uid,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 mailbox_get_last_error(box, NULL));
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 ret = -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 break;
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
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 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
435 map->uid = mail->uid;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436 map->psize = psize;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
439 if (mailbox_search_deinit(&ctx) < 0) {
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
440 i_error("pop3_migration: Failed to search all IMAP mails: %s",
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
441 mailbox_get_last_error(box, NULL));
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 ret = -1;
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
443 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 (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
445 return ret;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 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
449 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 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
451 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
452 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
453 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
454 struct mail *mail;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455 struct imap_msg_map *map;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456 int ret = 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 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
459 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
460 mail_search_build_add_seqset(search_args, mbox->first_unfound_idx+1,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
461 array_count(&mbox->imap_msg_map)+1);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 ctx = mailbox_search_init(t, search_args, NULL,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463 MAIL_FETCH_STREAM_HEADER, NULL);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464 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
465
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466 while (mailbox_search_next(ctx, &mail)) {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 map = array_idx_modifiable(&mbox->imap_msg_map, mail->seq-1);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469 if (get_hdr_sha1(mail, map->hdr_sha1) < 0)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
470 ret = -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 else
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
472 map->hdr_sha1_set = TRUE;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
474
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
475 if (mailbox_search_deinit(&ctx) < 0) {
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
476 i_error("pop3_migration: Failed to search all IMAP mail hashes: %s",
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
477 mailbox_get_last_error(box, NULL));
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478 ret = -1;
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
479 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480 (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
481 return ret;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
483
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
484 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
485 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
486 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
487 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
488 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
489 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
490 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
491 unsigned int i, pop3_count, imap_count, count;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
492
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 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
494 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
495 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
496
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
497 /* 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
498 for (i = 0; i < count; i++) {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499 if (pop3_map[i].size != imap_map[i].psize)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
500 break;
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
501 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
502 /* 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
503 break;
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
504 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
505
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
506 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
507 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
508 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
509 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
510 mbox->first_unfound_idx = i;
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
511 if (box->storage->user->mail_debug)
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
512 i_debug("pop3_migration: %u/%u mails matched by size", i, count);
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
513 return i == count;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
514 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
515
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
516 static int
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
517 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
518 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
519 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
520 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
521 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
522 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
523 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
524 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
525 unsigned int first_seq, 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
526 uint32_t first_missing_idx = (uint32_t)-1;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527 int ret;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
528
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
529 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
530 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
531 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
532 return -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
534 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
535 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
536
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
537 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
538 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
539
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
540 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
541 while (pop3_idx < pop3_count && imap_idx < imap_count) {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
542 if (!pop3_map[pop3_idx].hdr_sha1_set ||
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
543 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
544 pop3_idx++;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
545 continue;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
546 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
547 if (!imap_map[imap_idx].hdr_sha1_set ||
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548 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
549 imap_idx++;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
550 continue;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
551 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
552 ret = memcmp(pop3_map[pop3_idx].hdr_sha1,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
553 imap_map[imap_idx].hdr_sha1,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
554 sizeof(pop3_map[pop3_idx].hdr_sha1));
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
555 if (ret < 0)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
556 pop3_idx++;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
557 else if (ret > 0)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
558 imap_idx++;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
559 else {
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
560 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
561 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
562 pop3_map[pop3_idx].pop3_uidl;
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
563 imap_map[imap_idx].pop3_seq =
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
564 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
565 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
567 missing_uids_count = 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
568 for (pop3_idx = 0; pop3_idx < pop3_count; pop3_idx++) {
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
569 if (pop3_map[pop3_idx].imap_uid == 0) {
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
570 if (first_missing_idx == (uint32_t)-1)
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
571 first_missing_idx = pop3_idx;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
572 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
573 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
574 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
575 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
576 string_t *str = t_str_new(128);
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
577
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
578 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
579 "matching IMAP messages (first POP3 msg %u UIDL %s)",
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
580 missing_uids_count,
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
581 pop3_map[first_missing_idx].pop3_seq,
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
582 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
583 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
584 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
585 "(POP3 contains more than IMAP INBOX - you may want to set pop3_migration_all_mailboxes=yes)");
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
586 }
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
587 if (!mstorage->ignore_missing_uidls) {
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
588 i_error("%s - set pop3_migration_ignore_missing_uidls=yes to continue anyway",
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
589 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
590 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
591 }
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
592 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
593 } 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
594 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
595 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
596 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
597 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
598 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
599 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
600
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
601 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
602 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
603 struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(box);
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
604 struct pop3_migration_mail_storage *mstorage =
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
605 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
606 struct mailbox *pop3_box;
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
607 const struct pop3_uidl_map *pop3_map;
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
608 unsigned int i, count;
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
609 uint32_t prev_uid;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
610
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
611 if (mbox->uidl_synced)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
612 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
613
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
614 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
615 /* 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
616 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
617 idling. */
16500
c903fbcbf5d2 pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
618 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
619 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
620 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
621 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
622 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
623
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
624 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
625 /* 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
626 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
627 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
628 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
629 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
630 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
631 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
632
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
633 /* see if the POP3 UIDL order is the same as IMAP UID order */
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
634 mbox->uidl_ordered = TRUE;
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
635 pop3_map = array_get(&mstorage->pop3_uidl_map, &count);
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
636 prev_uid = 0;
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
637 for (i = 0; i < count; i++) {
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
638 if (pop3_map[i].imap_uid == 0)
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
639 continue;
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
640
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
641 if (prev_uid > pop3_map[i].imap_uid) {
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
642 mbox->uidl_ordered = FALSE;
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
643 break;
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
644 }
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
645 prev_uid = pop3_map[i].imap_uid;
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
646 }
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
647
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
648 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
649 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
650 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
651 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
652
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
653 static int
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 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
655 const char **value_r)
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
656 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
657 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
658 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
659 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
660 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
661
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
662 if (field == MAIL_FETCH_UIDL_BACKEND ||
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
663 field == MAIL_FETCH_POP3_ORDER) {
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
664 if (mbox->uidl_sync_failed ||
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
665 pop3_migration_uidl_sync(_mail->box) < 0) {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
666 mbox->uidl_sync_failed = TRUE;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
667 mail_storage_set_error(_mail->box->storage,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
668 MAIL_ERROR_TEMP,
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
669 "POP3 UIDLs couldn't be synced");
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
670 return -1;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
671 }
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
672
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
673 memset(&map_key, 0, sizeof(map_key));
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
674 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
675 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
676 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
677 if (map != NULL && map->pop3_uidl != NULL) {
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
678 if (field == MAIL_FETCH_UIDL_BACKEND)
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
679 *value_r = map->pop3_uidl;
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
680 else
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
681 *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
682 return 0;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
683 }
14401
6df2235fd6af pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents: 14398
diff changeset
684 /* 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
685 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
686 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
687 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
688
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
689 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
690 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
691 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
692 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
693 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
694 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
695 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
696 struct mail_namespace *ns;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
697
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
698 if (mstorage == NULL ||
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
699 (!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
700 /* 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
701 return;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
702 }
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 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
705 mstorage->pop3_box_vname);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
706 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
707 /* 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
708 return;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
709 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
710
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
711 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
712 mmail->super = *v;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
713 mail->vlast = &mmail->super;
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
714
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
715 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
716 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
717 }
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 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
720 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
721 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
722 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
723
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
724 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
725 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
726 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
727
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
728 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
729 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
730
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
731 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
732 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
733 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
734 POP3_MIGRATION_CONTEXT(storage);
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
735
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
736 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
737 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
738
15272
ca10d2e8d8e3 lib-storage: Moved mail attribute dict to struct mail_storage.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
739 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
740 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
741
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
742 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
743 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
744 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
745 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
746 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
747
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
748 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
749 "pop3_migration_mailbox");
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
750 if (pop3_box_vname == NULL) {
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
751 if (storage->user->mail_debug)
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
752 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
753 return;
18624
3903badc4ee0 pop3-migration: Added more debug and error logging.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
754 }
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
755
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
756 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
757 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
758 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
759 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
760
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
761 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
762 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
763 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
764 "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
765 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
766 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
767 "pop3_migration_ignore_missing_uidls") != NULL;
19615
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
768 mstorage->skip_size_check =
152ed3cd2bad pop3-migration: Added pop3_migration_skip_size_check setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19614
diff changeset
769 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
770 "pop3_migration_skip_size_check") != NULL;
14398
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
771
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
772 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
773 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
774
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
775 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
776 .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
777 .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
778 .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
779 };
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
780
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
781 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
782 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
783 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
784 }
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
785
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
786 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
787 {
78317179b4af Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
788 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
789 }