[PATCH 2/4] Render all parts of multipart/encrypted when decrypting.

Jameson Graef Rollins jrollins at finestructure.net
Fri May 27 03:27:37 PDT 2011


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.
---
 show-message.c |   22 ++++++++++++++++------
 test/crypto    |   39 +++++++++++++++++++++++++++------------
 2 files changed, 43 insertions(+), 18 deletions(-)

diff --git a/show-message.c b/show-message.c
index 849c686..7a4bbc2 100644
--- a/show-message.c
+++ b/show-message.c
@@ -34,6 +34,7 @@ show_message_part (GMimeObject *part,
 		   notmuch_show_params_t *params,
 		   int first)
 {
+    GMimeObject *decryptedpart = NULL;
     int selected;
     state->part_count += 1;
 
@@ -67,7 +68,7 @@ show_message_part (GMimeObject *part,
 			 g_mime_multipart_get_count (multipart));
 	    } else {
 		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 ((selected || state->in_zone) && format->part_encstatus)
 			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"));
 		    if ((selected || state->in_zone) && format->part_sigstatus)
 			format->part_sigstatus (sigvalidity);
-		    /* swap the part with the decrypted part */
-		    part = decryptedpart;
 		} else {
 		    fprintf (stderr, "Failed to decrypt part: %s\n", (err ? err->message : "no error explanation given"));
 		    if ((selected || state->in_zone) && format->part_encstatus)
@@ -125,9 +124,20 @@ show_message_part (GMimeObject *part,
 	if (selected)
 	    state->in_zone = 1;
 
-	for (i = 0; i < g_mime_multipart_get_count (multipart); i++) {
-	    show_message_part (g_mime_multipart_get_part (multipart, i),
-			       state, format, params, i == 0);
+	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++) {
+		show_message_part (g_mime_multipart_get_part (multipart, i),
+				   state, format, params, i == 0);
+	    }
 	}
 
 	if (selected)
diff --git a/test/crypto b/test/crypto
index ef35c55..6ce51d9 100755
--- a/test/crypto
+++ b/test/crypto
@@ -160,15 +160,20 @@ To: test_suite at notmuchmail.org
 Date: 01 Jan 2000 12:00:00 -0000
 header}
 body{
-part{ ID: 1, Content-type: multipart/mixed
-part{ ID: 2, Content-type: text/plain
+part{ ID: 1, Content-type: multipart/encrypted
+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.
 part}
-attachment{ ID: 3, Content-type: application/octet-stream
+attachment{ ID: 5, Content-type: application/octet-stream
 Attachment: TESTATTACHMENT (application/octet-stream)
 Non-text part: application/octet-stream
 attachment}
 part}
+part}
 body}
 message}'
 test_expect_equal \
@@ -194,33 +199,37 @@ expected='[[[{"id": "XXXXX",
  "body": [{"id": 1,
  "encstatus": [{"status": "good"}],
  "sigstatus": [],
- "content-type": "multipart/mixed",
+ "content-type": "multipart/encrypted",
  "content": [{"id": 2,
+ "content-type": "application/pgp-encrypted"},
+ {"id": 3,
+ "content-type": "multipart/mixed",
+ "content": [{"id": 4,
  "content-type": "text/plain",
  "content": "This is a test encrypted message.\n"},
- {"id": 3,
+ {"id": 5,
  "content-type": "application/octet-stream",
- "filename": "TESTATTACHMENT"}]}]},
+ "filename": "TESTATTACHMENT"}]}]}]},
  []]]]'
 test_expect_equal \
     "$output" \
     "$expected"
 
-test_begin_subtest "decryption, --format=json, --part=2"
-output=$(notmuch show --format=json --part=2 --decrypt subject:"test encrypted message 001" \
+test_begin_subtest "decryption, --format=json, --part=4"
+output=$(notmuch show --format=json --part=4 --decrypt subject:"test encrypted message 001" \
     | notmuch_json_show_sanitize \
     | sed -e 's|"created": [1234567890]*|"created": 946728000|')
-expected='{"id": 2,
+expected='{"id": 4,
  "content-type": "text/plain",
  "content": "This is a test encrypted message.\n"}'
 test_expect_equal \
     "$output" \
     "$expected"
 
-test_begin_subtest "decrypt attachment (--part=3 --format=raw)"
+test_begin_subtest "decrypt attachment (--part=5 --format=raw)"
 notmuch show \
     --format=raw \
-    --part=3 \
+    --part=5 \
     --decrypt \
     subject:"test encrypted message 001" >OUTPUT
 test_expect_equal_file OUTPUT TESTATTACHMENT
@@ -283,8 +292,12 @@ expected='[[[{"id": "XXXXX",
  "fingerprint": "'$FINGERPRINT'",
  "created": 946728000,
  "userid": " Notmuch Test Suite <test_suite at notmuchmail.org> (INSECURE!)"}],
+ "content-type": "multipart/encrypted",
+ "content": [{"id": 2,
+ "content-type": "application/pgp-encrypted"},
+ {"id": 3,
  "content-type": "text/plain",
- "content": "This is another test encrypted message.\n"}]},
+ "content": "This is another test encrypted message.\n"}]}]},
  []]]]'
 test_expect_equal \
     "$output" \
@@ -297,6 +310,8 @@ expected='From: Notmuch Test Suite <test_suite at notmuchmail.org>
 Subject: Re: test encrypted message 002
 
 On 01 Jan 2000 12:00:00 -0000, Notmuch Test Suite <test_suite at notmuchmail.org> wrote:
+Non-text part: multipart/encrypted
+Non-text part: application/pgp-encrypted
 > This is another test encrypted message.'
 test_expect_equal \
     "$output" \
-- 
1.7.4.4



More information about the notmuch mailing list