扩展权限与路径
扩展权限与路径
功能
扩展权限用于把“扩展声明想做什么”和“运行进程允许做什么”分开。manifest.permissions 先声明扩展需要的能力;运行时再结合 BT 进程权限配置判断是否允许加载。
路径 role 用于让 WASM 扩展安全接收项目内路径。宿主会先按 BT 路径规则解析脚本传入的路径,再确认路径没有逃出项目根,最后把它改写为 WASI 预打开目录内的相对路径。
语法
{ "permissions": { "fs_read": true, "fs_write": true, "net": false, "http": false, "process": false, "env": false } }
参数
| 字段 | 说明 |
|---|---|
fs_read | 允许读取文件路径 role。 |
fs_write | 允许写入文件路径 role。 |
net | 预留给 TCP、UDP、WebSocket、DNS 等网络能力。 |
http | 预留给 HTTP 客户端能力。 |
process | 预留给进程能力。 |
env | 预留给环境变量能力。 |
路径 role
路径 role 写在 bindings.json 的参数上:
{ "name": "copy_to", "id": 2, "params": [ { "name": "target", "type": "string", "role": "path_write" } ], "returns": "bool" }
| role | 权限要求 | 路径要求 |
|---|---|---|
path_read | fs_read: true | 目标必须存在且是文件。 |
path_write | fs_write: true | 目标存在时不能是目录;目标不存在时父目录必须存在。 |
path_dir | fs_read: true 或 fs_write: true | 目标必须存在且是目录。 |
路径 role 的参数类型必须是 string。
返回值
权限声明没有脚本返回值。校验成功时扩展继续加载;权限声明和进程权限不匹配、路径 role 和权限不匹配、路径逃出项目根或路径类型不满足 role 要求时,调用会返回中文错误。
路径转换
脚本可以传入 BT 路径:
ok = file_demo('@/in.txt').copy_to('@/out.txt') // 输出:true print ok
宿主处理顺序是:
1. 用 BT 路径规则解析 @ 项目根和普通相对路径。
2. 对已存在路径执行真实路径归一化,防止符号链接逃出项目根。
3. 按 role 校验文件或目录要求。
4. 把宿主路径改写为 WASI 相对路径,例如 in.txt、nested/out.txt 或 .。
5. 把改写后的字符串传给 WASM 模块。
WASM 模块收到的是 guest 相对路径,不应假设会收到宿主绝对路径。
注意事项
-
path_read和path_dir需要目标已经存在。 -
path_write写入新文件时,父目录必须已经存在。 - 路径为空字符串会报错。
- 路径参数不能逃出项目根目录。
- 文件系统路径能力主要面向 WASM 扩展;纯 BT 扩展通常直接使用 BT 标准库处理项目内逻辑。