Skip to content

Commit af16fc9

Browse files
committed
fix: Make Message-ID of pre-messages stable across resends (#8007)
1 parent c99b8a4 commit af16fc9

3 files changed

Lines changed: 59 additions & 15 deletions

File tree

src/mimefactory.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -852,7 +852,13 @@ impl MimeFactory {
852852

853853
let rfc724_mid = match &self.loaded {
854854
Loaded::Message { msg, .. } => match &self.pre_message_mode {
855-
PreMessageMode::Pre { .. } => create_outgoing_rfc724_mid(),
855+
PreMessageMode::Pre { .. } => {
856+
if msg.pre_rfc724_mid.is_empty() {
857+
create_outgoing_rfc724_mid()
858+
} else {
859+
msg.pre_rfc724_mid.clone()
860+
}
861+
}
856862
_ => msg.rfc724_mid.clone(),
857863
},
858864
Loaded::Mdn { .. } => create_outgoing_rfc724_mid(),

src/test_utils.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,8 @@ impl TestContext {
715715
}
716716

717717
pub async fn get_smtp_rows_for_msg<'a>(&'a self, msg_id: MsgId) -> Vec<SentMessage<'a>> {
718-
self.ctx
718+
let sent_msgs = self
719+
.ctx
719720
.sql
720721
.query_map_vec(
721722
"SELECT id, msg_id, mime, recipients FROM smtp WHERE msg_id=?",
@@ -737,7 +738,23 @@ impl TestContext {
737738
sender_context: &self.ctx,
738739
recipients,
739740
})
740-
.collect()
741+
.collect();
742+
self.ctx
743+
.sql
744+
.execute("DELETE FROM smtp WHERE msg_id=?", (msg_id,))
745+
.await
746+
.expect("Delete smtp jobs");
747+
update_msg_state(&self.ctx, msg_id, MessageState::OutDelivered)
748+
.await
749+
.expect("Update message state");
750+
self.sql
751+
.execute(
752+
"UPDATE msgs SET timestamp_sent=? WHERE id=?",
753+
(time(), msg_id),
754+
)
755+
.await
756+
.expect("Update timestamp_sent");
757+
sent_msgs
741758
}
742759

743760
/// Parses a message.

src/tests/pre_messages/sending.rs

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,23 +56,27 @@ async fn test_sending_pre_message() -> Result<()> {
5656
.is_some()
5757
);
5858

59+
let post_rfc724_mid = post_message_parsed
60+
.headers
61+
.get_header_value(HeaderDef::MessageId);
5962
assert_eq!(
60-
post_message_parsed
61-
.headers
62-
.get_header_value(HeaderDef::MessageId),
63+
post_rfc724_mid,
6364
Some(format!("<{}>", msg.rfc724_mid)),
6465
"Post-Message should have the rfc message id of the database message"
6566
);
6667

68+
let pre_rfc724_mid = pre_message_parsed
69+
.headers
70+
.get_header_value(HeaderDef::MessageId);
6771
assert_ne!(
68-
pre_message_parsed
69-
.headers
70-
.get_header_value(HeaderDef::MessageId),
71-
post_message_parsed
72-
.headers
73-
.get_header_value(HeaderDef::MessageId),
72+
pre_rfc724_mid, post_rfc724_mid,
7473
"message ids of Pre-Message and Post-Message should be different"
7574
);
75+
assert_eq!(
76+
pre_rfc724_mid,
77+
Some(format!("<{}>", msg.pre_rfc724_mid)),
78+
"Unexpected pre-message RFC 724 ID"
79+
);
7680

7781
let decrypted_post_message = bob.parse_msg(post_message).await;
7882
assert_eq!(decrypted_post_message.decrypting_failed, false);
@@ -86,9 +90,7 @@ async fn test_sending_pre_message() -> Result<()> {
8690
decrypted_pre_message
8791
.get_header(HeaderDef::ChatPostMessageId)
8892
.map(String::from),
89-
post_message_parsed
90-
.headers
91-
.get_header_value(HeaderDef::MessageId)
93+
post_rfc724_mid,
9294
);
9395
assert!(
9496
pre_message_parsed
@@ -98,6 +100,25 @@ async fn test_sending_pre_message() -> Result<()> {
98100
"no Chat-Post-Message-ID header in unprotected headers of Pre-Message"
99101
);
100102

103+
chat::resend_msgs(alice, &[msg_id]).await?;
104+
let smtp_rows = alice.get_smtp_rows_for_msg(msg_id).await;
105+
assert_eq!(smtp_rows.len(), 2);
106+
107+
let pre_message_parsed = mailparse::parse_mail(smtp_rows[0].payload.as_bytes())?;
108+
assert_eq!(
109+
pre_message_parsed
110+
.headers
111+
.get_header_value(HeaderDef::MessageId),
112+
pre_rfc724_mid
113+
);
114+
let post_message_parsed = mailparse::parse_mail(smtp_rows[1].payload.as_bytes())?;
115+
assert_eq!(
116+
post_message_parsed
117+
.headers
118+
.get_header_value(HeaderDef::MessageId),
119+
post_rfc724_mid
120+
);
121+
101122
Ok(())
102123
}
103124

0 commit comments

Comments
 (0)