notmuch show: Include output for the enclosing multipart part of a MIME mail

Previously, the outer multipart part of any multipart/mixed,
multipart/signed, etc. MIME message was silently omitted from the
"notmuch show" output. This prevented any client from correctly
determining to which parts a signature applies, for example.

Now, we actually emit these parts as their own parts. The output is
still flattened---the contained parts are not yet included "within"
the multipart part---so it's still not possible to determine to which
parts a signature applies, but this is one step along the path.

The test suite is updated to reflect this change, (though we'll
eventually want to fix the emacs interface to not display buttons for
the multipart enclosure parts as there's nothing useful for the user
to actually do with them).
This commit is contained in:
Carl Worth 2011-05-16 22:28:36 -07:00
parent d67f755497
commit c51d5b3cdb
4 changed files with 29 additions and 5 deletions

View file

@ -410,6 +410,11 @@ format_part_text (GMimeObject *part, int *part_count)
show_part_content (part, stream_stdout); show_part_content (part, stream_stdout);
g_object_unref(stream_stdout); g_object_unref(stream_stdout);
} }
else if (g_mime_content_type_is_type (content_type, "multipart", "*"))
{
/* Do nothing for multipart since its content will be printed
* when recursing. */
}
else else
{ {
printf ("Non-text part: %s\n", printf ("Non-text part: %s\n",

View file

@ -30,6 +30,9 @@ show_message_part (GMimeObject *part, int *part_count,
GMimeMultipart *multipart = GMIME_MULTIPART (part); GMimeMultipart *multipart = GMIME_MULTIPART (part);
int i; int i;
*part_count = *part_count + 1;
(*show_part) (part, part_count);
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),
part_count, show_part); part_count, show_part);

View file

@ -3,6 +3,9 @@ Subject: [notmuch] Working with Maildir storage?
To: notmuch@notmuchmail.org To: notmuch@notmuchmail.org
Date: Tue, 17 Nov 2009 14:00:54 -0500 Date: Tue, 17 Nov 2009 14:00:54 -0500
[ multipart/mixed ]
[ multipart/signed ]
[ text/plain ]
I saw the LWN article and decided to take a look at notmuch. I'm I saw the LWN article and decided to take a look at notmuch. I'm
currently using mutt and mairix to index and read a collection of currently using mutt and mairix to index and read a collection of
Maildir mail folders (around 40,000 messages total). Maildir mail folders (around 40,000 messages total).
@ -41,6 +44,9 @@ http://notmuchmail.org/mailman/listinfo/notmuch
To: notmuch@notmuchmail.org To: notmuch@notmuchmail.org
Date: Wed, 18 Nov 2009 01:02:38 +0600 Date: Wed, 18 Nov 2009 01:02:38 +0600
[ multipart/mixed ]
[ multipart/signed ]
[ text/plain ]
Twas brillig at 14:00:54 17.11.2009 UTC-05 when lars@seas.harvard.edu did gyre and gimble: Twas brillig at 14:00:54 17.11.2009 UTC-05 when lars@seas.harvard.edu did gyre and gimble:
@ -68,6 +74,9 @@ http://notmuchmail.org/mailman/listinfo/notmuch
Cc: notmuch@notmuchmail.org Cc: notmuch@notmuchmail.org
Date: Tue, 17 Nov 2009 15:33:01 -0500 Date: Tue, 17 Nov 2009 15:33:01 -0500
[ multipart/mixed ]
[ multipart/signed ]
[ text/plain ]
> See the patch just posted here. > See the patch just posted here.
Is the list archived anywhere? The obvious archives Is the list archived anywhere? The obvious archives
@ -148,6 +157,9 @@ http://notmuchmail.org/mailman/listinfo/notmuch
Cc: notmuch@notmuchmail.org Cc: notmuch@notmuchmail.org
Date: Tue, 17 Nov 2009 19:50:40 -0500 Date: Tue, 17 Nov 2009 19:50:40 -0500
[ multipart/mixed ]
[ multipart/signed ]
[ text/plain ]
> I've also pushed a slightly more complicated (and complete) fix to my > I've also pushed a slightly more complicated (and complete) fix to my
> private notmuch repository > private notmuch repository

View file

@ -58,19 +58,23 @@ To: cworth@cworth.org
Date: Tue, 05 Jan 2001 15:43:57 -0000 Date: Tue, 05 Jan 2001 15:43:57 -0000
header} header}
body{ body{
part{ ID: 1, Content-type: text/plain part{ ID: 1, Content-type: multipart/signed
part}
part{ ID: 2, Content-type: multipart/mixed
part}
part{ ID: 3, Content-type: text/plain
This is an inline text part. This is an inline text part.
part} part}
attachment{ ID: 2, Content-type: text/plain attachment{ ID: 4, Content-type: text/plain
Attachment: attachment (text/plain) Attachment: attachment (text/plain)
This is a text attachment. This is a text attachment.
attachment} attachment}
part{ ID: 3, Content-type: text/plain part{ ID: 5, Content-type: text/plain
And this message is signed. And this message is signed.
-Carl -Carl
part} part}
part{ ID: 4, Content-type: application/pgp-signature part{ ID: 6, Content-type: application/pgp-signature
Non-text part: application/pgp-signature Non-text part: application/pgp-signature
part} part}
body} body}
@ -78,7 +82,7 @@ Non-text part: application/pgp-signature
test_begin_subtest "Show multipart MIME message (--format=json)" test_begin_subtest "Show multipart MIME message (--format=json)"
output=$(notmuch show --format=json 'id:87liy5ap00.fsf@yoom.home.cworth.org') output=$(notmuch show --format=json 'id:87liy5ap00.fsf@yoom.home.cworth.org')
test_expect_equal "$output" '[[[{"id": "87liy5ap00.fsf@yoom.home.cworth.org", "match": true, "filename": "/home/cworth/src/notmuch/test/tmp.multipart/mail/multipart", "timestamp": 978709437, "date_relative": "2001-01-05", "tags": ["attachment","inbox","unread"], "headers": {"Subject": "Multipart message", "From": "Carl Worth <cworth@cworth.org>", "To": "cworth@cworth.org", "Cc": "", "Bcc": "", "Date": "Tue, 05 Jan 2001 15:43:57 -0000"}, "body": [{"id": 1, "content-type": "text/plain", "content": "This is an inline text part.\n"}, {"id": 2, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}, {"id": 3, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}, {"id": 4, "content-type": "application/pgp-signature"}]}, []]]]' test_expect_equal "$output" '[[[{"id": "87liy5ap00.fsf@yoom.home.cworth.org", "match": true, "filename": "/home/cworth/src/notmuch/test/tmp.multipart/mail/multipart", "timestamp": 978709437, "date_relative": "2001-01-05", "tags": ["attachment","inbox","unread"], "headers": {"Subject": "Multipart message", "From": "Carl Worth <cworth@cworth.org>", "To": "cworth@cworth.org", "Cc": "", "Bcc": "", "Date": "Tue, 05 Jan 2001 15:43:57 -0000"}, "body": [{"id": 1, "content-type": "multipart/signed"}, {"id": 2, "content-type": "multipart/mixed"}, {"id": 3, "content-type": "text/plain", "content": "This is an inline text part.\n"}, {"id": 4, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}, {"id": 5, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}, {"id": 6, "content-type": "application/pgp-signature"}]}, []]]]'
test_done test_done