Use mailparse::msgidparse to parse Message-IDs

This commit is contained in:
Alexander Krotov
2020-02-22 00:42:54 +03:00
committed by holger krekel
parent a18f4c9b1b
commit 33463856c5
2 changed files with 11 additions and 20 deletions

View File

@@ -1464,7 +1464,7 @@ fn is_known_rfc724_mid_in_list(context: &Context, mid_list: &str) -> bool {
return false; return false;
} }
if let Ok(ids) = mailparse::addrparse(mid_list) { if let Ok(ids) = mailparse::msgidparse(mid_list) {
for id in ids.iter() { for id in ids.iter() {
if is_known_rfc724_mid(context, id) { if is_known_rfc724_mid(context, id) {
return true; 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). /// 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 { fn is_known_rfc724_mid(context: &Context, rfc724_mid: &str) -> bool {
let addr = extract_single_from_addr(rfc724_mid);
context context
.sql .sql
.exists( .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 \ LEFT JOIN chats c ON m.chat_id=c.id \
WHERE m.rfc724_mid=? \ WHERE m.rfc724_mid=? \
AND m.chat_id>9 AND c.blocked=0;", AND m.chat_id>9 AND c.blocked=0;",
params![addr], params![rfc724_mid],
) )
.unwrap_or_default() .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 { 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() { for id in ids.iter() {
if is_msgrmsg_rfc724_mid(context, id) { if is_msgrmsg_rfc724_mid(context, id) {
return true; return true;
@@ -1522,21 +1521,13 @@ pub(crate) fn is_msgrmsg_rfc724_mid_in_list(context: &Context, mid_list: &str) -
false 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. /// Check if a message is a reply to any messenger message.
fn is_msgrmsg_rfc724_mid(context: &Context, rfc724_mid: &mailparse::MailAddr) -> bool { fn is_msgrmsg_rfc724_mid(context: &Context, rfc724_mid: &str) -> bool {
let addr = extract_single_from_addr(rfc724_mid);
context context
.sql .sql
.exists( .exists(
"SELECT id FROM msgs WHERE rfc724_mid=? AND msgrmsg!=0 AND chat_id>9;", "SELECT id FROM msgs WHERE rfc724_mid=? AND msgrmsg!=0 AND chat_id>9;",
params![addr], params![rfc724_mid],
) )
.unwrap_or_default() .unwrap_or_default()
} }

View File

@@ -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<String> { fn parse_message_id(value: &str) -> crate::error::Result<String> {
let addrs = mailparse::addrparse(value) let ids = mailparse::msgidparse(value)
.map_err(|err| format_err!("failed to parse message id {:?}", err))?; .map_err(|err| format_err!("failed to parse message id {:?}", err))?;
if let Some(info) = addrs.extract_single_info() { if ids.len() == 1 {
return Ok(info.addr); 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<Vec<mailparse::MailHeader>> { fn get_fetch_headers(prefetch_msg: &Fetch) -> Result<Vec<mailparse::MailHeader>> {