[H-03][medium] 端编辑先直接写 enabled 再走级联停用:停用可能半生效,并发停用会被旧值悄悄重新启用 #46

Closed
opened 2026-09-30 13:57:02 +08:00 by nixevol · 1 comment
Owner

编号:H-03 严重级:medium 工作线:管理后端(internal/admin) + 后台网页(web/) 来源:审查 A-15
依赖:无 被依赖:无

结论与统一方案

采用审查 A-15 的方案,分两部分:

  1. 后端(本 issue,管理后端线):注入了 Identity 时,handleEndpointPatch 给 patchEndpoint 传 nil 的 enabled,启停只由 identity 执行;identity 失败时不留下"已停用但消息未作废、连接未踢"的半生效状态。
  2. 界面(网页线在 W-05 完成):编辑弹窗只提交有变化的字段;启用从开到关时弹确认"停用会立即断开并作废未送达消息,不可恢复"。

改动文件

internal/admin/endpoints.go(handleEndpointPatch)。

与其他问题的交互 / 冲突说明

W-05 负责对应界面;endpoints.go 的其他函数由 H-05、H-07、U-03 修改。

验收与测试

  • 用会失败的 identity 替身,PATCH 带 enabled:false 返回 500,且端仍是启用状态。
  • 只改名称时不触碰 enabled。

问题明细(各区审查原文,证据含文件与行号)

以下是本次复审各区审查报告的原文段落。A、M、I、P、S 开头的是原始发现编号(A 管理后台与网页、M 消息核心、I 身份认证群在线、P 传输平台部署、S SDK)。解决方案以本 issue 上方的"结论与统一方案"为准;原文里的方案与之不一致时,按上方执行。

[A-15] 编辑弹窗总是提交 enabled,关掉"启用"没有确认;后端可能处于半生效状态

  • 严重级:medium
  • 分类:界面 / 并发 / 逻辑
  • 现象与影响:
    • 在编辑弹窗里关掉"启用"再保存,会立刻停用端并作废所有未送达的消息(PRD 规定作废不恢复)。批量停用有确认框,这里没有。
    • 只改名称也会带上打开弹窗时的旧 enabled 值。如果此期间 API 令牌停用了这个端,这次保存会悄悄把它重新启用。
    • 后端在注入了 Identity 时,仍把 enabled 交给 patchEndpoint 先直接写库。之后若 identity.Disable 失败,接口返回 500,但端已经是停用状态,消息却没有作废,连接也没有踢掉。
  • 证据:
    • EndpointsView.vue:231-246(总是提交 enabled)、447-450(开关);批量确认框在 290-308。
    • endpoints.go:350-384:patchEndpoint(..., req.Enabled) 之后再走 identity。
  • 文档依据:PRD F01(约 133 行)"已作废的消息不恢复";用户界面规则"关键状态直接展示"。
  • 为何不是故意设计:DEVIATIONS 没有相关条目。
  • 解决方案:
    1. 前端只提交有变化的字段。"启用"从开变关时弹 dialog.warning:"停用会立即断开并作废未送达消息,不可恢复"。
    2. 后端注入了 Identity 时,给 patchEndpoint 传 nil 的 enabled,启停只由 identity 执行。
  • 改动文件:EndpointsView.vue、internal/admin/endpoints.go。
  • 交互/冲突风险:无。
  • 需补测试:组件测试,只改名称时请求体里没有 enabled;后端测试,用会失败的 identity 替身,PATCH 带 enabled:false 后端仍是启用状态。
  • 置信度:代码阅读确定

复审基线:main 4059a15(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。

**编号**:H-03 **严重级**:medium **工作线**:管理后端(internal/admin) + 后台网页(web/) **来源**:审查 A-15 **依赖**:无 **被依赖**:无 ### 结论与统一方案 采用审查 A-15 的方案,分两部分: 1. **后端(本 issue,管理后端线)**:注入了 Identity 时,`handleEndpointPatch` 给 `patchEndpoint` 传 nil 的 enabled,启停只由 identity 执行;identity 失败时不留下"已停用但消息未作废、连接未踢"的半生效状态。 2. **界面(网页线在 W-05 完成)**:编辑弹窗只提交有变化的字段;启用从开到关时弹确认"停用会立即断开并作废未送达消息,不可恢复"。 ### 改动文件 `internal/admin/endpoints.go`(`handleEndpointPatch`)。 ### 与其他问题的交互 / 冲突说明 W-05 负责对应界面;endpoints.go 的其他函数由 H-05、H-07、U-03 修改。 ### 验收与测试 - 用会失败的 identity 替身,PATCH 带 `enabled:false` 返回 500,且端仍是启用状态。 - 只改名称时不触碰 enabled。 --- ### 问题明细(各区审查原文,证据含文件与行号) > 以下是本次复审各区审查报告的原文段落。A、M、I、P、S 开头的是原始发现编号(A 管理后台与网页、M 消息核心、I 身份认证群在线、P 传输平台部署、S SDK)。**解决方案以本 issue 上方的"结论与统一方案"为准**;原文里的方案与之不一致时,按上方执行。 #### [A-15] 编辑弹窗总是提交 `enabled`,关掉"启用"没有确认;后端可能处于半生效状态 - 严重级:medium - 分类:界面 / 并发 / 逻辑 - 现象与影响: - 在编辑弹窗里关掉"启用"再保存,会立刻停用端并作废所有未送达的消息(PRD 规定作废不恢复)。批量停用有确认框,这里没有。 - 只改名称也会带上打开弹窗时的旧 `enabled` 值。如果此期间 API 令牌停用了这个端,这次保存会悄悄把它重新启用。 - 后端在注入了 Identity 时,仍把 `enabled` 交给 `patchEndpoint` 先直接写库。之后若 `identity.Disable` 失败,接口返回 500,但端已经是停用状态,消息却没有作废,连接也没有踢掉。 - 证据: - `EndpointsView.vue:231-246`(总是提交 enabled)、`447-450`(开关);批量确认框在 `290-308`。 - `endpoints.go:350-384`:`patchEndpoint(..., req.Enabled)` 之后再走 identity。 - 文档依据:PRD F01(约 133 行)"已作废的消息不恢复";用户界面规则"关键状态直接展示"。 - 为何不是故意设计:DEVIATIONS 没有相关条目。 - 解决方案: 1. 前端只提交有变化的字段。"启用"从开变关时弹 `dialog.warning`:"停用会立即断开并作废未送达消息,不可恢复"。 2. 后端注入了 Identity 时,给 `patchEndpoint` 传 `nil` 的 enabled,启停只由 identity 执行。 - 改动文件:`EndpointsView.vue`、`internal/admin/endpoints.go`。 - 交互/冲突风险:无。 - 需补测试:组件测试,只改名称时请求体里没有 enabled;后端测试,用会失败的 identity 替身,PATCH 带 `enabled:false` 后端仍是启用状态。 - 置信度:代码阅读确定 --- <sub>复审基线:main `4059a15`(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。</sub>
nixevol added the P2-mediumlane/adminlane/webreview-2026-09-30 labels 2026-09-30 13:57:02 +08:00
Author
Owner

已合入 origin/main 0c9b459。落地提交 ac08b6c fix: 端启停改为仅由 identity 执行 (#46)。

已合入 origin/main `0c9b459`。落地提交 `ac08b6c` fix: 端启停改为仅由 identity 执行 (#46)。
Sign in to join this conversation.