diff options
author | metamuffin <metamuffin@disroot.org> | 2024-05-29 23:44:14 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-05-29 23:44:14 +0200 |
commit | 29c48afafb4a6a0a0636774f9b56423881fb1703 (patch) | |
tree | fa610555a33c25a1aaeb98242099c2010ac243b0 /src/filters/auth.rs | |
parent | 886a18e0c67624d0882f04c7f6659bcfee6b4d8d (diff) | |
download | gnix-29c48afafb4a6a0a0636774f9b56423881fb1703.tar gnix-29c48afafb4a6a0a0636774f9b56423881fb1703.tar.bz2 gnix-29c48afafb4a6a0a0636774f9b56423881fb1703.tar.zst |
implement cookie base auth.
Diffstat (limited to 'src/filters/auth.rs')
-rw-r--r-- | src/filters/auth.rs | 65 |
1 files changed, 0 insertions, 65 deletions
diff --git a/src/filters/auth.rs b/src/filters/auth.rs deleted file mode 100644 index 7d5b03e..0000000 --- a/src/filters/auth.rs +++ /dev/null @@ -1,65 +0,0 @@ -use super::{Node, NodeKind, NodeRequest, NodeResponse}; -use crate::{config::DynNode, error::ServiceError}; -use base64::Engine; -use futures::Future; -use http_body_util::{combinators::BoxBody, BodyExt}; -use hyper::{ - header::{HeaderValue, AUTHORIZATION, WWW_AUTHENTICATE}, - Response, StatusCode, -}; -use log::debug; -use serde::Deserialize; -use serde_yaml::Value; -use std::{collections::HashSet, pin::Pin, sync::Arc}; - -pub struct HttpBasicAuthKind; -impl NodeKind for HttpBasicAuthKind { - fn name(&self) -> &'static str { - "http_basic_auth" - } - fn instanciate(&self, config: Value) -> anyhow::Result<Arc<dyn super::Node>> { - Ok(Arc::new(serde_yaml::from_value::<HttpBasicAuth>(config)?)) - } -} - -#[derive(Deserialize)] -pub struct HttpBasicAuth { - realm: String, - valid: HashSet<String>, - next: DynNode, -} - -impl Node for HttpBasicAuth { - fn handle<'a>( - &'a self, - context: &'a mut super::NodeContext, - request: NodeRequest, - ) -> Pin<Box<dyn Future<Output = Result<NodeResponse, ServiceError>> + Send + Sync + 'a>> { - Box::pin(async move { - if let Some(auth) = request.headers().get(AUTHORIZATION) { - let k = auth - .as_bytes() - .strip_prefix(b"Basic ") - .ok_or(ServiceError::BadAuth)?; - let k = base64::engine::general_purpose::STANDARD.decode(k)?; - let k = String::from_utf8(k)?; - if self.valid.contains(&k) { - debug!("valid auth"); - return self.next.handle(context, request).await; - } else { - debug!("invalid auth"); - } - } - debug!("unauthorized; sending auth challenge"); - let mut r = Response::new(BoxBody::<_, ServiceError>::new( - String::new().map_err(|_| unreachable!()), - )); - *r.status_mut() = StatusCode::UNAUTHORIZED; - r.headers_mut().insert( - WWW_AUTHENTICATE, - HeaderValue::from_str(&format!("Basic realm=\"{}\"", self.realm)).unwrap(), - ); - Ok(r) - }) - } -} |