work on errors

This commit is contained in:
Lennart
2024-03-15 21:29:21 +01:00
parent ebf826f5b0
commit 1221a3cba1
10 changed files with 28 additions and 17 deletions

View File

@@ -1,42 +0,0 @@
use actix_web::{http::StatusCode, HttpResponse};
use thiserror::Error;
use crate::routes::propfind;
#[derive(Debug, Error)]
pub enum Error {
#[error("Not found")]
NotFound,
#[error("Bad request")]
BadRequest,
#[error("Unauthorized")]
Unauthorized,
#[error("Internal server error :(")]
InternalError,
#[error(transparent)]
PropfindError(#[from] propfind::Error),
#[error("Internal server error")]
Other(#[from] anyhow::Error),
}
impl actix_web::error::ResponseError for Error {
fn status_code(&self) -> StatusCode {
match self {
Self::InternalError => StatusCode::INTERNAL_SERVER_ERROR,
Self::Other(_) => StatusCode::INTERNAL_SERVER_ERROR,
Self::NotFound => StatusCode::NOT_FOUND,
Self::BadRequest => StatusCode::BAD_REQUEST,
Self::Unauthorized => StatusCode::UNAUTHORIZED,
Self::PropfindError(e) => e.status_code(),
}
}
fn error_response(&self) -> HttpResponse {
match self {
Error::Unauthorized => HttpResponse::build(self.status_code())
.append_header(("WWW-Authenticate", "Basic"))
.body(self.to_string()),
_ => HttpResponse::build(self.status_code()).body(self.to_string()),
}
}
}

View File

@@ -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;

View File

@@ -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<C: CalendarStore + ?Sized> Resource for CalendarResource<C> {
_auth_info: AuthInfo,
uri_components: Self::UriComponents,
prefix: String,
) -> Result<Self> {
) -> Result<Self, Error> {
let cal_store = req
.app_data::<Data<RwLock<C>>>()
.ok_or(anyhow!("no calendar store in app_data!"))?
@@ -182,7 +183,13 @@ impl<C: CalendarStore + ?Sized> Resource for CalendarResource<C> {
.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,

View File

@@ -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<C: CalendarStore + ?Sized> Resource for EventResource<C> {
_auth_info: AuthInfo,
uri_components: Self::UriComponents,
_prefix: String,
) -> Result<Self> {
) -> Result<Self, Error> {
let (_principal, cid, uid) = uri_components;
let cal_store = req

View File

@@ -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<C: CalendarStore + ?Sized> Resource for PrincipalCalendarsResource<C> {
auth_info: AuthInfo,
_uri_components: Self::UriComponents,
prefix: String,
) -> Result<Self> {
) -> Result<Self, Error> {
let cal_store = req
.app_data::<Data<RwLock<C>>>()
.ok_or(anyhow!("no calendar store in app_data!"))?

View File

@@ -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<Self> {
) -> Result<Self, Error> {
Ok(Self {
prefix,
principal: auth_info.user_id,

View File

@@ -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<A: CheckAuthentication, R: Resource, C: CalendarStor
context: Data<CalDavContext<C>>,
auth: AuthInfoExtractor<A>,
depth: Depth,
) -> Result<HttpResponse, Error> {
let props = parse_propfind(&body)?;
) -> Result<HttpResponse, rustical_dav::error::Error> {
// 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(