fix: send MDNs to all authentic relays of a contact, not just whatever get_addr() returns.

This commit is contained in:
holger krekel
2026-07-27 21:54:42 +02:00
parent 856ea29c47
commit 00e1d00dfa
3 changed files with 37 additions and 6 deletions
+3 -1
View File
@@ -578,10 +578,12 @@ impl MimeFactory {
let timestamp = time(); let timestamp = time();
let addr = contact.get_addr().to_string(); let addr = contact.get_addr().to_string();
let mut recipients = vec![addr.clone()];
let encryption_pubkeys = if from_id == ContactId::SELF { let encryption_pubkeys = if from_id == ContactId::SELF {
Some(Vec::new()) Some(Vec::new())
} else if contact.is_key_contact() { } else if contact.is_key_contact() {
if let Some(key) = contact.public_key(context).await? { if let Some(key) = contact.public_key(context).await? {
recipients = addresses_from_public_key(&key).unwrap_or_else(|| vec![addr.clone()]);
Some(vec![(addr.clone(), key)]) Some(vec![(addr.clone(), key)])
} else { } else {
Some(Vec::new()) Some(Vec::new())
@@ -595,7 +597,7 @@ impl MimeFactory {
from_displayname: "".to_string(), from_displayname: "".to_string(),
sender_displayname: None, sender_displayname: None,
selfstatus: "".to_string(), selfstatus: "".to_string(),
recipients: vec![addr], recipients,
encryption_pubkeys, encryption_pubkeys,
to: vec![("".to_string(), contact.get_addr().to_string())], to: vec![("".to_string(), contact.get_addr().to_string())],
past_members: vec![], past_members: vec![],
+29 -1
View File
@@ -14,8 +14,9 @@ use crate::chat::{
}; };
use crate::chatlist::Chatlist; use crate::chatlist::Chatlist;
use crate::constants; use crate::constants;
use crate::contact::{Origin, import_vcard}; use crate::contact::{Origin, import_public_key, import_vcard};
use crate::headerdef::HeaderDef; use crate::headerdef::HeaderDef;
use crate::key::{load_self_secret_key, secret_key_to_public_key};
use crate::message; use crate::message;
use crate::mimeparser::MimeMessage; use crate::mimeparser::MimeMessage;
use crate::receive_imf::receive_imf; use crate::receive_imf::receive_imf;
@@ -327,6 +328,33 @@ async fn test_mdn_create_encrypted() -> Result<()> {
Ok(()) Ok(())
} }
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn test_mdn_sent_to_all_relays() -> Result<()> {
let mut tcm = TestContextManager::new();
let alice = &tcm.alice().await;
let bob = &tcm.bob().await;
let rcvd = tcm.send_recv_accept(bob, alice, "Heyho").await;
// Bob's key gets a second relay address and Alice merges the newer key.
let bob_secret_key = load_self_secret_key(bob).await?;
let bob_public_key = secret_key_to_public_key(
bob,
bob_secret_key,
u32::try_from(time())? + 100,
"bob@example.net",
"bob@example.net,bob@relay2.example",
)?;
import_public_key(alice, &bob_public_key).await?;
let mimefactory = MimeFactory::from_mdn(alice, rcvd.from_id, rcvd.rfc724_mid, vec![]).await?;
let mut recipients = mimefactory.recipients();
recipients.sort();
assert_eq!(recipients, vec!["bob@example.net", "bob@relay2.example"]);
Ok(())
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)] #[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn test_mdn_autocrypt_throttle() -> Result<()> { async fn test_mdn_autocrypt_throttle() -> Result<()> {
async fn mdn_has_aheader( async fn mdn_has_aheader(
+5 -4
View File
@@ -596,13 +596,14 @@ async fn send_mdn_rfc724_mid(
) )
.await?; .await?;
let encrypted = mimefactory.will_be_encrypted(); let encrypted = mimefactory.will_be_encrypted();
let mut recipients = if contact_id == ContactId::SELF {
Vec::new()
} else {
mimefactory.recipients()
};
let rendered_msg = Box::pin(mimefactory.render(context)).await?; let rendered_msg = Box::pin(mimefactory.render(context)).await?;
let body = rendered_msg.message; let body = rendered_msg.message;
let mut recipients = Vec::new();
if contact_id != ContactId::SELF {
recipients.push(contact.get_addr().to_string());
}
if context.get_config_bool(Config::BccSelf).await? { if context.get_config_bool(Config::BccSelf).await? {
add_self_recipients(context, &mut recipients, encrypted).await?; add_self_recipients(context, &mut recipients, encrypted).await?;
} }