From 44d408f84a3fc2bf2c7211f7beb7f84ebf4dee08 Mon Sep 17 00:00:00 2001 From: isa Date: Wed, 25 Sep 2024 11:44:10 -0400 Subject: [PATCH] Add tools to generate and remote upgrade citadel --- Cargo.lock | 1792 +++++++++++++++++++++++++------ citadel-tool/Cargo.toml | 5 + citadel-tool/src/boot/mod.rs | 2 +- citadel-tool/src/boot/rootfs.rs | 2 +- citadel-tool/src/fetch/fetch.rs | 293 +++++ citadel-tool/src/fetch/mod.rs | 55 + citadel-tool/src/main.rs | 4 + libcitadel/Cargo.toml | 1 + libcitadel/src/config.rs | 12 +- libcitadel/src/lib.rs | 1 + libcitadel/src/resource.rs | 20 +- libcitadel/src/system/mounts.rs | 11 +- libcitadel/src/updates.rs | 97 ++ update-generator/src/main.rs | 529 +++++++++ 14 files changed, 2480 insertions(+), 344 deletions(-) create mode 100644 citadel-tool/src/fetch/fetch.rs create mode 100644 citadel-tool/src/fetch/mod.rs create mode 100644 libcitadel/src/updates.rs create mode 100644 update-generator/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 52eddb2..a9b5e93 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,28 +13,43 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.17.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aho-corasick" -version = "0.7.18" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.6.15" @@ -86,9 +101,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.57" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "array-macro" @@ -109,9 +124,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "1.6.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" dependencies = [ "concurrent-queue", "event-listener", @@ -120,51 +135,51 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.4.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ "async-task", "concurrent-queue", - "fastrand", - "futures-lite", - "once_cell", + "fastrand 2.1.1", + "futures-lite 2.3.0", "slab", ] [[package]] name = "async-io" -version = "1.6.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ + "async-lock", + "autocfg", + "cfg-if 1.0.0", "concurrent-queue", - "futures-lite", - "libc", + "futures-lite 1.13.0", "log", - "once_cell", "parking", "polling", + "rustix 0.37.13", "slab", - "socket2", + "socket2 0.4.10", "waker-fn", - "winapi", ] [[package]] name = "async-lock" -version = "2.5.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" dependencies = [ "event-listener", ] [[package]] name = "async-task" -version = "4.2.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30696a84d817107fc028e049980e09d5e140e8da8f1caeb17e8e950658a3cea9" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "atk" @@ -173,7 +188,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a83b21d2aa75e464db56225e1bda2dd5993311ba1095acaa8fa03d1ae67026ba" dependencies = [ "atk-sys", - "bitflags", + "bitflags 1.2.1", "glib 0.14.8", "libc", ] @@ -191,26 +206,44 @@ dependencies = [ ] [[package]] -name = "autocfg" -version = "1.1.0" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.65" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if 1.0.0", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bincode" version = "1.3.3" @@ -226,6 +259,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + [[package]] name = "block-buffer" version = "0.9.0" @@ -235,6 +274,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "blowfish" version = "0.7.0" @@ -247,16 +295,22 @@ dependencies = [ ] [[package]] -name = "byteorder" -version = "1.4.3" +name = "bumpalo" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] -name = "cache-padded" -version = "1.2.0" +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "cairo-rs" @@ -264,7 +318,7 @@ version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33b5725979db0c586d98abad2193cdb612dd40ef95cd26bd99851bf93b3cb482" dependencies = [ - "bitflags", + "bitflags 1.2.1", "cairo-sys-rs", "glib 0.14.8", "libc", @@ -284,9 +338,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.73" +version = "1.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" +dependencies = [ + "shlex", +] [[package]] name = "cfg-expr" @@ -311,15 +368,16 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ - "libc", - "num-integer", - "num-traits 0.2.15", - "time", - "winapi", + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits 0.2.19", + "wasm-bindgen", + "windows-targets 0.52.6", ] [[package]] @@ -364,15 +422,20 @@ dependencies = [ name = "citadel-tool" version = "0.1.0" dependencies = [ + "anyhow", "byteorder", "clap", "dbus 0.8.4", + "ed25519-dalek", + "glob", "hex", "lazy_static", "libcitadel", "pwhash", + "reqwest", "rpassword", "serde", + "serde_cbor", "serde_derive", "tempfile", "toml 0.8.19", @@ -380,9 +443,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.17" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" +checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" dependencies = [ "clap_builder", "clap_derive", @@ -390,9 +453,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.17" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" +checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" dependencies = [ "anstream", "anstyle", @@ -402,9 +465,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.13" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck 0.5.0", "proc-macro2 1.0.86", @@ -426,27 +489,49 @@ checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "concurrent-queue" -version = "1.2.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ - "cache-padded", + "crossbeam-utils 0.8.20", ] [[package]] -name = "cpufeatures" -version = "0.2.2" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if 1.0.0", ] @@ -457,7 +542,7 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" dependencies = [ - "crossbeam-utils", + "crossbeam-utils 0.6.6", ] [[package]] @@ -470,6 +555,22 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "crypto-mac" version = "0.10.1" @@ -503,6 +604,33 @@ dependencies = [ "xi-unicode", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", +] + [[package]] name = "dbus" version = "0.6.5" @@ -523,6 +651,17 @@ dependencies = [ "libdbus-sys", ] +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "derivative" version = "2.2.0" @@ -531,7 +670,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", + "syn 1.0.109", ] [[package]] @@ -543,6 +682,16 @@ dependencies = [ "generic-array", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", +] + [[package]] name = "dtoa" version = "0.4.8" @@ -551,24 +700,57 @@ checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" [[package]] name = "easy-parallel" -version = "3.2.0" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6907e25393cdcc1f4f3f513d9aac1e840eb1cc341a0fccb01171f7d14d10b946" +checksum = "2afbb9b0aef60e4f0d2b18129b6c0dff035a6f7dbbd17c2f38c1432102ee223c" [[package]] name = "ed25519" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9c280362032ea4203659fc489832d0204ef09f247a0506f170dafcac08c369" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" dependencies = [ - "signature", + "signature 1.6.4", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature 2.2.0", +] + +[[package]] +name = "ed25519-dalek" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +dependencies = [ + "curve25519-dalek", + "ed25519 2.2.3", + "serde", + "sha2 0.10.8", + "subtle", + "zeroize", ] [[package]] name = "either" -version = "1.6.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if 1.0.0", +] [[package]] name = "enum-map" @@ -588,7 +770,7 @@ checksum = "e5c450cf304c9e18d45db562025a14fb1ca0f5c769b6f609309f81d4c31de455" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", + "syn 1.0.109", ] [[package]] @@ -618,7 +800,7 @@ checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", + "syn 1.0.109", ] [[package]] @@ -628,7 +810,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43bd5effaae6a671efa2032056110916a501bd24128cfb6f44e5a339b5cdb152" dependencies = [ "enumset_derive", - "num-traits 0.2.15", + "num-traits 0.2.19", ] [[package]] @@ -649,10 +831,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "event-listener" -version = "2.5.2" +name = "errno" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "failure" @@ -672,59 +864,102 @@ checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", + "syn 1.0.109", "synstructure", ] [[package]] name = "fastrand" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" dependencies = [ "instant", ] [[package]] -name = "field-offset" -version = "0.3.4" +name = "fastrand" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ - "memoffset", + "memoffset 0.9.1", "rustc_version", ] [[package]] name = "flate2" -version = "1.0.24" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] -name = "futures-channel" -version = "0.3.21" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", + "futures-sink", ] [[package]] name = "futures-core" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -733,17 +968,17 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ - "fastrand", + "fastrand 1.9.0", "futures-core", "futures-io", "memchr", @@ -753,38 +988,53 @@ dependencies = [ ] [[package]] -name = "futures-macro" -version = "0.3.21" +name = "futures-lite" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand 2.1.1", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", + "syn 2.0.77", ] [[package]] name = "futures-sink" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-core", + "futures-io", "futures-macro", "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", "slab", @@ -796,7 +1046,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d749dcfc00d8de0d7c3a289e04a04293eb5ba3d8a4e64d64911d481fa9933b" dependencies = [ - "bitflags", + "bitflags 1.2.1", "cairo-rs", "gdk-pixbuf", "gdk-sys", @@ -850,9 +1100,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.5" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -860,9 +1110,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.6" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if 1.0.0", "libc", @@ -871,9 +1121,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.26.1" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" +checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" [[package]] name = "gio" @@ -881,7 +1131,7 @@ version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711c3632b3ebd095578a9c091418d10fed492da9443f58ebc8f45efbeb215cb0" dependencies = [ - "bitflags", + "bitflags 1.2.1", "futures-channel", "futures-core", "futures-io", @@ -911,7 +1161,7 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c685013b7515e668f1b57a165b009d4d28cb139a8a989bbd699c10dad29d0c5" dependencies = [ - "bitflags", + "bitflags 1.2.1", "futures-channel", "futures-core", "futures-executor", @@ -930,7 +1180,7 @@ version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c515f1e62bf151ef6635f528d05b02c11506de986e43b34a5c920ef0b3796a4" dependencies = [ - "bitflags", + "bitflags 1.2.1", "futures-channel", "futures-core", "futures-executor", @@ -956,7 +1206,7 @@ dependencies = [ "proc-macro-error", "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", + "syn 1.0.109", ] [[package]] @@ -967,11 +1217,11 @@ checksum = "2aad66361f66796bfc73f530c51ef123970eb895ffba991a234fcf7bea89e518" dependencies = [ "anyhow", "heck 0.3.3", - "proc-macro-crate 1.1.3", + "proc-macro-crate 1.3.1", "proc-macro-error", "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", + "syn 1.0.109", ] [[package]] @@ -994,6 +1244,12 @@ dependencies = [ "system-deps 3.2.0", ] +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "gobject-sys" version = "0.10.0" @@ -1023,7 +1279,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb51122dd3317e9327ec1e4faa151d1fa0d95664cd8fb8dcfacf4d4d29ac70c" dependencies = [ "atk", - "bitflags", + "bitflags 1.2.1", "cairo-rs", "field-offset", "futures-channel", @@ -1065,13 +1321,38 @@ checksum = "21de1da96dc117443fb03c2e270b2d34b7de98d0a79a19bbb689476173745b79" dependencies = [ "anyhow", "heck 0.3.3", - "proc-macro-crate 1.1.3", + "proc-macro-crate 1.3.1", "proc-macro-error", "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", + "syn 1.0.109", ] +[[package]] +name = "h2" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" + [[package]] name = "hashbrown" version = "0.14.5" @@ -1093,6 +1374,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hex" version = "0.4.3" @@ -1106,7 +1393,136 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" dependencies = [ "crypto-mac", - "digest", + "digest 0.9.0", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.11", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "itoa 1.0.11", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", ] [[package]] @@ -1125,7 +1541,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46dd0a94b393c730779ccfd2a872b67b1eb67be3fc33082e733bdb38b5fde4d4" dependencies = [ - "bitflags", + "bitflags 1.2.1", "inotify-sys", "libc", ] @@ -1141,13 +1557,30 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ipnet" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -1165,9 +1598,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] @@ -1178,6 +1611,21 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8324a32baf01e2ae060e9de58ed0bc2320c9a2833491ee36cd3b4c414de4db8c" +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "launch-gnome-software" version = "0.1.0" @@ -1188,15 +1636,15 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.126" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libcitadel" @@ -1204,6 +1652,7 @@ version = "0.1.0" dependencies = [ "bincode", "byteorder", + "clap", "dbus 0.6.5", "hex", "inotify", @@ -1212,20 +1661,20 @@ dependencies = [ "nix 0.17.0", "posix-acl", "procfs", - "semver 1.0.23", + "semver", "serde", "serde_derive", "serde_json", "sodiumoxide", - "toml 0.5.9", + "toml 0.5.11", "walkdir", ] [[package]] name = "libdbus-sys" -version = "0.2.2" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c185b5b7ad900923ef3a8ff594083d4d9b5aea80bb4f32b8342363138c0d456b" +checksum = "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72" dependencies = [ "pkg-config", ] @@ -1243,13 +1692,22 @@ dependencies = [ ] [[package]] -name = "log" -version = "0.4.17" +name = "linux-raw-sys" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if 1.0.0", -] +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "md-5" @@ -1257,16 +1715,16 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15" dependencies = [ - "block-buffer", - "digest", + "block-buffer 0.9.0", + "digest 0.9.0", "opaque-debug", ] [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memoffset" @@ -1278,12 +1736,56 @@ dependencies = [ ] [[package]] -name = "miniz_oxide" -version = "0.5.1" +name = "memoffset" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ - "adler", + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi", + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", ] [[package]] @@ -1292,7 +1794,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" dependencies = [ - "bitflags", + "bitflags 1.2.1", "cc", "cfg-if 0.1.10", "libc", @@ -1305,11 +1807,11 @@ version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77d9f3521ea8e0641a153b3cddaf008dcbf26acd4ed739a2517295e0760d12c7" dependencies = [ - "bitflags", + "bitflags 1.2.1", "cc", "cfg-if 1.0.0", "libc", - "memoffset", + "memoffset 0.6.5", ] [[package]] @@ -1322,7 +1824,7 @@ dependencies = [ "num-integer", "num-iter", "num-rational", - "num-traits 0.2.15", + "num-traits 0.2.19", ] [[package]] @@ -1332,28 +1834,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" dependencies = [ "autocfg", - "num-traits 0.2.15", + "num-traits 0.2.19", ] [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", - "num-traits 0.2.15", + "num-traits 0.2.19", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", - "num-traits 0.2.15", + "num-traits 0.2.19", ] [[package]] @@ -1364,7 +1865,7 @@ checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" dependencies = [ "autocfg", "num-integer", - "num-traits 0.2.15", + "num-traits 0.2.19", ] [[package]] @@ -1373,14 +1874,14 @@ version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" dependencies = [ - "num-traits 0.2.15", + "num-traits 0.2.19", ] [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -1393,24 +1894,68 @@ checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" [[package]] name = "object" -version = "0.28.4" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.10.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +dependencies = [ + "bitflags 2.6.0", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] [[package]] name = "owning_ref" @@ -1427,7 +1972,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9937068580bebd8ced19975938573803273ccbcbd598c58d4906efd4ac87c438" dependencies = [ - "bitflags", + "bitflags 1.2.1", "glib 0.10.3", "glib-sys 0.10.1", "gobject-sys 0.10.0", @@ -1442,7 +1987,7 @@ version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "546fd59801e5ca735af82839007edd226fe7d3bb06433ec48072be4439c28581" dependencies = [ - "bitflags", + "bitflags 1.2.1", "glib 0.14.8", "libc", "once_cell", @@ -1475,24 +2020,50 @@ dependencies = [ [[package]] name = "parking" -version = "2.0.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] -name = "pest" -version = "2.1.3" +name = "pem-rfc7468" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" dependencies = [ - "ucd-trie", + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -1501,29 +2072,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "pkg-config" -version = "0.3.25" +name = "pkcs8" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "polling" -version = "2.2.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" +checksum = "22122d5ec4f9fe1b3916419b76be1e80bcb93f618d071d2edf841b137b2a2bd6" dependencies = [ + "autocfg", "cfg-if 1.0.0", "libc", "log", "wepoll-ffi", - "winapi", + "windows-sys 0.42.0", ] [[package]] name = "posix-acl" -version = "1.0.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ea5dae99e4365fa738533b43f4c649c0450ba7fbb81a984a4fba6a42ce91812" +checksum = "9928b761309e4a4ca4f2d90eb03029142e3f7164107e18db4d46516515b87441" dependencies = [ "acl-sys", "libc", @@ -1531,9 +2113,12 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.16" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro-crate" @@ -1541,17 +2126,17 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml 0.5.9", + "toml 0.5.11", ] [[package]] name = "proc-macro-crate" -version = "1.1.3" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ - "thiserror", - "toml 0.5.9", + "once_cell", + "toml_edit 0.19.15", ] [[package]] @@ -1563,7 +2148,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", + "syn 1.0.109", "version_check", ] @@ -1602,7 +2187,7 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0941606b9934e2d98a3677759a971756eb821f75764d0e0d26946d08e74d9104" dependencies = [ - "bitflags", + "bitflags 1.2.1", "byteorder", "chrono", "flate2", @@ -1623,7 +2208,7 @@ dependencies = [ "md-5", "rand", "sha-1", - "sha2", + "sha2 0.9.9", ] [[package]] @@ -1667,9 +2252,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom", ] @@ -1699,27 +2284,36 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.2.1", ] [[package]] name = "redox_termios" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8440d8acb4fd3d277125b4bd01a6f38aee8d814b3b5fc09b3f2b825d37d3fe8f" -dependencies = [ - "redox_syscall", -] +checksum = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb" [[package]] name = "regex" -version = "1.5.5" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -1728,17 +2322,51 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] -name = "remove_dir_all" -version = "0.5.3" +name = "reqwest" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" dependencies = [ - "winapi", + "base64", + "bytes", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", ] [[package]] @@ -1764,19 +2392,68 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.21" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc_version" -version = "0.3.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 0.11.0", + "semver", ] +[[package]] +name = "rustix" +version = "0.37.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79bef90eb6d984c72722595b5b1348ab39275a5e5123faca6863bf07d75a4e0" +dependencies = [ + "bitflags 1.2.1", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys 0.4.14", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +dependencies = [ + "base64", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + [[package]] name = "same-file" version = "1.0.6" @@ -1787,18 +2464,41 @@ dependencies = [ ] [[package]] -name = "scoped-tls" -version = "1.0.0" +name = "schannel" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" +checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +dependencies = [ + "windows-sys 0.59.0", +] [[package]] -name = "semver" -version = "0.11.0" +name = "scoped-tls" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "semver-parser", + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +dependencies = [ + "core-foundation-sys", + "libc", ] [[package]] @@ -1807,29 +2507,30 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - [[package]] name = "serde" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] -name = "serde_derive" -version = "1.0.209" +name = "serde_cbor" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" +dependencies = [ + "half", + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", @@ -1843,20 +2544,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c62115693d0a9ed8c32d1c760f0fdbe7d4b05cb13c135b9b54137ac0d59fccb" dependencies = [ "dtoa", - "itoa", + "itoa 0.3.4", "num-traits 0.1.43", "serde", ] [[package]] name = "serde_repr" -version = "0.1.8" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ad84e47328a31223de7fed7a4f5087f2d6ddfe586cf3ca25b7a165bc0a5aed" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", + "syn 2.0.77", ] [[package]] @@ -1868,16 +2569,28 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa 1.0.11", + "ryu", + "serde", +] + [[package]] name = "sha-1" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ - "block-buffer", + "block-buffer 0.9.0", "cfg-if 1.0.0", "cpufeatures", - "digest", + "digest 0.9.0", "opaque-debug", ] @@ -1892,9 +2605,9 @@ dependencies = [ [[package]] name = "sha1_smol" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" [[package]] name = "sha2" @@ -1902,13 +2615,30 @@ version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ - "block-buffer", + "block-buffer 0.9.0", "cfg-if 1.0.0", "cpufeatures", - "digest", + "digest 0.9.0", "opaque-debug", ] +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook" version = "0.1.17" @@ -1921,62 +2651,94 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] [[package]] name = "signature" -version = "1.5.0" +version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "rand_core", +] [[package]] name = "slab" -version = "0.4.6" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] [[package]] name = "slotmap" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" dependencies = [ "version_check", ] [[package]] name = "smallvec" -version = "1.8.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.4.4" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", ] +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "sodiumoxide" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e26be3acb6c2d9a7aac28482586a7856436af4cfe7100031d219de2d2ecb0028" dependencies = [ - "ed25519", + "ed25519 1.5.3", "libc", "libsodium-sys", "serde", ] +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -2016,7 +2778,7 @@ dependencies = [ "heck 0.3.3", "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", + "syn 1.0.109", ] [[package]] @@ -2028,7 +2790,7 @@ dependencies = [ "heck 0.3.3", "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", + "syn 1.0.109", ] [[package]] @@ -2050,9 +2812,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.95" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", @@ -2070,6 +2832,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "synstructure" version = "0.12.6" @@ -2078,8 +2846,29 @@ checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", - "unicode-xid 0.2.3", + "syn 1.0.109", + "unicode-xid 0.2.6", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.2.1", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", ] [[package]] @@ -2093,7 +2882,7 @@ dependencies = [ "strum 0.18.0", "strum_macros 0.18.0", "thiserror", - "toml 0.5.9", + "toml 0.5.11", "version-compare 0.0.10", ] @@ -2106,27 +2895,26 @@ dependencies = [ "anyhow", "cfg-expr", "heck 0.3.3", - "itertools 0.10.3", + "itertools 0.10.5", "pkg-config", "strum 0.21.0", "strum_macros 0.21.1", "thiserror", - "toml 0.5.9", + "toml 0.5.11", "version-compare 0.0.11", ] [[package]] name = "tempfile" -version = "3.3.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if 1.0.0", - "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi", + "fastrand 2.1.1", + "once_cell", + "rustix 0.38.37", + "windows-sys 0.59.0", ] [[package]] @@ -2143,32 +2931,75 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", + "syn 2.0.77", ] [[package]] -name = "time" -version = "0.1.43" +name = "tinyvec" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +dependencies = [ + "backtrace", + "bytes", "libc", - "winapi", + "mio", + "pin-project-lite", + "socket2 0.5.7", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", ] [[package]] @@ -2182,9 +3013,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] @@ -2198,7 +3029,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.22.21", ] [[package]] @@ -2212,46 +3043,118 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.18", ] [[package]] -name = "typenum" -version = "1.15.0" +name = "tower" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", +] [[package]] -name = "ucd-trie" -version = "0.1.3" +name = "tower-layer" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.0" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] [[package]] name = "unicode-segmentation" -version = "1.9.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.1.9" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-xid" @@ -2261,9 +3164,20 @@ checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] name = "unicode-xid" -version = "0.2.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] [[package]] name = "utf8parse" @@ -2271,6 +3185,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version-compare" version = "0.0.10" @@ -2285,9 +3205,9 @@ checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "void" @@ -2297,26 +3217,111 @@ checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] name = "waker-fn" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" [[package]] name = "walkdir" -version = "2.3.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", - "winapi", "winapi-util", ] [[package]] -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +name = "want" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +dependencies = [ + "cfg-if 1.0.0", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +dependencies = [ + "quote 1.0.37", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "web-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] [[package]] name = "wepoll-ffi" @@ -2345,11 +3350,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -2358,6 +3363,30 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -2376,6 +3405,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -2407,6 +3445,12 @@ dependencies = [ "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -2419,6 +3463,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -2431,6 +3481,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -2449,6 +3505,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -2461,6 +3523,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -2473,6 +3541,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -2485,6 +3559,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -2497,6 +3577,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + [[package]] name = "winnow" version = "0.6.18" @@ -2506,6 +3595,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if 1.0.0", + "windows-sys 0.48.0", +] + [[package]] name = "xi-unicode" version = "0.1.0" @@ -2550,13 +3649,40 @@ version = "2.0.0-beta.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf0fa91321143695013cb3fa62a6395dbe14eafd97ab58c2ba73f61d5035b1d9" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate 1.3.1", "proc-macro2 1.0.86", "quote 1.0.37", "regex", - "syn 1.0.95", + "syn 1.0.109", ] +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + [[package]] name = "zvariant" version = "2.10.0" @@ -2577,8 +3703,8 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4ca5e22593eb4212382d60d26350065bf2a02c34b85bc850474a74b589a3de9" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate 1.3.1", "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.95", + "syn 1.0.109", ] diff --git a/citadel-tool/Cargo.toml b/citadel-tool/Cargo.toml index 44ce36b..8cf5ca6 100644 --- a/citadel-tool/Cargo.toml +++ b/citadel-tool/Cargo.toml @@ -19,3 +19,8 @@ byteorder = "1" dbus = "0.8.4" pwhash = "1.0" tempfile = "3" +ed25519-dalek = {version = "2.1", features = ["pem"]} +anyhow = "1.0" +reqwest = {version = "0.12", features = ["blocking"]} +glob = "0.3" +serde_cbor = "0.11" diff --git a/citadel-tool/src/boot/mod.rs b/citadel-tool/src/boot/mod.rs index a049f72..ff0097c 100644 --- a/citadel-tool/src/boot/mod.rs +++ b/citadel-tool/src/boot/mod.rs @@ -8,7 +8,7 @@ use std::path::Path; mod live; mod disks; -mod rootfs; +pub mod rootfs; pub fn main(args: Vec) { if CommandLine::debug() { diff --git a/citadel-tool/src/boot/rootfs.rs b/citadel-tool/src/boot/rootfs.rs index df12750..21a907b 100644 --- a/citadel-tool/src/boot/rootfs.rs +++ b/citadel-tool/src/boot/rootfs.rs @@ -94,7 +94,7 @@ fn choose_revert_partition(best: Option) -> Option { best } -fn choose_boot_partiton(scan: bool, revert_rootfs: bool) -> Result { +pub fn choose_boot_partiton(scan: bool, revert_rootfs: bool) -> Result { let mut partitions = Partition::rootfs_partitions()?; if scan { diff --git a/citadel-tool/src/fetch/fetch.rs b/citadel-tool/src/fetch/fetch.rs new file mode 100644 index 0000000..3cd8414 --- /dev/null +++ b/citadel-tool/src/fetch/fetch.rs @@ -0,0 +1,293 @@ +use crate::{update, Path}; +use anyhow::{bail, Context, Result}; +use clap::ArgMatches; +use ed25519_dalek::{pkcs8::DecodePublicKey, VerifyingKey}; +use libcitadel::updates::UPDATE_SERVER_HOSTNAME; +use libcitadel::{updates, updates::CitadelVersionStruct}; +use libcitadel::{OsRelease, ResourceImage}; + +use std::io::prelude::*; +use std::str::FromStr; + +const UPDATE_SERVER_KEY_PATH: &str = "/etc/citadel/update_server_key.pub"; + +pub fn check() -> Result<()> { + let current_version = get_current_os_config()?; + + let server_citadel_version = fetch_and_verify_version_cbor(¤t_version)?; + + let components_to_upgrade = + compare_citadel_versions(¤t_version, &server_citadel_version)?; + + if components_to_upgrade.len() == 1 { + println!( + "We found the following component to upgrade: {}", + components_to_upgrade[0] + ); + } else if components_to_upgrade.len() > 1 { + println!("We found the following components to upgrade:"); + + for component in components_to_upgrade { + println!("{}", component); + } + } else { + println!("Your system is up to date!"); + } + + Ok(()) +} + +pub fn download(sub_matches: &ArgMatches) -> Result<()> { + let current_version = &get_current_os_config()?; + let server_citadel_version = &fetch_and_verify_version_cbor(¤t_version)?; + + let mut path = ""; + if sub_matches.get_flag("rootfs") { + path = &server_citadel_version.component_version[0].file_path; + } else if sub_matches.get_flag("kernel") { + path = &server_citadel_version.component_version[1].file_path; + } else if sub_matches.get_flag("extra") { + path = &server_citadel_version.component_version[2].file_path; + } + + download_file(path)?; + + Ok(()) +} + +pub fn read_remote() -> Result<()> { + let server_citadel_version = fetch_and_verify_version_cbor(&get_current_os_config()?)?; + + println!("Server offers:\n{server_citadel_version}"); + + Ok(()) +} + +pub fn upgrade() -> Result<()> { + // First get access to the current citadel's parameters + let current_version = &get_current_os_config()?; + let server_citadel_version = &fetch_and_verify_version_cbor(¤t_version)?; + + // What do we need to upgrade? + let components_to_upgrade = + compare_citadel_versions(¤t_version, &server_citadel_version)?; + + if components_to_upgrade.len() == 1 { + println!("We found a component to upgrade!"); + let allow_download = prompt_user_for_permission_to_download(&components_to_upgrade[0])?; + + if allow_download { + let save_path = download_file(&components_to_upgrade[0].file_path)?; + + // run citadel-update to upgrade + println!("Installing image"); + update::install_image(&save_path, 0)?; + println!("Image installed correctly"); + } else { + println!("Ok! Maybe later"); + } + } else if components_to_upgrade.len() > 1 { + println!("We found some components to upgrade!"); + for component in components_to_upgrade { + let allow_download = prompt_user_for_permission_to_download(&component)?; + + if allow_download { + let save_path = download_file(&component.file_path)?; + + println!("Installing image"); + update::install_image(&save_path, 0)?; + println!("Image installed correctly"); + } else { + println!("Ok! Maybe later"); + } + } + } else { + println!("Your system is up to date!"); + } + + Ok(()) +} + +pub fn reinstall(sub_matches: &ArgMatches) -> Result<()> { + let current_version = &get_current_os_config()?; + let server_citadel_version = &fetch_and_verify_version_cbor(¤t_version)?; + + let mut path = ""; + if sub_matches.get_flag("rootfs") { + path = &server_citadel_version.component_version[0].file_path; + } else if sub_matches.get_flag("kernel") { + path = &server_citadel_version.component_version[1].file_path; + } else if sub_matches.get_flag("extra") { + path = &server_citadel_version.component_version[2].file_path; + } + + let save_path = download_file(path)?; + update::install_image(&save_path, 0)?; + + Ok(()) +} + +/// Returns a vec of ComponentVersion structs of the components which can be upgraded +fn compare_citadel_versions( + current: &CitadelVersionStruct, + offered: &CitadelVersionStruct, +) -> Result> { + let mut update_vec: Vec = Vec::new(); + + // safety checks + if current.channel != offered.channel { + panic!("Error: channels do not match"); + } else if current.client != offered.client { + panic!("Error: clients do not match"); + } else if current.publisher != offered.publisher { + panic!("Error: publishers do not match"); + } + + for i in 0..current.component_version.len() { + if current.component_version[i] < offered.component_version[i] { + update_vec.push(offered.component_version[i].clone()); + } + } + + Ok(update_vec) +} + +// We need to get the version of the rootfs, kernel and extra images currently installed +fn get_current_os_config() -> Result { + let client = OsRelease::citadel_client().context("Failed to find client of current system")?; + let channel = OsRelease::citadel_channel().context("Failed to find channel of current system")?; + let publisher = OsRelease::citadel_publisher().context("Failed to find publisher of current system")?; + + let metainfo; + // choose best partion to boot from as the partition to compare versions with + let rootfs_version = match crate::boot::rootfs::choose_boot_partiton(false, false) { + Ok(part) => {metainfo = part.header().metainfo(); + metainfo.version() } + Err(e) => bail!("Rootfs version not found. Error: {e}"), + }; + + // Get highest values of image versions + let kernel_resource = ResourceImage::find("kernel")?.metainfo(); + let kernel_version = kernel_resource.version(); + + let extra_resource = ResourceImage::find("extra")?.metainfo(); + let extra_version = extra_resource.version(); + + let mut component_version = Vec::new(); + component_version.push(updates::AvailableComponentVersion { + component: updates::Component::Rootfs, + version: rootfs_version.to_owned(), + file_path: "".to_owned(), + }); + component_version.push(updates::AvailableComponentVersion { + component: updates::Component::Kernel, + version: kernel_version.to_owned(), + file_path: "".to_owned(), + }); + component_version.push(updates::AvailableComponentVersion { + component: updates::Component::Extra, + version: extra_version.to_owned(), + file_path: "".to_owned(), + }); + + let current_version_struct = updates::CitadelVersionStruct { + client: client.to_owned(), + channel: channel.to_owned(), + component_version, + publisher: publisher.to_owned(), + }; + + Ok(current_version_struct) +} + +fn fetch_and_verify_version_cbor( + current_citadel_version: &updates::CitadelVersionStruct, +) -> Result { + let url = format!( + "https://{}/{}/{}/version.cbor", + UPDATE_SERVER_HOSTNAME, current_citadel_version.client, current_citadel_version.channel + ); + + let version_file_bytes = reqwest::blocking::get(&url)? + .bytes() + .context(format!("Failed to get version_file_bytes from {url}"))?; + + let crypto_container: updates::CryptoContainerFile = + serde_cbor::from_slice(&version_file_bytes) + .context(format!("Failed to parse version.cbor from {}", url))?; + + // find update server public key kept in the rootfs + let mut file = std::fs::File::open(UPDATE_SERVER_KEY_PATH).context(format!( + "Failed to open update_server_key file from {}", + UPDATE_SERVER_KEY_PATH + ))?; + + let mut contents = String::new(); + file.read_to_string(&mut contents)?; + + let public_key = VerifyingKey::from_public_key_pem(&contents) + .context("Failed to parse public key from file.")?; + + let signature = ed25519_dalek::Signature::from_str(&crypto_container.signature)?; + + // verify signature + public_key.verify_strict(&crypto_container.serialized_citadel_version, &signature) + .context("We failed to verify the signature update release file. Please make sure the key at /etc/citade/update_server_key.pub matches the one publicly linked to your update provider.")?; + + // construct the struct + let citadel_version_struct: updates::CitadelVersionStruct = + serde_cbor::from_slice(&crypto_container.serialized_citadel_version)?; + + Ok(citadel_version_struct) +} + +fn prompt_user_for_permission_to_download( + component: &updates::AvailableComponentVersion, +) -> Result { + println!( + "Would you like to download and install the new version of the {} image with version {}? (y/n)", + component.component, component.version + ); + + loop { + let stdin = std::io::stdin(); + let mut user_input = String::new(); + + stdin.read_line(&mut user_input)?; + + if user_input.trim() == "y" { + return Ok(true); + } else { + return Ok(false); + } + } +} + +fn download_file(path: &str) -> Result { + let client = reqwest::blocking::Client::new(); + + let url = format!("https://{UPDATE_SERVER_HOSTNAME}/{path}"); + println!("Downloading from {url}"); + + let component_download_response = client.get(&url).send()?; + + if !component_download_response.status().is_success() { + anyhow::bail!( + "Failed to download image from {}. Server returned error {}", + path, + component_download_response.status() + ); + } + + let path = Path::new(path); + let path = format!("/tmp/{}", path.file_name().unwrap().to_str().unwrap()); + + let mut content = std::io::Cursor::new(component_download_response.bytes()?); + let mut file = + std::fs::File::create(&path).context(format!("Failed to create file at {path}"))?; + std::io::copy(&mut content, &mut file)?; + + println!("Saved file to {path}"); + + Ok(std::path::PathBuf::from(path)) +} diff --git a/citadel-tool/src/fetch/mod.rs b/citadel-tool/src/fetch/mod.rs new file mode 100644 index 0000000..3437dd0 --- /dev/null +++ b/citadel-tool/src/fetch/mod.rs @@ -0,0 +1,55 @@ +use clap::{arg, command, ArgAction, Command}; +use std::process::exit; +use libcitadel::util; + +mod fetch; + +pub fn main() { + if !util::is_euid_root() { + println!("Please run this program as root"); + exit(1); + } + + let matches = command!() + .subcommand_required(true) + .subcommand(Command::new("check").about("Check for updates from remote server")) + .subcommand( + Command::new("download") + .about("Download a specific file from the server") + .arg(arg!(-r --rootfs "rootfs component").action(ArgAction::SetTrue)) + .arg(arg!(-k --kernel "kernel component").action(ArgAction::SetTrue)) + .arg(arg!(-e --extra "extra component").action(ArgAction::SetTrue)) + .arg_required_else_help(true), + ) + .subcommand( + Command::new("read-remote") + .about("Read the remote server and print information on versions offered"), + ) + .subcommand( + Command::new("upgrade") + .about("Download and install all components found on the server to be more recent than currently installed on system") + ) + .subcommand( + Command::new("reinstall") + .about("Download and install a specific component even if the server's component version is not greater than currently installed") + .arg(arg!(-r --rootfs "rootfs component").action(ArgAction::SetTrue)) + .arg(arg!(-k --kernel "kernel component").action(ArgAction::SetTrue)) + .arg(arg!(-e --extra "extra component").action(ArgAction::SetTrue)) + .arg_required_else_help(true), + ) + .get_matches(); + + let result = match matches.subcommand() { + Some(("check", _sub_matches)) => fetch::check(), + Some(("download", sub_matches)) => fetch::download(sub_matches), + Some(("read-remote", _sub_matches)) => fetch::read_remote(), + Some(("upgrade", _sub_matches)) => fetch::upgrade(), + Some(("reinstall", sub_matches)) => fetch::reinstall(sub_matches), + _ => unreachable!("Please pass a subcommand"), + }; + + if let Err(ref e) = result { + println!("Error: {}", e); + exit(1); + } +} \ No newline at end of file diff --git a/citadel-tool/src/main.rs b/citadel-tool/src/main.rs index 7db6955..10de0e2 100644 --- a/citadel-tool/src/main.rs +++ b/citadel-tool/src/main.rs @@ -16,6 +16,7 @@ mod mkimage; mod realmfs; mod sync; mod update; +mod fetch; fn main() { let exe = match env::current_exe() { @@ -39,6 +40,8 @@ fn main() { realmfs::main(); } else if exe == Path::new("/usr/bin/citadel-update") { update::main(args); + } else if exe == Path::new("/usr/bin/citadel-fetch") { + fetch::main(); } else if exe == Path::new("/usr/libexec/citadel-desktop-sync") { sync::main(args); } else if exe == Path::new("/usr/libexec/citadel-run") { @@ -60,6 +63,7 @@ fn dispatch_command(args: Vec) { "image" => image::main(), "realmfs" => realmfs::main(), "update" => update::main(rebuild_args("citadel-update", args)), + "fetch" => update::main(rebuild_args("citadel-fetch", args)), "mkimage" => mkimage::main(rebuild_args("citadel-mkimage", args)), "sync" => sync::main(rebuild_args("citadel-desktop-sync", args)), "run" => do_citadel_run(rebuild_args("citadel-run", args)), diff --git a/libcitadel/Cargo.toml b/libcitadel/Cargo.toml index 898ab6a..1239e46 100644 --- a/libcitadel/Cargo.toml +++ b/libcitadel/Cargo.toml @@ -21,6 +21,7 @@ dbus = "0.6" posix-acl = "1.0.0" procfs = "0.12.0" semver = "1.0" +clap = "4.5" [dependencies.inotify] version = "0.8" diff --git a/libcitadel/src/config.rs b/libcitadel/src/config.rs index 621a305..b27727a 100644 --- a/libcitadel/src/config.rs +++ b/libcitadel/src/config.rs @@ -84,8 +84,8 @@ impl OsRelease { OsRelease::get_value("CITADEL_IMAGE_PUBKEY") } - pub fn citadel_rootfs_version() -> Option { - OsRelease::get_int_value("CITADEL_ROOTFS_VERSION") + pub fn citadel_rootfs_version() -> Option<&'static str> { + OsRelease::get_value("CITADEL_ROOTFS_VERSION") } pub fn citadel_kernel_version() -> Option<&'static str> { @@ -96,6 +96,14 @@ impl OsRelease { OsRelease::get_value("CITADEL_KERNEL_ID") } + pub fn citadel_client() -> Option<&'static str> { + OsRelease::get_value("CITADEL_CLIENT") + } + + pub fn citadel_publisher() -> Option<&'static str> { + OsRelease::get_value("CITADEL_PUBLISHER") + } + fn _get_value(&self, key: &str) -> Option<&str> { self.vars.get(key).map(|v| v.as_str()) } diff --git a/libcitadel/src/lib.rs b/libcitadel/src/lib.rs index 23849e8..653fa51 100644 --- a/libcitadel/src/lib.rs +++ b/libcitadel/src/lib.rs @@ -20,6 +20,7 @@ pub mod symlink; mod realm; pub mod terminal; mod system; +pub mod updates; pub mod flatpak; diff --git a/libcitadel/src/resource.rs b/libcitadel/src/resource.rs index 452f465..c5de818 100644 --- a/libcitadel/src/resource.rs +++ b/libcitadel/src/resource.rs @@ -40,6 +40,11 @@ impl ResourceImage { pub fn find(image_type: &str) -> Result { let channel = Self::rootfs_channel(); + // search when citadel is installed + if let Some(image) = search_directory(format!("/storage/resources/{channel}/"), image_type, Some(&channel))? { + return Ok(image); + } + info!("Searching run directory for image {} with channel {}", image_type, channel); if let Some(image) = search_directory(RUN_DIRECTORY, image_type, Some(&channel))? { @@ -353,6 +358,11 @@ impl ResourceImage { if Mounts::is_source_mounted("/dev/mapper/citadel-storage")? { return Ok(true); } + + if Mounts::is_source_mounted("/storage")? { + return Ok(true); + } + let path = Path::new("/dev/mapper/citadel-storage"); if !path.exists() { return Ok(false); @@ -524,8 +534,14 @@ fn maybe_add_dir_entry(entry: &DirEntry, return Ok(()) } - if image_type == "kernel" && (metainfo.kernel_version() != kernel_version || metainfo.kernel_id() != kernel_id) { - return Ok(()); + if kernel_id.is_some() { + if image_type == "kernel" && (metainfo.kernel_version() != kernel_version || metainfo.kernel_id() != kernel_id) { + return Ok(()); + } + } else { // in live mode, kernel_id is None + if image_type == "kernel" && metainfo.kernel_version() != kernel_version { + return Ok(()); + } } images.push(ResourceImage::new(&path, header)); diff --git a/libcitadel/src/system/mounts.rs b/libcitadel/src/system/mounts.rs index c0529a1..37d12b2 100644 --- a/libcitadel/src/system/mounts.rs +++ b/libcitadel/src/system/mounts.rs @@ -15,11 +15,12 @@ impl Mounts { pub fn is_source_mounted>(path: P) -> Result { let path = path.as_ref(); - let mounted = Self::load()? - .mounts() - .any(|m| m.source_path() == path); - - Ok(mounted) + for i in Self::load()?.mounts() { + if i.line.contains(&path.display().to_string()) { + return Ok(true) + } + } + Ok(false) } pub fn is_target_mounted>(path: P) -> Result { diff --git a/libcitadel/src/updates.rs b/libcitadel/src/updates.rs new file mode 100644 index 0000000..4a40bc5 --- /dev/null +++ b/libcitadel/src/updates.rs @@ -0,0 +1,97 @@ +use std::fmt; +use std::slice::Iter; + +pub const UPDATE_SERVER_HOSTNAME: &str = "update.subgraph.com"; + +/// This struct embeds the CitadelVersion datastruct as well as the cryptographic validation of the that information +#[derive(Debug, Serialize, Deserialize)] +pub struct CryptoContainerFile { + pub serialized_citadel_version: Vec, // we serialize CitadelVersion + pub signature: String, // serialized CitadelVersion gets signed + pub signatory: String, // name of org or person who holds the key +} + +/// This struct contains the entirety of the information needed to decide whether to update or not +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +pub struct CitadelVersionStruct { + pub client: String, + pub channel: String, // dev, prod ... + pub component_version: Vec, + pub publisher: String, // name of org or person who released this update +} + +impl std::fmt::Display for CitadelVersionStruct { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!( + f, + "{} image with channel {} has components:\n", + self.client, self.channel + )?; + + for i in &self.component_version { + write!( + f, + "\n{} with version {} at location {}", + i.component, i.version, i.file_path + )?; + } + Ok(()) + } +} + +#[derive(Debug, Serialize, Clone, Deserialize, PartialEq, Eq, Ord)] +pub struct AvailableComponentVersion { + pub component: Component, // rootfs, kernel or extra + pub version: String, // stored as semver + pub file_path: String, +} + +impl PartialOrd for AvailableComponentVersion { + fn partial_cmp(&self, other: &Self) -> Option { + // absolutely require that the components be in the same order in all structs (rootfs, kernel, extra) + if &self.component != &other.component { + panic!("ComponentVersion comparison failed because comparing different components"); + } + + Some( + semver::Version::parse(&self.version) + .unwrap() + .cmp(&semver::Version::parse(&other.version).unwrap()), + ) + } +} + +impl std::fmt::Display for AvailableComponentVersion { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!( + f, + "{} image has version {}", + self.component, self.version + ) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Deserialize, Serialize, clap::ValueEnum)] +pub enum Component { + Rootfs, + Kernel, + Extra, +} + +impl Component { + pub fn iterator() -> Iter<'static, Component> { + static COMPONENTS: [Component; 3] = + [Component::Rootfs, Component::Kernel, Component::Extra]; + COMPONENTS.iter() + } +} + +impl fmt::Display for Component { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Component::Rootfs => write!(f, "rootfs"), + Component::Kernel => write!(f, "kernel"), + &Component::Extra => write!(f, "extra"), + } + } +} diff --git a/update-generator/src/main.rs b/update-generator/src/main.rs new file mode 100644 index 0000000..da5dd3d --- /dev/null +++ b/update-generator/src/main.rs @@ -0,0 +1,529 @@ +use anyhow::{Context, Result}; +use clap::{Parser, Subcommand}; +use ed25519_dalek::pkcs8::DecodePublicKey; +use ed25519_dalek::pkcs8::EncodePublicKey; +use ed25519_dalek::Signature; +use ed25519_dalek::Signer; +use ed25519_dalek::SigningKey; +use ed25519_dalek::VerifyingKey; +use ed25519_dalek::KEYPAIR_LENGTH; +use glob::glob; +use libcitadel::updates::Component; +use libcitadel::{updates, ImageHeader}; +use rand::rngs::OsRng; +use sodiumoxide::crypto::pwhash; +use sodiumoxide::crypto::secretbox; +use sodiumoxide::crypto::stream; +use std::env; +use std::io::{Read, Write}; +use std::path::Path; +use std::path::PathBuf; +use std::process::Command; +use std::str::FromStr; +use zeroize::Zeroize; + +const SALSA_NONCE: &[u8] = &[ + 116, 138, 142, 103, 234, 105, 192, 48, 117, 29, 150, 214, 106, 116, 195, 64, 120, 251, 94, 20, + 212, 118, 125, 189, +]; + +const PASSWORD_SALT: &[u8] = &[ + 18, 191, 168, 237, 156, 199, 54, 43, 122, 165, 35, 9, 89, 106, 36, 209, 145, 161, 90, 2, 121, + 51, 242, 182, 14, 245, 47, 253, 237, 153, 251, 219, +]; + +const LAST_RESORT_CLIENT: &str = "public"; +const LAST_RESORT_CHANNEL: &str = "prod"; + +#[derive(Parser)] +#[command(about = "Perform tasks needed to create an update and publish it")] +#[command(author, about, long_about = None)] +struct Cli { + #[command(subcommand)] + command: Option, +} + +#[derive(Subcommand, Debug)] +#[command(arg_required_else_help = true)] +enum Commands { + /// Generate a keypair to be used to sign version file. You will be asked to provide a mandatory password. + GenerateKeypair { + /// keypair filepath to save to + #[arg(short, long)] + keypair_filepath: Option, + }, + + /// Generate the complete cbor file. If no components are passed, generate by reading image of each component + CreateSignedFile { + /// rootfs image semver version + #[arg(short, long)] + rootfs_image_version: Option, + /// kernel image semver version + #[arg(short, long)] + kernel_image_version: Option, + #[arg(short, long)] + extra_image_version: Option, + /// keypair filepath + #[arg(short, long, value_name = "FILE")] + path_keypair: Option, + /// command output complete filepath + #[arg(short, long, value_name = "FILE")] + versionfile_filepath: Option, + }, + + /// Verify that the version file is correctly signed + VerifySignature { + /// public key filepath + #[arg(short, long, value_name = "FILE")] + publickey_filepath: Option, + /// command output complete filepath + #[arg(short, long, value_name = "FILE")] + versionfile_filepath: Option, + }, + + UploadToServer { + #[arg(long)] + component: Option, + path: Option, + }, +} + +fn main() -> Result<()> { + let cli = Cli::parse(); + + match &cli.command { + Some(Commands::GenerateKeypair { keypair_filepath }) => { + generate_keypair(keypair_filepath).context("Failed to generate keypair")? + } + Some(Commands::CreateSignedFile { + path_keypair, + rootfs_image_version, + kernel_image_version, + extra_image_version, + versionfile_filepath, + }) => create_signed_version_file( + path_keypair, + rootfs_image_version, + kernel_image_version, + extra_image_version, + versionfile_filepath, + ) + .context("Failed to create signed file")?, + Some(Commands::VerifySignature { + publickey_filepath, + versionfile_filepath, + }) => verify_version_signature(publickey_filepath, versionfile_filepath) + .context("Failed to verify signature")?, + Some(Commands::UploadToServer { component, path }) => { + upload_components_to_server(component, path) + .context("Failed to upload to the server")? + } + None => {} + } + + Ok(()) +} + +fn generate_keypair(keypair_filepath: &Option) -> Result<()> { + // if the user did not pass a path, we save key files to current directory + let keypair_filepath = &keypair_filepath.clone().unwrap_or_else(|| ".".to_string()); + let path = std::path::Path::new(keypair_filepath); + + let mut password; + + loop { + // get passphrase used to encrypt key from user + password = rpassword::prompt_password( + "Please enter the passphrase we will use to encrypt the private key with: ", + ) + .unwrap(); + + let password_confirm = rpassword::prompt_password("Retype same passphrase: ").unwrap(); + + if password != password_confirm { + println!("\nPassphrases did not match. Please try again") + } else { + break; + } + } + + // generate keypair + let mut csprng = OsRng; + let signing_key: SigningKey = SigningKey::generate(&mut csprng); + + let keypair_fp: PathBuf; + let publickey_fp: PathBuf; + + if path.is_dir() { + keypair_fp = path.join("keypair.priv"); + publickey_fp = path.join("update_server_key.pub"); + } else { + keypair_fp = path.to_path_buf(); + publickey_fp = path.parent().unwrap().join("update_server_key.pub"); + } + + let mut keyfile = std::fs::File::create(&keypair_fp)?; + let mut public_key = std::fs::File::create(&publickey_fp)?; + + // encrypt private key + let mut k = secretbox::Key([0; secretbox::KEYBYTES]); + + let secretbox::Key(ref mut kb) = k; + let password_hash = pwhash::derive_key( + kb, + password.as_bytes(), + &sodiumoxide::crypto::pwhash::scryptsalsa208sha256::Salt::from_slice(PASSWORD_SALT) + .unwrap(), + pwhash::OPSLIMIT_INTERACTIVE, + pwhash::MEMLIMIT_INTERACTIVE, + ) + .unwrap(); + + let plaintext = signing_key.to_keypair_bytes(); + let key = sodiumoxide::crypto::stream::xsalsa20::Key::from_slice(password_hash) + .expect("failed to unwrap key"); + let nonce = sodiumoxide::crypto::stream::xsalsa20::Nonce::from_slice(SALSA_NONCE) + .expect("failed to unwrap nonce"); + + // encrypt the plaintext + let ciphertext = stream::stream_xor(&plaintext, &nonce, &key); + + keyfile.write_all(&ciphertext)?; + public_key.write_all( + &signing_key + .verifying_key() + .to_public_key_pem(ed25519_dalek::pkcs8::spki::der::pem::LineEnding::LF) + .unwrap() + .as_bytes(), + )?; + + password.zeroize(); + + println!( + "Generated the keypair and wrote to {}. The public key is here: {}", + keypair_fp.display(), + publickey_fp.display() + ); + println!( + "You may now move the public key from {} to the citadel build path at citadel/meta-citadel/recipes-citadel/citadel-config/files/citadel-fetch/update_server_key.pub", + publickey_fp.display() + ); + + Ok(()) +} + +fn create_signed_version_file( + signing_key_path: &Option, + citadel_rootfs_version: &Option, + citadel_kernel_version: &Option, + citadel_extra_version: &Option, + versionfile_filepath: &Option, +) -> Result<()> { + let rootfs_version = match citadel_rootfs_version { + Some(v) => semver::Version::parse(v) + .expect("Error: Failed to parse rootfs semver version") + .to_string(), + None => get_imageheader_version(&Component::Rootfs).unwrap_or(String::from("0.0.0")), + }; + + let kernel_version = match citadel_kernel_version { + Some(v) => semver::Version::parse(v) + .expect("Error: Failed to parse kernel semver version") + .to_string(), + None => get_imageheader_version(&Component::Kernel).unwrap_or(String::from("0.0.0")), + }; + + let extra_version = match citadel_extra_version { + Some(v) => semver::Version::parse(v) + .expect("Error: Failed to parse extra semver version") + .to_string(), + None => get_imageheader_version(&Component::Extra).unwrap_or(String::from("0.0.0")), + }; + + let rootfs_path = get_component_path(&Component::Rootfs); + let channel; + + if rootfs_path.is_ok() { + channel = match ImageHeader::from_file(rootfs_path?) { + Ok(image_header) => image_header.metainfo().channel().to_string(), + Err(_) => env::var("UPDATES_CHANNEL").unwrap_or(LAST_RESORT_CHANNEL.to_string()), + }; + } else { + channel = env::var("UPDATES_CHANNEL").unwrap_or(LAST_RESORT_CHANNEL.to_string()); + } + + let component_version_vector = vec![ + updates::AvailableComponentVersion { + component: updates::Component::Rootfs, + version: rootfs_version.clone(), + file_path: format!( + "{}/{}/{}_{}.img", + env::var("UPDATES_CLIENT").unwrap_or(LAST_RESORT_CLIENT.to_string()), + channel, + "rootfs", + rootfs_version + ) + .to_string(), + }, + updates::AvailableComponentVersion { + component: updates::Component::Kernel, + version: kernel_version.clone(), + file_path: format!( + "{}/{}/{}_{}.img", + env::var("UPDATES_CLIENT").unwrap_or(LAST_RESORT_CLIENT.to_string()), + channel, + "kernel", + kernel_version + ) + .to_string(), + }, + updates::AvailableComponentVersion { + component: updates::Component::Extra, + version: extra_version.clone(), + file_path: format!( + "{}/{}/{}_{}.img", + env::var("UPDATES_CLIENT").unwrap_or(LAST_RESORT_CLIENT.to_string()), + channel, + "extra", + extra_version + ) + .to_string(), + }, + ]; + + // generate version file + let citadel_version = updates::CitadelVersionStruct { + client: env::var("UPDATES_CLIENT").unwrap_or(LAST_RESORT_CLIENT.to_string()), + channel: channel.to_string(), + component_version: component_version_vector, + publisher: "Subgraph".to_string(), + }; + + let fp = match signing_key_path { + Some(fp) => Path::new(fp), + None => Path::new("keypair.priv"), + }; + + // serialized to cbor + let serialized_citadel_version = serde_cbor::to_vec(&citadel_version)?; + + // get signing_key_bytes from the file passed + let mut keyfile = std::fs::File::open(&fp)?; + let mut buf = [0; KEYPAIR_LENGTH]; + keyfile.read_exact(&mut buf)?; + + // prompt user for keypair decryption password + let mut password = + rpassword::prompt_password("Please enter the passphrase used to decrypt the private key: ") + .unwrap(); + + // decrypt private key + let mut k = secretbox::Key([0; secretbox::KEYBYTES]); + + let secretbox::Key(ref mut kb) = k; + let password_hash = pwhash::derive_key( + kb, + password.as_bytes(), + &sodiumoxide::crypto::pwhash::scryptsalsa208sha256::Salt::from_slice(PASSWORD_SALT) + .unwrap(), + pwhash::OPSLIMIT_INTERACTIVE, + pwhash::MEMLIMIT_INTERACTIVE, + ) + .unwrap(); + + let key = sodiumoxide::crypto::stream::xsalsa20::Key::from_slice(password_hash) + .expect("failed to unwrap key"); + let nonce = sodiumoxide::crypto::stream::xsalsa20::Nonce::from_slice(SALSA_NONCE) + .expect("failed to unwrap nonce"); + + // decrypt the ciphertext + let plaintext = stream::stream_xor(&buf, &nonce, &key); + + let signing_key = SigningKey::from_keypair_bytes(plaintext[0..64].try_into()?)?; + + // sign serialized_citadel_version for inclusion in version_file + let signature: Signature = signing_key.sign(&serialized_citadel_version); + + // generate signature of citadel_version cbor format (signed) + let version_file = updates::CryptoContainerFile { + serialized_citadel_version, + signature: signature.to_string(), + signatory: "Subgraph".to_string(), + }; + + let vf_fp = match versionfile_filepath { + Some(vf_fp) => { + if Path::new(vf_fp).is_dir() { + Path::new(vf_fp).join("version.cbor") + } else { + Path::new(vf_fp).to_path_buf() + } + } + None => Path::new("version.cbor").to_path_buf(), + }; + + let outfile = std::fs::File::create(&vf_fp)?; + + serde_cbor::to_writer(outfile, &version_file)?; + + password.zeroize(); + + Ok(()) +} + +/// Validate that the completed version file correctly verifies given the self-embedded signature and public key +fn verify_version_signature( + pubkey_filepath: &Option, + versionfile_filepath: &Option, +) -> Result<()> { + let pub_fp = match pubkey_filepath { + Some(pub_fp) => Path::new(pub_fp), + None => Path::new("update_server_key.pub"), + }; + + let version_fp = match versionfile_filepath { + Some(version_fp) => Path::new(version_fp), + None => Path::new("version.cbor"), + }; + + let mut pubkey_file = std::fs::File::open(&pub_fp)?; + + let mut buf = String::new(); + pubkey_file.read_to_string(&mut buf)?; + + let verifying_key = VerifyingKey::from_public_key_pem(&buf)?; + + let version_file = &std::fs::File::open(version_fp)?; + let crypto_container_struct: updates::CryptoContainerFile = + serde_cbor::from_reader(version_file)?; + + let citadel_version_struct: updates::CitadelVersionStruct = + serde_cbor::from_slice(&crypto_container_struct.serialized_citadel_version)?; + + let signature = ed25519_dalek::Signature::from_str(&crypto_container_struct.signature)?; + + match verifying_key.verify_strict( + &crypto_container_struct.serialized_citadel_version, + &signature, + ) { + Ok(_) => println!("Everythin ok. Signature verified correctly"), + Err(e) => panic!( + "Error: Signature was not able to be verified! Threw error: {}", + e + ), + } + + println!( + "The destructured version file contains the following information:\n{}", + citadel_version_struct + ); + + Ok(()) +} + +// Make sure to add your ssh key to the "updates" user on the server +fn send_with_scp(from: &PathBuf, to: &PathBuf) -> Result<()> { + Command::new("scp") + .arg(from) + .arg(format!( + "updates@{}:/updates/files/{}", + updates::UPDATE_SERVER_HOSTNAME, + to.to_string_lossy() + )) + .spawn() + .context("scp command failed to run")?; + + Ok(()) +} + +fn get_imageheader_version(component: &Component) -> Result { + let version = match ImageHeader::from_file(get_component_path(component)?) { + Ok(image_header) => image_header.metainfo().version().to_string(), + Err(_) => String::from("0.0.0"), + }; + + Ok(version) +} + +fn get_component_path(component: &updates::Component) -> Result { + let mut gl = match component { + Component::Rootfs => glob("../build/images/citadel-rootfs*.img")?, + Component::Kernel => glob("../build/images/citadel-kernel*.img")?, + Component::Extra => glob("../build/images/citadel-extra*.img")?, + }; + + let first = gl.nth(0).context(format!( + "Failed to find citadel-{}*.img in ../build/images/", + component + ))?; + + Ok(PathBuf::from(first?)) +} + +fn upload_all_components() -> Result<()> { + for component in updates::Component::iterator() { + upload_component(component, &None)? + } + upload_cbor()?; + + Ok(()) +} + +fn upload_component(component: &updates::Component, path: &Option) -> Result<()> { + let final_path; + + // uggliest if statement i've ever written + // if path was passed to this function + if let Some(p) = path { + final_path = p.to_path_buf(); + } else { + // if the path wasn't passed to this function, search for the component path + if let Ok(p) = get_component_path(&component) { + final_path = p; + } else { + // if path was not passed and we failed to locate the component's path + println!( + "We failed to find the {} image we were looking for... Skipping...", + component + ); + return Ok(()); + } + } + + let image_header = libcitadel::ImageHeader::from_file(&final_path)?; + + let to = PathBuf::from(format!( + "{}/{}/{}_{}.img", + env::var("UPDATES_CLIENT").unwrap_or(LAST_RESORT_CLIENT.to_string()), + env::var("UPDATES_CHANNEL").unwrap_or(LAST_RESORT_CHANNEL.to_string()), + component, + image_header.metainfo().version() + )); + send_with_scp(&final_path, &to) +} + +// If no parameters are passed to this command, upload all components regardless of version on the server +// If a path is passed, upload that image to the server regardless version. +fn upload_components_to_server( + component: &Option, + path: &Option, +) -> Result<()> { + // check if a component is passed to this function: + match component { + Some(comp) => upload_component(comp, path)?, // This function handles the option of not passing a path + None => upload_all_components()?, + } + + Ok(()) +} + +fn upload_cbor() -> Result<()> { + send_with_scp( + &PathBuf::from("version.cbor"), + &PathBuf::from(format!( + "{}/{}/version.cbor", + env::var("UPDATES_CLIENT").unwrap_or(LAST_RESORT_CLIENT.to_string()), + env::var("UPDATES_CHANNEL").unwrap_or(LAST_RESORT_CHANNEL.to_string()), + )), + ) +}