use std::time::Duration;
use openmoat_core::{Decision, Verdict};
use super::{Proxy, Turn};
use crate::decide;
use crate::request::Request;
use crate::session::RULE_SESSION;
impl Proxy<'_> {
pub(super) fn tainted(
&self,
turn: Turn<'_>,
request: &Request,
max_age: Option<Duration>,
) -> Option<Decision> {
let (Some(sessions), Some(session)) = (self.sessions, turn.session) else {
return None;
};
let taint = match max_age {
Some(age) => sessions.taint_within(session, age),
None => sessions.taint(session),
};
match taint {
Ok(taint) => decide::tainted(self.policy, request.host(), request.port(), &taint),
Err(why) => Some(Decision::single(
Verdict::Deny,
RULE_SESSION,
format!("the session's history cannot be read, so its taint is unknown: {why}"),
)),
}
}
pub(super) fn still_untainted(&self, turn: Turn<'_>, request: &Request) -> bool {
let Some(mut refusal) = self.tainted(turn, request, Some(self.limits.taint_recheck)) else {
return true;
};
refusal.reasons.push(
"the connection was opened before the session's taint grew; it is closed".to_owned(),
);
self.record(turn, Some(request), &refusal);
false
}
}