1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
From 3fd6782988f01c2f56af19012e470ea16e800f51 Mon Sep 17 00:00:00 2001
From: Michele Comitini <michele.comitini@gmail.com>
Date: Tue, 1 Nov 2016 21:20:16 +0100
Subject: [PATCH 31/33] boundaries fixups: ordering of parts, do not add
newline on boundary if there's no part after previous header (#34)
* Fix IMAP mailbox maintanence
Update message's mailbox id in a separate explicit transaction to prevent
SQLException: ORA-01453 error on the next db_begin_transaction() call
(see db_mailbox_seq_update() next to 'UPDATE dbmail_messages SET mailbox_idnr'
query).
* add newline only if is_message
* better fix for rfc822 multipart messages with boundary after header
* fixed some race condition when closing boundaries, since key does not change. Needed ordering parts on depth DESC when key does not vary.
* fixes ordering in insertion
---
src/dm_message.c | 12 ++++---
test/check_dbmail.h | 78 ++++++++++++++++++++++++++++++++++++++++++++-
test/check_dbmail_message.c | 8 +++++
3 files changed, 93 insertions(+), 5 deletions(-)
diff --git src/dm_message.c src/dm_message.c
index 9d30d52..784c091 100644
--- src/dm_message.c
+++ src/dm_message.c
@@ -387,7 +387,7 @@ static DbmailMessage * _mime_retrieve(DbmailMessage *self)
"FROM %smimeparts p "
"JOIN %spartlists l ON p.id = l.part_id "
"JOIN %sphysmessage ph ON ph.id = l.physmessage_id "
- "WHERE l.physmessage_id = ? ORDER BY l.part_key,l.part_order ASC",
+ "WHERE l.physmessage_id = ? ORDER BY l.part_key, l.part_order ASC, l.part_depth DESC",
frag, p_string_str(n), DBPFX, DBPFX, DBPFX);
db_stmt_set_u64(stmt, 1, self->id);
r = db_stmt_query(stmt);
@@ -454,10 +454,14 @@ static DbmailMessage * _mime_retrieve(DbmailMessage *self)
if ((depth > 0) && (blist[depth-1][0]))
strncpy(boundary, blist[depth-1], MAX_MIME_BLEN-1);
- if (is_header && (!prev_header || prev_boundary || (prev_header && depth>0 && !prev_is_message))) {
+ if (is_header)
+ if (prev_header && depth>0 && !prev_is_message) {
+ dprint("--%s\n", boundary);
+ p_string_append_printf(m, "--%s\n", boundary);
+ } else if (!prev_header || prev_boundary) {
dprint("\n--%s\n", boundary);
p_string_append_printf(m, "\n--%s\n", boundary);
- }
+ }
p_string_append_printf(m, "%s", str);
dprint("<part is_header=\"%d\" depth=\"%d\" key=\"%d\" order=\"%d\">\n%s\n</part>\n",
@@ -558,7 +562,7 @@ static gboolean store_mime_multipart(GMimeObject *object, DbmailMessage *m, cons
if (boundary) {
n++;
m->part_depth--;
- m->part_order=n;
+ m->part_order++;
}
if (g_mime_content_type_is_type(GMIME_CONTENT_TYPE(content_type), "multipart", "*") &&
diff --git test/check_dbmail.h test/check_dbmail.h
index 09c9958..439c8a1 100644
--- test/check_dbmail.h
+++ test/check_dbmail.h
@@ -1561,7 +1561,7 @@ char *multipart_message8 = "From: nobody@example.org\n"
"bmdzLnhtbFBLAQItABQABgAIAAAAIQDv0+Pp+gEAAPsDAAAQAAAAAAAAAAAAAAAAALREAABkb2NQ\n"
"cm9wcy9hcHAueG1sUEsFBgAAAAAPAA8A3AMAAORHAAAAAA==\n"
"\n"
- "--_004_AAD42BB12C540843AB5C952ADD4D978901830A1Bswi52mbx1orfloc_--\";\n";
+ "--_004_AAD42BB12C540843AB5C952ADD4D978901830A1Bswi52mbx1orfloc_--\n";
char *multipart_message9 = "From: a\n"
"To: b\n"
@@ -28440,3 +28440,79 @@ char *multipart_message_big = "From: \"Gennadiy Poryev\" <vecanoi@gmail.com>\n"
"/g8HAAAAAwANNP0/pQ4DAA80/T+lDvA8\n"
"\n"
"------=_NextPart_000_0000_01CDFBC6.932A1F00--\n";
+
+char *multipart_message_submessage = "Content-Type: multipart/mixed; boundary=\"===============9147350442359610775==\"\n"
+"MIME-Version: 1.0\n"
+"To: test@test.it\n"
+"From: test@test.it\n"
+"\n"
+"--===============9147350442359610775==\n"
+"Content-Type: message/rfc822\n"
+"MIME-Version: 1.0\n"
+"\n"
+"Content-Type: multipart/alternative;\n"
+" boundary=\"===============1150329730008994878==\"\n"
+"MIME-Version: 1.0\n"
+"Subject: Link\n"
+"From: my@email.com\n"
+"To: your@email.com\n"
+"\n"
+"--===============1150329730008994878==\n"
+"Content-Type: text/plain; charset=\"us-ascii\"\n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 7bit\n"
+"\n"
+"Hi!\n"
+"How are you?\n"
+"Here is the link you wanted:\n"
+"https://www.python.org\n"
+"--===============1150329730008994878==\n"
+"Content-Type: text/html; charset=\"us-ascii\"\n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 7bit\n"
+"\n"
+"<html>\n"
+" <head></head>\n"
+" <body>\n"
+" <p>Hi!<br>\n"
+" How are you?<br>\n"
+" Here is the <a href=\"https://www.python.org\">link</a> you wanted.\n"
+" </p>\n"
+" </body>\n"
+"</html>\n"
+"\n"
+"--===============1150329730008994878==\n"
+"Content-Type: multipart/mixed; boundary=\"===============0782181963306111896==\"\n"
+"MIME-Version: 1.0\n"
+"\n"
+"--===============0782181963306111896==\n"
+"Content-Type: text/plain; charset=\"us-ascii\"\n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 7bit\n"
+"\n"
+"Text part3_1.\n"
+"--===============0782181963306111896==\n"
+"Content-Type: text/plain; charset=\"us-ascii\"\n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 7bit\n"
+"\n"
+"Text part3_2.\n"
+"--===============0782181963306111896==--\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"--===============1150329730008994878==--\n"
+"\n"
+"--===============9147350442359610775==\n"
+"Content-Type: text/plain; charset=\"us-ascii\"\n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 7bit\n"
+"\n"
+"This is a simple text attachment.\n"
+"with some newlines at the end.\n"
+"\n"
+"\n"
+"\n"
+"--===============9147350442359610775==--\n"
+"\n";
diff --git test/check_dbmail_message.c test/check_dbmail_message.c
index e36a2ea..f070257 100644
--- test/check_dbmail_message.c
+++ test/check_dbmail_message.c
@@ -431,6 +431,14 @@ START_TEST(test_dbmail_message_store)
COMPARE(e,t);
g_free(e);
g_free(t);
+ //-----------------------------------------
+ m = message_init(multipart_message_submessage);
+ e = dbmail_message_to_string(m);
+ t = store_and_retrieve(m);
+ COMPARE(e,t);
+ COMPARE(multipart_message_submessage, t);
+ g_free(e);
+ g_free(t);
}
END_TEST
--
2.10.1 (Apple Git-78)
|