summaryrefslogtreecommitdiff
path: root/crates/smtp/src/inbound/milter/message.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/smtp/src/inbound/milter/message.rs')
-rw-r--r--crates/smtp/src/inbound/milter/message.rs90
1 files changed, 64 insertions, 26 deletions
diff --git a/crates/smtp/src/inbound/milter/message.rs b/crates/smtp/src/inbound/milter/message.rs
index 51bd28d4..d9676a86 100644
--- a/crates/smtp/src/inbound/milter/message.rs
+++ b/crates/smtp/src/inbound/milter/message.rs
@@ -14,6 +14,7 @@ use common::{
use mail_auth::AuthenticatedMessage;
use smtp_proto::{request::parser::Rfc5321Parser, IntoString};
use tokio::io::{AsyncRead, AsyncWrite};
+use trc::MilterEvent;
use crate::{
core::{Session, SessionAddress, SessionData},
@@ -54,6 +55,16 @@ impl<T: SessionStream> Session<T> {
match self.connect_and_run(milter, message).await {
Ok(new_modifications) => {
+ trc::event!(
+ Milter(MilterEvent::ActionAccept),
+ SessionId = self.data.session_id,
+ Id = milter.id.to_string(),
+ Contents = new_modifications
+ .iter()
+ .map(|m| m.to_string())
+ .collect::<Vec<_>>(),
+ );
+
if !modifications.is_empty() {
// The message body can only be replaced once, so we need to remove
// any previous replacements.
@@ -70,14 +81,21 @@ impl<T: SessionStream> Session<T> {
}
}
Err(Rejection::Action(action)) => {
- tracing::info!(
-
- milter.host = &milter.hostname,
- milter.port = &milter.port,
- context = "milter",
- event = "reject",
- action = ?action,
- "Milter rejected message.");
+ trc::event!(
+ Milter(match &action {
+ Action::Discard => MilterEvent::ActionDiscard,
+ Action::Reject => MilterEvent::ActionReject,
+ Action::TempFail => MilterEvent::ActionTempFail,
+ Action::ReplyCode { .. } => {
+ MilterEvent::ActionReplyCode
+ }
+ Action::Shutdown => MilterEvent::ActionShutdown,
+ Action::ConnectionFailure => MilterEvent::ActionConnectionFailure,
+ Action::Accept | Action::Continue => unreachable!(),
+ }),
+ SessionId = self.data.session_id,
+ Id = milter.id.to_string(),
+ );
return Err(match action {
Action::Discard => FilterResponse::accept(),
@@ -102,14 +120,32 @@ impl<T: SessionStream> Session<T> {
});
}
Err(Rejection::Error(err)) => {
- tracing::warn!(
-
- milter.host = &milter.hostname,
- milter.port = &milter.port,
- context = "milter",
- event = "error",
- reason = ?err,
- "Milter filter failed");
+ let (code, details) = match err {
+ Error::Io(details) => {
+ (MilterEvent::IoError, trc::Value::from(details.to_string()))
+ }
+ Error::FrameTooLarge(size) => {
+ (MilterEvent::FrameTooLarge, trc::Value::from(size))
+ }
+ Error::FrameInvalid(bytes) => {
+ (MilterEvent::FrameInvalid, trc::Value::from(bytes))
+ }
+ Error::Unexpected(response) => (
+ MilterEvent::UnexpectedResponse,
+ trc::Value::from(response.to_string()),
+ ),
+ Error::Timeout => (MilterEvent::Timeout, trc::Value::None),
+ Error::TLSInvalidName => (MilterEvent::TlsInvalidName, trc::Value::None),
+ Error::Disconnected => (MilterEvent::Disconnected, trc::Value::None),
+ };
+
+ trc::event!(
+ Milter(code),
+ SessionId = self.data.session_id,
+ Id = milter.id.to_string(),
+ Details = details,
+ );
+
if milter.tempfail_on_error {
return Err(FilterResponse::server_failure());
}
@@ -282,11 +318,12 @@ impl SessionData {
mail_from.dsn_info = addr.env_id;
}
Err(err) => {
- tracing::debug!(
- context = "milter",
- event = "error",
- reason = ?err,
- "Failed to parse milter mailFrom parameters.");
+ trc::event!(
+ Milter(MilterEvent::ParseError),
+ SessionId = self.session_id,
+ Details = "Failed to parse milter mailFrom parameters",
+ Reason = err.to_string(),
+ );
}
}
}
@@ -317,11 +354,12 @@ impl SessionData {
rcpt.dsn_info = addr.orcpt;
}
Err(err) => {
- tracing::debug!(
- context = "milter",
- event = "error",
- reason = ?err,
- "Failed to parse milter rcptTo parameters.");
+ trc::event!(
+ Milter(MilterEvent::ParseError),
+ SessionId = self.session_id,
+ Details = "Failed to parse milter rcptTo parameters",
+ Reason = err.to_string(),
+ );
}
}
}