diff --git a/docs/admin-adfahi-research/测试用例文档.md b/docs/admin-adfahi-research/测试用例文档.md new file mode 100644 index 0000000..92e1ec7 --- /dev/null +++ b/docs/admin-adfahi-research/测试用例文档.md @@ -0,0 +1,460 @@ +# 鸽达达管理后台改造测试用例 + +> 依据:`需求文档.md`、`Admin-Server改造文档.md`、`IM-Server改造文档.md`及当前 Admin Server、IM Server 代码。 +> 测试环境:`https://admin.118im.com/admin#/dashboard/console` +> 文档日期:2026-09-07 + +## 1. 测试目标与范围 + +本测试用于验证鸽达达管理后台改造后的页面操作、Admin Server 接口、IM Server 内部查询与命令执行是否一致,并重点验证以下闭环: + +1. 后台查询条件、表格字段、详情、导出及权限控制正确。 +2. Admin Server 能正确访问 IM Server,真实展示概览、消息和登录审计数据。 +3. 消息隐藏、删除经 Kafka 下发后由 IM Server 幂等执行并记录结果。 +4. 全局禁止加好友发布后,移动端所有加好友入口均受后端控制,不能绕过。 +5. 宵禁发布后,命中规则的单聊/私聊不能发送消息;配置群聊规则时群聊也必须受限。 +6. 登录成功、失败及退出均产生安全审计数据,且账号、口令和验证码等敏感信息不泄露。 + +### 1.1 本轮交付范围 + +| 页面/能力 | 本轮状态 | 测试结论口径 | +|---|---|---| +| 3.1 数据概览 | 已改造 | 本轮必测,需联调 Admin 与 IM | +| 3.3 用户分组 | Admin 已改造为用户策略分组 | 后台 CRUD 本轮必测;IM 策略消费待补齐 | +| 3.7 单聊消息 | 已改造 | 本轮必测,需验证 Kafka 处置闭环 | +| 3.8 群聊消息 | 已改造 | 本轮必测,需验证 Kafka 处置闭环 | +| 3.9 敏感词库 | Admin 管理端已改造 | 后台 CRUD 本轮必测;IM 运行时拦截待补齐 | +| 3.16 用户登录历史 | 已改造 | 本轮必测,数据来自 IM Server | +| 3.18 登录失败日志 | 已改造 | 本轮必测,包含加入 IP 黑名单、封禁用户 | +| 3.20 安全策略 | Admin 管理与发布已改造,IM 执行端未完成 | P0 验收目标;当前不得判定端到端通过 | +| 其余 3.2、3.4-3.6、3.10-3.15、3.17、3.19 | 原系统能力/后续改造 | 执行基础回归,不作为本轮新增功能全部交付的判定依据 | + +### 1.2 代码核查结论 + +本节是对当前代码的静态核查结论,不等同于测试环境已经执行通过: + +| 服务 | 已实现内容 | 当前缺口/测试关注点 | +|---|---|---| +| Admin Server | 数据概览、单聊/群聊消息查询与处置、用户登录历史、登录失败日志;用户策略分组、敏感词、安全策略和 IP 规则的管理页面、接口、权限与数据表 | 对 IM 的依赖异常、异步命令最终状态、租户隔离仍需按本文实测 | +| IM Server | 概览/趋势、单聊/群聊消息、登录成功/失败日志的 Internal Query;`message.hide`、`message.delete` 消费、幂等处置及动作落库;真实登录成功、失败和退出审计 | 未找到 `security.policy.updated`、用户策略分组、敏感词策略的运行时消费;未找到全局禁加好友、资料隐藏、二维码拦截和消息宵禁在 IM 请求链路的执行代码 | +| 联调结论 | 消息治理、概览和登录审计具备端到端测试基础 | 安全策略页面“发布成功”目前只能证明 Admin 保存并发出事件,不能证明移动端已生效;`FRIEND-*`、`CURFEW-*`、敏感词运行时用例预计失败或阻塞,须补齐 IM 实现后回归 | + +因此,测试报告必须分别记录“Admin 配置成功”“事件发布成功”“IM 接收成功”“移动端行为生效”四个结果,禁止合并为一个“发布成功”。 + +### 1.3 优先级与结果 + +| 标识 | 说明 | +|---|---| +| P0 | 核心链路或安全控制,失败时禁止上线 | +| P1 | 主要页面功能,失败时原则上阻断上线 | +| P2 | 辅助功能、兼容性或易用性问题 | +| 通过 | 实际结果与预期完全一致,接口、数据库及异步结果无异常 | +| 失败 | 页面、接口、数据库或 IM 最终行为任一不符合预期 | +| 阻塞 | 环境、账号、数据或依赖不可用,无法执行 | + +## 2. 测试准备 + +### 2.1 账号、权限与数据 + +准备以下数据,所有测试数据使用唯一前缀 `QA_YYYYMMDD_`: + +| 数据 | 用途 | +|---|---| +| 超级管理员 A | 验证全部菜单与操作权限 | +| 只读管理员 B | 仅授予列表、详情权限,验证写按钮隐藏和接口拒绝 | +| 租户管理员 C | 验证租户隔离,不得查看或操作其他租户数据 | +| 移动端用户 U1、U2、U3 | U1/U2 为普通用户,U3 用作好友或宵禁白名单 | +| 群组 G1 | U1、U2、U3 入群,用于群消息及群成员入口测试 | +| 消息样本 | 文本、图片、视频、语音、文件、名片、系统消息各至少 1 条 | +| 登录样本 | 密码成功、密码错误、账号不存在、账号禁用、退出各至少 1 条 | + +执行前确认: + +- Admin Server 的 IM Internal API 地址与共享密钥配置正确。 +- Admin Server 和 IM Server 的 Kafka broker、topic 和鉴权配置一致。 +- Admin 库已存在策略、敏感词、策略分组及消息命令相关表。 +- IM 库已存在 `im_user_login_logs`、`im_login_failure_logs`、`im_message_admin_actions`。 +- 浏览器清理旧缓存后重新登录,确认当前构建版本与待测提交一致。 + +### 2.2 通用检查 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果 | +|---|---|---|---| +| COM-001 | P0 | 使用超级管理员登录并展开 IM 管理菜单 | 已交付的 8 个功能域可见,页面可打开,无 404、白屏和控制台致命错误 | +| COM-002 | P0 | 使用只读管理员打开各页面 | 可查询和查看;新增、编辑、删除、发布、隐藏、封禁等无权限按钮不可见或禁用;直接请求写接口返回无权限 | +| COM-003 | P0 | 使用租户管理员查询列表、详情和导出 | 后端强制按当前租户过滤,修改 `tenantId` 不能越权读取或操作其他租户数据 | +| COM-004 | P1 | 对列表执行查询、重置、翻页、切换每页条数 | 查询条件生效;重置恢复默认值;总数和分页正确;每页超过 200 时接口明确报错 | +| COM-005 | P1 | 查询无匹配数据、模拟 IM 超时或不可用 | 空数据展示为空列表而非报错;依赖异常有明确提示,不把历史缓存伪装成实时成功 | +| COM-006 | P1 | 连续快速点击保存、发布、删除等按钮 | 提交期间按钮有加载/防重复状态,不产生重复记录或重复处置 | +| COM-007 | P1 | 检查新增写操作后的操作日志 | 操作者、租户、目标对象、动作、时间、结果和原因可追溯,不记录密码、验证码、Token 或完整敏感账号 | + +## 3. 页面测试用例 + +### 3.1 数据概览 + +当前按钮和字段:`刷新`,时间范围 `近7天/近14天/近30天`;指标包含总用户数、活跃用户、总群组数、总会话数、总消息数、今日消息;趋势表包含日期、新增用户、新增消息。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果及核验点 | +|---|---|---|---| +| DASH-001 | P0 | 打开数据概览 | 调用 `/imDashboard/overview` 和 `/imDashboard/trends`;六项指标展示真实数字,不显示 `undefined`、`NaN` 或静态占位值 | +| DASH-002 | P0 | 记录 IM 库统计结果后刷新页面 | 总用户、活跃用户、群组、会话、消息及今日消息与 IM Server 同口径统计一致 | +| DASH-003 | P1 | 分别选择近 7、14、30 天 | 趋势行数和日期区间正确,日期连续;切换后重新请求,新增用户和新增消息按日聚合 | +| DASH-004 | P1 | 在 IM 端新增用户并发送一条消息,再点刷新 | 对应总量和当日趋势增加;刷新按钮显示加载状态且不会重复并发请求 | +| DASH-005 | P1 | 检查跨天边界和无数据日期 | 按 `Asia/Shanghai` 自然日统计;无数据日期补 0,不遗漏日期 | +| DASH-006 | P0 | 使用租户管理员查看概览 | 只统计本租户数据;不能通过修改请求参数获得全局或其他租户数据 | + +### 3.2 用户管理 + +本页属于既有能力回归。重点回归查询、详情、状态修改、重置密码、IP 白名单、强制下线、注销、批量封禁、按 IP 封禁和导入。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果 | +|---|---|---|---| +| USER-001 | P1 | 按用户 ID、用户名、昵称、手机号、状态和时间查询 | 条件可组合,表格字段与详情一致,手机号等敏感字段按权限脱敏 | +| USER-002 | P1 | 新增或编辑用户,切换启用/禁用 | 校验必填项和唯一性;状态写入成功,禁用用户不能继续登录 | +| USER-003 | P1 | 执行重置密码、强制下线、注销 | 均需二次确认;成功后客户端会话失效;操作日志记录动作但不记录明文密码 | +| USER-004 | P1 | 执行批量封禁及按 IP 封禁 | 仅命中目标租户和目标用户;返回成功、跳过、失败数量,重复提交保持幂等 | + +### 3.3 用户分组 + +当前页面为“用户策略分组”,按钮包括新增/编辑、成员、启用/禁用、删除;成员弹窗支持添加成员、移除成员。表格重点字段:分组编码、分组名称、优先级、状态、版本、成员数、备注、更新时间。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果及核验点 | +|---|---|---|---| +| UPG-001 | P1 | 按租户、编码/名称关键字、状态查询并重置 | 条件生效;状态 `1=启用、2=禁用` 显示字典标签;成员数与成员关系表一致 | +| UPG-002 | P1 | 新增分组,填写合法编码、名称、优先级、策略 JSON、IP 白/黑名单 | 保存成功并生成版本;编码以字母开头且仅含字母、数字、下划线、中划线,长度 2-64 | +| UPG-003 | P1 | 输入数字开头、空名称、非法 JSON、超过 128 字名称 | 前后端拒绝保存并给出明确中文错误,数据库不产生脏数据 | +| UPG-004 | P1 | 编辑分组策略后保存 | 原记录更新,版本按实现规则变化;详情与列表一致;其他租户同编码记录不受影响 | +| UPG-005 | P1 | 点击状态开关切换启用/禁用 | 调用 `/imUserPolicyGroup/status`;页面状态即时刷新,非法状态值被后端拒绝 | +| UPG-006 | P1 | 打开成员列表,添加 U1,设置有效开始/结束时间 | 成员成功加入,成员数 +1;结束时间早于开始时间时拒绝保存 | +| UPG-007 | P1 | 重复添加同一用户,然后移除成员 | 不产生重复有效关系;移除后成员列表和成员数同步更新 | +| UPG-008 | P1 | 删除含成员的分组 | 显示二次确认;按业务约束拒绝删除或级联解除关系,不能遗留指向不存在分组的成员关系 | + +### 3.4 群组管理 + +本页属于既有能力回归,验证查询、详情、封禁/解封、解散、成员、文件和快速建群。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果 | +|---|---|---|---| +| GROUP-001 | P1 | 按群 ID、群号、群名、群主、状态查询 | 列表与 IM 群数据一致,分页及租户隔离正确 | +| GROUP-002 | P1 | 封禁 G1 后尝试群内发消息,再解封 | 封禁后发送被 IM Server 拒绝;解封后恢复;后台和客户端状态一致 | +| GROUP-003 | P1 | 查看成员、文件并删除一个群文件 | 只展示 G1 数据;删除需确认且客户端不可再访问已删除文件 | +| GROUP-004 | P1 | 快速创建群组并解散 | 成员、群主校验正确;解散后群不可继续使用,操作有审计记录 | + +### 3.5 群成员管理 + +本页属于既有能力回归,重点验证踢出、禁言、解除禁言,以及全局禁加好友时的群成员隐私联动。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果 | +|---|---|---|---| +| GMEM-001 | P1 | 查询 G1 成员并按用户筛选 | 角色、入群时间、禁言状态正确,只返回该群成员 | +| GMEM-002 | P1 | 对 U2 执行禁言、解除禁言、踢出 | 对应客户端行为立即生效;群主/管理员等受保护角色遵守业务限制 | +| GMEM-003 | P0 | 发布“全局禁止加好友”策略后,U1 在群成员列表点击 U2 | 不显示可识别的个人详情或个人名片,不显示加好友入口;抓包直接访问资料/加好友接口也被后端拒绝 | + +### 3.6 邀请码管理 + +本页属于既有能力回归。邀请码创建、删除、使用记录必须与全局好友开关联动。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果 | +|---|---|---|---| +| INV-001 | P1 | 创建邀请码并设置有效期、次数、状态 | 校验正确,创建成功后可查询,过期或耗尽后不可继续使用 | +| INV-002 | P1 | 查看使用记录并删除未使用邀请码 | 使用人、时间、状态正确;删除需确认,已删除邀请码失效 | +| INV-003 | P0 | 全局禁止加好友期间通过邀请码注册或自动加好友 | 注册能力按私域设置执行,但 `invite_auto_add` 入口必须被后端阻断,不能自动建立好友关系 | + +### 3.7 单聊消息 + +筛选项:租户、会话 Topic、发送用户 ID、接收用户 ID、内容类型、消息状态、内容关键词、发送时间。表格字段:Topic、消息序号、发送人、接收人、类型、内容摘要、状态、发送时间;按钮:详情、隐藏、删除、导出。 + +内容类型枚举:`text` 文本、`image` 图片、`video` 视频、`audio/voice` 语音、`file` 文件、`card` 名片、`system` 系统。状态枚举:`normal` 正常、`deleted` 后台删除、`recalled` 用户撤回、`blocked` 风控拦截、`hidden` 已隐藏。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果及核验点 | +|---|---|---|---| +| PM-001 | P0 | 打开页面并点击查询 | `/imPrivateMessage/list` 返回真实 IM 消息;单聊双方、Topic、Seq、类型、摘要、状态和时间与 IM 库一致 | +| PM-002 | P1 | 组合发送人、接收人、类型、状态、关键词和时间查询 | 所有条件正确下传并组合生效;非法类型、非法状态、每页大于 200 被后端拒绝 | +| PM-003 | P1 | 点击详情 | `/imPrivateMessage/view` 返回消息头、完整内容、元数据、回复序号、@用户等;空 Topic 或 `seqId<=0` 被拒绝 | +| PM-004 | P0 | 点击隐藏,输入处置原因并确认 | 原因必填且不超过 500 字;Admin 生成唯一 command/event,返回待处理状态,Kafka 发布 `message.hide` | +| PM-005 | P0 | 等待隐藏命令完成后刷新并在移动端查看 | Admin 命令状态变为成功;IM `im_message_admin_actions` 有一条成功记录;列表状态为 `hidden`,普通客户端不再展示该消息 | +| PM-006 | P0 | 点击删除,确认后等待执行 | Kafka 发布 `message.delete`;IM 幂等落库并清除相关缓存;列表状态为 `deleted`,详情/客户端不能再获得可展示原文 | +| PM-007 | P0 | 使用同一 command/event 重放隐藏或删除命令 | 不重复执行、不新增重复有效记录,最终状态保持一致,并可追踪重复消费结果 | +| PM-008 | P1 | Kafka 不可用时执行隐藏/删除 | 页面明确提示失败或命令进入失败/待重试状态,不显示为已成功;恢复后可按设计重试 | +| PM-009 | P1 | 按当前筛选条件导出 | 导出字段含 Topic、Seq、双方 ID、类型、摘要、状态、发送时间;数据范围与筛选及租户权限一致 | + +### 3.8 群聊消息 + +筛选项:租户、群 Topic、发送用户 ID、内容类型、消息状态、关键词、发送时间。表格除公共消息字段外还应展示群名称、群号;按钮与单聊一致。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果及核验点 | +|---|---|---|---| +| GM-001 | P0 | 按 G1 Topic 查询 | `/imGroupMessage/list` 仅返回群消息,群名称、群号、发送人、Seq、类型、摘要和状态正确 | +| GM-002 | P1 | 按发送人、类型、状态、关键词、时间组合查询并查看详情 | 条件准确,详情完整;不能用单聊 Topic 越界取得群消息 | +| GM-003 | P0 | 隐藏一条群消息并在多个群成员客户端刷新 | `message.hide` 执行成功;所有普通成员均不可见,后台状态和 IM 动作记录一致 | +| GM-004 | P0 | 删除一条群消息 | `message.delete` 执行成功;群消息缓存被清除,各客户端不能继续通过历史缓存看到原内容 | +| GM-005 | P1 | 导出群消息 | 导出包含群名、Topic、Seq、发送人、类型、摘要、状态、时间,范围与查询一致 | +| GM-006 | P0 | 重放相同命令、乱序投递隐藏与删除命令 | IM Server 幂等处理;删除是最终不可见状态,不因迟到的隐藏命令恢复内容 | + +### 3.9 敏感词库 + +按钮:新增、编辑、启用/禁用、删除、批量导入、分组管理。筛选字段:租户、分组、敏感词、匹配类型、命中动作、风险等级、状态。 + +匹配枚举:`exact` 精确、`contains` 包含、`regex` 正则、`pinyin` 拼音。动作枚举:`replace` 替换、`block` 拦截、`audit_only` 仅审计、`manual_review` 人工审核。风险等级:`low/medium/high`。场景:单聊、群聊、用户资料、群资料、反馈、举报。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果及核验点 | +|---|---|---|---| +| SW-001 | P1 | 新建敏感词分组 | 编码格式、名称 1-128 字和状态校验正确;同租户编码保持唯一 | +| SW-002 | P1 | 新增敏感词并逐项选择匹配方式、动作、风险、场景 | 保存后列表字典显示正确;敏感词长度 1-255;至少选择一个生效场景 | +| SW-003 | P1 | 动作选择“替换”但不填替换文本 | 前后端均拒绝并提示“替换动作必须填写替换文本” | +| SW-004 | P1 | 输入非法匹配类型、动作、风险、状态或无效正则 | 后端拒绝;无效正则不得发布到 IM 运行时 | +| SW-005 | P1 | 切换启用/禁用并发送命中消息 | 禁用后不执行该词规则;启用后按所选场景和动作处理,后台状态与 IM 行为一致 | +| SW-006 | P1 | 批量导入含空行、重复词和已存在词的数据 | 单次仅允许 1-5000 条;返回 `inserted` 和 `skipped`,重复数据不产生多条记录 | +| SW-007 | P1 | 删除敏感词后再次发送命中内容 | 删除需确认;运行时规则及时失效,且操作有审计记录 | + +### 3.10 文件管理 + +本页属于既有能力回归。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果 | +|---|---|---|---| +| FILE-001 | P1 | 按上传人、文件类型、大小、来源、审核状态、时间查询 | 表格元数据、下载地址、引用对象与存储记录一致,租户隔离正确 | +| FILE-002 | P1 | 预览、下载、删除文件 | 权限校验正确;删除需确认,引用中的已删除文件不能继续匿名访问 | +| FILE-003 | P1 | 执行审核通过/拒绝及批量处置 | 状态流转正确,拒绝原因必填,相关消息或群文件同步更新 | + +### 3.11 用户反馈 + +本页属于既有能力回归。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果 | +|---|---|---|---| +| FB-001 | P1 | 按反馈类型、状态、优先级、用户和时间查询 | 查询、分页、详情及附件展示正确 | +| FB-002 | P1 | 修改处理状态、优先级和回复内容 | 状态流转符合约束,处理人和处理时间自动记录 | +| FB-003 | P2 | 批量处理并导出 | 成功/失败数量准确,导出范围与当前筛选一致 | + +### 3.12 操作日志 + +本页属于既有能力回归,也是所有后台写操作的审计入口。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果 | +|---|---|---|---| +| OPLOG-001 | P0 | 完成策略发布、消息删除、用户封禁后查询日志 | 三类操作均可按模块、操作者、目标和时间检索,结果、原因、请求 ID 完整 | +| OPLOG-002 | P0 | 检查请求参数与响应摘要 | 密码、验证码、Token、共享密钥、完整手机号/邮箱等不以明文出现 | +| OPLOG-003 | P1 | 只读管理员尝试越权写接口 | 记录拒绝结果及必要上下文,不记录敏感正文,不改变业务数据 | + +### 3.13 用户账号审计 + +本页属于既有能力回归。动作至少覆盖修改资料、修改密码、注销、管理员改用户名/状态、重置密码、更新安全权限、强制下线、强制注销、调整策略分组、批量封禁、按 IP 封禁。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果 | +|---|---|---|---| +| UAUD-001 | P1 | 分别触发用户自助和管理员账号变更 | 动作枚举显示中文,操作者类型、目标用户、变更前后摘要和时间正确 | +| UAUD-002 | P0 | 执行重置密码并查看审计详情 | 仅记录“已重置”等安全摘要,绝不保存新旧明文密码 | +| UAUD-003 | P1 | 调整 U1 策略分组 | 产生 `assign_policy_group` 审计,旧分组、新分组及管理员可追溯 | + +### 3.14 群事件审计 + +本页属于既有能力回归。事件包括建群、加入/退出/踢出、禁言/解禁、转让群主、增删管理员、改群名、封禁/解封和解散。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果 | +|---|---|---|---| +| GAUD-001 | P1 | 在 G1 触发踢人、禁言、改群名 | 对应事件各产生一条审计,操作人、目标人、群、时间和原因正确 | +| GAUD-002 | P1 | 系统执行群封禁或解散 | 操作人显示系统或实际管理员,事件类型与最终群状态一致 | + +### 3.15 管理员登录历史 + +本页属于 HotGo 既有能力回归。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果 | +|---|---|---|---| +| ALOGIN-001 | P1 | 管理员成功登录、失败登录、退出后查询 | 账号、IP、浏览器、系统、结果和时间正确;失败原因不泄露密码 | +| ALOGIN-002 | P1 | 使用日期、账号、IP、状态筛选并导出 | 列表和导出范围一致,普通管理员不能查看超出权限的数据 | + +### 3.16 用户登录历史 + +筛选项:租户、用户 ID、脱敏账号、登录方式、事件类型、客户端平台、IP、登录时间。表格字段:ID、用户、脱敏账号、登录方式、事件、客户端、版本、IP、地区、风险等级、登录时间、退出时间。 + +登录方式:`password` 密码、`sms_code` 短信验证码、`sso` 单点登录、`qr_code` 二维码、`token_refresh` 令牌刷新。事件:`login` 登录、`refresh` 刷新会话、`logout` 主动退出、`kicked` 被踢下线、`session_expired` 会话过期。平台:iOS、Android、Web、桌面端、未知。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果及核验点 | +|---|---|---|---| +| ULOGIN-001 | P0 | U1 密码登录成功后在后台查询 | IM `im_user_login_logs` 新增成功记录;后台展示用户、脱敏账号、会话、设备、平台、IP、请求 ID 和登录时间 | +| ULOGIN-002 | P0 | U1 主动退出后刷新列表 | 对应会话 `logout_at` 被更新或产生退出事件;退出时间不早于登录时间 | +| ULOGIN-003 | P1 | 分别模拟刷新会话、被踢、会话过期 | 事件字典和发生时间正确,同一 session 可串联追踪 | +| ULOGIN-004 | P1 | 按全部筛选项组合查询 | Admin 参数正确透传到 IM Internal API;结果按登录时间倒序,分页不重复不漏项 | +| ULOGIN-005 | P0 | 检查列表、详情、Admin/IM 日志及数据库 | 只保存账号掩码和不可逆哈希;密码、短信验证码、Token、Cookie 不得出现 | +| ULOGIN-006 | P1 | 导出当前筛选结果 | 含 ID、用户、脱敏账号、事件、平台、IP、地区、风险、原因、时间;租户隔离和脱敏规则不因导出而放宽 | + +### 3.17 IP 账号统计 + +本页属于后续改造/回归能力。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果 | +|---|---|---|---| +| IPSTAT-001 | P1 | 按 IP、账号数、风险和时间查询 | 同一 IP 关联账号数、成功/失败次数和最近时间统计准确 | +| IPSTAT-002 | P1 | 查看关联用户并按 IP 封禁 | 关联列表受租户隔离;封禁需确认并记录命中用户数、成功数和失败数 | + +### 3.18 登录失败日志 + +筛选项:租户、用户 ID、脱敏账号、失败类型、平台、IP、尝试时间。表格字段:ID、用户、脱敏账号、失败类型、原因、IP、地区、客户端、版本、风险等级、风控动作、尝试时间;按钮:详情、加入 IP 黑名单、封禁用户、导出。 + +失败类型:`password_error` 密码错误、`code_error` 验证码错误、`account_not_found` 账号不存在、`account_disabled` 账号已禁用、`rate_limited` 访问频率受限、`risk_blocked` 风控拦截。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果及核验点 | +|---|---|---|---| +| LFAIL-001 | P0 | 使用错误密码登录 U1 | IM `im_login_failure_logs` 新增 `password_error`;后台展示脱敏账号、IP、设备、平台、风险及尝试时间 | +| LFAIL-002 | P0 | 分别触发验证码错误、账号不存在、账号禁用、限频和风控拦截 | 失败类型、原因码、详情、风险动作正确;未知账号场景不泄露账号是否真实存在 | +| LFAIL-003 | P1 | 点击详情 | 根据日志 ID 返回完整安全上下文;`id<=0` 或跨租户 ID 被拒绝 | +| LFAIL-004 | P0 | 点击“加入 IP 黑名单”并确认 | IP 必填;在安全策略 IP 黑名单生成规则,不重复插入相同有效规则,后续登录按场景被阻断 | +| LFAIL-005 | P0 | 对有关联用户的记录点击“封禁用户”,填写原因 | 用户 ID 和原因必填;用户状态变为禁用,已有会话按设计失效,账号审计和操作日志可追溯 | +| LFAIL-006 | P1 | 对账号不存在、无关联用户的记录点击封禁 | 按钮不可用或接口明确提示无法关联用户,不得误封其他用户 | +| LFAIL-007 | P1 | 导出失败日志 | 结果与筛选一致,账号继续脱敏,不包含提交的密码、验证码和完整鉴权数据 | + +### 3.19 私域设置 + +本页属于既有/后续能力回归,重点验证注册与验证码开关不绕过安全策略。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果 | +|---|---|---|---| +| TENANT-001 | P1 | 修改短信验证码、邀请码注册等开关并保存 | 保存后重新进入值保持一致,移动端登录/注册入口按租户配置变化 | +| TENANT-002 | P0 | 关闭短信验证码并尝试短信登录、忘记密码、验证码注册 | 后端拒绝被关闭的流程,不能仅靠隐藏移动端按钮 | +| TENANT-003 | P0 | 全局禁加好友期间通过注册流程触发自动加好友 | 注册成功与否按私域设置判断,但任何自动加好友均被安全策略统一拒绝 | + +### 3.20 安全策略 + +页面包含“策略版本”和“IP 黑白名单”两个页签。策略按钮:新建草稿、编辑/查看、发布、恢复默认;策略内含好友控制、消息宵禁和其他 JSON 策略。IP 规则按钮:新增、编辑、删除。 + +发布状态:`draft` 草稿、`published` 已发布、`archived` 已归档、`failed` 发布失败。IP 规则类型:白名单/黑名单;动作:`allow` 放行、`challenge` 二次验证、`block` 阻断、`audit_only` 仅审计;场景:登录、注册、发消息、上传文件;风险:低、中、高。 + +#### 3.20.1 策略版本与发布 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果及核验点 | +|---|---|---|---| +| SEC-001 | P0 | 点击新建草稿,填写策略名称并保存 | `/imSecurityPolicy/save` 创建 `draft`;只有草稿可编辑,已发布版本只读 | +| SEC-002 | P0 | 修改草稿但不发布,在移动端验证旧策略 | 草稿不影响 IM 运行时,移动端继续执行最后一个已发布版本 | +| SEC-003 | P0 | 点击发布并确认 | 发布成功后当前版本为 `published`,原已发布版本归档;IM Server 收到策略更新并按新版本执行 | +| SEC-004 | P0 | 模拟 Kafka/IM 策略应用失败 | 不得提示完全成功;版本进入失败或可重试状态,运行时继续使用上一个有效版本 | +| SEC-005 | P1 | 点击恢复默认 | 仅创建一个默认草稿,不直接发布、不改变当前生效策略 | +| SEC-006 | P1 | 输入非法 JSON、空策略名或超过 500 字发布原因 | 前后端拒绝提交并明确指出错误字段 | + +#### 3.20.2 全局禁止加好友 + +关闭“允许加好友”时,后端必须强制设置:隐藏个人信息、禁止二维码、禁止群成员入口,并封锁 `search`、`profile_card`、`group_member`、`qrcode`、`invite_auto_add`、`recommendation` 六类入口。该限制必须由后端执行,移动端隐藏按钮不能作为唯一控制。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果及核验点 | +|---|---|---|---| +| FRIEND-001 | P0 | 关闭“允许加好友”并观察表单 | 隐藏资料、禁止二维码、禁止群成员入口自动开启且不可取消;六类入口全部选中 | +| FRIEND-002 | P0 | 仅保存草稿,不发布;U1 从用户搜索添加 U2 | 仍按旧策略执行,证明草稿不直接生效 | +| FRIEND-003 | P0 | 发布禁加好友策略;U1 从用户搜索添加 U2 | 页面不展示添加入口或提示“当前时段暂不允许添加好友”;直接调用加好友接口同样被拒绝 | +| FRIEND-004 | P0 | U1 打开 U2 个人名片并尝试添加 | 个人资料按策略隐藏,不展示可用个人名片及加好友入口;直接请求资料/好友接口不可绕过 | +| FRIEND-005 | P0 | U1 从 G1 群成员列表点击 U2 | 不显示 U2 可识别的个人信息、个人名片和加好友入口 | +| FRIEND-006 | P0 | U1 扫描 U2 二维码并构造二维码加好友请求 | 二维码入口不可用,后端拒绝建立好友关系 | +| FRIEND-007 | P0 | 使用邀请码注册并触发自动添加,再查看推荐联系人 | `invite_auto_add` 和 `recommendation` 均被阻断,不产生好友关系 | +| FRIEND-008 | P0 | 修改客户端请求绕过 UI、伪造入口类型或不传入口类型 | 后端按全局开关统一拒绝,不能因缺失/伪造入口字段放行 | +| FRIEND-009 | P0 | 将 U3 配置为例外用户(若本版本支持)并重复六入口测试 | 仅 U3 按明确白名单规则放行,U1/U2 仍被阻断;未实现例外时页面和接口不得暗示支持 | +| FRIEND-010 | P0 | 重新开启并发布,再从六入口验证 | 限制解除,资料展示及加好友恢复为常规权限;已被拒绝的历史请求不会自动补建好友关系 | + +#### 3.20.3 消息宵禁 + +规则字段:规则编码、名称、日期类型、作用范围、开始/结束时间、时区、状态、提示语、白名单用户 ID;支持每天、工作日、周末、自定义日期,范围为单聊/私聊或群聊。默认时区为 `Asia/Shanghai`,支持跨午夜时间段。 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果及核验点 | +|---|---|---|---| +| CURFEW-001 | P0 | 开启宵禁但不添加规则并保存 | 后端拒绝;开启时至少存在一条规则,且至少一条启用的单聊/私聊规则 | +| CURFEW-002 | P0 | 新增工作日 18:00-09:00、范围单聊、状态启用的规则并发布 | 保存和发布成功,规则编码合法且唯一,IM Server 使用 `Asia/Shanghai` 解释跨午夜区间 | +| CURFEW-003 | P0 | 命中宵禁时段,U1 向 U2 发送文本、图片、语音、文件和名片 | 所有单聊/私聊消息均由后端拒绝,不写入可投递消息;客户端显示配置的宵禁提示语 | +| CURFEW-004 | P0 | 在开始时刻前 1 秒、开始时刻、结束时刻前 1 秒、结束时刻发送 | 边界按统一规则执行;开始时刻进入限制,结束时刻解除,Admin 与 IM 时间口径一致 | +| CURFEW-005 | P0 | 分别验证每天、工作日、周末、自定义日期 | 仅命中日期生效;自定义日期为空或格式非法时拒绝保存 | +| CURFEW-006 | P0 | 将 U3 加入白名单,在命中时段由 U3 与 U1 发消息 | 白名单方向规则符合产品定义且保持一致;非白名单 U1/U2 仍被拒绝 | +| CURFEW-007 | P0 | 增加群聊范围规则并发布,在 G1 发消息 | 命中时群消息被后端拒绝;只有单聊规则时群聊不受影响 | +| CURFEW-008 | P0 | 禁用规则或关闭宵禁并发布 | 消息恢复发送;旧策略缓存及时失效,不需重启 IM Server | +| CURFEW-009 | P0 | 仅保存新的时间规则但不发布 | IM Server 继续执行最后已发布规则,不能提前生效 | +| CURFEW-010 | P0 | 客户端修改本地时间、时区或直接调用发消息接口 | 后端以策略时区和服务器可信时间判定,无法绕过宵禁 | + +#### 3.20.4 IP 黑白名单 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果及核验点 | +|---|---|---|---| +| IPRULE-001 | P1 | 新增黑名单规则,填写单 IP、阻断、登录场景、高风险 | 保存成功,列表字段及字典显示正确;登录请求从该 IP 发起时被阻断 | +| IPRULE-002 | P1 | 新增 CIDR 白名单并选择多个场景 | CIDR 校验正确,命中范围内 IP 按白名单优先级执行,其他场景不受影响 | +| IPRULE-003 | P1 | 输入非法 IP/CIDR、空场景、非法动作/风险/状态 | 后端拒绝且不产生记录 | +| IPRULE-004 | P1 | 编辑规则后重新触发对应场景 | 新规则生效,旧匹配缓存失效;详情和列表一致 | +| IPRULE-005 | P1 | 删除规则并确认 | 记录删除且运行时规则失效;取消确认不产生变化 | +| IPRULE-006 | P0 | 从登录失败日志加入同一 IP 黑名单 | 安全策略页可查询到规则;重复操作不产生冲突规则,审计来源可追踪 | + +## 4. Admin Server 与 IM Server 联调核验 + +### 4.1 接口映射 + +| 后台操作 | Admin Server | IM Server Internal / Kafka | +|---|---|---| +| 概览指标 | `GET /imDashboard/overview` | `GET /internal/admin-query/tenants/{tenant}/dashboard/overview` | +| 趋势数据 | `GET /imDashboard/trends` | `GET /internal/admin-query/tenants/{tenant}/dashboard/trends` | +| 单聊列表 | `GET /imPrivateMessage/list` | `GET /internal/admin-query/tenants/{tenant}/private-messages` | +| 群聊列表 | `GET /imGroupMessage/list` | `GET /internal/admin-query/tenants/{tenant}/group-messages` | +| 消息详情 | `GET /imPrivateMessage/view` 或 `/imGroupMessage/view` | `GET /internal/admin-query/tenants/{tenant}/messages/{topic}/{seq}` | +| 隐藏/删除消息 | `POST .../hide`、`POST .../delete` | Kafka `message.hide`、`message.delete` | +| 用户登录历史 | `GET /imUserLoginHistory/list` | `GET /internal/admin-query/tenants/{tenant}/user-login-logs` | +| 登录失败列表/详情 | `GET /imLoginFailureLog/list|view` | `GET /internal/admin-query/tenants/{tenant}/login-failure-logs[/{id}]` | + +### 4.2 数据库抽查 + +以下 SQL 仅用于测试环境核验,查询条件必须带测试租户或测试数据标识: + +```sql +-- IM 登录成功/退出审计 +SELECT id, tenant_id, user_id, account_mask, login_type, event_type, + session_id, platform, ip, risk_level, login_at, logout_at +FROM im_user_login_logs +WHERE tenant_id = ? AND user_id = ? +ORDER BY id DESC LIMIT 20; + +-- IM 登录失败审计 +SELECT id, tenant_id, user_id, account_mask, failure_type, reason, + ip, platform, risk_level, risk_action, attempt_at +FROM im_login_failure_logs +WHERE tenant_id = ? AND ip = ? +ORDER BY id DESC LIMIT 20; + +-- IM 消息后台处置结果 +SELECT tenant_id, command_id, event_id, action, topic, seq_id, + status, reason, created_at, updated_at +FROM im_message_admin_actions +WHERE tenant_id = ? AND topic = ? AND seq_id = ? +ORDER BY id DESC; +``` + +核验要求:同一幂等键不得产生多条有效执行;失败必须保留错误状态和可追踪信息;表中不得出现密码、验证码、Token 或完整认证请求。 + +## 5. 非功能与异常测试 + +| 用例 ID | 优先级 | 操作步骤 | 预期结果 | +|---|---|---|---| +| NFT-001 | P1 | 列表准备 10 万级数据并执行常用筛选 | 首屏和翻页在项目约定时间内返回,无全表扫描导致的持续高负载 | +| NFT-002 | P1 | 并发 20 次概览、消息、登录审计查询 | 服务稳定,连接池无耗尽,租户数据不串读 | +| NFT-003 | P0 | 伪造 Internal API 请求、错误共享密钥或重放过期请求 | IM Server 拒绝未授权请求并记录安全日志,不返回业务数据 | +| NFT-004 | P0 | 在 Topic、关键词、原因、备注中输入 SQL/XSS 字符串 | 使用参数化查询;页面转义展示,不执行脚本,不污染导出文件 | +| NFT-005 | P1 | Admin 与 IM 短时网络中断后恢复 | 查询可恢复;异步命令状态可追踪,不丢命令、不重复执行 | +| NFT-006 | P1 | 检查 PC 常用分辨率及窄屏 | 搜索区、表格、弹窗和操作列无重叠;横向滚动可用,按钮文本不被截断为不可辨识状态 | + +## 6. 上线验收门槛 + +满足以下条件方可通过本轮验收: + +1. 所有 P0 用例通过,尤其是 `FRIEND-*`、`CURFEW-*`、消息处置、登录审计和租户隔离。 +2. P1 无阻断主流程的问题;遗留问题有负责人、修复版本和回归日期。 +3. Admin Server、IM Server、Kafka 和两侧数据库结果一致,不以页面提示代替最终状态核验。 +4. 全局禁加好友和宵禁均通过“直接调用后端接口”的绕过测试。 +5. 数据库、应用日志、操作日志和导出文件均通过敏感信息检查。 +6. 其余未纳入本轮改造的页面必须完成基本回归,但不应据此宣称 20 个页面已全部完成重构。 + +## 7. 执行记录 + +| 字段 | 内容 | +|---|---| +| Admin Server 版本/提交 | `16cc456`(功能提交:`bb87d01`) | +| IM Server 版本/提交 | `b92154b`(功能提交:`6b20a63`) | +| 前端版本/构建时间 | | +| 测试环境 | `https://admin.118im.com` | +| 测试租户 | | +| 测试人员 | | +| 执行日期 | | +| P0 通过/失败/阻塞 | | +| P1 通过/失败/阻塞 | | +| 缺陷链接 | | +| 最终结论 | 通过 / 有条件通过 / 不通过 | diff --git a/docs/admin-adfahi-research/测试问题记录-2026-09-07.md b/docs/admin-adfahi-research/测试问题记录-2026-09-07.md new file mode 100644 index 0000000..cb1b9a0 --- /dev/null +++ b/docs/admin-adfahi-research/测试问题记录-2026-09-07.md @@ -0,0 +1,342 @@ +# 鸽达达管理后台测试问题记录 + +> 测试环境:`https://admin.118im.com/admin#/dashboard/console` +> 执行日期:2026-09-07 +> 参考用例:`测试用例文档.md` +> 测试方式:浏览器黑盒测试、HTTP 只读探测、测试库只读核验、当前代码静态核查 + +## 1. 执行摘要 + +| 项目 | 结果 | 说明 | +|---|---|---| +| 测试站点可达性 | 通过 | `/admin/` 返回 HTTP 200,响应约 0.2-0.5 秒 | +| 前端功能部署 | 通过 | 部署包包含 `imDashboard`、`imPrivateMessage`、`imGroupMessage`、`imUserLoginHistory`、`imLoginFailureLog`、`imSecurityPolicy`、`imSensitiveWord`、`imUserPolicyGroup` | +| Admin 新接口路由 | 通过 | 8 个列表/概览接口均已注册;无登录态请求统一返回业务码 `61`“登录身份已失效” | +| 浏览器页面操作 | 已恢复 | 已接管用户登录标签页,完成 8 个新增菜单及查询/刷新按钮的只读复测 | +| Admin 测试库结构 | 已修复 | 已在指定测试库 `hotgo` 创建 7 张策略相关表、8 个页面菜单及按钮权限 | +| IM 测试库结构 | 通过 | `tinode` 已存在 3 张新增审计/处置表 | +| IM 登录审计数据 | 部分通过 | IM Internal API 已恢复,成功登录历史返回 77 条;失败日志返回成功空列表,仍缺少失败场景验收数据 | +| Kafka Admin 命令 | 风险 | 13 条历史命令中 12 条长期待处理、1 条死信,需检查消费链路 | +| 消息隐藏/删除 | 未执行 | `im_message_admin_actions` 为 0;尚未准备专用消息数据,且 Kafka 命令链路存在长期积压风险 | +| 好友总开关/宵禁 | 未通过实现核查 | Admin 可配置和发布,但当前 IM Server 未找到运行时消费及拦截代码 | + +当前结论:**不通过。页面菜单和 Admin 本地策略表已可用,但 IM Internal 查询接口不可用,真实概览、消息和登录日志无法展示;IM 运行时策略执行也尚未完成。** + +## 2. 问题清单 + +### BUG-001 Admin 测试库缺少策略相关表 + +| 字段 | 内容 | +|---|---| +| 严重级别 | P0 | +| 类型 | 数据库部署/环境配置 | +| 状态 | 已修复并完成只读页面复测 | +| 关联用例 | `UPG-*`、`SW-*`、`SEC-*`、`FRIEND-*`、`CURFEW-*`、`IPRULE-*` | + +**操作步骤** + +1. 连接用户指定测试数据库 `64.118.137.182:53306`。 +2. 查询 `information_schema.tables` 中 `hotgo` 库的本轮新增表。 + +**实际结果** + +以下表均不存在: + +- `im_security_policy` +- `im_message_curfew_rules` +- `im_security_ip_rules` +- `im_sensitive_word_groups` +- `im_sensitive_words` +- `im_user_policy_groups` +- `im_user_policy_group_members` + +**预期结果** + +测试环境 Admin Server 所连接的数据库应包含全部新增表,并已执行初始化数据。 + +**影响** + +若线上 Admin Server 确实连接此 `hotgo` 库,用户策略分组、敏感词、安全策略、宵禁和 IP 规则页面会查询失败或无法保存。如果 Admin Server 实际连接其他数据库,则说明当前提供的测试库地址与部署配置不一致,需要明确真实连接库后重新核验。 + +**建议** + +核对 Admin Server 生产配置中的数据库 DSN;确认无误后执行已提交的 Admin 建表 SQL,并对表结构、索引和初始化数据做一次部署校验。 + +**处理记录(2026-09-07)** + +已在 `hotgo` 执行 `docs/admin-adfahi-research/sql/Admin-Server改造.sql`。7 张表均创建成功,`im_security_policy` 已初始化 1 条全局默认已发布策略,其余新增业务表初始为空。页面复测中,安全策略正确展示该默认策略,敏感词和用户分组正确展示空列表;写操作尚未执行。 + +### BUG-002 测试库缺少 8 个新增页面菜单记录 + +| 字段 | 内容 | +|---|---| +| 严重级别 | P0 | +| 类型 | 菜单/权限初始化 | +| 状态 | 已修复并完成超级管理员复测 | +| 关联用例 | `COM-001`、`COM-002` | + +**实际结果** + +在 `hotgo.hg_admin_menu` 中未查询到以下菜单: + +- `imDashboardIndex` +- `imPrivateMessageIndex` +- `imGroupMessageIndex` +- `imUserLoginHistoryIndex` +- `imLoginFailureLogIndex` +- `imUserPolicyGroupIndex` +- `imSensitiveWordIndex` +- `imSecurityPolicyIndex` + +部署前端包已经包含对应页面模块,后端接口也已注册,说明代码已部署但数据库菜单初始化可能未执行。 + +**预期结果** + +超级管理员登录后可在 IM 管理下看到 8 个页面;功能权限记录完整,普通角色按授权显示按钮。 + +**建议** + +确认部署库后执行: + +- `server/storage/data/generate/im_adfahi_batch2_menu.sql` +- `server/storage/data/generate/im_adfahi_policy_menu.sql` + +执行后分别用超级管理员、只读管理员和租户管理员回归菜单及按钮权限。 + +**处理记录(2026-09-07)** + +已执行 `im_adfahi_policy_menu.sql` 和 `im_adfahi_batch2_menu.sql`。8 个页面菜单均启用并挂载到 `imManager`(ID 2431)下;页面与按钮权限合计 43 条。用户需重新登录或刷新权限缓存后复测菜单显示。 + +**页面复测(2026-09-07)** + +超级管理员展开“IM管理”后,数据概览、用户分组、单聊消息、群聊消息、用户登录历史、登录失败日志、敏感词库、安全策略 8 个页面菜单均可见并可打开。`COM-001` 的菜单可见性通过;只读管理员和租户管理员权限仍需使用对应账号复测。 + +### BUG-003 Kafka Admin 命令存在长期 Pending 和 Dead 记录 + +| 字段 | 内容 | +|---|---| +| 严重级别 | P0 | +| 类型 | Kafka/异步命令链路 | +| 状态 | 待处理 | +| 关联用例 | `PM-004` 至 `PM-008`、`GM-003` 至 `GM-006`、`NFT-005` | + +**实际结果** + +`hotgo.im_admin_commands` 共 13 条记录: + +| 事件类型 | 状态 | 数量 | +|---|---:|---:| +| `user.password.reset` | `pending` | 12 | +| `user.password.reset` | `dead` | 1 | + +最新死信记录时间为 2026-08-28,原因 `RESOURCE_NOT_FOUND`,消息 `not found`。其余 Pending 记录同样创建于 2026-08-28,长期未进入成功或失败终态。 + +**预期结果** + +命令应在约定时间内进入 `succeeded`、`failed` 或 `dead` 终态;Pending 不应长期积压。死信应可查看、重放、忽略或解决。 + +**影响** + +消息隐藏/删除、用户治理等 Kafka 命令可能出现后台提示已提交但 IM 不执行,属于治理能力失效风险。 + +**建议** + +检查 Admin outbox worker、Kafka topic、consumer group、IM consumer 启动配置及结果回传 topic;处理历史积压后再执行消息隐藏/删除端到端测试。 + +### BUG-004 IM Server 尚未执行安全策略、敏感词和用户策略分组 + +| 字段 | 内容 | +|---|---| +| 严重级别 | P0 | +| 类型 | 功能未完成 | +| 状态 | 待开发 | +| 关联用例 | `SW-005`、`SW-007`、`FRIEND-*`、`CURFEW-*`、`IPRULE-*` | + +**代码核查结果** + +Admin Server 已实现策略数据保存、发布和 `security.policy.updated` 等事件写出;当前 IM Server 仅发现 `message.hide`、`message.delete` 等 Admin 命令消费,未发现: + +- `security.policy.updated` 事件消费与策略缓存刷新。 +- 全局禁止加好友在用户搜索、个人名片、群成员、二维码、邀请自动添加、推荐联系人六类入口的后端校验。 +- 禁加好友时个人资料、个人名片的隐藏处理。 +- 消息发送路径中的宵禁日期、时区、跨午夜、范围和白名单判定。 +- 敏感词及用户策略分组在 IM 运行时的加载与执行。 + +**预期结果** + +后台发布后,IM Server 接收事件、加载对应版本,并在实际移动端请求链路强制执行;直接调用接口也不能绕过。 + +**影响** + +后台可以显示“发布成功”,但移动端行为不会变化。全局禁止加好友和宵禁属于明确要求,未完成时禁止上线。 + +### DATA-001 IM 测试数据不足,无法覆盖失败日志和消息处置 + +| 字段 | 内容 | +|---|---| +| 严重级别 | P1 | +| 类型 | 测试数据 | +| 状态 | 待准备 | +| 关联用例 | `PM-*`、`GM-*`、`LFAIL-*` | + +**实际结果** + +- `tinode.im_user_login_logs`:43 条。 +- `tinode.im_login_failure_logs`:0 条。 +- `tinode.im_message_admin_actions`:0 条。 + +登录日志分布以 `password/login` 和 `token_refresh/login` 为主,尚不足以覆盖主动退出、被踢、会话过期等事件。账号掩码和 metadata 的只读抽查未发现手机号全明文或密码、验证码、Token 键值。 + +**建议** + +准备专用测试账号,分别触发密码错误、验证码错误、账号不存在、账号禁用、限频和风控拦截;准备单聊和群聊消息后执行隐藏、删除及幂等重放。 + +### BUG-005 IM Internal 查询接口返回 resource not found + +| 字段 | 内容 | +|---|---| +| 严重级别 | P0 | +| 类型 | 服务部署/路由联调 | +| 状态 | 已修复,接口复测通过 | +| 关联用例 | `DASH-001`、`DASH-002`、`PM-001`、`GM-001`、`ULOGIN-001`、`ULOGIN-004`、`LFAIL-001` | + +**操作步骤** + +1. 使用超级管理员进入“IM管理”。 +2. 打开数据概览并点击“刷新”。 +3. 分别进入单聊消息、群聊消息、用户登录历史、登录失败日志并点击“查询”。 + +**实际结果** + +- 数据概览六项指标全部显示 0,趋势表显示“无数据”,页面提示 `resource not found`。 +- 单聊消息、群聊消息、用户登录历史、登录失败日志均显示 0 条,查询后提示 `resource not found`。 +- 浏览器控制台在每次查询后记录同名接口错误。 +- 数据库已有 `tinode.im_user_login_logs` 43 条,因此用户登录历史页面的 0 条不是正常空数据。 + +**预期结果** + +Admin Server 应能调用 IM Server Internal API,概览、消息及登录日志返回真实数据;确实无数据的接口应返回成功的空列表,不能返回资源不存在。 + +**根因定位(2026-09-07)** + +- 当前 IM Server 源码已注册 `/internal/admin-query/`,并已实现 dashboard overview/trends、private-messages、group-messages、user-login-logs、login-failure-logs 路由,不是五个查询分别缺少实现。 +- `authorizeInternalAPI` 在 `internal_api.enabled=false` 时固定返回 HTTP 404、业务码 `30004`、消息 `resource not found`;该响应与页面错误完全一致。 +- 对测试环境 `https://api.118im.com/internal/admin-query/tenants/probe/dashboard/overview` 进行未签名只读探测,实际返回 HTTP 404、业务码 `30004`、消息 `resource not found`。若 Internal API 已启用,同一未签名请求应返回 HTTP 401、消息 `internal signature required`。 +- Gitea Actions 第 66 次部署(run 99,提交 `b92154b`)日志显示工作流调用 `deploy.sh` 时已经设置 `INTERNAL_API_ENABLED=true`,且部署成功切换到 green 实例;但部署后的公开实例仍表现为 disabled。 + +由此确认:提交 `c68c5ac` 将 Docker 配置模板中原本固定启用的 Internal API 改成了额外环境开关,但现有蓝绿部署并不会把这些新增变量注入容器,导致容器继承镜像默认值 `false`。这是新增启动配置造成的部署回归,不应要求部署机再增加一组开关配置。 + +**建议** + +已将 `docker/tinode/config.template` 恢复为改造前的启动方式:Internal API 固定开启、签名窗口固定 300 秒、调用方固定为 `hotgo-admin`,继续复用原有共享密钥配置;同时移除部署工作流中新增的开关、窗口和服务名变量。部署机无须增加 Compose 配置。 + +重新构建并部署 IM Server 后,先执行未签名探测:预期由当前的 HTTP 404 `resource not found` 变为 HTTP 401 `internal signature required`;再使用正确签名验证 overview、trends、private/group message、login history、login failure 六类接口,最后回归后台页面。 + +**接口复测(2026-09-07,IM `35da302`)** + +- Gitea Actions run 100 部署成功,线上未签名探测由 HTTP 404 变为预期的 HTTP 401 `internal signature required`。 +- 正确签名请求全部返回 HTTP 200、业务码 `0`:概览返回总用户 211、活跃用户 12、群组 95、会话 197、消息 2182、今日消息 167;7 日趋势返回 7 行。 +- 单聊列表返回 1528 条,群聊列表返回 654 条;分页、关键词筛选及首条消息详情均通过。 +- 用户登录历史返回 77 条;登录方式、事件、脱敏账号及组合筛选均通过。 +- 登录失败日志返回 HTTP 200 的空列表,总数 0,属于当前无测试数据,不再是接口错误。 +- 不存在租户正确返回 HTTP 404、业务码 `30010`、`tenant unavailable`。 +- Admin Server 的 IM 签名客户端和字段转换相关 Go 测试通过。 + +### BUG-006 新页面调用的字典 Store API 与部署版本不兼容 + +| 字段 | 内容 | +|---|---| +| 严重级别 | P1 | +| 类型 | 前端兼容性 | +| 状态 | 待处理 | +| 关联用例 | `UPG-001`、`SW-002`、`SEC-001`、`COM-004` | + +**实际结果** + +- 用户分组页面加载及点击“查询”时抛出 `TypeError: D.getOptions is not a function`。 +- 敏感词库页面抛出 3 次 `c.getOptions is not a function`。 +- 安全策略页面抛出 `q.getOptions is not a function`。 +- 安全策略表格仍能显示 1 条默认策略,敏感词和用户分组仍能显示空列表,但字典筛选项和后续编辑表单存在失效风险。 + +**预期结果** + +页面应通过当前项目字典 Store 的公开方法加载选项,控制台无异常;状态、类型、动作、风险等级等枚举应正确展示和筛选。 + +**建议** + +对照当前 `useDictStore` 实际 API 修正上述三个页面的 `model.ts`,统一使用项目现有字典加载和取值方式,重新构建部署后回归筛选、编辑和字典标签。 + +### BLOCK-001 浏览器安全检查阻塞自动化页面测试 + +| 字段 | 内容 | +|---|---| +| 严重级别 | 环境阻塞,非产品缺陷 | +| 状态 | 已解除 | +| 关联用例 | 所有需要登录态和页面点击的用例 | + +已识别到 Codex 内置浏览器中的测试环境标签页,页面标题为“主控台”,URL 和登录状态由用户确认。但自动化接管域名时,Codex 浏览器安全检查返回“permission request could not complete”,因此未读取或复用登录 Token,也未绕过安全控制。 + +恢复浏览器授权后,应从 `COM-001` 开始继续,并优先执行只读查询。涉及删除消息、删除规则等操作时仅使用专用测试数据。 + +**复测记录(2026-09-07,建表后)** + +再次读取内置浏览器状态,测试标签页仍为“主控台”且 URL 正确;调用浏览器接管接口时仍返回 `Auto-review could not complete for https://admin.118im.com`。本次复测未绕过安全控制,页面用例继续标记为阻塞。 + +**解除记录(2026-09-07)** + +再次连接后浏览器授权恢复,已成功接管同一登录标签页并完成菜单展开、页面切换、查询/刷新和表格读取。该项不再阻塞后续自动化测试。 + +## 3. 已执行用例 + +| 执行 ID | 对应测试 | 结果 | 实际结果 | +|---|---|---|---| +| RUN-001 | 站点可达性 | 通过 | `/admin/` HTTP 200,HTML 和静态资源可加载 | +| RUN-002 | 前端部署完整性 | 通过 | 8 个新增页面模块均存在于部署 JS 包 | +| RUN-003 | 未登录接口鉴权 | 通过 | 8 条接口统一返回业务码 `61`,未泄露业务数据 | +| RUN-004 | COM-001 菜单检查 | 通过 | 超级管理员可见并可打开 8 个新增页面;其他角色权限待测 | +| RUN-005 | Admin 新表检查 | 失败 | 7 张策略相关表缺失 | +| RUN-006 | IM 新表检查 | 通过 | 3 张表均存在 | +| RUN-007 | ULOGIN-001 数据检查 | 失败 | 数据库有 43 条登录记录,后台查询为 0 条并提示 `resource not found` | +| RUN-008 | ULOGIN-005 敏感字段抽查 | 通过 | 当前 SQL 规则未发现可疑明文记录 | +| RUN-009 | LFAIL-001 至 LFAIL-007 | 部分阻塞 | 页面可打开和查询,但接口返回 `resource not found`;失败日志表为 0 条,缺少动作数据 | +| RUN-010 | PM/GM 消息处置 | 阻塞 | 动作表为 0 条,Kafka 另有长期积压风险 | +| RUN-011 | FRIEND/CURFEW | 失败(实现核查) | IM 运行时执行代码未完成 | +| RUN-012 | BUG-001 建表复测 | 通过 | 7 张 Admin 策略表均存在,默认安全策略 1 条 | +| RUN-013 | BUG-002 菜单复测 | 通过 | 8 个页面菜单、43 条页面/按钮权限存在且状态启用 | +| RUN-014 | BLOCK-001 浏览器接管复测 | 阻塞 | 建表后重试仍被 Codex 域名安全检查拒绝,未执行页面点击 | +| RUN-015 | BLOCK-001 浏览器接管再次复测 | 通过 | 授权恢复,已完成登录态页面操作 | +| RUN-016 | DASH-001、DASH-002 | 失败 | 刷新后六项指标均为 0,趋势无数据,接口返回 `resource not found` | +| RUN-017 | UPG-001 | 失败 | 表格正确显示 0 条,但查询触发 `getOptions is not a function` | +| RUN-018 | PM-001 | 失败 | 单聊消息显示 0 条,查询接口返回 `resource not found` | +| RUN-019 | GM-001 | 失败 | 群聊消息显示 0 条,查询接口返回 `resource not found` | +| RUN-020 | ULOGIN-001、ULOGIN-004 | 失败 | 数据库 43 条,页面为 0 条,查询接口返回 `resource not found` | +| RUN-021 | LFAIL-001 页面查询 | 失败 | 页面可操作,但查询接口返回 `resource not found`;暂无失败登录测试数据 | +| RUN-022 | SW 页面只读查询 | 部分通过 | 正确返回 0 条;控制台存在 3 个字典 `getOptions` 异常 | +| RUN-023 | SEC 页面只读查询 | 部分通过 | 正确展示默认已发布策略 1 条;控制台存在字典 `getOptions` 异常 | +| RUN-024 | BUG-005 Internal API 启用复测 | 通过 | 未签名请求返回预期的 HTTP 401,不再返回 `resource not found` | +| RUN-025 | DASH-001、DASH-002 接口复测 | 通过 | 概览返回 211 用户、95 群组、2182 消息;7 日趋势返回 7 行 | +| RUN-026 | PM-001、GM-001 接口复测 | 通过 | 单聊 1528 条、群聊 654 条;分页、关键词和详情查询通过 | +| RUN-027 | ULOGIN 接口复测 | 通过 | 登录历史 77 条;登录方式、事件、脱敏账号及组合筛选通过 | +| RUN-028 | LFAIL-001 接口复测 | 部分通过 | 接口成功返回空列表;仍需准备失败登录数据验证详情及处置按钮 | + +## 4. 后续复测顺序 + +1. 回归 BUG-005 对应后台页面,确认概览卡片和四个列表正确显示接口数据。 +2. 修复 BUG-006:统一新页面与当前字典 Store API。 +3. 修复 Kafka Pending/Dead 链路,验证命令可进入终态。 +4. 补齐 IM Server 安全策略、好友入口、宵禁和敏感词运行时实现。 +5. 使用对应角色账号回归租户隔离、按钮权限、筛选、详情、分页和导出。 +6. 使用专用数据执行新增、编辑、发布、隐藏、删除、IP 黑名单和封禁用户。 +7. 使用移动端完成好友六入口、直接接口绕过、宵禁边界及白名单验收。 + +## 5. 复测记录 + +| 日期 | 版本 | 问题编号 | 复测结果 | 证据/备注 | 测试人 | +|---|---|---|---|---|---| +| 2026-09-07 | Admin `16cc456` | BUG-001 | 通过 | 7 张表存在,默认策略 1 条 | Codex | +| 2026-09-07 | Admin `16cc456` | BUG-002 | 通过 | 8 个菜单、43 条权限启用 | Codex | +| 2026-09-07 | Admin `16cc456` | BLOCK-001 | 阻塞 | 浏览器域名安全检查仍不可用 | Codex | +| 2026-09-07 | 测试环境部署版本 | BLOCK-001 | 通过 | 浏览器授权恢复并完成页面点击 | Codex | +| 2026-09-07 | 测试环境部署版本 | BUG-005 | 失败 | 5 类 IM 数据页面和概览统一返回 `resource not found` | Codex | +| 2026-09-07 | 测试环境部署版本 | BUG-006 | 失败 | 用户分组、敏感词、安全策略存在字典 Store API 异常 | Codex | +| 2026-09-07 | IM `35da302` / run 100 | BUG-005 | 通过 | 六类签名查询均为 HTTP 200;分页、筛选和消息详情通过 | Codex |