diff --git a/src/mimefactory.rs b/src/mimefactory.rs index bef589a25..1fb575ef4 100644 --- a/src/mimefactory.rs +++ b/src/mimefactory.rs @@ -852,7 +852,13 @@ impl MimeFactory { let rfc724_mid = match &self.loaded { Loaded::Message { msg, .. } => match &self.pre_message_mode { - PreMessageMode::Pre { .. } => create_outgoing_rfc724_mid(), + PreMessageMode::Pre { .. } => { + if msg.pre_rfc724_mid.is_empty() { + create_outgoing_rfc724_mid() + } else { + msg.pre_rfc724_mid.clone() + } + } _ => msg.rfc724_mid.clone(), }, Loaded::Mdn { .. } => create_outgoing_rfc724_mid(), diff --git a/src/test_utils.rs b/src/test_utils.rs index f687bd3ca..8491dda86 100644 --- a/src/test_utils.rs +++ b/src/test_utils.rs @@ -715,7 +715,8 @@ impl TestContext { } pub async fn get_smtp_rows_for_msg<'a>(&'a self, msg_id: MsgId) -> Vec> { - self.ctx + let sent_msgs = self + .ctx .sql .query_map_vec( "SELECT id, msg_id, mime, recipients FROM smtp WHERE msg_id=?", @@ -737,7 +738,23 @@ impl TestContext { sender_context: &self.ctx, recipients, }) - .collect() + .collect(); + self.ctx + .sql + .execute("DELETE FROM smtp WHERE msg_id=?", (msg_id,)) + .await + .expect("Delete smtp jobs"); + update_msg_state(&self.ctx, msg_id, MessageState::OutDelivered) + .await + .expect("Update message state"); + self.sql + .execute( + "UPDATE msgs SET timestamp_sent=? WHERE id=?", + (time(), msg_id), + ) + .await + .expect("Update timestamp_sent"); + sent_msgs } /// Parses a message. diff --git a/src/tests/pre_messages/sending.rs b/src/tests/pre_messages/sending.rs index 1d04a4a4d..063711230 100644 --- a/src/tests/pre_messages/sending.rs +++ b/src/tests/pre_messages/sending.rs @@ -56,23 +56,27 @@ async fn test_sending_pre_message() -> Result<()> { .is_some() ); + let post_rfc724_mid = post_message_parsed + .headers + .get_header_value(HeaderDef::MessageId); assert_eq!( - post_message_parsed - .headers - .get_header_value(HeaderDef::MessageId), + post_rfc724_mid, Some(format!("<{}>", msg.rfc724_mid)), "Post-Message should have the rfc message id of the database message" ); + let pre_rfc724_mid = pre_message_parsed + .headers + .get_header_value(HeaderDef::MessageId); assert_ne!( - pre_message_parsed - .headers - .get_header_value(HeaderDef::MessageId), - post_message_parsed - .headers - .get_header_value(HeaderDef::MessageId), + pre_rfc724_mid, post_rfc724_mid, "message ids of Pre-Message and Post-Message should be different" ); + assert_eq!( + pre_rfc724_mid, + Some(format!("<{}>", msg.pre_rfc724_mid)), + "Unexpected pre-message RFC 724 ID" + ); let decrypted_post_message = bob.parse_msg(post_message).await; assert_eq!(decrypted_post_message.decrypting_failed, false); @@ -86,9 +90,7 @@ async fn test_sending_pre_message() -> Result<()> { decrypted_pre_message .get_header(HeaderDef::ChatPostMessageId) .map(String::from), - post_message_parsed - .headers - .get_header_value(HeaderDef::MessageId) + post_rfc724_mid, ); assert!( pre_message_parsed @@ -98,6 +100,25 @@ async fn test_sending_pre_message() -> Result<()> { "no Chat-Post-Message-ID header in unprotected headers of Pre-Message" ); + chat::resend_msgs(alice, &[msg_id]).await?; + let smtp_rows = alice.get_smtp_rows_for_msg(msg_id).await; + assert_eq!(smtp_rows.len(), 2); + + let pre_message_parsed = mailparse::parse_mail(smtp_rows[0].payload.as_bytes())?; + assert_eq!( + pre_message_parsed + .headers + .get_header_value(HeaderDef::MessageId), + pre_rfc724_mid + ); + let post_message_parsed = mailparse::parse_mail(smtp_rows[1].payload.as_bytes())?; + assert_eq!( + post_message_parsed + .headers + .get_header_value(HeaderDef::MessageId), + post_rfc724_mid + ); + Ok(()) }