Files
wx-win-agent/docs/validation/Review-Database-Management-Safety.md

67 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Review 修复:数据库读取与管理操作安全
## 范围和结论
用户确认同时完善数据库读取链路与四项代码问题,但不实现未读导航,特殊消息扩展及此前列出的真机验收继续暂缓。本轮未连接 Windows、未发布、未操作微信或真实联系人。
**本记录包含 Linux 代码检查和有限 Windows 只读验证,不是所有写操作的完整真机验收记录。** 不同微信版本的兼容性与长时间稳定性仍见 [PENDING](../PENDING.md)。
## 实现
### 数据库联系人
- 新增 `WechatContactDbReader`,复用 `SqlCipherDatabaseReader` 的只读连接及每次打开前的 page-1 HMAC 校验;不读取 UI 树、不写微信数据库。
- `db contacts` 与管理 API 共用读取器;分页 SQL 使用参数绑定、稳定 username 排序及多取一行判断 `hasMore`,不以显示名去重。
- CLI 新增 `--limit`110000,默认 200)、`--offset`(默认 0),返回 `hasMore/nextOffset``--contains` 是区分大小写的字面量子串;默认输出仍脱敏。
- C# 入口 `GetContactsPageAsync` 支持账号、密钥文件和群/非群筛选。未选择账号且密钥缓存包含多个账号时返回 `InvalidArgument`,不会随便选取一个。
- `GetFriendsAsync` 保留显式数量上限;全量读取用分页接口。`GetRecentGroupsAsync` 兼容名称仅返回数据库已知群,不承诺最近活动顺序。
- 联系人详情只映射已知字段;未知标签、签名、来源及共同群数量保持 null。非群联系人数据不能用于证明好友关系。
- 群成员使用 `chat_room``chatroom_member``contact` 的只读 join`GetGroupMembersAsync` 支持稳定 username 和分页,不回退 UI 枚举;已用测试群脱敏验证。
- offset 分页不是跨页事务快照;期间发生增删时仍可能重复/遗漏。
### URL 卡片与草稿
- 删除“输入 URL 后按 Enter 即宣称发送卡片”的实现。
- `SendUrlCardAsync` 不要求确认令牌;将 URL 暂存到文件传输助手,打开微信内置浏览器后通过“更多 → 转发…”生成原生链接卡片,并支持转发附言;目标草稿不覆盖。
- 需要文本形式的 URL 时显式使用已有 `SendTextAsync`,复用其草稿保护和发送确认;原生卡片仍未实现。
### OCR/语音转文字
- 按同一批非空气泡解析消息指纹,修复空气泡导致目标元素与解析索引错位的问题。
- 绑定目标消息 runtime ID、原始名称和列表布局,只读取该消息下新增的 Text 节点;检查会话归属、布局和目标未被替换。
- 连续两次 500ms 采样相同才返回;10 秒未确认则返回 `ResultUnconfirmed`,支持调用方取消。
- 不读取整窗文本或无可靠归属的 OCR 弹窗。两次稳定采样不是后台完成标志;独立结果窗定位、版本兼容及完成标志仍需后续验证。
### 管理操作、保存与结果
- 输入限定唯一模态管理弹窗;同名匹配要求唯一可见可用控件,不再任取首个节点。
- 选人拒绝重复输入,通过唯一列表项及复选框检查选中状态,不盲目切换已勾选对象。
- 删除联系人保留聊天记录时必须确认“不同时删除聊天记录”;无法确认则不提交删除确认。
- 朋友圈编辑拒绝覆盖已有草稿;评论输入限定目标朋友圈条目。
- 单文件保存要求目标不存在且父目录存在;保存后检查非空文件、可读取且无活动写入者、连续大小稳定及保存弹窗关闭,最多等待 15 秒。该证据不等同于远端附件完整性校验。
- 笔记附件保存只接受现存空目录,未有业务结果证据时仍返回未确认。
- 多项管理、朋友圈、转发等提交后等待模态窗口关闭并连续稳定,再返回 `Success=true`;单文件下载和笔记附件保存另有文件系统后置检查。未稳定时返回 `ResultUnconfirmed`,禁止自动重试。
- 原有单命令队列和确认令牌约束保持不变;不支持的弹窗布局停止操作,不以整窗首个输入框或键盘盲打兜底。
## Linux 检查
执行:
```bash
dotnet build WxAgent.sln -c Release -p:EnableWindowsTargeting=true --no-restore --verbosity minimal
dotnet test tests/node-agent/WxAgent.Core.Tests -c Release --no-restore --verbosity minimal
python3 tests/node-agent/check_contact_query.py
git diff --check
```
结果:
- Release 全量编译通过,0 warnings / 0 errors。
- Core 测试 145/145 通过;新增参数边界、分页标志、同名保留、唯一定位策略、未确认结果和派生文本差量测试。
- Python 标准库 SQLite 内存库测试通过,执行生产 SQL,覆盖超过两页的数据、同名联系人、群筛选、字面量 `%/_` 过滤及注入字符串;未接触微信数据库。
- `git diff --check` 通过。
## Windows 状态
Windows UI 已恢复后,使用 UTF-16LE Base64 PowerShell 任务启动最新发布包,在交互用户会话中向“文件传输助手”执行 URL 卡片流程:任务结果 `0`,返回 `Success=true`,微信 UI 接受了 `URL-card forwarding`;UI 树随后出现测试 URL 和附言。此前 Session 0 的 `SessionLocked` 仅属于错误启动方式。群成员数据库脱敏读取也已验证。完整写操作矩阵、不同版本兼容性和 M6 耐久仍保留在 PENDING。