Change how CalDAV/CardDAV services are initialised

This commit is contained in:
Lennart
2025-01-26 14:13:56 +01:00
parent 33b7f748b8
commit 8fda600e7f
3 changed files with 68 additions and 77 deletions

View File

@@ -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<AP: AuthenticationProvider, A: AddressbookStore, S: SubscriptionStore>(
cfg: &mut web::ServiceConfig,
pub fn carddav_service<AP: AuthenticationProvider, A: AddressbookStore, S: SubscriptionStore>(
auth_provider: Arc<AP>,
store: Arc<A>,
subscription_store: Arc<S>,
) {
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::<PrincipalResource>::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::<A, S>::new(store.clone())
.actix_resource(),
)
.service(
web::scope("/{object}").service(
AddressObjectResourceService::<A>::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::<PrincipalResource>::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::<A, S>::new(store.clone())
.actix_resource(),
)
.service(
web::scope("/{object}").service(
AddressObjectResourceService::<A>::new(store.clone())
.actix_resource(),
),
),
),
),
);
)
}