From 646919587eec0054a7bfdb107272c8f8ebcb3ca4 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Wed, 1 Jan 2025 15:07:22 +0100 Subject: [PATCH] some refactoring --- .../methods/report/calendar_multiget.rs | 2 +- .../calendar/methods/report/calendar_query.rs | 2 +- .../methods/report/sync_collection.rs | 2 +- .../methods/report/addressbook_multiget.rs | 2 +- .../methods/report/sync_collection.rs | 2 +- crates/dav/src/resource/methods/propfind.rs | 21 +++++++------------ crates/dav/src/resource/mod.rs | 14 ++++++------- 7 files changed, 19 insertions(+), 26 deletions(-) diff --git a/crates/caldav/src/calendar/methods/report/calendar_multiget.rs b/crates/caldav/src/calendar/methods/report/calendar_multiget.rs index a5b3fd4..321c763 100644 --- a/crates/caldav/src/calendar/methods/report/calendar_multiget.rs +++ b/crates/caldav/src/calendar/methods/report/calendar_multiget.rs @@ -93,7 +93,7 @@ pub async fn handle_calendar_multiget( object, principal: principal.to_owned(), } - .propfind(&path, props.clone(), user, req.resource_map())?, + .propfind(&path, &props, user, req.resource_map())?, ); } diff --git a/crates/caldav/src/calendar/methods/report/calendar_query.rs b/crates/caldav/src/calendar/methods/report/calendar_query.rs index 55da0e6..ec72ad4 100644 --- a/crates/caldav/src/calendar/methods/report/calendar_query.rs +++ b/crates/caldav/src/calendar/methods/report/calendar_query.rs @@ -225,7 +225,7 @@ pub async fn handle_calendar_query( object, principal: principal.to_owned(), } - .propfind(&path, props.clone(), user, req.resource_map())?, + .propfind(&path, &props, user, req.resource_map())?, ); } diff --git a/crates/caldav/src/calendar/methods/report/sync_collection.rs b/crates/caldav/src/calendar/methods/report/sync_collection.rs index 155e09a..b44c77a 100644 --- a/crates/caldav/src/calendar/methods/report/sync_collection.rs +++ b/crates/caldav/src/calendar/methods/report/sync_collection.rs @@ -94,7 +94,7 @@ pub async fn handle_sync_collection( object, principal: principal.to_owned(), } - .propfind(&path, props.clone(), user, req.resource_map())?, + .propfind(&path, &props, user, req.resource_map())?, ); } diff --git a/crates/carddav/src/addressbook/methods/report/addressbook_multiget.rs b/crates/carddav/src/addressbook/methods/report/addressbook_multiget.rs index 668db01..8a956e4 100644 --- a/crates/carddav/src/addressbook/methods/report/addressbook_multiget.rs +++ b/crates/carddav/src/addressbook/methods/report/addressbook_multiget.rs @@ -99,7 +99,7 @@ pub async fn handle_addressbook_multiget( object, principal: principal.to_owned(), } - .propfind(&path, props.clone(), user, req.resource_map())?, + .propfind(&path, &props, user, req.resource_map())?, ); } diff --git a/crates/carddav/src/addressbook/methods/report/sync_collection.rs b/crates/carddav/src/addressbook/methods/report/sync_collection.rs index ef1809b..ceba911 100644 --- a/crates/carddav/src/addressbook/methods/report/sync_collection.rs +++ b/crates/carddav/src/addressbook/methods/report/sync_collection.rs @@ -91,7 +91,7 @@ pub async fn handle_sync_collection( object, principal: principal.to_owned(), } - .propfind(&path, props.clone(), user, req.resource_map())?, + .propfind(&path, &props, user, req.resource_map())?, ); } diff --git a/crates/dav/src/resource/methods/propfind.rs b/crates/dav/src/resource/methods/propfind.rs index 91e70d1..78ce906 100644 --- a/crates/dav/src/resource/methods/propfind.rs +++ b/crates/dav/src/resource/methods/propfind.rs @@ -49,29 +49,24 @@ pub(crate) async fn route_propfind( } }; - let props = match propfind.prop { - PropfindType::Allprop => vec!["allprop".to_owned()], - PropfindType::Propname => vec!["propname".to_owned()], + // TODO: respect namespaces? + let props = match &propfind.prop { + PropfindType::Allprop => vec!["allprop"], + PropfindType::Propname => vec!["propname"], PropfindType::Prop(PropElement { prop: prop_tags }) => prop_tags - .into_iter() - .map(|propname| propname.name) + .iter() + .map(|propname| propname.name.as_str()) .collect(), }; - let props: Vec<&str> = props.iter().map(String::as_str).collect(); let mut member_responses = Vec::new(); if depth != Depth::Zero { for (path, member) in resource_service.get_members(req.resource_map()).await? { - member_responses.push(member.propfind( - &path, - props.clone(), - &user, - req.resource_map(), - )?); + member_responses.push(member.propfind(&path, &props, &user, req.resource_map())?); } } - let response = resource.propfind(req.path(), props, &user, req.resource_map())?; + let response = resource.propfind(req.path(), &props, &user, req.resource_map())?; Ok(MultistatusElement { responses: vec![response], diff --git a/crates/dav/src/resource/mod.rs b/crates/dav/src/resource/mod.rs index e064087..0d9acb2 100644 --- a/crates/dav/src/resource/mod.rs +++ b/crates/dav/src/resource/mod.rs @@ -141,10 +141,12 @@ pub trait Resource: Clone + 'static { fn propfind( &self, path: &str, - mut props: Vec<&str>, + props: &[&str], user: &User, rmap: &ResourceMap, ) -> Result>, Self::Error> { + let mut props = props.to_vec(); + if props.contains(&"propname") { if props.len() != 1 { // propname MUST be the only queried prop per spec @@ -154,7 +156,7 @@ pub trait Resource: Clone + 'static { } let props = Self::list_props() .into_iter() - .map(str::to_owned) + .map(str::to_string) .collect_vec(); return Ok(ResponseElement { @@ -186,7 +188,7 @@ pub trait Resource: Clone + 'static { } else if let Ok(internal_prop) = CommonPropertiesPropName::from_str(prop) { internal_props.push(internal_prop); } else { - invalid_props.push(prop) + invalid_props.push(prop.to_string()) } } @@ -212,11 +214,7 @@ pub trait Resource: Clone + 'static { if !invalid_props.is_empty() { propstats.push(PropstatWrapper::TagList(PropstatElement { status: StatusCode::NOT_FOUND, - prop: invalid_props - .into_iter() - .map(|s| s.to_owned()) - .collect_vec() - .into(), + prop: invalid_props.into(), })); } Ok(ResponseElement {