use axum::http::{HeaderMap, StatusCode};
use crate::state::AppState;
pub fn extract_bearer(headers: &HeaderMap) -> Option<&str> {
headers
.get("authorization")
.and_then(|v| v.to_str().ok())
.and_then(brain::auth::extract_bearer_from_value)
}
pub async fn resolve_principal(
state: &AppState,
headers: &HeaderMap,
) -> Option<identity::Principal> {
let key = extract_bearer(headers)?;
let agent_id =
brain::auth::find_key_ct(&state.api_keys, key).and_then(|k| k.agent_id.clone())?;
let store = state.processor.identity_store()?;
store
.principal_for(&identity::AgentHint::AgentId(agent_id.into()))
.await
.ok()
}
pub fn check_auth(
state: &AppState,
headers: &HeaderMap,
permission: &str,
) -> Result<(), (StatusCode, String)> {
let provided_key = extract_bearer(headers);
let result = brain::check_auth(&state.api_keys, provided_key, permission);
if result.is_allowed() {
Ok(())
} else {
Err((
StatusCode::UNAUTHORIZED,
result
.error_message(permission)
.unwrap_or_else(|| "Unauthorized".to_string()),
))
}
}