1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 14:07:46 +00:00

LibIMAP: Stop parsing immediately on error

This makes the parser more resilient to invalid IMAP messages.

Usages of `Optional` have also been removed where the empty case is
equivalent to an empty object.
This commit is contained in:
Tim Ledbetter 2023-10-07 15:53:30 +01:00 committed by Andrew Kaster
parent 29c477598c
commit 54a28afc13
5 changed files with 333 additions and 314 deletions

View file

@ -317,33 +317,33 @@ void MailWidget::selected_mailbox(GUI::ModelIndex const& index)
auto seen = !response_data.flags().find_if([](StringView value) { return value.equals_ignoring_ascii_case("\\Seen"sv); }).is_end();
DeprecatedString date = internal_date.to_deprecated_string();
DeprecatedString subject = envelope.subject.value_or("(No subject)");
DeprecatedString subject = envelope.subject.is_empty() ? "(No subject)" : envelope.subject;
if (subject.contains("=?"sv) && subject.contains("?="sv)) {
subject = MUST(IMAP::decode_rfc2047_encoded_words(subject)).span();
}
StringBuilder sender_builder;
if (envelope.from.has_value()) {
if (!envelope.from.is_empty()) {
bool first { true };
for (auto const& address : *envelope.from) {
for (auto const& address : envelope.from) {
if (!first)
sender_builder.append(", "sv);
if (address.name.has_value()) {
if (address.name->contains("=?"sv) && address.name->contains("?="sv))
sender_builder.append(MUST(IMAP::decode_rfc2047_encoded_words(*address.name)));
if (!address.name.is_empty()) {
if (address.name.contains("=?"sv) && address.name.contains("?="sv))
sender_builder.append(MUST(IMAP::decode_rfc2047_encoded_words(address.name)));
else
sender_builder.append(*address.name);
sender_builder.append(address.name);
sender_builder.append(" <"sv);
sender_builder.append(address.mailbox.value_or({}));
sender_builder.append(address.mailbox);
sender_builder.append('@');
sender_builder.append(address.host.value_or({}));
sender_builder.append(address.host);
sender_builder.append('>');
} else {
sender_builder.append(address.mailbox.value_or({}));
sender_builder.append(address.mailbox);
sender_builder.append('@');
sender_builder.append(address.host.value_or({}));
sender_builder.append(address.host);
}
}
}
@ -474,13 +474,13 @@ void MailWidget::selected_email_to_load(GUI::ModelIndex const& index)
}
auto& body_data = fetch_response_data.body_data();
auto body_text_part_iterator = body_data.find_if([](Tuple<IMAP::FetchCommand::DataItem, Optional<DeprecatedString>>& data) {
auto body_text_part_iterator = body_data.find_if([](Tuple<IMAP::FetchCommand::DataItem, DeprecatedString>& data) {
const auto data_item = data.get<0>();
return data_item.section.has_value() && data_item.section->type == IMAP::FetchCommand::DataItem::SectionType::Parts;
});
VERIFY(body_text_part_iterator != body_data.end());
auto& encoded_data = body_text_part_iterator->get<1>().value();
auto& encoded_data = body_text_part_iterator->get<1>();
DeprecatedString decoded_data;