From 9784f2b53f84044d2d4aceb49e5234ce1bd674d7 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Wed, 31 Dec 2025 16:50:32 +0100 Subject: [PATCH] PUT object: Properly check If-None-Match header --- crates/caldav/src/calendar_object/methods.rs | 18 +++++++++++++++++- crates/carddav/src/address_object/methods.rs | 18 +++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/crates/caldav/src/calendar_object/methods.rs b/crates/caldav/src/calendar_object/methods.rs index e6fdb8a..7e475ac 100644 --- a/crates/caldav/src/calendar_object/methods.rs +++ b/crates/caldav/src/calendar_object/methods.rs @@ -73,7 +73,23 @@ pub async fn put_event( } let overwrite = if let Some(TypedHeader(if_none_match)) = if_none_match { - if_none_match == IfNoneMatch::any() + // TODO: Put into transaction? + let existing = match cal_store + .get_object(&principal, &calendar_id, &object_id, false) + .await + { + Ok(existing) => Some(existing), + Err(rustical_store::Error::NotFound) => None, + Err(err) => Err(err)?, + }; + existing.is_none_or(|existing| { + if_none_match.precondition_passes( + &existing + .get_etag() + .parse() + .expect("We only generate valid ETags"), + ) + }) } else { true }; diff --git a/crates/carddav/src/address_object/methods.rs b/crates/carddav/src/address_object/methods.rs index 9520189..a93c78d 100644 --- a/crates/carddav/src/address_object/methods.rs +++ b/crates/carddav/src/address_object/methods.rs @@ -82,7 +82,23 @@ pub async fn put_object( } let overwrite = if let Some(TypedHeader(if_none_match)) = if_none_match { - if_none_match == IfNoneMatch::any() + // TODO: Put into transaction? + let existing = match addr_store + .get_object(&principal, &addressbook_id, &object_id, false) + .await + { + Ok(existing) => Some(existing), + Err(rustical_store::Error::NotFound) => None, + Err(err) => Err(err)?, + }; + existing.is_none_or(|existing| { + if_none_match.precondition_passes( + &existing + .get_etag() + .parse() + .expect("We only generate valid ETags"), + ) + }) } else { true };