From 8fda600e7febefa238dbee10adfc20d3ddeed880 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Sun, 26 Jan 2025 14:13:56 +0100 Subject: [PATCH] Change how CalDAV/CardDAV services are initialised --- crates/caldav/src/lib.rs | 14 +++--- crates/carddav/src/lib.rs | 101 ++++++++++++++++++-------------------- src/app.rs | 30 +++++------ 3 files changed, 68 insertions(+), 77 deletions(-) diff --git a/crates/caldav/src/lib.rs b/crates/caldav/src/lib.rs index 56259e9..2a7f864 100644 --- a/crates/caldav/src/lib.rs +++ b/crates/caldav/src/lib.rs @@ -1,4 +1,4 @@ -use actix_web::dev::ServiceResponse; +use actix_web::dev::{HttpServiceFactory, ServiceResponse}; use actix_web::http::header::{HeaderName, HeaderValue}; use actix_web::http::{Method, StatusCode}; use actix_web::middleware::{ErrorHandlerResponse, ErrorHandlers}; @@ -24,21 +24,20 @@ mod subscription; pub use error::Error; -pub fn configure_dav< +pub fn caldav_service< AP: AuthenticationProvider, AS: AddressbookStore, C: CalendarStore, S: SubscriptionStore, >( - cfg: &mut web::ServiceConfig, auth_provider: Arc, store: Arc, addr_store: Arc, subscription_store: Arc, -) { +) -> impl HttpServiceFactory { let birthday_store = Arc::new(ContactBirthdayStore::new(addr_store)); - cfg.service( - web::scope("") + + web::scope("") .wrap(AuthenticationMiddleware::new(auth_provider)) .wrap( ErrorHandlers::new().handler(StatusCode::METHOD_NOT_ALLOWED, |res| { @@ -93,6 +92,5 @@ pub fn configure_dav< ) ) ), - ).service(subscription_resource::()), - ); + ).service(subscription_resource::()) } diff --git a/crates/carddav/src/lib.rs b/crates/carddav/src/lib.rs index 434225a..65c5381 100644 --- a/crates/carddav/src/lib.rs +++ b/crates/carddav/src/lib.rs @@ -1,5 +1,5 @@ use actix_web::{ - dev::ServiceResponse, + dev::{HttpServiceFactory, ServiceResponse}, http::{ header::{HeaderName, HeaderValue}, Method, StatusCode, @@ -25,60 +25,57 @@ pub mod addressbook; pub mod error; pub mod principal; -pub fn configure_dav( - cfg: &mut web::ServiceConfig, +pub fn carddav_service( auth_provider: Arc, store: Arc, subscription_store: Arc, -) { - cfg.service( - web::scope("") - .wrap(AuthenticationMiddleware::new(auth_provider)) - .wrap( - ErrorHandlers::new().handler(StatusCode::METHOD_NOT_ALLOWED, |res| { - Ok(ErrorHandlerResponse::Response( - if res.request().method() == Method::OPTIONS { - let response = HttpResponse::Ok() - .insert_header(( - HeaderName::from_static("dav"), - // https://datatracker.ietf.org/doc/html/rfc4918#section-18 - HeaderValue::from_static( - "1, 3, access-control, addressbook, extended-mkcol", - ), - )) - .finish(); - ServiceResponse::new(res.into_parts().0, response).map_into_right_body() - } else { - res.map_into_left_body() - }, - )) - }), - ) - .app_data(Data::from(store.clone())) - .app_data(Data::from(subscription_store)) - .service(RootResourceService::::default().actix_resource()) - .service( - web::scope("/user").service( - web::scope("/{principal}") - .service( - PrincipalResourceService::new(store.clone()) - .actix_resource() - .name(PrincipalResource::route_name()), - ) - .service( - web::scope("/{addressbook}") - .service( - AddressbookResourceService::::new(store.clone()) - .actix_resource(), - ) - .service( - web::scope("/{object}").service( - AddressObjectResourceService::::new(store.clone()) - .actix_resource(), - ), +) -> impl HttpServiceFactory { + web::scope("") + .wrap(AuthenticationMiddleware::new(auth_provider)) + .wrap( + ErrorHandlers::new().handler(StatusCode::METHOD_NOT_ALLOWED, |res| { + Ok(ErrorHandlerResponse::Response( + if res.request().method() == Method::OPTIONS { + let response = HttpResponse::Ok() + .insert_header(( + HeaderName::from_static("dav"), + // https://datatracker.ietf.org/doc/html/rfc4918#section-18 + HeaderValue::from_static( + "1, 3, access-control, addressbook, extended-mkcol", ), - ), - ), + )) + .finish(); + ServiceResponse::new(res.into_parts().0, response).map_into_right_body() + } else { + res.map_into_left_body() + }, + )) + }), + ) + .app_data(Data::from(store.clone())) + .app_data(Data::from(subscription_store)) + .service(RootResourceService::::default().actix_resource()) + .service( + web::scope("/user").service( + web::scope("/{principal}") + .service( + PrincipalResourceService::new(store.clone()) + .actix_resource() + .name(PrincipalResource::route_name()), + ) + .service( + web::scope("/{addressbook}") + .service( + AddressbookResourceService::::new(store.clone()) + .actix_resource(), + ) + .service( + web::scope("/{object}").service( + AddressObjectResourceService::::new(store.clone()) + .actix_resource(), + ), + ), + ), ), - ); + ) } diff --git a/src/app.rs b/src/app.rs index e1e5ec3..8a46f2e 100644 --- a/src/app.rs +++ b/src/app.rs @@ -2,6 +2,8 @@ use actix_web::body::MessageBody; use actix_web::dev::{ServiceFactory, ServiceRequest, ServiceResponse}; use actix_web::middleware::NormalizePath; use actix_web::{web, App}; +use rustical_caldav::caldav_service; +use rustical_carddav::carddav_service; use rustical_frontend::{configure_frontend, FrontendConfig}; use rustical_store::auth::AuthenticationProvider; use rustical_store::{AddressbookStore, CalendarStore, SubscriptionStore}; @@ -27,23 +29,17 @@ pub fn make_app( // .wrap(Logger::new("[%s] %r")) .wrap(TracingLogger::default()) .wrap(NormalizePath::trim()) - .service(web::scope("/caldav").configure(|cfg| { - rustical_caldav::configure_dav( - cfg, - auth_provider.clone(), - cal_store.clone(), - addr_store.clone(), - subscription_store.clone(), - ) - })) - .service(web::scope("/carddav").configure(|cfg| { - rustical_carddav::configure_dav( - cfg, - auth_provider.clone(), - addr_store.clone(), - subscription_store, - ) - })) + .service(web::scope("/caldav").service(caldav_service( + auth_provider.clone(), + cal_store.clone(), + addr_store.clone(), + subscription_store.clone(), + ))) + .service(web::scope("/carddav").service(carddav_service( + auth_provider.clone(), + addr_store.clone(), + subscription_store, + ))) .service( web::scope("/.well-known") .service(web::redirect("/caldav", "/caldav"))