From 8d9dba364dff0950736ab89a9aae562f1e211c5c Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Sat, 27 Jul 2024 12:36:18 +0200 Subject: [PATCH] Implement supported-report-set property for calendar collection --- README.md | 2 ++ crates/caldav/src/calendar/prop.rs | 38 ++++++++++++++++++++++++++ crates/caldav/src/calendar/resource.rs | 9 +++++- 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8c12326..f5996a3 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,8 @@ a calendar server ## Relevant RFCs +- Versioning Extensions to WebDAV: [RFC 3253](https://datatracker.ietf.org/doc/html/rfc3253) + - provides the REPORT method - Calendaring Extensions to WebDAV (CalDAV): [RFC 4791](https://datatracker.ietf.org/doc/html/rfc4791) - Scheduling Extensions to CalDAV: [RFC 6638](https://datatracker.ietf.org/doc/html/rfc6638) - not sure yet whether to implement this diff --git a/crates/caldav/src/calendar/prop.rs b/crates/caldav/src/calendar/prop.rs index 954eaf0..67ab422 100644 --- a/crates/caldav/src/calendar/prop.rs +++ b/crates/caldav/src/calendar/prop.rs @@ -95,3 +95,41 @@ impl Default for UserPrivilegeSet { } } } + +#[derive(Debug, Clone, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub enum ReportMethod { + CalendarQuery, + CalendarMultiget, + // SyncCollection, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct SupportedReport { + report: ReportMethod, +} + +impl From for SupportedReport { + fn from(value: ReportMethod) -> Self { + Self { report: value } + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct SupportedReportSet { + supported_report: Vec, +} + +impl Default for SupportedReportSet { + fn default() -> Self { + Self { + supported_report: vec![ + ReportMethod::CalendarQuery.into(), + ReportMethod::CalendarMultiget.into(), + // ReportMethod::SyncCollection.into(), + ], + } + } +} diff --git a/crates/caldav/src/calendar/resource.rs b/crates/caldav/src/calendar/resource.rs index edae9fc..802d276 100644 --- a/crates/caldav/src/calendar/resource.rs +++ b/crates/caldav/src/calendar/resource.rs @@ -15,7 +15,7 @@ use tokio::sync::RwLock; use super::prop::{ Resourcetype, SupportedCalendarComponent, SupportedCalendarComponentSet, SupportedCalendarData, - UserPrivilegeSet, + SupportedReportSet, UserPrivilegeSet, }; pub struct CalendarResource { @@ -41,6 +41,7 @@ pub enum CalendarPropName { Getcontenttype, CurrentUserPrivilegeSet, MaxResourceSize, + SupportedReportSet, } #[derive(Debug, Clone, Deserialize, Serialize)] @@ -71,6 +72,7 @@ pub enum CalendarProp { Getcontenttype(String), MaxResourceSize(String), CurrentUserPrivilegeSet(UserPrivilegeSet), + SupportedReportSet(SupportedReportSet), #[serde(other)] Invalid, } @@ -138,6 +140,9 @@ impl Resource for CalendarFile { CalendarPropName::CurrentUserPrivilegeSet => Ok(CalendarProp::CurrentUserPrivilegeSet( UserPrivilegeSet::default(), )), + CalendarPropName::SupportedReportSet => Ok(CalendarProp::SupportedReportSet( + SupportedReportSet::default(), + )), } } @@ -176,6 +181,7 @@ impl Resource for CalendarFile { CalendarProp::Getcontenttype(_) => Err(rustical_dav::Error::PropReadOnly), CalendarProp::MaxResourceSize(_) => Err(rustical_dav::Error::PropReadOnly), CalendarProp::CurrentUserPrivilegeSet(_) => Err(rustical_dav::Error::PropReadOnly), + CalendarProp::SupportedReportSet(_) => Err(rustical_dav::Error::PropReadOnly), CalendarProp::Invalid => Err(rustical_dav::Error::PropReadOnly), } } @@ -212,6 +218,7 @@ impl Resource for CalendarFile { CalendarPropName::Getcontenttype => Err(rustical_dav::Error::PropReadOnly), CalendarPropName::MaxResourceSize => Err(rustical_dav::Error::PropReadOnly), CalendarPropName::CurrentUserPrivilegeSet => Err(rustical_dav::Error::PropReadOnly), + CalendarPropName::SupportedReportSet => Err(rustical_dav::Error::PropReadOnly), } } }