SMTP: MTA hook only runs if sieve script, milter or rewrite is configured (fixes #2317)

This commit is contained in:
mdecimus
2025-11-02 19:20:54 +01:00
parent c088110da1
commit 14bce0a346

View File

@@ -88,13 +88,10 @@ impl<T: SessionStream> Session<T> {
self.data.rcpt_to.push(rcpt); self.data.rcpt_to.push(rcpt);
// Address rewriting and Sieve filtering // Address rewriting and Sieve filtering
let rcpt_config = &self.server.core.smtp.session.rcpt;
let rcpt_script = self let rcpt_script = self
.server .server
.eval_if::<String, _>( .eval_if::<String, _>(&rcpt_config.script, self, self.data.session_id)
&self.server.core.smtp.session.rcpt.script,
self,
self.data.session_id,
)
.await .await
.and_then(|name| { .and_then(|name| {
self.server self.server
@@ -102,16 +99,17 @@ impl<T: SessionStream> Session<T> {
.map(|s| (s.clone(), name)) .map(|s| (s.clone(), name))
}); });
let session_config = &self.server.core.smtp.session;
if rcpt_script.is_some() if rcpt_script.is_some()
|| !self.server.core.smtp.session.rcpt.rewrite.is_empty() || !rcpt_config.rewrite.is_empty()
|| self || session_config
.server
.core
.smtp
.session
.milters .milters
.iter() .iter()
.any(|m| m.run_on_stage.contains(&Stage::Rcpt)) .any(|m| m.run_on_stage.contains(&Stage::Rcpt))
|| session_config
.hooks
.iter()
.any(|h| h.run_on_stage.contains(&Stage::Rcpt))
{ {
// Sieve filtering // Sieve filtering
if let Some((script, script_id)) = rcpt_script { if let Some((script, script_id)) = rcpt_script {
@@ -157,11 +155,7 @@ impl<T: SessionStream> Session<T> {
// Address rewriting // Address rewriting
if let Some(new_address) = self if let Some(new_address) = self
.server .server
.eval_if::<String, _>( .eval_if::<String, _>(&rcpt_config.rewrite, self, self.data.session_id)
&self.server.core.smtp.session.rcpt.rewrite,
self,
self.data.session_id,
)
.await .await
{ {
let rcpt = self.data.rcpt_to.last_mut().unwrap(); let rcpt = self.data.rcpt_to.last_mut().unwrap();
@@ -199,11 +193,7 @@ impl<T: SessionStream> Session<T> {
let mut rcpt_members = None; let mut rcpt_members = None;
if let Some(directory) = self if let Some(directory) = self
.server .server
.eval_if::<String, _>( .eval_if::<String, _>(&rcpt_config.directory, self, self.data.session_id)
&self.server.core.smtp.session.rcpt.directory,
self,
self.data.session_id,
)
.await .await
.and_then(|name| self.server.get_directory(&name)) .and_then(|name| self.server.get_directory(&name))
{ {
@@ -247,11 +237,7 @@ impl<T: SessionStream> Session<T> {
Ok(false) => { Ok(false) => {
if !self if !self
.server .server
.eval_if( .eval_if(&rcpt_config.relay, self, self.data.session_id)
&self.server.core.smtp.session.rcpt.relay,
self,
self.data.session_id,
)
.await .await
.unwrap_or(false) .unwrap_or(false)
{ {
@@ -282,11 +268,7 @@ impl<T: SessionStream> Session<T> {
} }
} else if !self } else if !self
.server .server
.eval_if( .eval_if(&rcpt_config.relay, self, self.data.session_id)
&self.server.core.smtp.session.rcpt.relay,
self,
self.data.session_id,
)
.await .await
.unwrap_or(false) .unwrap_or(false)
{ {