From 6448b23f8c4958750c1105f3b5808445bdce3099 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:34:00 +0100 Subject: [PATCH] Janky fix to make birthday calendar set read_only --- crates/caldav/src/calendar_set/mod.rs | 8 +++++++- crates/caldav/src/lib.rs | 2 +- crates/caldav/src/principal/mod.rs | 9 +++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/crates/caldav/src/calendar_set/mod.rs b/crates/caldav/src/calendar_set/mod.rs index bbd1918..e330e51 100644 --- a/crates/caldav/src/calendar_set/mod.rs +++ b/crates/caldav/src/calendar_set/mod.rs @@ -15,6 +15,7 @@ use std::sync::Arc; #[derive(Clone)] pub struct CalendarSetResource { pub(crate) principal: String, + pub(crate) read_only: bool, } #[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumVariants, EnumUnitVariants)] @@ -53,7 +54,11 @@ impl Resource for CalendarSetResource { } fn get_user_privileges(&self, user: &User) -> Result { - Ok(UserPrivilegeSet::owner_only(self.principal == user.id)) + Ok(if self.read_only { + UserPrivilegeSet::owner_read(self.principal == user.id) + } else { + UserPrivilegeSet::owner_only(self.principal == user.id) + }) } } @@ -80,6 +85,7 @@ impl ResourceService for CalendarSetResourceService { ) -> Result { Ok(CalendarSetResource { principal: principal.to_owned(), + read_only: self.cal_store.is_read_only(), }) } diff --git a/crates/caldav/src/lib.rs b/crates/caldav/src/lib.rs index 03ee7ba..212396c 100644 --- a/crates/caldav/src/lib.rs +++ b/crates/caldav/src/lib.rs @@ -72,7 +72,7 @@ pub fn configure_dav< web::scope("/user").service( web::scope("/{principal}") .service(PrincipalResourceService(&[ - "calendar", "birthdays" + ("calendar", false), ("birthdays", true) ]).actix_resource().name(PrincipalResource::route_name())) .service(web::scope("/calendar") .service(CalendarSetResourceService::new(store.clone()).actix_resource()) diff --git a/crates/caldav/src/principal/mod.rs b/crates/caldav/src/principal/mod.rs index de6353a..e4c4533 100644 --- a/crates/caldav/src/principal/mod.rs +++ b/crates/caldav/src/principal/mod.rs @@ -12,7 +12,7 @@ use rustical_xml::{EnumUnitVariants, EnumVariants, XmlDeserialize, XmlSerialize} #[derive(Clone)] pub struct PrincipalResource { principal: String, - home_set: &'static [&'static str], + home_set: &'static [(&'static str, bool)], } #[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone)] @@ -80,7 +80,7 @@ impl Resource for PrincipalResource { let home_set = CalendarHomeSet( self.home_set .iter() - .map(|&home_name| format!("{}/{}", principal_url, home_name).into()) + .map(|&(home_name, _read_only)| format!("{}/{}", principal_url, home_name).into()) .collect(), ); @@ -117,7 +117,7 @@ impl Resource for PrincipalResource { } } -pub struct PrincipalResourceService(pub &'static [&'static str]); +pub struct PrincipalResourceService(pub &'static [(&'static str, bool)]); #[async_trait(?Send)] impl ResourceService for PrincipalResourceService { @@ -143,11 +143,12 @@ impl ResourceService for PrincipalResourceService { Ok(self .0 .iter() - .map(|&set_name| { + .map(|&(set_name, read_only)| { ( set_name.to_string(), CalendarSetResource { principal: principal.to_owned(), + read_only, }, ) })