From 5d0263abc1927b54d273611d5492ab0637d431d2 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Wed, 23 Jul 2025 17:55:55 +0200 Subject: [PATCH] caldav: Add vtimezone repository to date timezone with timezone-id --- Cargo.lock | 52 +++++++++++++++++++++++--- Cargo.toml | 2 + crates/caldav/Cargo.toml | 1 + crates/caldav/src/calendar/resource.rs | 24 +++++++++--- 4 files changed, 67 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 687c5dc..741af06 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1514,9 +1514,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ "base64 0.22.1", "bytes", @@ -1530,7 +1530,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.0", "tokio", "tower-service", "tracing", @@ -2352,6 +2352,26 @@ dependencies = [ "phf_shared", ] +[[package]] +name = "phf_codegen" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbdcb6f01d193b17f0b9c3360fa7e0e620991b193ff08702f78b3ce365d7e61" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cbb1126afed61dd6368748dae63b1ee7dc480191c6262a3b4ff1e29d86a6c5b" +dependencies = [ + "fastrand", + "phf_shared", +] + [[package]] name = "phf_shared" version = "0.12.1" @@ -2554,7 +2574,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2", + "socket2 0.5.10", "thiserror 2.0.12", "tokio", "tracing", @@ -2591,7 +2611,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.5.10", "tracing", "windows-sys 0.59.0", ] @@ -3045,6 +3065,7 @@ dependencies = [ "tracing", "url", "uuid", + "vzic-rs", ] [[package]] @@ -3578,6 +3599,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "spin" version = "0.9.8" @@ -4002,7 +4033,7 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2", + "socket2 0.5.10", "tokio-macros", "tracing", "windows-sys 0.52.0", @@ -4452,6 +4483,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vzic-rs" +version = "0.1.0" +source = "git+https://github.com/lennart-k/vzic-rs?branch=main#1e63ad71fdc2aad193fd8da19cf21197a52a556b" +dependencies = [ + "phf", + "phf_codegen", +] + [[package]] name = "walkdir" version = "2.5.0" diff --git a/Cargo.toml b/Cargo.toml index eaf314e..b46b29b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -135,6 +135,8 @@ reqwest = { version = "0.12", features = [ openidconnect = "4.0" clap = { version = "4.5", features = ["derive", "env"] } matchit-serde = { git = "https://github.com/lennart-k/matchit-serde", rev = "f0591d13" } +# TODO: Pin version +vzic-rs = { git = "https://github.com/lennart-k/vzic-rs", branch = "main" } ece = { version = "2.3", default-features = false, features = [ "backend-openssl", ] } diff --git a/crates/caldav/Cargo.toml b/crates/caldav/Cargo.toml index 92b238c..332e752 100644 --- a/crates/caldav/Cargo.toml +++ b/crates/caldav/Cargo.toml @@ -42,3 +42,4 @@ headers.workspace = true tower-http.workspace = true strum.workspace = true strum_macros.workspace = true +vzic-rs.workspace = true diff --git a/crates/caldav/src/calendar/resource.rs b/crates/caldav/src/calendar/resource.rs index 19415f7..2efa4b4 100644 --- a/crates/caldav/src/calendar/resource.rs +++ b/crates/caldav/src/calendar/resource.rs @@ -15,7 +15,6 @@ use rustical_store::Calendar; use rustical_store::auth::Principal; use rustical_xml::{EnumVariants, PropName}; use rustical_xml::{XmlDeserialize, XmlSerialize}; -use std::str::FromStr; #[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumVariants, PropName)] #[xml(unit_variants_ident = "CalendarPropName")] @@ -199,11 +198,15 @@ impl Resource for CalendarResource { CalendarProp::TimezoneServiceSet(_) => Err(rustical_dav::Error::PropReadOnly), CalendarProp::CalendarTimezoneId(timezone_id) => { if let Some(tzid) = &timezone_id { - // Validate timezone id - chrono_tz::Tz::from_str(tzid).map_err(|_| { - rustical_dav::Error::BadRequest(format!("Invalid timezone-id: {tzid}")) - })?; - // TODO: Ensure that timezone is also updated (For now hope that clients play nice) + // Validate timezone id and set timezone accordingly + self.cal.timezone = Some( + vzic_rs::VTIMEZONES + .get(tzid) + .ok_or(rustical_dav::Error::BadRequest(format!( + "Invalid timezone-id: {tzid}" + )))? + .to_string(), + ); } self.cal.timezone_id = timezone_id; Ok(()) @@ -305,3 +308,12 @@ impl Resource for CalendarResource { )) } } + +#[cfg(test)] +mod tests { + #[test] + fn test_tzdb_version() { + // Ensure that both chrono_tz and vzic_rs use the same tzdb version + assert_eq!(chrono_tz::IANA_TZDB_VERSION, vzic_rs::IANA_TZDB_VERSION); + } +}