From 8f69bc839adf340e5961c7a2a5c4aa085f0ccc53 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Sat, 10 May 2025 13:13:51 +0200 Subject: [PATCH] dav: Add namespace to propname --- .../caldav/src/calendar/methods/report/mod.rs | 17 +++++++++-------- .../src/addressbook/methods/report/mod.rs | 13 +++++++------ crates/dav/src/resource/methods/propfind.rs | 4 +++- crates/dav/src/xml/propfind.rs | 7 ++++++- crates/dav/tests/propfind.rs | 10 ++++++++-- 5 files changed, 33 insertions(+), 18 deletions(-) diff --git a/crates/caldav/src/calendar/methods/report/mod.rs b/crates/caldav/src/calendar/methods/report/mod.rs index 99d8649..cef9c51 100644 --- a/crates/caldav/src/calendar/methods/report/mod.rs +++ b/crates/caldav/src/calendar/methods/report/mod.rs @@ -73,7 +73,7 @@ impl ReportRequest { PropfindType::Prop(PropElement(prop_tags)) => prop_tags .iter() .map(|propname| match propname { - ReportPropName::Propname(propname) => propname.0.as_str(), + ReportPropName::Propname(propname) => propname.name.as_str(), ReportPropName::CalendarData(_) => "calendar-data", }) .collect(), @@ -165,8 +165,8 @@ mod tests { report_request, ReportRequest::CalendarMultiget(CalendarMultigetRequest { prop: rustical_dav::xml::PropfindType::Prop(PropElement(vec![ - ReportPropName::Propname(Propname("getetag".to_owned())), - ReportPropName::Propname(Propname("displayname".to_owned())), + ReportPropName::Propname(Propname{name: "getetag".to_owned(), ns: Some("DAV:".to_owned())}), + ReportPropName::Propname(Propname{name: "displayname".to_owned(), ns: Some("DAV:".to_owned())}), ReportPropName::CalendarData(CalendarData { comp: None, expand: Some(ExpandElement { start: "20250426T220000Z".to_owned(), end: "20250503T220000Z".to_owned() }), limit_recurrence_set: None, limit_freebusy_set: None }) ])), href: vec![ @@ -198,9 +198,10 @@ mod tests { assert_eq!( report_request, ReportRequest::CalendarQuery(CalendarQueryRequest { - prop: PropfindType::Prop(PropElement(vec![ReportPropName::Propname(Propname( - "getetag".to_owned() - ))])), + prop: PropfindType::Prop(PropElement(vec![ReportPropName::Propname(Propname { + name: "getetag".to_owned(), + ns: Some("DAV:".to_owned()) + })])), filter: Some(FilterElement { comp_filter: CompFilterElement { is_not_defined: None, @@ -247,8 +248,8 @@ mod tests { report_request, ReportRequest::CalendarMultiget(CalendarMultigetRequest { prop: rustical_dav::xml::PropfindType::Prop(PropElement(vec![ - ReportPropName::Propname(Propname("getetag".to_owned())), - ReportPropName::Propname(Propname("displayname".to_owned())) + ReportPropName::Propname(Propname{name: "getetag".to_owned(), ns: Some("DAV:".to_owned())}), + ReportPropName::Propname(Propname{name: "displayname".to_owned(), ns: Some("DAV:".to_owned())}) ])), href: vec![ "/caldav/user/user/6f787542-5256-401a-8db97003260da/ae7a998fdfd1d84a20391168962c62b".to_owned() diff --git a/crates/carddav/src/addressbook/methods/report/mod.rs b/crates/carddav/src/addressbook/methods/report/mod.rs index 3dc7bb6..488e24b 100644 --- a/crates/carddav/src/addressbook/methods/report/mod.rs +++ b/crates/carddav/src/addressbook/methods/report/mod.rs @@ -37,7 +37,7 @@ impl ReportRequest { } PropfindType::Prop(PropElement(prop_tags)) => prop_tags .iter() - .map(|propname| propname.0.as_str()) + .map(|propname| propname.name.as_str()) .collect(), } } @@ -112,9 +112,10 @@ mod tests { ReportRequest::SyncCollection(SyncCollectionRequest { sync_token: "".to_owned(), sync_level: SyncLevel::One, - prop: rustical_dav::xml::PropfindType::Prop(PropElement(vec![Propname( - "getetag".to_owned() - )])), + prop: rustical_dav::xml::PropfindType::Prop(PropElement(vec![Propname { + name: "getetag".to_owned(), + ns: Some("DAV:".to_owned()) + }])), limit: None }) ) @@ -137,8 +138,8 @@ mod tests { report_request, ReportRequest::AddressbookMultiget(AddressbookMultigetRequest { prop: rustical_dav::xml::PropfindType::Prop(PropElement(vec![ - Propname("getetag".to_owned()), - Propname("address-data".to_owned()) + Propname{name: "getetag".to_owned(), ns: Some("DAV:".to_owned())}, + Propname{name: "address-data".to_owned(), ns: Some("urn:ietf:params:xml:ns:carddav".to_owned())} ])), href: vec![ "/carddav/user/user/6f787542-5256-401a-8db97003260da/ae7a998fdfd1d84a20391168962c62b".to_owned() diff --git a/crates/dav/src/resource/methods/propfind.rs b/crates/dav/src/resource/methods/propfind.rs index bc5e9d7..9ede9bb 100644 --- a/crates/dav/src/resource/methods/propfind.rs +++ b/crates/dav/src/resource/methods/propfind.rs @@ -43,13 +43,15 @@ pub(crate) async fn route_propfind( } }; + dbg!(&propfind); + // TODO: respect namespaces? let props = match &propfind.prop { PropfindType::Allprop => vec!["allprop"], PropfindType::Propname => vec!["propname"], PropfindType::Prop(PropElement(prop_tags)) => prop_tags .iter() - .map(|propname| propname.0.as_str()) + .map(|propname| propname.name.as_str()) .collect(), }; diff --git a/crates/dav/src/xml/propfind.rs b/crates/dav/src/xml/propfind.rs index 3c23f3c..5f730f4 100644 --- a/crates/dav/src/xml/propfind.rs +++ b/crates/dav/src/xml/propfind.rs @@ -12,7 +12,12 @@ pub struct PropfindElement { pub struct PropElement(#[xml(ty = "untagged", flatten)] pub Vec); #[derive(Debug, Clone, XmlDeserialize, PartialEq)] -pub struct Propname(#[xml(ty = "tag_name")] pub String); +pub struct Propname { + #[xml(ty = "namespace")] + pub ns: Option, + #[xml(ty = "tag_name")] + pub name: String, +} #[derive(Debug, Clone, XmlDeserialize, PartialEq)] pub enum PropfindType { diff --git a/crates/dav/tests/propfind.rs b/crates/dav/tests/propfind.rs index 02b6e16..9fd73e3 100644 --- a/crates/dav/tests/propfind.rs +++ b/crates/dav/tests/propfind.rs @@ -54,8 +54,14 @@ fn propfind_prop() { propfind, PropfindElement { prop: PropfindType::Prop(PropElement(vec![ - Propname("displayname".to_owned()), - Propname("color".to_owned()), + Propname { + name: "displayname".to_owned(), + ns: Some("DAV:".to_owned()) + }, + Propname { + name: "color".to_owned(), + ns: Some("DAV:".to_owned()) + }, ])) } );