mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-25 04:18:08 +01:00
Render all parts of multipart/encrypted when decrypting.
The primary goal here is to keep the decrypted output as similarly structured as undecrypted output as possible. Now, when decrypting parts, only the original encrypted part is replaced by the it's decrypted content. If this part isn't itself a multipart, then all part numbering should remain consistent during decryption. The only draw back here is that the useless application/pgp-encrypted sub-part of the multipart/encrypted part is also emitted. But this part can be easily ignored by clients.
This commit is contained in:
parent
5404519749
commit
82daf29187
2 changed files with 43 additions and 18 deletions
|
@ -34,6 +34,7 @@ show_message_part (GMimeObject *part,
|
||||||
notmuch_show_params_t *params,
|
notmuch_show_params_t *params,
|
||||||
int first)
|
int first)
|
||||||
{
|
{
|
||||||
|
GMimeObject *decryptedpart = NULL;
|
||||||
int selected;
|
int selected;
|
||||||
state->part_count += 1;
|
state->part_count += 1;
|
||||||
|
|
||||||
|
@ -67,7 +68,7 @@ show_message_part (GMimeObject *part,
|
||||||
g_mime_multipart_get_count (multipart));
|
g_mime_multipart_get_count (multipart));
|
||||||
} else {
|
} else {
|
||||||
GMimeMultipartEncrypted *encrypteddata = GMIME_MULTIPART_ENCRYPTED (part);
|
GMimeMultipartEncrypted *encrypteddata = GMIME_MULTIPART_ENCRYPTED (part);
|
||||||
GMimeObject *decryptedpart = g_mime_multipart_encrypted_decrypt (encrypteddata, params->cryptoctx, &err);
|
decryptedpart = g_mime_multipart_encrypted_decrypt (encrypteddata, params->cryptoctx, &err);
|
||||||
if (decryptedpart) {
|
if (decryptedpart) {
|
||||||
if ((selected || state->in_zone) && format->part_encstatus)
|
if ((selected || state->in_zone) && format->part_encstatus)
|
||||||
format->part_encstatus (1);
|
format->part_encstatus (1);
|
||||||
|
@ -76,8 +77,6 @@ show_message_part (GMimeObject *part,
|
||||||
fprintf (stderr, "Failed to verify signed part: %s\n", (err ? err->message : "no error explanation given"));
|
fprintf (stderr, "Failed to verify signed part: %s\n", (err ? err->message : "no error explanation given"));
|
||||||
if ((selected || state->in_zone) && format->part_sigstatus)
|
if ((selected || state->in_zone) && format->part_sigstatus)
|
||||||
format->part_sigstatus (sigvalidity);
|
format->part_sigstatus (sigvalidity);
|
||||||
/* swap the part with the decrypted part */
|
|
||||||
part = decryptedpart;
|
|
||||||
} else {
|
} else {
|
||||||
fprintf (stderr, "Failed to decrypt part: %s\n", (err ? err->message : "no error explanation given"));
|
fprintf (stderr, "Failed to decrypt part: %s\n", (err ? err->message : "no error explanation given"));
|
||||||
if ((selected || state->in_zone) && format->part_encstatus)
|
if ((selected || state->in_zone) && format->part_encstatus)
|
||||||
|
@ -125,10 +124,21 @@ show_message_part (GMimeObject *part,
|
||||||
if (selected)
|
if (selected)
|
||||||
state->in_zone = 1;
|
state->in_zone = 1;
|
||||||
|
|
||||||
|
if (decryptedpart) {
|
||||||
|
/* We emit the useless application/pgp-encrypted version
|
||||||
|
* part here only to keep the emitted output as consistent
|
||||||
|
* as possible between decrypted output and the
|
||||||
|
* unprocessed multipart/mime. For some strange reason,
|
||||||
|
* the actual encrypted data is the second part of the
|
||||||
|
* multipart. */
|
||||||
|
show_message_part (g_mime_multipart_get_part (multipart, 0), state, format, params, TRUE);
|
||||||
|
show_message_part (decryptedpart, state, format, params, FALSE);
|
||||||
|
} else {
|
||||||
for (i = 0; i < g_mime_multipart_get_count (multipart); i++) {
|
for (i = 0; i < g_mime_multipart_get_count (multipart); i++) {
|
||||||
show_message_part (g_mime_multipart_get_part (multipart, i),
|
show_message_part (g_mime_multipart_get_part (multipart, i),
|
||||||
state, format, params, i == 0);
|
state, format, params, i == 0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (selected)
|
if (selected)
|
||||||
state->in_zone = 0;
|
state->in_zone = 0;
|
||||||
|
|
39
test/crypto
39
test/crypto
|
@ -160,15 +160,20 @@ To: test_suite@notmuchmail.org
|
||||||
Date: 01 Jan 2000 12:00:00 -0000
|
Date: 01 Jan 2000 12:00:00 -0000
|
||||||
header}
|
header}
|
||||||
body{
|
body{
|
||||||
part{ ID: 1, Content-type: multipart/mixed
|
part{ ID: 1, Content-type: multipart/encrypted
|
||||||
part{ ID: 2, Content-type: text/plain
|
part{ ID: 2, Content-type: application/pgp-encrypted
|
||||||
|
Non-text part: application/pgp-encrypted
|
||||||
|
part}
|
||||||
|
part{ ID: 3, Content-type: multipart/mixed
|
||||||
|
part{ ID: 4, Content-type: text/plain
|
||||||
This is a test encrypted message.
|
This is a test encrypted message.
|
||||||
part}
|
part}
|
||||||
attachment{ ID: 3, Content-type: application/octet-stream
|
attachment{ ID: 5, Content-type: application/octet-stream
|
||||||
Attachment: TESTATTACHMENT (application/octet-stream)
|
Attachment: TESTATTACHMENT (application/octet-stream)
|
||||||
Non-text part: application/octet-stream
|
Non-text part: application/octet-stream
|
||||||
attachment}
|
attachment}
|
||||||
part}
|
part}
|
||||||
|
part}
|
||||||
body}
|
body}
|
||||||
message}'
|
message}'
|
||||||
test_expect_equal \
|
test_expect_equal \
|
||||||
|
@ -194,33 +199,37 @@ expected='[[[{"id": "XXXXX",
|
||||||
"body": [{"id": 1,
|
"body": [{"id": 1,
|
||||||
"encstatus": [{"status": "good"}],
|
"encstatus": [{"status": "good"}],
|
||||||
"sigstatus": [],
|
"sigstatus": [],
|
||||||
"content-type": "multipart/mixed",
|
"content-type": "multipart/encrypted",
|
||||||
"content": [{"id": 2,
|
"content": [{"id": 2,
|
||||||
|
"content-type": "application/pgp-encrypted"},
|
||||||
|
{"id": 3,
|
||||||
|
"content-type": "multipart/mixed",
|
||||||
|
"content": [{"id": 4,
|
||||||
"content-type": "text/plain",
|
"content-type": "text/plain",
|
||||||
"content": "This is a test encrypted message.\n"},
|
"content": "This is a test encrypted message.\n"},
|
||||||
{"id": 3,
|
{"id": 5,
|
||||||
"content-type": "application/octet-stream",
|
"content-type": "application/octet-stream",
|
||||||
"filename": "TESTATTACHMENT"}]}]},
|
"filename": "TESTATTACHMENT"}]}]}]},
|
||||||
[]]]]'
|
[]]]]'
|
||||||
test_expect_equal \
|
test_expect_equal \
|
||||||
"$output" \
|
"$output" \
|
||||||
"$expected"
|
"$expected"
|
||||||
|
|
||||||
test_begin_subtest "decryption, --format=json, --part=2"
|
test_begin_subtest "decryption, --format=json, --part=4"
|
||||||
output=$(notmuch show --format=json --part=2 --decrypt subject:"test encrypted message 001" \
|
output=$(notmuch show --format=json --part=4 --decrypt subject:"test encrypted message 001" \
|
||||||
| notmuch_json_show_sanitize \
|
| notmuch_json_show_sanitize \
|
||||||
| sed -e 's|"created": [1234567890]*|"created": 946728000|')
|
| sed -e 's|"created": [1234567890]*|"created": 946728000|')
|
||||||
expected='{"id": 2,
|
expected='{"id": 4,
|
||||||
"content-type": "text/plain",
|
"content-type": "text/plain",
|
||||||
"content": "This is a test encrypted message.\n"}'
|
"content": "This is a test encrypted message.\n"}'
|
||||||
test_expect_equal \
|
test_expect_equal \
|
||||||
"$output" \
|
"$output" \
|
||||||
"$expected"
|
"$expected"
|
||||||
|
|
||||||
test_begin_subtest "decrypt attachment (--part=3 --format=raw)"
|
test_begin_subtest "decrypt attachment (--part=5 --format=raw)"
|
||||||
notmuch show \
|
notmuch show \
|
||||||
--format=raw \
|
--format=raw \
|
||||||
--part=3 \
|
--part=5 \
|
||||||
--decrypt \
|
--decrypt \
|
||||||
subject:"test encrypted message 001" >OUTPUT
|
subject:"test encrypted message 001" >OUTPUT
|
||||||
test_expect_equal_file OUTPUT TESTATTACHMENT
|
test_expect_equal_file OUTPUT TESTATTACHMENT
|
||||||
|
@ -283,8 +292,12 @@ expected='[[[{"id": "XXXXX",
|
||||||
"fingerprint": "'$FINGERPRINT'",
|
"fingerprint": "'$FINGERPRINT'",
|
||||||
"created": 946728000,
|
"created": 946728000,
|
||||||
"userid": " Notmuch Test Suite <test_suite@notmuchmail.org> (INSECURE!)"}],
|
"userid": " Notmuch Test Suite <test_suite@notmuchmail.org> (INSECURE!)"}],
|
||||||
|
"content-type": "multipart/encrypted",
|
||||||
|
"content": [{"id": 2,
|
||||||
|
"content-type": "application/pgp-encrypted"},
|
||||||
|
{"id": 3,
|
||||||
"content-type": "text/plain",
|
"content-type": "text/plain",
|
||||||
"content": "This is another test encrypted message.\n"}]},
|
"content": "This is another test encrypted message.\n"}]}]},
|
||||||
[]]]]'
|
[]]]]'
|
||||||
test_expect_equal \
|
test_expect_equal \
|
||||||
"$output" \
|
"$output" \
|
||||||
|
@ -297,6 +310,8 @@ expected='From: Notmuch Test Suite <test_suite@notmuchmail.org>
|
||||||
Subject: Re: test encrypted message 002
|
Subject: Re: test encrypted message 002
|
||||||
|
|
||||||
On 01 Jan 2000 12:00:00 -0000, Notmuch Test Suite <test_suite@notmuchmail.org> wrote:
|
On 01 Jan 2000 12:00:00 -0000, Notmuch Test Suite <test_suite@notmuchmail.org> wrote:
|
||||||
|
Non-text part: multipart/encrypted
|
||||||
|
Non-text part: application/pgp-encrypted
|
||||||
> This is another test encrypted message.'
|
> This is another test encrypted message.'
|
||||||
test_expect_equal \
|
test_expect_equal \
|
||||||
"$output" \
|
"$output" \
|
||||||
|
|
Loading…
Reference in a new issue