use axum::extract::Request;
use axum::middleware::Next;
use axum::response::Response;
use dravr_tronc::server::auth;
pub use dravr_tronc::server::auth::{AuthMode, InsecureBindError};
const API_KEY_ENV: &str = "EMBACLE_API_KEY";
pub async fn require_auth(request: Request, next: Next) -> Response {
auth::require_auth(API_KEY_ENV, request, next).await
}
#[must_use]
pub fn api_key_configured() -> bool {
auth::api_key_configured(API_KEY_ENV)
}
pub fn resolve_startup_auth(host: &str, gated: bool) -> Result<AuthMode, InsecureBindError> {
auth::resolve_startup_auth(host, gated)
}
#[cfg(test)]
mod tests {
use super::*;
use std::env;
#[test]
fn the_key_variable_is_embacles_own() {
assert_eq!(API_KEY_ENV, "EMBACLE_API_KEY");
}
#[test]
fn a_reachable_bind_with_nothing_gating_it_is_still_refused() {
env::remove_var(API_KEY_ENV);
assert!(!api_key_configured());
let err = resolve_startup_auth("0.0.0.0", api_key_configured())
.expect_err("a reachable bind with no key must be refused"); assert_eq!(err.host, "0.0.0.0");
assert_eq!(
resolve_startup_auth("127.0.0.1", api_key_configured()),
Ok(AuthMode::LoopbackDev),
"loopback without a key is development, not a refusal"
);
env::set_var(API_KEY_ENV, "k");
assert!(api_key_configured());
assert_eq!(
resolve_startup_auth("0.0.0.0", api_key_configured()),
Ok(AuthMode::Enforced),
"a key enforces on every host"
);
env::remove_var(API_KEY_ENV);
}
}