diff --git a/doc/man7/notmuch-properties.rst b/doc/man7/notmuch-properties.rst index e2db2ef5..a7d91d67 100644 --- a/doc/man7/notmuch-properties.rst +++ b/doc/man7/notmuch-properties.rst @@ -127,6 +127,12 @@ of its normal activity. found in that message, since it was able to index the built-in protected headers directly. + ``index.repaired=mixedup`` indicates the repair of a "Mixed Up" + encrypted PGP/MIME message, a mangling typically produced by + Microsoft's Exchange MTA. See + https://tools.ietf.org/html/draft-dkg-openpgp-pgpmime-message-mangling + for more information. + SEE ALSO ======== diff --git a/lib/index.cc b/lib/index.cc index 1301d78a..158ba5cf 100644 --- a/lib/index.cc +++ b/lib/index.cc @@ -387,11 +387,20 @@ _index_mime_part (notmuch_message_t *message, GMimeContentType *content_type; char *body; const char *charset; + GMimeObject *repaired_part = NULL; if (! part) { _notmuch_database_log (notmuch_message_get_database (message), "Warning: Not indexing empty mime part.\n"); - return; + goto DONE; + } + + repaired_part = _notmuch_repair_mixed_up_mangled (part); + if (repaired_part) { + /* This was likely "Mixed Up" in transit! We will instead use + * the more likely-to-be-correct variant. */ + notmuch_message_add_property (message, "index.repaired", "mixedup"); + part = repaired_part; } _index_content_type (message, part); @@ -444,7 +453,7 @@ _index_mime_part (notmuch_message_t *message, } _index_mime_part (message, indexopts, toindex, msg_crypto); } - return; + goto DONE; } if (GMIME_IS_MESSAGE_PART (part)) { @@ -454,14 +463,14 @@ _index_mime_part (notmuch_message_t *message, _index_mime_part (message, indexopts, g_mime_message_get_mime_part (mime_message), msg_crypto); - return; + goto DONE; } if (! (GMIME_IS_PART (part))) { _notmuch_database_log (notmuch_message_get_database (message), "Warning: Not indexing unknown mime part: %s.\n", g_type_name (G_OBJECT_TYPE (part))); - return; + goto DONE; } disposition = g_mime_object_get_content_disposition (part); @@ -475,7 +484,7 @@ _index_mime_part (notmuch_message_t *message, /* XXX: Would be nice to call out to something here to parse * the attachment into text and then index that. */ - return; + goto DONE; } byte_array = g_byte_array_new (); @@ -521,6 +530,9 @@ _index_mime_part (notmuch_message_t *message, free (body); } + DONE: + if (repaired_part) + g_object_unref (repaired_part); } /* descend (if desired) into the cleartext part of an encrypted MIME diff --git a/test/T351-pgpmime-mangling.sh b/test/T351-pgpmime-mangling.sh index f65b8a24..4555f937 100755 --- a/test/T351-pgpmime-mangling.sh +++ b/test/T351-pgpmime-mangling.sh @@ -21,7 +21,6 @@ test_json_nodes <<<"$output" \ 'body:["original"]'"$bodytext" test_begin_subtest "repaired 'Mixed-up' messages can be found with index.repaired=mixedup" -test_subtest_known_broken output=$(notmuch search --output=messages property:index.repaired=mixedup) test_expect_equal "$output" id:mixed-up@mangling.notmuchmail.org @@ -29,7 +28,6 @@ test_begin_subtest "index cleartext of 'Mixed-Up' mangled PGP/MIME message" test_expect_success 'notmuch reindex --decrypt=true id:mixed-up@mangling.notmuchmail.org' test_begin_subtest "search cleartext of 'Mixed-Up' mangled PGP/MIME message" -test_subtest_known_broken output=$(notmuch search --output=messages body:password) test_expect_equal "$output" id:mixed-up@mangling.notmuchmail.org