diff --git a/.env.example b/.env.example index 6123e61794cb..7a5af5e79bbb 100644 --- a/.env.example +++ b/.env.example @@ -66,6 +66,13 @@ OPENDAL_SFTP_ROOT=/path/to/dir OPENDAL_SFTP_USER= OPENDAL_SFTP_KEY= OPENDAL_SFTP_KNOWN_HOSTS_STRATEGY= + +# smb +OPENDAL_SMB_ENDPOINT= +OPENDAL_SMB_SHARE= +OPENDAL_SMB_ROOT=/path/to/dir +OPENDAL_SMB_USER= +OPENDAL_SMB_PASSWORD= # sled OPENDAL_SLED_DATADIR=/path/to/database OPENDAL_SLED_TREE=sled-tree diff --git a/core/Cargo.lock b/core/Cargo.lock index 457528b48bc8..ec2b025f3bdd 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -11,6 +11,16 @@ dependencies = [ "psl-types", ] +[[package]] +name = "aead" +version = "0.6.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac8202ab55fcbf46ca829833f347a82a2a4ce0596f0304ac322c2d100030cd56" +dependencies = [ + "crypto-common 0.2.0-rc.4", + "inout 0.2.0-rc.6", +] + [[package]] name = "aes" version = "0.8.4" @@ -18,8 +28,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if 1.0.4", - "cipher", - "cpufeatures", + "cipher 0.4.4", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aes" +version = "0.9.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e713c57c2a2b19159e7be83b9194600d7e8eb3b7c2cd67e671adf47ce189a05" +dependencies = [ + "cfg-if 1.0.4", + "cipher 0.5.0-rc.1", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aes-gcm" +version = "0.11.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0686ba04dc80c816104c96cd7782b748f6ad58c5dd4ee619ff3258cf68e83d54" +dependencies = [ + "aead", + "aes 0.9.0-rc.1", + "cipher 0.5.0-rc.1", + "ctr 0.10.0-rc.1", + "ghash", + "subtle", ] [[package]] @@ -165,9 +200,9 @@ dependencies = [ [[package]] name = "arc-swap" -version = "1.9.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a07d1f37ff60921c83bdfc7407723bdefe89b44b98a9b772f225c8f9d67141a6" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" dependencies = [ "rustversion", ] @@ -186,10 +221,16 @@ checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" dependencies = [ "base64ct", "blake2", - "cpufeatures", + "cpufeatures 0.2.17", "password-hash", ] +[[package]] +name = "array-init" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" + [[package]] name = "arrayref" version = "0.3.9" @@ -264,6 +305,25 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-dnssd" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d49ffe175ab45bbfd74b548313d9d7cdfff27161a94b007b52eeeb5f9aaa15e" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-executor", + "futures-util", + "libc", + "log", + "pin-utils", + "pkg-config", + "tokio", + "winapi", +] + [[package]] name = "async-executor" version = "1.14.0" @@ -552,9 +612,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.39.0" +version = "0.39.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa7e52a4c5c547c741610a2c6f123f3881e409b714cd27e6798ef020c514f0a" +checksum = "83a25cf98105baa966497416dbd42565ce3a8cf8dbfd59803ec9ad46f3126399" dependencies = [ "cc", "cmake", @@ -609,14 +669,14 @@ dependencies = [ "bytes", "fastrand", "hex", - "hmac", + "hmac 0.12.1", "http 0.2.12", "http 1.4.0", "http-body 0.4.6", "lru", "percent-encoding", "regex-lite", - "sha2", + "sha2 0.10.9", "tracing", "url", ] @@ -703,13 +763,13 @@ dependencies = [ "crypto-bigint 0.5.5", "form_urlencoded", "hex", - "hmac", + "hmac 0.12.1", "http 0.2.12", "http 1.4.0", "p256 0.11.1", "percent-encoding", "ring", - "sha2", + "sha2 0.10.9", "subtle", "time", "tracing", @@ -740,10 +800,10 @@ dependencies = [ "hex", "http 0.2.12", "http-body 0.4.6", - "md-5", + "md-5 0.10.6", "pin-project-lite", - "sha1", - "sha2", + "sha1 0.10.6", + "sha2 0.10.9", "tracing", ] @@ -795,13 +855,13 @@ dependencies = [ "http 1.4.0", "http-body 0.4.6", "hyper 0.14.32", - "hyper 1.8.1", + "hyper 1.9.0", "hyper-rustls 0.24.2", - "hyper-rustls 0.27.7", + "hyper-rustls 0.27.8", "hyper-util", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.37", + "rustls 0.23.38", "rustls-native-certs 0.8.3", "rustls-pki-types", "tokio", @@ -1039,6 +1099,18 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base16ct" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b59d472eab27ade8d770dcb11da7201c11234bef9f82ce7aa517be028d462b" + +[[package]] +name = "base16ct" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" + [[package]] name = "base64" version = "0.21.7" @@ -1130,6 +1202,30 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "binrw" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53195f985e88ab94d1cc87e80049dd2929fd39e4a772c5ae96a7e5c4aad3642" +dependencies = [ + "array-init", + "binrw_derive", + "bytemuck", +] + +[[package]] +name = "binrw_derive" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5910da05ee556b789032c8ff5a61fb99239580aa3fd0bfaa8f4d094b2aee00ad" +dependencies = [ + "either", + "owo-colors", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -1163,21 +1259,21 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] name = "blake3" -version = "1.8.3" +version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" +checksum = "4d2d5991425dfd0785aed03aedcf0b321d61975c9b5b3689c774a2610ae0b51e" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if 1.0.4", "constant_time_eq", - "cpufeatures", + "cpufeatures 0.3.0", ] [[package]] @@ -1189,6 +1285,15 @@ dependencies = [ "generic-array 0.14.7", ] +[[package]] +name = "block-buffer" +version = "0.11.0-rc.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9ef36a6fcdb072aa548f3da057640ec10859eb4e91ddf526ee648d50c76a949" +dependencies = [ + "hybrid-array", +] + [[package]] name = "block-padding" version = "0.3.3" @@ -1198,6 +1303,15 @@ dependencies = [ "generic-array 0.14.7", ] +[[package]] +name = "block-padding" +version = "0.4.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e59c1aab3e6c5e56afe1b7e8650be9b5a791cb997bdea449194ae62e4bf8c73" +dependencies = [ + "hybrid-array", +] + [[package]] name = "blocking" version = "1.6.2" @@ -1218,7 +1332,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7" dependencies = [ "byteorder", - "cipher", + "cipher 0.4.4", ] [[package]] @@ -1269,10 +1383,10 @@ dependencies = [ "getrandom 0.2.17", "getrandom 0.3.4", "hex", - "indexmap 2.13.0", + "indexmap 2.14.0", "js-sys", "once_cell", - "rand 0.9.2", + "rand 0.9.4", "serde", "serde_bytes", "serde_json", @@ -1372,7 +1486,7 @@ version = "13.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c5063741c7b2e260bbede781cf4679632dd90e2718e99f7715e46824b65670b" dependencies = [ - "digest", + "digest 0.10.7", "either", "futures", "hex", @@ -1383,8 +1497,8 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "sha1", - "sha2", + "sha1 0.10.6", + "sha2 0.10.9", "ssri", "tempfile", "thiserror 1.0.69", @@ -1436,14 +1550,23 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" dependencies = [ - "cipher", + "cipher 0.4.4", +] + +[[package]] +name = "cbc" +version = "0.2.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dbf9e5b071e9de872e32b73f485e8f644ff47c7011d95476733e7482ee3e5c3" +dependencies = [ + "cipher 0.5.0-rc.1", ] [[package]] name = "cc" -version = "1.2.57" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "jobserver", @@ -1451,6 +1574,18 @@ dependencies = [ "shlex", ] +[[package]] +name = "ccm" +version = "0.6.0-pre.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a49680966b1cae2a239dd94d11bac423894ee4e00dacea1c50e8673e26a9829f" +dependencies = [ + "aead", + "cipher 0.5.0-rc.1", + "ctr 0.10.0-rc.1", + "subtle", +] + [[package]] name = "cesu8" version = "1.1.0" @@ -1531,8 +1666,19 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "crypto-common", - "inout", + "crypto-common 0.1.7", + "inout 0.1.4", +] + +[[package]] +name = "cipher" +version = "0.5.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e12a13eb01ded5d32ee9658d94f553a19e804204f2dc811df69ab4d9e0cb8c7" +dependencies = [ + "block-buffer 0.11.0-rc.5", + "crypto-common 0.2.0-rc.4", + "inout 0.2.0-rc.6", ] [[package]] @@ -1587,11 +1733,22 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +[[package]] +name = "cmac" +version = "0.8.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2fa99ca412f76b4656efeab943ef06f1ddd8036c31ca38f35188f173d0dc85e" +dependencies = [ + "cipher 0.5.0-rc.1", + "dbl", + "digest 0.11.0-rc.3", +] + [[package]] name = "cmake" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] @@ -1817,6 +1974,12 @@ 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" @@ -1922,6 +2085,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc" version = "3.4.0" @@ -1944,8 +2116,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ddc2d09feefeee8bd78101665bd8645637828fa9317f9f292496dbbd8c65ff3" dependencies = [ "crc", - "digest", - "rand 0.9.2", + "digest 0.10.7", + "rand 0.9.4", "regex", "rustversion", ] @@ -2087,6 +2259,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "crypto-bigint" +version = "0.7.0-rc.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4113edbc9f68c0a64d5b911f803eb245d04bb812680fd56776411f69c670f3e0" +dependencies = [ + "hybrid-array", + "num-traits", + "rand_core 0.9.5", + "serdect", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.7" @@ -2097,6 +2283,37 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8235645834fbc6832939736ce2f2d08192652269e11010a6240f61b908a1c6" +dependencies = [ + "hybrid-array", + "rand_core 0.9.5", +] + +[[package]] +name = "crypto-mac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" +dependencies = [ + "generic-array 0.14.7", + "subtle", +] + +[[package]] +name = "crypto-primes" +version = "0.7.0-pre.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f2523fbb68811c8710829417ad488086720a6349e337c38d12fa81e09e50bf" +dependencies = [ + "crypto-bigint 0.7.0-rc.8", + "libm", + "rand_core 0.9.5", +] + [[package]] name = "cssparser" version = "0.35.0" @@ -2163,7 +2380,16 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ - "cipher", + "cipher 0.4.4", +] + +[[package]] +name = "ctr" +version = "0.10.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27e41d01c6f73b9330177f5cf782ae5b581b5f2c7840e298e0275ceee5001434" +dependencies = [ + "cipher 0.5.0-rc.1", ] [[package]] @@ -2173,10 +2399,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if 1.0.4", - "cpufeatures", + "cpufeatures 0.2.17", "curve25519-dalek-derive", - "digest", - "fiat-crypto", + "digest 0.10.7", + "fiat-crypto 0.2.9", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "5.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f9200d1d13637f15a6acb71e758f64624048d85b31a5fdbfd8eca1e2687d0b7" +dependencies = [ + "cfg-if 1.0.4", + "cpufeatures 0.2.17", + "curve25519-dalek-derive", + "digest 0.11.0-rc.3", + "fiat-crypto 0.3.0", "rustc_version", "subtle", "zeroize", @@ -2331,13 +2573,22 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" +[[package]] +name = "dbl" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d7a944e61df464668c5f51f56cc667396a8821434273112948ea0b66e405d7" +dependencies = [ + "hybrid-array", +] + [[package]] name = "der" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" dependencies = [ - "const-oid", + "const-oid 0.9.6", "zeroize", ] @@ -2347,8 +2598,19 @@ version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ - "const-oid", - "pem-rfc7468", + "const-oid 0.9.6", + "pem-rfc7468 0.7.0", + "zeroize", +] + +[[package]] +name = "der" +version = "0.8.0-rc.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9d8dd2f26c86b27a2a8ea2767ec7f9df7a89516e4794e54ac01ee618dda3aa4" +dependencies = [ + "const-oid 0.10.2", + "pem-rfc7468 1.0.0-rc.3", "zeroize", ] @@ -2498,7 +2760,16 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e" dependencies = [ - "cipher", + "cipher 0.4.4", +] + +[[package]] +name = "des" +version = "0.9.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f51594a70805988feb1c85495ddec0c2052e4fbe59d9c0bb7f94bfc164f4f90" +dependencies = [ + "cipher 0.5.0-rc.1", ] [[package]] @@ -2519,9 +2790,21 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", + "block-buffer 0.10.4", + "const-oid 0.9.6", + "crypto-common 0.1.7", + "subtle", +] + +[[package]] +name = "digest" +version = "0.11.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac89f8a64533a9b0eaa73a68e424db0fb1fd6271c74cc0125336a05f090568d" +dependencies = [ + "block-buffer 0.11.0-rc.5", + "const-oid 0.10.2", + "crypto-common 0.2.0-rc.4", "subtle", ] @@ -2696,13 +2979,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der 0.7.10", - "digest", + "digest 0.10.7", "elliptic-curve 0.13.8", "rfc6979 0.4.0", "signature 2.2.0", "spki 0.7.3", ] +[[package]] +name = "ecdsa" +version = "0.17.0-rc.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ab355ec063f7a110eb627471058093aba00eb7f4e70afbd15e696b79d1077b" +dependencies = [ + "der 0.8.0-rc.9", + "digest 0.11.0-rc.3", + "elliptic-curve 0.14.0-rc.15", + "rfc6979 0.5.0-rc.1", + "signature 3.0.0-rc.4", + "spki 0.8.0-rc.4", + "zeroize", +] + [[package]] name = "ed25519" version = "2.2.3" @@ -2713,16 +3011,40 @@ dependencies = [ "signature 2.2.0", ] +[[package]] +name = "ed25519" +version = "3.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ef49c0b20c0ad088893ad2a790a29c06a012b3f05bcfc66661fd22a94b32129" +dependencies = [ + "pkcs8 0.11.0-rc.7", + "signature 3.0.0-rc.4", +] + [[package]] name = "ed25519-dalek" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ - "curve25519-dalek", - "ed25519", + "curve25519-dalek 4.1.3", + "ed25519 2.2.3", "serde", - "sha2", + "sha2 0.10.9", + "subtle", + "zeroize", +] + +[[package]] +name = "ed25519-dalek" +version = "3.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad207ed88a133091f83224265eac21109930db09bedcad05d5252f2af2de20a1" +dependencies = [ + "curve25519-dalek 5.0.0-pre.1", + "ed25519 3.0.0-rc.1", + "rand_core 0.9.5", + "sha2 0.11.0-rc.2", "subtle", "zeroize", ] @@ -2774,7 +3096,7 @@ dependencies = [ "base16ct 0.1.1", "crypto-bigint 0.4.9", "der 0.6.1", - "digest", + "digest 0.10.7", "ff 0.12.1", "generic-array 0.14.7", "group 0.12.1", @@ -2793,12 +3115,12 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct 0.2.0", "crypto-bigint 0.5.5", - "digest", + "digest 0.10.7", "ff 0.13.1", "generic-array 0.14.7", "group 0.13.0", - "hkdf", - "pem-rfc7468", + "hkdf 0.12.4", + "pem-rfc7468 0.7.0", "pkcs8 0.10.2", "rand_core 0.6.4", "sec1 0.7.3", @@ -2806,6 +3128,28 @@ dependencies = [ "zeroize", ] +[[package]] +name = "elliptic-curve" +version = "0.14.0-rc.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e3be87c458d756141f3b6ee188828132743bf90c7d14843e2835d6443e5fb03" +dependencies = [ + "base16ct 0.3.0", + "crypto-bigint 0.7.0-rc.8", + "digest 0.11.0-rc.3", + "ff 0.14.0-pre.0", + "group 0.14.0-pre.0", + "hkdf 0.13.0-rc.2", + "hybrid-array", + "once_cell", + "pem-rfc7468 1.0.0-rc.3", + "pkcs8 0.11.0-rc.7", + "rand_core 0.9.5", + "sec1 0.8.0-rc.10", + "subtle", + "zeroize", +] + [[package]] name = "encoding_rs" version = "0.8.35" @@ -2998,7 +3342,7 @@ dependencies = [ "fastrace-macro", "parking_lot 0.12.5", "pin-project", - "rand 0.9.2", + "rand 0.9.4", "rtrb", "serde", ] @@ -3028,11 +3372,11 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" dependencies = [ - "getrandom 0.2.17", + "getrandom 0.3.4", ] [[package]] @@ -3055,12 +3399,28 @@ dependencies = [ "subtle", ] +[[package]] +name = "ff" +version = "0.14.0-pre.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d42dd26f5790eda47c1a2158ea4120e32c35ddc9a7743c98a292accc01b54ef3" +dependencies = [ + "rand_core 0.9.5", + "subtle", +] + [[package]] name = "fiat-crypto" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "fiat-crypto" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" + [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -3325,7 +3685,7 @@ dependencies = [ "parking_lot 0.12.5", "paste", "pin-project", - "rand 0.9.2", + "rand 0.9.4", "serde", "thiserror 2.0.18", "tokio", @@ -3472,7 +3832,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" dependencies = [ "futures-io", - "rustls 0.23.37", + "rustls 0.23.38", "rustls-pki-types", ] @@ -3736,6 +4096,15 @@ dependencies = [ "prost 0.13.5", ] +[[package]] +name = "ghash" +version = "0.6.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f88107cb02ed63adcc4282942e60c4d09d80208d33b360ce7c729ce6dae1739" +dependencies = [ + "polyval", +] + [[package]] name = "git-version" version = "0.3.9" @@ -3804,7 +4173,7 @@ dependencies = [ "parking_lot 0.12.5", "portable-atomic", "quanta", - "rand 0.9.2", + "rand 0.9.4", "smallvec", "spinning_top", "web-time", @@ -3832,6 +4201,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "group" +version = "0.14.0-pre.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ff6a0b2dd4b981b1ae9e3e6830ab146771f3660d31d57bafd9018805a91b0f1" +dependencies = [ + "ff 0.14.0-pre.0", + "rand_core 0.9.5", + "subtle", +] + [[package]] name = "h2" version = "0.3.27" @@ -3844,7 +4224,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.13.0", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -3863,7 +4243,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.4.0", - "indexmap 2.13.0", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -3954,6 +4334,12 @@ dependencies = [ "foldhash 0.2.0", ] +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" + [[package]] name = "hashlink" version = "0.10.0" @@ -3969,31 +4355,31 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51610510377a0847d53b78b53f9c6c9b7df3ffb300d1181b2e04f68bba363734" dependencies = [ - "aes", + "aes 0.8.4", "base64 0.22.1", "bitflags 2.11.0", "bumpalo", "bytes", - "cbc", + "cbc 0.1.2", "chrono", - "cipher", + "cipher 0.4.4", "crc", - "ctr", - "des", + "ctr 0.9.2", + "des 0.8.1", "dns-lookup", "futures", "g2p", "hex", - "hmac", + "hmac 0.12.1", "libc", "libloading 0.9.0", "log", - "md-5", + "md-5 0.10.6", "num-traits", "once_cell", "prost 0.14.3", "prost-types", - "rand 0.9.2", + "rand 0.9.4", "regex", "roxmltree", "socket2 0.6.3", @@ -4040,7 +4426,7 @@ dependencies = [ "http 1.4.0", "httpdate", "mime", - "sha1", + "sha1 0.10.6", ] [[package]] @@ -4113,9 +4499,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hf-xet" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c263f8e6508e4f3a616cd580597c59862d7f44f004b5e654a1329d92637e5f53" +checksum = "b51abe4fef614e6d944f451ceb9af154efa7e85dff8f2c35e2922cc789e0aa88" dependencies = [ "async-trait", "bytes", @@ -4149,7 +4535,7 @@ dependencies = [ "idna", "ipnet", "once_cell", - "rand 0.9.2", + "rand 0.9.4", "ring", "thiserror 2.0.18", "tinyvec", @@ -4171,7 +4557,7 @@ dependencies = [ "moka", "once_cell", "parking_lot 0.12.5", - "rand 0.9.2", + "rand 0.9.4", "resolv-conf", "smallvec", "thiserror 2.0.18", @@ -4183,18 +4569,36 @@ dependencies = [ name = "hkdf" version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac 0.12.1", +] + +[[package]] +name = "hkdf" +version = "0.13.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8ef30358b03ca095a5b910547f4f8d4b9f163e4057669c5233ef595b1ecf008" +dependencies = [ + "hmac 0.13.0-rc.2", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "hmac", + "digest 0.10.7", ] [[package]] name = "hmac" -version = "0.12.1" +version = "0.13.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "a3fd4dc94c318c1ede8a2a48341c250d6ddecd3ba793da2820301a9f92417ad9" dependencies = [ - "digest", + "digest 0.11.0-rc.3", ] [[package]] @@ -4305,6 +4709,17 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" +[[package]] +name = "hybrid-array" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3944cf8cf766b40e2a1a333ee5e9b563f854d5fa49d6a8ca2764e97c6eddb214" +dependencies = [ + "subtle", + "typenum", + "zeroize", +] + [[package]] name = "hyper" version = "0.14.32" @@ -4331,9 +4746,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ "atomic-waker", "bytes", @@ -4346,7 +4761,6 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -4370,16 +4784,15 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "c2b52f86d1d4bc0d6b4e6826d960b1b333217e07d36b882dca570a5e1c48895b" dependencies = [ "http 1.4.0", - "hyper 1.8.1", + "hyper 1.9.0", "hyper-util", - "rustls 0.23.37", + "rustls 0.23.38", "rustls-native-certs 0.8.3", - "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", "tower-service", @@ -4403,7 +4816,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.8.1", + "hyper 1.9.0", "hyper-util", "pin-project-lite", "tokio", @@ -4422,7 +4835,7 @@ dependencies = [ "futures-util", "http 1.4.0", "http-body 1.0.1", - "hyper 1.8.1", + "hyper 1.9.0", "ipnet", "libc", "percent-encoding", @@ -4628,21 +5041,21 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.0", "serde", "serde_core", ] [[package]] name = "indextree" -version = "4.8.0" +version = "4.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f80a9409db2176ff13877276660f5149fee32592698d2100afe8b52043d4405" +checksum = "5cee462cd93b03891663339b59a21246cc5fc2cc95060d0bb5059e25cd50edc4" dependencies = [ "indextree-macros", ] @@ -4668,10 +5081,20 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ - "block-padding", + "block-padding 0.3.3", "generic-array 0.14.7", ] +[[package]] +name = "inout" +version = "0.2.0-rc.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1603f76010ff924b616c8f44815a42eb10fb0b93d308b41deaa8da6d4251fd4b" +dependencies = [ + "block-padding 0.4.0-rc.4", + "hybrid-array", +] + [[package]] name = "instant" version = "0.1.13" @@ -4734,9 +5157,9 @@ checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e7418f59cc01c88316161279a7f665217ae316b388e58a0d10e29f54f1e5eb" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" dependencies = [ "memchr", "serde", @@ -4898,10 +5321,12 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" dependencies = [ + "cfg-if 1.0.4", + "futures-util", "once_cell", "wasm-bindgen", ] @@ -4914,22 +5339,40 @@ checksum = "0529410abe238729a60b108898784df8984c87f6054c9c4fcacc47e4803c1ce1" dependencies = [ "aws-lc-rs", "base64 0.22.1", - "ed25519-dalek", + "ed25519-dalek 2.2.0", "getrandom 0.2.17", - "hmac", + "hmac 0.12.1", "js-sys", "p256 0.13.2", - "p384", + "p384 0.13.1", "pem", "rand 0.8.5", - "rsa", + "rsa 0.9.10", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "signature 2.2.0", "simple_asn1", ] +[[package]] +name = "kbkdf" +version = "0.1.0-pre.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e97e1f9b50adafd503518a832b24241dca1d319bfc27e9e708bcf220b0b25419" +dependencies = [ + "digest 0.11.0-rc.3", +] + +[[package]] +name = "keccak" +version = "0.2.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d546793a04a1d3049bd192856f804cfe96356e2cf36b54b4e575155babe9f41" +dependencies = [ + "cpufeatures 0.2.17", +] + [[package]] name = "konst" version = "0.4.3" @@ -5011,9 +5454,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.183" +version = "0.2.185" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" [[package]] name = "libfuzzer-sys" @@ -5053,14 +5496,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ "bitflags 2.11.0", "libc", "plain", - "redox_syscall 0.7.3", + "redox_syscall 0.7.4", ] [[package]] @@ -5102,9 +5545,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.25" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52f4c29e2a68ac30c9087e1b772dc9f44a2b66ed44edf2266cf2be9b03dafc1" +checksum = "fc3a226e576f50782b3305c5ccf458698f92798987f551c6a02efe8276721e22" dependencies = [ "cc", "pkg-config", @@ -5131,9 +5574,9 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lock_api" @@ -5268,6 +5711,12 @@ dependencies = [ "libc", ] +[[package]] +name = "lz4_flex" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373f5eceeeab7925e0c1098212f2fbc4d416adec9d35051a6ab251e824c1854a" + [[package]] name = "lz4_flex" version = "0.13.0" @@ -5445,6 +5894,17 @@ dependencies = [ "rawpointer", ] +[[package]] +name = "maybe-async" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "md-5" version = "0.10.6" @@ -5452,7 +5912,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ "cfg-if 1.0.4", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "md-5" +version = "0.11.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9ec86664728010f574d67ef01aec964e6f1299241a3402857c1a8a390a62478" +dependencies = [ + "cfg-if 1.0.4", + "digest 0.11.0-rc.3", +] + +[[package]] +name = "md4" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da5ac363534dce5fabf69949225e174fbf111a498bf0ff794c8ea1fba9f3dda" +dependencies = [ + "digest 0.10.7", ] [[package]] @@ -5591,9 +6070,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi 0.11.1+wasi-snapshot-preview1", @@ -5610,6 +6089,27 @@ dependencies = [ "parking_lot 0.12.5", ] +[[package]] +name = "modular-bitfield" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" +dependencies = [ + "modular-bitfield-impl", + "static_assertions", +] + +[[package]] +name = "modular-bitfield-impl" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "moka" version = "0.12.15" @@ -5665,22 +6165,22 @@ dependencies = [ "hex", "hickory-proto", "hickory-resolver", - "hmac", + "hmac 0.12.1", "macro_magic", - "md-5", + "md-5 0.10.6", "mongocrypt", "mongodb-internal-macros", - "pbkdf2", + "pbkdf2 0.12.2", "percent-encoding", - "rand 0.9.2", + "rand 0.9.4", "rustc_version_runtime", - "rustls 0.23.37", + "rustls 0.23.38", "rustversion", "serde", "serde_bytes", "serde_with", - "sha1", - "sha2", + "sha1 0.10.6", + "sha2 0.10.9", "socket2 0.6.3", "stringprep", "strsim 0.11.1", @@ -5805,7 +6305,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6e54a8b65764f71827a90ca1d56965ec0c67f069f996477bd493402a901d1f" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "itertools 0.13.0", "ndarray", "noisy_float", @@ -6031,6 +6531,15 @@ dependencies = [ "web-time", ] +[[package]] +name = "oid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c19903c598813dba001b53beeae59bb77ad4892c5c1b9b3500ce4293a0d06c2" +dependencies = [ + "serde", +] + [[package]] name = "once_cell" version = "1.21.4" @@ -6149,6 +6658,7 @@ dependencies = [ "opendal-service-seafile", "opendal-service-sftp", "opendal-service-sled", + "opendal-service-smb", "opendal-service-sqlite", "opendal-service-surrealdb", "opendal-service-swift", @@ -6162,8 +6672,8 @@ dependencies = [ "opendal-service-yandex-disk", "opendal-testkit", "rand 0.8.5", - "reqwest", - "sha2", + "reqwest 0.13.2", + "sha2 0.10.9", "size", "tokio", "uuid", @@ -6208,7 +6718,7 @@ dependencies = [ "jiff", "log", "logforth", - "md-5", + "md-5 0.10.6", "mea", "moka", "percent-encoding", @@ -6216,10 +6726,10 @@ dependencies = [ "quick-xml 0.38.4", "rand 0.8.5", "reqsign-core", - "reqwest", + "reqwest 0.13.2", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "tokio", "url", "uuid", @@ -6563,7 +7073,7 @@ dependencies = [ "reqsign-file-read-tokio", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "tokio", "uuid", ] @@ -6822,7 +7332,7 @@ dependencies = [ "reqsign-core", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "tokio", ] @@ -6888,7 +7398,7 @@ dependencies = [ "log", "opendal-core", "percent-encoding", - "reqwest", + "reqwest 0.13.2", "serde", "serde_json", "tokio", @@ -7161,7 +7671,7 @@ dependencies = [ "crc32c", "http 1.4.0", "log", - "md-5", + "md-5 0.10.6", "opendal-core", "pretty_assertions", "quick-xml 0.38.4", @@ -7214,6 +7724,20 @@ dependencies = [ "tokio", ] +[[package]] +name = "opendal-service-smb" +version = "0.55.0" +dependencies = [ + "bytes", + "fastpool", + "futures", + "log", + "opendal-core", + "serde", + "smb", + "tokio", +] + [[package]] name = "opendal-service-sqlite" version = "0.55.0" @@ -7242,7 +7766,7 @@ version = "0.55.0" dependencies = [ "base64 0.22.1", "bytes", - "hmac", + "hmac 0.12.1", "http 1.4.0", "log", "opendal-core", @@ -7250,8 +7774,8 @@ dependencies = [ "quick-xml 0.38.4", "serde", "serde_json", - "sha1", - "sha2", + "sha1 0.10.6", + "sha2 0.10.9", "tokio", "uuid", ] @@ -7282,15 +7806,15 @@ version = "0.55.0" dependencies = [ "base64 0.22.1", "bytes", - "hmac", + "hmac 0.12.1", "http 1.4.0", "log", - "md-5", + "md-5 0.10.6", "opendal-core", "quick-xml 0.38.4", "serde", "serde_json", - "sha1", + "sha1 0.10.6", "tokio", ] @@ -7378,7 +7902,7 @@ dependencies = [ "opendal-layer-retry", "opendal-layer-timeout", "rand 0.8.5", - "sha2", + "sha2 0.10.9", "tokio", "uuid", ] @@ -7399,9 +7923,9 @@ dependencies = [ [[package]] name = "openssh-sftp-client" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be60b300617a6c6b2d5f7d81ab9a622a155119fdae516375b12cc502bcd33dd3" +checksum = "5b0917ea531f11cf229b44a45ab0669b738af823eff1788d0a495c0ad06c0a17" dependencies = [ "bytes", "derive_destructure2", @@ -7477,9 +8001,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.76" +version = "0.10.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf" +checksum = "bfe4646e360ec77dff7dde40ed3d6c5fee52d156ef4a62f53973d38294dad87f" dependencies = [ "bitflags 2.11.0", "cfg-if 1.0.4", @@ -7515,9 +8039,9 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.112" +version = "0.9.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb" +checksum = "ad2f2c0eba47118757e4c6d2bff2838f3e0523380021356e7875e858372ce644" dependencies = [ "cc", "libc", @@ -7579,7 +8103,7 @@ dependencies = [ "futures-util", "opentelemetry", "percent-encoding", - "rand 0.9.2", + "rand 0.9.4", "thiserror 2.0.18", "tokio", "tokio-stream", @@ -7635,6 +8159,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" +[[package]] +name = "owo-colors" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" + [[package]] name = "p256" version = "0.11.1" @@ -7643,7 +8173,7 @@ checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" dependencies = [ "ecdsa 0.14.8", "elliptic-curve 0.12.3", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -7654,8 +8184,21 @@ checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" dependencies = [ "ecdsa 0.16.9", "elliptic-curve 0.13.8", - "primeorder", - "sha2", + "primeorder 0.13.6", + "sha2 0.10.9", +] + +[[package]] +name = "p256" +version = "0.14.0-pre.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81b374901df34ee468167a58e2a49e468cb059868479cafebeb804f6b855423d" +dependencies = [ + "ecdsa 0.17.0-rc.7", + "elliptic-curve 0.14.0-rc.15", + "primefield", + "primeorder 0.14.0-pre.9", + "sha2 0.11.0-rc.2", ] [[package]] @@ -7666,8 +8209,37 @@ checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" dependencies = [ "ecdsa 0.16.9", "elliptic-curve 0.13.8", - "primeorder", - "sha2", + "primeorder 0.13.6", + "sha2 0.10.9", +] + +[[package]] +name = "p384" +version = "0.14.0-pre.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "701032b3730df6b882496d6cee8221de0ce4bc11ddc64e6d89784aa5b8a6de30" +dependencies = [ + "ecdsa 0.17.0-rc.7", + "elliptic-curve 0.14.0-rc.15", + "fiat-crypto 0.3.0", + "primefield", + "primeorder 0.14.0-pre.9", + "sha2 0.11.0-rc.2", +] + +[[package]] +name = "p521" +version = "0.14.0-pre.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ba29c2906eb5c89a8c411c4f11243ee4e5517ee7d71d9a13fedc877a6057b1" +dependencies = [ + "base16ct 0.3.0", + "ecdsa 0.17.0-rc.7", + "elliptic-curve 0.14.0-rc.15", + "primefield", + "primeorder 0.14.0-pre.9", + "rand_core 0.9.5", + "sha2 0.11.0-rc.2", ] [[package]] @@ -7678,9 +8250,9 @@ checksum = "384e52fd8fbd4cbe3c317e8216260c21a0f9134de108cea8a4dd4e7e152c472d" [[package]] name = "papaya" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92dd0b07c53a0a0c764db2ace8c541dc47320dad97c2200c2a637ab9dd2328f" +checksum = "997ee03cd38c01469a7046643714f0ad28880bcb9e6679ff0666e24817ca19b7" dependencies = [ "equivalent", "seize", @@ -7757,6 +8329,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + [[package]] name = "path-clean" version = "1.0.1" @@ -7769,10 +8347,21 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "digest", - "hmac", + "digest 0.10.7", + "hmac 0.12.1", "password-hash", - "sha2", + "sha2 0.10.9", +] + +[[package]] +name = "pbkdf2" +version = "0.13.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3fc18bb4460ac250ba6b75dfa7cf9d0b2273e3e623f660bd6ce2c3e902342e" +dependencies = [ + "digest 0.11.0-rc.3", + "hmac 0.13.0-rc.2", + "sha1 0.11.0-rc.2", ] [[package]] @@ -7806,6 +8395,15 @@ dependencies = [ "base64ct", ] +[[package]] +name = "pem-rfc7468" +version = "1.0.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8e58fab693c712c0d4e88f8eb3087b6521d060bcaf76aeb20cb192d809115ba" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -7822,7 +8420,7 @@ dependencies = [ "data-encoding", "fs2", "linked-hash-map", - "rand 0.9.2", + "rand 0.9.4", "thiserror 2.0.18", "unsigned-varint", "zigzag", @@ -7836,7 +8434,7 @@ checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset", "hashbrown 0.15.5", - "indexmap 2.13.0", + "indexmap 2.14.0", ] [[package]] @@ -7936,6 +8534,129 @@ dependencies = [ "unicase", ] +[[package]] +name = "picky" +version = "7.0.0-rc.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cdc52be663aebd70d7006ae305c87eb32a2b836d6c2f26f7e384f845d80b621" +dependencies = [ + "base64 0.22.1", + "block-buffer 0.11.0-rc.5", + "block-padding 0.4.0-rc.4", + "crypto-bigint 0.7.0-rc.8", + "crypto-common 0.2.0-rc.4", + "crypto-primes", + "curve25519-dalek 5.0.0-pre.1", + "der 0.8.0-rc.9", + "digest 0.11.0-rc.3", + "ecdsa 0.17.0-rc.7", + "ed25519 3.0.0-rc.1", + "ed25519-dalek 3.0.0-pre.1", + "elliptic-curve 0.14.0-rc.15", + "ff 0.14.0-pre.0", + "group 0.14.0-pre.0", + "hex", + "hkdf 0.13.0-rc.2", + "inout 0.2.0-rc.6", + "keccak", + "md-5 0.11.0-rc.2", + "p256 0.14.0-pre.11", + "p384 0.14.0-pre.11", + "p521", + "pem-rfc7468 1.0.0-rc.3", + "picky-asn1", + "picky-asn1-der", + "picky-asn1-x509", + "pkcs1 0.8.0-rc.4", + "pkcs8 0.11.0-rc.7", + "primefield", + "primeorder 0.14.0-pre.9", + "rand 0.9.4", + "rand_core 0.9.5", + "rfc6979 0.5.0-rc.1", + "rsa 0.10.0-rc.9", + "sec1 0.8.0-rc.10", + "serde", + "sha1 0.11.0-rc.2", + "sha2 0.11.0-rc.2", + "sha3", + "signature 3.0.0-rc.4", + "spki 0.8.0-rc.4", + "thiserror 2.0.18", + "x25519-dalek", + "zeroize", +] + +[[package]] +name = "picky-asn1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ff038f9360b934342fb3c0a1d6e82c438a2624b51c3c6e3e6d7cf252b6f3ee3" +dependencies = [ + "oid", + "serde", + "serde_bytes", + "time", + "zeroize", +] + +[[package]] +name = "picky-asn1-der" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09561f7aa88cd6fae98edaf7dca3d8520da5b86a92839f2109a928af12a55c41" +dependencies = [ + "picky-asn1", + "serde", + "serde_bytes", +] + +[[package]] +name = "picky-asn1-x509" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c97cd14d567a17755910fa8718277baf39d08682a980b1b1a4b4da7d0bc61a04" +dependencies = [ + "base64 0.22.1", + "crypto-bigint 0.7.0-rc.8", + "oid", + "picky-asn1", + "picky-asn1-der", + "serde", + "widestring", + "zeroize", +] + +[[package]] +name = "picky-krb" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed61c8d7448649c031ecae02afb10c679524c7a9af5fb0fbee466b3cc0d6df1" +dependencies = [ + "aes 0.9.0-rc.1", + "block-buffer 0.11.0-rc.5", + "block-padding 0.4.0-rc.4", + "byteorder", + "cbc 0.2.0-rc.1", + "cipher 0.5.0-rc.1", + "crypto-bigint 0.7.0-rc.8", + "crypto-common 0.2.0-rc.4", + "des 0.9.0-rc.1", + "digest 0.11.0-rc.3", + "hmac 0.13.0-rc.2", + "inout 0.2.0-rc.6", + "oid", + "pbkdf2 0.13.0-rc.1", + "picky-asn1", + "picky-asn1-der", + "picky-asn1-x509", + "rand 0.9.4", + "serde", + "sha1 0.11.0-rc.2", + "thiserror 2.0.18", + "uuid", +] + [[package]] name = "pin-project" version = "1.1.11" @@ -7990,18 +8711,28 @@ dependencies = [ "spki 0.7.3", ] +[[package]] +name = "pkcs1" +version = "0.8.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "986d2e952779af96ea048f160fd9194e1751b4faea78bcf3ceb456efe008088e" +dependencies = [ + "der 0.8.0-rc.9", + "spki 0.8.0-rc.4", +] + [[package]] name = "pkcs5" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e847e2c91a18bfa887dd028ec33f2fe6f25db77db3619024764914affe8b69a6" dependencies = [ - "aes", - "cbc", + "aes 0.8.4", + "cbc 0.1.2", "der 0.7.10", - "pbkdf2", + "pbkdf2 0.12.2", "scrypt", - "sha2", + "sha2 0.10.9", "spki 0.7.3", ] @@ -8027,11 +8758,21 @@ dependencies = [ "spki 0.7.3", ] +[[package]] +name = "pkcs8" +version = "0.11.0-rc.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93eac55f10aceed84769df670ea4a32d2ffad7399400d41ee1c13b1cd8e1b478" +dependencies = [ + "der 0.8.0-rc.9", + "spki 0.8.0-rc.4", +] + [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "plain" @@ -8081,6 +8822,17 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "polyval" +version = "0.7.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffd40cc99d0fbb02b4b3771346b811df94194bc103983efa0203c8893755085" +dependencies = [ + "cfg-if 1.0.4", + "cpufeatures 0.2.17", + "universal-hash", +] + [[package]] name = "portable-atomic" version = "1.13.1" @@ -8098,9 +8850,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -8146,6 +8898,19 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "primefield" +version = "0.14.0-pre.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fcd4a163053332fd93f39b81c133e96a98567660981654579c90a99062fbf5" +dependencies = [ + "crypto-bigint 0.7.0-rc.8", + "ff 0.14.0-pre.0", + "rand_core 0.9.5", + "subtle", + "zeroize", +] + [[package]] name = "primeorder" version = "0.13.6" @@ -8155,6 +8920,15 @@ dependencies = [ "elliptic-curve 0.13.8", ] +[[package]] +name = "primeorder" +version = "0.14.0-pre.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c36e8766fcd270fa9c665b9dc364f570695f5a59240949441b077a397f15b74" +dependencies = [ + "elliptic-curve 0.14.0-rc.15", +] + [[package]] name = "probe" version = "0.5.2" @@ -8256,9 +9030,9 @@ dependencies = [ [[package]] name = "prometheus-client" -version = "0.24.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4500adecd7af8e0e9f4dbce15cfee07ce913fbf6ad605cc468b83f2d531ee94" +checksum = "cca3d75b4566b9a29fe1ed623587fb058e826eb329a0be4b7c4da1ebb2d7a6ca" dependencies = [ "dtoa", "itoa", @@ -8511,8 +9285,8 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.1.1", - "rustls 0.23.37", + "rustc-hash 2.1.2", + "rustls 0.23.38", "socket2 0.6.3", "thiserror 2.0.18", "tokio", @@ -8530,10 +9304,10 @@ dependencies = [ "bytes", "getrandom 0.3.4", "lru-slab", - "rand 0.9.2", + "rand 0.9.4", "ring", - "rustc-hash 2.1.1", - "rustls 0.23.37", + "rustc-hash 2.1.2", + "rustls 0.23.38", "rustls-pki-types", "slab", "thiserror 2.0.18", @@ -8620,9 +9394,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -8720,9 +9494,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -8764,9 +9538,9 @@ dependencies = [ [[package]] name = "redis" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e41a79ae5cbb41257d84cf4cf0db0bb5a95b11bf05c62c351de4fe748620d" +checksum = "f44e94c96d8870a387d88ce3de3fdd608cbfc0705f03cb343cdde91509d3e49a" dependencies = [ "arc-swap", "arcstr", @@ -8784,8 +9558,8 @@ dependencies = [ "num-bigint", "percent-encoding", "pin-project-lite", - "rand 0.9.2", - "rustls 0.23.37", + "rand 0.9.4", + "rustls 0.23.38", "rustls-native-certs 0.8.3", "ryu", "sha1_smol", @@ -8818,9 +9592,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" +checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" dependencies = [ "bitflags 2.11.0", ] @@ -8933,7 +9707,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sha1", + "sha1 0.10.6", ] [[package]] @@ -8952,10 +9726,10 @@ dependencies = [ "pem", "percent-encoding", "reqsign-core", - "rsa", + "rsa 0.9.10", "serde", "serde_json", - "sha1", + "sha1 0.10.6", ] [[package]] @@ -8970,13 +9744,13 @@ dependencies = [ "form_urlencoded", "futures", "hex", - "hmac", + "hmac 0.12.1", "http 1.4.0", "jiff", "log", "percent-encoding", - "sha1", - "sha2", + "sha1 0.10.6", + "sha2 0.10.9", "windows-sys 0.61.2", ] @@ -9004,10 +9778,10 @@ dependencies = [ "percent-encoding", "reqsign-aws-v4", "reqsign-core", - "rsa", + "rsa 0.9.10", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "tokio", ] @@ -9034,9 +9808,49 @@ dependencies = [ "http 1.4.0", "log", "percent-encoding", - "reqsign-core", + "reqsign-core", + "serde", + "serde_json", +] + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.4.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.9.0", + "hyper-rustls 0.27.8", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.38", + "rustls-native-certs 0.8.3", + "rustls-pki-types", "serde", "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tokio-rustls 0.26.4", + "tower 0.5.3", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] @@ -9054,8 +9868,8 @@ dependencies = [ "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", - "hyper-rustls 0.27.7", + "hyper 1.9.0", + "hyper-rustls 0.27.8", "hyper-util", "js-sys", "log", @@ -9064,7 +9878,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.37", + "rustls 0.23.38", "rustls-pki-types", "rustls-platform-verifier", "serde", @@ -9092,7 +9906,7 @@ dependencies = [ "anyhow", "async-trait", "http 1.4.0", - "reqwest", + "reqwest 0.13.2", "thiserror 2.0.18", "tower-service", ] @@ -9108,8 +9922,8 @@ dependencies = [ "futures", "getrandom 0.2.17", "http 1.4.0", - "hyper 1.8.1", - "reqwest", + "hyper 1.9.0", + "reqwest 0.13.2", "reqwest-middleware", "retry-policies", "thiserror 2.0.18", @@ -9130,7 +9944,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46a4bd6027df676bcb752d3724db0ea3c0c5fc1dd0376fec51ac7dcaf9cc69be" dependencies = [ - "rand 0.9.2", + "rand 0.9.4", ] [[package]] @@ -9167,7 +9981,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" dependencies = [ "crypto-bigint 0.4.9", - "hmac", + "hmac 0.12.1", "zeroize", ] @@ -9177,7 +9991,17 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac", + "hmac 0.12.1", + "subtle", +] + +[[package]] +name = "rfc6979" +version = "0.5.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d369f9c4f79388704648e7bcb92749c0d6cf4397039293a9b747694fa4fb4bae" +dependencies = [ + "hmac 0.13.0-rc.2", "subtle", ] @@ -9266,21 +10090,41 @@ version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" dependencies = [ - "const-oid", - "digest", + "const-oid 0.9.6", + "digest 0.10.7", "num-bigint-dig", "num-integer", "num-traits", - "pkcs1", + "pkcs1 0.7.5", "pkcs8 0.10.2", "rand_core 0.6.4", - "sha2", + "sha2 0.10.9", "signature 2.2.0", "spki 0.7.3", "subtle", "zeroize", ] +[[package]] +name = "rsa" +version = "0.10.0-rc.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf8955ab399f6426998fde6b76ae27233cce950705e758a6c17afd2f6d0e5d52" +dependencies = [ + "const-oid 0.10.2", + "crypto-bigint 0.7.0-rc.8", + "crypto-primes", + "digest 0.11.0-rc.3", + "pkcs1 0.8.0-rc.4", + "pkcs8 0.11.0-rc.7", + "rand_core 0.9.5", + "sha1 0.11.0-rc.2", + "signature 3.0.0-rc.4", + "spki 0.8.0-rc.4", + "subtle", + "zeroize", +] + [[package]] name = "rstar" version = "0.8.4" @@ -9399,9 +10243,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.40.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61f703d19852dbf87cbc513643fa81428361eb6940f1ac14fd58155d295a3eb0" +checksum = "2ce901f9a19d251159075a4c37af514c3b8ef99c22e02dd8c19161cf397ee94a" dependencies = [ "arrayvec", "borsh", @@ -9411,6 +10255,7 @@ dependencies = [ "rkyv", "serde", "serde_json", + "wasm-bindgen", ] [[package]] @@ -9421,9 +10266,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc_version" @@ -9484,16 +10329,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.37" +version = "0.23.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +checksum = "69f9466fb2c14ea04357e91413efb882e2a6d4a406e625449bc0a5d360d53a21" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.10", + "rustls-webpki 0.103.11", "subtle", "zeroize", ] @@ -9552,10 +10397,10 @@ dependencies = [ "jni", "log", "once_cell", - "rustls 0.23.37", + "rustls 0.23.38", "rustls-native-certs 0.8.3", "rustls-platform-verifier-android", - "rustls-webpki 0.103.10", + "rustls-webpki 0.103.11", "security-framework 3.7.0", "security-framework-sys", "webpki-root-certs", @@ -9580,9 +10425,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.10" +version = "0.103.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" +checksum = "20a6af516fea4b20eccceaf166e8aa666ac996208e8a644ce3ef5aa783bc7cd4" dependencies = [ "aws-lc-rs", "ring", @@ -9614,7 +10459,7 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" dependencies = [ - "cipher", + "cipher 0.4.4", ] [[package]] @@ -9654,9 +10499,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" dependencies = [ "password-hash", - "pbkdf2", + "pbkdf2 0.12.2", "salsa20", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -9703,6 +10548,19 @@ dependencies = [ "zeroize", ] +[[package]] +name = "sec1" +version = "0.8.0-rc.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dff52f6118bc9f0ac974a54a639d499ac26a6cad7a6e39bc0990c19625e793b" +dependencies = [ + "base16ct 0.3.0", + "der 0.8.0-rc.9", + "hybrid-array", + "subtle", + "zeroize", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -9751,9 +10609,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" dependencies = [ "serde", "serde_core", @@ -9823,7 +10681,7 @@ version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "itoa", "memchr", "serde", @@ -9844,9 +10702,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876ac351060d4f882bb1032b6369eb0aef79ad9df1ea8bc404874d8cc3d0cd98" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] @@ -9885,6 +10743,16 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "serdect" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9af4a3e75ebd5599b30d4de5768e00b5095d518a79fefc3ecbaf77e665d1ec06" +dependencies = [ + "base16ct 1.0.0", + "serde", +] + [[package]] name = "sha-1" version = "0.10.1" @@ -9892,8 +10760,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" dependencies = [ "cfg-if 1.0.4", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", ] [[package]] @@ -9903,8 +10771,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if 1.0.4", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha1" +version = "0.11.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e046edf639aa2e7afb285589e5405de2ef7e61d4b0ac1e30256e3eab911af9" +dependencies = [ + "cfg-if 1.0.4", + "cpufeatures 0.2.17", + "digest 0.11.0-rc.3", ] [[package]] @@ -9920,11 +10799,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if 1.0.4", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", "sha2-asm", ] +[[package]] +name = "sha2" +version = "0.11.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1e3878ab0f98e35b2df35fe53201d088299b41a6bb63e3e34dada2ac4abd924" +dependencies = [ + "cfg-if 1.0.4", + "cpufeatures 0.2.17", + "digest 0.11.0-rc.3", +] + [[package]] name = "sha2-asm" version = "0.6.4" @@ -9934,6 +10824,16 @@ dependencies = [ "cc", ] +[[package]] +name = "sha3" +version = "0.11.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2103ca0e6f4e9505eae906de5e5883e06fc3b2232fb5d6914890c7bbcb62f478" +dependencies = [ + "digest 0.11.0-rc.3", + "keccak", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -9988,7 +10888,7 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ - "digest", + "digest 0.10.7", "rand_core 0.6.4", ] @@ -9998,10 +10898,20 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", + "digest 0.10.7", "rand_core 0.6.4", ] +[[package]] +name = "signature" +version = "3.0.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc280a6ff65c79fbd6622f64d7127f32b85563bca8c53cd2e9141d6744a9056d" +dependencies = [ + "digest 0.11.0-rc.3", + "rand_core 0.9.5", +] + [[package]] name = "simdutf8" version = "0.1.5" @@ -10084,6 +10994,146 @@ dependencies = [ "serde", ] +[[package]] +name = "smb" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502b7620c9f63f2aabccfeb6fe454d0ea3e86731ff76f961126d9a249f06edf4" +dependencies = [ + "aead", + "aes 0.9.0-rc.1", + "aes-gcm", + "binrw", + "ccm", + "cmac", + "crypto-common 0.2.0-rc.4", + "futures", + "futures-core", + "futures-util", + "hmac 0.13.0-rc.2", + "kbkdf", + "log", + "lz4_flex 0.11.6", + "maybe-async", + "modular-bitfield", + "pastey", + "rand 0.8.5", + "sha2 0.11.0-rc.2", + "smb-dtyp", + "smb-fscc", + "smb-msg", + "smb-rpc", + "smb-transport", + "sspi", + "thiserror 2.0.18", + "time", + "tokio", + "tokio-stream", + "tokio-util", + "url", +] + +[[package]] +name = "smb-dtyp" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c53a2e0e811782d8ddee78553db367fe301832ed89461de9a2bd9c7596eba6f" +dependencies = [ + "binrw", + "modular-bitfield", + "pastey", + "rand 0.8.5", + "smb-dtyp-derive", + "time", +] + +[[package]] +name = "smb-dtyp-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907882c54c427b7b371121755096094d7961216fe45adb088ed8863a49b3f171" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "smb-fscc" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2b9929267ccfe0338eb060448ff199d1393f37046e1fc37f65344c64887b9da" +dependencies = [ + "binrw", + "modular-bitfield", + "pastey", + "smb-dtyp", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "smb-msg" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "796e31d6e0903fd4bdce3e27451642ee76a36d1cd90375b8543cdf8c8f696f5b" +dependencies = [ + "binrw", + "modular-bitfield", + "pastey", + "smb-dtyp", + "smb-fscc", + "smb-msg-derive", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "smb-msg-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46df670deb62a5b52ba7f1de0f5d08a0fd6123ab6f857ed1b12b80859454e917" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "smb-rpc" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6fc5bf5ff09109617813740d82e4dfa275c84388d4139d583a99681c7a980c5" +dependencies = [ + "binrw", + "maybe-async", + "modular-bitfield", + "pastey", + "smb-dtyp", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "smb-transport" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad8a8257c0cd01b1c86782116ad97e1028295b5421db3463423f26aee1899fe" +dependencies = [ + "binrw", + "futures-core", + "futures-util", + "log", + "maybe-async", + "modular-bitfield", + "pastey", + "smb-dtyp", + "thiserror 2.0.18", + "time", + "tokio", + "tokio-util", +] + [[package]] name = "socket2" version = "0.5.10" @@ -10154,6 +11204,16 @@ dependencies = [ "der 0.7.10", ] +[[package]] +name = "spki" +version = "0.8.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8baeff88f34ed0691978ec34440140e1572b68c7dd4a495fd14a3dc1944daa80" +dependencies = [ + "base64ct", + "der 0.8.0-rc.9", +] + [[package]] name = "sqlx" version = "0.8.6" @@ -10185,15 +11245,15 @@ dependencies = [ "futures-util", "hashbrown 0.15.5", "hashlink", - "indexmap 2.13.0", + "indexmap 2.14.0", "log", "memchr", "once_cell", "percent-encoding", - "rustls 0.23.37", + "rustls 0.23.38", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "smallvec", "thiserror 2.0.18", "tokio", @@ -10231,7 +11291,7 @@ dependencies = [ "quote", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "sqlx-core", "sqlx-mysql", "sqlx-postgres", @@ -10253,7 +11313,7 @@ dependencies = [ "byteorder", "bytes", "crc", - "digest", + "digest 0.10.7", "dotenvy", "either", "futures-channel", @@ -10262,19 +11322,19 @@ dependencies = [ "futures-util", "generic-array 0.14.7", "hex", - "hkdf", - "hmac", + "hkdf 0.12.4", + "hmac 0.12.1", "itoa", "log", - "md-5", + "md-5 0.10.6", "memchr", "once_cell", "percent-encoding", "rand 0.8.5", - "rsa", + "rsa 0.9.10", "serde", - "sha1", - "sha2", + "sha1 0.10.6", + "sha2 0.10.9", "smallvec", "sqlx-core", "stringprep", @@ -10300,18 +11360,18 @@ dependencies = [ "futures-core", "futures-util", "hex", - "hkdf", - "hmac", + "hkdf 0.12.4", + "hmac 0.12.1", "home", "itoa", "log", - "md-5", + "md-5 0.10.6", "memchr", "once_cell", "rand 0.8.5", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "smallvec", "sqlx-core", "stringprep", @@ -10364,6 +11424,68 @@ dependencies = [ "serde", ] +[[package]] +name = "sspi" +version = "0.18.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2f4823ee743a4a0cc2153eb640e28ff95b55ca25c88085b559bae59fb6c317a" +dependencies = [ + "async-dnssd", + "async-recursion 1.1.1", + "bitflags 2.11.0", + "block-buffer 0.11.0-rc.5", + "byteorder", + "cfg-if 1.0.4", + "crypto-bigint 0.7.0-rc.8", + "crypto-common 0.2.0-rc.4", + "crypto-mac", + "crypto-primes", + "curve25519-dalek 5.0.0-pre.1", + "der 0.8.0-rc.9", + "digest 0.11.0-rc.3", + "ed25519-dalek 3.0.0-pre.1", + "ff 0.14.0-pre.0", + "futures", + "getrandom 0.3.4", + "group 0.14.0-pre.0", + "hmac 0.13.0-rc.2", + "md-5 0.11.0-rc.2", + "md4", + "num-derive", + "num-traits", + "oid", + "p256 0.14.0-pre.11", + "p384 0.14.0-pre.11", + "p521", + "pem-rfc7468 1.0.0-rc.3", + "picky", + "picky-asn1", + "picky-asn1-der", + "picky-asn1-x509", + "picky-krb", + "pkcs1 0.8.0-rc.4", + "pkcs8 0.11.0-rc.7", + "primefield", + "primeorder 0.14.0-pre.9", + "rand 0.9.4", + "reqwest 0.12.28", + "rsa 0.10.0-rc.9", + "rustls 0.23.38", + "serde", + "sha1 0.11.0-rc.2", + "sha2 0.11.0-rc.2", + "signature 3.0.0-rc.4", + "spki 0.8.0-rc.4", + "time", + "tokio", + "tracing", + "url", + "uuid", + "windows 0.62.2", + "windows-registry", + "zeroize", +] + [[package]] name = "ssri" version = "9.2.0" @@ -10371,12 +11493,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da7a2b3c2bc9693bcb40870c4e9b5bf0d79f9cb46273321bf855ec513e919082" dependencies = [ "base64 0.21.7", - "digest", + "digest 0.10.7", "hex", "miette", "serde", "sha-1", - "sha2", + "sha2 0.10.9", "thiserror 1.0.69", "xxhash-rust", ] @@ -10514,16 +11636,16 @@ dependencies = [ "lazy-regex", "log", "pin-project", - "rustls 0.23.37", + "rustls 0.23.38", "rustls-pki-types", "thiserror 2.0.18", ] [[package]] name = "surrealdb" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b19f5232640cfe8b1423b49582f36bc4c867dac9e85ad87f9a81b5fd1633621f" +checksum = "504a96b55e86ef8653a03b6b97e771f49c954e26bcc0308160b0134d94f334fd" dependencies = [ "anyhow", "async-channel 2.5.0", @@ -10531,12 +11653,12 @@ dependencies = [ "chrono", "futures", "getrandom 0.3.4", - "indexmap 2.13.0", + "indexmap 2.14.0", "js-sys", "path-clean", - "reqwest", + "reqwest 0.13.2", "ring", - "rustls 0.23.37", + "rustls 0.23.38", "rustls-pki-types", "semver", "serde", @@ -10559,9 +11681,9 @@ dependencies = [ [[package]] name = "surrealdb-core" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "089a8dc4b88097a84ca3663ad0c152ae53d2e23ffc8b636dac7f65aa86ba3766" +checksum = "d3e6a7f248c958fd5000c4fab5759503663bf93c622be10a6d7bf7d2d676b8fc" dependencies = [ "addr", "ahash 0.8.12", @@ -10594,7 +11716,7 @@ dependencies = [ "ipnet", "jsonwebtoken", "lexicmp", - "md-5", + "md-5 0.10.6", "mime", "ndarray", "ndarray-stats", @@ -10603,7 +11725,7 @@ dependencies = [ "object_store", "parking_lot 0.12.5", "path-clean", - "pbkdf2", + "pbkdf2 0.12.2", "phf 0.13.1", "pin-project-lite", "quick_cache", @@ -10621,8 +11743,8 @@ dependencies = [ "semver", "serde", "serde_json", - "sha1", - "sha2", + "sha1 0.10.6", + "sha2 0.10.9", "storekey", "strsim 0.11.1", "subtle", @@ -10669,9 +11791,9 @@ dependencies = [ [[package]] name = "surrealdb-types" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69a8277f923a20960c82cd7d133524fb2c5d0a73d5f52abd74f28d8d83a8b6fa" +checksum = "c79e71d035367b933cf528c09b7ed186bc17dea58c66a1bca84d22f9abf167db" dependencies = [ "anyhow", "bytes", @@ -10695,9 +11817,9 @@ dependencies = [ [[package]] name = "surrealdb-types-derive" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "491b1457e76011c800818421d814472e0a9a4d3c690ae1edb44381678e97a554" +checksum = "a76abdbfc597e062daae5269251e18a84553f9090cfff423591f57c8c6765aa8" dependencies = [ "proc-macro2", "quote", @@ -10706,15 +11828,15 @@ dependencies = [ [[package]] name = "sval" -version = "2.17.0" +version = "2.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1aaf178a50bbdd86043fce9bf0a5867007d9b382db89d1c96ccae4601ff1ff9" +checksum = "2eb9318255ebd817902d7e279d8f8e39b35b1b9954decd5eb9ea0e30e5fd2b6a" [[package]] name = "sval_buffer" -version = "2.17.0" +version = "2.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89273e48f03807ebf51c4d81c52f28d35ffa18a593edf97e041b52de143df89" +checksum = "12571299185e653fdb0fbfe36cd7f6529d39d4e747a60b15a3f34574b7b97c61" dependencies = [ "sval", "sval_ref", @@ -10722,18 +11844,18 @@ dependencies = [ [[package]] name = "sval_dynamic" -version = "2.17.0" +version = "2.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0430f4e18e7eba21a49d10d25a8dec3ce0e044af40b162347e99a8e3c3ced864" +checksum = "39526f24e997706c0de7f03fb7371f7f5638b66a504ded508e20ad173d0a3677" dependencies = [ "sval", ] [[package]] name = "sval_fmt" -version = "2.17.0" +version = "2.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835f51b9d7331b9d7fc48fc716c02306fa88c4a076b1573531910c91a525882d" +checksum = "933dd3bb26965d682280fcc49400ac2a05036f4ee1e6dbd61bf8402d5a5c3a54" dependencies = [ "itoa", "ryu", @@ -10742,9 +11864,9 @@ dependencies = [ [[package]] name = "sval_json" -version = "2.17.0" +version = "2.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13cbfe3ef406ee2366e7e8ab3678426362085fa9eaedf28cb878a967159dced3" +checksum = "a0cda08f6d5c9948024a6551077557b1fdcc3880ff2f20ae839667d2ec2d87ed" dependencies = [ "itoa", "ryu", @@ -10753,9 +11875,9 @@ dependencies = [ [[package]] name = "sval_nested" -version = "2.17.0" +version = "2.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b20358af4af787c34321a86618c3cae12eabdd0e9df22cd9dd2c6834214c518" +checksum = "88d49d5e6c1f9fd0e53515819b03a97ca4eb1bff5c8ee097c43391c09ecfb19f" dependencies = [ "sval", "sval_buffer", @@ -10764,18 +11886,18 @@ dependencies = [ [[package]] name = "sval_ref" -version = "2.17.0" +version = "2.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5e500f8eb2efa84f75e7090f7fc43f621b9f8b6cde571c635b3855f97b332a" +checksum = "14f876c5a78405375b4e19cbb9554407513b59c93dea12dc6a4af4e1d30899ca" dependencies = [ "sval", ] [[package]] name = "sval_serde" -version = "2.17.0" +version = "2.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2032ae39b11dcc6c18d5fbc50a661ea191cac96484c59ccf49b002261ca2c1" +checksum = "5f9ccd3b7f7200239a655e517dd3fd48d960b9111ad24bd6a5e055bef17607c7" dependencies = [ "serde_core", "sval", @@ -10899,9 +12021,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "task-local" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2c821daee0efdf6414970c8185a1c22e259a7ed87b2fd9f7d3c5f5503fd2863" +checksum = "2972044a9e5e448a506a7ff6f0d03b566d8ef4cd6918a58fc59835a0f8666626" dependencies = [ "pin-project-lite", ] @@ -10942,9 +12064,9 @@ dependencies = [ [[package]] name = "thin-vec" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" +checksum = "da322882471314edc77fa5232c587bcb87c9df52bfd0d7d4826f8868ead61899" [[package]] name = "thiserror" @@ -11049,6 +12171,7 @@ checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", + "js-sys", "num-conv", "powerfmt", "serde_core", @@ -11083,9 +12206,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -11118,13 +12241,13 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.50.0" +version = "1.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" dependencies = [ "bytes", "libc", - "mio 1.1.1", + "mio 1.2.0", "parking_lot 0.12.5", "pin-project-lite", "signal-hook-registry", @@ -11155,9 +12278,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -11201,7 +12324,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.37", + "rustls 0.23.38", "tokio", ] @@ -11224,7 +12347,7 @@ checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" dependencies = [ "futures-util", "log", - "rustls 0.23.37", + "rustls 0.23.38", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", @@ -11271,7 +12394,7 @@ version = "0.9.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "serde_core", "serde_spanned", "toml_datetime 0.7.5+spec-1.1.0", @@ -11291,39 +12414,39 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.1.0+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.25.8+spec-1.1.0" +version = "0.25.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ - "indexmap 2.13.0", - "toml_datetime 1.1.0+spec-1.1.0", + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 1.0.0", + "winnow 1.0.1", ] [[package]] name = "toml_parser" -version = "1.1.0+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.0", + "winnow 1.0.1", ] [[package]] name = "toml_writer" -version = "1.1.0+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d282ade6016312faf3e41e57ebbba0c073e4056dab1232ab1cb624199648f8ed" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" [[package]] name = "tonic" @@ -11369,7 +12492,7 @@ dependencies = [ "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", + "hyper 1.9.0", "hyper-timeout 0.5.2", "hyper-util", "percent-encoding", @@ -11452,7 +12575,7 @@ checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", - "indexmap 2.13.0", + "indexmap 2.14.0", "pin-project-lite", "slab", "sync_wrapper 1.0.2", @@ -11660,10 +12783,10 @@ dependencies = [ "http 1.4.0", "httparse", "log", - "rand 0.9.2", - "rustls 0.23.37", + "rand 0.9.4", + "rustls 0.23.38", "rustls-pki-types", - "sha1", + "sha1 0.10.6", "thiserror 2.0.18", "url", "utf-8", @@ -11675,7 +12798,7 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" dependencies = [ - "rand 0.9.2", + "rand 0.9.4", ] [[package]] @@ -11712,9 +12835,9 @@ checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "typewit" -version = "1.14.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c1ae7cc0fdb8b842d65d127cb981574b0d2b249b74d1c7a2986863dc134f71" +checksum = "bc19094686c694eb41b3b99dcc2f2975d4b078512fa22ae6c63f7ca318bdcff7" [[package]] name = "ulid" @@ -11722,7 +12845,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "470dbf6591da1b39d43c14523b2b469c86879a53e8b758c8e090a470fe7b1fbe" dependencies = [ - "rand 0.9.2", + "rand 0.9.4", "serde", "web-time", ] @@ -11762,9 +12885,9 @@ checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" [[package]] name = "unicode-segmentation" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da36089a805484bcccfffe0739803392c8298778a2d2f09febf76fac5ad9025b" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-width" @@ -11778,6 +12901,16 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "universal-hash" +version = "0.6.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55be643b40a21558f44806b53ee9319595bc7ca6896372e4e08e5d7d83c9cd6" +dependencies = [ + "crypto-common 0.2.0-rc.4", + "subtle", +] + [[package]] name = "unsigned-varint" version = "0.8.0" @@ -11834,9 +12967,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" dependencies = [ "getrandom 0.4.2", "js-sys", @@ -12005,36 +13138,33 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" dependencies = [ "cfg-if 1.0.4", "once_cell", "rustversion", + "serde", "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.64" +version = "0.4.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" dependencies = [ - "cfg-if 1.0.4", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -12042,9 +13172,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" dependencies = [ "bumpalo", "proc-macro2", @@ -12055,18 +13185,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-bindgen-test" -version = "0.3.64" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6311c867385cc7d5602463b31825d454d0837a3aba7cdb5e56d5201792a3f7fe" +checksum = "6bb55e2540ad1c56eec35fd63e2aea15f83b11ce487fd2de9ad11578dfc047ea" dependencies = [ "async-trait", "cast", @@ -12086,9 +13216,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.64" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67008cdde4769831958536b0f11b3bdd0380bde882be17fff9c2f34bb4549abd" +checksum = "caf0ca1bd612b988616bac1ab34c4e4290ef18f7148a1d8b7f31c150080e9295" dependencies = [ "proc-macro2", "quote", @@ -12097,9 +13227,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-shared" -version = "0.2.114" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe29135b180b72b04c74aa97b2b4a2ef275161eff9a6c7955ea9eaedc7e1d4e" +checksum = "23cda5ecc67248c48d3e705d3e03e00af905769b78b9d2a1678b663b8b9d4472" [[package]] name = "wasm-encoder" @@ -12118,7 +13248,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" dependencies = [ "anyhow", - "indexmap 2.13.0", + "indexmap 2.14.0", "wasm-encoder", "wasmparser", ] @@ -12144,7 +13274,7 @@ checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ "bitflags 2.11.0", "hashbrown 0.15.5", - "indexmap 2.13.0", + "indexmap 2.14.0", "semver", ] @@ -12170,9 +13300,9 @@ checksum = "323f4da9523e9a669e1eaf9c6e763892769b1d38c623913647bfdc1532fe4549" [[package]] name = "web-sys" -version = "0.3.91" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" dependencies = [ "js-sys", "wasm-bindgen", @@ -12812,9 +13942,9 @@ checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" [[package]] name = "winnow" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" dependencies = [ "memchr", ] @@ -12853,7 +13983,7 @@ checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ "anyhow", "heck", - "indexmap 2.13.0", + "indexmap 2.14.0", "prettyplease", "syn 2.0.117", "wasm-metadata", @@ -12884,7 +14014,7 @@ checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", "bitflags 2.11.0", - "indexmap 2.13.0", + "indexmap 2.14.0", "log", "serde", "serde_derive", @@ -12903,7 +14033,7 @@ checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" dependencies = [ "anyhow", "id-arena", - "indexmap 2.13.0", + "indexmap 2.14.0", "log", "semver", "serde", @@ -12915,9 +14045,9 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "wyz" @@ -12928,6 +14058,18 @@ dependencies = [ "tap", ] +[[package]] +name = "x25519-dalek" +version = "3.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a45998121837fd8c92655d2334aa8f3e5ef0645cdfda5b321b13760c548fd55" +dependencies = [ + "curve25519-dalek 5.0.0-pre.1", + "rand_core 0.9.5", + "serde", + "zeroize", +] + [[package]] name = "xattr" version = "1.6.1" @@ -12940,9 +14082,9 @@ dependencies = [ [[package]] name = "xet-client" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b05838f0c85303e331ae54926cf197ddf1498e8d4b97467cbb1ad0d199dd6d6" +checksum = "9164bc896ccd143b33fd08a8a2c8e3d769e5e0b2c853496694937fcce734bc1a" dependencies = [ "anyhow", "async-trait", @@ -12953,12 +14095,12 @@ dependencies = [ "derivative", "futures", "http 1.4.0", - "hyper 1.8.1", + "hyper 1.9.0", "lazy_static", "more-asserts", - "rand 0.9.2", + "rand 0.9.4", "redb 3.1.3", - "reqwest", + "reqwest 0.13.2", "reqwest-middleware", "reqwest-retry", "serde", @@ -12980,9 +14122,9 @@ dependencies = [ [[package]] name = "xet-core-structures" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4c112a2b3a69b2fcccc3f69f93f059e27c9437b57733e3acc71d3af3facf464" +checksum = "76ddd10bc095bdb6539a9ace6bfd9f27c13c8604d2f18d25383169aa948c5c09" dependencies = [ "async-trait", "base64 0.22.1", @@ -12998,9 +14140,9 @@ dependencies = [ "heapify", "itertools 0.14.0", "lazy_static", - "lz4_flex", + "lz4_flex 0.13.0", "more-asserts", - "rand 0.9.2", + "rand 0.9.4", "regex", "safe-transmute", "serde", @@ -13017,9 +14159,9 @@ dependencies = [ [[package]] name = "xet-data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cf1cb808192c1bac9067022f84fd67f97e1e908ac8206caee3fb5c7146581d5" +checksum = "00516b2aeea170fbed408adf519931f52db71b5fc7365bb6c63055caf5af113a" dependencies = [ "anyhow", "async-trait", @@ -13031,10 +14173,10 @@ dependencies = [ "itertools 0.14.0", "lazy_static", "more-asserts", - "rand 0.9.2", + "rand 0.9.4", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "tempfile", "thiserror 2.0.18", "tokio", @@ -13050,9 +14192,9 @@ dependencies = [ [[package]] name = "xet-runtime" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd0b331ef495dfba9ddfb9552cb00cd777712534551af11ecbd15deb9399e6b" +checksum = "6dfc7acf5e0a8eb33bb6115376126b6776b7c82a043c661816ff070a6408832a" dependencies = [ "anyhow", "async-trait", @@ -13071,8 +14213,8 @@ dependencies = [ "more-asserts", "oneshot", "pin-project", - "rand 0.9.2", - "reqwest", + "rand 0.9.4", + "reqwest 0.13.2", "serde", "serde_json", "shellexpand", @@ -13113,9 +14255,9 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -13124,9 +14266,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -13136,18 +14278,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.47" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.47" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -13156,18 +14298,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -13180,12 +14322,26 @@ name = "zeroize" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -13194,9 +14350,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -13205,9 +14361,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", diff --git a/core/Cargo.toml b/core/Cargo.toml index 0b551e7b6893..043cf8198af1 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -177,6 +177,7 @@ services-rocksdb = ["dep:opendal-service-rocksdb"] services-s3 = ["dep:opendal-service-s3"] services-seafile = ["dep:opendal-service-seafile"] services-sftp = ["dep:opendal-service-sftp"] +services-smb = ["dep:opendal-service-smb"] services-sled = ["dep:opendal-service-sled"] services-sqlite = ["dep:opendal-service-sqlite"] services-surrealdb = ["dep:opendal-service-surrealdb"] @@ -285,6 +286,7 @@ opendal-service-rocksdb = { path = "services/rocksdb", version = "0.55.0", optio opendal-service-s3 = { path = "services/s3", version = "0.55.0", optional = true, default-features = false } opendal-service-seafile = { path = "services/seafile", version = "0.55.0", optional = true, default-features = false } opendal-service-sftp = { path = "services/sftp", version = "0.55.0", optional = true, default-features = false } +opendal-service-smb = { path = "services/smb", version = "0.55.0", optional = true, default-features = false } opendal-service-sled = { path = "services/sled", version = "0.55.0", optional = true, default-features = false } opendal-service-sqlite = { path = "services/sqlite", version = "0.55.0", optional = true, default-features = false } opendal-service-surrealdb = { path = "services/surrealdb", version = "0.55.0", optional = true, default-features = false } diff --git a/core/services/smb/Cargo.toml b/core/services/smb/Cargo.toml new file mode 100644 index 000000000000..b346711923b9 --- /dev/null +++ b/core/services/smb/Cargo.toml @@ -0,0 +1,42 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +[package] +description = "Apache OpenDAL SMB service implementation" +name = "opendal-service-smb" + +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } +version = { workspace = true } + +[package.metadata.docs.rs] +all-features = true + +[dependencies] +opendal-core = { path = "../../core", version = "0.55.0", default-features = false } + +bytes = { workspace = true } +fastpool = "1.0.2" +futures = { workspace = true } +log = { workspace = true } +serde = { workspace = true, features = ["derive"] } +smb = "0.11.1" +tokio = { workspace = true } diff --git a/core/services/smb/src/backend.rs b/core/services/smb/src/backend.rs new file mode 100644 index 000000000000..18f9a2f5818c --- /dev/null +++ b/core/services/smb/src/backend.rs @@ -0,0 +1,317 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use std::sync::Arc; + +use log::debug; +use smb::{ + CreateDisposition, CreateOptions, DirAccessMask, FileAccessMask, FileAttributes, + FileCreateArgs, Resource, +}; + +use super::SMB_SCHEME; +use super::config::SmbConfig; +use super::core::SmbCore; +use super::core::close_resource; +use super::deleter::SmbDeleter; +use super::error::is_already_exists; +use super::error::is_not_found; +use super::error::parse_smb_error; +use super::lister::SmbLister; +use super::reader::SmbReader; +use super::writer::SmbWriter; +use opendal_core::raw::*; +use opendal_core::*; + +/// SMB service support. +#[doc = include_str!("docs.md")] +#[derive(Debug, Default)] +pub struct SmbBuilder { + pub(super) config: SmbConfig, +} + +impl SmbBuilder { + /// Set endpoint for this backend. + pub fn endpoint(mut self, endpoint: &str) -> Self { + self.config.endpoint = if endpoint.is_empty() { + None + } else { + Some(endpoint.to_string()) + }; + self + } + + /// Set share name for this backend. + pub fn share(mut self, share: &str) -> Self { + if !share.is_empty() { + self.config.share = share.to_string(); + } + self + } + + /// Set root path for this backend. + pub fn root(mut self, root: &str) -> Self { + self.config.root = if root.is_empty() { + None + } else { + Some(root.to_string()) + }; + self + } + + /// Set user for this backend. + pub fn user(mut self, user: &str) -> Self { + self.config.user = if user.is_empty() { + None + } else { + Some(user.to_string()) + }; + self + } + + /// Set password for this backend. + pub fn password(mut self, password: &str) -> Self { + self.config.password = if password.is_empty() { + None + } else { + Some(password.to_string()) + }; + self + } +} + +impl Builder for SmbBuilder { + type Config = SmbConfig; + + fn build(self) -> Result { + debug!("smb backend build started: {:?}", &self); + + let endpoint = self + .config + .endpoint + .clone() + .ok_or_else(|| Error::new(ErrorKind::ConfigInvalid, "endpoint is empty"))?; + let share = if self.config.share.is_empty() { + return Err(Error::new(ErrorKind::ConfigInvalid, "share is empty")); + } else { + self.config.share.clone() + }; + let root = normalize_root(&self.config.root.clone().unwrap_or_default()); + + let info = AccessorInfo::default(); + info.set_scheme(SMB_SCHEME) + .set_root(&root) + .set_native_capability(Capability { + stat: true, + + read: true, + + write: true, + write_can_multi: true, + write_with_if_not_exists: true, + + create_dir: true, + delete: true, + + list: true, + + shared: true, + + ..Default::default() + }); + + let core = Arc::new(SmbCore::new( + Arc::new(info), + endpoint, + share, + root, + self.config.user.clone(), + self.config.password.clone(), + )); + + debug!("smb backend build finished: {:?}", &self); + Ok(SmbBackend { core }) + } +} + +#[derive(Clone, Debug)] +pub struct SmbBackend { + core: Arc, +} + +impl Access for SmbBackend { + type Reader = SmbReader; + type Writer = SmbWriter; + type Lister = Option; + type Deleter = oio::OneShotDeleter; + + fn info(&self) -> Arc { + self.core.info.clone() + } + + async fn create_dir(&self, path: &str, _: OpCreateDir) -> Result { + let client = self.core.connect().await?; + let path = self.core.build_relative_path(path); + self.core.ensure_dir_exists(&client, &path).await?; + Ok(RpCreateDir::default()) + } + + async fn stat(&self, path: &str, _: OpStat) -> Result { + let client = self.core.connect().await?; + let path = self.core.build_relative_path(path); + let meta = self.core.stat_path(&client, &path).await?; + Ok(RpStat::new(meta)) + } + + async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> { + let client = self.core.connect().await?; + let path = self.core.build_relative_path(path); + let unc = self.core.build_unc_path(&path)?; + let resource = client + .create_file( + &unc, + &FileCreateArgs { + disposition: CreateDisposition::Open, + attributes: FileAttributes::new(), + options: CreateOptions::new().with_non_directory_file(true), + desired_access: FileAccessMask::new() + .with_generic_read(true) + .with_file_read_attributes(true) + .with_synchronize(true), + }, + ) + .await; + + let resource = resource.map_err(parse_smb_error)?; + + let file = match resource { + Resource::File(file) => file, + other => { + close_resource(other).await?; + return Err(Error::new( + ErrorKind::IsADirectory, + "read path is a directory", + )); + } + }; + + Ok((RpRead::new(), SmbReader::new(client, file, args.range()))) + } + + async fn write(&self, path: &str, op: OpWrite) -> Result<(RpWrite, Self::Writer)> { + let client = self.core.connect().await?; + let parent = self.core.build_relative_path(get_parent(path)); + let path = self.core.build_relative_path(path); + self.core.ensure_dir_exists(&client, &parent).await?; + + let unc = self.core.build_unc_path(&path)?; + let disposition = if op.if_not_exists() { + CreateDisposition::Create + } else { + CreateDisposition::OverwriteIf + }; + let resource = client + .create_file( + &unc, + &FileCreateArgs { + disposition, + attributes: FileAttributes::new(), + options: CreateOptions::new().with_non_directory_file(true), + desired_access: FileAccessMask::new() + .with_generic_write(true) + .with_file_read_attributes(true) + .with_synchronize(true), + }, + ) + .await; + + let resource = match resource { + Ok(resource) => resource, + Err(err) if op.if_not_exists() && is_already_exists(&err) => { + return Err( + Error::new(ErrorKind::ConditionNotMatch, "file already exists").set_source(err), + ); + } + Err(err) => return Err(parse_smb_error(err)), + }; + + let file = match resource { + Resource::File(file) => file, + other => { + close_resource(other).await?; + return Err(Error::new( + ErrorKind::IsADirectory, + "write path is a directory", + )); + } + }; + + Ok((RpWrite::new(), SmbWriter::new(file, client))) + } + + async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> { + Ok(( + RpDelete::default(), + oio::OneShotDeleter::new(SmbDeleter::new(self.core.clone())), + )) + } + + async fn list(&self, path: &str, _: OpList) -> Result<(RpList, Self::Lister)> { + let client = self.core.connect().await?; + let rel_path = if path == "/" { + "/".to_string() + } else { + path.to_string() + }; + let abs_path = self.core.build_relative_path(path); + let unc = self.core.build_unc_path(&abs_path)?; + + let resource = match client + .create_file( + &unc, + &FileCreateArgs { + disposition: CreateDisposition::Open, + attributes: FileAttributes::new(), + options: CreateOptions::new().with_directory_file(true), + desired_access: DirAccessMask::new() + .with_list_directory(true) + .with_read_attributes(true) + .with_synchronize(true) + .into(), + }, + ) + .await + { + Ok(resource) => resource, + Err(err) if is_not_found(&err) => return Ok((RpList::default(), None)), + Err(err) => return Err(parse_smb_error(err)), + }; + + let dir = match resource { + Resource::Directory(dir) => dir, + other => { + close_resource(other).await?; + return Ok((RpList::default(), None)); + } + }; + + Ok(( + RpList::default(), + Some(SmbLister::new(self.core.clone(), client, rel_path, abs_path, dir).await?), + )) + } +} diff --git a/core/services/smb/src/config.rs b/core/services/smb/src/config.rs new file mode 100644 index 000000000000..bb56f4095397 --- /dev/null +++ b/core/services/smb/src/config.rs @@ -0,0 +1,143 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use std::fmt::Debug; + +use serde::Deserialize; +use serde::Serialize; + +use super::SMB_SCHEME; +use super::backend::SmbBuilder; + +/// Config for SMB service support. +#[derive(Default, Serialize, Deserialize, Clone, PartialEq, Eq)] +#[serde(default)] +#[non_exhaustive] +pub struct SmbConfig { + /// Endpoint of this backend. + pub endpoint: Option, + /// Share name of this backend. + pub share: String, + /// Root of this backend. + pub root: Option, + /// User of this backend. + pub user: Option, + /// Password of this backend. + pub password: Option, +} + +impl Debug for SmbConfig { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("SmbConfig") + .field("endpoint", &self.endpoint) + .field("share", &self.share) + .field("root", &self.root) + .field("user", &self.user) + .finish_non_exhaustive() + } +} + +impl opendal_core::Configurator for SmbConfig { + type Builder = SmbBuilder; + + fn from_uri(uri: &opendal_core::OperatorUri) -> opendal_core::Result { + let mut map = uri.options().clone(); + + if let Some(authority) = uri.authority() { + map.insert("endpoint".to_string(), authority.to_string()); + } + + if let Some(username) = uri.username() { + map.entry("user".to_string()) + .or_insert_with(|| username.to_string()); + } + + if let Some(password) = uri.password() { + map.entry("password".to_string()) + .or_insert_with(|| password.to_string()); + } + + if let Some(root) = uri.root() { + if let Some((share, rest)) = root.split_once('/') { + if share.is_empty() { + return Err(opendal_core::Error::new( + opendal_core::ErrorKind::ConfigInvalid, + "share is required in uri path", + ) + .with_context("service", SMB_SCHEME)); + } + + map.insert("share".to_string(), share.to_string()); + if !rest.is_empty() { + map.insert("root".to_string(), rest.to_string()); + } + } else if !root.is_empty() { + map.insert("share".to_string(), root.to_string()); + } + } + + if !map.contains_key("share") { + return Err(opendal_core::Error::new( + opendal_core::ErrorKind::ConfigInvalid, + "share is required", + ) + .with_context("service", SMB_SCHEME)); + } + + Self::from_iter(map) + } + + fn into_builder(self) -> Self::Builder { + SmbBuilder { config: self } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use opendal_core::Configurator; + use opendal_core::OperatorUri; + + #[test] + fn from_uri_sets_endpoint_share_root_and_auth() { + let uri = OperatorUri::new( + "smb://alice:secret@smb.example.com:1445/share/documents/reports", + Vec::<(String, String)>::new(), + ) + .unwrap(); + + let cfg = SmbConfig::from_uri(&uri).unwrap(); + assert_eq!(cfg.endpoint.as_deref(), Some("smb.example.com:1445")); + assert_eq!(cfg.share, "share".to_string()); + assert_eq!(cfg.root.as_deref(), Some("documents/reports")); + assert_eq!(cfg.user.as_deref(), Some("alice")); + assert_eq!(cfg.password.as_deref(), Some("secret")); + } + + #[test] + fn from_uri_accepts_share_from_query() { + let uri = OperatorUri::new( + "smb://server", + vec![("share".to_string(), "data".to_string())], + ) + .unwrap(); + + let cfg = SmbConfig::from_uri(&uri).unwrap(); + assert_eq!(cfg.endpoint.as_deref(), Some("server")); + assert_eq!(cfg.share, "data".to_string()); + } +} diff --git a/core/services/smb/src/core.rs b/core/services/smb/src/core.rs new file mode 100644 index 000000000000..21ef19d5ba78 --- /dev/null +++ b/core/services/smb/src/core.rs @@ -0,0 +1,405 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use std::fmt::Debug; +use std::sync::Arc; + +use fastpool::{ManageObject, ObjectStatus, bounded}; +use log::debug; +use smb::{ + Client, ClientConfig, CreateDisposition, CreateOptions, DirAccessMask, FileAccessMask, + FileAttributes, FileCreateArgs, GetLen, Resource, UncPath, +}; + +use super::error::is_already_exists; +use super::error::parse_smb_error; +use opendal_core::raw::*; +use opendal_core::*; + +pub struct SmbCore { + pub info: Arc, + pub endpoint: String, + pub share: String, + pub root: String, + client: Option>>, +} + +impl Debug for SmbCore { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("SmbCore") + .field("endpoint", &self.endpoint) + .field("share", &self.share) + .field("root", &self.root) + .finish_non_exhaustive() + } +} + +impl SmbCore { + pub fn new( + info: Arc, + endpoint: String, + share: String, + root: String, + user: Option, + password: Option, + ) -> Self { + let client = bounded::Pool::new( + bounded::PoolConfig::new(64), + Manager { + endpoint: endpoint.clone(), + share: share.clone(), + root: root.clone(), + user: user.unwrap_or_default(), + password: password.unwrap_or_default(), + }, + ); + + Self { + info, + endpoint, + share, + root, + client: Some(client), + } + } + + pub async fn connect(&self) -> Result> { + let fut = self + .client + .as_ref() + .expect("smb connection pool must exist") + .get(); + + tokio::select! { + _ = tokio::time::sleep(Duration::from_secs(10)) => { + Err(Error::new(ErrorKind::Unexpected, "connection request: timeout").set_temporary()) + } + result = fut => match result { + Ok(client) => Ok(client), + Err(err) => Err(err), + } + } + } + + pub fn build_relative_path(&self, path: &str) -> String { + build_relative_path(&self.root, path) + } + + pub fn build_unc_path(&self, path: &str) -> Result { + let path = build_smb_path(path); + let mut unc = UncPath::new(&self.endpoint) + .map_err(parse_smb_error)? + .with_share(&self.share) + .map_err(parse_smb_error)?; + + if !path.is_empty() { + unc = unc.with_path(&path); + } + + Ok(unc) + } + + pub async fn ensure_dir_exists(&self, client: &Client, path: &str) -> Result<()> { + if path.is_empty() { + return Ok(()); + } + + let mut current = String::new(); + for component in path.split('/').filter(|v| !v.is_empty()) { + if !current.is_empty() { + current.push('/'); + } + current.push_str(component); + + let unc = self.build_unc_path(¤t)?; + let result = client + .create_file( + &unc, + &FileCreateArgs::make_create_new( + FileAttributes::new().with_directory(true), + CreateOptions::new().with_directory_file(true), + ), + ) + .await; + + match result { + Ok(resource) => close_resource(resource).await?, + Err(err) if is_already_exists(&err) => {} + Err(err) => return Err(parse_smb_error(err)), + } + } + + Ok(()) + } + + pub async fn stat_path(&self, client: &Client, path: &str) -> Result { + let unc = self.build_unc_path(path)?; + let args = FileCreateArgs { + disposition: CreateDisposition::Open, + attributes: FileAttributes::new(), + options: CreateOptions::new(), + desired_access: FileAccessMask::new() + .with_file_read_attributes(true) + .with_synchronize(true), + }; + + let resource = client + .create_file(&unc, &args) + .await + .map_err(parse_smb_error)?; + + match resource { + Resource::File(file) => { + let mut meta = Metadata::new(EntryMode::FILE); + let len = match file.get_len().await { + Ok(len) => len, + Err(err) => { + return Err(close_resource_after_error( + Resource::File(file), + parse_smb_error(err), + ) + .await); + } + }; + meta.set_content_length(len); + set_last_modified(&mut meta, file.modified().assume_utc().unix_timestamp()); + file.close().await.map_err(parse_smb_error)?; + Ok(meta) + } + Resource::Directory(dir) => { + let mut meta = Metadata::new(EntryMode::DIR); + set_last_modified(&mut meta, dir.modified().assume_utc().unix_timestamp()); + dir.close().await.map_err(parse_smb_error)?; + Ok(meta) + } + other => { + close_resource(other).await?; + Ok(Metadata::new(EntryMode::Unknown)) + } + } + } + + pub async fn delete_path(&self, client: &Client, path: &str, is_dir: bool) -> Result<()> { + let unc = self.build_unc_path(path)?; + let resource = match client + .create_file( + &unc, + &FileCreateArgs::make_open_existing( + FileAccessMask::new() + .with_delete(true) + .with_synchronize(true), + ), + ) + .await + { + Ok(resource) => resource, + Err(err) if super::error::is_not_found(&err) => return Ok(()), + Err(err) => return Err(parse_smb_error(err)), + }; + + match resource { + Resource::File(file) if !is_dir => { + if let Err(err) = file + .set_info(smb::FileDispositionInformation::default()) + .await + { + return Err(close_resource_after_error( + Resource::File(file), + parse_smb_error(err), + ) + .await); + } + match file.close().await { + Ok(_) => {} + Err(err) if super::error::is_not_found(&err) => {} + Err(err) => return Err(parse_smb_error(err)), + } + } + Resource::Directory(dir) if is_dir => { + if let Err(err) = dir + .set_info(smb::FileDispositionInformation::default()) + .await + { + return Err(close_resource_after_error( + Resource::Directory(dir), + parse_smb_error(err), + ) + .await); + } + match dir.close().await { + Ok(_) => {} + Err(err) if super::error::is_not_found(&err) => {} + Err(err) => return Err(parse_smb_error(err)), + } + } + Resource::File(file) => { + file.close().await.map_err(parse_smb_error)?; + return Err(Error::new( + ErrorKind::NotADirectory, + "delete path expected a directory but found a file", + )); + } + Resource::Directory(dir) => { + dir.close().await.map_err(parse_smb_error)?; + return Err(Error::new( + ErrorKind::IsADirectory, + "delete path expected a file but found a directory", + )); + } + other => { + close_resource(other).await?; + } + } + + Ok(()) + } +} + +impl Drop for SmbCore { + fn drop(&mut self) { + let Some(client) = self.client.take() else { + return; + }; + + if tokio::runtime::Handle::try_current().is_ok() { + drop(client); + } else { + std::mem::forget(client); + } + } +} + +pub struct Manager { + endpoint: String, + share: String, + root: String, + user: String, + password: String, +} + +impl ManageObject for Manager { + type Object = Client; + type Error = Error; + + async fn create(&self) -> Result { + let client = Client::new(ClientConfig::default()); + let mut unc = UncPath::new(&self.endpoint).map_err(parse_smb_error)?; + unc = unc.with_share(&self.share).map_err(parse_smb_error)?; + + client + .share_connect(&unc, &self.user, self.password.clone()) + .await + .map_err(parse_smb_error)?; + + let root = build_relative_path(&self.root, "/"); + if !root.is_empty() { + let core = SmbCore::new( + Arc::new(AccessorInfo::default()), + self.endpoint.clone(), + self.share.clone(), + String::new(), + Some(self.user.clone()), + Some(self.password.clone()), + ); + core.ensure_dir_exists(&client, &root).await?; + } + + Ok(client) + } + + async fn is_recyclable( + &self, + client: &mut Self::Object, + _: &ObjectStatus, + ) -> Result<(), Self::Error> { + let unc = UncPath::new(&self.endpoint) + .map_err(parse_smb_error)? + .with_share(&self.share) + .map_err(parse_smb_error)?; + + let resource = client + .create_file( + &unc, + &FileCreateArgs { + disposition: CreateDisposition::Open, + attributes: FileAttributes::new(), + options: CreateOptions::new().with_directory_file(true), + desired_access: DirAccessMask::new() + .with_list_directory(true) + .with_read_attributes(true) + .with_synchronize(true) + .into(), + }, + ) + .await + .map_err(parse_smb_error)?; + + close_resource(resource).await + } +} + +fn build_relative_path(root: &str, path: &str) -> String { + build_abs_path(root, path) +} + +fn build_smb_path(path: &str) -> String { + path.trim_matches('/').replace('/', "\\") +} + +pub(super) async fn close_resource(resource: Resource) -> Result<()> { + match resource { + Resource::File(file) => file.close().await.map_err(parse_smb_error), + Resource::Directory(dir) => dir.close().await.map_err(parse_smb_error), + Resource::Pipe(pipe) => pipe.close().await.map_err(parse_smb_error), + } +} + +async fn close_resource_after_error(resource: Resource, err: Error) -> Error { + if let Err(close_err) = close_resource(resource).await { + debug!("failed to close smb resource after error: {close_err:?}"); + } + + err +} + +fn set_last_modified(meta: &mut Metadata, modified: i64) { + if let Ok(ts) = Timestamp::from_second(modified) { + meta.set_last_modified(ts); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn build_relative_path_keeps_opendal_style_paths() { + assert_eq!(build_relative_path("/", "/"), ""); + assert_eq!(build_relative_path("/nested/", "/"), "nested/"); + assert_eq!( + build_relative_path("/nested/", "dir/file"), + "nested/dir/file" + ); + } + + #[test] + fn build_smb_path_converts_only_at_the_edge() { + assert_eq!(build_smb_path(""), ""); + assert_eq!(build_smb_path("nested/dir/file"), r"nested\dir\file"); + assert_eq!(build_smb_path("nested/dir/"), r"nested\dir"); + } +} diff --git a/core/services/smb/src/deleter.rs b/core/services/smb/src/deleter.rs new file mode 100644 index 000000000000..fc4d23e91d5c --- /dev/null +++ b/core/services/smb/src/deleter.rs @@ -0,0 +1,41 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use std::sync::Arc; + +use super::core::SmbCore; +use opendal_core::raw::*; +use opendal_core::*; + +pub struct SmbDeleter { + core: Arc, +} + +impl SmbDeleter { + pub fn new(core: Arc) -> Self { + Self { core } + } +} + +impl oio::OneShotDelete for SmbDeleter { + async fn delete_once(&self, path: String, _: OpDelete) -> Result<()> { + let client = self.core.connect().await?; + let is_dir = path.ends_with('/'); + let path = self.core.build_relative_path(&path); + self.core.delete_path(&client, &path, is_dir).await + } +} diff --git a/core/services/smb/src/docs.md b/core/services/smb/src/docs.md new file mode 100644 index 000000000000..dd37db02c774 --- /dev/null +++ b/core/services/smb/src/docs.md @@ -0,0 +1,45 @@ +## Capabilities + +This service can be used to: + +- [x] create_dir +- [x] stat +- [x] read +- [x] write +- [x] delete +- [x] list +- [ ] copy +- [ ] rename +- [ ] ~~presign~~ + +## Configuration + +- `endpoint`: Set the SMB server endpoint, for example `127.0.0.1` or `127.0.0.1:445` +- `share`: Set the share name +- `root`: Set the work directory inside the share +- `user`: Set the login user +- `password`: Set the login password + +You can refer to [`SmbBuilder`]'s docs for more information. + +## Example + +### Via Builder + +```rust,no_run +use opendal_core::Operator; +use opendal_core::Result; +use opendal_service_smb::Smb; + +#[tokio::main] +async fn main() -> Result<()> { + let mut builder = Smb::default() + .endpoint("127.0.0.1") + .share("public") + .user("alice") + .password("secret"); + + let op: Operator = Operator::new(builder)?.finish(); + Ok(()) +} +``` diff --git a/core/services/smb/src/error.rs b/core/services/smb/src/error.rs new file mode 100644 index 000000000000..0de5a682cb5c --- /dev/null +++ b/core/services/smb/src/error.rs @@ -0,0 +1,83 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use smb::Error as SmbError; +use smb::error::TimedOutTask; +use smb::transport::TransportError; + +use opendal_core::Error; +use opendal_core::ErrorKind; + +const STATUS_ACCESS_DENIED: u32 = 0xC000_0022; +const STATUS_DELETE_PENDING: u32 = 0xC000_0056; +const STATUS_FILE_IS_A_DIRECTORY: u32 = 0xC000_00BA; +const STATUS_NOT_A_DIRECTORY: u32 = 0xC000_0103; +const STATUS_OBJECT_NAME_COLLISION: u32 = 0xC000_0035; +const STATUS_OBJECT_NAME_NOT_FOUND: u32 = 0xC000_0034; +const STATUS_OBJECT_PATH_NOT_FOUND: u32 = 0xC000_003A; + +pub fn parse_smb_error(err: SmbError) -> Error { + let kind = match &err { + SmbError::NotFound(_) => ErrorKind::NotFound, + SmbError::MissingPermissions(_) => ErrorKind::PermissionDenied, + SmbError::UnsupportedOperation(_) => ErrorKind::Unsupported, + SmbError::InvalidConfiguration(_) => ErrorKind::ConfigInvalid, + SmbError::InvalidArgument(_) => ErrorKind::Unexpected, + SmbError::UnexpectedMessageStatus(status) | SmbError::ReceivedErrorMessage(status, _) => { + match *status { + STATUS_ACCESS_DENIED => ErrorKind::PermissionDenied, + STATUS_DELETE_PENDING => ErrorKind::NotFound, + STATUS_FILE_IS_A_DIRECTORY => ErrorKind::IsADirectory, + STATUS_NOT_A_DIRECTORY => ErrorKind::NotADirectory, + STATUS_OBJECT_NAME_COLLISION => ErrorKind::AlreadyExists, + STATUS_OBJECT_NAME_NOT_FOUND | STATUS_OBJECT_PATH_NOT_FOUND => ErrorKind::NotFound, + _ => ErrorKind::Unexpected, + } + } + SmbError::OperationTimeout(TimedOutTask::ReceiveNextMessage, _) + | SmbError::TransportError(TransportError::Timeout(_)) => ErrorKind::Unexpected, + _ => ErrorKind::Unexpected, + }; + + let mut e = Error::new(kind, "smb error").set_source(err); + if kind == ErrorKind::Unexpected { + e = e.set_temporary(); + } + e +} + +pub(super) fn is_already_exists(err: &SmbError) -> bool { + matches!( + err, + SmbError::UnexpectedMessageStatus(STATUS_OBJECT_NAME_COLLISION) + | SmbError::ReceivedErrorMessage(STATUS_OBJECT_NAME_COLLISION, _) + ) +} + +pub(super) fn is_not_found(err: &SmbError) -> bool { + matches!( + err, + SmbError::NotFound(_) + | SmbError::UnexpectedMessageStatus( + STATUS_DELETE_PENDING | STATUS_OBJECT_NAME_NOT_FOUND | STATUS_OBJECT_PATH_NOT_FOUND + ) + | SmbError::ReceivedErrorMessage( + STATUS_DELETE_PENDING | STATUS_OBJECT_NAME_NOT_FOUND | STATUS_OBJECT_PATH_NOT_FOUND, + _ + ) + ) +} diff --git a/core/services/smb/src/lib.rs b/core/services/smb/src/lib.rs new file mode 100644 index 000000000000..81a092534df5 --- /dev/null +++ b/core/services/smb/src/lib.rs @@ -0,0 +1,41 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +//! SMB service implementation for Apache OpenDAL. + +#![cfg_attr(docsrs, feature(doc_cfg))] +#![deny(missing_docs)] + +mod backend; +mod config; +mod core; +mod deleter; +mod error; +mod lister; +mod reader; +mod writer; + +pub use backend::SmbBuilder as Smb; +pub use config::SmbConfig; + +/// Default scheme for smb service. +pub const SMB_SCHEME: &str = "smb"; + +/// Register this service into the given registry. +pub fn register_smb_service(registry: &opendal_core::OperatorRegistry) { + registry.register::(SMB_SCHEME); +} diff --git a/core/services/smb/src/lister.rs b/core/services/smb/src/lister.rs new file mode 100644 index 000000000000..71e1858d4e68 --- /dev/null +++ b/core/services/smb/src/lister.rs @@ -0,0 +1,136 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use std::collections::VecDeque; +use std::sync::Arc; + +use futures::TryStreamExt; +use log::debug; +use smb::{Directory, FileFullDirectoryInformation}; + +use super::core::SmbCore; +use opendal_core::EntryMode; +use opendal_core::Error; +use opendal_core::Metadata; +use opendal_core::Result; +use opendal_core::raw::oio; +use opendal_core::raw::oio::Entry; + +pub struct SmbLister { + entries: VecDeque, +} + +async fn close_dir_after_error(dir: &Directory, err: Error) -> Error { + if let Err(close_err) = dir.close().await.map_err(super::error::parse_smb_error) { + debug!("failed to close smb directory after error: {close_err:?}"); + } + + err +} + +impl SmbLister { + pub async fn new( + core: Arc, + client: fastpool::bounded::Object, + path: String, + abs_path: String, + dir: Directory, + ) -> Result { + let mut entries = VecDeque::new(); + let list_path = if path == "/" { + "/".to_string() + } else { + format!("{}/", path.trim_end_matches('/')) + }; + entries.push_back(Entry::new( + list_path.as_str(), + Metadata::new(EntryMode::DIR), + )); + + let dir = Arc::new(dir); + let mut stream = match Directory::query::(&dir, "*").await { + Ok(stream) => stream, + Err(err) => { + return Err(close_dir_after_error( + dir.as_ref(), + super::error::parse_smb_error(err), + ) + .await); + } + }; + + loop { + let entry = match stream.try_next().await { + Ok(Some(entry)) => entry, + Ok(None) => break, + Err(err) => { + drop(stream); + return Err(close_dir_after_error( + dir.as_ref(), + super::error::parse_smb_error(err), + ) + .await); + } + }; + + let name = entry.file_name.to_string(); + if name == "." || name == ".." { + continue; + } + + let child_path = if path == "/" { + name.clone() + } else { + format!("{}{}", list_path, name) + }; + let child_abs_path = if abs_path.is_empty() { + child_path.clone() + } else if abs_path.ends_with('/') { + format!("{abs_path}{name}") + } else { + format!("{abs_path}/{name}") + }; + + let meta = match core.stat_path(&client, &child_abs_path).await { + Ok(meta) => meta, + Err(err) if err.kind() == opendal_core::ErrorKind::NotFound => continue, + Err(err) => { + drop(stream); + return Err(close_dir_after_error(dir.as_ref(), err).await); + } + }; + let entry_path = if meta.mode().is_dir() { + format!("{}/", child_path.trim_end_matches('/')) + } else { + child_path + }; + entries.push_back(Entry::new(entry_path.as_str(), meta)); + } + + drop(stream); + dir.close().await.map_err(super::error::parse_smb_error)?; + drop(client); + + Ok(Self { entries }) + } +} + +impl oio::List for SmbLister { + async fn next(&mut self) -> Result> { + Ok(self.entries.pop_front()) + } +} diff --git a/core/services/smb/src/reader.rs b/core/services/smb/src/reader.rs new file mode 100644 index 000000000000..2be3af72e86e --- /dev/null +++ b/core/services/smb/src/reader.rs @@ -0,0 +1,94 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use bytes::BytesMut; +use fastpool::bounded; +use smb::{File, ReadAt}; + +use super::core::Manager; +use opendal_core::raw::*; +use opendal_core::*; + +pub struct SmbReader { + _client: bounded::Object, + file: Option, + chunk: usize, + offset: u64, + remaining: Option, + buf: BytesMut, +} + +impl SmbReader { + pub fn new(client: bounded::Object, file: File, range: BytesRange) -> Self { + Self { + _client: client, + file: Some(file), + chunk: 64 * 1024, + offset: range.offset(), + remaining: range.size(), + buf: BytesMut::new(), + } + } + + async fn close_file(&mut self) -> Result<()> { + if let Some(file) = self.file.take() { + file.close().await.map_err(super::error::parse_smb_error)?; + } + Ok(()) + } +} + +impl oio::Read for SmbReader { + async fn read(&mut self) -> Result { + if self.remaining == Some(0) { + self.close_file().await?; + return Ok(Buffer::new()); + } + + let size = self + .remaining + .map(|size| size.min(self.chunk as u64) as usize) + .unwrap_or(self.chunk); + self.buf.resize(size, 0); + + let file = self + .file + .as_ref() + .ok_or_else(|| Error::new(ErrorKind::Unexpected, "smb reader is already closed"))?; + let read = match file.read_at(&mut self.buf[..], self.offset).await { + Ok(read) => read, + Err(err) => { + let _ = self.close_file().await; + return Err(super::error::parse_smb_error(err)); + } + }; + if read == 0 { + self.close_file().await?; + return Ok(Buffer::new()); + } + + self.offset += read as u64; + if let Some(remaining) = &mut self.remaining { + *remaining = remaining.saturating_sub(read as u64); + if *remaining == 0 { + self.close_file().await?; + } + } + + Ok(Buffer::from(self.buf.split_to(read).freeze())) + } +} diff --git a/core/services/smb/src/writer.rs b/core/services/smb/src/writer.rs new file mode 100644 index 000000000000..bb13d7f0fe6b --- /dev/null +++ b/core/services/smb/src/writer.rs @@ -0,0 +1,101 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use bytes::Buf; +use fastpool::bounded; +use smb::{File, WriteAt}; + +use super::core::Manager; +use opendal_core::raw::*; +use opendal_core::*; + +pub struct SmbWriter { + _client: bounded::Object, + file: Option, + chunk: usize, + offset: u64, +} + +impl SmbWriter { + pub fn new(file: File, client: bounded::Object) -> Self { + Self { + _client: client, + file: Some(file), + chunk: 64 * 1024, + offset: 0, + } + } + + async fn close_file(&mut self) -> Result<()> { + let Some(file) = self.file.as_ref() else { + return Ok(()); + }; + + file.flush().await.map_err(new_std_io_error)?; + file.close().await.map_err(super::error::parse_smb_error)?; + self.file.take(); + Ok(()) + } + + async fn discard_file(&mut self) -> Result<()> { + let Some(file) = self.file.as_ref() else { + return Ok(()); + }; + + file.close().await.map_err(super::error::parse_smb_error)?; + self.file.take(); + Ok(()) + } +} + +impl oio::Write for SmbWriter { + async fn write(&mut self, mut bs: Buffer) -> Result<()> { + let file = self + .file + .as_ref() + .ok_or_else(|| Error::new(ErrorKind::Unexpected, "smb writer is already closed"))?; + + while bs.has_remaining() { + let chunk_len = bs.chunk().len().min(self.chunk); + let written = self + .file + .as_ref() + .expect("checked above") + .write_at(&bs.chunk()[..chunk_len], self.offset) + .await + .map_err(super::error::parse_smb_error)?; + self.offset += written as u64; + bs.advance(written); + } + + let _ = file; + Ok(()) + } + + async fn close(&mut self) -> Result { + self.close_file().await?; + Ok(Metadata::default()) + } + + async fn abort(&mut self) -> Result<()> { + self.discard_file().await?; + Err(Error::new( + ErrorKind::Unsupported, + "SmbWriter doesn't support abort", + )) + } +} diff --git a/core/src/lib.rs b/core/src/lib.rs index 302fa88dc6d5..c5dae5a94916 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -190,6 +190,9 @@ fn init_default_registry_inner(registry: &OperatorRegistry) { #[cfg(feature = "services-sftp")] opendal_service_sftp::register_sftp_service(registry); + #[cfg(feature = "services-smb")] + opendal_service_smb::register_smb_service(registry); + #[cfg(feature = "services-sled")] opendal_service_sled::register_sled_service(registry); @@ -344,6 +347,8 @@ pub mod services { pub use opendal_service_sftp::*; #[cfg(feature = "services-sled")] pub use opendal_service_sled::*; + #[cfg(feature = "services-smb")] + pub use opendal_service_smb::*; #[cfg(feature = "services-sqlite")] pub use opendal_service_sqlite::*; #[cfg(feature = "services-surrealdb")]