Fix MTA: queue_name variable not available in rate limiter expressions
This commit is contained in:
@@ -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!(
|
||||
|
||||
@@ -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> {
|
||||
|
||||
Reference in New Issue
Block a user