[MD]
## TinyAuth 1.0.1
本次是**安全与可靠性修复**,不新增玩法,但有三件事必须知道:说话要改口、密码要重输、背包多了一层保险。
### 修了什么
**背包:崩溃不再吞物品**
旧版登录时把 41 格背包“藏在内存里”,服务器一崩、玩家一掉线,东西就没了。现在改为落盘快照 `pending-inv/<uuid>.yml`,进服先还原再登录,进程被杀也不丢。
**密码:不再写进控制台日志**
`/登录 123456` 这种带参写法,明文会进 `logs/latest.log`,任何能看日志的人都能看到。现在 `/登录` `/注册` `/改密码` 不带参时进入聊天框输入状态,输入内容被插件吃掉并取消聊天事件,日志里干干净净。
**未登录还能聊天**
旧版只锁了移动、破坏、交互,没锁 `AsyncPlayerChatEvent`——没登录也能在公屏说话,还能连刷。现在一并锁掉。
**`/l` `/reg` 输入后死循环**
旧版命令白名单只有 4 个词,`/l`、`/reg`、`/login` 这类常用简写全被自己的插件拦掉,玩家反复输“请先登录”。现在白名单扩到 12 个词、覆盖全部别名,且按首词精确匹配,堵掉 `/登录xxx` 前缀穿透。
**口令哈希升级**
SHA-256 单轮 → **PBKDF2-HMAC-SHA256**,每账号 16 字节随机盐、默认 12 万次迭代。老玩家不用做任何事:下次登录成功时自动迁移,无感。
**失败冷却**
连续输错达到 `auth.max-attempts` 后进入冷却,冷却期内就算密码正确也不放行,挡掉脚本爆破。
**权限真正生效**
`tinyauth.bypass`(免登录)和 `tinyauth.admin` 之前全仓库没有一处 `hasPermission`,是空权限。现在接上了,也在 plugin.yml 里声明了。
**配置不再空转**
`kick-message`、`kick-message-unregistered`、`messages.prefix` 之前都是死配置(代码读的键和 config.yml 写的对不上),现已全部接通;`auth.enabled: false` 时不再往数据库写账号。老服务器首次启动自动补齐新增配置键。
### 新增内容
- `/改密码` — 自助修改密码(原 `changePassword` 逻辑是死代码)
- `/注销账号 confirm` — 二次确认后删号
- `/authadmin list|reset|del` — 管理员重置密码、删号,控制台可用
- 等待区世界可配(`auth.spawn-world`),空值回退默认世界
- 补上换手、进食、剪羊毛、睡觉、拾取、背包点击六处锁,事件锁从 12 个增至 **20** 个
### 升级到 1.0.1 注意
1. **说话方式变了**:默认 `/登录` 后按提示在聊天框输密码。想恢复旧的 `/登录 <密码>`,设 `auth.allow-command-password: true`(不建议)。
2. 老 `auth.yml` 不用动,哈希自动迁移。
3. 如果之前手工改过 `config.yml`,新增键不会被覆盖,缺失的会自动补默认值。
4. 插件的 `pending-inv/` 目录请随 `auth.yml` 一起备份。
### 验证
32 项离线回归断言全过(注册/校验/冷却/改密/删号/旧哈希迁移/畸形记录拒绝/重启持久化/配置键对账),20 个监听器逐一反射核对。
[/MD]