补齐邮件通知权限回归并同步第一台实库终态
This commit is contained in:
parent
bbd5376a66
commit
92b499979f
@ -35,6 +35,7 @@ const notificationScopeBody = `{"notification":{"smtp_enabled":true,"smtp_host":
|
||||
func TestNotificationSettingsOnlySuperAdminCanConfigure(t *testing.T) {
|
||||
f := newProjectMemberAPIFixture(t)
|
||||
f.server.config.Web.Hostname = "scert.example.test"
|
||||
f.server.config.DNS.VerificationState = "verified"
|
||||
f.server.configPath = filepath.Join(t.TempDir(), "scert.json")
|
||||
if err := f.server.config.Save(f.server.configPath); err != nil {
|
||||
t.Fatal(err)
|
||||
@ -48,11 +49,15 @@ func TestNotificationSettingsOnlySuperAdminCanConfigure(t *testing.T) {
|
||||
f.server.secrets = secrets
|
||||
for _, actor := range []string{"", "global-admin", "manager", "viewer", "target"} {
|
||||
t.Run(actor, func(t *testing.T) {
|
||||
read := serveUserRequest(f.server, f.cookies[actor], http.MethodGet, "/api/v1/settings", "")
|
||||
response := serveUserRequest(f.server, f.cookies[actor], http.MethodPut, "/api/v1/settings", notificationScopeBody)
|
||||
want := http.StatusForbidden
|
||||
if actor == "" {
|
||||
want = http.StatusUnauthorized
|
||||
}
|
||||
if read.Code != want || read.Header().Get("Cache-Control") != "private, no-store" || read.Header().Get("Vary") != "Cookie" {
|
||||
t.Fatalf("通知配置读权限或缓存隔离错误:%s,状态 %d", actor, read.Code)
|
||||
}
|
||||
if response.Code != want || response.Header().Get("Cache-Control") != "private, no-store" || response.Header().Get("Vary") != "Cookie" {
|
||||
t.Fatalf("通知配置写权限或缓存隔离错误:%s,状态 %d", actor, response.Code)
|
||||
}
|
||||
@ -79,7 +84,7 @@ func TestNotificationSettingsOnlySuperAdminCanConfigure(t *testing.T) {
|
||||
if secrets.puts != 1 || saved.Notification.SMTPCredentialRef == "" {
|
||||
t.Fatal("通知密码没有独立保存到秘密仓库")
|
||||
}
|
||||
for _, method := range []string{http.MethodGet, http.MethodPut} {
|
||||
for _, method := range []string{http.MethodPut, http.MethodGet} {
|
||||
if method == http.MethodGet {
|
||||
response = serveUserRequest(f.server, f.cookies["primary-super-admin"], method, "/api/v1/settings", "")
|
||||
}
|
||||
|
||||
@ -105,18 +105,19 @@
|
||||
|
||||
## 执行状态
|
||||
|
||||
- [✓] 需求与现有代码核对:当前只有配置文件中的单账户,没有独立账户表和域名账户绑定。
|
||||
- [✓] 需求已确认:独立账户、用户与项目归属、域名绑定及完整签发生命周期;不能以旧系统账户兼容视图代替多账户。
|
||||
- [✓] 修改前检查点已提交推送:`26b8c3c`。保留未跟踪文件 `=`,不提交、不删除。
|
||||
- [x] 账户基础模型和迁移二十七:独立账户元数据、归属、状态、秘密引用和版本号;三库初轮专项通过,等待最终回归复审。
|
||||
- [x] 基础仓储:实时项目权限、事务审计、版本冲突、轮换后验证失效和禁止公开返回秘密引用;未提供无引用保护的删除方法。
|
||||
- [✓] 三库迁移和仓储专项三轮竞态通过;MySQL 审计故障夹具权限已修正,失败记录保留。完整执行链仍待实现验证。
|
||||
- [ ] 旧系统账户导入及幂等恢复,保护配置与历史凭据引用。
|
||||
- [~] 域名绑定及数据库引用保护已实现,等待第一台实库复审;安全删除、执行租约和凭据清理尚未完成。
|
||||
- [x] 域名绑定 HTTP 接口与严格参数、实时权限、版本竞争、跨源和审计回滚用例已实现;第一台回归待复审。
|
||||
- [ ] 正式签发、续期、重试的账户解析与执行前权限复核。
|
||||
- [x] 账户验证、增改、启停、轮换接口及无缓存和敏感字段隔离;本地全包与专项通过,第一台 Linux 回归待终态确认。
|
||||
- [~] DNS 账户页生命周期及前端回归已完成;域名配置页账户选择、浏览器复审仍待完成。
|
||||
- [ ] 第一台 Linux 全量、竞态、三库实测与正式产物升级。
|
||||
- [✓] 域名绑定、原子创建、持久执行租约及数据库引用保护已通过第一台三库专项;安全删除、遗留租约核对和凭据清理尚未完成。
|
||||
- [✓] 绑定接口严格参数、实时权限、版本竞争、跨源、审计回滚及租约占用回归通过;第一台固定 `37765ff` 全量与专项已结束成功。
|
||||
- [x] 签发、续期、重试已接入账户解析、固定凭据和执行前权限复核;取消和清理不确定保留引用,真实 DNS/ACME 全流程仍待验收。
|
||||
- [✓] 账户验证、增改、启停、轮换接口及无缓存和敏感字段隔离通过第一台 Linux 回归;不等于真实云端操作验收。
|
||||
- [x] DNS 账户页和域名账户选择已实现,前端全量通过;最新正式产物与浏览器复审仍待完成。
|
||||
- [✓] 第一台 `scert-dns-lease-review-20261004-0757.service` 于 08:04:50 成功结束,11:05 复核终态与干净源码;全量、vet 及单轮三库租约专项通过,日志保留在同名目录的 `review.log`。
|
||||
- [ ] 最新正式产物升级及第一台生产流程验收。
|
||||
- [ ] 公共域名真实浏览器和授权 DNS/公共 CA 验收。
|
||||
|
||||
## 完成标准
|
||||
|
||||
@ -1,5 +1,13 @@
|
||||
# Linux 生产流程测试记录
|
||||
|
||||
## 2026年10月4日11:07 第一台终态复核与本地权限回归
|
||||
|
||||
- 第一台 `scert-dns-lease-review-20261004-0757.service` 实查 inactive/dead、Result=success、ExecMainStatus=0,日志结束于 08:04:50。使用源码属主 nobody 读取 Git,提交 `37765ff`、工作区干净;没有关闭 Git 所有权保护。
|
||||
- 日志 `/var/tmp/scert-dns-lease-review-20261004-0757/review.log`:全量和 vet 已完成;单轮三库租约专项仓储 24.044 秒、数据库 40.830 秒、证书 3.095 秒、HTTP 3.372 秒。MySQL 排序规则故障夹具修复后的七种迁移故障及 PostgreSQL 实际通过。历史 `0743` 失败不改写。
|
||||
- 最新邮件权限增量目前仅本地回归:HTTP 26.375 秒、通知 0.858 秒、应用缓存通过,三包 vet 通过;前端 350 项零失败零跳过,Vite 构建 103 模块。首轮新增测试因夹具未设 DNS 已验证失败,修正后通过;未改产品验证规则。
|
||||
- 域名页面保留给用户填写系统通知凭据,仅填非秘密字段,未保存、未发送;TLS SMTP NOOP 探测不等于认证和发信成功。
|
||||
- 尚未发布最新产物、完成真实 DNS 签发续期或生产总验收。本轮未操作第二台、业务数据库和用户浏览器输入。
|
||||
|
||||
## 2026年10月4日07:40 执行租约复审准备
|
||||
|
||||
### 07:55 第一台终态与故障夹具修正
|
||||
|
||||
@ -1,5 +1,12 @@
|
||||
# Scert 开发任务清单
|
||||
|
||||
## 2026年10月4日11:07 开发与验证边界
|
||||
|
||||
- [✓] DNS 租约、原子绑定、授权探测增量已获得第一台固定 `37765ff` 的 Linux 全量与三库专项终态证据,不能再列为同一轮仍在执行。
|
||||
- [x] 邮件配置仅超管读写,其他用户只走获授权业务调用;入口防绕过及秘密零副作用测试本地通过,最新提交 Linux 回归待补。
|
||||
- [~] P1-03 下一步旧账户幂等导入及历史引用保护,随后遗留租约核对和安全回收;真实签发续期、最新产物、域名、邮件及首次 Web 流程仍未完成。
|
||||
- [✓] 本轮前端 350 项与构建、后端 HTTP/应用/通知全量与 vet 通过;不使用本地测试代替生产验收。
|
||||
|
||||
## 2026年10月4日07:40 DNS 执行链进展
|
||||
|
||||
07:55 实库结果:第一台 `f17ea6c` 的 Linux 全量、vet 和三库执行租约及原子创建专项通过;整轮因 MySQL 故障注入无效而失败,已修正夹具并新增列级排序规则用例,待连同授权探测增量复审。
|
||||
|
||||
@ -1,5 +1,12 @@
|
||||
# Scert 整改任务执行清单
|
||||
|
||||
## 2026年10月4日11:07 当前执行状态
|
||||
|
||||
- [✓] 第一台 `37765ff` 的 `0757` 单元已成功结束,11:05 复核 inactive/dead、success、退出零及干净源码;旧三库租约和迁移复审等待项关闭,历史失败记录保留。
|
||||
- [✓] 邮件配置仅超管读写及前端防绕过本地复审通过:后端三包全量与 vet、前端 350 项与构建;新增测试首轮夹具错误已修正。
|
||||
- [~] 继续 P1-03 旧账户幂等导入;遗留租约核对、安全回收、真实签发续期、最新 Linux 产物和浏览器仍待完成。
|
||||
- [ ] 用户完成系统通知凭据配置后的真实发信及本机恢复验收。浏览器保留,不代填密码、不保存、不刷新。
|
||||
|
||||
## 2026年10月4日07:40 执行租约边界复核
|
||||
|
||||
07:55 实库结果:第一台 Linux 全量、vet、三库租约与原子创建竞态通过。MySQL 迁移故障夹具未注入真实排序规则差异导致整轮失败,修正并补列级冲突后待复跑;授权探测增量仍需独立复审。
|
||||
|
||||
@ -1,5 +1,15 @@
|
||||
# Scert 整改、合并与优化清单
|
||||
|
||||
## 2026年10月4日11:07 权限回归与第一台终态复核
|
||||
|
||||
- [✓] 邮件通知配置继续仅允许超管读写;前端直接调用设置入口也拒绝普通管理员和用户,并清除未保存密码。新增角色矩阵、降权、停用和删除会话回归通过,拒绝请求没有配置或秘密仓库副作用。
|
||||
- [✓] 本地 HTTP、应用、通知三包全量及 vet 通过;前端全量 350 项零失败零跳过,生产构建通过。首次新增夹具遗漏 DNS 已验证状态而失败,修正夹具后通过,没有放宽产品初始化验证。
|
||||
- [✓] 11:05 再次核验第一台 `0757` 单元 inactive/dead、success、退出零;源码属主下读取确为 `37765ff` 且工作区干净。三库租约仓储 24.044 秒、数据库 40.830 秒、证书 3.095 秒、HTTP 3.372 秒。历史 `0743` 失败记录保留,不重跑已通过任务。
|
||||
- [~] P1-03 继续旧账户幂等导入及引用保护;安全删除回收、遗留租约外部核对、真实签发续期和最终正式产物仍未完成。
|
||||
- [ ] 邮件页仅填写非秘密参数,密码及完整系统通知用户名由用户确认;未保存或发送。真实 Smail 发信和本机恢复、最新候选版本第一台域名验收仍未完成。
|
||||
|
||||
本批不清业务库、不刷新用户页面、不改第二台,不处理 Windows。上述本地权限回归不等于 Linux 新提交验收。
|
||||
|
||||
## 2026年10月4日10:55 邮件通知权限确认及复审任务
|
||||
|
||||
用户已明确:邮件通知配置仅超级管理员可管理,普通管理员和普通用户只能通过获授权业务调用系统发信,不提供任意收件人或任意内容的公开邮件中继接口。继续使用系统发信账户,不要求其他用户配置自己的 SMTP 凭据。
|
||||
|
||||
@ -1,5 +1,12 @@
|
||||
# 核心能力任务规格
|
||||
|
||||
## 2026年10月4日11:07 邮件配置权限与 DNS 导入边界
|
||||
|
||||
- [✓] 邮件配置及其元数据仅超级管理员可读写;普通管理员和用户通过获授权业务调用,不开放任意收件人或内容的公共中继。降权、停用、删除用户的旧会话必须失效,被拒绝请求不得读取或修改秘密仓库。
|
||||
- [x] 前端设置入口拒绝非超管并清空旧未保存凭据,本地角色与会话回归通过;真实发信与 Linux 新版本验收另记。
|
||||
- [~] 旧 DNS 配置导入须保留真实项目、原用户归属和历史凭据引用,重复导入不得重建或覆盖已修改账户,不自动改绑域名或删除旧秘密。导入不能把历史验证状态冒充为新账户在线验证成功。
|
||||
- [ ] 遗留执行租约必须核实外部挑战记录后才允许安全回收,任务终态或租约年龄不是安全删除依据。
|
||||
|
||||
## 2026年10月4日07:40 DNS 执行与原子绑定契约
|
||||
|
||||
- MySQL 迁移恢复必须拒绝表级和列级排序规则冲突;故障测试必须先确认注入后的规则确实不同,不能使用库的默认值伪造冲突场景。该修正不改变产品迁移规则。
|
||||
|
||||
Loading…
Reference in New Issue
Block a user