From 0c1c04d1cd5f42d8103d3b86138f02d59a964d02 Mon Sep 17 00:00:00 2001 From: Lennart K <18233294+lennart-k@users.noreply.github.com> Date: Thu, 12 Jun 2025 14:39:16 +0200 Subject: [PATCH] dav: Move displayname to common properties --- crates/caldav/src/calendar/resource.rs | 23 +++++++------------ crates/caldav/src/calendar_object/resource.rs | 5 ++++ crates/caldav/src/principal/mod.rs | 15 +++++++----- crates/caldav/src/principal/prop.rs | 3 --- crates/carddav/src/address_object/resource.rs | 4 ++++ crates/carddav/src/addressbook/prop.rs | 4 ---- crates/carddav/src/addressbook/resource.rs | 19 +++++++-------- crates/carddav/src/principal/mod.rs | 15 +++++++----- crates/carddav/src/principal/prop.rs | 3 --- crates/dav/src/extensions/common.rs | 19 +++++++++++---- crates/dav/src/resource/mod.rs | 5 ++++ crates/dav/src/resources/root.rs | 4 ++++ crates/ical/src/address_object.rs | 4 ++-- 13 files changed, 69 insertions(+), 54 deletions(-) diff --git a/crates/caldav/src/calendar/resource.rs b/crates/caldav/src/calendar/resource.rs index 706d85c..f42c7ca 100644 --- a/crates/caldav/src/calendar/resource.rs +++ b/crates/caldav/src/calendar/resource.rs @@ -19,10 +19,6 @@ use std::str::FromStr; #[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumVariants, PropName)] #[xml(unit_variants_ident = "CalendarPropName")] pub enum CalendarProp { - // WebDAV (RFC 2518) - #[xml(ns = "rustical_dav::namespace::NS_DAV")] - Displayname(Option), - // CalDAV (RFC 4791) #[xml(ns = "rustical_dav::namespace::NS_ICAL")] CalendarColor(Option), @@ -127,9 +123,6 @@ impl Resource for CalendarResource { ) -> Result { Ok(match prop { CalendarPropWrapperName::Calendar(prop) => CalendarPropWrapper::Calendar(match prop { - CalendarPropName::Displayname => { - CalendarProp::Displayname(self.cal.displayname.clone()) - } CalendarPropName::CalendarColor => { CalendarProp::CalendarColor(self.cal.color.clone()) } @@ -187,10 +180,6 @@ impl Resource for CalendarResource { } match prop { CalendarPropWrapper::Calendar(prop) => match prop { - CalendarProp::Displayname(displayname) => { - self.cal.displayname = displayname; - Ok(()) - } CalendarProp::CalendarColor(color) => { self.cal.color = color; Ok(()) @@ -247,10 +236,6 @@ impl Resource for CalendarResource { } match prop { CalendarPropWrapperName::Calendar(prop) => match prop { - CalendarPropName::Displayname => { - self.cal.displayname = None; - Ok(()) - } CalendarPropName::CalendarColor => { self.cal.color = None; Ok(()) @@ -291,6 +276,14 @@ impl Resource for CalendarResource { } } + fn get_displayname(&self) -> Option<&str> { + self.cal.displayname.as_deref() + } + fn set_displayname(&mut self, name: Option) -> Result<(), rustical_dav::Error> { + self.cal.displayname = name; + Ok(()) + } + fn get_owner(&self) -> Option<&str> { Some(&self.cal.principal) } diff --git a/crates/caldav/src/calendar_object/resource.rs b/crates/caldav/src/calendar_object/resource.rs index 16f5d0e..dc46936 100644 --- a/crates/caldav/src/calendar_object/resource.rs +++ b/crates/caldav/src/calendar_object/resource.rs @@ -66,6 +66,11 @@ impl Resource for CalendarObjectResource { }) } + fn get_displayname(&self) -> Option<&str> { + // TODO: Extract summary from object + None + } + fn get_owner(&self) -> Option<&str> { Some(&self.principal) } diff --git a/crates/caldav/src/principal/mod.rs b/crates/caldav/src/principal/mod.rs index e0794e4..e4f248d 100644 --- a/crates/caldav/src/principal/mod.rs +++ b/crates/caldav/src/principal/mod.rs @@ -56,12 +56,6 @@ impl Resource for PrincipalResource { PrincipalPropName::CalendarUserType => { PrincipalProp::CalendarUserType(self.principal.principal_type.to_owned()) } - PrincipalPropName::Displayname => PrincipalProp::Displayname( - self.principal - .displayname - .to_owned() - .unwrap_or(self.principal.id.to_owned()), - ), PrincipalPropName::PrincipalUrl => { PrincipalProp::PrincipalUrl(principal_url.into()) } @@ -77,6 +71,15 @@ impl Resource for PrincipalResource { }) } + fn get_displayname(&self) -> Option<&str> { + Some( + self.principal + .displayname + .as_ref() + .unwrap_or(&self.principal.id), + ) + } + fn get_owner(&self) -> Option<&str> { Some(&self.principal.id) } diff --git a/crates/caldav/src/principal/prop.rs b/crates/caldav/src/principal/prop.rs index 15dd133..2cb4fb5 100644 --- a/crates/caldav/src/principal/prop.rs +++ b/crates/caldav/src/principal/prop.rs @@ -5,9 +5,6 @@ use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize}; #[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumVariants, PropName)] #[xml(unit_variants_ident = "PrincipalPropName")] pub enum PrincipalProp { - #[xml(ns = "rustical_dav::namespace::NS_DAV")] - Displayname(String), - // Scheduling Extensions to CalDAV (RFC 6638) #[xml(ns = "rustical_dav::namespace::NS_CALDAV", skip_deserializing)] CalendarUserType(PrincipalType), diff --git a/crates/carddav/src/address_object/resource.rs b/crates/carddav/src/address_object/resource.rs index ad5e051..46c53ac 100644 --- a/crates/carddav/src/address_object/resource.rs +++ b/crates/carddav/src/address_object/resource.rs @@ -64,6 +64,10 @@ impl Resource for AddressObjectResource { }) } + fn get_displayname(&self) -> Option<&str> { + self.object.get_full_name() + } + fn get_owner(&self) -> Option<&str> { Some(&self.principal) } diff --git a/crates/carddav/src/addressbook/prop.rs b/crates/carddav/src/addressbook/prop.rs index c5bf636..08ca4ec 100644 --- a/crates/carddav/src/addressbook/prop.rs +++ b/crates/carddav/src/addressbook/prop.rs @@ -5,10 +5,6 @@ use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize}; #[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumVariants, PropName)] #[xml(unit_variants_ident = "AddressbookPropName")] pub enum AddressbookProp { - // WebDAV (RFC 2518) - #[xml(ns = "rustical_dav::namespace::NS_DAV")] - Displayname(Option), - // CardDAV (RFC 6352) #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] AddressbookDescription(Option), diff --git a/crates/carddav/src/addressbook/resource.rs b/crates/carddav/src/addressbook/resource.rs index 6a6cc68..29a17f5 100644 --- a/crates/carddav/src/addressbook/resource.rs +++ b/crates/carddav/src/addressbook/resource.rs @@ -56,9 +56,6 @@ impl Resource for AddressbookResource { Ok(match prop { AddressbookPropWrapperName::Addressbook(prop) => { AddressbookPropWrapper::Addressbook(match prop { - AddressbookPropName::Displayname => { - AddressbookProp::Displayname(self.0.displayname.clone()) - } AddressbookPropName::MaxResourceSize => { AddressbookProp::MaxResourceSize(10000000) } @@ -89,10 +86,6 @@ impl Resource for AddressbookResource { fn set_prop(&mut self, prop: Self::Prop) -> Result<(), rustical_dav::Error> { match prop { AddressbookPropWrapper::Addressbook(prop) => match prop { - AddressbookProp::Displayname(displayname) => { - self.0.displayname = displayname; - Ok(()) - } AddressbookProp::AddressbookDescription(description) => { self.0.description = description; Ok(()) @@ -113,10 +106,6 @@ impl Resource for AddressbookResource { ) -> Result<(), rustical_dav::Error> { match prop { AddressbookPropWrapperName::Addressbook(prop) => match prop { - AddressbookPropName::Displayname => { - self.0.displayname = None; - Ok(()) - } AddressbookPropName::AddressbookDescription => { self.0.description = None; Ok(()) @@ -135,6 +124,14 @@ impl Resource for AddressbookResource { } } + fn get_displayname(&self) -> Option<&str> { + self.0.displayname.as_deref() + } + fn set_displayname(&mut self, name: Option) -> Result<(), rustical_dav::Error> { + self.0.displayname = name; + Ok(()) + } + fn get_owner(&self) -> Option<&str> { Some(&self.0.principal) } diff --git a/crates/carddav/src/principal/mod.rs b/crates/carddav/src/principal/mod.rs index 252a992..5bb0bc9 100644 --- a/crates/carddav/src/principal/mod.rs +++ b/crates/carddav/src/principal/mod.rs @@ -54,12 +54,6 @@ impl Resource for PrincipalResource { Ok(match prop { PrincipalPropWrapperName::Principal(prop) => { PrincipalPropWrapper::Principal(match prop { - PrincipalPropName::Displayname => PrincipalProp::Displayname( - self.principal - .displayname - .to_owned() - .unwrap_or(self.principal.id.to_owned()), - ), PrincipalPropName::PrincipalUrl => PrincipalProp::PrincipalUrl(principal_href), PrincipalPropName::AddressbookHomeSet => { PrincipalProp::AddressbookHomeSet(home_set) @@ -74,6 +68,15 @@ impl Resource for PrincipalResource { }) } + fn get_displayname(&self) -> Option<&str> { + Some( + self.principal + .displayname + .as_ref() + .unwrap_or(&self.principal.id), + ) + } + fn get_owner(&self) -> Option<&str> { Some(&self.principal.id) } diff --git a/crates/carddav/src/principal/prop.rs b/crates/carddav/src/principal/prop.rs index 6f98ffc..e749e1f 100644 --- a/crates/carddav/src/principal/prop.rs +++ b/crates/carddav/src/principal/prop.rs @@ -7,9 +7,6 @@ pub struct AddressbookHomeSet(#[xml(ty = "untagged", flatten)] pub(super) Vec
), // WebDAV Current Principal Extension (RFC 5397) #[xml(ns = "crate::namespace::NS_DAV")] @@ -37,6 +39,9 @@ pub trait CommonPropertiesExtension: Resource { CommonPropertiesPropName::Resourcetype => { CommonPropertiesProp::Resourcetype(self.get_resourcetype()) } + CommonPropertiesPropName::Displayname => { + CommonPropertiesProp::Displayname(self.get_displayname().map(|s| s.to_string())) + } CommonPropertiesPropName::CurrentUserPrincipal => { CommonPropertiesProp::CurrentUserPrincipal( principal_uri.principal_uri(principal.get_id()).into(), @@ -52,12 +57,18 @@ pub trait CommonPropertiesExtension: Resource { }) } - fn set_prop(&self, _prop: CommonPropertiesProp) -> Result<(), crate::Error> { - Err(crate::Error::PropReadOnly) + fn set_prop(&mut self, prop: CommonPropertiesProp) -> Result<(), crate::Error> { + match prop { + CommonPropertiesProp::Displayname(name) => self.set_displayname(name), + _ => Err(crate::Error::PropReadOnly), + } } - fn remove_prop(&self, _prop: &CommonPropertiesPropName) -> Result<(), crate::Error> { - Err(crate::Error::PropReadOnly) + fn remove_prop(&mut self, prop: &CommonPropertiesPropName) -> Result<(), crate::Error> { + match prop { + CommonPropertiesPropName::Displayname => self.set_displayname(None), + _ => Err(crate::Error::PropReadOnly), + } } } diff --git a/crates/dav/src/resource/mod.rs b/crates/dav/src/resource/mod.rs index c063ce0..06f130c 100644 --- a/crates/dav/src/resource/mod.rs +++ b/crates/dav/src/resource/mod.rs @@ -60,6 +60,11 @@ pub trait Resource: Clone + Send + 'static { Err(crate::Error::PropReadOnly) } + fn get_displayname(&self) -> Option<&str>; + fn set_displayname(&mut self, _name: Option) -> Result<(), crate::Error> { + Err(crate::Error::PropReadOnly) + } + fn get_owner(&self) -> Option<&str> { None } diff --git a/crates/dav/src/resources/root.rs b/crates/dav/src/resources/root.rs index bb79496..9c27858 100644 --- a/crates/dav/src/resources/root.rs +++ b/crates/dav/src/resources/root.rs @@ -33,6 +33,10 @@ impl Resource for RootResource { )]) } + fn get_displayname(&self) -> Option<&str> { + Some("RustiCal DAV root") + } + fn get_prop( &self, principal_uri: &impl PrincipalUri, diff --git a/crates/ical/src/address_object.rs b/crates/ical/src/address_object.rs index 0407ade..7e28888 100644 --- a/crates/ical/src/address_object.rs +++ b/crates/ical/src/address_object.rs @@ -72,9 +72,9 @@ impl AddressObject { CalDateTime::parse_prop(prop, &HashMap::default()).ok() } - pub fn get_full_name(&self) -> Option<&String> { + pub fn get_full_name(&self) -> Option<&str> { let prop = self.vcard.get_property("FN")?; - prop.value.as_ref() + prop.value.as_deref() } pub fn get_anniversary_object(&self) -> Result, Error> {