#[tokio::test]
async fn cross_origin_get_is_not_rejected() {
let resp = app()
.oneshot(
Request::builder()
.uri("/")
.header(header::HOST, "example.com")
.header(header::ORIGIN, "http://attacker.example")
.body(Body::empty())
.unwrap(),
)
.await
.unwrap();
assert_eq!(resp.status(), StatusCode::OK);
}
struct EnvGuard {
name: &'static str,
previous: Option<std::ffi::OsString>,
}
impl EnvGuard {
fn set(name: &'static str, value: &str) -> Self {
let previous = std::env::var_os(name);
unsafe {
std::env::set_var(name, value);
}
Self { name, previous }
}
}
impl Drop for EnvGuard {
fn drop(&mut self) {
unsafe {
match self.previous.take() {
Some(value) => std::env::set_var(self.name, value),
None => std::env::remove_var(self.name),
}
}
}
}
#[test]
fn allowed_hosts_includes_loopback_defaults() {
let hosts = allowed_hosts();
assert!(hosts.iter().any(|host| host == "localhost"));
assert!(hosts.iter().any(|host| host == "127.0.0.1"));
assert!(hosts.iter().any(|host| host == "[::1]"));
}
#[test]
fn allowed_hosts_extends_from_env_var() {
let _guard = EnvGuard::set(
"MOADIM_ALLOWED_HOSTS",
"reverse-proxy.internal, other.host:8080",
);
let hosts = allowed_hosts();
assert!(hosts.iter().any(|host| host == "reverse-proxy.internal"));
assert!(hosts.iter().any(|host| host == "other.host:8080"));
}
#[test]
fn allowed_hosts_skips_port_suffixed_entries_when_bind_addr_has_no_port() {
let _guard = EnvGuard::set("MOADIM_BIND_ADDR", "0.0.0.0");
let hosts = allowed_hosts();
assert!(hosts.iter().any(|host| host == "0.0.0.0"));
assert!(!hosts.iter().any(|host| host.starts_with("localhost:")));
assert!(!hosts.iter().any(|host| host.starts_with("127.0.0.1:")));
assert!(!hosts.iter().any(|host| host.starts_with("[::1]:")));
}
#[test]
fn allowed_hosts_includes_port_suffixed_loopback_entries_when_bind_addr_has_port() {
let _guard = EnvGuard::set("MOADIM_BIND_ADDR", "127.0.0.1:5784");
let hosts = allowed_hosts();
assert!(hosts.iter().any(|host| host == "localhost:5784"));
assert!(hosts.iter().any(|host| host == "127.0.0.1:5784"));
assert!(hosts.iter().any(|host| host == "[::1]:5784"));
}