From 670c28c72fed48d2e113657ade095fe6af485d54 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Sat, 18 Jan 2025 23:45:29 +0100 Subject: [PATCH] proppatch: Respect namespaces in more cases --- crates/dav/src/resource/methods/proppatch.rs | 21 +++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/crates/dav/src/resource/methods/proppatch.rs b/crates/dav/src/resource/methods/proppatch.rs index 0579bb4..24959f2 100644 --- a/crates/dav/src/resource/methods/proppatch.rs +++ b/crates/dav/src/resource/methods/proppatch.rs @@ -8,7 +8,6 @@ use crate::Error; use actix_web::http::StatusCode; use actix_web::web::Data; use actix_web::{web::Path, HttpRequest}; -use itertools::Itertools; use quick_xml::name::Namespace; use rustical_store::auth::User; use rustical_xml::EnumUnitVariants; @@ -110,16 +109,21 @@ pub(crate) async fn route_proppatch( } SetPropertyPropWrapper::Invalid(invalid) => { let propname = invalid.tag_name(); - if ::list_props() + + if let Some(full_propname) = ::list_props() .into_iter() - .map(|(_ns, tag)| tag) - .collect_vec() - .contains(&propname.as_str()) + .find_map(|(ns, tag)| { + if tag == propname.as_str() { + Some((ns, tag.to_owned())) + } else { + None + } + }) { // This happens in following cases: // - read-only properties with #[serde(skip_deserializing)] // - internal properties - props_conflict.push((None, propname)) + props_conflict.push(full_propname) } else { props_not_found.push((None, propname)); } @@ -133,7 +137,10 @@ pub(crate) async fn route_proppatch( ) { Ok(prop) => match resource.remove_prop(&prop) { Ok(()) => props_ok.push((None, propname)), - Err(Error::PropReadOnly) => props_conflict.push((None, propname)), + Err(Error::PropReadOnly) => props_conflict.push({ + let (ns, tag) = prop.into(); + (ns, tag.to_owned()) + }), Err(err) => return Err(err.into()), }, // I guess removing a nonexisting property should be successful :)