From 628d5520f61e1a54283c277e5bf75cc62ad5c36d Mon Sep 17 00:00:00 2001 From: Maurus Decimus <11444311+mdecimus@users.noreply.github.com> Date: Tue, 19 May 2026 18:01:54 +0200 Subject: [PATCH] Fix LDAP: Synchronize accounts when expanding mailing list recipients --- CHANGELOG.md | 1 + crates/smtp/src/inbound/rcpt.rs | 23 +++++++++++++++++++++++ tests/src/system/tenant.rs | 2 ++ 3 files changed, 26 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1eac5b08..a2e3405f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -84,6 +84,7 @@ If you are upgrading from v0.16.x, replace the binary (or run `docker pull`). If - ACME: Update `defaultCertificateId` when renewing a certificate that is currently set as default. - Allow internal TLDs in e-mail addresses. - Websocket: Perform case insensitive matching during upgrade. +- LDAP: Synchronize accounts when expanding mailing list recipients. ## [0.16.5] - 2026-05-11 diff --git a/crates/smtp/src/inbound/rcpt.rs b/crates/smtp/src/inbound/rcpt.rs index 850ed5ed..75778e52 100644 --- a/crates/smtp/src/inbound/rcpt.rs +++ b/crates/smtp/src/inbound/rcpt.rs @@ -359,6 +359,29 @@ impl Session { if !self.data.rcpt_to.contains(&member_addr) && member_addr.address_lcase != list_addr.address_lcase { + // Force external directory synchronization + if let Ok(Some(member_domain)) = self.server.domain(&member_addr.domain).await + && self + .server + .get_directory_for_cached_domain(&member_domain) + .is_some_and(|directory| directory.can_lookup_recipients()) + && matches!( + self.server + .account_id_from_email(&member_addr.address_lcase, false) + .await, + Ok(None) + ) + && let Err(err) = self + .server + .rcpt_resolve(&member_addr.address_lcase, self.data.session_id) + .await + { + trc::error!( + err.span_id(self.data.session_id) + .caused_by(trc::location!()) + ); + } + member_addr.dsn_info = orcpt.clone().into(); member_addr.flags = list_addr.flags; self.data.rcpt_to.push(member_addr); diff --git a/tests/src/system/tenant.rs b/tests/src/system/tenant.rs index 70c261d6..7a87ee8c 100644 --- a/tests/src/system/tenant.rs +++ b/tests/src/system/tenant.rs @@ -529,6 +529,7 @@ pub async fn test(test: &mut TestServer) { sender_authenticated: true, recipients: vec![IngestRecipient { address: "user@tenantx.org".to_string(), + orcpt: None, is_spam: false }], message_blob: message_blob.clone(), @@ -565,6 +566,7 @@ pub async fn test(test: &mut TestServer) { sender_authenticated: true, recipients: vec![IngestRecipient { address: "user@tenantx.org".to_string(), + orcpt: None, is_spam: false }], message_blob,