From ab6ca8e16a1c308a33edc64a26eda6c7832c0bef Mon Sep 17 00:00:00 2001 From: Dominion5254 Date: Wed, 4 Jun 2025 19:41:21 -0600 Subject: [PATCH] Bugfix/ssl proxy to ssl (#2956) * fix registry rm command * fix bind with addSsl on ssl proto * fix bind with addSsl on ssl proto * Add pre-release version migrations * fix os build * add mime to package deps * update lockfile * more ssl fixes * add waitFor * improve restart lockup * beta.26 * fix dependency health check logic * handle missing health check * fix port forwards --------- Co-authored-by: Aiden McClelland --- Makefile | 12 +- build/lib/scripts/forward-port | 34 +- container-runtime/package-lock.json | 30 +- container-runtime/package.json | 1 + .../Systems/SystemForEmbassy/index.ts | 14 + core/Cargo.lock | 1049 ++++++++--------- core/startos/src/backup/target/mod.rs | 76 +- core/startos/src/context/cli.rs | 5 + core/startos/src/control.rs | 2 +- core/startos/src/db/model/public.rs | 3 +- core/startos/src/disk/mount/backup.rs | 22 +- .../src/disk/mount/filesystem/idmapped.rs | 26 +- core/startos/src/lxc/mod.rs | 6 - core/startos/src/net/forward.rs | 183 ++- core/startos/src/net/net_controller.rs | 2 +- core/startos/src/net/service_interface.rs | 35 +- core/startos/src/s9pk/v2/compat.rs | 18 +- core/startos/src/service/effects/control.rs | 2 +- .../startos/src/service/effects/dependency.rs | 5 - core/startos/src/service/effects/net/ssl.rs | 47 +- core/startos/src/service/fake.cert.key | 5 - core/startos/src/service/fake.cert.pem | 13 - core/startos/src/service/mod.rs | 36 +- .../src/service/persistent_container.rs | 24 - .../startos/src/service/transition/restart.rs | 17 +- core/startos/src/util/actor/concurrent.rs | 111 +- core/startos/src/util/actor/mod.rs | 3 + core/startos/src/version/mod.rs | 1 + core/startos/src/version/v0_4_0_alpha_5.rs | 1 - sdk/base/lib/dependencies/dependencies.ts | 27 +- sdk/base/lib/interfaces/Host.ts | 27 +- sdk/base/lib/util/GetSystemSmtp.ts | 26 + sdk/base/lib/util/getServiceInterface.ts | 30 + sdk/base/lib/util/getServiceInterfaces.ts | 29 + sdk/package/lib/StartSdk.ts | 20 + sdk/package/lib/backup/Backups.ts | 2 + sdk/package/lib/util/GetSslCertificate.ts | 28 + sdk/package/lib/util/fileHelper.ts | 48 +- sdk/package/package-lock.json | 32 +- sdk/package/package.json | 4 +- 40 files changed, 1240 insertions(+), 816 deletions(-) mode change 100644 => 100755 build/lib/scripts/forward-port delete mode 100644 core/startos/src/service/fake.cert.key delete mode 100644 core/startos/src/service/fake.cert.pem diff --git a/Makefile b/Makefile index 80d3c65b5..bdddf2edb 100644 --- a/Makefile +++ b/Makefile @@ -222,7 +222,11 @@ upload-ota: results/$(BASENAME).squashfs container-runtime/debian.$(ARCH).squashfs: ./container-runtime/download-base-image.sh ARCH=$(ARCH) ./container-runtime/download-base-image.sh -container-runtime/node_modules/.package-lock.json: container-runtime/package.json container-runtime/package-lock.json sdk/dist/package.json +container-runtime/package-lock.json: sdk/dist/package.json + npm --prefix container-runtime i + touch container-runtime/package-lock.json + +container-runtime/node_modules/.package-lock.json: container-runtime/package-lock.json npm --prefix container-runtime ci touch container-runtime/node_modules/.package-lock.json @@ -277,7 +281,11 @@ core/target/$(ARCH)-unknown-linux-musl/release/containerbox: $(CORE_SRC) $(ENVIR ARCH=$(ARCH) ./core/build-containerbox.sh touch core/target/$(ARCH)-unknown-linux-musl/release/containerbox -web/node_modules/.package-lock.json: web/package.json sdk/baseDist/package.json +web/package-lock.json: web/package.json sdk/baseDist/package.json + npm --prefix web i + touch web/package-lock.json + +web/node_modules/.package-lock.json: web/package-lock.json npm --prefix web ci touch web/node_modules/.package-lock.json diff --git a/build/lib/scripts/forward-port b/build/lib/scripts/forward-port old mode 100644 new mode 100755 index 0f92f81d4..7b8aedac9 --- a/build/lib/scripts/forward-port +++ b/build/lib/scripts/forward-port @@ -1,18 +1,26 @@ #!/bin/bash -iptables -F -iptables -t nat -F +if [ -z "$iiface" ] || [ -z "$oiface" ] || [ -z "$sip" ] || [ -z "$dip" ] || [ -z "$sport" ] || [ -z "$dport" ]; then + >&2 echo 'missing required env var' + exit 1 +fi -iptables -t nat -A POSTROUTING -o $iiface -j MASQUERADE -iptables -t nat -A PREROUTING -i $iiface -p tcp --dport $sport -j DNAT --to-destination $dip:$dport -iptables -t nat -A PREROUTING -i $iiface -p udp --dport $sport -j DNAT --to-destination $dip:$dport -iptables -t nat -A PREROUTING -i $oiface -s 10.0.3.0/24 -d $sip -p tcp --dport $sport -j DNAT --to-destination $dip:$dport -iptables -t nat -A PREROUTING -i $oiface -s 10.0.3.0/24 -d $sip -p udp --dport $sport -j DNAT --to-destination $dip:$dport -iptables -t nat -A POSTROUTING -o $oiface -s 10.0.3.0/24 -d $dip/32 -p tcp --dport $dport -j SNAT --to-source $sip:$sport -iptables -t nat -A POSTROUTING -o $oiface -s 10.0.3.0/24 -d $dip/32 -p udp --dport $dport -j SNAT --to-source $sip:$sport +kind="-A" + +if [ "$UNDO" = 1 ]; then + kind="-D" +fi + +iptables -t nat "$kind" POSTROUTING -o $iiface -j MASQUERADE +iptables -t nat "$kind" PREROUTING -i $iiface -p tcp --dport $sport -j DNAT --to-destination $dip:$dport +iptables -t nat "$kind" PREROUTING -i $iiface -p udp --dport $sport -j DNAT --to-destination $dip:$dport +iptables -t nat "$kind" PREROUTING -i $oiface -s $dip/24 -d $sip -p tcp --dport $sport -j DNAT --to-destination $dip:$dport +iptables -t nat "$kind" PREROUTING -i $oiface -s $dip/24 -d $sip -p udp --dport $sport -j DNAT --to-destination $dip:$dport +iptables -t nat "$kind" POSTROUTING -o $oiface -s $dip/24 -d $dip/32 -p tcp --dport $dport -j SNAT --to-source $sip:$sport +iptables -t nat "$kind" POSTROUTING -o $oiface -s $dip/24 -d $dip/32 -p udp --dport $dport -j SNAT --to-source $sip:$sport -iptables -t nat -A PREROUTING -i $iiface -s $sip/32 -d $sip -p tcp --dport $sport -j DNAT --to-destination $dip:$dport -iptables -t nat -A PREROUTING -i $iiface -s $sip/32 -d $sip -p udp --dport $sport -j DNAT --to-destination $dip:$dport -iptables -t nat -A POSTROUTING -o $oiface -s $sip/32 -d $dip/32 -p tcp --dport $dport -j SNAT --to-source $sip:$sport -iptables -t nat -A POSTROUTING -o $oiface -s $sip/32 -d $dip/32 -p udp --dport $dport -j SNAT --to-source $sip:$sport \ No newline at end of file +iptables -t nat "$kind" PREROUTING -i $iiface -s $sip/32 -d $sip -p tcp --dport $sport -j DNAT --to-destination $dip:$dport +iptables -t nat "$kind" PREROUTING -i $iiface -s $sip/32 -d $sip -p udp --dport $sport -j DNAT --to-destination $dip:$dport +iptables -t nat "$kind" POSTROUTING -o $oiface -s $sip/32 -d $dip/32 -p tcp --dport $dport -j SNAT --to-source $sip:$sport +iptables -t nat "$kind" POSTROUTING -o $oiface -s $sip/32 -d $dip/32 -p udp --dport $dport -j SNAT --to-source $sip:$sport \ No newline at end of file diff --git a/container-runtime/package-lock.json b/container-runtime/package-lock.json index acb6ac38d..cb64a31fa 100644 --- a/container-runtime/package-lock.json +++ b/container-runtime/package-lock.json @@ -17,6 +17,7 @@ "isomorphic-fetch": "^3.0.0", "jsonpath": "^1.1.1", "lodash.merge": "^4.6.2", + "mime": "^4.0.7", "node-fetch": "^3.1.0", "ts-matches": "^6.3.2", "tslib": "^2.5.3", @@ -37,7 +38,7 @@ }, "../sdk/dist": { "name": "@start9labs/start-sdk", - "version": "0.4.0-beta.25", + "version": "0.4.0-beta.26", "license": "MIT", "dependencies": { "@iarna/toml": "^3.0.0", @@ -47,7 +48,7 @@ "deep-equality-data-structures": "^2.0.0", "ini": "^5.0.0", "isomorphic-fetch": "^3.0.0", - "mime-types": "^3.0.1", + "mime": "^4.0.7", "ts-matches": "^6.3.2", "yaml": "^2.7.1" }, @@ -4975,15 +4976,18 @@ } }, "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.7.tgz", + "integrity": "sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==", + "funding": [ + "https://github.com/sponsors/broofa" + ], "license": "MIT", "bin": { - "mime": "cli.js" + "mime": "bin/cli.js" }, "engines": { - "node": ">=4" + "node": ">=16" } }, "node_modules/mime-db": { @@ -5914,6 +5918,18 @@ "node": ">= 0.8" } }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", diff --git a/container-runtime/package.json b/container-runtime/package.json index fff13ba30..583f90f6c 100644 --- a/container-runtime/package.json +++ b/container-runtime/package.json @@ -26,6 +26,7 @@ "isomorphic-fetch": "^3.0.0", "jsonpath": "^1.1.1", "lodash.merge": "^4.6.2", + "mime": "^4.0.7", "node-fetch": "^3.1.0", "ts-matches": "^6.3.2", "tslib": "^2.5.3", diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts index e314fba74..958141349 100644 --- a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts @@ -400,9 +400,23 @@ export class SystemForEmbassy implements System { this.manifest.title.toLowerCase().includes("knots") ) version.flavor = "knots" + + if ( + this.manifest.id === "lnd" || + this.manifest.id === "ride-the-lightning" || + this.manifest.id === "datum" + ) { + version.upstream.prerelease = ["beta"] + } else if ( + this.manifest.id === "lightning-terminal" || + this.manifest.id === "robosats" + ) { + version.upstream.prerelease = ["alpha"] + } await effects.setDataVersion({ version: version.toString(), }) + // @FullMetal: package hacks go here } async exportNetwork(effects: Effects) { for (const [id, interfaceValue] of Object.entries( diff --git a/core/Cargo.lock b/core/Cargo.lock index 14cf74bc4..cfeae2f38 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -10,19 +10,13 @@ checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "adler2" version = "2.0.0" @@ -59,22 +53,22 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "version_check", ] [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.2.15", + "getrandom 0.3.3", "once_cell", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -163,20 +157,20 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" dependencies = [ "anstyle", - "once_cell", + "once_cell_polyfill", "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.97" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "arbitrary" @@ -238,7 +232,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "synstructure", ] @@ -250,7 +244,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -266,7 +260,7 @@ dependencies = [ "pem", "rcgen", "ring", - "rustls 0.23.25", + "rustls 0.23.27", "rustls-pemfile 2.2.0", "serde", "serde_json", @@ -312,9 +306,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.22" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a194f9d963d8099596278594b3107448656ba73831c9d8c783e613ce86da64" +checksum = "b37fc50485c4f3f736a4fb14199f6d5f5ba008d7f28fe710306c92780f004c07" dependencies = [ "brotli", "flate2", @@ -326,33 +320,23 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" dependencies = [ "async-task", "concurrent-queue 2.5.0", "fastrand", "futures-lite", + "pin-project-lite", "slab", ] -[[package]] -name = "async-fs" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" -dependencies = [ - "async-lock", - "blocking", - "futures-lite", -] - [[package]] name = "async-io" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" dependencies = [ "async-lock", "cfg-if", @@ -361,7 +345,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix 0.38.44", + "rustix 1.0.7", "slab", "tracing", "windows-sys 0.59.0", @@ -380,9 +364,9 @@ dependencies = [ [[package]] name = "async-process" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc" dependencies = [ "async-channel 2.3.1", "async-io", @@ -393,7 +377,7 @@ dependencies = [ "cfg-if", "event-listener 5.4.0", "futures-lite", - "rustix 0.38.44", + "rustix 1.0.7", "tracing", ] @@ -405,14 +389,14 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] name = "async-signal" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d" dependencies = [ "async-io", "async-lock", @@ -420,7 +404,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.44", + "rustix 1.0.7", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -445,7 +429,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -462,7 +446,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -488,9 +472,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b756939cb2f8dc900aa6dcd505e6e2428e9cae7ff7b028c49e3946efa70878" +checksum = "93fcc8f365936c834db5514fc45aee5b1202d677e6b40e48468aaaa8183ca8c7" dependencies = [ "aws-lc-sys", "zeroize", @@ -498,9 +482,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f7720b74ed28ca77f90769a71fd8c637a0137f6fae4ae947e1050229cff57f" +checksum = "61b1d86e7705efe1be1b569bab41d4fa1e14e220b60a160f78de2db687add079" dependencies = [ "bindgen", "cc", @@ -630,17 +614,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -716,7 +700,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cexpr", "clang-sys", "itertools 0.12.1", @@ -729,7 +713,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.100", + "syn 2.0.101", "which", ] @@ -771,9 +755,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" dependencies = [ "serde", ] @@ -821,9 +805,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389a099b34312839e16420d499a9cad9650541715937ffbdd40d36f49e77eeb3" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" dependencies = [ "arrayref", "arrayvec 0.7.6", @@ -867,9 +851,9 @@ dependencies = [ [[package]] name = "brotli" -version = "7.0.0" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -878,9 +862,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.2" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -894,9 +878,9 @@ checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" [[package]] name = "byteorder" @@ -943,9 +927,9 @@ checksum = "981520c98f422fcc584dc1a95c334e6953900b9106bc47a9839b81790009eb21" [[package]] name = "cc" -version = "1.2.18" +version = "1.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525046617d8376e3db1deffb079e91cef90a89fc3ca5c185bbf8c9ecdd15cd5c" +checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" dependencies = [ "jobserver", "libc", @@ -975,9 +959,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1021,7 +1005,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half 2.5.0", + "half 2.6.0", ] [[package]] @@ -1056,9 +1040,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.35" +version = "4.5.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" +checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" dependencies = [ "clap_builder", "clap_derive", @@ -1066,9 +1050,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.35" +version = "4.5.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" +checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" dependencies = [ "anstream", "anstyle", @@ -1085,7 +1069,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1105,9 +1089,9 @@ dependencies = [ [[package]] name = "color-eyre" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" +checksum = "e5920befb47832a6d61ee3a3a846565cfa39b331331e68a3b1d1116630f2f26d" dependencies = [ "backtrace", "color-spantrace", @@ -1120,9 +1104,9 @@ dependencies = [ [[package]] name = "color-spantrace" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" +checksum = "b8b88ea9df13354b55bc7234ebcce36e6ef896aca2e42a15de9e10edce01b427" dependencies = [ "once_cell", "owo-colors", @@ -1252,6 +1236,15 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "convert_case" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "cookie" version = "0.18.1" @@ -1308,9 +1301,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" dependencies = [ "crc-catalog", ] @@ -1332,9 +1325,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] @@ -1375,16 +1368,18 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crossterm" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "crossterm_winapi", + "derive_more 2.0.1", + "document-features", "futures-core", "mio", "parking_lot", - "rustix 0.38.44", + "rustix 1.0.7", "signal-hook", "signal-hook-mio", "winapi", @@ -1494,7 +1489,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1518,7 +1513,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1529,14 +1524,14 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] name = "data-encoding" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "deflate64" @@ -1566,14 +1561,14 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "der_derive", @@ -1603,7 +1598,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1624,20 +1619,41 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] name = "derive_more" -version = "0.99.19" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version", - "syn 2.0.100", + "syn 2.0.101", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "convert_case 0.7.1", + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] @@ -1690,7 +1706,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1793,7 +1809,7 @@ dependencies = [ "ed25519 2.2.3", "rand_core 0.6.4", "serde", - "sha2 0.10.8", + "sha2 0.10.9", "signature 2.2.0", "subtle", "zeroize", @@ -1879,7 +1895,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1900,7 +1916,7 @@ checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1922,9 +1938,9 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", "windows-sys 0.59.0", @@ -1981,12 +1997,12 @@ dependencies = [ [[package]] name = "exver" version = "0.2.0" -source = "git+https://github.com/Start9Labs/exver-rs.git#6a32f7aac5540cc305dbef7d4e5dee642d5811d6" +source = "git+https://github.com/Start9Labs/exver-rs.git#24f04392a9fe3ed93b896f42192e78a249ee6b15" dependencies = [ "either", "emver", "fp-core", - "getrandom 0.2.15", + "getrandom 0.2.16", "itertools 0.13.0", "memchr", "pest", @@ -2062,7 +2078,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", - "miniz_oxide 0.8.7", + "miniz_oxide", ] [[package]] @@ -2213,7 +2229,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2284,7 +2300,7 @@ dependencies = [ "serde_urlencoded", "tokio", "tokio-rustls 0.25.0", - "webpki-roots 0.26.8", + "webpki-roots 0.26.11", ] [[package]] @@ -2310,9 +2326,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", @@ -2321,9 +2337,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "js-sys", @@ -2335,9 +2351,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -2351,7 +2367,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8283e7331b8c93b9756e0cfdbcfb90312852f953c6faf9bf741e684cc3b6ad69" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "crc", "log", "uuid", @@ -2389,9 +2405,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.8" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" dependencies = [ "atomic-waker", "bytes", @@ -2414,9 +2430,9 @@ checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "half" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", @@ -2434,7 +2450,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", ] [[package]] @@ -2443,15 +2459,15 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "allocator-api2", ] [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" [[package]] name = "hashlink" @@ -2509,21 +2525,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - -[[package]] -name = "hermit-abi" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" [[package]] name = "hex" @@ -2615,17 +2619,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "hostname" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9c7c7c8ac16c798734b8a24560c1362120597c40d5e1459f09498f8f6c8f2ba" -dependencies = [ - "cfg-if", - "libc", - "windows", -] - [[package]] name = "http" version = "0.2.12" @@ -2733,7 +2726,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.8", + "h2 0.4.10", "http 1.3.1", "http-body 1.0.1", "httparse", @@ -2747,15 +2740,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" dependencies = [ - "futures-util", "http 1.3.1", "hyper 1.6.0", "hyper-util", - "rustls 0.23.25", + "rustls 0.23.27", "rustls-pki-types", "tokio", "tokio-rustls 0.26.2", @@ -2792,22 +2784,28 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", "http 1.3.1", "http-body 1.0.1", "hyper 1.6.0", + "ipnet", "libc", + "percent-encoding", "pin-project-lite", "socket2", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] @@ -2822,7 +2820,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.61.0", + "windows-core", ] [[package]] @@ -2836,21 +2834,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -2859,31 +2858,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -2891,67 +2870,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", -] - [[package]] name = "id-pool" version = "0.2.2" @@ -2990,9 +2956,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -3099,7 +3065,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "serde", ] @@ -3167,13 +3133,23 @@ dependencies = [ "serde", ] +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is-terminal" version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ - "hermit-abi 0.5.0", + "hermit-abi", "libc", "windows-sys 0.59.0", ] @@ -3289,7 +3265,7 @@ version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", "libc", ] @@ -3438,25 +3414,25 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.171" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libloading" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.53.0", ] [[package]] name = "libm" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" @@ -3464,9 +3440,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "libc", - "redox_syscall 0.5.11", + "redox_syscall 0.5.12", ] [[package]] @@ -3500,15 +3476,15 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "litrs" @@ -3518,20 +3494,14 @@ checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", ] -[[package]] -name = "lockfree-object-pool" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" - [[package]] name = "log" version = "0.4.27" @@ -3574,7 +3544,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bd9d657de66a3d5ac360c3eab8c9f5cac2565f2b97cc032d5de4c900ef470de" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "flate2", "hickory-resolver", "lru-cache", @@ -3618,12 +3588,12 @@ dependencies = [ "mail-builder", "md5", "rand 0.8.5", - "rustls 0.23.25", + "rustls 0.23.27", "rustls-pki-types", "smtp-proto", "tokio", "tokio-rustls 0.26.2", - "webpki-roots 0.26.8", + "webpki-roots 0.26.11", ] [[package]] @@ -3726,32 +3696,23 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff70ce3e48ae43fa075863cef62e8b43b71a4f2382229920e0df362592919430" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3773,7 +3734,7 @@ dependencies = [ "regex", "reqwest", "rpc-toolkit", - "rustls 0.23.25", + "rustls 0.23.27", "serde", "serde_json", "sqlx", @@ -3851,7 +3812,20 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset 0.9.1", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.9.1", "cfg-if", "cfg_aliases", "libc", @@ -3999,11 +3973,11 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", ] @@ -4025,7 +3999,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4042,9 +4016,9 @@ checksum = "6aa2c4e539b869820a2b82e1aef6ff40aa85e65decdd5185e83fb4b1249cd00f" [[package]] name = "object" -version = "0.32.2" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -4064,6 +4038,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "opaque-debug" version = "0.3.1" @@ -4079,17 +4059,17 @@ dependencies = [ "base64 0.21.7", "byteorder", "md-5", - "sha2 0.10.8", + "sha2 0.10.9", "thiserror 1.0.69", ] [[package]] name = "openssl" -version = "0.10.72" +version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg-if", "foreign-types", "libc", @@ -4106,7 +4086,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4117,18 +4097,18 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "300.4.2+3.4.1" +version = "300.5.0+3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168ce4e058f975fe43e89d9ccf78ca668601887ae736090aacc23ae353c298e2" +checksum = "e8ce546f549326b0e6052b649198487d91320875da901e7bd11a06d1ee3f9c2f" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.107" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -4155,9 +4135,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "owo-colors" -version = "3.5.0" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" +checksum = "26995317201fa17f3656c36716aed4a7c81743a9634ac4c99c0eeda495db0cec" [[package]] name = "p256" @@ -4168,7 +4148,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -4180,7 +4160,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -4194,7 +4174,7 @@ dependencies = [ "elliptic-curve", "primeorder", "rand_core 0.6.4", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -4205,9 +4185,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -4215,13 +4195,13 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.11", + "redox_syscall 0.5.12", "smallvec", "windows-targets 0.52.6", ] @@ -4339,7 +4319,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4350,7 +4330,7 @@ checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0" dependencies = [ "once_cell", "pest", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -4395,7 +4375,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4450,15 +4430,15 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "polling" -version = "3.7.4" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" dependencies = [ "cfg-if", "concurrent-queue 2.5.0", - "hermit-abi 0.4.0", + "hermit-abi", "pin-project-lite", - "rustix 0.38.44", + "rustix 1.0.7", "tracing", "windows-sys 0.59.0", ] @@ -4469,6 +4449,15 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -4481,7 +4470,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.24", + "zerocopy", ] [[package]] @@ -4492,12 +4481,12 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "prettyplease" -version = "0.2.32" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" dependencies = [ "proc-macro2", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4529,14 +4518,14 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml_edit 0.22.24", + "toml_edit 0.22.26", ] [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -4547,7 +4536,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "731e0d9356b0c25f16f33b5be79b1c57b562f141ebfcdb0ad8ac2c13a24293b4" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "chrono", "flate2", "hex", @@ -4562,7 +4551,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3554923a69f4ce04c4a754260c338f505ce22642d3830e049a399fc2059a29" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "chrono", "hex", ] @@ -4575,7 +4564,7 @@ checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" dependencies = [ "bit-set 0.8.0", "bit-vec 0.8.0", - "bitflags 2.9.0", + "bitflags 2.9.1", "lazy_static", "num-traits", "rand 0.8.5", @@ -4595,7 +4584,7 @@ checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4618,7 +4607,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4732,13 +4721,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", - "zerocopy 0.8.24", ] [[package]] @@ -4786,7 +4774,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -4795,7 +4783,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", ] [[package]] @@ -4864,11 +4852,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] @@ -4883,7 +4871,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", "thiserror 1.0.69", ] @@ -4934,9 +4922,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.15" +version = "0.12.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +checksum = "a2f8e5513d63f2e5b386eb5106dc67eaf3f84e95258e210489136b8b92ad6119" dependencies = [ "base64 0.22.1", "bytes", @@ -4945,7 +4933,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.4.8", + "h2 0.4.10", "http 1.3.1", "http-body 1.0.1", "http-body-util", @@ -4961,24 +4949,23 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile 2.2.0", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.2", - "system-configuration", "tokio", "tokio-native-tls", "tokio-socks", "tokio-util", "tower 0.5.2", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "wasm-streams", "web-sys", - "windows-registry", ] [[package]] @@ -4995,12 +4982,9 @@ dependencies = [ [[package]] name = "resolv-conf" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48375394603e3dd4b2d64371f7148fd8c7baa2680e28741f2cb8d23b59e3d4c4" -dependencies = [ - "hostname", -] +checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" [[package]] name = "rfc6979" @@ -5020,7 +5004,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", "untrusted", "windows-sys 0.52.0", @@ -5028,13 +5012,13 @@ dependencies = [ [[package]] name = "rpassword" -version = "7.3.1" +version = "7.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" +checksum = "66d4c8b64f049c6721ec8ccec37ddfc3d641c4a7fca57e8f2a89de509c73df39" dependencies = [ "libc", "rtoolbox", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -5079,7 +5063,7 @@ dependencies = [ "pkcs1", "pkcs8", "rand_core 0.6.4", - "sha2 0.10.8", + "sha2 0.10.9", "signature 2.2.0", "spki", "subtle", @@ -5088,12 +5072,12 @@ dependencies = [ [[package]] name = "rtoolbox" -version = "0.0.2" +version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" +checksum = "a7cc970b249fbe527d6e02e0a227762c9108b2f49d81094fe357ffc6d14d7f6f" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -5143,8 +5127,8 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.0", - "errno 0.3.11", + "bitflags 2.9.1", + "errno 0.3.12", "itoa", "libc", "linux-raw-sys 0.4.15", @@ -5153,14 +5137,14 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.5" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.9.0", - "errno 0.3.11", + "bitflags 2.9.1", + "errno 0.3.12", "libc", - "linux-raw-sys 0.9.3", + "linux-raw-sys 0.9.4", "windows-sys 0.59.0", ] @@ -5192,16 +5176,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.25" +version = "0.23.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.1", + "rustls-webpki 0.103.3", "subtle", "zeroize", ] @@ -5226,9 +5210,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" @@ -5253,9 +5240,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.1" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ "aws-lc-rs", "ring", @@ -5265,9 +5252,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "rusty-fork" @@ -5283,9 +5270,9 @@ dependencies = [ [[package]] name = "rustyline-async" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa3f78c2ea57b827be4c11adbfed26e5fe1b49fb6fb7826e2a9eebbc2e8db10" +checksum = "055f3061e6c11d3c981f55b9c60da44d0413344ceeaf2fb479450f18dc9c2675" dependencies = [ "crossterm", "futures-util", @@ -5356,7 +5343,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "core-foundation", "core-foundation-sys", "libc", @@ -5416,7 +5403,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5461,7 +5448,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5512,7 +5499,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5540,7 +5527,7 @@ checksum = "88e79009728d8311d42d754f2f319a975f9e38f156fd5e422d2451486c78b286" dependencies = [ "base64ct", "rand 0.8.5", - "sha2 0.10.8", + "sha2 0.10.9", "subtle", ] @@ -5570,9 +5557,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -5612,9 +5599,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" dependencies = [ "libc", "signal-hook-registry", @@ -5633,9 +5620,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -5708,9 +5695,9 @@ checksum = "b7d3950ab75b03c52f2f13fd52aab91c9d62698b231b67240e85c3ef5301e63e" [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -5764,7 +5751,7 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "atoi", "byteorder", "bytes", @@ -5790,7 +5777,7 @@ dependencies = [ "rustls-pemfile 1.0.4", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "smallvec", "sqlformat", "thiserror 1.0.69", @@ -5829,7 +5816,7 @@ dependencies = [ "quote", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "sqlx-core", "sqlx-mysql", "sqlx-postgres", @@ -5848,7 +5835,7 @@ checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" dependencies = [ "atoi", "base64 0.21.7", - "bitflags 2.9.0", + "bitflags 2.9.1", "byteorder", "bytes", "chrono", @@ -5874,7 +5861,7 @@ dependencies = [ "rsa", "serde", "sha1", - "sha2 0.10.8", + "sha2 0.10.9", "smallvec", "sqlx-core", "stringprep", @@ -5891,7 +5878,7 @@ checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ "atoi", "base64 0.21.7", - "bitflags 2.9.0", + "bitflags 2.9.1", "byteorder", "chrono", "crc", @@ -5913,7 +5900,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "smallvec", "sqlx-core", "stringprep", @@ -5969,7 +5956,7 @@ dependencies = [ "quote", "regex-syntax 0.6.29", "strsim 0.10.0", - "syn 2.0.100", + "syn 2.0.101", "unicode-width 0.1.14", ] @@ -5991,7 +5978,7 @@ checksum = "eb9242b9ef4108a78e8cd1a2c98e193ef372437f8c22be363075233321dd4a15" dependencies = [ "base64ct", "pem-rfc7468", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -6007,7 +5994,7 @@ dependencies = [ "rand_core 0.6.4", "rsa", "sec1", - "sha2 0.10.8", + "sha2 0.10.9", "signature 2.2.0", "ssh-cipher", "ssh-encoding", @@ -6110,14 +6097,14 @@ dependencies = [ "proptest-derive", "pty-process", "qrcode", - "rand 0.9.0", + "rand 0.9.1", "regex", "reqwest", "reqwest_cookie_store", "rpassword", "rpc-toolkit", "rust-argon2", - "rustls 0.23.25", + "rustls 0.23.27", "rustls-pki-types", "rustyline-async", "semver", @@ -6127,7 +6114,7 @@ dependencies = [ "serde_with", "serde_yml", "sha-crypt", - "sha2 0.10.8", + "sha2 0.10.9", "shell-words", "signal-hook", "simple-logging", @@ -6146,7 +6133,7 @@ dependencies = [ "tokio-tar", "tokio-tungstenite 0.23.1", "tokio-util", - "toml 0.8.20", + "toml 0.8.22", "torut", "tower-service", "tracing", @@ -6225,9 +6212,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.100" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -6251,13 +6238,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6266,7 +6253,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "core-foundation", "system-configuration-sys", ] @@ -6300,14 +6287,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.19.1" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ "fastrand", - "getrandom 0.3.2", + "getrandom 0.3.3", "once_cell", - "rustix 1.0.5", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -6390,7 +6377,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6401,7 +6388,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6467,9 +6454,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -6492,9 +6479,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.2" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", @@ -6527,7 +6514,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6567,7 +6554,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.25", + "rustls 0.23.27", "tokio", ] @@ -6637,9 +6624,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.14" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ "bytes", "futures-core", @@ -6662,21 +6649,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.20" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.24", + "toml_edit 0.22.26", ] [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] @@ -6696,17 +6683,24 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap 2.9.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.7.4", + "toml_write", + "winnow 0.7.10", ] +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + [[package]] name = "tonic" version = "0.11.0" @@ -6741,14 +6735,14 @@ source = "git+https://github.com/Start9Labs/torut.git?branch=update%2Fdependenci dependencies = [ "base32 0.4.0", "base64 0.21.7", - "derive_more", + "derive_more 0.99.20", "ed25519-dalek 1.0.1", "hex", "hmac", "rand 0.7.3", "serde", "serde_derive", - "sha2 0.10.8", + "sha2 0.10.9", "sha3", "tokio", ] @@ -6789,6 +6783,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "iri-string", + "pin-project-lite", + "tower 0.5.2", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -6821,7 +6833,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6973,7 +6985,7 @@ dependencies = [ "Inflector", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "termcolor", ] @@ -7032,7 +7044,7 @@ checksum = "1f718dfaf347dcb5b983bfc87608144b0bad87970aebcbea5ce44d2a30c08e63" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7173,12 +7185,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -7193,11 +7199,13 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", + "js-sys", + "wasm-bindgen", ] [[package]] @@ -7295,7 +7303,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -7330,7 +7338,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7385,9 +7393,18 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.8" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.0", +] + +[[package]] +name = "webpki-roots" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" dependencies = [ "rustls-pki-types", ] @@ -7410,7 +7427,7 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" dependencies = [ - "redox_syscall 0.5.11", + "redox_syscall 0.5.12", "wasite", ] @@ -7451,36 +7468,17 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" -dependencies = [ - "windows-core 0.52.0", - "windows-targets 0.52.6", -] - [[package]] name = "windows-core" -version = "0.52.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.61.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ "windows-implement", "windows-interface", "windows-link", "windows-result", - "windows-strings 0.4.0", + "windows-strings 0.4.2", ] [[package]] @@ -7491,7 +7489,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7502,7 +7500,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7524,9 +7522,9 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ "windows-link", ] @@ -7542,9 +7540,9 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ "windows-link", ] @@ -7772,9 +7770,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.4" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" dependencies = [ "memchr", ] @@ -7795,20 +7793,14 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "wyz" @@ -7858,17 +7850,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" dependencies = [ "libc", - "rustix 1.0.5", -] - -[[package]] -name = "xdg-home" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" -dependencies = [ - "libc", - "windows-sys 0.59.0", + "rustix 1.0.7", ] [[package]] @@ -7898,7 +7880,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f355ab62ebe30b758c1f4ab096a306722c4b7dbfb9d8c07d18c70d71a945588" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "hashbrown 0.13.2", "lazy_static", "serde", @@ -7915,9 +7897,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -7927,25 +7909,24 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "synstructure", ] [[package]] name = "zbus" -version = "5.5.0" +version = "5.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c333f648ea1b647bc95dc1d34807c8e25ed7a6feff3394034dc4776054b236" +checksum = "d3a7c7cee313d044fca3f48fa782cb750c79e4ca76ba7bc7718cd4024cdf6f68" dependencies = [ "async-broadcast", "async-executor", - "async-fs", "async-io", "async-lock", "async-process", @@ -7958,16 +7939,14 @@ dependencies = [ "futures-core", "futures-lite", "hex", - "nix 0.29.0", + "nix 0.30.1", "ordered-stream", "serde", "serde_repr", - "static_assertions", "tracing", "uds_windows", "windows-sys 0.59.0", - "winnow 0.7.4", - "xdg-home", + "winnow 0.7.10", "zbus_macros", "zbus_names", "zvariant", @@ -7975,14 +7954,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.5.0" +version = "5.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f325ad10eb0d0a3eb060203494c3b7ec3162a01a59db75d2deee100339709fc0" +checksum = "a17e7e5eec1550f747e71a058df81a9a83813ba0f6a95f39c4e218bdc7ba366a" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "zbus_names", "zvariant", "zvariant_utils", @@ -7996,48 +7975,28 @@ checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", - "winnow 0.7.4", + "winnow 0.7.10", "zvariant", ] [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" -dependencies = [ - "zerocopy-derive 0.8.24", + "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -8057,7 +8016,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "synstructure", ] @@ -8078,14 +8037,25 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", ] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -8094,20 +8064,20 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] name = "zip" -version = "2.6.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dcb24d0152526ae49b9b96c1dcf71850ca1e0b882e4e28ed898a93c41334744" +checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" dependencies = [ "aes 0.8.4", "arbitrary", @@ -8116,14 +8086,16 @@ dependencies = [ "crc32fast", "crossbeam-utils", "deflate64", + "displaydoc", "flate2", - "getrandom 0.3.2", + "getrandom 0.3.3", "hmac", "indexmap 2.9.0", "lzma-rs", "memchr", "pbkdf2", "sha1", + "thiserror 2.0.12", "time", "xz2", "zeroize", @@ -8133,15 +8105,13 @@ dependencies = [ [[package]] name = "zopfli" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" dependencies = [ "bumpalo", "crc32fast", - "lockfree-object-pool", "log", - "once_cell", "simd-adler32", ] @@ -8175,29 +8145,28 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.4.0" +version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2df9ee044893fcffbdc25de30546edef3e32341466811ca18421e3cd6c5a3ac" +checksum = "9d30786f75e393ee63a21de4f9074d4c038d52c5b1bb4471f955db249f9dffb1" dependencies = [ "endi", "enumflags2", "serde", - "static_assertions", - "winnow 0.7.4", + "winnow 0.7.10", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.4.0" +version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74170caa85b8b84cc4935f2d56a57c7a15ea6185ccdd7eadb57e6edd90f94b2f" +checksum = "75fda702cd42d735ccd48117b1630432219c0e9616bf6cb0f8350844ee4d9580" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "zvariant_utils", ] @@ -8211,6 +8180,6 @@ dependencies = [ "quote", "serde", "static_assertions", - "syn 2.0.100", - "winnow 0.7.4", + "syn 2.0.101", + "winnow 0.7.10", ] diff --git a/core/startos/src/backup/target/mod.rs b/core/startos/src/backup/target/mod.rs index eb3fc29bc..536cc336f 100644 --- a/core/startos/src/backup/target/mod.rs +++ b/core/startos/src/backup/target/mod.rs @@ -296,7 +296,7 @@ pub async fn info( } lazy_static::lazy_static! { - static ref USER_MOUNTS: Mutex>> = + static ref USER_MOUNTS: Mutex, TmpMountGuard>>> = Mutex::new(BTreeMap::new()); } @@ -305,8 +305,11 @@ lazy_static::lazy_static! { #[command(rename_all = "kebab-case")] pub struct MountParams { target_id: BackupTargetId, - server_id: String, + #[arg(long)] + server_id: Option, password: String, + #[arg(long)] + allow_partial: bool, } #[instrument(skip_all)] @@ -316,24 +319,63 @@ pub async fn mount( target_id, server_id, password, + allow_partial, }: MountParams, ) -> Result { + let server_id = if let Some(server_id) = server_id { + server_id + } else { + ctx.db + .peek() + .await + .into_public() + .into_server_info() + .into_id() + .de()? + }; + let mut mounts = USER_MOUNTS.lock().await; - if let Some(existing) = mounts.get(&target_id) { - return Ok(existing.path().display().to_string()); - } + let existing = mounts.get(&target_id); - let guard = BackupMountGuard::mount( - TmpMountGuard::mount(&target_id.clone().load(&ctx.db.peek().await)?, ReadWrite).await?, - &server_id, - &password, - ) - .await?; + let base = match existing { + Some(Ok(a)) => return Ok(a.path().display().to_string()), + Some(Err(e)) => e.clone(), + None => { + TmpMountGuard::mount(&target_id.clone().load(&ctx.db.peek().await)?, ReadWrite).await? + } + }; + + let guard = match BackupMountGuard::mount(base.clone(), &server_id, &password).await { + Ok(a) => a, + Err(e) => { + if allow_partial { + mounts.insert(target_id, Err(base.clone())); + let enc_key = BackupMountGuard::::load_metadata( + base.path(), + &server_id, + &password, + ) + .await + .map(|(_, k)| k); + return Err(e) + .with_ctx(|e| ( + e.kind, + format!( + "\nThe base filesystem did successfully mount at {:?}\nWrapped Key: {:?}", + base.path(), + enc_key + ) + )); + } else { + return Err(e); + } + } + }; let res = guard.path().display().to_string(); - mounts.insert(target_id, guard); + mounts.insert(target_id, Ok(guard)); Ok(res) } @@ -350,11 +392,17 @@ pub async fn umount(_: RpcContext, UmountParams { target_id }: UmountParams) -> let mut mounts = USER_MOUNTS.lock().await; // TODO: move to context if let Some(target_id) = target_id { if let Some(existing) = mounts.remove(&target_id) { - existing.unmount().await?; + match existing { + Ok(e) => e.unmount().await?, + Err(e) => e.unmount().await?, + } } } else { for (_, existing) in std::mem::take(&mut *mounts) { - existing.unmount().await?; + match existing { + Ok(e) => e.unmount().await?, + Err(e) => e.unmount().await?, + } } } diff --git a/core/startos/src/context/cli.rs b/core/startos/src/context/cli.rs index 0eca1d2c2..dff20ddc1 100644 --- a/core/startos/src/context/cli.rs +++ b/core/startos/src/context/cli.rs @@ -37,6 +37,11 @@ pub struct CliContextSeed { } impl Drop for CliContextSeed { fn drop(&mut self) { + if let Some(rt) = self.runtime.take() { + if let Ok(rt) = Arc::try_unwrap(rt) { + rt.shutdown_background(); + } + } let tmp = format!("{}.tmp", self.cookie_path.display()); let parent_dir = self.cookie_path.parent().unwrap_or(Path::new("/")); if !parent_dir.exists() { diff --git a/core/startos/src/control.rs b/core/startos/src/control.rs index ce0478774..afb1768f2 100644 --- a/core/startos/src/control.rs +++ b/core/startos/src/control.rs @@ -48,7 +48,7 @@ pub async fn restart(ctx: RpcContext, ControlParams { id }: ControlParams) -> Re .await .as_ref() .ok_or_else(|| Error::new(eyre!("Manager not found"), crate::ErrorKind::InvalidRequest))? - .restart(Guid::new()) + .restart(Guid::new(), false) .await?; Ok(()) diff --git a/core/startos/src/db/model/public.rs b/core/startos/src/db/model/public.rs index def0d7533..a91f1b372 100644 --- a/core/startos/src/db/model/public.rs +++ b/core/startos/src/db/model/public.rs @@ -236,9 +236,10 @@ impl NetworkInterfaceInfo { } } -#[derive(Clone, Debug, Default, PartialEq, Eq, Deserialize, Serialize, TS)] +#[derive(Clone, Debug, Default, PartialEq, Eq, Deserialize, Serialize, TS, HasModel)] #[ts(export)] #[serde(rename_all = "camelCase")] +#[model = "Model"] pub struct IpInfo { #[ts(type = "string")] pub name: InternedString, diff --git a/core/startos/src/disk/mount/backup.rs b/core/startos/src/disk/mount/backup.rs index 3c6f97d91..fe771ceba 100644 --- a/core/startos/src/disk/mount/backup.rs +++ b/core/startos/src/disk/mount/backup.rs @@ -29,12 +29,11 @@ pub struct BackupMountGuard { } impl BackupMountGuard { #[instrument(skip_all)] - pub async fn mount( - backup_disk_mount_guard: G, + pub async fn load_metadata( + backup_disk_path: &Path, server_id: &str, password: &str, - ) -> Result { - let backup_disk_path = backup_disk_mount_guard.path(); + ) -> Result<(StartOsRecoveryInfo, String), Error> { let backup_dir = backup_disk_path.join("StartOSBackups").join(server_id); let unencrypted_metadata_path = backup_dir.join("unencrypted-metadata.json"); let crypt_path = backup_dir.join("crypt"); @@ -79,7 +78,6 @@ impl BackupMountGuard { &rand::random::<[u8; 32]>()[..], ) }; - if unencrypted_metadata.password_hash.is_none() { unencrypted_metadata.password_hash = Some( argon2::hash_encoded( @@ -96,6 +94,20 @@ impl BackupMountGuard { &encrypt_slice(&enc_key, password), )); } + Ok((unencrypted_metadata, enc_key)) + } + #[instrument(skip_all)] + pub async fn mount( + backup_disk_mount_guard: G, + server_id: &str, + password: &str, + ) -> Result { + let backup_disk_path = backup_disk_mount_guard.path(); + let (unencrypted_metadata, enc_key) = + Self::load_metadata(backup_disk_path, server_id, password).await?; + let backup_dir = backup_disk_path.join("StartOSBackups").join(server_id); + let unencrypted_metadata_path = backup_dir.join("unencrypted-metadata.json"); + let crypt_path = backup_dir.join("crypt"); if tokio::fs::metadata(&crypt_path).await.is_err() { tokio::fs::create_dir_all(&crypt_path).await.with_ctx(|_| { diff --git a/core/startos/src/disk/mount/filesystem/idmapped.rs b/core/startos/src/disk/mount/filesystem/idmapped.rs index a39b08e56..b7393a722 100644 --- a/core/startos/src/disk/mount/filesystem/idmapped.rs +++ b/core/startos/src/disk/mount/filesystem/idmapped.rs @@ -1,5 +1,6 @@ use std::ffi::OsStr; use std::fmt::Display; +use std::os::unix::fs::MetadataExt; use std::path::Path; use digest::generic_array::GenericArray; @@ -54,7 +55,30 @@ impl FileSystem for IdMapped { self.filesystem.source().await } async fn pre_mount(&self, mountpoint: &Path) -> Result<(), Error> { - self.filesystem.pre_mount(mountpoint).await + self.filesystem.pre_mount(mountpoint).await?; + let info = tokio::fs::metadata(mountpoint).await?; + let uid_in_range = self.from_id <= info.uid() && self.from_id + self.range > info.uid(); + let gid_in_range = self.from_id <= info.gid() && self.from_id + self.range > info.gid(); + if uid_in_range || gid_in_range { + Command::new("chown") + .arg(format!( + "{uid}:{gid}", + uid = if uid_in_range { + self.to_id + info.uid() - self.from_id + } else { + info.uid() + }, + gid = if gid_in_range { + self.to_id + info.gid() - self.from_id + } else { + info.gid() + }, + )) + .arg(&mountpoint) + .invoke(crate::ErrorKind::Filesystem) + .await?; + } + Ok(()) } async fn mount + Send>( &self, diff --git a/core/startos/src/lxc/mod.rs b/core/startos/src/lxc/mod.rs index ce5d28970..ae7697efa 100644 --- a/core/startos/src/lxc/mod.rs +++ b/core/startos/src/lxc/mod.rs @@ -179,12 +179,6 @@ impl LxcContainer { .await?; // TODO: append config let rootfs_dir = container_dir.join("rootfs"); - tokio::fs::create_dir_all(&rootfs_dir).await?; - Command::new("chown") - .arg("100000:100000") - .arg(&rootfs_dir) - .invoke(ErrorKind::Filesystem) - .await?; let rootfs = OverlayGuard::mount( TmpMountGuard::mount( &IdMapped::new( diff --git a/core/startos/src/net/forward.rs b/core/startos/src/net/forward.rs index 610583ef9..9e189f013 100644 --- a/core/startos/src/net/forward.rs +++ b/core/startos/src/net/forward.rs @@ -1,5 +1,5 @@ use std::collections::{BTreeMap, BTreeSet}; -use std::net::SocketAddr; +use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::sync::{Arc, Weak}; use futures::channel::oneshot; @@ -52,10 +52,13 @@ struct ForwardState { current: BTreeMap>, } impl ForwardState { - async fn sync(&mut self, interfaces: &BTreeMap) -> Result<(), Error> { + async fn sync( + &mut self, + interfaces: &BTreeMap)>, + ) -> Result<(), Error> { let private_interfaces = interfaces .iter() - .filter(|(_, public)| !*public) + .filter(|(_, (public, _))| !*public) .map(|(i, _)| i) .collect::>(); let all_interfaces = interfaces.keys().collect::>(); @@ -81,26 +84,30 @@ impl ForwardState { let mut to_rm = actual .difference(expected) .copied() - .cloned() - .collect::>(); + .map(|i| (i.clone(), &interfaces[i].1)) + .collect::>(); let mut to_add = expected .difference(&actual) .copied() - .cloned() - .collect::>(); + .map(|i| (i.clone(), &interfaces[i].1)) + .collect::>(); for interface in actual.intersection(expected).copied() { if cur[interface] != req.target { - to_rm.insert(interface.clone()); - to_add.insert(interface.clone()); + to_rm.insert(interface.clone(), &interfaces[interface].1); + to_add.insert(interface.clone(), &interfaces[interface].1); } } - for interface in to_rm { - unforward(external, &*interface, cur[&interface]).await?; + for (interface, ips) in to_rm { + for ip in ips { + unforward(&*interface, (*ip, external).into(), cur[&interface]).await?; + } cur.remove(&interface); } - for interface in to_add { - forward(external, &*interface, req.target).await?; - cur.insert(interface, req.target); + for (interface, ips) in to_add { + cur.insert(interface.clone(), req.target); + for ip in ips { + forward(&*interface, (*ip, external).into(), cur[&interface]).await?; + } } } (Some(req), None) => { @@ -112,16 +119,19 @@ impl ForwardState { } .into_iter() .copied() - .cloned() { - forward(external, &*interface, req.target).await?; - cur.insert(interface, req.target); + cur.insert(interface.clone(), req.target); + for ip in &interfaces[interface].1 { + forward(&**interface, (*ip, external).into(), req.target).await?; + } } } (None, Some(cur)) => { let to_rm = cur.keys().cloned().collect::>(); for interface in to_rm { - unforward(external, &*interface, cur[&interface]).await?; + for ip in &interfaces[&interface].1 { + unforward(&*interface, (*ip, external).into(), cur[&interface]).await?; + } cur.remove(&interface); } self.current.remove(&external); @@ -155,7 +165,26 @@ impl LanPortForwardController { let mut interfaces = ip_info.peek_and_mark_seen(|ip_info| { ip_info .iter() - .map(|(iface, info)| (iface.clone(), info.inbound())) + .map(|(iface, info)| { + ( + iface.clone(), + ( + info.inbound(), + info.ip_info.as_ref().map_or(Vec::new(), |i| { + i.subnets + .iter() + .filter_map(|s| { + if let IpAddr::V4(ip) = s.addr() { + Some(ip) + } else { + None + } + }) + .collect() + }), + ), + ) + }) .collect() }); let mut reply: Option>> = None; @@ -175,7 +204,21 @@ impl LanPortForwardController { interfaces = ip_info.peek(|ip_info| { ip_info .iter() - .map(|(iface, info)| (iface.clone(), info.inbound())) + .map(|(iface, info)| (iface.clone(), ( + info.inbound(), + info.ip_info.as_ref().map_or(Vec::new(), |i| { + i.subnets + .iter() + .filter_map(|s| { + if let IpAddr::V4(ip) = s.addr() { + Some(ip) + } else { + None + } + }) + .collect() + }), + ))) .collect() }); } @@ -222,87 +265,29 @@ impl LanPortForwardController { } } -// iptables -t nat -A POSTROUTING -s 10.59.0.0/24 ! -d 10.59.0.0/24 -j SNAT --to $ip -// iptables -I INPUT -p udp --dport $port -j ACCEPT -// iptables -I FORWARD -s 10.59.0.0/24 -j ACCEPT -async fn forward(external: u16, interface: &str, target: SocketAddr) -> Result<(), Error> { - for proto in ["tcp", "udp"] { - Command::new("iptables") - .arg("-I") - .arg("FORWARD") - .arg("-i") - .arg(interface) - .arg("-o") - .arg(START9_BRIDGE_IFACE) - .arg("-p") - .arg(proto) - .arg("-d") - .arg(target.ip().to_string()) - .arg("--dport") - .arg(target.port().to_string()) - .arg("-j") - .arg("ACCEPT") - .invoke(crate::ErrorKind::Network) - .await?; - Command::new("iptables") - .arg("-t") - .arg("nat") - .arg("-I") - .arg("PREROUTING") - .arg("-i") - .arg(interface) - .arg("-p") - .arg(proto) - .arg("--dport") - .arg(external.to_string()) - .arg("-j") - .arg("DNAT") - .arg("--to") - .arg(target.to_string()) - .invoke(crate::ErrorKind::Network) - .await?; - } +async fn forward(interface: &str, source: SocketAddr, target: SocketAddr) -> Result<(), Error> { + Command::new("/usr/lib/startos/scripts/forward-port") + .env("iiface", interface) + .env("oiface", START9_BRIDGE_IFACE) + .env("sip", source.ip().to_string()) + .env("dip", target.ip().to_string()) + .env("sport", source.port().to_string()) + .env("dport", target.port().to_string()) + .invoke(ErrorKind::Network) + .await?; Ok(()) } -// iptables -D FORWARD -o br-start9 -p tcp -d 172.18.0.2 --dport 8333 -j ACCEPT -// iptables -t nat -D PREROUTING -p tcp --dport 32768 -j DNAT --to 172.18.0.2:8333 -async fn unforward(external: u16, interface: &str, target: SocketAddr) -> Result<(), Error> { - for proto in ["tcp", "udp"] { - Command::new("iptables") - .arg("-D") - .arg("FORWARD") - .arg("-i") - .arg(interface) - .arg("-o") - .arg(START9_BRIDGE_IFACE) - .arg("-p") - .arg(proto) - .arg("-d") - .arg(target.ip().to_string()) - .arg("--dport") - .arg(target.port().to_string()) - .arg("-j") - .arg("ACCEPT") - .invoke(crate::ErrorKind::Network) - .await?; - Command::new("iptables") - .arg("-t") - .arg("nat") - .arg("-D") - .arg("PREROUTING") - .arg("-i") - .arg(interface) - .arg("-p") - .arg(proto) - .arg("--dport") - .arg(external.to_string()) - .arg("-j") - .arg("DNAT") - .arg("--to") - .arg(target.to_string()) - .invoke(crate::ErrorKind::Network) - .await?; - } +async fn unforward(interface: &str, source: SocketAddr, target: SocketAddr) -> Result<(), Error> { + Command::new("/usr/lib/startos/scripts/forward-port") + .env("UNDO", "1") + .env("iiface", interface) + .env("oiface", START9_BRIDGE_IFACE) + .env("sip", source.ip().to_string()) + .env("dip", target.ip().to_string()) + .env("sport", source.port().to_string()) + .env("dport", target.port().to_string()) + .invoke(ErrorKind::Network) + .await?; Ok(()) } diff --git a/core/startos/src/net/net_controller.rs b/core/startos/src/net/net_controller.rs index e82a97ec6..2a6dc535c 100644 --- a/core/startos/src/net/net_controller.rs +++ b/core/startos/src/net/net_controller.rs @@ -492,7 +492,7 @@ impl NetServiceData { let mut bind_hostname_info = hostname_info.remove(internal).unwrap_or_default(); bind_hostname_info.push(HostnameInfo::Onion { hostname: OnionHostname { - value: tor_addr.to_string(), + value: InternedString::from_display(tor_addr), port: ports.non_ssl, ssl_port: ports.ssl, }, diff --git a/core/startos/src/net/service_interface.rs b/core/startos/src/net/service_interface.rs index ad2900da7..c75b4601c 100644 --- a/core/startos/src/net/service_interface.rs +++ b/core/startos/src/net/service_interface.rs @@ -1,6 +1,7 @@ use std::net::{Ipv4Addr, Ipv6Addr}; use imbl_value::InternedString; +use lazy_format::lazy_format; use models::{HostId, ServiceInterfaceId}; use serde::{Deserialize, Serialize}; use ts_rs::TS; @@ -21,15 +22,29 @@ pub enum HostnameInfo { hostname: OnionHostname, }, } +impl HostnameInfo { + pub fn to_san_hostname(&self) -> InternedString { + match self { + Self::Ip { hostname, .. } => hostname.to_san_hostname(), + Self::Onion { hostname } => hostname.to_san_hostname(), + } + } +} #[derive(Clone, Debug, Deserialize, Serialize, TS)] #[ts(export)] #[serde(rename_all = "camelCase")] pub struct OnionHostname { - pub value: String, + #[ts(type = "string")] + pub value: InternedString, pub port: Option, pub ssl_port: Option, } +impl OnionHostname { + pub fn to_san_hostname(&self) -> InternedString { + self.value.clone() + } +} #[derive(Clone, Debug, Deserialize, Serialize, TS)] #[ts(export)] @@ -64,6 +79,24 @@ pub enum IpHostname { ssl_port: Option, }, } +impl IpHostname { + pub fn to_san_hostname(&self) -> InternedString { + match self { + Self::Ipv4 { value, .. } => InternedString::from_display(value), + Self::Ipv6 { value, .. } => InternedString::from_display(value), + Self::Local { value, .. } => value.clone(), + Self::Domain { + domain, subdomain, .. + } => { + if let Some(subdomain) = subdomain { + InternedString::from_display(&lazy_format!("{subdomain}.{domain}")) + } else { + domain.clone() + } + } + } + } +} #[derive(Clone, Debug, Deserialize, Serialize, TS)] #[ts(export)] diff --git a/core/startos/src/s9pk/v2/compat.rs b/core/startos/src/s9pk/v2/compat.rs index 407938c86..b9fcac4ea 100644 --- a/core/startos/src/s9pk/v2/compat.rs +++ b/core/startos/src/s9pk/v2/compat.rs @@ -188,14 +188,22 @@ impl TryFrom for Manifest { type Error = Error; fn try_from(value: ManifestV1) -> Result { let default_url = value.upstream_repo.clone(); + let mut version = ExtendedVersion::from( + exver::emver::Version::from_str(&value.version) + .with_kind(ErrorKind::Deserialization)?, + ); + if &*value.id == "bitcoind" && value.title.to_ascii_lowercase().contains("knots") { + version = version.with_flavor("knots"); + } else if &*value.id == "lnd" || &*value.id == "ride-the-lightning" || &*value.id == "datum" + { + version = version.map_upstream(|mut v| v.with_prerelease(["beta".into()])); + } else if &*value.id == "lightning-terminal" || &*value.id == "robosats" { + version = version.map_upstream(|mut v| v.with_prerelease(["alpha".into()])); + } Ok(Self { id: value.id, title: format!("{} (Legacy)", value.title).into(), - version: ExtendedVersion::from( - exver::emver::Version::from_str(&value.version) - .with_kind(ErrorKind::Deserialization)?, - ) - .into(), + version: version.into(), satisfies: BTreeSet::new(), release_notes: value.release_notes, can_migrate_from: VersionRange::any(), diff --git a/core/startos/src/service/effects/control.rs b/core/startos/src/service/effects/control.rs index 9321d73cf..a6e2eb87b 100644 --- a/core/startos/src/service/effects/control.rs +++ b/core/startos/src/service/effects/control.rs @@ -26,7 +26,7 @@ pub async fn restart( ProcedureId { procedure_id }: ProcedureId, ) -> Result<(), Error> { let context = context.deref()?; - context.restart(procedure_id).await?; + context.restart(procedure_id, false).await?; Ok(()) } diff --git a/core/startos/src/service/effects/dependency.rs b/core/startos/src/service/effects/dependency.rs index 5bd94e108..568eedf65 100644 --- a/core/startos/src/service/effects/dependency.rs +++ b/core/startos/src/service/effects/dependency.rs @@ -71,11 +71,6 @@ pub async fn mount( if is_mountpoint(&mountpoint).await? { unmount(&mountpoint, true).await?; } - Command::new("chown") - .arg("100000:100000") - .arg(&mountpoint) - .invoke(crate::ErrorKind::Filesystem) - .await?; IdMapped::new(Bind::new(source).with_type(filetype), 0, 100000, 65536) .mount( mountpoint, diff --git a/core/startos/src/service/effects/net/ssl.rs b/core/startos/src/service/effects/net/ssl.rs index 2ebd4e006..51d8d316f 100644 --- a/core/startos/src/service/effects/net/ssl.rs +++ b/core/startos/src/service/effects/net/ssl.rs @@ -1,6 +1,8 @@ use std::collections::BTreeSet; +use std::net::IpAddr; use imbl_value::InternedString; +use ipnet::IpNet; use itertools::Itertools; use openssl::pkey::{PKey, Private}; @@ -8,6 +10,7 @@ use crate::service::effects::callbacks::CallbackHandler; use crate::service::effects::prelude::*; use crate::service::rpc::CallbackId; use crate::util::serde::Pem; +use crate::HOST_IP; #[derive(Debug, Clone, Copy, serde::Serialize, serde::Deserialize, TS, PartialEq, Eq)] #[serde(rename_all = "camelCase")] @@ -57,6 +60,13 @@ pub async fn get_ssl_certificate( .iter() .map(InternedString::from_display) .chain(m.as_domains().keys()?) + .chain( + m.as_hostname_info() + .de()? + .values() + .flatten() + .map(|h| h.to_san_hostname()), + ) .collect::>()) }) .map(|a| a.and_then(|a| a)) @@ -70,6 +80,28 @@ pub async fn get_ssl_certificate( if !packages.contains(internal) { return Err(errfn(&*hostname)); } + } else if let Ok(ip) = hostname.parse::() { + if IpNet::new(HOST_IP.into(), 24) + .with_kind(ErrorKind::ParseNetAddress)? + .contains(&ip) + { + Ok(()) + } else if db + .as_public() + .as_server_info() + .as_network() + .as_network_interfaces() + .as_entries()? + .into_iter() + .flat_map(|(_, net)| net.as_ip_info().transpose_ref()) + .flat_map(|net| net.as_subnets().de().log_err()) + .flatten() + .any(|s| s.addr() == ip) + { + Ok(()) + } else { + Err(errfn(&*hostname)) + }?; } else { if !allowed_hostnames.contains(hostname) { return Err(errfn(&*hostname)); @@ -128,6 +160,11 @@ pub async fn get_ssl_key( let context = context.deref()?; let package_id = &context.seed.id; let algorithm = algorithm.unwrap_or(Algorithm::Ecdsa); + let container_ip = if let Some(lxc) = context.seed.persistent_container.lxc_container.get() { + Some(lxc.ip().await?) + } else { + None + }; let cert = context .seed @@ -135,7 +172,7 @@ pub async fn get_ssl_key( .db .mutate(|db| { let errfn = |h: &str| Error::new(eyre!("unknown hostname: {h}"), ErrorKind::NotFound); - let allowed_hostnames = db + let mut allowed_hostnames = db .as_public() .as_package_data() .as_idx(package_id) @@ -148,11 +185,19 @@ pub async fn get_ssl_key( .iter() .map(InternedString::from_display) .chain(m.as_domains().keys()?) + .chain( + m.as_hostname_info() + .de()? + .values() + .flatten() + .map(|h| h.to_san_hostname()), + ) .collect::>()) }) .map(|a| a.and_then(|a| a)) .flatten_ok() .try_collect::<_, BTreeSet<_>, _>()?; + allowed_hostnames.extend(container_ip.as_ref().map(InternedString::from_display)); for hostname in &hostnames { if let Some(internal) = hostname .strip_suffix(".embassy") diff --git a/core/startos/src/service/fake.cert.key b/core/startos/src/service/fake.cert.key deleted file mode 100644 index a4eb56cb7..000000000 --- a/core/startos/src/service/fake.cert.key +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -MHcCAQEEINn5jiv9VFgEwdUJsDksSTAjPKwkl2DCmCmumu4D1GnNoAoGCCqGSM49 -AwEHoUQDQgAE5KuqP+Wdn8pzmNMxK2hya6mKj1H0j5b47y97tIXqf5ajTi8koRPl -yao3YcqdtBtN37aw4rVlXVwEJIozZgyiyA== ------END EC PRIVATE KEY----- \ No newline at end of file diff --git a/core/startos/src/service/fake.cert.pem b/core/startos/src/service/fake.cert.pem deleted file mode 100644 index fdacaff16..000000000 --- a/core/startos/src/service/fake.cert.pem +++ /dev/null @@ -1,13 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIB9DCCAZmgAwIBAgIUIWsFiA8JqIqeUo+Psn91oCQIcdwwCgYIKoZIzj0EAwIw -TzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNPMRowGAYDVQQKDBFTdGFydDkgTGFi -cywgSW5jLjEXMBUGA1UEAwwOZmFrZW5hbWUubG9jYWwwHhcNMjQwMjE0MTk1MTUz -WhcNMjUwMjEzMTk1MTUzWjBPMQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ08xGjAY -BgNVBAoMEVN0YXJ0OSBMYWJzLCBJbmMuMRcwFQYDVQQDDA5mYWtlbmFtZS5sb2Nh -bDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOSrqj/lnZ/Kc5jTMStocmupio9R -9I+W+O8ve7SF6n+Wo04vJKET5cmqN2HKnbQbTd+2sOK1ZV1cBCSKM2YMosijUzBR -MB0GA1UdDgQWBBR+qd4W//H34Eg90yAPjYz3nZK79DAfBgNVHSMEGDAWgBR+qd4W -//H34Eg90yAPjYz3nZK79DAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0kA -MEYCIQDNSN9YWkGbntG+nC+NzEyqE9FcvYZ8TaF3sOnthqSVKwIhAM2N+WJG/p4C -cPl4HSPPgDaOIhVZzxSje2ycb7wvFtpH ------END CERTIFICATE----- \ No newline at end of file diff --git a/core/startos/src/service/mod.rs b/core/startos/src/service/mod.rs index 3bfb43661..d4c54f614 100644 --- a/core/startos/src/service/mod.rs +++ b/core/startos/src/service/mod.rs @@ -1142,23 +1142,6 @@ pub async fn cli_attach( None }; - let (kill, thread_kill) = tokio::sync::oneshot::channel(); - let (thread_send, recv) = tokio::sync::mpsc::channel(4 * CAP_1_KiB); - let stdin_thread: NonDetachingJoinHandle<()> = tokio::task::spawn_blocking(move || { - use std::io::Read; - let mut stdin = stdin.lock().bytes(); - - while thread_kill.is_empty() { - if let Some(b) = stdin.next() { - thread_send.blocking_send(b).unwrap(); - } else { - break; - } - } - }) - .into(); - let mut stdin = Some(recv); - let guid: Guid = from_value( context .call_remote::( @@ -1178,6 +1161,25 @@ pub async fn cli_attach( )?; let mut ws = context.ws_continuation(guid).await?; + let (kill, thread_kill) = tokio::sync::oneshot::channel(); + let (thread_send, recv) = tokio::sync::mpsc::channel(4 * CAP_1_KiB); + let stdin_thread: NonDetachingJoinHandle<()> = tokio::task::spawn_blocking(move || { + use std::io::Read; + let mut stdin = stdin.lock().bytes(); + + while thread_kill.is_empty() { + if let Some(b) = stdin.next() { + if let Err(_) = thread_send.blocking_send(b) { + break; + } + } else { + break; + } + } + }) + .into(); + let mut stdin = Some(recv); + let mut current_in = "stdin"; let mut current_out = "stdout".to_owned(); ws.send(Message::Text(current_in.into())) diff --git a/core/startos/src/service/persistent_container.rs b/core/startos/src/service/persistent_container.rs index 37cc2cdbb..b6a29c945 100644 --- a/core/startos/src/service/persistent_container.rs +++ b/core/startos/src/service/persistent_container.rs @@ -161,12 +161,6 @@ impl PersistentContainer { .rootfs_dir() .join("media/startos/volumes") .join(volume); - tokio::fs::create_dir_all(&mountpoint).await?; - Command::new("chown") - .arg("100000:100000") - .arg(&mountpoint) - .invoke(crate::ErrorKind::Filesystem) - .await?; let mount = MountGuard::mount( &IdMapped::new( Bind::new(data_dir(DATA_DIR, &s9pk.as_manifest().id, volume)), @@ -182,12 +176,6 @@ impl PersistentContainer { } let mountpoint = lxc_container.rootfs_dir().join("media/startos/assets"); - tokio::fs::create_dir_all(&mountpoint).await?; - Command::new("chown") - .arg("100000:100000") - .arg(&mountpoint) - .invoke(crate::ErrorKind::Filesystem) - .await?; let assets = if let Some(sqfs) = s9pk .as_archive() .contents() @@ -215,12 +203,6 @@ impl PersistentContainer { .rootfs_dir() .join("media/startos/assets") .join(Path::new(asset).with_extension("")); - tokio::fs::create_dir_all(&mountpoint).await?; - Command::new("chown") - .arg("100000:100000") - .arg(&mountpoint) - .invoke(crate::ErrorKind::Filesystem) - .await?; let Some(sqfs) = entry.as_file() else { continue; }; @@ -271,12 +253,6 @@ impl PersistentContainer { .and_then(|e| e.as_file()) .or_not_found(sqfs_path.display())?; let mountpoint = image_path.join(image); - tokio::fs::create_dir_all(&mountpoint).await?; - Command::new("chown") - .arg("100000:100000") - .arg(&mountpoint) - .invoke(ErrorKind::Filesystem) - .await?; images.insert( image.clone(), Arc::new( diff --git a/core/startos/src/service/transition/restart.rs b/core/startos/src/service/transition/restart.rs index 27bef0b91..786c8cc8f 100644 --- a/core/startos/src/service/transition/restart.rs +++ b/core/startos/src/service/transition/restart.rs @@ -1,3 +1,4 @@ +use futures::future::BoxFuture; use futures::FutureExt; use super::TempDesiredRestore; @@ -12,7 +13,7 @@ use crate::util::future::RemoteCancellable; pub(super) struct Restart; impl Handler for ServiceActor { - type Response = (); + type Response = BoxFuture<'static, Option<()>>; fn conflicts_with(_: &Restart) -> ConflictBuilder { ConflictBuilder::everything().except::() } @@ -65,14 +66,18 @@ impl Handler for ServiceActor { if let Some(t) = old { t.abort().await; } - if transition.await.is_none() { - tracing::warn!("Service {} has been cancelled", &self.0.id); - } + transition.boxed() } } impl Service { #[instrument(skip_all)] - pub async fn restart(&self, id: Guid) -> Result<(), Error> { - self.actor.send(id, Restart).await + pub async fn restart(&self, id: Guid, wait: bool) -> Result<(), Error> { + let fut = self.actor.send(id, Restart).await?; + if wait { + if fut.await.is_none() { + tracing::warn!("Restart has been cancelled"); + } + } + Ok(()) } } diff --git a/core/startos/src/util/actor/concurrent.rs b/core/startos/src/util/actor/concurrent.rs index 7b26fc4c7..0e8cc0c2f 100644 --- a/core/startos/src/util/actor/concurrent.rs +++ b/core/startos/src/util/actor/concurrent.rs @@ -19,6 +19,7 @@ struct ConcurrentRunner { waiting: Vec>, recv: mpsc::UnboundedReceiver>, handlers: Vec<( + &'static str, Guid, Arc>, oneshot::Sender>, @@ -47,13 +48,26 @@ impl Future for ConcurrentRunner { if this .handlers .iter() - .any(|(hid, f, _, _)| &id != hid && f(&*msg)) + .any(|(_, hid, f, _, _)| &id != hid && f(&*msg)) { + #[cfg(feature = "unstable")] + { + tracing::debug!("{} must wait...", msg.type_name()); + tracing::debug!( + "waiting on {:?}", + this.handlers + .iter() + .filter(|h| h.2(&*msg)) + .map(|h| (h.0, &h.1)) + .collect::>() + ); + } this.waiting.push((id, msg, reply)); } else { let mut actor = this.actor.clone(); let queue = this.queue.clone(); this.handlers.push(( + msg.type_name(), id.clone(), msg.conflicts_with(), reply, @@ -69,15 +83,15 @@ impl Future for ConcurrentRunner { .handlers .iter_mut() .enumerate() - .filter_map(|(i, (_, _, _, f))| match f.poll_unpin(cx) { + .filter_map(|(i, (_, _, _, _, f))| match f.poll_unpin(cx) { std::task::Poll::Pending => None, std::task::Poll::Ready(res) => Some((i, res)), }) .collect::>(); for (idx, res) in complete.into_iter().rev() { #[allow(clippy::let_underscore_future)] - let (_, f, reply, _) = this.handlers.swap_remove(idx); - let _ = reply.send(res); + let (_, _, f, reply, _) = this.handlers.swap_remove(idx); + reply.send(res).ok(); // TODO: replace with Vec::extract_if once stable if this.shutdown.is_some() { let mut i = 0; @@ -86,12 +100,13 @@ impl Future for ConcurrentRunner { && !this .handlers .iter() - .any(|(_, f, _, _)| f(&*this.waiting[i].1)) + .any(|(_, _, f, _, _)| f(&*this.waiting[i].1)) { let (id, msg, reply) = this.waiting.remove(i); let mut actor = this.actor.clone(); let queue = this.queue.clone(); this.handlers.push(( + msg.type_name(), id.clone(), msg.conflicts_with(), reply, @@ -100,6 +115,18 @@ impl Future for ConcurrentRunner { )); cont = true; } else { + #[cfg(feature = "unstable")] + { + tracing::debug!("{} must wait...", this.waiting[i].1.type_name()); + tracing::debug!( + "waiting on {:?}", + this.handlers + .iter() + .filter(|h| h.2(&*this.waiting[i].1)) + .map(|h| (h.0, &h.1)) + .collect::>() + ); + } i += 1; } } @@ -219,3 +246,77 @@ impl ConcurrentActor { } } } + +#[cfg(test)] +mod test { + use std::time::Duration; + + use crate::rpc_continuations::Guid; + use crate::util::actor::background::BackgroundJobQueue; + use crate::util::actor::{Actor, ConflictBuilder, Handler}; + + #[derive(Clone)] + struct CActor; + impl Actor for CActor { + fn init(&mut self, jobs: &BackgroundJobQueue) {} + } + struct Pending; + impl Handler for CActor { + type Response = (); + fn conflicts_with(_: &Pending) -> ConflictBuilder { + ConflictBuilder::everything().except::() + } + async fn handle(&mut self, _: Guid, _: Pending, _: &BackgroundJobQueue) -> Self::Response { + futures::future::pending().await + } + } + struct Conflicts; + impl Handler for CActor { + type Response = (); + fn conflicts_with(_: &Conflicts) -> ConflictBuilder { + ConflictBuilder::everything().except::() + } + async fn handle( + &mut self, + _: Guid, + _: Conflicts, + _: &BackgroundJobQueue, + ) -> Self::Response { + } + } + struct NoConflicts; + impl Handler for CActor { + type Response = (); + fn conflicts_with(_: &NoConflicts) -> ConflictBuilder { + ConflictBuilder::nothing() + } + async fn handle( + &mut self, + _: Guid, + _: NoConflicts, + _: &BackgroundJobQueue, + ) -> Self::Response { + } + } + #[tokio::test] + async fn test_conflicts() { + let actor = super::ConcurrentActor::new(CActor); + let guid = Guid::new(); + actor.queue(guid.clone(), Pending); + assert!( + tokio::time::timeout(Duration::from_secs(1), actor.send(Guid::new(), Conflicts)) + .await + .is_err() + ); + assert!( + tokio::time::timeout(Duration::from_secs(1), actor.send(Guid::new(), NoConflicts)) + .await + .is_ok() + ); + assert!( + tokio::time::timeout(Duration::from_secs(1), actor.send(guid, Conflicts)) + .await + .is_ok() + ); + } +} diff --git a/core/startos/src/util/actor/mod.rs b/core/startos/src/util/actor/mod.rs index d85e53757..05cdd83c1 100644 --- a/core/startos/src/util/actor/mod.rs +++ b/core/startos/src/util/actor/mod.rs @@ -45,6 +45,9 @@ trait Message: Send + Any { actor: &'a mut A, jobs: &'a BackgroundJobQueue, ) -> BoxFuture<'a, Box>; + fn type_name(&self) -> &'static str { + std::any::type_name_of_val(self) + } } impl Message for M where diff --git a/core/startos/src/version/mod.rs b/core/startos/src/version/mod.rs index 1817837c1..3ba419959 100644 --- a/core/startos/src/version/mod.rs +++ b/core/startos/src/version/mod.rs @@ -378,6 +378,7 @@ fn rollback_to_unchecked Ok(()) } +#[allow(unused_variables)] pub trait VersionT where Self: Default + Copy + Sized + RefUnwindSafe + Send + Sync + 'static, diff --git a/core/startos/src/version/v0_4_0_alpha_5.rs b/core/startos/src/version/v0_4_0_alpha_5.rs index 1a3c75211..0b3d74107 100644 --- a/core/startos/src/version/v0_4_0_alpha_5.rs +++ b/core/startos/src/version/v0_4_0_alpha_5.rs @@ -2,7 +2,6 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; use super::{v0_4_0_alpha_4, VersionT}; -use crate::context::RpcContext; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/sdk/base/lib/dependencies/dependencies.ts b/sdk/base/lib/dependencies/dependencies.ts index e9494c402..921be7f50 100644 --- a/sdk/base/lib/dependencies/dependencies.ts +++ b/sdk/base/lib/dependencies/dependencies.ts @@ -81,9 +81,13 @@ export async function checkDependencies< ) { throw new Error(`Unknown HealthCheckId ${healthCheckId}`) } - const errors = Object.entries(dep.result.healthChecks) - .filter(([id, _]) => (healthCheckId ? id === healthCheckId : true)) - .filter(([_, res]) => res.result !== "success") + const errors = + dep.requirement.kind === "running" + ? dep.requirement.healthChecks + .map((id) => [id, dep.result.healthChecks[id] ?? null] as const) + .filter(([id, _]) => (healthCheckId ? id === healthCheckId : true)) + .filter(([_, res]) => res?.result !== "success") + : [] return errors.length === 0 } const pkgSatisfied = (packageId: DependencyId) => @@ -153,15 +157,20 @@ export async function checkDependencies< ) { throw new Error(`Unknown HealthCheckId ${healthCheckId}`) } - const errors = Object.entries(dep.result.healthChecks) - .filter(([id, _]) => (healthCheckId ? id === healthCheckId : true)) - .filter(([_, res]) => res.result !== "success") + const errors = + dep.requirement.kind === "running" + ? dep.requirement.healthChecks + .map((id) => [id, dep.result.healthChecks[id] ?? null] as const) + .filter(([id, _]) => (healthCheckId ? id === healthCheckId : true)) + .filter(([_, res]) => res?.result !== "success") + : [] if (errors.length) { throw new Error( errors - .map( - ([_, e]) => - `Health Check ${e.name} of ${dep.result.title || packageId} failed with status ${e.result}${e.message ? `: ${e.message}` : ""}`, + .map(([id, e]) => + e + ? `Health Check ${e.name} of ${dep.result.title || packageId} failed with status ${e.result}${e.message ? `: ${e.message}` : ""}` + : `Health Check ${id} of ${dep.result.title} does not exist`, ) .join("; "), ) diff --git a/sdk/base/lib/interfaces/Host.ts b/sdk/base/lib/interfaces/Host.ts index be9525f1c..a1f7f3ba2 100644 --- a/sdk/base/lib/interfaces/Host.ts +++ b/sdk/base/lib/interfaces/Host.ts @@ -134,19 +134,26 @@ export class MultiHost { const preferredExternalPort = options.preferredExternalPort || knownProtocols[options.protocol].defaultPort - const sslProto = this.getSslProto(options, protoInfo) - const addSsl = - sslProto && "alpn" in protoInfo + const sslProto = this.getSslProto(options) + const addSsl = sslProto + ? { + // addXForwardedHeaders: null, + preferredExternalPort: knownProtocols[sslProto].defaultPort, + scheme: sslProto, + alpn: "alpn" in protoInfo ? protoInfo.alpn : null, + ...("addSsl" in options ? options.addSsl : null), + } + : options.addSsl ? { // addXForwardedHeaders: null, - preferredExternalPort: knownProtocols[sslProto].defaultPort, + preferredExternalPort: 443, scheme: sslProto, - alpn: protoInfo.alpn, + alpn: null, ...("addSsl" in options ? options.addSsl : null), } : null - const secure: Security | null = !protoInfo.secure ? null : { ssl: false } + const secure: Security | null = protoInfo.secure ?? null await this.options.effects.bind({ id: this.options.id, @@ -159,12 +166,12 @@ export class MultiHost { return new Origin(this, internalPort, options.protocol, sslProto) } - private getSslProto( - options: BindOptionsByKnownProtocol, - protoInfo: KnownProtocols[keyof KnownProtocols], - ) { + private getSslProto(options: BindOptionsByKnownProtocol) { + const proto = options.protocol + const protoInfo = knownProtocols[proto] if (inObject("noAddSsl", options) && options.noAddSsl) return null if ("withSsl" in protoInfo && protoInfo.withSsl) return protoInfo.withSsl + if (protoInfo.secure?.ssl) return proto return null } } diff --git a/sdk/base/lib/util/GetSystemSmtp.ts b/sdk/base/lib/util/GetSystemSmtp.ts index 457c49d2c..56ac25d2e 100644 --- a/sdk/base/lib/util/GetSystemSmtp.ts +++ b/sdk/base/lib/util/GetSystemSmtp.ts @@ -71,4 +71,30 @@ export class GetSystemSmtp { ), ) } + + /** + * Watches the system SMTP credentials. Returns when the predicate is true + */ + async waitFor(pred: (value: T.SmtpValue | null) => boolean) { + const resolveCell = { resolve: () => {} } + this.effects.onLeaveContext(() => { + resolveCell.resolve() + }) + while (this.effects.isInContext) { + let callback: () => void = () => {} + const waitForNext = new Promise((resolve) => { + callback = resolve + resolveCell.resolve = resolve + }) + const res = await this.effects.getSystemSmtp({ + callback: () => callback(), + }) + if (pred(res)) { + resolveCell.resolve() + return res + } + await waitForNext + } + return null + } } diff --git a/sdk/base/lib/util/getServiceInterface.ts b/sdk/base/lib/util/getServiceInterface.ts index 2084c0532..8c660f4db 100644 --- a/sdk/base/lib/util/getServiceInterface.ts +++ b/sdk/base/lib/util/getServiceInterface.ts @@ -366,6 +366,36 @@ export class GetServiceInterface { ), ) } + + /** + * Watches the requested service interface. Returns when the predicate is true + */ + async waitFor(pred: (value: ServiceInterfaceFilled | null) => boolean) { + const { id, packageId } = this.opts + const resolveCell = { resolve: () => {} } + this.effects.onLeaveContext(() => { + resolveCell.resolve() + }) + while (this.effects.isInContext) { + let callback: () => void = () => {} + const waitForNext = new Promise((resolve) => { + callback = resolve + resolveCell.resolve = resolve + }) + const res = await makeInterfaceFilled({ + effects: this.effects, + id, + packageId, + callback, + }) + if (pred(res)) { + resolveCell.resolve() + return res + } + await waitForNext + } + return null + } } export function getServiceInterface( effects: Effects, diff --git a/sdk/base/lib/util/getServiceInterfaces.ts b/sdk/base/lib/util/getServiceInterfaces.ts index 13d3f282d..d2289a070 100644 --- a/sdk/base/lib/util/getServiceInterfaces.ts +++ b/sdk/base/lib/util/getServiceInterfaces.ts @@ -130,6 +130,35 @@ export class GetServiceInterfaces { ), ) } + + /** + * Watches the service interfaces for the package. Returns when the predicate is true + */ + async waitFor(pred: (value: ServiceInterfaceFilled[] | null) => boolean) { + const { packageId } = this.opts + const resolveCell = { resolve: () => {} } + this.effects.onLeaveContext(() => { + resolveCell.resolve() + }) + while (this.effects.isInContext) { + let callback: () => void = () => {} + const waitForNext = new Promise((resolve) => { + callback = resolve + resolveCell.resolve = resolve + }) + const res = await makeManyInterfaceFilled({ + effects: this.effects, + packageId, + callback, + }) + if (pred(res)) { + resolveCell.resolve() + return res + } + await waitForNext + } + return null + } } export function getServiceInterfaces( effects: Effects, diff --git a/sdk/package/lib/StartSdk.ts b/sdk/package/lib/StartSdk.ts index 9bf8fd36a..253c9bfb3 100644 --- a/sdk/package/lib/StartSdk.ts +++ b/sdk/package/lib/StartSdk.ts @@ -249,6 +249,26 @@ export class StartSdk { ), ) }, + waitFor: async (pred: (value: string | null) => boolean) => { + const resolveCell = { resolve: () => {} } + effects.onLeaveContext(() => { + resolveCell.resolve() + }) + while (effects.isInContext) { + let callback: () => void = () => {} + const waitForNext = new Promise((resolve) => { + callback = resolve + resolveCell.resolve = resolve + }) + const res = await effects.getContainerIp({ ...options, callback }) + if (pred(res)) { + resolveCell.resolve() + return res + } + await waitForNext + } + return null + }, } }, diff --git a/sdk/package/lib/backup/Backups.ts b/sdk/package/lib/backup/Backups.ts index e2cab0778..f43495bca 100644 --- a/sdk/package/lib/backup/Backups.ts +++ b/sdk/package/lib/backup/Backups.ts @@ -189,6 +189,8 @@ async function runRsync(rsyncOptions: { }> { const { srcPath, dstPath, options } = rsyncOptions + await fs.mkdir(dstPath, { recursive: true }) + const command = "rsync" const args: string[] = [] if (options.delete) { diff --git a/sdk/package/lib/util/GetSslCertificate.ts b/sdk/package/lib/util/GetSslCertificate.ts index 33a111b21..5eee31bd0 100644 --- a/sdk/package/lib/util/GetSslCertificate.ts +++ b/sdk/package/lib/util/GetSslCertificate.ts @@ -82,4 +82,32 @@ export class GetSslCertificate { ), ) } + + /** + * Watches the SSL Certificate for the given hostnames if permitted. Returns when the predicate is true + */ + async waitFor(pred: (value: [string, string, string] | null) => boolean) { + const resolveCell = { resolve: () => {} } + this.effects.onLeaveContext(() => { + resolveCell.resolve() + }) + while (this.effects.isInContext) { + let callback: () => void = () => {} + const waitForNext = new Promise((resolve) => { + callback = resolve + resolveCell.resolve = resolve + }) + const res = await this.effects.getSslCertificate({ + hostnames: this.hostnames, + algorithm: this.algorithm, + callback: () => callback(), + }) + if (pred(res)) { + resolveCell.resolve() + return res + } + await waitForNext + } + return null + } } diff --git a/sdk/package/lib/util/fileHelper.ts b/sdk/package/lib/util/fileHelper.ts index 2ff2c5d5f..06ebfb4ff 100644 --- a/sdk/package/lib/util/fileHelper.ts +++ b/sdk/package/lib/util/fileHelper.ts @@ -26,13 +26,17 @@ async function onCreated(path: string) { await onCreated(parent) const ctrl = new AbortController() const watch = fs.watch(parent, { persistent: false, signal: ctrl.signal }) + if (await exists(path)) { + ctrl.abort() + return + } if ( await fs.access(path).then( () => true, () => false, ) ) { - ctrl.abort("finished") + ctrl.abort() return } for await (let event of watch) { @@ -100,6 +104,10 @@ type ReadType = { effects: T.Effects, callback: (value: A | null, error?: Error) => void | Promise, ) => void + waitFor: ( + effects: T.Effects, + pred: (value: A | null) => boolean, + ) => Promise } /** @@ -228,7 +236,7 @@ export class FileHelper { const listen = Promise.resolve() .then(async () => { for await (const _ of watch) { - ctrl.abort("finished") + ctrl.abort() return null } }) @@ -271,6 +279,40 @@ export class FileHelper { ) } + private async readWaitFor( + effects: T.Effects, + pred: (value: B | null, error?: Error) => boolean, + map: (value: A) => B, + ): Promise { + while (effects.isInContext) { + if (await exists(this.path)) { + const ctrl = new AbortController() + const watch = fs.watch(this.path, { + persistent: false, + signal: ctrl.signal, + }) + const newRes = await this.readOnce(map) + const listen = Promise.resolve() + .then(async () => { + for await (const _ of watch) { + ctrl.abort() + return null + } + }) + .catch((e) => console.error(asError(e))) + if (pred(newRes)) { + ctrl.abort() + return newRes + } + await listen + } else { + if (pred(null)) return null + await onCreated(this.path).catch((e) => console.error(asError(e))) + } + } + return null + } + read(): ReadType read( map: (value: A) => B, @@ -290,6 +332,8 @@ export class FileHelper { effects: T.Effects, callback: (value: A | null, error?: Error) => void | Promise, ) => this.readOnChange(effects, callback, map, eq), + waitFor: (effects: T.Effects, pred: (value: A | null) => boolean) => + this.readWaitFor(effects, pred, map), } } diff --git a/sdk/package/package-lock.json b/sdk/package/package-lock.json index 2a5836ad5..5158e5339 100644 --- a/sdk/package/package-lock.json +++ b/sdk/package/package-lock.json @@ -1,12 +1,12 @@ { "name": "@start9labs/start-sdk", - "version": "0.4.0-beta.25", + "version": "0.4.0-beta.26", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@start9labs/start-sdk", - "version": "0.4.0-beta.25", + "version": "0.4.0-beta.26", "license": "MIT", "dependencies": { "@iarna/toml": "^3.0.0", @@ -16,7 +16,7 @@ "deep-equality-data-structures": "^2.0.0", "ini": "^5.0.0", "isomorphic-fetch": "^3.0.0", - "mime-types": "^3.0.1", + "mime": "^4.0.7", "ts-matches": "^6.3.2", "yaml": "^2.7.1" }, @@ -3865,25 +3865,19 @@ "node": ">=8.6" } }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "node_modules/mime": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.7.tgz", + "integrity": "sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==", + "funding": [ + "https://github.com/sponsors/broofa" + ], "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" + "bin": { + "mime": "bin/cli.js" }, "engines": { - "node": ">= 0.6" + "node": ">=16" } }, "node_modules/mimic-fn": { diff --git a/sdk/package/package.json b/sdk/package/package.json index 0ba452849..1511057c0 100644 --- a/sdk/package/package.json +++ b/sdk/package/package.json @@ -1,6 +1,6 @@ { "name": "@start9labs/start-sdk", - "version": "0.4.0-beta.25", + "version": "0.4.0-beta.26", "description": "Software development kit to facilitate packaging services for StartOS", "main": "./package/lib/index.js", "types": "./package/lib/index.d.ts", @@ -32,7 +32,7 @@ "homepage": "https://github.com/Start9Labs/start-sdk#readme", "dependencies": { "isomorphic-fetch": "^3.0.0", - "mime-types": "^3.0.1", + "mime": "^4.0.7", "ts-matches": "^6.3.2", "yaml": "^2.7.1", "deep-equality-data-structures": "^2.0.0",