mirror of
https://github.com/chatmail/core.git
synced 2026-05-05 22:36:30 +03:00
fix grpid extraction from In-Reply-To and References headers
This commit is contained in:
@@ -796,7 +796,6 @@ fn create_or_lookup_group(
|
|||||||
to_ids: &[u32],
|
to_ids: &[u32],
|
||||||
) -> Result<(u32, Blocked)> {
|
) -> Result<(u32, Blocked)> {
|
||||||
let mut chat_id_blocked = Blocked::Not;
|
let mut chat_id_blocked = Blocked::Not;
|
||||||
let mut grpid = "".to_string();
|
|
||||||
let mut grpname = None;
|
let mut grpname = None;
|
||||||
let to_ids_cnt = to_ids.len();
|
let to_ids_cnt = to_ids.len();
|
||||||
let mut recreate_member_list = 0;
|
let mut recreate_member_list = 0;
|
||||||
@@ -813,6 +812,7 @@ fn create_or_lookup_group(
|
|||||||
}
|
}
|
||||||
set_better_msg(mime_parser, &better_msg);
|
set_better_msg(mime_parser, &better_msg);
|
||||||
|
|
||||||
|
let mut grpid = "".to_string();
|
||||||
if let Some(optional_field) = mime_parser.lookup_field("Chat-Group-ID") {
|
if let Some(optional_field) = mime_parser.lookup_field("Chat-Group-ID") {
|
||||||
grpid = optional_field.clone();
|
grpid = optional_field.clone();
|
||||||
}
|
}
|
||||||
@@ -821,20 +821,14 @@ fn create_or_lookup_group(
|
|||||||
if let Some(value) = mime_parser.lookup_field("Message-ID") {
|
if let Some(value) = mime_parser.lookup_field("Message-ID") {
|
||||||
if let Some(extracted_grpid) = dc_extract_grpid_from_rfc724_mid(&value) {
|
if let Some(extracted_grpid) = dc_extract_grpid_from_rfc724_mid(&value) {
|
||||||
grpid = extracted_grpid.to_string();
|
grpid = extracted_grpid.to_string();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if grpid.is_empty() {
|
||||||
|
if let Some(extracted_grpid) = get_grpid_from_list(mime_parser, "In-Reply-To") {
|
||||||
|
grpid = extracted_grpid;
|
||||||
|
} else if let Some(extracted_grpid) = get_grpid_from_list(mime_parser, "References") {
|
||||||
|
grpid = extracted_grpid;
|
||||||
} else {
|
} else {
|
||||||
grpid = "".to_string();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if grpid.is_empty() {
|
|
||||||
if let Some(value) = mime_parser.lookup_field("In-Reply-To") {
|
|
||||||
grpid = value.clone();
|
|
||||||
}
|
|
||||||
if grpid.is_empty() {
|
|
||||||
if let Some(value) = mime_parser.lookup_field("References") {
|
|
||||||
grpid = value.clone();
|
|
||||||
}
|
|
||||||
|
|
||||||
if grpid.is_empty() {
|
|
||||||
return create_or_lookup_adhoc_group(
|
return create_or_lookup_adhoc_group(
|
||||||
context,
|
context,
|
||||||
mime_parser,
|
mime_parser,
|
||||||
@@ -850,7 +844,6 @@ fn create_or_lookup_group(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(optional_field) = mime_parser.lookup_field("Chat-Group-Name").cloned() {
|
if let Some(optional_field) = mime_parser.lookup_field("Chat-Group-Name").cloned() {
|
||||||
grpname = Some(optional_field);
|
grpname = Some(optional_field);
|
||||||
@@ -1135,6 +1128,20 @@ fn create_or_lookup_group(
|
|||||||
Ok((chat_id, chat_id_blocked))
|
Ok((chat_id, chat_id_blocked))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// try extract a grpid from a message-id list header value
|
||||||
|
fn get_grpid_from_list(mime_parser: &MimeParser, header_key: &str) -> Option<String> {
|
||||||
|
if let Some(value) = mime_parser.lookup_field(header_key) {
|
||||||
|
for part in value.split(',').map(str::trim) {
|
||||||
|
if !part.is_empty() {
|
||||||
|
if let Some(extracted_grpid) = dc_extract_grpid_from_rfc724_mid(part) {
|
||||||
|
return Some(extracted_grpid.to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
/// Handle groups for received messages, return chat_id/Blocked status on success
|
/// Handle groups for received messages, return chat_id/Blocked status on success
|
||||||
fn create_or_lookup_adhoc_group(
|
fn create_or_lookup_adhoc_group(
|
||||||
context: &Context,
|
context: &Context,
|
||||||
@@ -1658,6 +1665,7 @@ fn add_or_lookup_contact_by_addr(
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use crate::test_utils::dummy_context;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_hex_hash() {
|
fn test_hex_hash() {
|
||||||
@@ -1666,4 +1674,34 @@ mod tests {
|
|||||||
let res = hex_hash(data);
|
let res = hex_hash(data);
|
||||||
assert_eq!(res, "b94d27b9934d3e08");
|
assert_eq!(res, "b94d27b9934d3e08");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_grpid_simple() {
|
||||||
|
let context = dummy_context();
|
||||||
|
let raw = b"From: hello\n\
|
||||||
|
Subject: outer-subject\n\
|
||||||
|
In-Reply-To: <lqkjwelq123@123123>\n\
|
||||||
|
References: <Gr.HcxyMARjyJy.9-uvzWPTLtV@nauta.cu>\n\
|
||||||
|
\n\
|
||||||
|
hello\x00";
|
||||||
|
let mimeparser = MimeParser::from_bytes(&context.ctx, &raw[..]).unwrap();
|
||||||
|
assert_eq!(get_grpid_from_list(&mimeparser, "In-Reply-To"), None);
|
||||||
|
let grpid = Some("HcxyMARjyJy".to_string());
|
||||||
|
assert_eq!(get_grpid_from_list(&mimeparser, "References"), grpid);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_grpid_from_multiple() {
|
||||||
|
let context = dummy_context();
|
||||||
|
let raw = b"From: hello\n\
|
||||||
|
Subject: outer-subject\n\
|
||||||
|
In-Reply-To: <Gr.HcxyMARjyJy.9-qweqwe@asd.net>\n\
|
||||||
|
References: <qweqweqwe>, <Gr.HcxyMARjyJy.9-uvzWPTLtV@nau.ca>\n\
|
||||||
|
\n\
|
||||||
|
hello\x00";
|
||||||
|
let mimeparser = MimeParser::from_bytes(&context.ctx, &raw[..]).unwrap();
|
||||||
|
let grpid = Some("HcxyMARjyJy".to_string());
|
||||||
|
assert_eq!(get_grpid_from_list(&mimeparser, "In-Reply-To"), grpid);
|
||||||
|
assert_eq!(get_grpid_from_list(&mimeparser, "References"), grpid);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -217,8 +217,11 @@ pub(crate) fn dc_create_outgoing_rfc724_mid(grpid: Option<&str>, from_addr: &str
|
|||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
///
|
///
|
||||||
/// * `mid` - A string that holds the message id
|
/// * `mid` - A string that holds the message id. Leading/Trailing <>
|
||||||
|
/// characters are automatically stripped.
|
||||||
pub(crate) fn dc_extract_grpid_from_rfc724_mid(mid: &str) -> Option<&str> {
|
pub(crate) fn dc_extract_grpid_from_rfc724_mid(mid: &str) -> Option<&str> {
|
||||||
|
let mid = mid.trim_start_matches('<').trim_end_matches('>');
|
||||||
|
|
||||||
if mid.len() < 9 || !mid.starts_with("Gr.") {
|
if mid.len() < 9 || !mid.starts_with("Gr.") {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
@@ -688,6 +691,16 @@ mod tests {
|
|||||||
let mid = "Gr.1234567890123456.morerandom@domain.de";
|
let mid = "Gr.1234567890123456.morerandom@domain.de";
|
||||||
let grpid = dc_extract_grpid_from_rfc724_mid(mid);
|
let grpid = dc_extract_grpid_from_rfc724_mid(mid);
|
||||||
assert_eq!(grpid, Some("1234567890123456"));
|
assert_eq!(grpid, Some("1234567890123456"));
|
||||||
|
|
||||||
|
// Should return extracted grpid for grpid with length of 11
|
||||||
|
let mid = "<Gr.12345678901.morerandom@domain.de>";
|
||||||
|
let grpid = dc_extract_grpid_from_rfc724_mid(mid);
|
||||||
|
assert_eq!(grpid, Some("12345678901"));
|
||||||
|
|
||||||
|
// Should return extracted grpid for grpid with length of 11
|
||||||
|
let mid = "<Gr.1234567890123456.morerandom@domain.de>";
|
||||||
|
let grpid = dc_extract_grpid_from_rfc724_mid(mid);
|
||||||
|
assert_eq!(grpid, Some("1234567890123456"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
Reference in New Issue
Block a user