mirror of
https://github.com/chatmail/core.git
synced 2026-05-07 08:56:30 +03:00
fix: Make Message-ID of pre-messages stable across resends (#8007)
This commit is contained in:
@@ -852,7 +852,13 @@ impl MimeFactory {
|
|||||||
|
|
||||||
let rfc724_mid = match &self.loaded {
|
let rfc724_mid = match &self.loaded {
|
||||||
Loaded::Message { msg, .. } => match &self.pre_message_mode {
|
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(),
|
_ => msg.rfc724_mid.clone(),
|
||||||
},
|
},
|
||||||
Loaded::Mdn { .. } => create_outgoing_rfc724_mid(),
|
Loaded::Mdn { .. } => create_outgoing_rfc724_mid(),
|
||||||
|
|||||||
@@ -715,7 +715,8 @@ impl TestContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_smtp_rows_for_msg<'a>(&'a self, msg_id: MsgId) -> Vec<SentMessage<'a>> {
|
pub async fn get_smtp_rows_for_msg<'a>(&'a self, msg_id: MsgId) -> Vec<SentMessage<'a>> {
|
||||||
self.ctx
|
let sent_msgs = self
|
||||||
|
.ctx
|
||||||
.sql
|
.sql
|
||||||
.query_map_vec(
|
.query_map_vec(
|
||||||
"SELECT id, msg_id, mime, recipients FROM smtp WHERE msg_id=?",
|
"SELECT id, msg_id, mime, recipients FROM smtp WHERE msg_id=?",
|
||||||
@@ -737,7 +738,23 @@ impl TestContext {
|
|||||||
sender_context: &self.ctx,
|
sender_context: &self.ctx,
|
||||||
recipients,
|
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.
|
/// Parses a message.
|
||||||
|
|||||||
@@ -56,23 +56,27 @@ async fn test_sending_pre_message() -> Result<()> {
|
|||||||
.is_some()
|
.is_some()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let post_rfc724_mid = post_message_parsed
|
||||||
|
.headers
|
||||||
|
.get_header_value(HeaderDef::MessageId);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
post_message_parsed
|
post_rfc724_mid,
|
||||||
.headers
|
|
||||||
.get_header_value(HeaderDef::MessageId),
|
|
||||||
Some(format!("<{}>", msg.rfc724_mid)),
|
Some(format!("<{}>", msg.rfc724_mid)),
|
||||||
"Post-Message should have the rfc message id of the database message"
|
"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!(
|
assert_ne!(
|
||||||
pre_message_parsed
|
pre_rfc724_mid, post_rfc724_mid,
|
||||||
.headers
|
|
||||||
.get_header_value(HeaderDef::MessageId),
|
|
||||||
post_message_parsed
|
|
||||||
.headers
|
|
||||||
.get_header_value(HeaderDef::MessageId),
|
|
||||||
"message ids of Pre-Message and Post-Message should be different"
|
"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;
|
let decrypted_post_message = bob.parse_msg(post_message).await;
|
||||||
assert_eq!(decrypted_post_message.decrypting_failed, false);
|
assert_eq!(decrypted_post_message.decrypting_failed, false);
|
||||||
@@ -86,9 +90,7 @@ async fn test_sending_pre_message() -> Result<()> {
|
|||||||
decrypted_pre_message
|
decrypted_pre_message
|
||||||
.get_header(HeaderDef::ChatPostMessageId)
|
.get_header(HeaderDef::ChatPostMessageId)
|
||||||
.map(String::from),
|
.map(String::from),
|
||||||
post_message_parsed
|
post_rfc724_mid,
|
||||||
.headers
|
|
||||||
.get_header_value(HeaderDef::MessageId)
|
|
||||||
);
|
);
|
||||||
assert!(
|
assert!(
|
||||||
pre_message_parsed
|
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"
|
"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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user