diff --git a/Cargo.lock b/Cargo.lock index 2e26710..e4130b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" dependencies = [ "backtrace", ] @@ -145,7 +145,7 @@ dependencies = [ "rustc-hash", "serde", "serde_derive", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -181,7 +181,7 @@ checksum = "34921de3d57974069bad483fdfe0ec65d88c4ff892edd1ab4d8b03be0dda1b9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -277,9 +277,9 @@ dependencies = [ [[package]] name = "async-std" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730294c1c08c2e0f85759590518f6333f0d5a0a766a27d519c1b244c3dfd8a24" +checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" dependencies = [ "async-attributes", "async-channel 1.9.0", @@ -310,13 +310,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -476,9 +476,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d" dependencies = [ "serde", ] @@ -540,18 +540,18 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.32" +version = "1.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2352e5597e9c544d5e6d9c95190d5d27738ade584fa8db0a16e130e5c2b5296e" +checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc" dependencies = [ "shlex", ] [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -595,9 +595,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.43" +version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50fd97c9dc2399518aa331917ac6f274280ec5eb34e555dd291899745c48ec6f" +checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" dependencies = [ "clap_builder", "clap_derive", @@ -605,9 +605,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.43" +version = "4.5.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c35b5830294e1fa0462034af85cc95225a4cb07092c088c55bda3147cfcd8f65" +checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" dependencies = [ "anstream", "anstyle", @@ -617,14 +617,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.41" +version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -756,7 +756,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -771,12 +771,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.21.1" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b136475da5ef7b6ac596c0e956e37bad51b85b987ff3d5e230e964936736b2" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ - "darling_core 0.21.1", - "darling_macro 0.21.1", + "darling_core 0.21.3", + "darling_macro 0.21.3", ] [[package]] @@ -790,21 +790,21 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "darling_core" -version = "0.21.1" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b44ad32f92b75fb438b04b68547e521a548be8acc339a6dacc4a7121488f53e6" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -815,18 +815,18 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "darling_macro" -version = "0.21.1" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5be8a7a562d315a5b92a630c30cec6bcf663e6673f00fbb69cca66a6f521b9" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ - "darling_core 0.21.1", + "darling_core 0.21.3", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -867,7 +867,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "unicode-xid", ] @@ -891,7 +891,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1130,9 +1130,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -1216,7 +1216,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1300,9 +1300,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "gloo-timers" @@ -1339,7 +1339,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.10.0", + "indexmap 2.11.0", "slab", "tokio", "tokio-util", @@ -1498,13 +1498,14 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2", "http", "http-body", @@ -1512,6 +1513,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -1598,14 +1600,15 @@ dependencies = [ [[package]] name = "ical" version = "0.11.0" -source = "git+https://github.com/lennart-k/ical-rs#a3e875f3aa3d44a681feedfa4f08a60e5707706b" +source = "git+https://github.com/lennart-k/ical-rs#9035f46cd1d9d0a42e9727914301edc32bbcc126" dependencies = [ "chrono", "chrono-tz", + "itertools 0.14.0", "lazy_static", "regex", "serde", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] @@ -1702,9 +1705,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -1734,9 +1737,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" dependencies = [ "equivalent", "hashbrown 0.15.5", @@ -1751,9 +1754,9 @@ checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" [[package]] name = "io-uring" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ "bitflags", "cfg-if", @@ -1836,9 +1839,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libm" @@ -1846,6 +1849,17 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +[[package]] +name = "libredox" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +dependencies = [ + "bitflags", + "libc", + "redox_syscall", +] + [[package]] name = "libsqlite3-sys" version = "0.30.1" @@ -1919,7 +1933,7 @@ dependencies = [ "matchit", "percent-encoding", "serde", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] @@ -2132,7 +2146,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2167,7 +2181,7 @@ dependencies = [ "futures-sink", "js-sys", "pin-project-lite", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", ] @@ -2197,7 +2211,7 @@ dependencies = [ "opentelemetry_sdk", "prost", "reqwest", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tonic", "tracing", @@ -2234,7 +2248,7 @@ dependencies = [ "percent-encoding", "rand 0.9.2", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tokio-stream", ] @@ -2363,7 +2377,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2377,9 +2391,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phf" @@ -2436,7 +2450,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2547,9 +2561,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -2562,7 +2576,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "version_check", "yansi", ] @@ -2587,7 +2601,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2613,7 +2627,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.5.10", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "web-time", @@ -2634,7 +2648,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.16", "tinyvec", "tracing", "web-time", @@ -2754,7 +2768,7 @@ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2809,9 +2823,9 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "reqwest" -version = "0.12.22" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "base64 0.22.1", "bytes", @@ -2895,7 +2909,7 @@ dependencies = [ "chrono-tz", "log", "regex", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] @@ -2944,7 +2958,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.104", + "syn 2.0.106", "unicode-ident", ] @@ -2956,7 +2970,7 @@ checksum = "b3a8fb4672e840a587a66fc577a5491375df51ddb88f2a2c2a792598c326fe14" dependencies = [ "quote", "rand 0.8.5", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2989,7 +3003,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.104", + "syn 2.0.106", "walkdir", ] @@ -3097,7 +3111,7 @@ dependencies = [ "sha2", "strum", "strum_macros", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tower", "tower-http", @@ -3130,7 +3144,7 @@ dependencies = [ "serde", "strum", "strum_macros", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tower", "tower-http", @@ -3158,7 +3172,7 @@ dependencies = [ "rustical_xml", "serde", "strum", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tower", "tracing", @@ -3184,7 +3198,7 @@ dependencies = [ "rustical_store", "rustical_xml", "serde", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -3212,7 +3226,7 @@ dependencies = [ "rustical_oidc", "rustical_store", "serde", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tower", "tower-http", @@ -3237,7 +3251,7 @@ dependencies = [ "rustical_xml", "serde", "sha2", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] @@ -3251,7 +3265,7 @@ dependencies = [ "openidconnect", "reqwest", "serde", - "thiserror 2.0.12", + "thiserror 2.0.16", "tower-sessions", ] @@ -3281,7 +3295,7 @@ dependencies = [ "rustical_xml", "serde", "sha2", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tower", "tower-sessions", @@ -3304,7 +3318,7 @@ dependencies = [ "rustical_store", "serde", "sqlx", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "uuid", @@ -3315,7 +3329,7 @@ name = "rustical_xml" version = "0.8.6" dependencies = [ "quick-xml", - "thiserror 2.0.12", + "thiserror 2.0.16", "xml_derive", ] @@ -3465,14 +3479,14 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.142" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ "itoa", "memchr", @@ -3539,7 +3553,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.10.0", + "indexmap 2.11.0", "schemars 0.9.0", "schemars 1.0.4", "serde", @@ -3558,7 +3572,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3709,7 +3723,7 @@ dependencies = [ "futures-util", "hashbrown 0.15.5", "hashlink", - "indexmap 2.10.0", + "indexmap 2.11.0", "log", "memchr", "once_cell", @@ -3718,7 +3732,7 @@ dependencies = [ "serde_json", "sha2", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -3736,7 +3750,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3759,7 +3773,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.104", + "syn 2.0.106", "tokio", "url", ] @@ -3802,7 +3816,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "uuid", "whoami", @@ -3841,7 +3855,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "uuid", "whoami", @@ -3867,7 +3881,7 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "url", "uuid", @@ -3911,7 +3925,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3933,9 +3947,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.104" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -3959,7 +3973,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3973,11 +3987,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.16", ] [[package]] @@ -3988,18 +4002,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4054,9 +4068,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -4096,7 +4110,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4151,7 +4165,7 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.11.0", "serde", "serde_spanned 1.0.0", "toml_datetime 0.7.0", @@ -4184,7 +4198,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.11.0", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", @@ -4247,7 +4261,7 @@ checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", - "indexmap 2.10.0", + "indexmap 2.11.0", "pin-project-lite", "slab", "sync_wrapper", @@ -4347,7 +4361,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.16", "time", "tokio", "tracing", @@ -4385,7 +4399,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4513,9 +4527,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "137a3c834eaf7139b73688502f3f1141a0337c5d8e4d9b536f9b8c796e26a7c4" dependencies = [ "form_urlencoded", "idna", @@ -4537,9 +4551,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" dependencies = [ "getrandom 0.3.3", "js-sys", @@ -4644,7 +4658,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-shared", ] @@ -4679,7 +4693,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4724,11 +4738,11 @@ dependencies = [ [[package]] name = "whoami" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" dependencies = [ - "redox_syscall", + "libredox", "wasite", ] @@ -4750,11 +4764,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -4784,7 +4798,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4795,7 +4809,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5046,9 +5060,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] @@ -5072,11 +5086,11 @@ checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" name = "xml_derive" version = "0.1.0" dependencies = [ - "darling 0.21.1", + "darling 0.21.3", "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5105,7 +5119,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] @@ -5126,7 +5140,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5146,7 +5160,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] @@ -5186,5 +5200,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] diff --git a/crates/caldav/src/calendar/methods/import.rs b/crates/caldav/src/calendar/methods/import.rs new file mode 100644 index 0000000..fb28f97 --- /dev/null +++ b/crates/caldav/src/calendar/methods/import.rs @@ -0,0 +1,103 @@ +use std::{collections::HashMap, io::BufReader}; + +use crate::Error; +use crate::calendar::CalendarResourceService; +use axum::{ + extract::{Path, State}, + response::{IntoResponse, Response}, +}; +use http::StatusCode; +use ical::{ + generator::{Emitter, IcalCalendar}, + parser::{Component, ComponentMut, ical::component::IcalTimeZone}, +}; +use rustical_ical::{CalendarObject, CalendarObjectComponent, CalendarObjectType, EventObject}; +use rustical_store::{Calendar, CalendarStore, SubscriptionStore, auth::Principal}; +use tracing::instrument; + +#[instrument(skip(resource_service))] +pub async fn route_import( + Path((principal, cal_id)): Path<(String, String)>, + user: Principal, + State(resource_service): State>, + body: String, +) -> Result { + if !user.is_principal(&principal) { + return Err(Error::Unauthorized); + } + + let mut parser = ical::IcalParser::new(BufReader::new(body.as_bytes())); + let mut cal = parser + .next() + .expect("input must contain calendar") + .unwrap() + .mutable(); + if parser.next().is_some() { + return Err(rustical_ical::Error::InvalidData( + "multiple calendars, only one allowed".to_owned(), + ) + .into()); + } + + // Extract calendar metadata + let displayname = cal + .get_property("X-WR-CALNAME") + .and_then(|prop| prop.value.to_owned()); + let description = cal + .get_property("X-WR-CALDESC") + .and_then(|prop| prop.value.to_owned()); + let timezone_id = cal + .get_property("X-WR-TIMEZONE") + .and_then(|prop| prop.value.to_owned()); + // These properties should not appear in the expanded calendar objects + cal.remove_property("X-WR-CALNAME"); + cal.remove_property("X-WR-CALDESC"); + cal.remove_property("X-WR-TIMEZONE"); + let cal = cal.verify().unwrap(); + // Make sure timezone is valid + if let Some(timezone_id) = timezone_id.as_ref() { + assert!( + vtimezones_rs::VTIMEZONES.contains_key(timezone_id), + "Invalid calendar timezone id" + ); + } + + // Extract necessary component types + let mut cal_components = vec![]; + if !cal.events.is_empty() { + cal_components.push(CalendarObjectType::Event); + } + if !cal.journals.is_empty() { + cal_components.push(CalendarObjectType::Journal); + } + if !cal.todos.is_empty() { + cal_components.push(CalendarObjectType::Todo); + } + + let expanded_cals = cal.expand_calendar(); + // Janky way to convert between IcalCalendar and CalendarObject + let objects = expanded_cals + .into_iter() + .map(|cal| cal.generate()) + .map(CalendarObject::from_ics) + .collect::, _>>()?; + let new_cal = Calendar { + principal, + id: cal_id, + displayname, + order: 0, + description, + color: None, + timezone_id, + deleted_at: None, + synctoken: 0, + subscription_url: None, + push_topic: uuid::Uuid::new_v4().to_string(), + components: cal_components, + }; + + let cal_store = resource_service.cal_store; + cal_store.import_calendar(new_cal, objects, false).await?; + + Ok(StatusCode::OK.into_response()) +} diff --git a/crates/caldav/src/calendar/methods/mod.rs b/crates/caldav/src/calendar/methods/mod.rs index 70d7d96..9ddf2bd 100644 --- a/crates/caldav/src/calendar/methods/mod.rs +++ b/crates/caldav/src/calendar/methods/mod.rs @@ -1,4 +1,5 @@ pub mod get; +pub mod import; pub mod mkcalendar; pub mod post; pub mod report; diff --git a/crates/caldav/src/calendar/service.rs b/crates/caldav/src/calendar/service.rs index 889b7bb..b9c2396 100644 --- a/crates/caldav/src/calendar/service.rs +++ b/crates/caldav/src/calendar/service.rs @@ -1,4 +1,5 @@ use crate::calendar::methods::get::route_get; +use crate::calendar::methods::import::route_import; use crate::calendar::methods::mkcalendar::route_mkcalendar; use crate::calendar::methods::post::route_post; use crate::calendar::methods::report::route_report_calendar; @@ -138,6 +139,13 @@ impl AxumMethods for CalendarResourceSer }) } + fn import() -> Option> { + Some(|state, req| { + let mut service = Handler::with_state(route_import::, state); + Box::pin(Service::call(&mut service, req)) + }) + } + fn mkcalendar() -> Option BoxFuture<'static, Result>> { Some(|state, req| { diff --git a/crates/frontend/js-components/lib/import-calendar-form.ts b/crates/frontend/js-components/lib/import-calendar-form.ts new file mode 100644 index 0000000..b9623bf --- /dev/null +++ b/crates/frontend/js-components/lib/import-calendar-form.ts @@ -0,0 +1,95 @@ +import { html, LitElement } from "lit"; +import { customElement, property } from "lit/decorators.js"; +import { Ref, createRef, ref } from 'lit/directives/ref.js'; +import { escapeXml } from "."; + +@customElement("import-calendar-form") +export class ImportCalendarForm extends LitElement { + constructor() { + super() + } + + protected override createRenderRoot() { + return this + } + + @property() + user: string = '' + @property() + principal: string + @property() + cal_id: string = self.crypto.randomUUID() + @property() + timezone_id: string = '' + + dialog: Ref = createRef() + form: Ref = createRef() + file: File; + + + override render() { + return html` + + +

Import calendar

+
+ +
+ +
+ + + +
+
+ ` + } + + async submit(e: SubmitEvent) { + e.preventDefault() + this.principal ||= this.user + if (!this.principal) { + alert("Empty principal") + return + } + if (!this.cal_id) { + alert("Empty id") + return + } + let response = await fetch(`/caldav/principal/${this.principal}/${this.cal_id}`, { + method: 'IMPORT', + headers: { + 'Content-Type': 'text/calendar' + }, + body: this.file, + }) + + if (response.status >= 400) { + alert(`Error ${response.status}: ${await response.text()}`) + return null + } + + window.location.reload() + return null + } +} + +declare global { + interface HTMLElementTagNameMap { + 'import-calendar-form': ImportCalendarForm + } +} diff --git a/crates/frontend/js-components/vite.config.ts b/crates/frontend/js-components/vite.config.ts index 9c127c0..0c038bf 100644 --- a/crates/frontend/js-components/vite.config.ts +++ b/crates/frontend/js-components/vite.config.ts @@ -16,6 +16,7 @@ export default defineConfig({ input: [ "lib/create-calendar-form.ts", "lib/edit-calendar-form.ts", + "lib/import-calendar-form.ts", "lib/create-addressbook-form.ts", "lib/edit-addressbook-form.ts", "lib/delete-button.ts", diff --git a/crates/frontend/public/assets/js/create-addressbook-form.mjs b/crates/frontend/public/assets/js/create-addressbook-form.mjs index 5a83e38..9667ddd 100644 --- a/crates/frontend/public/assets/js/create-addressbook-form.mjs +++ b/crates/frontend/public/assets/js/create-addressbook-form.mjs @@ -1,6 +1,7 @@ import { i, x } from "./lit-z6_uA4GX.mjs"; import { n as n$1, t } from "./property-D0NJdseG.mjs"; -import { e, n, a as escapeXml } from "./index-b86iLJlP.mjs"; +import { e, n } from "./ref-CPp9J0V5.mjs"; +import { e as escapeXml } from "./index-_IB1wMbZ.mjs"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __decorateClass = (decorators, target, key, kind) => { diff --git a/crates/frontend/public/assets/js/create-calendar-form.mjs b/crates/frontend/public/assets/js/create-calendar-form.mjs index 38771fd..aa249a3 100644 --- a/crates/frontend/public/assets/js/create-calendar-form.mjs +++ b/crates/frontend/public/assets/js/create-calendar-form.mjs @@ -1,6 +1,7 @@ import { i, x } from "./lit-z6_uA4GX.mjs"; import { n as n$1, t } from "./property-D0NJdseG.mjs"; -import { e, n, a as escapeXml } from "./index-b86iLJlP.mjs"; +import { e, n } from "./ref-CPp9J0V5.mjs"; +import { e as escapeXml } from "./index-_IB1wMbZ.mjs"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __decorateClass = (decorators, target, key, kind) => { diff --git a/crates/frontend/public/assets/js/edit-addressbook-form.mjs b/crates/frontend/public/assets/js/edit-addressbook-form.mjs index 3eba43d..f5ab5e5 100644 --- a/crates/frontend/public/assets/js/edit-addressbook-form.mjs +++ b/crates/frontend/public/assets/js/edit-addressbook-form.mjs @@ -1,6 +1,7 @@ import { i, x } from "./lit-z6_uA4GX.mjs"; import { n as n$1, t } from "./property-D0NJdseG.mjs"; -import { e, n, a as escapeXml } from "./index-b86iLJlP.mjs"; +import { e, n } from "./ref-CPp9J0V5.mjs"; +import { e as escapeXml } from "./index-_IB1wMbZ.mjs"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __decorateClass = (decorators, target, key, kind) => { diff --git a/crates/frontend/public/assets/js/edit-calendar-form.mjs b/crates/frontend/public/assets/js/edit-calendar-form.mjs index 6888235..e2e07cc 100644 --- a/crates/frontend/public/assets/js/edit-calendar-form.mjs +++ b/crates/frontend/public/assets/js/edit-calendar-form.mjs @@ -1,6 +1,7 @@ import { i, x } from "./lit-z6_uA4GX.mjs"; import { n as n$1, t } from "./property-D0NJdseG.mjs"; -import { e, n, a as escapeXml } from "./index-b86iLJlP.mjs"; +import { e, n } from "./ref-CPp9J0V5.mjs"; +import { e as escapeXml } from "./index-_IB1wMbZ.mjs"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __decorateClass = (decorators, target, key, kind) => { diff --git a/crates/frontend/public/assets/js/import-calendar-form.mjs b/crates/frontend/public/assets/js/import-calendar-form.mjs new file mode 100644 index 0000000..75d6fd7 --- /dev/null +++ b/crates/frontend/public/assets/js/import-calendar-form.mjs @@ -0,0 +1,104 @@ +import { i, x } from "./lit-z6_uA4GX.mjs"; +import { n as n$1, t } from "./property-D0NJdseG.mjs"; +import { e, n } from "./ref-CPp9J0V5.mjs"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __decorateClass = (decorators, target, key, kind) => { + var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target; + for (var i2 = decorators.length - 1, decorator; i2 >= 0; i2--) + if (decorator = decorators[i2]) + result = (kind ? decorator(target, key, result) : decorator(result)) || result; + if (kind && result) __defProp(target, key, result); + return result; +}; +let ImportCalendarForm = class extends i { + constructor() { + super(); + this.user = ""; + this.cal_id = self.crypto.randomUUID(); + this.timezone_id = ""; + this.dialog = e(); + this.form = e(); + } + createRenderRoot() { + return this; + } + render() { + return x` + + +

Import calendar

+
+ +
+ +
+ + + +
+
+ `; + } + async submit(e2) { + e2.preventDefault(); + this.principal || (this.principal = this.user); + if (!this.principal) { + alert("Empty principal"); + return; + } + if (!this.cal_id) { + alert("Empty id"); + return; + } + let response = await fetch(`/caldav/principal/${this.principal}/${this.cal_id}`, { + method: "IMPORT", + headers: { + "Content-Type": "text/calendar" + }, + body: this.file + }); + if (response.status >= 400) { + alert(`Error ${response.status}: ${await response.text()}`); + return null; + } + window.location.reload(); + return null; + } +}; +__decorateClass([ + n$1() +], ImportCalendarForm.prototype, "user", 2); +__decorateClass([ + n$1() +], ImportCalendarForm.prototype, "principal", 2); +__decorateClass([ + n$1() +], ImportCalendarForm.prototype, "cal_id", 2); +__decorateClass([ + n$1() +], ImportCalendarForm.prototype, "timezone_id", 2); +ImportCalendarForm = __decorateClass([ + t("import-calendar-form") +], ImportCalendarForm); +export { + ImportCalendarForm +}; diff --git a/crates/frontend/public/assets/js/index-_IB1wMbZ.mjs b/crates/frontend/public/assets/js/index-_IB1wMbZ.mjs new file mode 100644 index 0000000..048f000 --- /dev/null +++ b/crates/frontend/public/assets/js/index-_IB1wMbZ.mjs @@ -0,0 +1,6 @@ +function escapeXml(unsafe) { + return unsafe.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); +} +export { + escapeXml as e +}; diff --git a/crates/frontend/public/assets/js/index-b86iLJlP.mjs b/crates/frontend/public/assets/js/ref-CPp9J0V5.mjs similarity index 95% rename from crates/frontend/public/assets/js/index-b86iLJlP.mjs rename to crates/frontend/public/assets/js/ref-CPp9J0V5.mjs index e2c7967..a8f257d 100644 --- a/crates/frontend/public/assets/js/index-b86iLJlP.mjs +++ b/crates/frontend/public/assets/js/ref-CPp9J0V5.mjs @@ -122,11 +122,7 @@ const o = /* @__PURE__ */ new WeakMap(), n = e$1(class extends f { this.rt(this.ct); } }); -function escapeXml(unsafe) { - return unsafe.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); -} export { - escapeXml as a, e, n }; diff --git a/crates/frontend/public/templates/components/sections/calendars_section.html b/crates/frontend/public/templates/components/sections/calendars_section.html index 7021e7f..eb6482d 100644 --- a/crates/frontend/public/templates/components/sections/calendars_section.html +++ b/crates/frontend/public/templates/components/sections/calendars_section.html @@ -84,4 +84,5 @@ {% endif %} + diff --git a/crates/frontend/public/templates/pages/user.html b/crates/frontend/public/templates/pages/user.html index 89d12cb..70aa77a 100644 --- a/crates/frontend/public/templates/pages/user.html +++ b/crates/frontend/public/templates/pages/user.html @@ -7,6 +7,7 @@ window.rusticalUser = JSON.parse(document.querySelector('#data-rustical-user').i +