Mercurial > dovecot > core-2.2
annotate src/plugins/pop3-migration/pop3-migration-plugin.c @ 16500:c903fbcbf5d2
pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Fixes a memory leak where the user wasn't destroyed at all because the
mailbox still caused the user to be referenced.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 12 Jun 2013 22:45:43 +0300 |
parents | 36ef72481934 |
children | 18d0ce83bf7a |
rev | line source |
---|---|
15715
36ef72481934
Oops :) Update copyrights to 2013 without breaking all .c files.
Timo Sirainen <tss@iki.fi>
parents:
15714
diff
changeset
|
1 /* Copyright (c) 2007-2013 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" |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "sha1.h" |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
8 #include "message-size.h" |
14398
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "mail-namespace.h" |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #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
|
11 #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
|
12 #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
|
13 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #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
|
15 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
|
16 #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
|
17 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
|
18 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 struct pop3_uidl_map { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 uint32_t pop3_seq; |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
21 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
|
22 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 /* UIDL */ |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 const char *pop3_uidl; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 /* LIST size */ |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 uoff_t size; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 /* 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
|
28 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
|
29 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
|
30 }; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 struct imap_msg_map { |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
33 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
|
34 uoff_t psize; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 const char *pop3_uidl; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 /* 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
|
38 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
|
39 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
|
40 }; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 struct pop3_migration_mail_storage { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 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
|
44 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 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
|
46 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
|
47 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 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
|
49 unsigned int pop3_all_hdr_sha1_set:1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 }; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 struct pop3_migration_mailbox { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 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
|
54 |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14835
diff
changeset
|
55 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
|
56 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
|
57 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 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
|
59 unsigned int uidl_sync_failed:1; |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
60 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
|
61 }; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 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
|
64 "Content-Length", |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 "Status", |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 "X-IMAP", |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 "X-IMAPbase", |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 "X-Keywords", |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 "X-Message-Flag", |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 "X-Status", |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 "X-UID", |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 "X-UIDL" |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 }; |
15199
73916b7be94e
Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents:
14921
diff
changeset
|
74 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
|
75 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 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
|
77 &mail_storage_module_register); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 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
|
79 &mail_module_register); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 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
|
82 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
|
83 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 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
|
85 return -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 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
|
87 return 1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 return 0; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 } |
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 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
|
92 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
|
93 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 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
|
95 return -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 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
|
97 return 1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 return 0; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 } |
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 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
|
102 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
|
103 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 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
|
105 } |
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 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
|
108 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
|
109 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 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
|
111 } |
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 static int get_hdr_sha1(struct mail *mail, unsigned char sha1[SHA1_RESULTLEN]) |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 { |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
115 struct message_size hdr_size; |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
116 struct istream *input, *input2; |
14398
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 const unsigned char *data; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 size_t size; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 struct sha1_ctxt sha1_ctx; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
121 if (mail_get_hdr_stream(mail, &hdr_size, &input) < 0) { |
14423
52ad5a66ee58
pop3-migration: Error message improvement.
Timo Sirainen <tss@iki.fi>
parents:
14402
diff
changeset
|
122 i_error("pop3_migration: Failed to get header for msg %u: %s", |
52ad5a66ee58
pop3-migration: Error message improvement.
Timo Sirainen <tss@iki.fi>
parents:
14402
diff
changeset
|
123 mail->seq, mailbox_get_last_error(mail->box, NULL)); |
14398
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 return -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 } |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
126 input2 = i_stream_create_limit(input, hdr_size.physical_size); |
14398
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 /* 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
|
128 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
|
129 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
|
130 hdr_hash_skip_headers, |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 N_ELEMENTS(hdr_hash_skip_headers), |
14921
d3db2ba15d00
Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
132 *null_header_filter_callback, (void *)NULL); |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
133 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
|
134 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 sha1_init(&sha1_ctx); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 while (i_stream_read_data(input, &data, &size, 0) > 0) { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 sha1_loop(&sha1_ctx, data, size); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 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
|
139 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 if (input->stream_errno != 0) { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 i_error("pop3_migration: Failed to read header for msg %u: %m", |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 mail->seq); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 i_stream_unref(&input); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 return -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 sha1_result(&sha1_ctx, sha1); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 i_stream_unref(&input); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 return 0; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 |
16500
c903fbcbf5d2
pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
151 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
|
152 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 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
|
154 POP3_MIGRATION_CONTEXT(storage); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 struct mail_namespace *ns; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 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
|
158 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
|
159 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
|
160 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
|
161 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
|
162 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 |
16500
c903fbcbf5d2
pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
164 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
|
165 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 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
|
167 POP3_MIGRATION_CONTEXT(storage); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 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
|
169 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
|
170 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
|
171 struct mail *mail; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 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
|
173 const char *uidl; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 uoff_t size; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 int ret = 0; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 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
|
178 /* 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
|
179 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
|
180 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
|
181 return 0; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 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
|
184 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 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
|
186 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
|
187 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
|
188 return -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 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
|
192 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
|
193 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
|
194 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
|
195 MAIL_FETCH_VIRTUAL_SIZE, NULL); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 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
|
197 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 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
|
199 if (mail_get_virtual_size(mail, &size) < 0) { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 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
|
201 mail->seq, |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 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
|
203 ret = -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 break; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 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
|
207 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
|
208 mail->seq, |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 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
|
210 ret = -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 break; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 if (*uidl == '\0') { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 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
|
215 mail->seq); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 continue; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 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
|
220 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
|
221 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
|
222 map->size = size; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 if (mailbox_search_deinit(&ctx) < 0) |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 ret = -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 (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
|
228 return ret; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 |
16500
c903fbcbf5d2
pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
231 static int |
c903fbcbf5d2
pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
232 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
|
233 unsigned first_seq) |
14398
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 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
|
236 POP3_MIGRATION_CONTEXT(storage); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 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
|
238 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
|
239 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
|
240 struct mail *mail; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 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
|
242 int ret = 0; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 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
|
245 return 0; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 if (mstorage->all_mailboxes) { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 /* 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
|
248 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
|
249 first_seq = 1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 |
16500
c903fbcbf5d2
pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
252 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
|
253 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
|
254 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
|
255 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
|
256 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
|
257 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
|
258 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
|
259 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 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
|
261 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
|
262 mail->seq-1); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 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
|
265 ret = -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 else |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 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
|
268 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 if (mailbox_search_deinit(&ctx) < 0) |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 ret = -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 (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
|
273 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
|
274 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
|
275 return ret; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 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
|
279 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 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
|
281 struct mailbox_status status; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 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
|
283 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
|
284 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
|
285 struct mail *mail; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 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
|
287 uoff_t psize; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 int ret = 0; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 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
|
291 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 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
|
293 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
|
294 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 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
|
296 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
|
297 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
|
298 ctx = mailbox_search_init(t, search_args, NULL, |
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
|
299 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
|
300 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
|
301 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 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
|
303 if (mail_get_physical_size(mail, &psize) < 0) { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 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
|
305 mail->uid, |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 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
|
307 ret = -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 break; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 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
|
312 map->uid = mail->uid; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 map->psize = psize; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 if (mailbox_search_deinit(&ctx) < 0) |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 ret = -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 (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
|
319 return ret; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 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
|
323 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 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
|
325 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
|
326 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
|
327 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
|
328 struct mail *mail; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 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
|
330 int ret = 0; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 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
|
333 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
|
334 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
|
335 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
|
336 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
|
337 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
|
338 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
|
339 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 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
|
341 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
|
342 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 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
|
344 ret = -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 else |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 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
|
347 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
348 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
349 if (mailbox_search_deinit(&ctx) < 0) |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
350 ret = -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 (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
|
352 return ret; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 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
|
356 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
357 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
|
358 struct pop3_migration_mail_storage *mstorage = |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
359 POP3_MIGRATION_CONTEXT(box->storage); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
360 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
|
361 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
|
362 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
|
363 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 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
|
365 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
|
366 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
|
367 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
368 /* 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
|
369 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
|
370 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
|
371 break; |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
372 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
|
373 /* 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
|
374 break; |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
375 } |
14398
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
376 |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
377 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
|
378 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
|
379 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
|
380 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
381 mbox->first_unfound_idx = i; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
382 return i == count; |
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 |
16500
c903fbcbf5d2
pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
385 static int |
c903fbcbf5d2
pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
386 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
|
387 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
388 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
|
389 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
|
390 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
|
391 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
|
392 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
|
393 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
|
394 unsigned int first_seq, missing_uids_count; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
395 int ret; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
396 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
397 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
|
398 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
|
399 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
|
400 return -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
401 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
402 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
|
403 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
|
404 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
405 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
|
406 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
|
407 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
408 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
|
409 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
|
410 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
|
411 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
|
412 pop3_idx++; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
413 continue; |
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 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
|
416 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
|
417 imap_idx++; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
418 continue; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
419 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
420 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
|
421 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
|
422 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
|
423 if (ret < 0) |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
424 pop3_idx++; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
425 else if (ret > 0) |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
426 imap_idx++; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
427 else { |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
428 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
|
429 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
|
430 pop3_map[pop3_idx].pop3_uidl; |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
431 imap_map[imap_idx].pop3_seq = |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
432 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
|
433 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
434 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
435 missing_uids_count = 0; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
436 for (pop3_idx = 0; pop3_idx < pop3_count; pop3_idx++) { |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
437 if (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
|
438 missing_uids_count++; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
439 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
440 if (missing_uids_count > 0 && !mstorage->all_mailboxes) { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
441 i_warning("pop3_migration: %u POP3 messages have no " |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
442 "matching IMAP messages", missing_uids_count); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
443 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
444 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
|
445 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
|
446 return 0; |
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 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
449 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
|
450 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
451 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
|
452 struct pop3_migration_mail_storage *mstorage = |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
453 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
|
454 struct mailbox *pop3_box; |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
455 const struct pop3_uidl_map *pop3_map; |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
456 unsigned int i, count; |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
457 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
|
458 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
459 if (mbox->uidl_synced) |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
460 return 0; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
461 |
16500
c903fbcbf5d2
pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
462 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
|
463 /* 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
|
464 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
|
465 idling. */ |
16500
c903fbcbf5d2
pop3-migration: struct mailbox must be freed before mail_storage is destroyed.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
466 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
|
467 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
|
468 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
|
469 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
|
470 } |
14398
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
471 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
472 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
|
473 /* 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
|
474 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
|
475 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
|
476 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
|
477 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
|
478 } |
14398
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
479 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
480 |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
481 /* 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
|
482 mbox->uidl_ordered = TRUE; |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
483 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
|
484 prev_uid = 0; |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
485 for (i = 0; i < count; i++) { |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
486 if (pop3_map[i].imap_uid == 0) |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
487 continue; |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
488 |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
489 if (prev_uid > pop3_map[i].imap_uid) { |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
490 mbox->uidl_ordered = FALSE; |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
491 break; |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
492 } |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
493 prev_uid = pop3_map[i].imap_uid; |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
494 } |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
495 |
14398
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
496 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
|
497 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
|
498 return 0; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
499 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
500 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
501 static int |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
502 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
|
503 const char **value_r) |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
504 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
505 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
|
506 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
|
507 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
|
508 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
|
509 |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
510 if (field == MAIL_FETCH_UIDL_BACKEND || |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
511 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
|
512 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
|
513 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
|
514 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
|
515 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
|
516 MAIL_ERROR_TEMP, |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
517 "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
|
518 return -1; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
519 } |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
520 |
14398
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
521 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
|
522 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
|
523 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
|
524 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
|
525 if (map != NULL && map->pop3_uidl != NULL) { |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
526 if (field == MAIL_FETCH_UIDL_BACKEND) |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
527 *value_r = map->pop3_uidl; |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
528 else |
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
529 *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
|
530 return 0; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
531 } |
14401
6df2235fd6af
pop3-migration: Migrate also POP3 ordering.
Timo Sirainen <tss@iki.fi>
parents:
14398
diff
changeset
|
532 /* 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
|
533 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
534 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
|
535 } |
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 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
|
538 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
539 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
|
540 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
|
541 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
|
542 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
|
543 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
|
544 struct mail_namespace *ns; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
545 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
546 if (mstorage == NULL || |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
547 (!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
|
548 /* 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
|
549 return; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
550 } |
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 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
|
553 mstorage->pop3_box_vname); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
554 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
|
555 /* 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
|
556 return; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
557 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
558 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
559 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
|
560 mmail->super = *v; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
561 mail->vlast = &mmail->super; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
562 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
563 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
|
564 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
|
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 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
|
568 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
569 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
|
570 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
|
571 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
572 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
|
573 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
|
574 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
|
575 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
576 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
|
577 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
578 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
579 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
|
580 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
581 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
|
582 POP3_MIGRATION_CONTEXT(storage); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
583 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
584 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
|
585 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
|
586 |
15272
ca10d2e8d8e3
lib-storage: Moved mail attribute dict to struct mail_storage.
Timo Sirainen <tss@iki.fi>
parents:
15199
diff
changeset
|
587 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
|
588 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
589 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
590 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
|
591 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
592 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
|
593 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
|
594 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
|
595 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
596 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
|
597 "pop3_migration_mailbox"); |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
598 if (pop3_box_vname == NULL) |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
599 return; |
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 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
|
602 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
|
603 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
|
604 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
|
605 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
606 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
|
607 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
|
608 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
|
609 "pop3_migration_all_mailboxes") != NULL; |
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 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
|
612 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
613 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
614 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
|
615 .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
|
616 .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
|
617 .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
|
618 }; |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
619 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
620 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
|
621 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
622 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
|
623 } |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
624 |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
625 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
|
626 { |
78317179b4af
Added pop3-migration plugin for getting POP3 UIDLs from POP3 server.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
627 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
|
628 } |