# 权限配置

## 功能

BT 默认保持兼容行为，允许脚本使用全部标准库能力。生产环境可以通过环境变量收紧权限，在标准库边界拒绝文件、进程、网络、HTTP、MySQL、设备、环境变量和桌面能力。

权限检查只发生在标准库构造或方法调用边界，不进入 VM 普通指令循环。

## 语法

```text
BT_PERMISSION_ALLOW=fs,net,http
BT_PERMISSION_DENY=process,device
```

运行时查看当前配置：

```bt
BT.stats().permission
```

## 参数

| 环境变量 | 类型 | 必填 | 默认值 | 说明 |
| ------ | ------ | ------ | ------ | ------ |
| BT_PERMISSION_ALLOW | String | 否 | 未配置 | 允许能力列表。配置后只允许列表内能力；支持逗号、分号或空白分隔。 |
| BT_PERMISSION_DENY | String | 否 | 未配置 | 拒绝能力列表。拒绝列表优先级高于允许列表。 |

能力名称：

| 名称 | 能力 |
| ------ | ------ |
| fs | `fs()` 文件读写、目录操作。 |
| process | `process()` 子进程能力。 |
| net | `net()`、`net.listen()`、`net.connect()`、DNS 和接口信息。 |
| http | `reqwest()` HTTP 客户端能力，也支持别名 `reqwest`。 |
| mysql | `mysql()` 数据库能力。 |
| device | `device()`、串口扫描和串口读写。 |
| env | `BT.env()`、`BT.set_env()`、`BT.envs()` 和 PATH 覆盖层。 |
| desktop | `bt_app` 桌面桥接命令，包括窗口、系统对话框、托盘、剪贴板、通知、拖入文件事件和应用级桌面操作。 |

特殊值：

| 值 | 说明 |
| ------ | ------ |
| all | 表示全部能力。 |
| none | 表示空能力列表。 |

## 返回值

`BT.stats().permission` 返回对象：

| 字段 | 类型 | 说明 |
| ------ | ------ | ------ |
| denied | Int | 当前进程内权限拒绝次数。 |
| config | Object | 当前权限配置快照。 |

`config` 字段：

| 字段 | 类型 | 说明 |
| ------ | ------ | ------ |
| allow_configured | Bool | 是否显式配置了 `BT_PERMISSION_ALLOW`。 |
| allow | Array | 允许列表中的能力名称。未配置时返回全部能力。 |
| deny | Array | 拒绝列表中的能力名称。 |
| allowed | Array | 当前实际允许的能力名称。 |
| config_error | String / Empty | 权限配置错误；没有错误时为 `empty`。 |

## 代码示例

```bt
stats = BT.stats().permission
allowed = stats.config.allowed.join(',')

// 输出：fs,process,net,http,mysql,device,env,desktop
print allowed
```

```bt
stats = BT.stats().permission
denied = stats.denied

// 输出：0
print denied
```

## 注意事项

- 默认不设置 `BT_PERMISSION_ALLOW` 和 `BT_PERMISSION_DENY` 时，BT 允许全部能力，兼容现有脚本。
- 如果同时配置允许和拒绝，拒绝列表优先生效。例如 `BT_PERMISSION_ALLOW=all` 且 `BT_PERMISSION_DENY=process` 时，`process()` 会被拒绝。
- 权限拒绝会抛出中文运行时错误，不会返回 `empty` 或静默失败。
- 权限配置在进程内首次读取后缓存；常驻进程修改环境变量后需要重启进程才会生效。
- `desktop` 控制 `window.bt.window`、`window.bt.dialog`、`window.bt.tray`、`window.bt.clipboard`、`window.bt.notify`、`window.bt.drag`、`window.bt.app` 和初始化项目命令；`window.bt.call()` 仍是长期 VM 业务通道，被调用 BT 函数内部使用的 `fs`、`process`、`net` 等能力继续按各自权限检查。
- 权限配置回归示例位于 `examples/permission-stats.bt`，会验证 allow/deny 组合和 `BT.stats().permission` 配置快照。
