merge: identity u01-u05

This commit is contained in:
Nixevol
2026-09-30 15:28:06 +08:00
14 changed files with 494 additions and 19 deletions
+27
View File
@@ -1237,3 +1237,30 @@ issue #3 未关闭,`feat/fix-3-downlink-deadlock` 未合入 `main`。下面是
5. **建议的正确方向**
- 在 broker 把对本连接的下行 `InjectPacket` 与上行 worker 解耦:上行读循环先写完 PUBACK,处理 `HandleUplink` 期间不要同步向本连接注入;handler 返回后再发 `resp` 和 `group_event`。不要靠固定 `Sleep`。`InlineClient: true` 保持,`OnPublish` 对 InlineClient 继续放行。
- 覆盖 presence 等其他同步 `PublishDown`,而不只包一层 `emit`。
### 复审修复 U-01
1. **开启自助注册必须已有 8–64 字符安全码**
- 原条款:PRD F23 / D14:管理员开启并设置注册安全码(8–64 字符);注册必须带当前安全码。
- 实际做法:`register()` 在锁定检查前,若存储码不是 8–64 字符则 403 `registration_closed` 并记不含码的警告,不计入锁定。`PUT /api/admin/registration` 在同一写操作末尾读回开关与安全码,开启且码不合法则 400 并回滚;允许一次提交 `enabled`+`code`/`generate`。后台无已保存安全码时禁用开关。
- 原因:新库无码行或空码时 `constantTimeEqual("", "")` 为真,只开开关即可裸注册。
- 备选方案:仅拦管理 PUT、不拦已处于「开启+空码」的旧库(否决,缺少纵深防御)。
- 影响:原先「先开开关再设码」的两步会 400;须先设码或一次提交开启与码。
### 复审修复 U-04
1. **锁定计数表过期清理与总量上限**
- 原条款:DEVELOPMENT 第 5 节锁定计数;issue #42。
- 实际做法:`internal/auth/locks.go` 的 Fail/Check 顺手删除已过期且最近失败在窗口外的条目;每 1024 次或每分钟全表扫描;默认上限 65536,超出时优先淘汰最旧的非锁定条目。生产接线使用 `auth.NewLoginLocks()`。
- 原因:注册安全码错误与错误 API 令牌按 IP 建条目,轮换地址会使 map 只增不减。
- 备选方案:一并改 `internal/admin/memlock.go`(否决,本波只改 locks.go;admin 测试用内存锁若仍独立注入需后续对齐)。未改对话密码锁键(U-03)。
- 影响:过期未锁定条目会被回收;极端并发失败时最早的非锁定计数可能被挤出。
### 复审修复 U-05
1. **目录 LIKE 转义;注册拒绝编号 inline**
- 原条款:DEVELOPMENT 6.5 按编号前缀或名称包含匹配;issue #43。
- 实际做法:目录查询对 `\`、`%`、`_` 转义并 `ESCAPE '\'`。注册拒绝编号 `inline`(与 mochi 内联客户端 ClientID 同名)。
- 原因:未转义时搜 `e_ab` 会命中 `exab…`,搜 `%` 返回全部端。
- 备选方案:在 `internal/protocol.ValidEndpointID` 加保留字,使开通/导入一并拒绝(否决,本波不改 protocol 与 `internal/admin/endpoints.go`)。后台开通与批量导入仍可能使用 `inline`,留给后续波次。
- 影响:目录下划线按字面匹配;自助注册不能占用 `inline`。
+2
View File
@@ -396,6 +396,8 @@ Authorization: Bearer nxm_...
```
- `generate: true` 时服务器生成 16 位安全码并忽略请求里的 `code`。
- 允许一次提交 `{"enabled":true,"code":"..."}` 或 `{"enabled":true,"generate":true}`。
- 最终状态为开启时,安全码必须是 8–64 字符;仅 `{"enabled":true}` 且库中没有合法安全码时返回 400,整次更新回滚。
- 成功 `data` 同 GET。
---