From 5a3535c443382835e85534c75b7b575eaedafafa Mon Sep 17 00:00:00 2001 From: Albert Hui Date: Mon, 27 Jul 2026 12:48:27 +0800 Subject: [PATCH 1/5] docs(ADR-0010): scope remote OpenDAL backends to evidence-transfer targets Record the decision to narrow the remote feature's OpenDAL service set from ~50 services to forensically-relevant evidence-transfer targets (object stores, gdrive, WebHDFS/HDFS, SQL, fs/http/webdav + SFTP/FTP), dropping the native DB/KV engines + caches, dev/ML, decentralized, alt-runtime, and regional-drive tail. remote stays opt-in (ADR-0002 unchanged); this narrows which services it compiles. Removes the librocksdb-sys C++ build and the etcd/tikv gRPC stack, which lets the protoc CI step go away. Co-Authored-By: Claude Opus 4.8 --- .../0010-scope-remote-opendal-backends.md | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 docs/decisions/0010-scope-remote-opendal-backends.md diff --git a/docs/decisions/0010-scope-remote-opendal-backends.md b/docs/decisions/0010-scope-remote-opendal-backends.md new file mode 100644 index 0000000..99268d1 --- /dev/null +++ b/docs/decisions/0010-scope-remote-opendal-backends.md @@ -0,0 +1,91 @@ +# 10. Scope the `remote` OpenDAL backend set to forensically-relevant evidence-transfer targets + +Date: 2026-07-27 +Status: Accepted + +## Context + +ADR-0002 gated the whole `opendal` cloud stack behind the opt-in `remote` +feature, so the default binary and the security audit stay opendal-free. It did +not scope *which* OpenDAL services `remote` compiles — every service OpenDAL +publishes (~50) was enabled. That set carries native database/KV engines and an +exotic long tail that no evidence-transfer workflow exercises but that costs real +build time: + +- `services-rocksdb` pulls `librocksdb-sys`, a bundled C++ build — the + `link.exe LNK1102` OOM culprit on the Windows leg under a debuginfo build. +- `services-etcd` / `services-tikv` pull `tonic`/`prost` gRPC stacks that need a + `protoc` binary at build time — the sole reason `ci.yml` installs + `protobuf-compiler` on all three OSes. +- `services-mongodb`/`gridfs` and the cache / embedded-KV set (`redis`, + `memcached`, `sled`, `redb`, `persy`, `moka`, `mini-moka`, `dashmap`, + `cacache`) add breadth with no forensic evidence-transfer story. + +blazehash's `remote` feature exists so an examiner can hash evidence that lives +on a remote store, and write a collection back to one — the same targets DFIR +collectors (Velociraptor, KAPE) upload to: object storage (S3/Azure/GCS), +SFTP/FTP, WebHDFS/HDFS, and SQL stores. A distributed-KV cache or a +decentralized-filesystem gateway is not where case evidence lives. + +Two honesty notes on the analysis behind this decision. An initial review pass +claimed specific dependency-crate-count reductions and a `libsqlite3-sys` +removal; a Codex critic could not reproduce those counts (`--all-features` +measured ~771 crates, not the cited figure) and `libsqlite3-sys` is pulled by +`rusqlite` regardless — so no crate-count figure is asserted here. The +load-bearing, verifiable claim is narrower and structural: dropping +`rocksdb`/`etcd`/`tikv` removes the `librocksdb-sys` C++ build and the +`tonic`/`prost` chains, which lets the `protoc` install step leave CI entirely. +The compile-time and linker-RSS win is confirmed by the before/after CI +wall-clock on the enactment PR, not by a crate count. + +## Decision + +Scope the `remote` feature's OpenDAL service set to forensically-relevant +evidence-transfer targets. `remote` stays opt-in and remote-free-by-default +(ADR-0002 unchanged); this ADR narrows *which* services it compiles. + +**KEEP** — evidence-transfer targets: + +- Object storage: `s3`, `gcs`, `azblob`, `azdls`, `azfile`, `b2`, `cos`, `obs`, + `oss`, `swift` +- Cloud drive: `gdrive` — the one drive with dedicated wiring + (`src/remote/gdrive/`) +- Hadoop: `webhdfs`, `hdfs-native` (pure-Rust, no JVM) +- SQL: `mysql`, `postgresql`, `sqlite` (sqlx; PostgreSQL is README-advertised) +- Local / protocol: `fs`, `memory`, `http`, `webdav`, plus SFTP (`ssh2`) and + FTP (`suppaftp`), which are non-opendal by design (ADR-0002 §4) + +**DROP**: + +- Native DB/KV + caches: `rocksdb` (and the `rocksdb-storage` feature), `etcd`, + `tikv`, `mongodb`, `gridfs`, `redis` (+`redis-native-tls`), `memcached`, + `sled`, `redb`, `persy`, `moka`, `mini-moka`, `dashmap`, `cacache` +- Dev / ML / CI-cache: `github`, `huggingface`, `vercel-blob`, + `vercel-artifacts`, `ghac` +- Big data beyond WebHDFS/HDFS: `alluxio`, `lakefs`, `dbfs` +- Decentralized: `ipfs`, `ipmfs` +- Alternate-runtime filesystems: `compfs`, `monoiofs` +- Cloudflare: `cloudflare-kv`, `d1` +- Regional / consumer drives: `onedrive`, `dropbox`, `aliyun-drive`, + `yandex-disk`, `pcloud`, `koofr`, `seafile`, `upyun` + +On the drives specifically: GDrive is kept because it carries dedicated wiring; +OneDrive and Dropbox had only generic scheme wiring (no CLI or test path), so +absent a concrete case they ship as unexercised capability and are dropped — +one line to re-add if a real need appears. + +## Consequences + +- The `protoc` build-tool install step is removed from `ci.yml` (no + `etcd`/`tikv` gRPC stack remains to need it). +- `librocksdb-sys` leaves the `--features remote` graph, removing the + Windows-linker memory pressure it contributed. +- `rocksdb-storage` is removed from `[features]`, and `deny.toml`'s per-feature + enumeration drops it. +- `operator_for_uri` loses the ~25 dropped scheme arms; the KEEP schemes and the + informative SFTP/FTP bail arms remain. +- The cost win — smaller `remote` compile, lower Windows-linker RSS — is proven + by the enactment PR's CI wall-clock against the prior run, not asserted as a + crate-count figure. +- Re-adding any dropped backend is a one-line feature plus one match arm; nothing + here is one-way. From 9f5591746173b69f1b16cb57aa73ff4e8efa09d9 Mon Sep 17 00:00:00 2001 From: Albert Hui Date: Mon, 27 Jul 2026 12:59:55 +0800 Subject: [PATCH 2/5] test(remote): assert dropped OpenDAL schemes are unsupported (RED) Adds unit tests to src/remote/operator.rs asserting that a representative dropped scheme per category (mongodb, redis, rocksdb, ipfs, onedrive, github, compfs, etcd) returns an "unsupported URI scheme" error, per ADR-0010. These FAIL now because the match arms are still present. Co-Authored-By: Claude Opus 4.8 --- src/remote/operator.rs | 53 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/remote/operator.rs b/src/remote/operator.rs index 9d7d179..db95d17 100644 --- a/src/remote/operator.rs +++ b/src/remote/operator.rs @@ -678,4 +678,57 @@ mod tests { "webhdfs:// should be supported" ); } + + // ── ADR-0010: dropped OpenDAL backends must be unsupported ──────────────── + // These schemes were removed from the `remote` OpenDAL service set. Each must + // fall through to the `other =>` arm and report "unsupported URI scheme". + fn assert_unsupported(uri: &str) { + let err = operator_for_uri(uri) + .expect_err("dropped scheme must return an error") + .to_string(); + assert!( + err.contains("unsupported URI scheme"), + "expected unsupported-scheme error for {uri:?}, got: {err}" + ); + } + + #[test] + fn dropped_mongodb_is_unsupported() { + assert_unsupported("mongodb://host/db/coll/key"); + } + + #[test] + fn dropped_redis_is_unsupported() { + assert_unsupported("redis://host:6379/key"); + } + + #[test] + fn dropped_rocksdb_is_unsupported() { + assert_unsupported("rocksdb:///var/lib/db/key"); + } + + #[test] + fn dropped_ipfs_is_unsupported() { + assert_unsupported("ipfs://QmHash/path"); + } + + #[test] + fn dropped_onedrive_is_unsupported() { + assert_unsupported("onedrive://Documents/file.pdf"); + } + + #[test] + fn dropped_github_is_unsupported() { + assert_unsupported("github://owner/repo/path"); + } + + #[test] + fn dropped_compfs_is_unsupported() { + assert_unsupported("compfs:///tmp/evidence/file"); + } + + #[test] + fn dropped_etcd_is_unsupported() { + assert_unsupported("etcd://host:2379/key"); + } } From 81eaa49c4f243206f0d2ee740e00967a311189cc Mon Sep 17 00:00:00 2001 From: Albert Hui Date: Mon, 27 Jul 2026 14:46:17 +0800 Subject: [PATCH 3/5] refactor(remote)!: scope OpenDAL backends to evidence-transfer targets (ADR-0010) Narrow the `remote` feature's OpenDAL service set from ~50 services to the forensically-relevant evidence-transfer targets DFIR collectors read from and write to. `remote` stays opt-in and remote-free-by-default (ADR-0002 unchanged). KEEP (20 services + blocking): object storage (s3, gcs, azblob, azdls, azfile, b2, cos, obs, oss, swift), cloud drive (gdrive), Hadoop (webhdfs, hdfs-native), SQL (mysql, postgresql, sqlite), local/protocol (fs, http, webdav, memory). Non-opendal SFTP (ssh2) and FTP (suppaftp) are unchanged. DROP (37 services + the rocksdb-storage feature): native DB/KV + caches (rocksdb, etcd, tikv, mongodb, gridfs, redis[+native-tls], memcached, sled, redb, persy, moka, mini-moka, dashmap, cacache), dev/ML/CI-cache (github, huggingface, vercel-blob, vercel-artifacts, ghac), big data (alluxio, lakefs, dbfs), decentralized (ipfs, ipmfs), alt-runtime fs (compfs, monoiofs), Cloudflare (cloudflare-kv, d1), consumer drives (onedrive, dropbox, aliyun-drive, yandex-disk, pcloud, koofr, seafile, upyun). - Removes the etcd/tikv gRPC (tonic/prost) chains, so the protoc install step leaves ci.yml (all three OSes + coverage + msrv jobs). - Removes librocksdb-sys (bundled C++), easing Windows-linker memory pressure. - Dropped schemes fall through to the `other =>` arm -> "unsupported URI scheme". - mod.rs still detects the dropped schemes as remote URIs, so they yield a clear unsupported-scheme error rather than being mistaken for local paths; the two dead `rocksdb-storage` cfg refs were removed (the feature no longer exists). Co-Authored-By: Claude Opus 4.8 --- .github/workflows/ci.yml | 15 +- Cargo.lock | 2159 ++----------------------------------- Cargo.toml | 72 +- deny.toml | 7 +- src/remote/mod.rs | 4 - src/remote/operator.rs | 379 +------ tests/remote_uri_tests.rs | 153 --- 7 files changed, 124 insertions(+), 2665 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1fd565..71b63d3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,23 +20,16 @@ jobs: steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable - # etcd-client (opendal services-etcd) requires protoc at build time # mold linker is ~3x faster and far more memory-efficient than lld on Linux — # prevents SIGBUS OOM crashes when linking large binaries on 7 GB runners - - name: Install protoc + mold (Linux) + - name: Install mold (Linux) if: runner.os == 'Linux' - run: sudo apt-get update -qq && sudo apt-get install -y protobuf-compiler clang mold + run: sudo apt-get update -qq && sudo apt-get install -y clang mold - name: Use mold linker (Linux) if: runner.os == 'Linux' run: | mkdir -p ~/.cargo printf '[target.x86_64-unknown-linux-gnu]\nlinker = "clang"\nrustflags = ["-C", "link-arg=-fuse-ld=mold"]\n' >> ~/.cargo/config.toml - - name: Install protoc (macOS) - if: runner.os == 'macOS' - run: brew install protobuf - - name: Install protoc (Windows) - if: runner.os == 'Windows' - run: choco install protoc --no-progress - run: cargo test --all-features - run: cargo test --features hashdb - run: cargo test --features yara @@ -57,8 +50,6 @@ jobs: with: components: llvm-tools-preview - uses: taiki-e/install-action@a402910a723481c4c80d006d75298c796a9c8695 # cargo-llvm-cov - - name: Install protoc - run: sudo apt-get update -qq && sudo apt-get install -y protobuf-compiler - name: Generate coverage run: cargo llvm-cov --all-features --lcov --output-path lcov.info - name: Upload to Codecov @@ -73,8 +64,6 @@ jobs: steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - uses: dtolnay/rust-toolchain@1.88.0 - - name: Install protoc - run: sudo apt-get update -qq && sudo apt-get install -y protobuf-compiler - run: cargo check --all-features deny: diff --git a/Cargo.lock b/Cargo.lock index c44ac10..f4e8dda 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -174,15 +174,6 @@ dependencies = [ "derive_arbitrary", ] -[[package]] -name = "arc-swap" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" -dependencies = [ - "rustversion", -] - [[package]] name = "argon2" version = "0.5.3" @@ -664,45 +655,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "async-recursion" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7d78656ba01f1b93024b7c3a0467f1608e4be67d725749fdcd7d2c7678fd7a2" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - [[package]] name = "async-trait" version = "0.1.89" @@ -729,111 +681,12 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "auto-const-array" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd73835ad7deb4bd2b389e6f10333b143f025d607c55ca04c66a0bcc6bb2fc6d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "axum" -version = "0.6.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" -dependencies = [ - "async-trait", - "axum-core 0.3.4", - "bitflags 1.3.2", - "bytes", - "futures-util", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "itoa", - "matchit 0.7.3", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper 0.1.2", - "tower 0.4.13", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" -dependencies = [ - "axum-core 0.5.6", - "bytes", - "futures-util", - "http 1.4.0", - "http-body 1.0.1", - "http-body-util", - "itoa", - "matchit 0.8.4", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "serde_core", - "sync_wrapper 1.0.2", - "tower 0.5.3", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http 0.2.12", - "http-body 0.4.6", - "mime", - "rustversion", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" -dependencies = [ - "bytes", - "futures-core", - "http 1.4.0", - "http-body 1.0.1", - "http-body-util", - "mime", - "pin-project-lite", - "sync_wrapper 1.0.2", - "tower-layer", - "tower-service", -] - [[package]] name = "backon" version = "1.6.0" @@ -875,18 +728,6 @@ version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" -[[package]] -name = "bb8" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "457d7ed3f888dfd2c7af56d4975cade43c622f74bdcddfed6d4352f57acc6310" -dependencies = [ - "futures-util", - "parking_lot 0.12.5", - "portable-atomic", - "tokio", -] - [[package]] name = "beef" version = "0.5.2" @@ -902,27 +743,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bindgen" -version = "0.65.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" -dependencies = [ - "bitflags 1.3.2", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "peeking_take_while", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn 2.0.117", -] - [[package]] name = "bit-set" version = "0.6.0" @@ -1031,7 +851,7 @@ dependencies = [ "indicatif", "libc", "md-5", - "memmap2 0.9.10", + "memmap2", "minijinja", "ml-dsa", "notify", @@ -1192,29 +1012,6 @@ dependencies = [ "alloc-stdlib", ] -[[package]] -name = "bson" -version = "2.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969a9ba84b0ff843813e7249eed1678d9b6607ce5a3b8f0a47af3fcf7978e6e" -dependencies = [ - "ahash 0.8.12", - "base64 0.22.1", - "bitvec", - "getrandom 0.2.17", - "getrandom 0.3.4", - "hex", - "indexmap 2.14.0", - "js-sys", - "once_cell", - "rand 0.9.3", - "serde", - "serde_bytes", - "serde_json", - "time", - "uuid", -] - [[package]] name = "bstr" version = "1.12.1" @@ -1254,12 +1051,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "bytecount" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" - [[package]] name = "bytemuck" version = "1.25.0" @@ -1294,74 +1085,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "bzip2-sys" -version = "0.1.13+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "cacache" -version = "13.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5063741c7b2e260bbede781cf4679632dd90e2718e99f7715e46824b65670b" -dependencies = [ - "digest 0.10.7", - "either", - "futures", - "hex", - "libc", - "memmap2 0.5.10", - "miette", - "reflink-copy", - "serde", - "serde_derive", - "serde_json", - "sha1", - "sha2", - "ssri", - "tempfile", - "thiserror 1.0.69", - "tokio", - "tokio-stream", - "walkdir", -] - -[[package]] -name = "camino" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" -dependencies = [ - "serde_core", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", -] - [[package]] name = "cassowary" version = "0.3.0" @@ -1404,15 +1127,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - [[package]] name = "cfg-if" version = "1.0.4" @@ -1455,17 +1169,6 @@ dependencies = [ "inout", ] -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading 0.8.9", -] - [[package]] name = "clap" version = "4.6.0" @@ -1587,20 +1290,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "futures-core", - "memchr", - "pin-project-lite", - "tokio", - "tokio-util", -] - [[package]] name = "comfy-table" version = "7.2.2" @@ -1626,195 +1315,52 @@ dependencies = [ ] [[package]] -name = "compio" -version = "0.16.1" +name = "concurrent-queue" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6829f76b635c05ef91f97dc44c3b27eb72f346179bd47c5018cd033d913420d" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ - "compio-buf", - "compio-dispatcher", - "compio-driver", - "compio-fs", - "compio-io", - "compio-log", - "compio-net", - "compio-runtime", + "crossbeam-utils", ] [[package]] -name = "compio-buf" -version = "0.7.2" +name = "console" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ebb4036bf394915196c09362e4fd5581ee8bf0f3302ab598bff9d646aea2061" +checksum = "4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c" dependencies = [ - "arrayvec", - "bytes", + "encode_unicode", "libc", + "unicode-width 0.2.0", + "windows-sys 0.61.2", ] [[package]] -name = "compio-dispatcher" -version = "0.8.1" +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[package]] +name = "const-random" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff5d99ec2303ea61b4f4d2e2ebde551fce16462a479c59da0ff637bfb1951c9" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" dependencies = [ - "compio-driver", - "compio-runtime", - "flume", - "futures-channel", + "const-random-macro", ] [[package]] -name = "compio-driver" -version = "0.9.2" +name = "const-random-macro" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f8915a1e560ab8be655c23771502a107d2802941a83fbf142734bed60a11441" -dependencies = [ - "cfg-if", - "cfg_aliases 0.2.1", - "compio-buf", - "compio-log", - "crossbeam-queue", - "flume", - "futures-util", - "io-uring 0.7.11", - "io_uring_buf_ring", - "libc", - "once_cell", - "paste", - "polling", - "slab", - "socket2 0.6.3", - "windows-sys 0.61.2", -] - -[[package]] -name = "compio-fs" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea585c274239b9fd350a484c75a31fd0df5f031805b6664d83a98f5e8b019e2f" -dependencies = [ - "cfg-if", - "cfg_aliases 0.2.1", - "compio-buf", - "compio-driver", - "compio-io", - "compio-runtime", - "libc", - "os_pipe", - "widestring", - "windows-sys 0.61.2", -] - -[[package]] -name = "compio-io" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1e64c6d723589492a4f5041394301e9903466a606f6d9bcc11e406f9f07e9ec" -dependencies = [ - "compio-buf", - "futures-util", - "paste", -] - -[[package]] -name = "compio-log" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4e560213c1996b618da369b7c9109564b41af9033802ae534465c4ee4e132f" -dependencies = [ - "tracing", -] - -[[package]] -name = "compio-net" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e6ea7aa4a9f38d68dd0098a11232236cb3efd0ef3cab50ecdada3d745f1f776" -dependencies = [ - "cfg-if", - "compio-buf", - "compio-driver", - "compio-io", - "compio-runtime", - "either", - "libc", - "once_cell", - "socket2 0.6.3", - "widestring", - "windows-sys 0.61.2", -] - -[[package]] -name = "compio-runtime" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b467b43c646a60bae3bb3a55c2c200ea7c4416a63cc5a6070450aa6771b3c62e" -dependencies = [ - "async-task", - "cfg-if", - "compio-buf", - "compio-driver", - "compio-log", - "core_affinity", - "crossbeam-queue", - "futures-util", - "libc", - "once_cell", - "pin-project-lite", - "scoped-tls", - "slab", - "socket2 0.6.3", - "windows-sys 0.61.2", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "console" -version = "0.16.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c" -dependencies = [ - "encode_unicode", - "libc", - "unicode-width 0.2.0", - "windows-sys 0.61.2", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const-oid" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" - -[[package]] -name = "const-random" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" -dependencies = [ - "const-random-macro", -] - -[[package]] -name = "const-random-macro" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ "getrandom 0.2.17", "once_cell", @@ -1833,15 +1379,6 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" -[[package]] -name = "convert_case" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "core-foundation" version = "0.9.4" @@ -1879,17 +1416,6 @@ dependencies = [ "libc", ] -[[package]] -name = "core_affinity" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a034b3a7b624016c6e13f5df875747cc25f884156aad2abd12b6c46797971342" -dependencies = [ - "libc", - "num_cpus", - "winapi", -] - [[package]] name = "countme" version = "3.0.1" @@ -2051,12 +1577,6 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" -[[package]] -name = "crc16" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338089f42c427b86394a5ee60ff321da23a5c89c9d89514c829687b26359fcff" - [[package]] name = "crc32c" version = "0.6.8" @@ -2075,12 +1595,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "critical-section" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" - [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -2133,7 +1647,7 @@ dependencies = [ "bitflags 2.11.0", "crossterm_winapi", "mio 1.2.0", - "parking_lot 0.12.5", + "parking_lot", "rustix 0.38.44", "signal-hook", "signal-hook-mio", @@ -2332,33 +1846,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core 0.9.12", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core 0.9.12", -] - [[package]] name = "data-encoding" version = "2.10.0" @@ -2415,39 +1902,6 @@ dependencies = [ "powerfmt", ] -[[package]] -name = "derive-new" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive-syn-parse" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "derive-where" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "derive_arbitrary" version = "1.4.2" @@ -2459,29 +1913,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "derive_more" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.117", - "unicode-xid", -] - [[package]] name = "des" version = "0.8.1" @@ -2568,7 +1999,7 @@ checksum = "6e39034cee21a2f5bbb66ba0e3689819c4bb5d00382a282006e802a7ffa6c41d" dependencies = [ "cfg-if", "libc", - "socket2 0.6.3", + "socket2", "windows-sys 0.60.2", ] @@ -2707,18 +2138,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "enum_dispatch" version = "0.3.13" @@ -2747,33 +2166,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "error-chain" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" -dependencies = [ - "version_check", -] - -[[package]] -name = "etcd-client" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acfe553027cd07fc5fafa81a84f19a7a87eaffaccd2162b6db05e8d6ce98084" -dependencies = [ - "http 1.4.0", - "prost 0.14.3", - "tokio", - "tokio-stream", - "tonic 0.14.2", - "tonic-build", - "tonic-prost", - "tonic-prost-build", - "tower 0.5.3", - "tower-service", -] - [[package]] name = "etcetera" version = "0.8.0" @@ -2822,17 +2214,6 @@ dependencies = [ "thiserror 2.0.18", ] -[[package]] -name = "fail" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be3c61c59fdc91f5dbc3ea31ee8623122ce80057058be560654c5d410d181a6" -dependencies = [ - "lazy_static", - "log", - "rand 0.7.3", -] - [[package]] name = "fallible-iterator" version = "0.2.0" @@ -2899,12 +2280,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" -[[package]] -name = "fixedbitset" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" - [[package]] name = "flatbuffers" version = "24.12.23" @@ -2943,7 +2318,6 @@ checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "futures-core", "futures-sink", - "nanorand", "spin", ] @@ -3024,16 +2398,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fs2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "fs4" version = "0.6.6" @@ -3109,7 +2473,7 @@ checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" dependencies = [ "futures-core", "lock_api", - "parking_lot 0.12.5", + "parking_lot", ] [[package]] @@ -3171,15 +2535,6 @@ dependencies = [ "slab", ] -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "g2gen" version = "1.2.2" @@ -3219,17 +2574,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.17" @@ -3239,7 +2583,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] @@ -3270,15 +2614,6 @@ dependencies = [ "wasip3", ] -[[package]] -name = "ghac" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a10bd5b898cac1a4de4a882a754b2ccaafead449348cfb420b48cd5c00ffd08b" -dependencies = [ - "prost 0.13.5", -] - [[package]] name = "gimli" version = "0.26.2" @@ -3404,7 +2739,7 @@ dependencies = [ "presser", "thiserror 1.0.69", "winapi", - "windows 0.52.0", + "windows", ] [[package]] @@ -3438,44 +2773,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "h2" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.14.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.4.0", - "indexmap 2.14.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "half" version = "2.7.1" @@ -3592,12 +2889,12 @@ dependencies = [ "md-5", "num-traits", "once_cell", - "prost 0.14.3", + "prost", "prost-types", "rand 0.9.3", "regex", "roxmltree 0.21.1", - "socket2 0.6.3", + "socket2", "thiserror 2.0.18", "tokio", "url", @@ -3617,12 +2914,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - [[package]] name = "hex" version = "0.4.3" @@ -3635,52 +2926,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" -[[package]] -name = "hickory-proto" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" -dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna", - "ipnet", - "once_cell", - "rand 0.9.3", - "ring", - "thiserror 2.0.18", - "tinyvec", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "hickory-resolver" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" -dependencies = [ - "cfg-if", - "futures-util", - "hickory-proto", - "ipconfig", - "moka", - "once_cell", - "parking_lot 0.12.5", - "rand 0.9.3", - "resolv-conf", - "smallvec", - "thiserror 2.0.18", - "tokio", - "tracing", -] - [[package]] name = "hkdf" version = "0.12.4" @@ -3708,17 +2953,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.4.0" @@ -3738,17 +2972,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -3756,7 +2979,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.4.0", + "http", ] [[package]] @@ -3767,8 +2990,8 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http 1.4.0", - "http-body 1.0.1", + "http", + "http-body", "pin-project-lite", ] @@ -3778,12 +3001,6 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "hybrid-array" version = "0.4.10" @@ -3793,30 +3010,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "hyper" -version = "0.14.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.27", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.9.0" @@ -3827,11 +3020,9 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "h2 0.4.13", - "http 1.4.0", - "http-body 1.0.1", + "http", + "http-body", "httparse", - "httpdate", "itoa", "pin-project-lite", "smallvec", @@ -3845,42 +3036,17 @@ version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "http 1.4.0", - "hyper 1.9.0", + "http", + "hyper", "hyper-util", "rustls 0.23.37", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tower-service", "webpki-roots 1.0.6", ] -[[package]] -name = "hyper-timeout" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" -dependencies = [ - "hyper 0.14.32", - "pin-project-lite", - "tokio", - "tokio-io-timeout", -] - -[[package]] -name = "hyper-timeout" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" -dependencies = [ - "hyper 1.9.0", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", -] - [[package]] name = "hyper-tls" version = "0.6.0" @@ -3889,7 +3055,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.9.0", + "hyper", "hyper-util", "native-tls", "tokio", @@ -3907,14 +3073,14 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.4.0", - "http-body 1.0.1", - "hyper 1.9.0", + "http", + "http-body", + "hyper", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.3", + "socket2", "tokio", "tower-service", "tracing", @@ -4175,15 +3341,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - [[package]] name = "intaglio" version = "1.13.3" @@ -4196,50 +3353,6 @@ version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" -[[package]] -name = "io-uring" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595a0399f411a508feb2ec1e970a4a30c249351e30208960d58298de8660b0e5" -dependencies = [ - "bitflags 1.3.2", - "libc", -] - -[[package]] -name = "io-uring" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd7bddefd0a8833b88a4b68f90dae22c7450d11b354198baee3874fd811b344" -dependencies = [ - "bitflags 2.11.0", - "cfg-if", - "libc", -] - -[[package]] -name = "io_uring_buf_ring" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1838759bb8c2f24cf05a35429d83145c4aa6af43f8ad38477295e12a7320a80e" -dependencies = [ - "bytes", - "io-uring 0.7.11", - "rustix 1.1.4", -] - -[[package]] -name = "ipconfig" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" -dependencies = [ - "socket2 0.5.10", - "widestring", - "windows-sys 0.48.0", - "winreg", -] - [[package]] name = "ipnet" version = "2.12.0" @@ -4495,12 +3608,6 @@ dependencies = [ "spin", ] -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "leb128" version = "0.2.5" @@ -4631,20 +3738,6 @@ dependencies = [ "redox_syscall 0.7.4", ] -[[package]] -name = "librocksdb-sys" -version = "0.11.0+8.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3386f101bcb4bd252d8e9d2fb41ec3b0862a15a62b478c355b2982efa469e3e" -dependencies = [ - "bindgen", - "bzip2-sys", - "cc", - "glob", - "libc", - "libz-sys", -] - [[package]] name = "libsqlite3-sys" version = "0.28.0" @@ -4682,12 +3775,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - [[package]] name = "linkme" version = "0.3.35" @@ -4823,54 +3910,6 @@ dependencies = [ "libc", ] -[[package]] -name = "macro_magic" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc33f9f0351468d26fbc53d9ce00a096c8522ecb42f19b50f34f2c422f76d21d" -dependencies = [ - "macro_magic_core", - "macro_magic_macros", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "macro_magic_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1687dc887e42f352865a393acae7cf79d98fab6351cde1f58e9e057da89bf150" -dependencies = [ - "const-random", - "derive-syn-parse", - "macro_magic_core_macros", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "macro_magic_core_macros" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "macro_magic_macros" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" -dependencies = [ - "macro_magic_core", - "quote", - "syn 2.0.117", -] - [[package]] name = "malloc_buf" version = "0.0.6" @@ -4880,18 +3919,6 @@ dependencies = [ "libc", ] -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - [[package]] name = "md-5" version = "0.10.6" @@ -4926,15 +3953,6 @@ dependencies = [ "rustix 1.1.4", ] -[[package]] -name = "memmap2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" -dependencies = [ - "libc", -] - [[package]] name = "memmap2" version = "0.9.10" @@ -4959,15 +3977,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38d1115007560874e373613744c6fba374c17688327a71c1476d1a5954cc857b" -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.1" @@ -5001,50 +4010,6 @@ dependencies = [ "paste", ] -[[package]] -name = "miette" -version = "5.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" -dependencies = [ - "miette-derive", - "once_cell", - "thiserror 1.0.69", - "unicode-width 0.1.14", -] - -[[package]] -name = "miette-derive" -version = "5.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mini-moka" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c325dfab65f261f386debee8b0969da215b3fa0037e74c8a1234db7ba986d803" -dependencies = [ - "crossbeam-channel", - "crossbeam-utils", - "dashmap 5.5.3", - "skeptic", - "smallvec", - "tagptr", - "triomphe", -] - [[package]] name = "minijinja" version = "2.19.0" @@ -5079,7 +4044,7 @@ checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "windows-sys 0.48.0", ] @@ -5091,7 +4056,7 @@ checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "log", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "windows-sys 0.61.2", ] @@ -5134,123 +4099,13 @@ dependencies = [ "equivalent", "event-listener", "futures-util", - "parking_lot 0.12.5", + "parking_lot", "portable-atomic", "smallvec", "tagptr", "uuid", ] -[[package]] -name = "mongocrypt" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da0cd419a51a5fb44819e290fbdb0665a54f21dead8923446a799c7f4d26ad9" -dependencies = [ - "bson", - "mongocrypt-sys", - "once_cell", - "serde", -] - -[[package]] -name = "mongocrypt-sys" -version = "0.1.5+1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224484c5d09285a7b8cb0a0c117e847ebd14cb6e4470ecf68cdb89c503b0edb9" - -[[package]] -name = "mongodb" -version = "3.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c5941683db2ab2697f71e58dc0319024e808d3b28e7cf20f4bfb445fe54a30b" -dependencies = [ - "base64 0.22.1", - "bitflags 2.11.0", - "bson", - "derive-where", - "derive_more", - "futures-core", - "futures-io", - "futures-util", - "hex", - "hickory-proto", - "hickory-resolver", - "hmac", - "macro_magic", - "md-5", - "mongocrypt", - "mongodb-internal-macros", - "pbkdf2", - "percent-encoding", - "rand 0.9.3", - "rustc_version_runtime", - "rustls 0.23.37", - "rustversion", - "serde", - "serde_bytes", - "serde_with", - "sha1", - "sha2", - "socket2 0.6.3", - "stringprep", - "strsim", - "take_mut", - "thiserror 2.0.18", - "tokio", - "tokio-rustls 0.26.4", - "tokio-util", - "typed-builder", - "uuid", - "webpki-roots 1.0.6", -] - -[[package]] -name = "mongodb-internal-macros" -version = "3.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47021a12bbf0dffde9c890fa2d36ff6ae342c532016226b04a42301b2b912660" -dependencies = [ - "macro_magic", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "monoio" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd0f8bcde87b1949f95338b547543fcab187bc7e7a5024247e359a5e828ba6a" -dependencies = [ - "auto-const-array", - "bytes", - "flume", - "fxhash", - "io-uring 0.6.4", - "libc", - "memchr", - "mio 0.8.11", - "monoio-macros", - "nix", - "once_cell", - "pin-project-lite", - "socket2 0.5.10", - "threadpool", - "windows-sys 0.48.0", -] - -[[package]] -name = "monoio-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176a5f5e69613d9e88337cf2a65e11135332b4efbcc628404a7c555e4452084c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "moxcms" version = "0.8.1" @@ -5261,12 +4116,6 @@ dependencies = [ "pxfm", ] -[[package]] -name = "multimap" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" - [[package]] name = "naga" version = "22.1.0" @@ -5288,15 +4137,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom 0.2.17", -] - [[package]] name = "native-tls" version = "0.2.18" @@ -5323,19 +4163,6 @@ dependencies = [ "jni-sys 0.3.1", ] -[[package]] -name = "nix" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", - "memoffset 0.7.1", - "pin-utils", -] - [[package]] name = "nom" version = "7.1.3" @@ -5478,16 +4305,6 @@ dependencies = [ "libm", ] -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "objc" version = "0.2.7" @@ -5527,7 +4344,7 @@ dependencies = [ "bytes", "chrono", "futures-util", - "http 1.4.0", + "http", "http-auth", "jwt", "lazy_static", @@ -5568,10 +4385,6 @@ name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" -dependencies = [ - "critical-section", - "portable-atomic", -] [[package]] name = "once_cell_polyfill" @@ -5588,46 +4401,26 @@ dependencies = [ "anyhow", "backon", "base64 0.22.1", - "bb8", "bytes", - "cacache", - "compio", "crc32c", - "dashmap 6.1.0", - "etcd-client", - "flume", "futures", "getrandom 0.2.17", - "ghac", "hdfs-native", - "hmac", - "http 1.4.0", - "http-body 1.0.1", + "http", + "http-body", "jiff", "log", "md-5", - "mini-moka", "moka", - "mongodb", - "mongodb-internal-macros", - "monoio", "ouroboros", "percent-encoding", - "persy", - "prost 0.13.5", "quick-xml 0.38.4", - "redb", - "redis", "reqsign", "reqwest", - "rocksdb", "serde", "serde_json", - "sha1", "sha2", - "sled", "sqlx", - "tikv-client", "tokio", "url", "uuid", @@ -5712,16 +4505,6 @@ dependencies = [ "hashbrown 0.14.5", ] -[[package]] -name = "os_pipe" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - [[package]] name = "ouroboros" version = "0.18.5" @@ -5776,17 +4559,6 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - [[package]] name = "parking_lot" version = "0.12.5" @@ -5794,21 +4566,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", - "parking_lot_core 0.9.12", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", + "parking_lot_core", ] [[package]] @@ -5910,83 +4668,30 @@ dependencies = [ "hmac", ] -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "pem" version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" dependencies = [ - "base64 0.22.1", - "serde_core", -] - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "persy" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bce6ad02b7ddcdd9978d99d17bb2c717c8e15b94801785a262641cbdf10c5a5" -dependencies = [ - "crc", - "data-encoding", - "fs2", - "linked-hash-map", - "rand 0.9.3", - "thiserror 2.0.18", - "unsigned-varint", - "zigzag", -] - -[[package]] -name = "petgraph" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" -dependencies = [ - "fixedbitset", - "hashbrown 0.15.5", - "indexmap 2.14.0", + "base64 0.22.1", + "serde_core", ] [[package]] -name = "pin-project" -version = "1.1.11" +name = "pem-rfc7468" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" dependencies = [ - "pin-project-internal", + "base64ct", ] [[package]] -name = "pin-project-internal" -version = "1.1.11" +name = "percent-encoding" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project-lite" @@ -5994,12 +4699,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "pkcs1" version = "0.7.5" @@ -6073,20 +4772,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "polling" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 1.1.4", - "windows-sys 0.61.2", -] - [[package]] name = "pollster" version = "0.3.0" @@ -6236,40 +4921,6 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" -[[package]] -name = "prometheus" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1" -dependencies = [ - "cfg-if", - "fnv", - "lazy_static", - "memchr", - "parking_lot 0.12.5", - "thiserror 1.0.69", -] - -[[package]] -name = "prost" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" -dependencies = [ - "bytes", - "prost-derive 0.12.6", -] - -[[package]] -name = "prost" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" -dependencies = [ - "bytes", - "prost-derive 0.13.5", -] - [[package]] name = "prost" version = "0.14.3" @@ -6277,54 +4928,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" dependencies = [ "bytes", - "prost-derive 0.14.3", -] - -[[package]] -name = "prost-build" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" -dependencies = [ - "heck 0.5.0", - "itertools 0.13.0", - "log", - "multimap", - "petgraph", - "prettyplease", - "prost 0.14.3", - "prost-types", - "pulldown-cmark 0.13.3", - "pulldown-cmark-to-cmark", - "regex", - "syn 2.0.117", - "tempfile", -] - -[[package]] -name = "prost-derive" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" -dependencies = [ - "anyhow", - "itertools 0.12.1", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "prost-derive" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" -dependencies = [ - "anyhow", - "itertools 0.13.0", - "proc-macro2", - "quote", - "syn 2.0.117", + "prost-derive", ] [[package]] @@ -6346,7 +4950,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" dependencies = [ - "prost 0.14.3", + "prost", ] [[package]] @@ -6430,37 +5034,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "pulldown-cmark" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" -dependencies = [ - "bitflags 2.11.0", - "memchr", - "unicase", -] - -[[package]] -name = "pulldown-cmark" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" -dependencies = [ - "bitflags 2.11.0", - "memchr", - "unicase", -] - -[[package]] -name = "pulldown-cmark-to-cmark" -version = "22.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50793def1b900256624a709439404384204a5dc3a6ec580281bfaac35e882e90" -dependencies = [ - "pulldown-cmark 0.13.3", -] - [[package]] name = "pxfm" version = "0.1.28" @@ -6509,7 +5082,7 @@ dependencies = [ "quinn-udp", "rustc-hash 2.1.2", "rustls 0.23.37", - "socket2 0.6.3", + "socket2", "thiserror 2.0.18", "tokio", "tracing", @@ -6546,7 +5119,7 @@ dependencies = [ "cfg_aliases 0.2.1", "libc", "once_cell", - "socket2 0.6.3", + "socket2", "tracing", "windows-sys 0.60.2", ] @@ -6578,19 +5151,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - [[package]] name = "rand" version = "0.8.5" @@ -6612,16 +5172,6 @@ dependencies = [ "rand_core 0.9.5", ] -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - [[package]] name = "rand_chacha" version = "0.3.1" @@ -6642,15 +5192,6 @@ dependencies = [ "rand_core 0.9.5", ] -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - [[package]] name = "rand_core" version = "0.6.4" @@ -6675,15 +5216,6 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - [[package]] name = "range-alloc" version = "0.1.5" @@ -6737,58 +5269,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "redb" -version = "2.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eca1e9d98d5a7e9002d0013e18d5a9b000aee942eb134883a82f06ebffb6c01" -dependencies = [ - "libc", -] - -[[package]] -name = "redis" -version = "0.32.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "014cc767fefab6a3e798ca45112bccad9c6e0e218fbd49720042716c73cfef44" -dependencies = [ - "arc-swap", - "backon", - "bytes", - "cfg-if", - "combine", - "crc16", - "futures-channel", - "futures-sink", - "futures-util", - "itoa", - "log", - "native-tls", - "num-bigint", - "percent-encoding", - "pin-project-lite", - "rand 0.9.3", - "rustls 0.23.37", - "rustls-native-certs", - "ryu", - "sha1_smol", - "socket2 0.6.3", - "tokio", - "tokio-native-tls", - "tokio-rustls 0.26.4", - "tokio-util", - "url", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.5.18" @@ -6818,18 +5298,6 @@ dependencies = [ "thiserror 1.0.69", ] -[[package]] -name = "reflink-copy" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13362233b147e57674c37b802d216b7c5e3dcccbed8967c84f0d8d223868ae27" -dependencies = [ - "cfg-if", - "libc", - "rustix 1.1.4", - "windows 0.62.2", -] - [[package]] name = "regalloc2" version = "0.10.2" @@ -6908,7 +5376,7 @@ dependencies = [ "hex", "hmac", "home", - "http 1.4.0", + "http", "jsonwebtoken", "log", "once_cell", @@ -6936,10 +5404,10 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "http 1.4.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", - "hyper 1.9.0", + "hyper", "hyper-rustls", "hyper-tls", "hyper-util", @@ -6954,12 +5422,12 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", "tokio-native-tls", - "tokio-rustls 0.26.4", + "tokio-rustls", "tokio-util", - "tower 0.5.3", + "tower", "tower-http", "tower-service", "url", @@ -6970,12 +5438,6 @@ dependencies = [ "webpki-roots 1.0.6", ] -[[package]] -name = "resolv-conf" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" - [[package]] name = "rfc6979" version = "0.4.0" @@ -7038,16 +5500,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "rocksdb" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6f170a4041d50a0ce04b0d2e14916d6ca863ea2e422689a5b694395d299ffe" -dependencies = [ - "libc", - "librocksdb-sys", -] - [[package]] name = "roff" version = "1.1.1" @@ -7062,7 +5514,7 @@ checksum = "62f509095fc8cc0c8c8564016771d458079c11a8d857e65861f045145c0d3208" dependencies = [ "countme", "hashbrown 0.14.5", - "memoffset 0.9.1", + "memoffset", "rustc-hash 1.1.0", "text-size", ] @@ -7177,16 +5629,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustc_version_runtime" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dd18cd2bae1820af0b6ad5e54f4a51d0f3fcc53b05f845675074efcc7af071d" -dependencies = [ - "rustc_version", - "semver", -] - [[package]] name = "rusticata-macros" version = "4.1.0" @@ -7228,7 +5670,6 @@ version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ - "log", "ring", "rustls-webpki 0.101.7", "sct", @@ -7249,18 +5690,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-native-certs" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework", -] - [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -7349,12 +5778,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" version = "1.2.0" @@ -7430,10 +5853,6 @@ name = "semver" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" -dependencies = [ - "serde", - "serde_core", -] [[package]] name = "seq-macro" @@ -7451,16 +5870,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde_bytes" -version = "0.11.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" -dependencies = [ - "serde", - "serde_core", -] - [[package]] name = "serde_core" version = "1.0.228" @@ -7508,34 +5917,12 @@ dependencies = [ name = "serde_urlencoded" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" -dependencies = [ - "serde_core", - "serde_with_macros", -] - -[[package]] -name = "serde_with_macros" -version = "3.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" -dependencies = [ - "darling 0.23.0", - "proc-macro2", - "quote", - "syn 2.0.117", +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", ] [[package]] @@ -7687,43 +6074,12 @@ dependencies = [ "serde", ] -[[package]] -name = "skeptic" -version = "0.13.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" -dependencies = [ - "bytecount", - "cargo_metadata", - "error-chain", - "glob", - "pulldown-cmark 0.9.6", - "tempfile", - "walkdir", -] - [[package]] name = "slab" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" -[[package]] -name = "sled" -version = "0.34.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f96b4737c2ce5987354855aed3797279def4ebf734436c6aa4552cf8e169935" -dependencies = [ - "crc32fast", - "crossbeam-epoch", - "crossbeam-utils", - "fs2", - "fxhash", - "libc", - "log", - "parking_lot 0.11.2", -] - [[package]] name = "slice-group-by" version = "0.3.1" @@ -7763,16 +6119,6 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - [[package]] name = "socket2" version = "0.6.3" @@ -8043,24 +6389,7 @@ dependencies = [ "bitflags 2.11.0", "libc", "libssh2-sys", - "parking_lot 0.12.5", -] - -[[package]] -name = "ssri" -version = "9.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da7a2b3c2bc9693bcb40870c4e9b5bf0d79f9cb46273321bf855ec513e919082" -dependencies = [ - "base64 0.21.7", - "digest 0.10.7", - "hex", - "miette", - "serde", - "sha-1", - "sha2", - "thiserror 1.0.69", - "xxhash-rust", + "parking_lot", ] [[package]] @@ -8209,12 +6538,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - [[package]] name = "sync_wrapper" version = "1.0.2" @@ -8241,12 +6564,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" - [[package]] name = "tap" version = "1.0.1" @@ -8344,15 +6661,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - [[package]] name = "thrift" version = "0.17.0" @@ -8373,33 +6681,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "tikv-client" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "048968e4e3d04db472346770cc19914c6b5ae206fa44677f6a0874d54cd05940" -dependencies = [ - "async-recursion", - "async-trait", - "derive-new", - "either", - "fail", - "futures", - "lazy_static", - "log", - "pin-project", - "prometheus", - "prost 0.12.6", - "rand 0.8.5", - "regex", - "semver", - "serde", - "serde_derive", - "thiserror 1.0.69", - "tokio", - "tonic 0.10.2", -] - [[package]] name = "time" version = "0.3.47" @@ -8486,24 +6767,12 @@ dependencies = [ "bytes", "libc", "mio 1.2.0", - "parking_lot 0.12.5", "pin-project-lite", - "signal-hook-registry", - "socket2 0.6.3", + "socket2", "tokio-macros", "windows-sys 0.61.2", ] -[[package]] -name = "tokio-io-timeout" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bd86198d9ee903fedd2f9a2e72014287c0d9167e4ae43b5853007205dda1b76" -dependencies = [ - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-macros" version = "2.7.0" @@ -8525,16 +6794,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.4" @@ -8564,7 +6823,6 @@ checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", - "futures-io", "futures-sink", "pin-project-lite", "tokio", @@ -8641,125 +6899,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" -[[package]] -name = "tonic" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" -dependencies = [ - "async-stream", - "async-trait", - "axum 0.6.20", - "base64 0.21.7", - "bytes", - "h2 0.3.27", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-timeout 0.4.1", - "percent-encoding", - "pin-project", - "prost 0.12.6", - "rustls 0.21.12", - "rustls-pemfile", - "tokio", - "tokio-rustls 0.24.1", - "tokio-stream", - "tower 0.4.13", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tonic" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7613188ce9f7df5bfe185db26c5814347d110db17920415cf2fbcad85e7203" -dependencies = [ - "async-trait", - "axum 0.8.8", - "base64 0.22.1", - "bytes", - "h2 0.4.13", - "http 1.4.0", - "http-body 1.0.1", - "http-body-util", - "hyper 1.9.0", - "hyper-timeout 0.5.2", - "hyper-util", - "percent-encoding", - "pin-project", - "socket2 0.6.3", - "sync_wrapper 1.0.2", - "tokio", - "tokio-rustls 0.26.4", - "tokio-stream", - "tower 0.5.3", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tonic-build" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1882ac3bf5ef12877d7ed57aad87e75154c11931c2ba7e6cde5e22d63522c734" -dependencies = [ - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "tonic-prost" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" -dependencies = [ - "bytes", - "prost 0.14.3", - "tonic 0.14.2", -] - -[[package]] -name = "tonic-prost-build" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3144df636917574672e93d0f56d7edec49f90305749c668df5101751bb8f95a" -dependencies = [ - "prettyplease", - "proc-macro2", - "prost-build", - "prost-types", - "quote", - "syn 2.0.117", - "tempfile", - "tonic-build", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "indexmap 1.9.3", - "pin-project", - "pin-project-lite", - "rand 0.8.5", - "slab", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "tower" version = "0.5.3" @@ -8768,15 +6907,11 @@ checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", - "indexmap 2.14.0", "pin-project-lite", - "slab", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", - "tokio-util", "tower-layer", "tower-service", - "tracing", ] [[package]] @@ -8788,11 +6923,11 @@ dependencies = [ "bitflags 2.11.0", "bytes", "futures-util", - "http 1.4.0", - "http-body 1.0.1", + "http", + "http-body", "iri-string", "pin-project-lite", - "tower 0.5.3", + "tower", "tower-layer", "tower-service", ] @@ -8841,12 +6976,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "triomphe" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" - [[package]] name = "try-lock" version = "0.2.5" @@ -8869,26 +6998,6 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" -[[package]] -name = "typed-builder" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "398a3a3c918c96de527dc11e6e846cd549d4508030b8a33e1da12789c856b81a" -dependencies = [ - "typed-builder-macro", -] - -[[package]] -name = "typed-builder-macro" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e48cea23f68d1f78eb7bc092881b6bb88d3d6b5b7e6234f6f9c911da1ffb221" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "typenum" version = "1.19.0" @@ -8975,12 +7084,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" -[[package]] -name = "unsigned-varint" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" - [[package]] name = "untrusted" version = "0.9.0" @@ -9110,12 +7213,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -9535,7 +7632,7 @@ dependencies = [ "js-sys", "log", "naga", - "parking_lot 0.12.5", + "parking_lot", "profiling", "raw-window-handle", "smallvec", @@ -9563,7 +7660,7 @@ dependencies = [ "log", "naga", "once_cell", - "parking_lot 0.12.5", + "parking_lot", "profiling", "raw-window-handle", "rustc-hash 1.1.0", @@ -9604,7 +7701,7 @@ dependencies = [ "ndk-sys", "objc", "once_cell", - "parking_lot 0.12.5", + "parking_lot", "profiling", "range-alloc", "raw-window-handle", @@ -9708,27 +7805,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" -dependencies = [ - "windows-collections", - "windows-core 0.62.2", - "windows-future", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" -dependencies = [ - "windows-core 0.62.2", -] - [[package]] name = "windows-core" version = "0.52.0" @@ -9751,17 +7827,6 @@ dependencies = [ "windows-strings", ] -[[package]] -name = "windows-future" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" -dependencies = [ - "windows-core 0.62.2", - "windows-link", - "windows-threading", -] - [[package]] name = "windows-implement" version = "0.60.2" @@ -9790,16 +7855,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-numerics" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" -dependencies = [ - "windows-core 0.62.2", - "windows-link", -] - [[package]] name = "windows-result" version = "0.4.1" @@ -9911,15 +7966,6 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] -[[package]] -name = "windows-threading" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" -dependencies = [ - "windows-link", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -10076,16 +8122,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wit-bindgen" version = "0.51.0" @@ -10460,15 +8496,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "zigzag" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70b40401a28d86ce16a330b863b86fd7dbee4d7c940587ab09ab8c019f9e3fdf" -dependencies = [ - "num-traits", -] - [[package]] name = "zip" version = "2.4.2" diff --git a/Cargo.toml b/Cargo.toml index 12e2fc8..fb4c3f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -143,6 +143,10 @@ signature = "2" qrcode = { version = "0.14", optional = true } image = { version = "0.25", optional = true, default-features = false, features = ["png"] } regex = "1" +# Scoped to forensically-relevant evidence-transfer targets — the stores DFIR +# collectors (Velociraptor, KAPE) read case evidence from and write collections +# back to. Native DB/KV engines, caches, dev/ML/CI-cache, decentralized and +# consumer-drive backends are intentionally excluded (see ADR-0010). opendal = { version = "0.55.0", optional = true, features = [ # Cloud object storage "services-s3", # AWS S3, MinIO, R2, Wasabi, Backblaze B2 (S3-compat) @@ -155,66 +159,24 @@ opendal = { version = "0.55.0", optional = true, features = [ "services-obs", # Huawei Cloud OBS "services-oss", # Alibaba Cloud OSS "services-swift", # OpenStack Swift - "services-upyun", # Upyun CDN storage - # Consumer / enterprise cloud drives + # Cloud drive (the one drive with dedicated wiring in src/remote/gdrive/) "services-gdrive", # Google Drive - "services-onedrive", # Microsoft OneDrive - "services-dropbox", # Dropbox - "services-aliyun-drive",# Aliyun Drive (Alibaba) - "services-yandex-disk", # Yandex Disk - "services-pcloud", # pCloud - "services-koofr", # Koofr - "services-seafile", # Seafile - # Developer / ML / infra - "services-github", # GitHub (code forensics) - "services-huggingface", # HuggingFace datasets/models - "services-vercel-artifacts", # Vercel build cache - "services-vercel-blob", # Vercel Blob - # Distributed / big data - "services-alluxio", # Alluxio data orchestration + # Hadoop "services-webhdfs", # WebHDFS REST (no JVM needed) - "services-lakefs", # LakeFS data versioning - "services-dbfs", # Databricks DBFS - "services-ghac", # GitHub Actions Cache (useful in CI forensics) - # Decentralized - "services-ipfs", # IPFS (content-addressed, prost dep is pure Rust) - "services-ipmfs", # IPFS Mutable File System - # In-memory / embedded (useful for testing + pipeline) - "services-memory", - "services-dashmap", # Concurrent in-memory map - "services-mini-moka", # Bounded in-memory cache - "services-moka", # Full-featured in-memory cache with TTL - "services-redb", # Embedded key-value (pure Rust, ACID) - "services-sled", # Embedded key-value (pure Rust) - "services-cacache", # Content-addressable disk cache - # Network key-value / databases - "services-redis", # Redis - "services-redis-native-tls", # Redis with TLS (rediss://) - "services-memcached", # Memcached - "services-etcd", # etcd (gRPC, pure Rust) - "services-tikv", # TiKV distributed KV - "services-mongodb", # MongoDB (pure Rust driver) - "services-gridfs", # MongoDB GridFS - "services-mysql", # MySQL / MariaDB (sqlx, pure Rust) - "services-postgresql", # PostgreSQL (sqlx, pure Rust) - "services-sqlite", # SQLite (sqlx, pure Rust) - # "services-surrealdb" — excluded: pulls async-graphql@7.2.1 which requires rustc 1.89 - "services-persy", # Persy embedded (pure Rust) - # Misc - "services-cloudflare-kv", # Cloudflare KV (via REST) - "services-d1", # Cloudflare D1 SQLite (via REST) - # Filesystem + "services-hdfs-native", # HDFS pure-Rust native client (no Java/libhdfs required) + # SQL (sqlx, pure Rust) + "services-mysql", # MySQL / MariaDB + "services-postgresql", # PostgreSQL (README-advertised) + "services-sqlite", # SQLite + # Filesystem / protocol "services-fs", "services-http", "services-webdav", - # services-sftp intentionally omitted: openssh Rust crate is Unix-only. + "services-memory", # in-memory (useful for testing + pipeline) + # services-sftp intentionally omitted: openssh Rust crate is Unix-only. # SFTP is handled via ssh2 (libssh2 vendored, cross-platform) in src/remote/sftp.rs. # services-ftp intentionally omitted: async-tls/tokio-rustls conflict. # FTP/FTPS is handled via suppaftp (blocking + rustls) instead. - "services-hdfs-native", # HDFS pure-Rust native client (no Java/libhdfs required) - "services-compfs", # compio-based async filesystem - # services-monoiofs intentionally omitted from main features: monoio requires Linux io_uring. - # Added via [target.'cfg(target_os = "linux")'.dependencies] below. "blocking", ] } @@ -228,11 +190,6 @@ libc = "0.2" [target.'cfg(target_os = "linux")'.dependencies] libc = "0.2" -# monoiofs depends on monoio (io_uring) which only compiles on Linux. -# Optional + gated behind the `remote` feature (same as the main opendal dep): -# the default build must not pull the opendal cloud stack (and its vulnerable -# DNS / quick-xml transitive tree) on Linux either. -opendal = { version = "0.55.0", features = ["services-monoiofs"], optional = true } [target.'cfg(target_os = "windows")'.dependencies] windows-sys = { version = "0.59", features = [ @@ -269,7 +226,6 @@ ots = [] pq = [] qr = ["dep:qrcode", "dep:image"] remote = ["dep:opendal", "dep:tokio", "dep:suppaftp", "dep:ssh2"] -rocksdb-storage = ["remote", "opendal/services-rocksdb"] [package.metadata.deb] maintainer = "SecurityRonin " diff --git a/deny.toml b/deny.toml index 85904e0..bbe4b93 100644 --- a/deny.toml +++ b/deny.toml @@ -3,11 +3,10 @@ targets = [] # The `remote` feature (opendal cloud/object-storage stack) is a genuinely-optional # heavy subsystem — opt-in, NOT default (see Cargo.toml [features]). It drags in a # vulnerable transitive tree (hickory DNS RUSTSEC-2026-0118/0119, quick-xml -# RUSTSEC-2026-0194/0195, plus sqlx/tikv/rustls chains) that no hashing workload +# RUSTSEC-2026-0194/0195, plus sqlx/rustls chains) that no hashing workload # exercises. Rather than blanket-ignore all of those advisories, we keep opendal -# out of the audited graph entirely: check every OTHER feature, never `remote` -# (or `rocksdb-storage`, which pulls it in). `cargo deny check` therefore audits -# exactly what a default `cargo build` ships. +# out of the audited graph entirely: check every OTHER feature, never `remote`. +# `cargo deny check` therefore audits exactly what a default `cargo build` ships. all-features = false features = [ "forensic-image", diff --git a/src/remote/mod.rs b/src/remote/mod.rs index 89632dd..e27316d 100644 --- a/src/remote/mod.rs +++ b/src/remote/mod.rs @@ -96,8 +96,6 @@ pub enum UriScheme { PostgreSQL, SQLite, SurrealDB, - #[cfg(feature = "rocksdb-storage")] - RocksDb, // Misc CloudflareKv, D1, @@ -163,8 +161,6 @@ impl UriScheme { "postgresql" => Some(Self::PostgreSQL), "sqlite" => Some(Self::SQLite), "surrealdb" => Some(Self::SurrealDB), - #[cfg(feature = "rocksdb-storage")] - "rocksdb" => Some(Self::RocksDb), "cloudflare-kv" => Some(Self::CloudflareKv), "d1" => Some(Self::D1), "http" => Some(Self::Http), diff --git a/src/remote/operator.rs b/src/remote/operator.rs index db95d17..75ebefb 100644 --- a/src/remote/operator.rs +++ b/src/remote/operator.rs @@ -3,31 +3,25 @@ use opendal::{services, Operator}; /// Build an [`Operator`] and return `(Operator, relative_path)` from a remote URI. /// -/// Supported schemes: +/// The OpenDAL service set is scoped to forensically-relevant evidence-transfer +/// targets (see ADR-0010). Supported schemes: /// /// **Cloud object storage** -/// `s3`, `gcs`, `azblob`, `azdls`, `azfile`, `b2`, `cos`, `obs`, `oss`, `swift`, `upyun` +/// `s3`, `gcs`, `azblob`, `azdls`, `azfile`, `b2`, `cos`, `obs`, `oss`, `swift` /// -/// **Cloud drives** -/// `gdrive`, `onedrive`, `dropbox`, `aliyun-drive`, `yandex-disk`, `pcloud`, `koofr`, `seafile` +/// **Cloud drive** +/// `gdrive` /// -/// **Developer / ML / infra** -/// `github`, `huggingface`, `vercel-blob`, `vercel-artifacts`, `ghac`, `dbfs` +/// **Hadoop** +/// `webhdfs`, `hdfs` /// -/// **Distributed / big data** -/// `alluxio`, `webhdfs`, `lakefs` -/// -/// **Decentralized** -/// `ipfs`, `ipmfs` -/// -/// **Network KV / databases** -/// `redis`, `memcached`, `etcd`, `tikv`, `mongodb`, `gridfs`, `mysql`, `postgresql`, `sqlite`, -/// `surrealdb`, `cloudflare-kv`, `d1` +/// **SQL** +/// `mysql`, `postgresql`, `sqlite` /// /// **Filesystem / network protocols** /// `file`, `http`, `https`, `webdav`, `sftp`, `ftp`, `ftps` /// -/// **In-memory / embedded** +/// **In-memory** /// `mem` /// /// Auth is read from standard environment variables; refer to each backend's documentation @@ -172,189 +166,7 @@ pub fn operator_for_uri(uri: &str) -> Result<(Operator, String)> { let op = Operator::new(builder)?.finish(); Ok((op, path.to_string())) } - "upyun" => { - // upyun://bucket/key — creds from UPYUN_OPERATOR / UPYUN_PASSWORD - let (bucket, key) = rest.split_once('/').unwrap_or((rest, "")); - let operator_name = std::env::var("UPYUN_OPERATOR").unwrap_or_default(); - let password = std::env::var("UPYUN_PASSWORD").unwrap_or_default(); - let builder = services::Upyun::default() - .bucket(bucket) - .operator(&operator_name) - .password(&password); - let op = Operator::new(builder)?.finish(); - Ok((op, key.to_string())) - } - - // ── Consumer / enterprise cloud drives ─────────────────────────────── - "onedrive" => { - // onedrive://path — token from ONEDRIVE_ACCESS_TOKEN - let token = std::env::var("ONEDRIVE_ACCESS_TOKEN").unwrap_or_default(); - let builder = services::Onedrive::default().root("/").access_token(&token); - let op = Operator::new(builder)?.finish(); - Ok((op, rest.to_string())) - } - "dropbox" => { - // dropbox://path — token from DROPBOX_ACCESS_TOKEN - let token = std::env::var("DROPBOX_ACCESS_TOKEN").unwrap_or_default(); - let builder = services::Dropbox::default().root("/").access_token(&token); - let op = Operator::new(builder)?.finish(); - Ok((op, rest.to_string())) - } - "aliyun-drive" => { - // aliyun-drive://path — token from ALIYUN_DRIVE_ACCESS_TOKEN - let token = std::env::var("ALIYUN_DRIVE_ACCESS_TOKEN").unwrap_or_default(); - let builder = services::AliyunDrive::default() - .root("/") - .access_token(&token); - let op = Operator::new(builder)?.finish(); - Ok((op, rest.to_string())) - } - "yandex-disk" => { - // yandex-disk://path — token from YANDEX_DISK_ACCESS_TOKEN - let token = std::env::var("YANDEX_DISK_ACCESS_TOKEN").unwrap_or_default(); - let builder = services::YandexDisk::default() - .root("/") - .access_token(&token); - let op = Operator::new(builder)?.finish(); - Ok((op, rest.to_string())) - } - "pcloud" => { - // pcloud://path — creds from PCLOUD_USERNAME / PCLOUD_PASSWORD - let endpoint = std::env::var("PCLOUD_ENDPOINT") - .unwrap_or_else(|_| "https://api.pcloud.com".into()); - let username = std::env::var("PCLOUD_USERNAME").unwrap_or_default(); - let password = std::env::var("PCLOUD_PASSWORD").unwrap_or_default(); - let builder = services::Pcloud::default() - .root("/") - .endpoint(&endpoint) - .username(&username) - .password(&password); - let op = Operator::new(builder)?.finish(); - Ok((op, rest.to_string())) - } - "koofr" => { - // koofr://path — creds from KOOFR_EMAIL / KOOFR_PASSWORD - let endpoint = - std::env::var("KOOFR_ENDPOINT").unwrap_or_else(|_| "https://app.koofr.net".into()); - let email = std::env::var("KOOFR_EMAIL").unwrap_or_default(); - let password = std::env::var("KOOFR_PASSWORD").unwrap_or_default(); - let builder = services::Koofr::default() - .root("/") - .endpoint(&endpoint) - .email(&email) - .password(&password); - let op = Operator::new(builder)?.finish(); - Ok((op, rest.to_string())) - } - "seafile" => { - // seafile://server/repo/path — creds from SEAFILE_USERNAME / SEAFILE_PASSWORD - let (server, rest_path) = rest.split_once('/').unwrap_or((rest, "")); - let (repo, path) = rest_path.split_once('/').unwrap_or((rest_path, "")); - let endpoint = format!("https://{server}"); - let username = std::env::var("SEAFILE_USERNAME").unwrap_or_default(); - let password = std::env::var("SEAFILE_PASSWORD").unwrap_or_default(); - let repo_name = if repo.is_empty() { - std::env::var("SEAFILE_REPO").unwrap_or_else(|_| "My Library".into()) - } else { - repo.to_string() - }; - let builder = services::Seafile::default() - .endpoint(&endpoint) - .username(&username) - .password(&password) - .repo_name(&repo_name); - let op = Operator::new(builder)?.finish(); - Ok((op, path.to_string())) - } - - // ── Developer / ML / infra ─────────────────────────────────────────── - "github" => { - // github://owner/repo/path — token from GITHUB_TOKEN - let mut parts = rest.splitn(3, '/'); - let owner = parts.next().unwrap_or(""); - let repo = parts.next().unwrap_or(""); - let path = parts.next().unwrap_or("").to_string(); - let token = std::env::var("GITHUB_TOKEN").unwrap_or_default(); - let builder = services::Github::default() - .token(&token) - .owner(owner) - .repo(repo); - let op = Operator::new(builder)?.finish(); - Ok((op, path)) - } - "huggingface" => { - // huggingface://owner/repo/path — token from HUGGINGFACE_TOKEN - let (repo_id, path) = rest - .split_once('/') - .map(|(a, b)| { - // repo_id is "owner/name", path is the rest - let full = format!("{a}/{b}"); - if let Some(idx) = full.find('/') { - let second = full[idx + 1..].find('/'); - if let Some(second_idx) = second { - let split_at = idx + 1 + second_idx; - ( - full[..split_at].to_string(), - full[split_at + 1..].to_string(), - ) - } else { - (full, String::new()) - } - } else { - (full, String::new()) - } - }) - .unwrap_or((rest.to_string(), String::new())); - let token = std::env::var("HUGGINGFACE_TOKEN").unwrap_or_default(); - let builder = services::Huggingface::default() - .repo_id(&repo_id) - .token(&token); - let op = Operator::new(builder)?.finish(); - Ok((op, path)) - } - "vercel-blob" => { - // vercel-blob://key — token from BLOB_READ_WRITE_TOKEN - let token = std::env::var("BLOB_READ_WRITE_TOKEN").unwrap_or_default(); - let builder = services::VercelBlob::default().token(&token); - let op = Operator::new(builder)?.finish(); - Ok((op, rest.to_string())) - } - "vercel-artifacts" => { - // vercel-artifacts://key — token from VERCEL_ARTIFACTS_TOKEN - let token = std::env::var("VERCEL_ARTIFACTS_TOKEN").unwrap_or_default(); - let builder = services::VercelArtifacts::default().access_token(&token); - let op = Operator::new(builder)?.finish(); - Ok((op, rest.to_string())) - } - "ghac" => { - // ghac://key — for GitHub Actions Cache (useful in CI forensics) - let version = std::env::var("GHAC_VERSION").unwrap_or_else(|_| "v1".into()); - let builder = services::Ghac::default().version(&version); - let op = Operator::new(builder)?.finish(); - Ok((op, rest.to_string())) - } - "dbfs" => { - // dbfs://path — Databricks DBFS; creds from DATABRICKS_HOST + DATABRICKS_TOKEN - let endpoint = std::env::var("DATABRICKS_HOST") - .unwrap_or_else(|_| "https://adb-example.azuredatabricks.net".into()); - let token = std::env::var("DATABRICKS_TOKEN").unwrap_or_default(); - let builder = services::Dbfs::default() - .root("/") - .endpoint(&endpoint) - .token(&token); - let op = Operator::new(builder)?.finish(); - Ok((op, rest.to_string())) - } - - // ── Distributed / big data ─────────────────────────────────────────── - "alluxio" => { - // alluxio://host:port/path - let (hostport, path) = rest.split_once('/').unwrap_or((rest, "")); - let endpoint = format!("http://{hostport}"); - let builder = services::Alluxio::default().root("/").endpoint(&endpoint); - let op = Operator::new(builder)?.finish(); - Ok((op, path.to_string())) - } + // ── Hadoop ─────────────────────────────────────────────────────────── "webhdfs" => { // webhdfs://host:port/path — user from WEBHDFS_USER let (hostport, path) = rest.split_once('/').unwrap_or((rest, "")); @@ -378,123 +190,7 @@ pub fn operator_for_uri(uri: &str) -> Result<(Operator, String)> { let op = Operator::new(builder)?.finish(); Ok((op, path.to_string())) } - "lakefs" => { - // lakefs://repo/branch/path — creds from LAKEFS_ACCESS_KEY_ID / LAKEFS_SECRET_ACCESS_KEY - let mut parts = rest.splitn(3, '/'); - let repo = parts.next().unwrap_or("").to_string(); - let branch = parts.next().unwrap_or("main").to_string(); - let path = parts.next().unwrap_or("").to_string(); - let endpoint = - std::env::var("LAKEFS_ENDPOINT").unwrap_or_else(|_| "http://localhost:8000".into()); - let username = std::env::var("LAKEFS_ACCESS_KEY_ID").unwrap_or_default(); - let password = std::env::var("LAKEFS_SECRET_ACCESS_KEY").unwrap_or_default(); - let builder = services::Lakefs::default() - .endpoint(&endpoint) - .username(&username) - .password(&password) - .repository(&repo) - .branch(&branch); - let op = Operator::new(builder)?.finish(); - Ok((op, path)) - } - - // ── Decentralized ──────────────────────────────────────────────────── - "ipfs" => { - // ipfs://CID/path — gateway from IPFS_GATEWAY (default: local node) - let gateway = - std::env::var("IPFS_GATEWAY").unwrap_or_else(|_| "http://127.0.0.1:8080".into()); - let builder = services::Ipfs::default().root("/").endpoint(&gateway); - let op = Operator::new(builder)?.finish(); - Ok((op, rest.to_string())) - } - "ipmfs" => { - // ipmfs:///path — IPFS MFS via local node - let endpoint = - std::env::var("IPFS_ENDPOINT").unwrap_or_else(|_| "http://127.0.0.1:5001".into()); - let builder = services::Ipmfs::default().endpoint(&endpoint); - let op = Operator::new(builder)?.finish(); - Ok((op, rest.to_string())) - } - - // ── Network KV / databases ──────────────────────────────────────────── - #[cfg(feature = "rocksdb-storage")] - "rocksdb" => { - // rocksdb:///path/to/db/key — RocksDB embedded KV - // split_once("://") on "rocksdb:///path/to/db/key" gives rest="/path/to/db/key" - let (db_path, key) = rest.rsplit_once('/').unwrap_or((rest, "")); - let builder = services::Rocksdb::default().datadir(db_path); - let op = Operator::new(builder)?.finish(); - Ok((op, key.to_string())) - } - "rediss" => { - // rediss://host:port/key — Redis with TLS - let (hostport, key) = rest.split_once('/').unwrap_or((rest, "")); - let redis_url = format!("rediss://{hostport}"); - let builder = services::Redis::default().endpoint(&redis_url); - let op = Operator::new(builder)?.finish(); - Ok((op, key.to_string())) - } - "redis" => { - // redis://[user:pass@]host:port/key — path after the host:port is the key - let (conn, path) = rest.split_once('/').unwrap_or((rest, "")); - let redis_url = format!("redis://{conn}"); - let builder = services::Redis::default().endpoint(&redis_url); - let op = Operator::new(builder)?.finish(); - Ok((op, path.to_string())) - } - "memcached" => { - // memcached://host:port/key - let (hostport, path) = rest.split_once('/').unwrap_or((rest, "")); - let endpoint = format!("tcp://{hostport}"); - let builder = services::Memcached::default().endpoint(&endpoint); - let op = Operator::new(builder)?.finish(); - Ok((op, path.to_string())) - } - "etcd" => { - // etcd://host:port/key - let (hostport, path) = rest.split_once('/').unwrap_or((rest, "")); - let endpoint = format!("http://{hostport}"); - let builder = services::Etcd::default().endpoints(&endpoint); - let op = Operator::new(builder)?.finish(); - Ok((op, path.to_string())) - } - "tikv" => { - // tikv://pd-host:port/key - let (hostport, path) = rest.split_once('/').unwrap_or((rest, "")); - let builder = services::Tikv::default().endpoints(vec![hostport.to_string()]); - let op = Operator::new(builder)?.finish(); - Ok((op, path.to_string())) - } - "mongodb" => { - // mongodb://[user:pass@]host/db/collection/key - let conn_str = format!("mongodb://{rest}"); - let mut parts = rest.splitn(3, '/'); - let _ = parts.next(); // host - let database = parts.next().unwrap_or("blazehash"); - let rest_path = parts.next().unwrap_or(""); - let (collection, path) = rest_path.split_once('/').unwrap_or((rest_path, "")); - let builder = services::Mongodb::default() - .connection_string(&conn_str) - .database(database) - .collection(collection); - let op = Operator::new(builder)?.finish(); - Ok((op, path.to_string())) - } - "gridfs" => { - // gridfs://[user:pass@]host/db/bucket/key - let conn_str = format!("mongodb://{rest}"); - let mut parts = rest.splitn(3, '/'); - let _ = parts.next(); // host[:port] - let database = parts.next().unwrap_or("blazehash"); - let rest_path = parts.next().unwrap_or(""); - let (bucket, path) = rest_path.split_once('/').unwrap_or((rest_path, "")); - let builder = services::Gridfs::default() - .connection_string(&conn_str) - .database(database) - .bucket(bucket); - let op = Operator::new(builder)?.finish(); - Ok((op, path.to_string())) - } + // ── SQL (sqlx, pure Rust) ───────────────────────────────────────────── "mysql" => { // mysql://[user:pass@]host/db/key let conn_str = format!("mysql://{rest}"); @@ -526,32 +222,6 @@ pub fn operator_for_uri(uri: &str) -> Result<(Operator, String)> { let op = Operator::new(builder)?.finish(); Ok((op, key.to_string())) } - // "surrealdb" — not wired: pulls async-graphql@7.2.1 (requires rustc 1.89 > our MSRV 1.85) - "cloudflare-kv" => { - // cloudflare-kv://namespace-id/key - let (namespace, key) = rest.split_once('/').unwrap_or((rest, "")); - let account_id = std::env::var("CLOUDFLARE_ACCOUNT_ID").unwrap_or_default(); - let token = std::env::var("CLOUDFLARE_API_TOKEN").unwrap_or_default(); - let builder = services::CloudflareKv::default() - .account_id(&account_id) - .api_token(&token) - .namespace_id(namespace); - let op = Operator::new(builder)?.finish(); - Ok((op, key.to_string())) - } - "d1" => { - // d1://database-id/key — Cloudflare D1 (SQLite via REST) - let (db_id, key) = rest.split_once('/').unwrap_or((rest, "")); - let account_id = std::env::var("CLOUDFLARE_ACCOUNT_ID").unwrap_or_default(); - let token = std::env::var("CLOUDFLARE_API_TOKEN").unwrap_or_default(); - let builder = services::D1::default() - .account_id(&account_id) - .token(&token) - .database_id(db_id); - let op = Operator::new(builder)?.finish(); - Ok((op, key.to_string())) - } - // ── Filesystem / network protocols ─────────────────────────────────── "webdav" => { let host = rest.split('/').next().unwrap_or(""); @@ -588,31 +258,6 @@ pub fn operator_for_uri(uri: &str) -> Result<(Operator, String)> { crate::remote::ftp::fetch_ftp_bytes(), not operator_for_uri()" ) } - "monoiofs" => { - // monoiofs:///abs/path — monoio-based async fs (Linux io_uring only) - let full = format!("/{rest}"); - let (dir, file) = full.rsplit_once('/').unwrap_or(("/", &full)); - #[cfg(target_os = "linux")] - { - let builder = services::Monoiofs::default().root(dir); - let op = Operator::new(builder)?.finish(); - Ok((op, file.to_string())) - } - #[cfg(not(target_os = "linux"))] - { - let _ = (dir, file); - bail!("monoiofs:// is only supported on Linux (io_uring required)") - } - } - "compfs" => { - // compfs:///abs/path/to/dir — compio-based async filesystem - // rest = "/abs/path/to/dir/file" → root="/abs/path/to/dir", path="file" - let full = format!("/{rest}"); // restore leading slash stripped by split_once("://") - let (dir, file) = full.rsplit_once('/').unwrap_or(("/", &full)); - let builder = services::Compfs::default().root(dir); - let op = Operator::new(builder)?.finish(); - Ok((op, file.to_string())) - } "file" => { let (dir, file) = rest.rsplit_once('/').unwrap_or(("/", rest)); let builder = services::Fs::default().root(dir); diff --git a/tests/remote_uri_tests.rs b/tests/remote_uri_tests.rs index db58c0f..2f029bb 100644 --- a/tests/remote_uri_tests.rs +++ b/tests/remote_uri_tests.rs @@ -411,23 +411,6 @@ fn scheme_detect_vercel_blob() { ); } -// ── RocksDB (optional feature: rocksdb-storage) ─────────────────────────────── - -#[cfg(feature = "rocksdb-storage")] -#[test] -fn rocksdb_uri_is_detected() { - assert!(is_remote_uri("rocksdb:///var/lib/rocksdb/evidence")); -} - -#[cfg(feature = "rocksdb-storage")] -#[test] -fn scheme_detect_rocksdb() { - assert_eq!( - UriScheme::detect("rocksdb:///path/to/db"), - Some(UriScheme::RocksDb) - ); -} - // ── Monoio filesystem (monoiofs, Linux only) ────────────────────────────────── #[cfg(target_os = "linux")] @@ -512,16 +495,6 @@ mod operator_tests { ); } - #[test] - fn operator_onedrive_not_unsupported() { - assert_not_unsupported("onedrive://Documents/file.pdf"); - } - - #[test] - fn operator_dropbox_not_unsupported() { - assert_not_unsupported("dropbox://path/file"); - } - #[test] fn operator_b2_not_unsupported() { assert_not_unsupported("b2://bucket/key"); @@ -557,76 +530,11 @@ mod operator_tests { assert_not_unsupported("azdls://container/path"); } - #[test] - fn operator_github_not_unsupported() { - assert_not_unsupported("github://owner/repo/path"); - } - - #[test] - fn operator_ipfs_not_unsupported() { - assert_not_unsupported("ipfs://QmHash/path"); - } - - #[test] - fn operator_ipmfs_not_unsupported() { - assert_not_unsupported("ipmfs:///path"); - } - #[test] fn operator_webhdfs_not_unsupported() { assert_not_unsupported("webhdfs://host:50070/path"); } - #[test] - fn operator_alluxio_not_unsupported() { - assert_not_unsupported("alluxio://master:19998/path"); - } - - #[test] - fn operator_lakefs_not_unsupported() { - assert_not_unsupported("lakefs://repo/main/file"); - } - - #[test] - fn operator_seafile_not_unsupported() { - assert_not_unsupported("seafile://server/repo/file"); - } - - #[test] - fn operator_pcloud_not_unsupported() { - assert_not_unsupported("pcloud://path/file"); - } - - #[test] - fn operator_koofr_not_unsupported() { - assert_not_unsupported("koofr://path/file"); - } - - #[test] - fn operator_yandex_disk_not_unsupported() { - assert_not_unsupported("yandex-disk://path/file"); - } - - #[test] - fn operator_huggingface_not_unsupported() { - assert_not_unsupported("huggingface://owner/repo/file"); - } - - #[test] - fn operator_upyun_not_unsupported() { - assert_not_unsupported("upyun://bucket/key"); - } - - #[test] - fn operator_aliyun_drive_not_unsupported() { - assert_not_unsupported("aliyun-drive://path/file"); - } - - #[test] - fn operator_vercel_blob_not_unsupported() { - assert_not_unsupported("vercel-blob://key"); - } - // ── sftp path extraction (via parse_sftp_uri — cross-platform ssh2/libssh2) ── // operator_for_uri bails directing callers to fetch_sftp_bytes(); parse_sftp_uri // is the path-extraction API for SFTP, same pattern as parse_ftp_uri for FTP. @@ -683,67 +591,6 @@ mod operator_tests { ); } - // ── rocksdb:// (optional feature: rocksdb-storage) ──────────────────────── - - #[cfg(feature = "rocksdb-storage")] - #[test] - fn operator_rocksdb_not_unsupported() { - assert_not_unsupported("rocksdb:///tmp/bh-rocksdb-test-a/evidence/manifest"); - } - - #[cfg(feature = "rocksdb-storage")] - #[test] - fn rocksdb_path_extracted_correctly() { - let (_, key) = operator_for_uri("rocksdb:///tmp/bh-rocksdb-test-b/evidence/case-001") - .expect("rocksdb:// should be supported with rocksdb-storage feature"); - assert_eq!(key, "case-001"); - } - - // ── monoiofs:// (monoio filesystem, Linux only) ─────────────────────────── - - #[cfg(target_os = "linux")] - #[test] - fn operator_monoiofs_not_unsupported() { - assert_not_unsupported("monoiofs:///tmp/evidence"); - } - - #[cfg(target_os = "linux")] - #[test] - fn monoiofs_path_extracted_correctly() { - // Use /tmp so the operator can create its root dir without needing root - let (_, path) = operator_for_uri("monoiofs:///tmp/blazehash-test-monoiofs/disk.dd") - .expect("monoiofs:// should be supported"); - assert_eq!(path, "disk.dd"); - } - - // ── compfs:// (compio filesystem) ───────────────────────────────────────── - - #[test] - fn operator_compfs_not_unsupported() { - assert_not_unsupported("compfs:///tmp/evidence"); - } - - #[test] - fn compfs_path_extracted_correctly() { - let (_, path) = operator_for_uri("compfs:///tmp/evidence/disk.dd") - .expect("compfs:// should be supported"); - assert_eq!(path, "disk.dd"); - } - - // ── rediss:// (Redis with TLS) ───────────────────────────────────────────── - - #[test] - fn operator_rediss_not_unsupported() { - assert_not_unsupported("rediss://host:6380/mykey"); - } - - #[test] - fn rediss_path_extracted_correctly() { - let (_, key) = operator_for_uri("rediss://localhost:6380/cache:evidence:hash") - .expect("rediss:// should be supported"); - assert_eq!(key, "cache:evidence:hash"); - } - // ── HDFS native path extraction (TDD) ───────────────────────────────────── #[test] From 0204d146ec6e0cfab97e2728902f2a68e36d1214 Mon Sep 17 00:00:00 2001 From: Albert Hui Date: Mon, 27 Jul 2026 14:58:45 +0800 Subject: [PATCH 4/5] docs: align remote-storage docs with ADR-0010 scoped backend set Rewrite docs/remote.md to the kept evidence-transfer backends (object stores, gdrive, HDFS/WebHDFS, SQL, fs/http/webdav + SFTP/FTP); drop the sections/tables for the removed native DB/KV, dev/ML, decentralized, alt-runtime, and regional-drive backends. Fix stale '50+/60+ protocols' claims and dropped-backend lists in README, PRD, index, and cli-reference. Replace remote.md's links to the site-excluded decisions/ ADRs with plain-text references (no dangling links). Co-Authored-By: Claude Opus 4.8 --- README.md | 8 +-- docs/PRD.md | 2 +- docs/cli-reference.md | 11 ++- docs/index.md | 2 +- docs/remote.md | 160 ++++++------------------------------------ 5 files changed, 33 insertions(+), 150 deletions(-) diff --git a/README.md b/README.md index 116eec9..eb757d9 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ Every hashdeep flag works. Your existing scripts keep working. These are the add | Duplicate detection | Y | — | | Manifest diff / merge / update | Y | — | | Live monitoring (watch) | Y | — | -| Remote storage (S3/GCS/Azure/WebDAV/60+ protocols) | Y | — | +| Remote storage (S3/GCS/Azure/SFTP/WebDAV/HDFS/SQL) | Y | — | | Google Drive hash-without-download | Y | — | | GPU-accelerated SHA-256/MD5 | Y | — | | MCP server (AI-assisted workflows) | Y | — | @@ -137,7 +137,7 @@ BLAKE3 runs at **1,640–1,780 MB/s** — 2.8x faster than hashdeep's best algor ## Remote Storage -Evidence doesn't live only on disk. blazehash speaks 50+ storage protocols natively — the same command works whether the data is local, on S3, in Google Drive, or on an SFTP server. +Evidence doesn't live only on disk. blazehash reads and writes remote storage natively — the same command works whether the data is local, on S3, in Google Drive, or on an SFTP server. ```bash # Hash an S3 prefix directly @@ -160,7 +160,7 @@ blazehash sftp://admin@192.168.1.10/cases/image.dd Credentials come from standard environment variables — `AWS_ACCESS_KEY_ID`, `GOOGLE_APPLICATION_CREDENTIALS`, `AZURE_STORAGE_ACCOUNT` — so existing tooling and CI secrets work without changes. For Google Drive, run `blazehash gdrive auth login` once. -Supported: S3, GCS, Azure Blob/Files/ADLS, Backblaze B2, Tencent COS, Huawei OBS, Alibaba OSS, OpenStack Swift, OneDrive, Dropbox, Google Drive, pCloud, Yandex Disk, SFTP, FTP, WebDAV, WebHDFS, Redis, MongoDB, PostgreSQL, and [30+ more →](https://securityronin.github.io/blazehash/remote/) +Supported: S3, GCS, Azure Blob/Files/ADLS, Backblaze B2, Tencent COS, Huawei OBS, Alibaba OSS, OpenStack Swift, Google Drive, HDFS/WebHDFS, MySQL, PostgreSQL, SQLite, SFTP, FTP/FTPS, WebDAV, and HTTP — [full reference →](https://securityronin.github.io/blazehash/remote/) --- @@ -174,7 +174,7 @@ cargo install blazehash --all-features | Flag | Default | Enables | |------|:-------:|---------| -| `remote` | on | Remote storage (S3/GCS/Azure/SFTP/GDrive/60+ protocols) | +| `remote` | on | Remote storage (S3/GCS/Azure/SFTP/GDrive, HDFS, SQL) | | `sqlite` | on | `--format sqlite` output + NSRL SQLite database | | `parquet-output` | on | `--format parquet` output | | `duckdb-output` | on | `--format duckdb` output | diff --git a/docs/PRD.md b/docs/PRD.md index 73dba2a..2758bcb 100644 --- a/docs/PRD.md +++ b/docs/PRD.md @@ -77,7 +77,7 @@ Grounded in `src/` and `src/cli.rs`: `forensic-image` feature) and raw block-device sizing (`src/device.rs`). - **Output formats:** the hashdeep text formats plus SQLite, Parquet, DuckDB, JSON/JSONL, STIX 2.1, and ECS NDJSON (`src/format/`, `src/output.rs`). -- **Remote storage:** S3/GCS/Azure/60+ backends via opendal, plus FTP/SFTP, and +- **Remote storage:** S3/GCS/Azure and other object stores via opendal, plus HDFS, SQL, FTP/SFTP, and Google Drive hash-without-download (`src/remote/`, `remote` feature — [ADR 0002](decisions/0002-batteries-included-remote-opt-in.md)). - **Interfaces:** the `blazehash` CLI, an interactive `tui` dashboard diff --git a/docs/cli-reference.md b/docs/cli-reference.md index 9ea3776..5267952 100644 --- a/docs/cli-reference.md +++ b/docs/cli-reference.md @@ -951,7 +951,7 @@ blazehash completions man > blazehash.1 && man ./blazehash.1 ## Remote storage -blazehash accepts remote URIs for both input paths and `-o` output — 50+ protocols supported. +blazehash accepts remote URIs for both input paths and `-o` output — object stores, HDFS, SQL, SFTP/FTP, and WebDAV/HTTP. **Full protocol reference:** [Remote Storage →](remote.md) @@ -974,12 +974,9 @@ blazehash gdrive://1ABCdef... blazehash sftp://admin@192.168.1.10/evidence/disk.dd ``` -Supported schemes include: `s3`, `gcs`, `azblob`, `azdls`, `azfile`, `b2`, `cos`, `obs`, `oss`, -`swift`, `upyun`, `gdrive`, `onedrive`, `dropbox`, `aliyun-drive`, `yandex-disk`, `pcloud`, -`koofr`, `seafile`, `github`, `huggingface`, `vercel-blob`, `alluxio`, `hdfs`, `webhdfs`, `lakefs`, -`ipfs`, `ipmfs`, `redis`, `rediss`, `memcached`, `etcd`, `tikv`, `mongodb`, `mysql`, `postgresql`, -`sqlite`, `rocksdb` (opt-in), `cloudflare-kv`, `d1`, `sftp`, `ftp`, `ftps`, `webdav`, `http`, -`https`, `compfs`, `monoiofs` (Linux), `file`, `mem`. +Supported schemes: `s3`, `gcs`, `azblob`, `azdls`, `azfile`, `b2`, `cos`, `obs`, `oss`, +`swift`, `gdrive`, `hdfs`, `webhdfs`, `mysql`, `postgresql`, `sqlite`, `sftp`, `ftp`, `ftps`, +`webdav`, `http`, `https`, `file`, `mem`. --- diff --git a/docs/index.md b/docs/index.md index bc4105e..e5481de 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,7 +4,7 @@ The only open-source forensic hashing tool that answers every question a court asks about digital evidence — *what* changed, *who* handled it, *when* it was sealed, and *in what context* — in a single binary that's drop-in compatible with hashdeep. -Now with **50+ remote storage backends** built in via Apache OpenDAL: hash from S3, GCS, Azure Blob, WebDAV, SFTP, and more — no extra flags required. Hash Google Drive files in memory via `gdrive://` URI — no local copy needed. +Read and write evidence directly from **remote storage** via Apache OpenDAL — S3, GCS, Azure Blob, WebDAV, SFTP, HDFS, and SQL stores, the targets DFIR collectors actually use — built into the release binaries, no flag at runtime. Hash Google Drive files in memory via a `gdrive://` URI, no local copy needed. ```bash # Acquire evidence with chain-of-custody metadata diff --git a/docs/remote.md b/docs/remote.md index 0183f74..401dd0c 100644 --- a/docs/remote.md +++ b/docs/remote.md @@ -1,17 +1,27 @@ # Remote Storage -blazehash speaks **50+ storage protocols** natively via [Apache OpenDAL](https://opendal.apache.org/). Any URI that resolves to file-like data is a valid input path or `-o` output target — no plugins, no adapters, no staging. +blazehash reads and writes evidence directly from remote storage via +[Apache OpenDAL](https://opendal.apache.org/), scoped to the backends where +forensic evidence actually lives and where DFIR collectors (Velociraptor, KAPE) +deposit it: object storage, SFTP/FTP, Hadoop, SQL stores, and WebDAV/HTTP. Any +URI that resolves to file-like data is a valid input path or `-o` output target — +no plugins, no adapters, no staging. ```bash # Read from remote, write manifest to remote — entirely off-disk blazehash s3://dfir-bucket/case-001/ -o gcs://evidence-archive/case-001.hash ``` +The remote stack is an opt-in build feature (`--features remote`); the release +binaries enable it. ADR-0002 records why it is opt-in and ADR-0010 why the +backend set is scoped to evidence-transfer targets (both in the project's +`docs/decisions/`). + --- ## Cloud Object Storage -These are the most common backends for evidence archiving. +The most common backends for evidence archiving. | Scheme | Backend | Auth env vars | |--------|---------|---------------| @@ -25,7 +35,6 @@ These are the most common backends for evidence archiving. | `obs://bucket/key` | Huawei Cloud OBS | `HUAWEI_ACCESS_KEY_ID`, `HUAWEI_SECRET_ACCESS_KEY`, `HUAWEI_REGION` | | `oss://bucket/key` | Alibaba Cloud OSS | `ALIBABA_CLOUD_ACCESS_KEY_ID`, `ALIBABA_CLOUD_ACCESS_KEY_SECRET`, `ALIBABA_CLOUD_REGION` | | `swift://container/path` | OpenStack Swift | `SWIFT_ENDPOINT`, `SWIFT_TOKEN` | -| `upyun://bucket/key` | Upyun CDN storage | `UPYUN_OPERATOR`, `UPYUN_PASSWORD` | ### S3-compatible endpoints @@ -47,24 +56,13 @@ blazehash s3://my-bucket/evidence/ --- -## Cloud Drives +## Google Drive -Consumer and enterprise cloud drives — useful when evidence is a file shared from a suspect's or custodian's account. +Useful when evidence is a file shared from a suspect's or custodian's account. blazehash uses the Drive API to hash without staging the file locally: | Scheme | Backend | Auth | |--------|---------|------| -| `gdrive://file-id` | Google Drive | Run `blazehash gdrive auth login` once to cache OAuth2 token | -| `onedrive://path` | Microsoft OneDrive | `ONEDRIVE_ACCESS_TOKEN` | -| `dropbox://path` | Dropbox | `DROPBOX_ACCESS_TOKEN` | -| `aliyun-drive://path` | Aliyun Drive (Alibaba) | `ALIYUN_DRIVE_ACCESS_TOKEN` | -| `yandex-disk://path` | Yandex Disk | `YANDEX_DISK_ACCESS_TOKEN` | -| `pcloud://path` | pCloud | `PCLOUD_USERNAME`, `PCLOUD_PASSWORD`, `PCLOUD_ENDPOINT` | -| `koofr://path` | Koofr | `KOOFR_EMAIL`, `KOOFR_PASSWORD`, `KOOFR_ENDPOINT` | -| `seafile://server/repo/path` | Seafile | `SEAFILE_USERNAME`, `SEAFILE_PASSWORD` | - -### Google Drive without downloading - -blazehash uses the Drive API to hash without staging the file locally: +| `gdrive://file-id` | Google Drive | Run `blazehash gdrive auth login` once to cache the OAuth2 token | ```bash # By file ID @@ -77,39 +75,16 @@ blazehash https://drive.google.com/file/d/1Ykbd9fDXxWnD1-MTag_-8-Wh_Wnd28q0/view blazehash gdrive auth login ``` -### OneDrive / SharePoint - -```bash -export ONEDRIVE_ACCESS_TOKEN=$(az account get-access-token --resource https://graph.microsoft.com -o tsv --query accessToken) -blazehash onedrive://Documents/CaseFiles/image.dd -``` - --- -## Developer / ML / Infra +## Hadoop / HDFS -| Scheme | Backend | Auth | -|--------|---------|------| -| `github://owner/repo/path` | GitHub (raw file access) | `GITHUB_TOKEN` | -| `huggingface://owner/repo/path` | HuggingFace datasets and models | `HUGGINGFACE_TOKEN` | -| `vercel-blob://key` | Vercel Blob storage | `BLOB_READ_WRITE_TOKEN` | -| `vercel-artifacts://key` | Vercel build artifact cache | `VERCEL_ARTIFACTS_TOKEN` | -| `ghac://key` | GitHub Actions Cache | Set in GitHub Actions environment | -| `dbfs://path` | Databricks DBFS | `DATABRICKS_HOST`, `DATABRICKS_TOKEN` | -| `alluxio://host:port/path` | Alluxio data orchestration | — | -| `webhdfs://host:port/path` | WebHDFS REST (Hadoop — no JVM required) | `WEBHDFS_USER` | -| `lakefs://repo/branch/path` | LakeFS data versioning | `LAKEFS_ACCESS_KEY_ID`, `LAKEFS_SECRET_ACCESS_KEY`, `LAKEFS_ENDPOINT` | -| `ipfs://CID/path` | IPFS content-addressed storage | `IPFS_GATEWAY` (default: `http://127.0.0.1:8080`) | -| `ipmfs:///path` | IPFS Mutable File System | `IPFS_ENDPOINT` (default: `http://127.0.0.1:5001`) | - -### Hadoop / HDFS - -Two schemes are available depending on your cluster setup: +Two schemes, depending on your cluster setup — both pure-Rust, no JVM and no `libhdfs`: | Scheme | Backend | Notes | |--------|---------|-------| -| `hdfs://namenode:port/path` | HDFS (pure-Rust native client) | No JVM, no `libhdfs` — uses `hdfs-native` crate speaking Hadoop RPC | -| `webhdfs://namenode:port/path` | WebHDFS REST API | No JVM, works with any Hadoop 2.x+ namenode | +| `hdfs://namenode:port/path` | HDFS (pure-Rust native client) | Speaks Hadoop RPC via the `hdfs-native` crate | +| `webhdfs://host:port/path` | WebHDFS REST API | Works with any Hadoop 2.x+ namenode; `WEBHDFS_USER` for the user name | ```bash # Pure-Rust HDFS native client (no Java required) @@ -121,41 +96,21 @@ blazehash webhdfs://namenode.corp:50070/user/evidence/case-001/ `hdfs://` is preferred when the cluster exposes the native Hadoop RPC port (default 8020/9000). `webhdfs://` is the fallback when only the HTTP REST endpoint is reachable. -### GitHub (code forensics) - -Hash the exact state of a repository path at HEAD (or any ref via the API): - -```bash -export GITHUB_TOKEN=ghp_... -blazehash github://octocat/Hello-World/README -``` - --- -## Network KV / Databases +## SQL Databases Useful when evidence artifacts are stored in operational datastores rather than file systems. | Scheme | Backend | Auth / connection | |--------|---------|-------------------| -| `redis://host/key` | Redis | Standard Redis URL (supports `redis://[:password@]host:port`) | -| `memcached://host/key` | Memcached | `tcp://host:port` | -| `etcd://host/key` | etcd (gRPC) | `ETCD_USERNAME`, `ETCD_PASSWORD` | -| `tikv://pd-host/key` | TiKV distributed KV | PD endpoint | -| `mongodb://host/db/collection/key` | MongoDB | Standard MongoDB connection string | -| `gridfs://host/db/bucket/key` | MongoDB GridFS | Standard MongoDB connection string | | `mysql://host/db/key` | MySQL / MariaDB | Standard DSN | | `postgresql://host/db/key` | PostgreSQL | Standard DSN | | `sqlite://path/to.db/key` | SQLite (file on disk) | File path | -| `cloudflare-kv://namespace/key` | Cloudflare Workers KV | `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_API_TOKEN` | -| `d1://database-id/key` | Cloudflare D1 (SQLite via REST) | `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_API_TOKEN` | ```bash -# Hash a value stored in Redis -blazehash redis://localhost/evidence:case-001:image - -# Hash a MongoDB document field -blazehash mongodb://localhost/forensics/artifacts/abc123 +# Hash a value stored in a PostgreSQL row +blazehash postgresql://user:pass@localhost/forensics/artifacts ``` --- @@ -194,51 +149,7 @@ blazehash sftp://admin@192.168.1.10/evidence/disk.dd | Scheme | Backend | Notes | |--------|---------|-------| | `mem://bucket/key` | In-process memory | Ephemeral; useful in tests and pipeline stages | -| `redis://...` | Redis (plaintext) | Also serves as fast shared cache between pipeline stages | -| `rediss://host:port/key` | Redis with TLS | Same as `redis://` but over an encrypted connection | -| `sqlite://path/db/key` | SQLite file | Lightweight embedded KV; good for offline pipelines | -| `rocksdb:///path/to/db/key` | RocksDB embedded KV | Requires `--features rocksdb-storage` (compile-time opt-in) | - -### Redis TLS (`rediss://`) - -The `rediss://` scheme (double-s) connects to Redis over TLS — useful when your Redis instance requires encrypted connections (e.g. Redis Cloud, Upstash, or self-hosted with TLS). - -```bash -# Hash a value stored in Redis over TLS -blazehash rediss://redis.cloud.example.com:6380/evidence:case-001:hash -``` - -### RocksDB (`rocksdb://`) - -RocksDB support is an optional compile-time feature — it pulls in the RocksDB C++ library at build time. Not included in the default binary; build with: - -```bash -cargo install blazehash --features rocksdb-storage -``` - -```bash -# Hash a value stored in a local RocksDB database -blazehash rocksdb:///var/lib/evidence/casedb/artifact-001 -``` - -## Compio / Monoio Async Filesystems - -These backends replace the standard OS filesystem (`file://`) with alternative async I/O runtimes for workloads where kernel-level async matters. - -| Scheme | Backend | Platform | -|--------|---------|----------| -| `compfs:///abs/path/file` | compio filesystem | macOS, Linux, Windows (io_uring / kqueue / IOCP) | -| `monoiofs:///abs/path/file` | monoio filesystem | Linux only (io_uring) | - -```bash -# Hash via compio (cross-platform async I/O) -blazehash compfs:///mnt/evidence/disk.dd - -# Hash via monoio (Linux io_uring — lower overhead for large sequential reads) -blazehash monoiofs:///mnt/evidence/disk.dd -``` - -In practice, for most forensic workloads the default filesystem is sufficient. These backends are relevant when integrating blazehash into a compio or monoio async pipeline. +| `sqlite://path/db/key` | SQLite file | Lightweight embedded store; good for offline pipelines | --- @@ -283,31 +194,6 @@ blazehash -a -k s3://dfir-bucket/case-001.hash -r /mnt/evidence | `ALIBABA_CLOUD_REGION` | oss | | `SWIFT_ENDPOINT` | swift | | `SWIFT_TOKEN` | swift | -| `UPYUN_OPERATOR` | upyun | -| `UPYUN_PASSWORD` | upyun | -| `ONEDRIVE_ACCESS_TOKEN` | onedrive | -| `DROPBOX_ACCESS_TOKEN` | dropbox | -| `ALIYUN_DRIVE_ACCESS_TOKEN` | aliyun-drive | -| `YANDEX_DISK_ACCESS_TOKEN` | yandex-disk | -| `PCLOUD_USERNAME` / `PCLOUD_PASSWORD` | pcloud | -| `PCLOUD_ENDPOINT` | pcloud (default: `https://api.pcloud.com`) | -| `KOOFR_EMAIL` / `KOOFR_PASSWORD` | koofr | -| `KOOFR_ENDPOINT` | koofr (default: `https://app.koofr.net`) | -| `SEAFILE_USERNAME` / `SEAFILE_PASSWORD` | seafile | -| `SEAFILE_REPO` | seafile (repo name, default: `My Library`) | -| `GITHUB_TOKEN` | github | -| `HUGGINGFACE_TOKEN` | huggingface | -| `BLOB_READ_WRITE_TOKEN` | vercel-blob | -| `VERCEL_ARTIFACTS_TOKEN` | vercel-artifacts | -| `DATABRICKS_HOST` | dbfs | -| `DATABRICKS_TOKEN` | dbfs | | `WEBHDFS_USER` | webhdfs | -| `LAKEFS_ACCESS_KEY_ID` | lakefs | -| `LAKEFS_SECRET_ACCESS_KEY` | lakefs | -| `LAKEFS_ENDPOINT` | lakefs (default: `http://localhost:8000`) | -| `IPFS_GATEWAY` | ipfs (default: `http://127.0.0.1:8080`) | -| `IPFS_ENDPOINT` | ipmfs (default: `http://127.0.0.1:5001`) | -| `CLOUDFLARE_ACCOUNT_ID` | cloudflare-kv, d1 | -| `CLOUDFLARE_API_TOKEN` | cloudflare-kv, d1 | | `BLAZEHASH_SFTP_KEY_PATH` | sftp | | `BLAZEHASH_SFTP_KNOWN_HOSTS_STRATEGY` | sftp (`add` \| `strict` \| `accept_new`) | From 4dd0c50e4f31faea78792ee79f3d70910fb283ab Mon Sep 17 00:00:00 2001 From: Albert Hui Date: Mon, 27 Jul 2026 15:51:01 +0800 Subject: [PATCH 5/5] docs(ADR): renumber scope-remote-opendal ADR 0010 -> 0012 (avoid collision with open PR #2's 0010/0011) --- ...pendal-backends.md => 0012-scope-remote-opendal-backends.md} | 2 +- docs/remote.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename docs/decisions/{0010-scope-remote-opendal-backends.md => 0012-scope-remote-opendal-backends.md} (98%) diff --git a/docs/decisions/0010-scope-remote-opendal-backends.md b/docs/decisions/0012-scope-remote-opendal-backends.md similarity index 98% rename from docs/decisions/0010-scope-remote-opendal-backends.md rename to docs/decisions/0012-scope-remote-opendal-backends.md index 99268d1..28da678 100644 --- a/docs/decisions/0010-scope-remote-opendal-backends.md +++ b/docs/decisions/0012-scope-remote-opendal-backends.md @@ -1,4 +1,4 @@ -# 10. Scope the `remote` OpenDAL backend set to forensically-relevant evidence-transfer targets +# 12. Scope the `remote` OpenDAL backend set to forensically-relevant evidence-transfer targets Date: 2026-07-27 Status: Accepted diff --git a/docs/remote.md b/docs/remote.md index 401dd0c..e324981 100644 --- a/docs/remote.md +++ b/docs/remote.md @@ -13,7 +13,7 @@ blazehash s3://dfir-bucket/case-001/ -o gcs://evidence-archive/case-001.hash ``` The remote stack is an opt-in build feature (`--features remote`); the release -binaries enable it. ADR-0002 records why it is opt-in and ADR-0010 why the +binaries enable it. ADR-0002 records why it is opt-in and ADR-0012 why the backend set is scoped to evidence-transfer targets (both in the project's `docs/decisions/`).