use std::net::SocketAddr;
pub(super) fn is_allowed(
origin: Option<&str>,
allowed: &[String],
served_from: Option<SocketAddr>,
) -> bool {
let Some(origin) = origin else {
return true;
};
if allowed.iter().any(|listed| listed == origin) {
return true;
}
served_from.is_some_and(|address| {
origin == format!("http://{address}") || origin == format!("https://{address}")
})
}
#[cfg(test)]
#[allow(
clippy::expect_used,
reason = "panicking is how a unit test reports a failure"
)]
mod tests {
use super::is_allowed;
fn address() -> std::net::SocketAddr {
"127.0.0.1:50751".parse().expect("a literal address")
}
#[test]
fn an_absent_origin_is_served() {
assert!(is_allowed(None, &[], None));
}
#[test]
fn an_unlisted_origin_is_refused() {
assert!(!is_allowed(Some("http://evil.example"), &[], None));
}
#[test]
fn a_listed_origin_is_served() {
let allowed = vec!["http://panel.example".to_owned()];
assert!(is_allowed(Some("http://panel.example"), &allowed, None));
}
#[test]
fn matching_is_exact_rather_than_a_prefix() {
let allowed = vec!["http://panel.example".to_owned()];
for lookalike in [
"http://panel.example.evil.test",
"http://panel.example:8080",
"https://panel.example",
"http://not-panel.example",
] {
assert!(!is_allowed(Some(lookalike), &allowed, None), "{lookalike}");
}
}
#[test]
fn the_host_trusts_the_origin_it_serves_its_own_page_from() {
assert!(is_allowed(
Some("http://127.0.0.1:50751"),
&[],
Some(address())
));
assert!(is_allowed(
Some("https://127.0.0.1:50751"),
&[],
Some(address())
));
}
#[test]
fn without_a_page_the_hosts_own_address_earns_nothing() {
assert!(!is_allowed(Some("http://127.0.0.1:50751"), &[], None));
}
#[test]
fn a_different_port_on_the_same_host_is_a_different_origin() {
assert!(!is_allowed(
Some("http://127.0.0.1:50752"),
&[],
Some(address())
));
}
}