Mercurial > dovecot > core-2.2
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 |
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 } |