From fcfbbcacfe905194c17d47455d6d14fc8bdad2ff Mon Sep 17 00:00:00 2001 From: Daniel Colascione Date: Sun, 23 Oct 2022 14:30:35 -0400 Subject: [PATCH] message: use fake Message-ID when empty Previously, mu generated a fake message ID for messages without a Message-ID header. This fake message ID allows these messages to show in an --include-related query. However, if a message contained a Message-ID header with the value equal to the empty string, we did not generate a fake message ID in the index, and consequently, these messages failed to appear in an --include-related query. This change uses a fake message ID when the Message-ID header is absent _or_ empty. --- lib/message/mu-message.cc | 5 +++- lib/message/test-mu-message.cc | 44 ++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/lib/message/mu-message.cc b/lib/message/mu-message.cc index 4c5fc4d6..a8ff0f5f 100644 --- a/lib/message/mu-message.cc +++ b/lib/message/mu-message.cc @@ -638,7 +638,10 @@ fill_document(Message::Private& priv) const auto path{doc.string_value(Field::Id::Path)}; const auto refs{mime_msg.references()}; - const auto message_id{mime_msg.message_id().value_or(fake_message_id(path))}; + const auto& raw_message_id = mime_msg.message_id(); + const auto message_id = raw_message_id.has_value() && !raw_message_id->empty() + ? *raw_message_id + : fake_message_id(path); process_message(mime_msg, path, priv); diff --git a/lib/message/test-mu-message.cc b/lib/message/test-mu-message.cc index bcfbbf62..a96b44bf 100644 --- a/lib/message/test-mu-message.cc +++ b/lib/message/test-mu-message.cc @@ -969,6 +969,48 @@ id Emoji", EmojiSymbols;"> } +static void +test_message_message_id() +{ + constexpr const auto msg1 = +R"(From: "Mu Test" +To: mu@djcbsoftware.nl +Message-ID: <87lew9xddt.fsf@djcbsoftware.nl> + +abc +)"; + + constexpr const auto msg2 = +R"(From: "Mu Test" +To: mu@djcbsoftware.nl + +abc +)"; + + constexpr const auto msg3 = +R"(From: "Mu Test" +To: mu@djcbsoftware.nl +Message-ID: + +abc +)"; + + const auto m1{Message::make_from_text(msg1, "/foo/cur/m123:2,S")}; + assert_valid_result(m1); + + const auto m2{Message::make_from_text(msg2, "/foo/cur/m456:2,S")}; + assert_valid_result(m2); + const auto m3{Message::make_from_text(msg3, "/foo/cur/m789:2,S")}; + assert_valid_result(m3); + + assert_equal(m1->message_id(), "87lew9xddt.fsf@djcbsoftware.nl"); + + /* both with absent and empty message-id, generate "random" fake one, + * which must end in @mu.id */ + g_assert_true(g_str_has_suffix(m2->message_id().c_str(), "@mu.id")); + g_assert_true(g_str_has_suffix(m3->message_id().c_str(), "@mu.id")); +} + static void test_message_fail () @@ -1015,6 +1057,8 @@ main(int argc, char* argv[]) test_message_references); g_test_add_func("/message/message/outlook-body", test_message_outlook_body); + g_test_add_func("/message/message/message-id", + test_message_message_id); g_test_add_func("/message/message/fail", test_message_fail); g_test_add_func("/message/message/sanitize-maildir",