From 07be171b755f160d5751f44b0b02a9f0ca162777 Mon Sep 17 00:00:00 2001 From: Demetrius Kanios Date: Sun, 30 Aug 2026 00:34:01 -0700 Subject: [PATCH] chore(plugins): Update to Wasmtime 48.0.1 (#3155) --- Cargo.lock | 326 ++++++++++-------- Cargo.toml | 10 +- crates/pumpkin-plugin-api/src/permissions.rs | 6 +- .../src/plugin/loader/wasm/wasm_host/mod.rs | 137 +++++--- .../src/plugin/loader/wasm/wasm_host/state.rs | 36 +- crates/pumpkin/src/plugin/permissions.rs | 11 +- 6 files changed, 286 insertions(+), 240 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index be4bd2e19..ee2148665 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -40,13 +40,13 @@ dependencies = [ [[package]] name = "aes" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8eb277bec05f56a0e0591f155a484cbd0f4f07ff2905051a48c72f004f7ed58" +checksum = "35f0f96ce78e38c3dc6d8948aa8163d06385be74000f3c7a95bf1eef35d3ea32" dependencies = [ "cipher 0.5.2", "cpubits", - "cpufeatures 0.3.0", + "cpufeatures 0.3.1", ] [[package]] @@ -606,12 +606,12 @@ dependencies = [ [[package]] name = "chacha20" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", + "cpufeatures 0.3.1", "rand_core 0.10.1", ] @@ -858,36 +858,36 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" dependencies = [ "libc", ] [[package]] name = "cranelift-assembler-x64" -version = "0.134.4" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16c273ba1bfc3a1cb27cb4f83df27134f3cb638a61f5ed79ab22cf86eb13da0d" +checksum = "9903e767cc0a95a59950de099a6b1d61e1476f774be1cdfa06d7ccdc9bfae56f" dependencies = [ "cranelift-assembler-x64-meta", ] [[package]] name = "cranelift-assembler-x64-meta" -version = "0.134.4" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf8909326a466739e83ffe11e74c0c8c6b4bfa911b612aece915daa746cff58" +checksum = "e777252ea3ec9daffa71408fbfe0793ab0a7b7bc3b2cf0f417dd0fa33964b8ef" dependencies = [ "cranelift-srcgen", ] [[package]] name = "cranelift-bforest" -version = "0.134.4" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb26b06b54d8b2f8cdf4d440a32fc3b3b91c71c162333a69a70a66fa265fc45" +checksum = "7828208a36e6627481cea61bd24c6234e31411d5c58b48e80ca094a1d593b944" dependencies = [ "cranelift-entity", "wasmtime-internal-core", @@ -895,9 +895,9 @@ dependencies = [ [[package]] name = "cranelift-bitset" -version = "0.134.4" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ce4e57dbb7f73d08011808a19787c3a03c3e7854b2a479ed0b788915fb671be" +checksum = "a58c8447cc59ef98c49096679f81392ad0acec2224cea2bef52011f5169f9d02" dependencies = [ "serde", "serde_derive", @@ -906,9 +906,9 @@ dependencies = [ [[package]] name = "cranelift-codegen" -version = "0.134.4" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74b0a8968f33d0bc13bc86fe70dd3947e93acc9f358ed9848e9988448972a9be" +checksum = "ce520e899df1de583e7b564eafd66760fbc147d72894d2278ddac57a1489fcc0" dependencies = [ "bumpalo", "cranelift-assembler-x64", @@ -937,9 +937,9 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.134.4" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f69e8e2fe9deb48ef7b8d0c61612f8c1e2277d0421c201e30a4c844a4ebac698" +checksum = "8d8ab23e63d78ea6bbda18ae1ed9c958bc1cb88d90fb5e95f5ba62e9c019474b" dependencies = [ "cranelift-assembler-x64-meta", "cranelift-codegen-shared", @@ -950,24 +950,24 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.134.4" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad4db1e87a65e9c5a832e3ede160830d4e34df938ac38b5604819f8825687e73" +checksum = "24319a996b1ef40ebf8af69b39c868c790b35a42cfe38edacfd8c9deb75ea712" [[package]] name = "cranelift-control" -version = "0.134.4" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9248cd37bb6ec460981f57ead368e32b1eca7a207ad50e3e9c7adc3b161f20e9" +checksum = "cf9856d68cc2cefb83229cb2c55b620dd38427555c2fe87d73f8a4421616f628" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.134.4" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b8bc91c0a3530d132acbf118965dabe9a084029eb0fa74b64760360dec3316" +checksum = "e0ec225d6b79c5d61358cb5ea081a1384ec541dbf8c1a8c618d187875af326ad" dependencies = [ "cranelift-bitset", "serde", @@ -977,9 +977,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.134.4" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5086f2ebc084a98b387e522680f62ef65a512444d8382151e03088716d3a1714" +checksum = "7d3a96a09bd9bd3cf6df2de2ea15d7418f493e946a8eaa1acfe39297a67ed3f3" dependencies = [ "cranelift-codegen", "hashbrown 0.17.1", @@ -990,15 +990,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.134.4" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a658670f779afc2df083be201ebe54805f69b7b9ffa8dab04142b72ed751c9" +checksum = "bd28f593c36afbdc9aa17305c0bb66c39ce0530e1caffcf389fbec053950083e" [[package]] name = "cranelift-native" -version = "0.134.4" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a41083b1fd953debd6f32d21fcda765b258f323ce907fdd6b4715f2769c478" +checksum = "2987ca47affc261aa31ac643fb80dd7f8274cebf878003ba9f50cd6ff2c1055f" dependencies = [ "cranelift-codegen", "libc", @@ -1007,9 +1007,9 @@ dependencies = [ [[package]] name = "cranelift-srcgen" -version = "0.134.4" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244d9cd0759b0a3ccdd587cafb13434f9ea43b5c9d07701d277daf5cd0f7b7c1" +checksum = "b7431dd8c9def94aca43b27915dee0d42103d9b13922cfb044febcd975547d68" [[package]] name = "crc" @@ -1258,7 +1258,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5eed333089e2e1c1ac8c6c0398e5e2497b4c9926ca6d0365ed1e099afa5bc23" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", + "cpufeatures 0.3.1", "curve25519-dalek-derive", "digest 0.11.3", "fiat-crypto 0.3.0", @@ -2042,9 +2042,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" dependencies = [ "atomic-waker", "bytes", @@ -2239,9 +2239,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.14.0" +version = "2.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" dependencies = [ "equivalent", "hashbrown 0.17.1", @@ -2432,9 +2432,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d0a00925a9f930d679b6789b721e3a7f9ed110f41b86d2497caa780c3a070a" +checksum = "d7955dfc218a8afb29dfeffd540e3a6e96baeb94fe7138228dd7cc6937fbbf96" dependencies = [ "libc", ] @@ -2931,11 +2931,11 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.6" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +checksum = "d354a98a3d1251555de99e8fdd8afda05573c31b82f59063a7b0a29b5527f120" dependencies = [ - "base64 0.22.1", + "base64 0.23.1", "serde_core", ] @@ -3271,9 +3271,9 @@ dependencies = [ [[package]] name = "pulley-interpreter" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bd641cb6a3ec5bffe60405568933163e0ea619da0943e9d2a417ceaa7fe82" +checksum = "f755d75e0809a4738a3e4880eeeb852fadbe1de5a437505b84f09c381657012a" dependencies = [ "cranelift-bitset", "log", @@ -3283,9 +3283,9 @@ dependencies = [ [[package]] name = "pulley-macros" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd4024d1e559eaf5579bc8ad84a2b5915f34b47acc13a06ffba7dac401b166" +checksum = "c7e69fa1c4a555946f82e7894a7df88b0e9ee03b4266829b4811467c616ce51d" dependencies = [ "proc-macro2", "quote", @@ -3296,7 +3296,7 @@ dependencies = [ name = "pumpkin" version = "0.1.0-dev+26.2-26.40" dependencies = [ - "aes 0.9.2", + "aes 0.9.3", "arc-swap", "async-trait", "axum", @@ -3352,7 +3352,7 @@ dependencies = [ "tracing-subscriber", "uuid", "wasm-encoder 0.257.1", - "wasmparser 0.257.1", + "wasmparser 0.258.0", "wasmtime", "wasmtime-wasi", "wasmtime-wasi-http", @@ -3500,7 +3500,7 @@ dependencies = [ name = "pumpkin-protocol" version = "0.1.0-dev+26.2-26.40" dependencies = [ - "aes 0.9.2", + "aes 0.9.3", "async-compression", "bitflags 2.13.1", "bytes", @@ -3690,7 +3690,7 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ - "chacha20 0.10.1", + "chacha20 0.10.2", "getrandom 0.4.3", "rand_core 0.10.1", ] @@ -3741,9 +3741,9 @@ dependencies = [ [[package]] name = "rcgen" -version = "0.14.9" +version = "0.14.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091e7a8e7d86e6feb87a27ce8e2cba29d49eff9507afeebefab7eeb2ca667fb4" +checksum = "8774e05a7d0de114588e6a28fe7e71694b82614ed569d86d8b389dfbc98b8ad8" dependencies = [ "pem", "ring", @@ -3951,9 +3951,9 @@ dependencies = [ [[package]] name = "rtc" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e55da8e478486106f04db1ccba177ae3260fb12899982cd5cddf2ac0e1cdcfe9" +checksum = "c9005c36795ad076abd36db3ea9ae0275a60395944647d58c1f2bc3e118dddba" dependencies = [ "bytes", "hex", @@ -3986,9 +3986,9 @@ dependencies = [ [[package]] name = "rtc-datachannel" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bef39b017b5cf0a3511eab456505556b320e0aa04d4547b015ecba9f844fe43" +checksum = "14b61c7b8e9892094cba8a6c7fb8120ae863d32d432b00e560177b3d7ae6d2c6" dependencies = [ "bytes", "log", @@ -3999,9 +3999,9 @@ dependencies = [ [[package]] name = "rtc-dtls" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a1be8a58a72a257c233ad9a2f92130c15994e02f7a1981379fdebbe0d8761a" +checksum = "c737b1dd17a0ff63884a2f466b9588f0cffadfce5a724c0c368764d7c27f9c74" dependencies = [ "aes 0.8.4", "bytecheck", @@ -4032,9 +4032,9 @@ dependencies = [ [[package]] name = "rtc-ice" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "640c7ecb9a09d21c0d4ba27b3ff22adb07cce90d23a7bce7c82bcbe424844e31" +checksum = "2c06eeabd250a7693e1e8b28222b78c4a81a7c6ca7fe3cb99bbdff2f6c0ff0ab" dependencies = [ "bytes", "crc", @@ -4051,9 +4051,9 @@ dependencies = [ [[package]] name = "rtc-interceptor" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9436633af4a6beff6fee08c99464012017fcd1e0a4c0559b1f0d733e8812217a" +checksum = "9ec2776ab86c0c03c3de8ec742aa13ccc3b2c82317590d0624f251bd37eae3b9" dependencies = [ "log", "rand", @@ -4066,9 +4066,9 @@ dependencies = [ [[package]] name = "rtc-interceptor-derive" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3563dafffb11e99264cbfa87c45d806c349c701a96ea3cf3c4778ae3c5da63b4" +checksum = "fc31da3875839bc18e00997354a582e6decacdb23d39f8c004fc4fe2fd3fcd8b" dependencies = [ "proc-macro2", "quote", @@ -4077,9 +4077,9 @@ dependencies = [ [[package]] name = "rtc-mdns" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4db343dbcd1445783ac9f832e350775e4e655b2c890bead7d13dca1219e0ac5" +checksum = "28cd53120b83321c8b8310cce9512c685d2d6356acef34647a99ea420e6f2249" dependencies = [ "bytes", "log", @@ -4090,9 +4090,9 @@ dependencies = [ [[package]] name = "rtc-media" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709a571ed5d88854f3f8c0b92e4a445d77ee54fd33dd45f9297a3d91e3e96d67" +checksum = "e0411e44fcdc1363487ae0c6a4612ec908b9b09175d05499c5de0b3c81f0b5e5" dependencies = [ "byteorder", "bytes", @@ -4104,9 +4104,9 @@ dependencies = [ [[package]] name = "rtc-rtcp" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8817201df4a87008528804073d2dddfefd08eecb44afe6f6d61f7fb1beed72d0" +checksum = "fceaadac17b114140368dd68478d186ccfc293970f79cb8dd28f94dbbc0300be" dependencies = [ "bytes", "rtc-shared", @@ -4114,9 +4114,9 @@ dependencies = [ [[package]] name = "rtc-rtp" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa84012c4a3d855586878e9f891af5062bd5690278b2c54bfcfb0a0ddd9098" +checksum = "babb45ac2263340e2bb412d1921aa07ca441ae9b5589477221d1a50d98750ba3" dependencies = [ "bytes", "memchr", @@ -4127,9 +4127,9 @@ dependencies = [ [[package]] name = "rtc-sctp" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78317cf685b6cde3dbd1cd8e7c9f373e74f00dce00000a25c14c6ddb3378da86" +checksum = "2513391b524b88b041277faba617e0531ad726729861ea8933015393fd68ab05" dependencies = [ "bytes", "crc32c", @@ -4143,9 +4143,9 @@ dependencies = [ [[package]] name = "rtc-sdp" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54ab04410496c8ea47350490298fb135f5432f8fa1aa88edf5dadc81c855a324" +checksum = "42d136a422965289e3d32d8e110789d8fa2ac669a4474a4084fa1eeac32758ee" dependencies = [ "rand", "rtc-shared", @@ -4154,9 +4154,9 @@ dependencies = [ [[package]] name = "rtc-shared" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dae32667b8c9f15223172ce27471e02791e2b401de559b3ea02a6ec93ff280e0" +checksum = "1ce81c72adbce3a2f2ad8e2b97674d2482be83cb3bfd9a153341b04b1a87ca24" dependencies = [ "aes 0.8.4", "aes-gcm", @@ -4176,9 +4176,9 @@ dependencies = [ [[package]] name = "rtc-srtp" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413d48daef797c98c12ff91988abac36d44c81974f0a4b0658549174230819cd" +checksum = "4b880d5f6d436b3215c7bcfd3fb5ffe2a752fea0236440ccd98b6bf1c3561df8" dependencies = [ "aes 0.8.4", "byteorder", @@ -4195,9 +4195,9 @@ dependencies = [ [[package]] name = "rtc-stun" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4b4540b2b8ff7155ef9e95a3b492a7830e974e2fa9ce4b76ec315c4a6b4953d" +checksum = "06b19c36a200df6071b92a25583a19ab0f9c6d5ad036d8c3ff5d392802cc926e" dependencies = [ "base64 0.22.1", "bytes", @@ -4214,9 +4214,9 @@ dependencies = [ [[package]] name = "rtc-turn" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "449365ff0b87488d5f9532409813e76e1f0f5965ef31ce6fcde9aa786c852c6c" +checksum = "ebf0b5fbb94085c86be7277c38ae8f1c21ec75ab47ba975be0984409732020dd" dependencies = [ "bytes", "log", @@ -4524,7 +4524,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", + "cpufeatures 0.3.1", "digest 0.11.3", ] @@ -4546,7 +4546,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", + "cpufeatures 0.3.1", "digest 0.11.3", ] @@ -5384,12 +5384,12 @@ dependencies = [ [[package]] name = "wasm-encoder" -version = "0.252.0" +version = "0.254.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8185ae345fa5687c054626ff9a50e7089797a343d9904d1dc9820eb4c4d3196f" +checksum = "09480d646178e5fdd12bb06e812d0af9a3a191dbc9cd697fdc86687beade7393" dependencies = [ "leb128fmt", - "wasmparser 0.252.0", + "wasmparser 0.254.0", ] [[package]] @@ -5412,6 +5412,18 @@ dependencies = [ "wasmparser 0.258.0", ] +[[package]] +name = "wasm-metadata" +version = "0.254.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b01df5f3b4ca7881e843f3bc0fb8a3905d79c68692250dcb8e33e698705ccdb6" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder 0.254.0", + "wasmparser 0.254.0", +] + [[package]] name = "wasm-metadata" version = "0.258.0" @@ -5426,9 +5438,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.252.0" +version = "0.254.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3eb099dcadcde5be9eef55e3a337128efd4e44b4c93122487e4d2e4e1c6627c" +checksum = "d5769a29f799fbab136aaf65b4fe5384cd7d93fe6fc9ba0dcb6c8382a1f16e27" dependencies = [ "bitflags 2.13.1", "hashbrown 0.17.1", @@ -5462,20 +5474,20 @@ dependencies = [ [[package]] name = "wasmprinter" -version = "0.252.0" +version = "0.254.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7142797de29b35ab8dbf15c00f55fda75d409da4c423a8ab8bd6b667a785824b" +checksum = "64e3ba11e024f504698f87b629b2b66c22a1231758de7607754963f7d198be39" dependencies = [ "anyhow", "termcolor", - "wasmparser 0.252.0", + "wasmparser 0.254.0", ] [[package]] name = "wasmtime" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cdaf5b8af5713146e3a62d940c71e3eb2ad1ebacfa6b55f0c8509a5b4b87718" +checksum = "1bd39f78fe9bc82cee4025ec9d52118269e9a1498016cc60119b14f2e1d86a8d" dependencies = [ "addr2line", "async-trait", @@ -5483,7 +5495,6 @@ dependencies = [ "bumpalo", "bytes", "cc", - "cfg-if", "encoding_rs", "futures", "libc", @@ -5500,7 +5511,7 @@ dependencies = [ "serde_derive", "smallvec", "target-lexicon", - "wasmparser 0.252.0", + "wasmparser 0.254.0", "wasmtime-environ", "wasmtime-internal-cache", "wasmtime-internal-component-macro", @@ -5517,9 +5528,9 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58793271eab7ec26bab99ca497131f8b37702e7dc39e2f2d18293e3e915b4964" +checksum = "00c1070d95484d048994ec109cd42c4932ac07e6ee3cc1886fb90c7a18ec29da" dependencies = [ "anyhow", "cpp_demangle", @@ -5539,8 +5550,8 @@ dependencies = [ "sha2 0.10.9", "smallvec", "target-lexicon", - "wasm-encoder 0.252.0", - "wasmparser 0.252.0", + "wasm-encoder 0.254.0", + "wasmparser 0.254.0", "wasmprinter", "wasmtime-internal-component-util", "wasmtime-internal-core", @@ -5548,9 +5559,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-cache" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede02ba77442cab88a2ddd5d16373e8bc450b55e05de8be039b024987a53d5a7" +checksum = "9d447fd40f3e149cda8c0cd808660a1d1de438f3ff28627abb9bcda90dfb4895" dependencies = [ "base64 0.22.1", "directories-next", @@ -5568,9 +5579,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-component-macro" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5bba4eff4804620bae04d7793308d97a0c5a8a97ea19e635452518f84560f84" +checksum = "f3d2b2f9f89a65bb2277d82fbdd49263d27d8233bc717d750c4b13a23d57721c" dependencies = [ "anyhow", "proc-macro2", @@ -5578,20 +5589,20 @@ dependencies = [ "syn 2.0.119", "wasmtime-internal-component-util", "wasmtime-internal-wit-bindgen", - "wit-parser 0.252.0", + "wit-parser 0.254.0", ] [[package]] name = "wasmtime-internal-component-util" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7032ff6b4d7a45e05be1cb32ec1756df5f2669f08296dbe2c61c3789dead2c" +checksum = "2c0fe8292115fda08875f29064ae9f7f0b2c1ffbb323146eae538ae34b8a613f" [[package]] name = "wasmtime-internal-core" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f41d3b2cb9c3de7b696690af070d408b5e357011832f8b8bb7fbb315dbb620ed" +checksum = "821385794cf44baf2967fd2515368429ed2bff9b9b256f62d09a0f1301474fd8" dependencies = [ "hashbrown 0.17.1", "libm", @@ -5600,11 +5611,10 @@ dependencies = [ [[package]] name = "wasmtime-internal-cranelift" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d5cda5b90247978dd2ba6ca4e309508da19e9244445671d2d0e6a34e5c3b847" +checksum = "0238b4a52773457ad1b8a1a26be90486e0ca0108cf46b9be16cc1d8d8cabdfa1" dependencies = [ - "cfg-if", "cranelift-codegen", "cranelift-control", "cranelift-entity", @@ -5618,7 +5628,7 @@ dependencies = [ "smallvec", "target-lexicon", "thiserror 2.0.20", - "wasmparser 0.252.0", + "wasmparser 0.254.0", "wasmtime-environ", "wasmtime-internal-core", "wasmtime-internal-unwinder", @@ -5627,12 +5637,11 @@ dependencies = [ [[package]] name = "wasmtime-internal-fiber" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d126366176553e8f304e8ac2078a4cc37134fe8f19d4d4695a09c5a2f577f10" +checksum = "596f1d85e06cbf9c9add9c78ea135171c5753264ffe94a83dcc082a1ff49fc9b" dependencies = [ "cc", - "cfg-if", "libc", "rustix", "wasmtime-environ", @@ -5642,9 +5651,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-jit-debug" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1d28ff131bc40e11d84bc3a9fa0d264506439ffbbc89f3562fbb529d1caa617" +checksum = "365faed74827bb0116785bab5872372df1baaec9ec0003c83bc99ccdc595f689" dependencies = [ "cc", "wasmtime-internal-versioned-export-macros", @@ -5652,11 +5661,10 @@ dependencies = [ [[package]] name = "wasmtime-internal-jit-icache-coherence" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a52de8b6afbfcd618073f592c1450cb661574e7061f3f4a44f1f7ec0c7f7909" +checksum = "3cce25afd9e7ac4957292a5c6a219951dd0f140b8417e7378a97f50b67c3b96f" dependencies = [ - "cfg-if", "libc", "wasmtime-internal-core", "windows-sys 0.61.2", @@ -5664,11 +5672,10 @@ dependencies = [ [[package]] name = "wasmtime-internal-unwinder" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5524fbaaf3d2134dd6229164d7fc81e443cce06d1e0576524d5f4e86e747cb13" +checksum = "a1fdea09d51e39c774984ca68a7d7486767e5b2935f5e686fa654aabcfc3c42d" dependencies = [ - "cfg-if", "cranelift-codegen", "log", "object", @@ -5677,9 +5684,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-versioned-export-macros" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93bb9ae112a80618510f938275a5d88637b656e7d0a021fc906f52206c708ad" +checksum = "97e48a5f514c38c2f74249724cb3501e45548d3311ca9e3881694859fd6ba116" dependencies = [ "proc-macro2", "quote", @@ -5688,31 +5695,30 @@ dependencies = [ [[package]] name = "wasmtime-internal-wit-bindgen" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdbdd9d6fab1ecb67a7dc189e32c9e341444945fb709437bf8aab25d9a88459" +checksum = "07429ab53576255be2d298e04b2e1f381e39645465adbaebd69314b5430165c0" dependencies = [ "anyhow", "bitflags 2.13.1", "heck", "indexmap", - "wit-parser 0.252.0", + "wit-component 0.254.0", + "wit-parser 0.254.0", ] [[package]] name = "wasmtime-wasi" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b373095a6dc8382da56882ad16d7ea16771dd6927dd480b1ce3fe7c4b816d2cf" +checksum = "85dd81ee95792682ea5b279c9ed352f6b8a2cba084c2f8abdb225e6933323fed" dependencies = [ "async-trait", "bitflags 2.13.1", "bytes", "cap-fs-ext", - "cap-std", - "cfg-if", + "cap-primitives", "futures", - "io-lifetimes 3.0.1", "rand", "rustix", "thiserror 2.0.20", @@ -5726,9 +5732,9 @@ dependencies = [ [[package]] name = "wasmtime-wasi-http" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372fc7845f26cd8f69bcbf6e4234fcc032f718480c7722fa20a28eb74d58998e" +checksum = "1d75e17f0c94810a34a51dccee9a5e9733eb423dff5176aaeb9152a7a03b2812" dependencies = [ "async-trait", "bytes", @@ -5737,6 +5743,7 @@ dependencies = [ "http-body", "http-body-util", "hyper", + "pin-project-lite", "rustls", "tokio", "tokio-rustls", @@ -5750,9 +5757,9 @@ dependencies = [ [[package]] name = "wasmtime-wasi-io" -version = "47.0.4" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b3c9b39b1a1b3029f80e614623e182f165133dfaca8610f156450343f080a4" +checksum = "6a557bc8a7232cd079f6b423a9bb385f3ff9148824f3c26c07a028b499fab2bf" dependencies = [ "async-trait", "bytes", @@ -5792,9 +5799,9 @@ dependencies = [ [[package]] name = "webrtc" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7330857e1e10fcbfa5f358f152cc01f22a05bb523875c0547677db0f24538dcd" +checksum = "3daa8f2f6366331ae3275a6c02a855c6fb3faa1d16960498d7daaf61c96e76bd" dependencies = [ "async-broadcast", "async-channel", @@ -6167,9 +6174,9 @@ dependencies = [ "indexmap", "prettyplease", "syn 2.0.119", - "wasm-metadata", + "wasm-metadata 0.258.0", "wit-bindgen-core", - "wit-component", + "wit-component 0.258.0", ] [[package]] @@ -6187,6 +6194,25 @@ dependencies = [ "wit-bindgen-rust", ] +[[package]] +name = "wit-component" +version = "0.254.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0e65bb94c369b3c4741ce3d1d2704b1fec93db7c540df0e521a097e7ceeb5be" +dependencies = [ + "anyhow", + "bitflags 2.13.1", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.254.0", + "wasm-metadata 0.254.0", + "wasmparser 0.254.0", + "wit-parser 0.254.0", +] + [[package]] name = "wit-component" version = "0.258.0" @@ -6201,7 +6227,7 @@ dependencies = [ "serde_derive", "serde_json", "wasm-encoder 0.258.0", - "wasm-metadata", + "wasm-metadata 0.258.0", "wasmparser 0.258.0", "wit-parser 0.258.0", ] @@ -6221,9 +6247,9 @@ dependencies = [ [[package]] name = "wit-parser" -version = "0.252.0" +version = "0.254.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4266bea110371c620ccf3201c5023676046bc4556e5c7cfb5d500bda5ebc162d" +checksum = "1655131e4f7d3f0cb141f6eca71315ca40eff0f3d4de7cff0a82bacedd8c89b4" dependencies = [ "anyhow", "hashbrown 0.17.1", @@ -6235,7 +6261,7 @@ dependencies = [ "serde_derive", "serde_json", "unicode-ident", - "wasmparser 0.252.0", + "wasmparser 0.254.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 321d346e5..9162b87b2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -121,6 +121,8 @@ inherits = "release" debug = true strip = false +[profile.dev] +debug = false [workspace.dependencies] tokio = { version = "1.53", default-features = false } @@ -215,9 +217,9 @@ rustc_version_runtime = { version = "0.3", default-features = false } ordered-float = { version = "5.4", default-features = false, features = ["std"] } xxhash-rust = { version = "0.8", default-features = false, features = ["xxh64"] } -wasmtime = { version = "47.0", default-features = false, features = ["runtime", "component-model", "async", "cache", "cranelift", "gc", "gc-drc", "threads", "std"] } -wasmtime-wasi = { version = "47.0", default-features = false, features = ["p2", "p3"] } -wasmtime-wasi-http = { version = "47.0", default-features = false, features = ["p2", "p3", "default-send-request"] } +wasmtime = { version = "48.0", default-features = false, features = ["runtime", "component-model", "async", "cache", "cranelift", "gc", "gc-drc", "threads", "std"] } +wasmtime-wasi = { version = "48.0", default-features = false, features = ["p2", "p3"] } +wasmtime-wasi-http = { version = "48.0", default-features = false, features = ["p2", "p3", "default-send-request"] } # needed for interacting with wasmtime-wasi-http - keep in sync hyper = { version = "^1.11", default-features = false } axum = { version = "0.8.9", default-features = false, features = ["http1", "tokio"] } @@ -227,4 +229,4 @@ wit-bindgen = { version = "0.61", default-features = false, features = ["macros" postcard = { version = "1.1", default-features = false, features = ["alloc"] } tracing-serde-structured = { version = "0.4", default-features = false } -wasmparser = { version = "0.257", default-features = false } +wasmparser = { version = "0.258", default-features = false } diff --git a/crates/pumpkin-plugin-api/src/permissions.rs b/crates/pumpkin-plugin-api/src/permissions.rs index 84c1b82e4..e010b52cc 100644 --- a/crates/pumpkin-plugin-api/src/permissions.rs +++ b/crates/pumpkin-plugin-api/src/permissions.rs @@ -37,11 +37,9 @@ pub const HTTP_OUTBOUND: &str = "http.outbound"; /// Allows the plugin to read files within its own data folder (`plugins/data/`). pub const FS_READ_DATA: &str = "fs.read.data"; -/// Allows the plugin to write files within its own data folder (`plugins/data/`). +/// Allows the plugin to write (and read) files within its own data folder (`plugins/data/`). /// -/// Note that even without `FS_READ_DATA`, this will allow the plugin to -/// inspect (e.g. list) the contents of the directory. But it will block -/// reading any file's contents. +/// Note that this permission also implies `FS_READ_DATA` pub const FS_WRITE_DATA: &str = "fs.write.data"; /// Allows the plugin to read all environment variables. diff --git a/crates/pumpkin/src/plugin/loader/wasm/wasm_host/mod.rs b/crates/pumpkin/src/plugin/loader/wasm/wasm_host/mod.rs index a40571643..98e01e88e 100644 --- a/crates/pumpkin/src/plugin/loader/wasm/wasm_host/mod.rs +++ b/crates/pumpkin/src/plugin/loader/wasm/wasm_host/mod.rs @@ -1,10 +1,10 @@ #![allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)] -use std::{fs, path::Path, sync::Arc}; +use std::{fs, net::SocketAddr, path::Path, sync::Arc}; use thiserror::Error; use tokio::sync::Mutex; use wasmtime::{Cache, CacheConfig, Engine, Store, component::Component, component::Linker}; -use wasmtime_wasi::{DirPerms, FilePerms, WasiCtxBuilder, sockets::SocketAddrUse}; +use wasmtime_wasi::{FsPerms, WasiCtxBuilder, sockets::SocketAddrUse}; use crate::plugin::{ Context, PluginMetadata, cache::calculate_hash_for_bytes, @@ -45,6 +45,69 @@ pub enum PluginInitError { CacheCreationFailed(wasmtime::Error), } +#[derive(Clone, Copy, Default)] +struct SocketPolicy { + tcp_connect: bool, + tcp_bind: bool, + udp_send: bool, + udp_receive: bool, + udp_bind: bool, + loopback_only: bool, +} + +impl SocketPolicy { + const fn allows(self, addr: SocketAddr, reason: SocketAddrUse) -> bool { + // Wasmtime performs a wildcard bind before an outbound connect/send. + // Permit only that precursor here; the later destination check still + // enforces the actual protocol and loopback policy. + let implicit_outbound_bind = addr.ip().is_unspecified() + && addr.port() == 0 + && match reason { + SocketAddrUse::TcpBind => self.tcp_connect, + SocketAddrUse::UdpBind => self.udp_send, + _ => false, + }; + + let operation_allowed = match reason { + SocketAddrUse::TcpConnect => self.tcp_connect, + SocketAddrUse::TcpBind => self.tcp_bind || implicit_outbound_bind, + SocketAddrUse::TcpListen | SocketAddrUse::TcpAccept => self.tcp_bind, + SocketAddrUse::UdpBind => self.udp_bind || implicit_outbound_bind, + SocketAddrUse::UdpSend => self.udp_send, + SocketAddrUse::UdpReceive => self.udp_receive, + }; + + operation_allowed + && (!self.loopback_only || addr.ip().is_loopback() || implicit_outbound_bind) + } +} + +fn socket_policy_for_permissions( + has_permission: impl Fn(&str) -> bool, + loopback_only: bool, +) -> SocketPolicy { + let network_outbound = has_permission(permissions::NETWORK_OUTBOUND); + let tcp_allowed = has_permission(permissions::NETWORK_TCP); + let udp_allowed = has_permission(permissions::NETWORK_UDP); + let tcp_connect = + tcp_allowed || network_outbound || has_permission(permissions::NETWORK_TCP_CONNECT); + let tcp_bind = tcp_allowed || has_permission(permissions::NETWORK_TCP_BIND); + let udp_connected = + udp_allowed || network_outbound || has_permission(permissions::NETWORK_UDP_CONNECT); + let udp_bind = udp_allowed || has_permission(permissions::NETWORK_UDP_BIND); + let udp_send = udp_connected || has_permission(permissions::NETWORK_UDP_OUTGOING_DATAGRAM); + let udp_receive = udp_connected || udp_bind; + + SocketPolicy { + tcp_connect, + tcp_bind, + udp_send, + udp_receive, + udp_bind, + loopback_only, + } +} + pub struct PluginRuntime { engine: Engine, cache_dir: std::path::PathBuf, @@ -238,39 +301,19 @@ impl WasmPlugin { builder.allow_ip_name_lookup(true); } - let tcp_allowed = has_permission(permissions::NETWORK_TCP); - let udp_allowed = has_permission(permissions::NETWORK_UDP); - let tcp_connect = tcp_allowed || has_permission(permissions::NETWORK_TCP_CONNECT); - let tcp_bind = tcp_allowed || has_permission(permissions::NETWORK_TCP_BIND); - let udp_connect = udp_allowed || has_permission(permissions::NETWORK_UDP_CONNECT); - let udp_bind = udp_allowed || has_permission(permissions::NETWORK_UDP_BIND); - let udp_outgoing_datagram = - udp_allowed || has_permission(permissions::NETWORK_UDP_OUTGOING_DATAGRAM); - let loopback_only = plugin_override .and_then(|o| o.loopback_only) .unwrap_or(plugin_config.loopback_only) || has_permission(permissions::NETWORK_LOOPBACK); - builder.allow_tcp(tcp_connect || tcp_bind); - builder.allow_udp(udp_connect || udp_bind); + let socket_policy = socket_policy_for_permissions(has_permission, loopback_only); + builder.allow_tcp(socket_policy.tcp_connect || socket_policy.tcp_bind); + builder.allow_udp( + socket_policy.udp_send || socket_policy.udp_receive || socket_policy.udp_bind, + ); builder.socket_addr_check(move |addr, reason| { - Box::pin(async move { - let ok = match reason { - SocketAddrUse::TcpConnect => tcp_connect, - SocketAddrUse::TcpBind => tcp_bind, - SocketAddrUse::UdpConnect => udp_connect, - SocketAddrUse::UdpBind => udp_bind, - SocketAddrUse::UdpOutgoingDatagram => udp_outgoing_datagram, - }; - - if loopback_only { - ok && addr.ip().is_loopback() - } else { - ok - } - }) + Box::pin(async move { socket_policy.allows(addr, reason) }) }); if has_permission(permissions::NETWORK_OUTBOUND) { @@ -302,30 +345,20 @@ impl WasmPlugin { } } - builder.preopened_dir( - context.get_data_folder(), - "data", - if has_permission(permissions::FS_READ_DATA) - || has_permission(permissions::FS_WRITE_DATA) - { - DirPerms::READ - } else { - DirPerms::empty() - } | if has_permission(permissions::FS_WRITE_DATA) { - DirPerms::MUTATE - } else { - DirPerms::empty() - }, - if has_permission(permissions::FS_READ_DATA) { - FilePerms::READ - } else { - FilePerms::empty() - } | if has_permission(permissions::FS_WRITE_DATA) { - FilePerms::WRITE - } else { - FilePerms::empty() - }, - )?; + let may_write_data = has_permission(permissions::FS_WRITE_DATA); + let may_read_data = has_permission(permissions::FS_READ_DATA); + + if may_read_data || may_write_data { + builder.preopened_dir( + context.get_data_folder(), + "data", + if may_write_data { + FsPerms::ReadWrite + } else { + FsPerms::ReadOnly + }, + )?; + } let max_memory_mb = plugin_override .and_then(|o| o.max_memory_mb) diff --git a/crates/pumpkin/src/plugin/loader/wasm/wasm_host/state.rs b/crates/pumpkin/src/plugin/loader/wasm/wasm_host/state.rs index 4457c16aa..03499868c 100644 --- a/crates/pumpkin/src/plugin/loader/wasm/wasm_host/state.rs +++ b/crates/pumpkin/src/plugin/loader/wasm/wasm_host/state.rs @@ -8,11 +8,7 @@ use tokio::sync::Mutex; use wasmtime::component::ResourceTable; use wasmtime_wasi::{WasiCtx, WasiCtxBuilder, WasiCtxView, WasiView}; use wasmtime_wasi_http::{ - WasiHttpCtx, - p2::{ - HttpError, HttpResult, WasiHttpCtxView, WasiHttpHooks, WasiHttpView, - bindings::http::types::ErrorCode, default_send_request, - }, + RequestOptions, WasiBody, WasiHttpCtx, WasiHttpCtxView, WasiHttpHooks, WasiHttpView, }; use crate::{ @@ -579,19 +575,25 @@ impl Default for PluginHttpHooks { impl WasiHttpHooks for PluginHttpHooks { fn send_request( &mut self, - request: hyper::Request, - config: wasmtime_wasi_http::p2::types::OutgoingRequestConfig, - ) -> HttpResult { + request: hyper::Request, + options: Option, + fut: Box> + Send>, + ) -> Box< + dyn Future< + Output = wasmtime_wasi_http::Result<( + hyper::Response, + Box> + Send>, + )>, + > + Send, + > { if !self.allow_outbound { - return Err(HttpError::from(ErrorCode::HttpRequestDenied)); + return Box::new(async { Err(wasmtime_wasi_http::Error::HttpRequestDenied) }); } - Ok(default_send_request(request, config)) + wasmtime_wasi_http::default_hooks().send_request(request, options, fut) } } -impl wasmtime_wasi_http::p3::WasiHttpHooks for PluginHttpHooks {} - impl WasiView for PluginHostState { fn ctx(&mut self) -> WasiCtxView<'_> { WasiCtxView { @@ -610,13 +612,3 @@ impl WasiHttpView for PluginHostState { } } } - -impl wasmtime_wasi_http::p3::WasiHttpView for PluginHostState { - fn http(&mut self) -> wasmtime_wasi_http::p3::WasiHttpCtxView<'_> { - wasmtime_wasi_http::p3::WasiHttpCtxView { - ctx: &mut self.wasi_http_ctx, - table: &mut self.resource_table, - hooks: &mut self.wasi_http_hooks, - } - } -} diff --git a/crates/pumpkin/src/plugin/permissions.rs b/crates/pumpkin/src/plugin/permissions.rs index 0d41264d1..5b69a3333 100644 --- a/crates/pumpkin/src/plugin/permissions.rs +++ b/crates/pumpkin/src/plugin/permissions.rs @@ -41,11 +41,9 @@ pub const HTTP_OUTBOUND: &str = "http.outbound"; /// Allows the plugin to read files within its own data folder (`plugins/data/`). pub const FS_READ_DATA: &str = "fs.read.data"; -/// Allows the plugin to write files within its own data folder (`plugins/data/`). +/// Allows the plugin to write (and read) files within its own data folder (`plugins/data/`). /// -/// Note that even without `FS_READ_DATA`, this will allow the plugin to -/// inspect (e.g. list) the contents of the directory. But it will block -/// reading any file's contents. +/// Note that this permission also implies `FS_READ_DATA` pub const FS_WRITE_DATA: &str = "fs.write.data"; /// Allows the plugin to read all environment variables. @@ -97,10 +95,7 @@ pub fn get_permission_description(permission: &str) -> Option<&'static str> { } FS_READ_DATA => Some("Allows the plugin to read files within its own data folder."), FS_WRITE_DATA => Some( - "\ -Allows the plugin to write files within its own data folder. \ -Even without `fs.read.data`, this will allow the plugin to list directory contents \ -(but not read the contents of the discovered files).", + "Allows the plugin to write (and read) files within its own data folder. Implies `fs.read.data`.", ), SYS_ENV => Some("Allows the plugin to read all environment variables."), SYS_INFO => Some("Allows the plugin to read system information (CPU, Memory, OS)."),