From 0698dc6138ea0a853fa1cc696bd7aa16021a5e75 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Sun, 28 Jun 2026 18:14:05 +0800 Subject: [PATCH] =?UTF-8?q?chore(todo):=20=E6=9B=B4=E6=96=B0=20TODO=20?= =?UTF-8?q?=E7=9C=8B=E6=9D=BF(stats-overhaul=20=E6=94=B6=E5=8F=A3=E6=9C=9F?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9D=A1=E7=9B=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- todo/todo.html | 218 +++++++++++++++++++++++++++++++++++++++++++++++-- todo/todo.json | 112 ++++++++++++++++++++++++- 2 files changed, 320 insertions(+), 10 deletions(-) diff --git a/todo/todo.html b/todo/todo.html index 98ab342..8389c88 100644 --- a/todo/todo.html +++ b/todo/todo.html @@ -252,12 +252,12 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }

feature+windows — 项目 TODO

-
生成于 2026-06-22 · 真相源 todo/todo.json
+
生成于 2026-06-28 · 真相源 todo/todo.json
-
3全部
-
3待开始
+
10全部
+
7待开始
0开发中
-
0待验收
+
3待验收
0已验收
@@ -292,7 +292,7 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
平台 / 标签 - +
@@ -301,7 +301,7 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
- 📋 待开始 3 + 📋 待开始 7 ▴ 收起
@@ -365,6 +365,93 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
+
  • +
    + 线上启用 TOTP 两步验证并验 2FA +
    + 待开始 + 重要 + 三级 + + +
    +
    + +
    pangolin1 的 /etc/pangolin/server.env 配 USER_TOTP_ENC_KEY(32字节或64位hex)并重启 pangolin-server,启用后验 A.1 客户端 2FA:绑定 Authenticator→重登 6 位码校验→备份码可用。当前该键未设置,/auth/login/totp 与 /me/totp/* 未挂载,2FA 无法测。属 A.1 手动验证清单第 4 项的前置。
    + + + +
  • + +
  • +
    + agent 掉线告警 + 静默吞错全量审计 +
    + 待开始 + 重要 + 二级 + + +
    +
    + +
    TODO #7 的剩余两块:① Hub 检测到 agent gRPC 流断开时触发告警(alert 包),避免再像这次停 6 天没人知道;② 全仓审计 _ = err / 忽略错误的静默吞错点(今天已遇邮件/连接500/connect-push 三处),逐一改为记日志或上抛。
    + + + +
  • + +
  • +
    + 打通每设备归因(设备注册 + per-device dp_uuid) +
    + 待开始 + 重要 + 二级 + + +
    +
    + +
    现状:多设备共用账户级 dp_uuid,统计无法区分设备;usage_device_daily 永远空,统计页设备下拉只有「全部」。基础设施已具备(devices.dp_uuid / EnsureDeviceDpUUID / usage_device_daily / UserDeviceByDpUUID)但未激活——客户端没 POST /v1/me/devices 注册本机,连接时 EnsureDeviceDpUUID 查不到设备行→回退账户 uuid。需:① 客户端启动/登录时注册本机设备(稳定 uuid + name + platform);② 连接时带该 device_id;③ 或让 EnsureDeviceDpUUID 缺行时自动建设备行。打通后每设备统计 + 统计页设备下拉才有真数据。是统计重设计「设备下拉」的前置依赖。
    + + + +
  • +
  • 🕐 2026-06-22 +
  • + + + +
  • +
    + 统计页设备下拉接真实设备数据(依赖#上条) +
    + 待开始 + 一般 / 优化 + 二级 + + +
    +
    + +
    统计重设计的设备下拉,先只挂「全部」上线;每设备归因打通后,把下拉填上「全部 + 近30天用过的设备名」,选设备走 /v1/usage/devices 过滤。依赖每设备归因 TODO。
    + + +
  • @@ -409,12 +525,98 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
    - 🔍 待验收 0 + 🔍 待验收 3 ▴ 收起
      -

      暂无条目

      + +
    • +
      + 节点健康绑定 agent 在线 + connect 校验凭证下发 + 掉线告警 +
      + 待验收 + 高优 · 紧急 + 一级 + + +
      +
      + +
      本次 google 打不开暴露的架构漏洞:① 节点 status 是静态 DB 列(种子 up),只有 SCHED 健康循环会改、而单节点没开 → Hub 已知 agent 离线却不反映到节点状态/列表,客户端永远显示健康。应把 Hub 的 agent 在线状态接进 ListNodes/节点 status。② ConnectNode 把 hub.Push 错误吞了(_ = pushErr)且不校验 agent 在线 → 凭证没下发也返回 200,客户端误以为连上。应在 agent 离线/push 失败时降级或明确报错,并把推送结果纳入响应。③ agent 掉线无告警(本次停 6 天没发现),应在 Hub 检测到 agent stream 断开时告警。④ 通病:错误被 _ = 静默吞掉(今天邮件/连接500/此处共三处),需排查同类静默吞错。
      + + + +
    • + +
    • +
      + SendCode 发信失败记日志 + 测试 +
      + 待验收 + 重要 + 三级 + + +
      +
      + +
      auth/service.go 异步发信把错误静默吞了(:157 SendCode 的 _=s.mailer.SendCode(...),:133 SendAlreadyRegistered 同样),导致 SMTP 故障日志无痕、本次 587 被封难排查。改为发信失败时记日志(slog.Error,脱敏:只记 send failed:<err>,绝不记验证码,邮箱可打码,守 no-secret-in-logs)。并加测试:注入会失败的 mock Mailer,断言发送失败时确实记了一条错误日志(可用 LogMailer 思路/捕获 slog handler 验证)。
      + + + +
    • + +
    • +
      + 节点列表:正式名(地区·国家) + 国旗图标 +
      + 待验收 + 重要 + 二级 + + +
      +
      + +
      客户端节点列表项展示改造:① 节点名改正式格式「地区 · 国家」(如 香港 · 中国),去掉测试名(当前 prod 节点 name_zh=单节点·测试);② 节点图标用国旗(按 region/国家码渲染 emoji 或 SVG 旗)。涉及:服务端 nodes 行的 name/region/国家码数据(可能需补国家码字段),客户端节点卡片渲染国旗+名格式。HK 节点国旗/国家标签需产品确认(🇭🇰香港 vs 🇨🇳中国)。
      + + + +
    diff --git a/todo/todo.json b/todo/todo.json index 48578ce..da73b66 100644 --- a/todo/todo.json +++ b/todo/todo.json @@ -1,9 +1,9 @@ { "meta": { "title": "feature+windows — 项目 TODO", - "updated_at": "2026-06-22T09:32:56.170Z" + "updated_at": "2026-06-28T09:32:26.080Z" }, - "seq": 3, + "seq": 10, "items": [ { "id": 1, @@ -49,6 +49,114 @@ "done": false, "completed_at": null, "version": null + }, + { + "id": 4, + "title": "线上启用 TOTP 两步验证并验 2FA", + "desc": "pangolin1 的 /etc/pangolin/server.env 配 USER_TOTP_ENC_KEY(32字节或64位hex)并重启 pangolin-server,启用后验 A.1 客户端 2FA:绑定 Authenticator→重登 6 位码校验→备份码可用。当前该键未设置,/auth/login/totp 与 /me/totp/* 未挂载,2FA 无法测。属 A.1 手动验证清单第 4 项的前置。", + "level": "mid", + "tier": 3, + "tags": [ + "后端", + "运维" + ], + "status": "open", + "created_at": "2026-06-27T16:39:31.549Z", + "done": false, + "completed_at": null, + "version": null + }, + { + "id": 5, + "title": "SendCode 发信失败记日志 + 测试", + "desc": "auth/service.go 异步发信把错误静默吞了(:157 SendCode 的 _=s.mailer.SendCode(...),:133 SendAlreadyRegistered 同样),导致 SMTP 故障日志无痕、本次 587 被封难排查。改为发信失败时记日志(slog.Error,脱敏:只记 send failed:,绝不记验证码,邮箱可打码,守 no-secret-in-logs)。并加测试:注入会失败的 mock Mailer,断言发送失败时确实记了一条错误日志(可用 LogMailer 思路/捕获 slog handler 验证)。", + "level": "mid", + "tier": 3, + "tags": [ + "后端" + ], + "status": "done", + "created_at": "2026-06-27T23:37:24.980Z", + "done": false, + "completed_at": null, + "version": null + }, + { + "id": 6, + "title": "节点列表:正式名(地区·国家) + 国旗图标", + "desc": "客户端节点列表项展示改造:① 节点名改正式格式「地区 · 国家」(如 香港 · 中国),去掉测试名(当前 prod 节点 name_zh=单节点·测试);② 节点图标用国旗(按 region/国家码渲染 emoji 或 SVG 旗)。涉及:服务端 nodes 行的 name/region/国家码数据(可能需补国家码字段),客户端节点卡片渲染国旗+名格式。HK 节点国旗/国家标签需产品确认(🇭🇰香港 vs 🇨🇳中国)。", + "level": "mid", + "tier": 2, + "tags": [ + "前端", + "后端" + ], + "status": "done", + "created_at": "2026-06-28T00:21:30.990Z", + "done": false, + "completed_at": null, + "version": null + }, + { + "id": 7, + "title": "节点健康绑定 agent 在线 + connect 校验凭证下发 + 掉线告警", + "desc": "本次 google 打不开暴露的架构漏洞:① 节点 status 是静态 DB 列(种子 up),只有 SCHED 健康循环会改、而单节点没开 → Hub 已知 agent 离线却不反映到节点状态/列表,客户端永远显示健康。应把 Hub 的 agent 在线状态接进 ListNodes/节点 status。② ConnectNode 把 hub.Push 错误吞了(_ = pushErr)且不校验 agent 在线 → 凭证没下发也返回 200,客户端误以为连上。应在 agent 离线/push 失败时降级或明确报错,并把推送结果纳入响应。③ agent 掉线无告警(本次停 6 天没发现),应在 Hub 检测到 agent stream 断开时告警。④ 通病:错误被 _ = 静默吞掉(今天邮件/连接500/此处共三处),需排查同类静默吞错。", + "level": "high", + "tier": 1, + "tags": [ + "后端" + ], + "status": "done", + "created_at": "2026-06-28T00:26:44.498Z", + "done": false, + "completed_at": null, + "version": null + }, + { + "id": 8, + "title": "agent 掉线告警 + 静默吞错全量审计", + "desc": "TODO #7 的剩余两块:① Hub 检测到 agent gRPC 流断开时触发告警(alert 包),避免再像这次停 6 天没人知道;② 全仓审计 _ = err / 忽略错误的静默吞错点(今天已遇邮件/连接500/connect-push 三处),逐一改为记日志或上抛。", + "level": "mid", + "tier": 2, + "tags": [ + "后端" + ], + "status": "open", + "created_at": "2026-06-28T00:38:22.413Z", + "done": false, + "completed_at": null, + "version": null + }, + { + "id": 9, + "title": "打通每设备归因(设备注册 + per-device dp_uuid)", + "desc": "现状:多设备共用账户级 dp_uuid,统计无法区分设备;usage_device_daily 永远空,统计页设备下拉只有「全部」。基础设施已具备(devices.dp_uuid / EnsureDeviceDpUUID / usage_device_daily / UserDeviceByDpUUID)但未激活——客户端没 POST /v1/me/devices 注册本机,连接时 EnsureDeviceDpUUID 查不到设备行→回退账户 uuid。需:① 客户端启动/登录时注册本机设备(稳定 uuid + name + platform);② 连接时带该 device_id;③ 或让 EnsureDeviceDpUUID 缺行时自动建设备行。打通后每设备统计 + 统计页设备下拉才有真数据。是统计重设计「设备下拉」的前置依赖。", + "level": "mid", + "tier": 2, + "tags": [ + "前端", + "后端" + ], + "status": "open", + "created_at": "2026-06-28T09:32:26.008Z", + "done": false, + "completed_at": null, + "version": null + }, + { + "id": 10, + "title": "统计页设备下拉接真实设备数据(依赖#上条)", + "desc": "统计重设计的设备下拉,先只挂「全部」上线;每设备归因打通后,把下拉填上「全部 + 近30天用过的设备名」,选设备走 /v1/usage/devices 过滤。依赖每设备归因 TODO。", + "level": "low", + "tier": 2, + "tags": [ + "前端" + ], + "status": "open", + "created_at": "2026-06-28T09:32:26.080Z", + "done": false, + "completed_at": null, + "version": null } ] }