Fix MTA: queue_name variable not available in rate limiter expressions

This commit is contained in:
Maurus Decimus
2026-07-19 23:09:31 +02:00
parent 2d08933fbc
commit 3cc348726b
4 changed files with 142 additions and 2 deletions

View File

@@ -185,7 +185,7 @@ impl QueuedMessage {
// Throttle sender
for throttle in &server.core.smtp.queue.outbound_limiters.sender {
if let Err(retry_at) = server
.is_allowed(throttle, &message.message, message.span_id)
.is_allowed(throttle, &message, message.span_id)
.await
{
trc::event!(

View File

@@ -379,6 +379,53 @@ impl ResolveVariable for Message {
}
}
impl ResolveVariable for MessageWrapper {
fn resolve_variable(&self, variable: ExpressionVariable) -> expr::Variable<'_> {
match variable {
ExpressionVariable::Sender => self.message.return_path.as_ref().into(),
ExpressionVariable::SenderDomain => self.message.return_path.domain_part().into(),
ExpressionVariable::Recipients => self
.message
.recipients
.iter()
.map(|r| Variable::from(r.address.as_ref()))
.collect::<Vec<_>>()
.into(),
ExpressionVariable::Priority => self.message.priority.into(),
ExpressionVariable::QueueName => self.queue_name.as_str().into(),
ExpressionVariable::QueueAge => {
now().saturating_sub(self.message.created).into()
}
ExpressionVariable::Source => if (self.message.flags & FROM_AUTHENTICATED) != 0 {
"authenticated"
} else if (self.message.flags & FROM_UNAUTHENTICATED_DMARC) != 0 {
"dmarc_pass"
} else if (self.message.flags & FROM_UNAUTHENTICATED) != 0 {
"unauthenticated"
} else if (self.message.flags & FROM_DSN) != 0 {
"dsn"
} else if (self.message.flags & FROM_REPORT) != 0 {
"report"
} else if (self.message.flags & FROM_AUTOGENERATED) != 0 {
"autogenerated"
} else {
"unknown"
}
.into(),
ExpressionVariable::ReceivedFromIp => {
self.message.received_from_ip.to_compact_string().into()
}
ExpressionVariable::ReceivedViaPort => self.message.received_via_port.into(),
ExpressionVariable::Size => self.message.size.into(),
_ => "".into(),
}
}
fn resolve_global(&self, _: &str) -> Variable<'_> {
Variable::Integer(0)
}
}
pub struct RecipientDomain<'x>(&'x str);
impl<'x> RecipientDomain<'x> {