From 33463856c59aa03308a5496d8d404e610c34c113 Mon Sep 17 00:00:00 2001 From: Alexander Krotov Date: Sat, 22 Feb 2020 00:42:54 +0300 Subject: [PATCH] Use mailparse::msgidparse to parse Message-IDs --- src/dc_receive_imf.rs | 21 ++++++--------------- src/imap/mod.rs | 10 +++++----- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/src/dc_receive_imf.rs b/src/dc_receive_imf.rs index 67b1a9264..d65107540 100644 --- a/src/dc_receive_imf.rs +++ b/src/dc_receive_imf.rs @@ -1464,7 +1464,7 @@ fn is_known_rfc724_mid_in_list(context: &Context, mid_list: &str) -> bool { return false; } - if let Ok(ids) = mailparse::addrparse(mid_list) { + if let Ok(ids) = mailparse::msgidparse(mid_list) { for id in ids.iter() { if is_known_rfc724_mid(context, id) { return true; @@ -1476,8 +1476,7 @@ fn is_known_rfc724_mid_in_list(context: &Context, mid_list: &str) -> bool { } /// Check if a message is a reply to a known message (messenger or non-messenger). -fn is_known_rfc724_mid(context: &Context, rfc724_mid: &mailparse::MailAddr) -> bool { - let addr = extract_single_from_addr(rfc724_mid); +fn is_known_rfc724_mid(context: &Context, rfc724_mid: &str) -> bool { context .sql .exists( @@ -1485,7 +1484,7 @@ fn is_known_rfc724_mid(context: &Context, rfc724_mid: &mailparse::MailAddr) -> b LEFT JOIN chats c ON m.chat_id=c.id \ WHERE m.rfc724_mid=? \ AND m.chat_id>9 AND c.blocked=0;", - params![addr], + params![rfc724_mid], ) .unwrap_or_default() } @@ -1512,7 +1511,7 @@ fn is_reply_to_messenger_message(context: &Context, mime_parser: &MimeMessage) - } pub(crate) fn is_msgrmsg_rfc724_mid_in_list(context: &Context, mid_list: &str) -> bool { - if let Ok(ids) = mailparse::addrparse(mid_list) { + if let Ok(ids) = mailparse::msgidparse(mid_list) { for id in ids.iter() { if is_msgrmsg_rfc724_mid(context, id) { return true; @@ -1522,21 +1521,13 @@ pub(crate) fn is_msgrmsg_rfc724_mid_in_list(context: &Context, mid_list: &str) - false } -fn extract_single_from_addr(addr: &mailparse::MailAddr) -> &String { - match addr { - mailparse::MailAddr::Group(infos) => &infos.addrs[0].addr, - mailparse::MailAddr::Single(info) => &info.addr, - } -} - /// Check if a message is a reply to any messenger message. -fn is_msgrmsg_rfc724_mid(context: &Context, rfc724_mid: &mailparse::MailAddr) -> bool { - let addr = extract_single_from_addr(rfc724_mid); +fn is_msgrmsg_rfc724_mid(context: &Context, rfc724_mid: &str) -> bool { context .sql .exists( "SELECT id FROM msgs WHERE rfc724_mid=? AND msgrmsg!=0 AND chat_id>9;", - params![addr], + params![rfc724_mid], ) .unwrap_or_default() } diff --git a/src/imap/mod.rs b/src/imap/mod.rs index 282836bd8..686d6cd1f 100644 --- a/src/imap/mod.rs +++ b/src/imap/mod.rs @@ -1307,14 +1307,14 @@ fn precheck_imf(context: &Context, rfc724_mid: &str, server_folder: &str, server } fn parse_message_id(value: &str) -> crate::error::Result { - let addrs = mailparse::addrparse(value) + let ids = mailparse::msgidparse(value) .map_err(|err| format_err!("failed to parse message id {:?}", err))?; - if let Some(info) = addrs.extract_single_info() { - return Ok(info.addr); + if ids.len() == 1 { + Ok(ids[0].clone()) + } else { + bail!("could not parse message_id: {}", value); } - - bail!("could not parse message_id: {}", value); } fn get_fetch_headers(prefetch_msg: &Fetch) -> Result> {