user-limit-panel
✅ harness 自检:键都算得出来且形态对
K_DAY=email_daily_1_0426c46974d4a2c2394d213c5967ff52_20260916
BOT_XTR=rlx_email_daily_1_e9def9cd3118078cc11909d191c7cc16
=== A · 打满真实发码链 → 面板必须显示满 ===
✅ A1 前置:连发 5 次都成功(限流链没被改坏)
{"data":"\u9a8c\u8bc1\u7801\u5df2\u53d1\u9001\uff0c\u8bf7\u67e5\u6536\u90ae\u7bb1","info":"1","status":1}
✅ A2 日限计数确实累加到上限
实际 5
✅ A3 第 N+1 次被拒(日限生效),且文案是"已达上限"
该邮箱今日获取验证码次数已达上限
✅ A4 前置:找回密码链把日限记到 3(产品写的,不是测试塞的)
实际 "3"
✅ A5 面板里有这一行
✅ A6 🔴 面板显示 3 / 20 —— 读的与产品写的是**同一个桶**(显示 0 就说明两边的键分叉了)
实际 "3 / 20"
✅ A7 撞上限的行被标红并写明「已达上限」
注册验证码 · 按邮箱每日上限(已达上限)
=== B · 加额 → 恰好多放行 N 次,且今日已用继续累加 ===
✅ B0 加额端点返回成功
✅ B1 面板「额外次数」显示 3
实际 "3"
✅ B2 🔴 加额 3 → 恰好多放行 3 次(第 4 次起仍被拒)
实际放行 3 次
✅ B3 🔴 溢出语义:命中加额时计数照样 +1(今日已用 = 8,不是停在 5)
实际 8
✅ B4 加额被扣光
=== C · 换一天:计数归零,加额还在 ===
✅ C1 前置:明天的计数键与今天不同
email_daily_1_e9def9cd3118078cc11909d191c7cc16_20260916
email_daily_1_e9def9cd3118078cc11909d191c7cc16_20260917
✅ C2 明天那个计数桶是空的(日限按天重置)
✅ C3 🔴 加额键里没有日期段,明天照样读得到(= 不随时间重置)
✅ C4 填 0 = 撤销
=== D · 登录失败计数:面板显示 → 清零 ===
✅ D1 前置:isLoginBlocked 现在确实拦着(闸与面板读的是同一个桶)
✅ D2 面板显示 20 / 20
实际 "20 / 20"
✅ D3 失败计数型给的是「清除」不是「加次数」
clear=true grant=false
✅ D4 清除端点返回成功
✅ D5 🔴 清完之后 isLoginBlocked 真的放行了(清的是对的键)
=== E · 硬顶 / 不可加额 / 越权 / method 闸 ===
✅ E1 🔴 硬顶:n=100000 被拒
✅ E2 🔴 实名失败闸单独封顶 3
✅ E3 🔴 全站短信桶拒绝加额(它不属于任何会员)
✅ E4 🔴 管理员二级 PIN 桶拒绝清零(越权面)
✅ E5 🔴 拿超管 uid(1) 打清零 → 必须拒(vip<9 闸)
✅ E6 🔴 纯 GET 被 method 闸拒(一个 <img> 不能清限流)
=== F · 实名两行要位 67(服务端那道才是承重的)===
✅ F1 只有位 42 时:实名行仍然看得见(不隐藏,否则管理员以为没有这道闸)
✅ F2 只有位 42 时:实名行**没有**加额控件
✅ F3 并写明需要什么权限
需要「AI 与实名」权限才能调整
✅ F4 守卫:非实名行不受影响,仍可加额
✅ F5 🔴 直接打端点也被拒(只在模板里判等于没判)
=== G · 没有位 42 → 页面与端点都拒 ===
✅ G1 详情页被拒
✅ G2 加额端点被拒
=== H · 三组 op_code 都落了库 ===
✅ H·user_limit_view 有记录
实际 482 条
✅ H·user_limit_grant 有记录
实际 30 条
✅ H·user_limit_clear 有记录
实际 54 条
✅ H4 🔴 限流命中也落了审计(P0 那条链)
✅ H5 🔴 grant 的 detail 记了 code 与数值,且**不含**邮箱/手机号明文
{"code":"email_daily","granted":3,"used_at_grant":5,"max":5}
=== I · 操作记录页 → 直达使用限制面板 ===
✅ I1 前置:页面确实列出了限流命中的行
✅ I2 🔴 会员那条给出直达链接(id/990863)
✅ I3 🔴 只有邮箱、还没有会员记录的那条:**不给链接**,改为提示按邮箱检索
[还原] e2e_admin10.userauth = [12,2,66,65,3] ✔
PASS=43 FAIL=0