use axum::http::{StatusCode, HeaderValue}; use axum::http::header::ToStrError; use tracing::{debug, error, trace}; use crate::auth::Error::{MissingSecret, WrongSecret}; use crate::config::Config; pub fn auth(config: &Config, secret: Option<&HeaderValue>) -> Result { debug!("auth request with secret {:?}", secret); if let Some(value) = secret { trace!("value exists"); let key = &config.apikey; if value.to_str()? == key.as_str() { debug!("successful auth"); Ok(true) } else { debug!("unsuccessful auth (wrong secret)"); Err(WrongSecret) } } else { debug!("unsuccessful auth (no secret)"); Err(MissingSecret) } } #[derive(Debug, thiserror::Error)] pub enum Error { #[error("wrong secret")] WrongSecret, #[error("missing secret")] MissingSecret, #[error("parse error: {source}")] HeaderToStr { #[from] source: ToStrError } } impl Error { pub fn get(self) -> (StatusCode, &'static str) { match self { Self::WrongSecret => (StatusCode::UNAUTHORIZED, "Wrong credentials"), Self::MissingSecret => (StatusCode::BAD_REQUEST, "Missing credentials"), Self::HeaderToStr { source } => { error!("auth: {}", source); (StatusCode::INTERNAL_SERVER_ERROR, "Server Error") }, } } }