diff --git a/crates/caldav/src/lib.rs b/crates/caldav/src/lib.rs index f008a9b..55898fb 100644 --- a/crates/caldav/src/lib.rs +++ b/crates/caldav/src/lib.rs @@ -1,7 +1,6 @@ use actix_web::http::Method; use actix_web::web::{self, Data}; use actix_web::{guard, HttpResponse, Responder}; -use error::Error; use resources::calendar::CalendarResource; use resources::event::EventResource; use resources::principal::PrincipalCalendarsResource; @@ -9,12 +8,12 @@ use resources::root::RootResource; use routes::propfind::route_propfind; use routes::{calendar, event}; use rustical_auth::CheckAuthentication; +use rustical_dav::error::Error; use rustical_store::calendar::CalendarStore; use std::str::FromStr; use std::sync::Arc; use tokio::sync::RwLock; -pub mod error; pub mod resources; pub mod routes; diff --git a/crates/caldav/src/resources/calendar.rs b/crates/caldav/src/resources/calendar.rs index 1d1a417..c5eac3e 100644 --- a/crates/caldav/src/resources/calendar.rs +++ b/crates/caldav/src/resources/calendar.rs @@ -2,6 +2,7 @@ use actix_web::{web::Data, HttpRequest}; use anyhow::{anyhow, Result}; use async_trait::async_trait; use rustical_auth::AuthInfo; +use rustical_dav::error::Error; use rustical_dav::{ resource::Resource, xml_snippets::{HrefElement, TextNode}, @@ -174,7 +175,7 @@ impl Resource for CalendarResource { _auth_info: AuthInfo, uri_components: Self::UriComponents, prefix: String, - ) -> Result { + ) -> Result { let cal_store = req .app_data::>>() .ok_or(anyhow!("no calendar store in app_data!"))? @@ -182,7 +183,13 @@ impl Resource for CalendarResource { .into_inner(); let (principal, cid) = uri_components; - let calendar = cal_store.read().await.get_calendar(&cid).await?; + // TODO: fix errors + let calendar = cal_store + .read() + .await + .get_calendar(&cid) + .await + .map_err(|_e| Error::NotFound)?; Ok(Self { cal_store, calendar, diff --git a/crates/caldav/src/resources/event.rs b/crates/caldav/src/resources/event.rs index fce4246..70f73bc 100644 --- a/crates/caldav/src/resources/event.rs +++ b/crates/caldav/src/resources/event.rs @@ -2,6 +2,7 @@ use actix_web::{web::Data, HttpRequest}; use anyhow::{anyhow, Result}; use async_trait::async_trait; use rustical_auth::AuthInfo; +use rustical_dav::error::Error; use rustical_dav::{resource::Resource, xml_snippets::TextNode}; use rustical_store::calendar::CalendarStore; use rustical_store::event::Event; @@ -53,7 +54,7 @@ impl Resource for EventResource { _auth_info: AuthInfo, uri_components: Self::UriComponents, _prefix: String, - ) -> Result { + ) -> Result { let (_principal, cid, uid) = uri_components; let cal_store = req diff --git a/crates/caldav/src/resources/principal.rs b/crates/caldav/src/resources/principal.rs index aa1569e..31a97bb 100644 --- a/crates/caldav/src/resources/principal.rs +++ b/crates/caldav/src/resources/principal.rs @@ -2,6 +2,7 @@ use actix_web::{web::Data, HttpRequest}; use anyhow::{anyhow, Result}; use async_trait::async_trait; use rustical_auth::AuthInfo; +use rustical_dav::error::Error; use rustical_dav::{resource::Resource, xml_snippets::HrefElement}; use rustical_store::calendar::CalendarStore; use serde::Serialize; @@ -88,7 +89,7 @@ impl Resource for PrincipalCalendarsResource { auth_info: AuthInfo, _uri_components: Self::UriComponents, prefix: String, - ) -> Result { + ) -> Result { let cal_store = req .app_data::>>() .ok_or(anyhow!("no calendar store in app_data!"))? diff --git a/crates/caldav/src/resources/root.rs b/crates/caldav/src/resources/root.rs index e1c20f6..35a3752 100644 --- a/crates/caldav/src/resources/root.rs +++ b/crates/caldav/src/resources/root.rs @@ -2,6 +2,7 @@ use actix_web::HttpRequest; use anyhow::Result; use async_trait::async_trait; use rustical_auth::AuthInfo; +use rustical_dav::error::Error; use rustical_dav::{resource::Resource, xml_snippets::HrefElement}; use serde::Serialize; use strum::{EnumProperty, EnumString, IntoStaticStr, VariantNames}; @@ -52,7 +53,7 @@ impl Resource for RootResource { auth_info: AuthInfo, _uri_components: Self::UriComponents, prefix: String, - ) -> Result { + ) -> Result { Ok(Self { prefix, principal: auth_info.user_id, diff --git a/crates/caldav/src/routes/propfind.rs b/crates/caldav/src/routes/propfind.rs index 371d97e..ee3933d 100644 --- a/crates/caldav/src/routes/propfind.rs +++ b/crates/caldav/src/routes/propfind.rs @@ -3,7 +3,7 @@ use actix_web::http::header::ContentType; use actix_web::http::StatusCode; use actix_web::web::{Data, Path}; use actix_web::{HttpRequest, HttpResponse}; -use anyhow::Result; +use anyhow::{anyhow, Result}; use rustical_auth::{AuthInfoExtractor, CheckAuthentication}; use rustical_dav::depth_extractor::Depth; use rustical_dav::namespace::Namespace; @@ -74,8 +74,9 @@ pub async fn route_propfind>, auth: AuthInfoExtractor, depth: Depth, -) -> Result { - let props = parse_propfind(&body)?; +) -> Result { + // TODO: fix errors + let props = parse_propfind(&body).map_err(|_e| anyhow!("propfing parsing error"))?; let auth_info = auth.inner; let resource = R::acquire_from_request( diff --git a/crates/dav/Cargo.toml b/crates/dav/Cargo.toml index 8c7825a..e8d5cee 100644 --- a/crates/dav/Cargo.toml +++ b/crates/dav/Cargo.toml @@ -14,3 +14,4 @@ rustical_auth = { path = "../auth/" } serde = { version = "1.0.197", features = ["derive"] } strum = "0.26" itertools = "0.12" +thiserror = "1.0" diff --git a/crates/caldav/src/error.rs b/crates/dav/src/error.rs similarity index 87% rename from crates/caldav/src/error.rs rename to crates/dav/src/error.rs index 5ef1f87..a27cb95 100644 --- a/crates/caldav/src/error.rs +++ b/crates/dav/src/error.rs @@ -1,7 +1,7 @@ use actix_web::{http::StatusCode, HttpResponse}; use thiserror::Error; -use crate::routes::propfind; +// use crate::routes::propfind; #[derive(Debug, Error)] pub enum Error { @@ -13,8 +13,8 @@ pub enum Error { Unauthorized, #[error("Internal server error :(")] InternalError, - #[error(transparent)] - PropfindError(#[from] propfind::Error), + // #[error(transparent)] + // PropfindError(#[from] propfind::Error), #[error("Internal server error")] Other(#[from] anyhow::Error), } @@ -27,7 +27,7 @@ impl actix_web::error::ResponseError for Error { Self::NotFound => StatusCode::NOT_FOUND, Self::BadRequest => StatusCode::BAD_REQUEST, Self::Unauthorized => StatusCode::UNAUTHORIZED, - Self::PropfindError(e) => e.status_code(), + // Self::PropfindError(e) => e.status_code(), } } diff --git a/crates/dav/src/lib.rs b/crates/dav/src/lib.rs index 374d1d1..7069710 100644 --- a/crates/dav/src/lib.rs +++ b/crates/dav/src/lib.rs @@ -1,4 +1,5 @@ pub mod depth_extractor; +pub mod error; pub mod namespace; pub mod resource; pub mod xml_snippets; diff --git a/crates/dav/src/resource.rs b/crates/dav/src/resource.rs index e6117d3..c9ac62a 100644 --- a/crates/dav/src/resource.rs +++ b/crates/dav/src/resource.rs @@ -1,3 +1,4 @@ +use crate::{error::Error, xml_snippets::TagList}; use actix_web::{http::StatusCode, HttpRequest}; use anyhow::{anyhow, Result}; use async_trait::async_trait; @@ -7,8 +8,6 @@ use serde::Serialize; use std::str::FromStr; use strum::{EnumProperty, VariantNames}; -use crate::xml_snippets::TagList; - // A resource is identified by a URI and has properties // A resource can also be a collection // A resource cannot be none, only Methods like PROPFIND, GET, REPORT, etc. can be exposed @@ -25,7 +24,7 @@ pub trait Resource: Sized { auth_info: AuthInfo, uri_components: Self::UriComponents, prefix: String, - ) -> Result; + ) -> Result; fn get_path(&self) -> &str; async fn get_members(&self) -> Result>;