message: Don't assume there's a sub-message

Also add unit-test.

Fixes: issue #2256.
This commit is contained in:
Dirk-Jan C. Binnema 2022-05-12 19:58:08 +03:00
parent 9062b9d67f
commit eb22ec450c
4 changed files with 35 additions and 8 deletions

View File

@ -67,9 +67,12 @@ MessagePart::cooked_filename() const noexcept
// MimeMessagepart. Construct a name based on subject. // MimeMessagepart. Construct a name based on subject.
if (mime_object().is_message_part()) { if (mime_object().is_message_part()) {
auto msg{MimeMessagePart{mime_object()}.get_message()}; auto msg{MimeMessagePart{mime_object()}.get_message()};
return msg.subject() if (!msg)
.map(cleanup) return Nothing;
.value_or("no-subject") + ".eml"; else
return msg->subject()
.map(cleanup)
.value_or("no-subject") + ".eml";
} }
return Nothing; return Nothing;

View File

@ -417,7 +417,10 @@ process_message_part(const MimeMessagePart& msg_part,
Message::Private& info) Message::Private& info)
{ {
auto submsg{msg_part.get_message()}; auto submsg{msg_part.get_message()};
submsg.for_each([&](auto&& parent, auto&& child_obj) { if (!submsg)
return;
submsg->for_each([&](auto&& parent, auto&& child_obj) {
/* XXX: we only handle one level */ /* XXX: we only handle one level */

View File

@ -1182,11 +1182,14 @@ public:
/** /**
* Get the MimeMessage for this MimeMessagePart. * Get the MimeMessage for this MimeMessagePart.
* *
* @return the MimeMessage * @return the MimeMessage or Nothing
*/ */
MimeMessage get_message() const { Option<MimeMessage> get_message() const {
return MimeMessage( auto msg{g_mime_message_part_get_message(self())};
Object(G_OBJECT(g_mime_message_part_get_message(self())))); if (msg)
return MimeMessage(Object(G_OBJECT(msg)));
else
return Nothing;
} }
private: private:
GMimeMessagePart* self() const { GMimeMessagePart* self() const {

View File

@ -456,6 +456,22 @@ C0bdoCx44QVU8HaZ2x91h3GoM/0q5bqM/rvCauwbokiJgAUrznecNPY=
g_assert_cmpuint(n, ==, 1); g_assert_cmpuint(n, ==, 1);
} }
static void
test_message_multipart_mixed_rfc822(void)
{
constexpr const char *msgtext =
R"(Content-Type: multipart/mixed;
boundary="Multipart_Tue_Sep__2_15:42:35_2014-1"
--Multipart_Tue_Sep__2_15:42:35_2014-1
Content-Type: message/rfc822
)";
auto message{Message::make_from_text(msgtext)};
g_assert_true(!!message);
}
int int
main(int argc, char* argv[]) main(int argc, char* argv[])
{ {
@ -469,6 +485,8 @@ main(int argc, char* argv[])
test_message_signed); test_message_signed);
g_test_add_func("/message/message/signed-encrypted", g_test_add_func("/message/message/signed-encrypted",
test_message_signed_encrypted); test_message_signed_encrypted);
g_test_add_func("/message/message/multipart-mixed-rfc822",
test_message_multipart_mixed_rfc822);
return g_test_run(); return g_test_run();
} }