diff --git a/src/receive_imf.rs b/src/receive_imf.rs index 5e7c21a57..5ef03dfb6 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -40,7 +40,7 @@ use crate::simplify; use crate::sql; use crate::stock_str; use crate::sync::Sync::*; -use crate::tools::{self, buf_compress, extract_grpid_from_rfc724_mid}; +use crate::tools::{self, buf_compress}; use crate::{chatlist_events, location}; use crate::{contact, imap}; use iroh_net::NodeAddr; @@ -1829,7 +1829,7 @@ async fn create_or_lookup_group( to_ids: &[ContactId], verified_encryption: &VerifiedEncryption, ) -> Result> { - let Some(grpid) = try_getting_grpid(mime_parser) else { + let Some(grpid) = mime_parser.get_chat_group_id().map(|s| s.to_string()) else { if is_partial_download { // Partial download may be an encrypted message with protected Subject header. // @@ -2471,37 +2471,6 @@ async fn apply_mailinglist_changes( Ok(()) } -fn try_getting_grpid(mime_parser: &MimeMessage) -> Option { - if let Some(optional_field) = mime_parser.get_chat_group_id() { - return Some(optional_field.to_string()); - } - - // Useful for undecipherable messages sent to known group. - if let Some(extracted_grpid) = extract_grpid(mime_parser, HeaderDef::MessageId) { - return Some(extracted_grpid.to_string()); - } - - if !mime_parser.has_chat_version() { - if let Some(extracted_grpid) = extract_grpid(mime_parser, HeaderDef::InReplyTo) { - return Some(extracted_grpid.to_string()); - } else if let Some(extracted_grpid) = extract_grpid(mime_parser, HeaderDef::References) { - return Some(extracted_grpid.to_string()); - } - } - - None -} - -/// try extract a grpid from a message-id list header value -fn extract_grpid(mime_parser: &MimeMessage, headerdef: HeaderDef) -> Option<&str> { - let header = mime_parser.get_header(headerdef)?; - let parts = header - .split(',') - .map(str::trim) - .filter(|part| !part.is_empty()); - parts.filter_map(extract_grpid_from_rfc724_mid).next() -} - /// Creates ad-hoc group and returns chat ID on success. async fn create_adhoc_group( context: &Context, diff --git a/src/receive_imf/tests.rs b/src/receive_imf/tests.rs index e3d7a03db..38d0d4eff 100644 --- a/src/receive_imf/tests.rs +++ b/src/receive_imf/tests.rs @@ -16,25 +16,6 @@ use crate::imex::{imex, ImexMode}; use crate::test_utils::{get_chat_msg, TestContext, TestContextManager}; use crate::tools::SystemTime; -#[tokio::test(flavor = "multi_thread", worker_threads = 2)] -async fn test_grpid_simple() { - let context = TestContext::new_alice().await; - let raw = b"Received: (Postfix, from userid 1000); Mon, 4 Dec 2006 14:51:39 +0100 (CET)\n\ - From: hello@example.org\n\ - Subject: outer-subject\n\ - In-Reply-To: \n\ - References: \n\ - \n\ - hello\x00"; - let mimeparser = MimeMessage::from_bytes(&context.ctx, &raw[..], None) - .await - .unwrap(); - assert_eq!(mimeparser.incoming, true); - assert_eq!(extract_grpid(&mimeparser, HeaderDef::InReplyTo), None); - let grpid = Some("HcxyMARjyJy"); - assert_eq!(extract_grpid(&mimeparser, HeaderDef::References), grpid); -} - #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_outgoing() -> Result<()> { let context = TestContext::new_alice().await; @@ -61,24 +42,6 @@ async fn test_bad_from() { assert!(mimeparser.is_err()); } -#[tokio::test(flavor = "multi_thread", worker_threads = 2)] -async fn test_grpid_from_multiple() { - let context = TestContext::new_alice().await; - let raw = b"Received: (Postfix, from userid 1000); Mon, 4 Dec 2006 14:51:39 +0100 (CET)\n\ - From: hello@example.org\n\ - Subject: outer-subject\n\ - In-Reply-To: \n\ - References: , \n\ - \n\ - hello\x00"; - let mimeparser = MimeMessage::from_bytes(&context.ctx, &raw[..], None) - .await - .unwrap(); - let grpid = Some("HcxyMARjyJy"); - assert_eq!(extract_grpid(&mimeparser, HeaderDef::InReplyTo), grpid); - assert_eq!(extract_grpid(&mimeparser, HeaderDef::References), grpid); -} - static MSGRMSG: &[u8] = b"Received: (Postfix, from userid 1000); Mon, 4 Dec 2006 14:51:39 +0100 (CET)\n\ From: Bob \n\ diff --git a/src/tools.rs b/src/tools.rs index abbfb25cd..47a3cd88a 100644 --- a/src/tools.rs +++ b/src/tools.rs @@ -294,31 +294,6 @@ pub(crate) fn create_outgoing_rfc724_mid() -> String { format!("Mr.{}.{}@localhost", create_id(), create_id()) } -/// Extract the group id (grpid) from a message id (mid) -/// -/// # Arguments -/// -/// * `mid` - A string that holds the message id. Leading/Trailing <> -/// characters are automatically stripped. -pub(crate) fn 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.") { - return None; - } - - if let Some(mid_without_offset) = mid.get(3..) { - if let Some(grpid_len) = mid_without_offset.find('.') { - /* strict length comparison, the 'Gr.' magic is weak enough */ - if grpid_len == 11 || grpid_len == 16 { - return Some(mid_without_offset.get(0..grpid_len).unwrap()); - } - } - } - - None -} - // the returned suffix is lower-case pub fn get_filesuffix_lc(path_filename: &str) -> Option { Path::new(path_filename) @@ -925,45 +900,11 @@ DKIM Results: Passed=true"; } } - #[test] - fn test_extract_grpid_from_rfc724_mid() { - // Should return None if we pass invalid mid - let mid = "foobar"; - let grpid = extract_grpid_from_rfc724_mid(mid); - assert_eq!(grpid, None); - - // Should return None if grpid has a length which is not 11 or 16 - let mid = "Gr.12345678.morerandom@domain.de"; - let grpid = extract_grpid_from_rfc724_mid(mid); - assert_eq!(grpid, None); - - // Should return extracted grpid for grpid with length of 11 - let mid = "Gr.12345678901.morerandom@domain.de"; - let grpid = 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 = extract_grpid_from_rfc724_mid(mid); - assert_eq!(grpid, Some("1234567890123456")); - - // Should return extracted grpid for grpid with length of 11 - let mid = ""; - let grpid = extract_grpid_from_rfc724_mid(mid); - assert_eq!(grpid, Some("12345678901")); - - // Should return extracted grpid for grpid with length of 11 - let mid = ""; - let grpid = extract_grpid_from_rfc724_mid(mid); - assert_eq!(grpid, Some("1234567890123456")); - } - #[test] fn test_create_outgoing_rfc724_mid() { let mid = create_outgoing_rfc724_mid(); assert!(mid.starts_with("Mr.")); assert!(mid.ends_with("@localhost")); - assert!(extract_grpid_from_rfc724_mid(mid.as_str()).is_none()); } proptest! {