diff --git a/crates/dav/src/lib.rs b/crates/dav/src/lib.rs index db72c93..777c904 100644 --- a/crates/dav/src/lib.rs +++ b/crates/dav/src/lib.rs @@ -25,8 +25,10 @@ pub fn configure_well_known(cfg: &mut web::ServiceConfig, caldav_root: String) { } pub fn configure_dav( +pub fn configure_dav( cfg: &mut web::ServiceConfig, prefix: String, + auth: Arc, store: Arc>, ) { let propfind_method = || Method::from_str("PROPFIND").unwrap(); diff --git a/src/config.rs b/src/config.rs index 0618642..4be5f85 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,3 +1,4 @@ +use rustical_auth::{AuthProvider, HtpasswdAuthConfig}; use serde::{Deserialize, Serialize}; #[derive(Debug, Deserialize, Serialize)] @@ -11,7 +12,26 @@ pub enum CalendarStoreConfig { Toml(TomlCalendarStoreConfig), } +#[derive(Debug, Deserialize, Serialize)] +#[serde(tag = "backend", rename_all = "snake_case")] +pub enum AuthConfig { + Htpasswd(HtpasswdAuthConfig), + None, +} + +impl From for AuthProvider { + fn from(value: AuthConfig) -> Self { + match value { + AuthConfig::Htpasswd(config) => { + Self::Htpasswd(rustical_auth::htpasswd::HtpasswdAuth { config }) + } + AuthConfig::None => Self::None(rustical_auth::none::NoneAuth), + } + } +} + #[derive(Debug, Deserialize, Serialize)] pub struct Config { pub calendar_store: CalendarStoreConfig, + pub auth: AuthConfig, } diff --git a/src/main.rs b/src/main.rs index c6d0935..1c3f9aa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,3 @@ -use std::fs; -use std::sync::Arc; - use crate::config::Config; use actix_web::middleware::{Logger, NormalizePath}; use actix_web::{web, App, HttpServer}; @@ -8,9 +5,12 @@ use anyhow::Result; use clap::Parser; use config::{CalendarStoreConfig, TomlCalendarStoreConfig}; use rustical_api::configure_api; +use rustical_auth::AuthProvider; use rustical_dav::{configure_dav, configure_well_known}; use rustical_frontend::configure_frontend; use rustical_store::calendar::TomlCalendarStore; +use std::fs; +use std::sync::Arc; use tokio::sync::RwLock; mod config; @@ -38,20 +38,16 @@ async fn main() -> Result<()> { } })); - let auth = match config.auth { - config::AuthConfig::Htpasswd(config) => 1, - _ => panic!("invalid auth config"), - }; + let auth: Arc = Arc::new(config.auth.into()); HttpServer::new(move || { let cal_store = cal_store.clone(); App::new() .wrap(Logger::new("[%s] %r")) .wrap(NormalizePath::trim()) - .service( - web::scope("/caldav") - .configure(|cfg| configure_dav(cfg, "/caldav".to_string(), cal_store.clone())), - ) + .service(web::scope("/caldav").configure(|cfg| { + configure_dav(cfg, "/caldav".to_string(), auth.clone(), cal_store.clone()) + })) .service( web::scope("/.well-known") .configure(|cfg| configure_well_known(cfg, "/caldav".to_string())),