Skip to content

Commit cec6348

Browse files
author
Ioan Moldovan
authored
#5029 fix: failed parsing of signed message (#5033)
* fix: failed parsing of signed message * feat: added ui test * fix: inline image treat as * fix: remove console.log * fix: pr review
1 parent fa06591 commit cec6348

File tree

5 files changed

+166
-3
lines changed

5 files changed

+166
-3
lines changed

extension/js/common/core/attachment.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import { Buf } from './buf.js';
66
import { Str } from './common.js';
77

8-
type Attachment$treatAs = 'publicKey' | 'privateKey' | 'encryptedMsg' | 'hidden' | 'signature' | 'encryptedFile' | 'plainFile';
8+
type Attachment$treatAs = 'publicKey' | 'privateKey' | 'encryptedMsg' | 'hidden' | 'signature' | 'encryptedFile' | 'plainFile' | 'inlineImage';
99
type ContentTransferEncoding = '7bit' | 'quoted-printable' | 'base64';
1010
export type AttachmentMeta = {
1111
data?: Uint8Array;
@@ -153,6 +153,8 @@ export class Attachment {
153153
}
154154
}
155155
return 'signature';
156+
} else if (this.inline && this.type.startsWith('image/')) {
157+
return 'inlineImage';
156158
} else if (!this.name && !this.type.startsWith('image/')) {
157159
// this.name may be '' or undefined - catch either
158160
return this.length < 100 ? 'hidden' : 'encryptedMsg';

extension/js/common/core/mime.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,9 @@ export class Mime {
365365
}
366366
const isSigned = node._isMultipart === 'signed';
367367
const isMixedWithSig =
368-
node._isMultipart === 'mixed' && node._childNodes.length === 2 && Mime.getNodeType(node._childNodes[1]) === 'application/pgp-signature';
368+
node._isMultipart === 'mixed' &&
369+
node._childNodes.length === 2 &&
370+
(Mime.getNodeType(node._childNodes[1]) === 'application/pgp-signature' || node._childNodes[1].contentType?.params?.name === 'signature.asc');
369371
if (isSigned || isMixedWithSig) {
370372
// PGP/MIME signed content uses <CR><LF> as in // use CR-LF https://tools.ietf.org/html/rfc3156#section-5
371373
// however emailjs parser will replace it to <LF>, so we fix it here

extension/js/common/core/types/emailjs.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export type MimeParserNode = {
2222
appendChild: (child: MimeParserNode) => void;
2323
contentTransferEncoding: { value: string };
2424
charset?: string;
25-
contentType?: { value: string; params?: { protocol?: string } };
25+
contentType?: { value: string; params?: { protocol?: string; name?: string } };
2626
addHeader: (name: string, value: string) => void;
2727
raw: string; // on all nodes, not just body nodes
2828
_parentNode: MimeParserNode | null;
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
{
2+
"acctEmail": "[email protected]",
3+
"full": {
4+
"id": "187085b874fb727c",
5+
"threadId": "187085b874fb727c",
6+
"labelIds": [
7+
"INBOX"
8+
],
9+
"snippet": "&lt;h1&gt;flowcrypt-browser issue #5029 test email&lt;/h1&gt;",
10+
"payload": {
11+
"partId": "",
12+
"mimeType": "multipart/mixed",
13+
"filename": "",
14+
"headers": [
15+
{
16+
"name": "MIME-Version",
17+
"value": "1.0"
18+
},
19+
{
20+
"name": "Date",
21+
"value": "Wed, 22 Mar 2023 16:03:58 +0800"
22+
},
23+
{
24+
"name": "Subject",
25+
"value": "flowcrypt-browser issue #5029 test email"
26+
},
27+
{
28+
"name": "From",
29+
"value": "[email protected]"
30+
},
31+
{
32+
"name": "To",
33+
"value": "[email protected]"
34+
},
35+
{
36+
"name": "Content-Type",
37+
"value": "multipart/mixed; boundary=\"00000000000035152c05f7789a76\""
38+
}
39+
],
40+
"body": {
41+
"size": 0
42+
},
43+
"parts": [
44+
{
45+
"partId": "0",
46+
"mimeType": "multipart/alternative",
47+
"filename": "",
48+
"headers": [
49+
{
50+
"name": "Content-Type",
51+
"value": "multipart/alternative; boundary=\"00000000000035152805f7789a74\""
52+
}
53+
],
54+
"body": {
55+
"size": 0
56+
},
57+
"parts": [
58+
{
59+
"partId": "0.0",
60+
"mimeType": "text/plain",
61+
"filename": "",
62+
"headers": [
63+
{
64+
"name": "Content-Type",
65+
"value": "text/plain; charset=\"UTF-8\""
66+
}
67+
],
68+
"body": {
69+
"size": 51,
70+
"data": "PGgxPmZsb3djcnlwdC1icm93c2VyIGlzc3VlICM1MDI5IHRlc3QgZW1haWw8L2gxPg0K"
71+
}
72+
},
73+
{
74+
"partId": "0.1",
75+
"mimeType": "text/html",
76+
"filename": "",
77+
"headers": [
78+
{
79+
"name": "Content-Type",
80+
"value": "text/html; charset=\"UTF-8\""
81+
}
82+
],
83+
"body": {
84+
"size": 88,
85+
"data": "PGRpdiBkaXI9Imx0ciI-Jmx0O2gxJmd0O2Zsb3djcnlwdC1icm93c2VyIGlzc3VlICM1MDI5IHRlc3QgZW1haWwmbHQ7L2gxJmd0Ozxicj48L2Rpdj4NCg=="
86+
}
87+
}
88+
]
89+
},
90+
{
91+
"partId": "1",
92+
"mimeType": "text/plain",
93+
"filename": "signature.asc",
94+
"headers": [
95+
{
96+
"name": "Content-Type",
97+
"value": "text/plain; name=\"signature.asc\""
98+
},
99+
{
100+
"name": "Content-Disposition",
101+
"value": "attachment; filename=\"signature.asc\""
102+
},
103+
{
104+
"name": "Content-Transfer-Encoding",
105+
"value": "base64"
106+
},
107+
{
108+
"name": "X-Attachment-Id",
109+
"value": "f_lfjeenji0"
110+
},
111+
{
112+
"name": "Content-ID",
113+
"value": "<f_lfjeenji0>"
114+
}
115+
],
116+
"body": {
117+
"attachmentId": "ANGjdJ-qsGgOPWVEuZrMlrSIz1PRxYwbpLeCIKV53-0Rddq8ifey5ZZuFdgxmrkVGUL31K6QWVk7agWK77dQlYOovdVOgwDR0YPCBFgpVE4R43ChCAobIHESA3hkdEy4fxf8gpuJrELd8r6tpeOLiDtYPzoimtBehxsTtovnIkgKbgucCIB4m6hLyow_kDXM8XhzmC-0g6PHs-QhUwGv3d3rn6sLDVwpdGrdzL0FthnJJwuIV_U7I1m8Ngbqkb5_SRV_exzjOp7xPFkJjZ48gDbxzwK6vT9DbIQ_3gHct7391sBdvENKacXKeDtCqpOI8ro7_QCWBJJMwVqvn8ob4ejefrcqJxEj5EJ5lwkYowMPgU_3Iy6vIZslpTRgyjkc8kA-_r4bqwS0dLanjfFi",
118+
"size": 833
119+
}
120+
}
121+
]
122+
},
123+
"sizeEstimate": 2224,
124+
"historyId": "1398107",
125+
"internalDate": "1679472238000"
126+
},
127+
"attachments": {
128+
"ANGjdJ-qsGgOPWVEuZrMlrSIz1PRxYwbpLeCIKV53-0Rddq8ifey5ZZuFdgxmrkVGUL31K6QWVk7agWK77dQlYOovdVOgwDR0YPCBFgpVE4R43ChCAobIHESA3hkdEy4fxf8gpuJrELd8r6tpeOLiDtYPzoimtBehxsTtovnIkgKbgucCIB4m6hLyow_kDXM8XhzmC-0g6PHs-QhUwGv3d3rn6sLDVwpdGrdzL0FthnJJwuIV_U7I1m8Ngbqkb5_SRV_exzjOp7xPFkJjZ48gDbxzwK6vT9DbIQ_3gHct7391sBdvENKacXKeDtCqpOI8ro7_QCWBJJMwVqvn8ob4ejefrcqJxEj5EJ5lwkYowMPgU_3Iy6vIZslpTRgyjkc8kA-_r4bqwS0dLanjfFi": {
129+
"data": "LS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0KCmlRSXpCQUVCQ0FBZEZpRUU2UEJSZTZiWDJyWUlISmJrcmF3bm5KVUpNZ2NGQW1RYXRld0FDZ2tRcmF3bm5KVUoKTWdlMDh3LytPU1BySjI3ck9Vc2FSTHlhTVRjaElhTVhPdXFJeXU0czJKaFNqTzIydVV4OVBvZUdMcW80YjhxTwphZGtycHRDSkl4WTVkK3Y3UVlPNUd6UUhDdTNQVnUwZEhyTDZIQmJsMklzTFpRa2U3cGN1ZlVzL2xST0U2ZmxnCkZmTU1ZT2d3ejYvMGtTOVp5SXBOcUR6N3hrYXVpRlFOZGN1bWwrN1liaGl4UFZwWFhkUXB0N1E5Mm1qUWFoSXIKQkFUQitvcE5KUlVrUGZxZlVOcDlyMDZyc09JRWlQc1VvaEdvRHlvK3hHb2ErTFJ4RmpqSVkzY3pyeWdOM0F6bwpNZGM1WW5UQVJtWTN3aHNhTDVvTWJDdzh0cmJjam8rLzlBc1FGWEtMSkV0eDNjN3lCT3ZJbUNaL2QrbnZDMjFKClp4TTczT0FyQTdwMzIyQUhpaE85S01DK3pIL0MyVm5lMEJCUWpmN0gzTUZ0bXFYTmxobEIrcGF4TG9aZWZEV1kKNnJDeGpMUmpMM3ZwTUptWWNvaUtRSHJKWjVXSDFCcEZ0dmEyVHowVUhpTFZqUW5oWHkwa2VtemEyNHQxSk9ycQpFRlpvcm51VUpuU0ZpeERJTWo2ZUdVWkQvRmtCT0F5NGdEOVZzbWRtMnQyS0swcFA1ZXVNSWxxNEVmUFZhZThBCmdSRjk1OHk2N2dIcFJHaTNIQ2VyUWVJNkh6OTFMVkIwZ3hVV3dNK3RMVkZtTVN2NUxtc1gwanpzci9UUHA0eTcKeEk1UXRnaTh2Ykl5NEMxWGdvVjdxSWZyWk9VTS9yZFM5Qng2bGo4NWtxOTJpMUVIU05JazFJNDAxbEFYc2JJVApTOGYyQXFlWVZrQm1RL0ZQNFh6ZEkyY2N5ZVJDWXZoMFJNeFVDbVhsMFBDWEhGRExLMDA9Cj1SbjRDCi0tLS0tRU5EIFBHUCBTSUdOQVRVUkUtLS0tLQo",
130+
"size": 833
131+
}
132+
},
133+
"raw": {
134+
"id": "187085b874fb727c",
135+
"threadId": "187085b874fb727c",
136+
"labelIds": [
137+
"INBOX"
138+
],
139+
"snippet": "&lt;h1&gt;flowcrypt-browser issue #5029 test email&lt;/h1&gt;",
140+
"sizeEstimate": 2224,
141+
"raw": "TUlNRS1WZXJzaW9uOiAxLjANCkRhdGU6IFdlZCwgMjIgTWFyIDIwMjMgMTY6MDM6NTggKzA4MDANCk1lc3NhZ2UtSUQ6IDxDQUd1bVArY2UtcXR5VEU4T1Vrd043MUNINU10d0ZRYjI0WW1IaDZTbUJTb1Nza0prT0FAbWFpbC5nbWFpbC5jb20-DQpTdWJqZWN0OiBmbG93Y3J5cHQtYnJvd3NlciBpc3N1ZSAjNTAyOSB0ZXN0IGVtYWlsDQpGcm9tOiBUZXN0IEFjY291bnQgPGZsb3djcnlwdC5jb21wYXRpYmlsaXR5QGdtYWlsLmNvbT4NClRvOiBUZXN0IEFjY291bnQgPGZsb3djcnlwdC5jb21wYXRpYmlsaXR5QGdtYWlsLmNvbT4NCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iMDAwMDAwMDAwMDAwMzUxNTJjMDVmNzc4OWE3NiINCg0KLS0wMDAwMDAwMDAwMDAzNTE1MmMwNWY3Nzg5YTc2DQpDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsgYm91bmRhcnk9IjAwMDAwMDAwMDAwMDM1MTUyODA1Zjc3ODlhNzQiDQoNCi0tMDAwMDAwMDAwMDAwMzUxNTI4MDVmNzc4OWE3NA0KQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJVVEYtOCINCg0KPGgxPmZsb3djcnlwdC1icm93c2VyIGlzc3VlICM1MDI5IHRlc3QgZW1haWw8L2gxPg0KDQotLTAwMDAwMDAwMDAwMDM1MTUyODA1Zjc3ODlhNzQNCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PSJVVEYtOCINCg0KPGRpdiBkaXI9Imx0ciI-Jmx0O2gxJmd0O2Zsb3djcnlwdC1icm93c2VyIGlzc3VlICM1MDI5IHRlc3QgZW1haWwmbHQ7L2gxJmd0Ozxicj48L2Rpdj4NCg0KLS0wMDAwMDAwMDAwMDAzNTE1MjgwNWY3Nzg5YTc0LS0NCi0tMDAwMDAwMDAwMDAwMzUxNTJjMDVmNzc4OWE3Ng0KQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBuYW1lPSJzaWduYXR1cmUuYXNjIg0KQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9InNpZ25hdHVyZS5hc2MiDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQNClgtQXR0YWNobWVudC1JZDogZl9sZmplZW5qaTANCkNvbnRlbnQtSUQ6IDxmX2xmamVlbmppMD4NCg0KTFMwdExTMUNSVWRKVGlCUVIxQWdVMGxIVGtGVVZWSkZMUzB0TFMwS0NtbFJTWHBDUVVWQ1EwRkJaRVpwUlVVMlVFSlNaVFppV0RKeQ0KV1VsSVNtSnJjbUYzYm01S1ZVcE5aMk5HUVcxUllYUmxkMEZEWjJ0UmNtRjNibTVLVlVvS1RXZGxNRGgzTHl0UFUxQnlTakkzY2s5Vg0KYzJGU1RIbGhUVlJqYUVsaFRWaFBkWEZKZVhVMGN6SkthRk5xVHpJeWRWVjRPVkJ2WlVkTWNXODBZamh4VHdwaFpHdHljSFJEU2tsNA0KV1RWa0szWTNVVmxQTlVkNlVVaERkVE5RVm5Vd1pFaHlURFpJUW1Kc01rbHpURnBSYTJVM2NHTjFabFZ6TDJ4U1QwVTJabXhuQ2tabQ0KVFUxWlQyZDNlall2TUd0VE9WcDVTWEJPY1VSNk4zaHJZWFZwUmxGT1pHTjFiV3dyTjFsaWFHbDRVRlp3V0Zoa1VYQjBOMUU1TW0xcQ0KVVdGb1NYSUtRa0ZVUWl0dmNFNUtVbFZyVUdaeFpsVk9jRGx5TURaeWMwOUpSV2xRYzFWdmFFZHZSSGx2SzNoSGIyRXJURko0Um1wcQ0KU1ZrelkzcHllV2RPTTBGNmJ3cE5aR00xV1c1VVFWSnRXVE4zYUhOaFREVnZUV0pEZHpoMGNtSmphbThyTHpsQmMxRkdXRXRNU2tWMA0KZUROak4zbENUM1pKYlVOYUwyUXJiblpETWpGS0NscDRUVGN6VDBGeVFUZHdNekl5UVVocGFFODVTMDFESzNwSUwwTXlWbTVsTUVKQw0KVVdwbU4wZ3pUVVowYlhGWVRteG9iRUlyY0dGNFRHOWFaV1pFVjFrS05uSkRlR3BNVW1wTU0zWndUVXB0V1dOdmFVdFJTSEpLV2pWWA0KU0RGQ2NFWjBkbUV5Vkhvd1ZVaHBURlpxVVc1b1dIa3dhMlZ0ZW1FeU5IUXhTazl5Y1FwRlJscHZjbTUxVlVwdVUwWnBlRVJKVFdvMg0KWlVkVldrUXZSbXRDVDBGNU5HZEVPVlp6YldSdE1uUXlTMHN3Y0ZBMVpYVk5TV3h4TkVWbVVGWmhaVGhCQ21kU1JqazFPSGsyTjJkSQ0KY0ZKSGFUTklRMlZ5VVdWSk5raDZPVEZNVmtJd1ozaFZWM2ROSzNSTVZrWnRUVk4yTlV4dGMxZ3dhbnB6Y2k5VVVIQTBlVGNLZUVrMQ0KVVhSbmFUaDJZa2w1TkVNeFdHZHZWamR4U1daeVdrOVZUUzl5WkZNNVFuZzJiR280Tld0eE9USnBNVVZJVTA1SmF6RkpOREF4YkVGWQ0KYzJKSlZBcFRPR1l5UVhGbFdWWnJRbTFSTDBaUU5GaDZaRWt5WTJONVpWSkRXWFpvTUZKTmVGVkRiVmhzTUZCRFdFaEdSRXhMTURBOQ0KQ2oxU2JqUkRDaTB0TFMwdFJVNUVJRkJIVUNCVFNVZE9RVlJWVWtVdExTMHRMUW89DQotLTAwMDAwMDAwMDAwMDM1MTUyYzA1Zjc3ODlhNzYtLQ==",
142+
"historyId": "1398107",
143+
"internalDate": "1679472238000"
144+
}
145+
}

test/source/tests/decrypt.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,20 @@ export const defineDecryptTests = (testVariant: TestVariant, testWithBrowser: Te
6868
})
6969
);
7070

71+
test(
72+
`decrypt - parsed signed message with signautre.asc as plain attachment`,
73+
testWithBrowser('compatibility', async (t, browser) => {
74+
const threadId = '187085b874fb727c';
75+
const acctEmail = '[email protected]';
76+
const inboxPage = await browser.newExtensionPage(t, `chrome/settings/inbox/inbox.htm?acctEmail=${acctEmail}&threadId=${threadId}`);
77+
await inboxPage.waitForSelTestState('ready');
78+
await inboxPage.waitAll('iframe');
79+
const pgpBlock = await inboxPage.getFrame(['pgp_block.htm']);
80+
await pgpBlock.waitForContent('@pgp-block-content', 'flowcrypt-browser issue #5029 test email');
81+
await inboxPage.close();
82+
})
83+
);
84+
7185
test(
7286
`decrypt - outlook message with ATTxxxx encrypted email doesn't show empty attachment`,
7387
testWithBrowser('compatibility', async (t, browser) => {

0 commit comments

Comments
 (0)