aboutsummaryrefslogtreecommitdiffhomepage
path: root/show-message.c
diff options
context:
space:
mode:
authorGravatar Jameson Graef Rollins <jrollins@finestructure.net>2011-05-27 03:27:37 -0700
committerGravatar Carl Worth <cworth@cworth.org>2011-05-27 16:22:00 -0700
commit82daf29187f84076d55df9ea35da692d200128ec (patch)
treeace549215d0068807c1adb2d5aa1f36469413225 /show-message.c
parent54045197498f540b4ba96344073994bac13a3039 (diff)
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.
Diffstat (limited to 'show-message.c')
-rw-r--r--show-message.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/show-message.c b/show-message.c
index 849c6862..7a4bbc25 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)