diff --git a/README.md b/README.md index 64e1b39..0cf47c0 100644 --- a/README.md +++ b/README.md @@ -143,11 +143,11 @@ go build -trimpath -o ../bin/scert-admin ./cmd/scert-admin 项目配备统一的打包脚本 `deploy/package.mjs`,产物严格遵循 **`项目名+版本+架构`** 的命名规范: ```bash -# 打包 Linux amd64 归档包 (生成 Scert_v1.52.3_linux_amd64.tar.gz) -node deploy/package.mjs --target=linux_amd64 --version=v1.52.3 +# 打包 Linux amd64 归档包 (生成 Scert_v1.52.4_linux_amd64.tar.gz) +node deploy/package.mjs --target=linux_amd64 --version=v1.52.4 -# 打包 Windows amd64 压缩包 (生成 Scert_v1.52.3_windows_amd64.zip) -node deploy/package.mjs --target=windows_amd64 --version=v1.52.3 +# 打包 Windows amd64 压缩包 (生成 Scert_v1.52.4_windows_amd64.zip) +node deploy/package.mjs --target=windows_amd64 --version=v1.52.4 ``` 发布包内包含: @@ -157,7 +157,7 @@ node deploy/package.mjs --target=windows_amd64 --version=v1.52.3 - `systemd/` 与 `nginx/` 配置示例模板 - `SHA256SUMS` 完整性校验文件 -推送版本标签(例如 `git tag v1.52.3 && git push Scert v1.52.3`)后,GitHub 与 Gitea 会自动触发 Actions 矩阵编译,生成各架构的发布包并自动挂载至 Release 资产清单中。 +推送版本标签(例如 `git tag v1.52.4 && git push Scert v1.52.4`)后,GitHub 与 Gitea 会自动触发 Actions 矩阵编译,生成各架构的发布包并自动挂载至 Release 资产清单中。 --- @@ -167,8 +167,8 @@ node deploy/package.mjs --target=windows_amd64 --version=v1.52.3 1. 从 Release 页面下载对应架构的发布包并解压: ```bash - tar -zxvf Scert_v1.52.3_linux_amd64.tar.gz - cd Scert_v1.52.3_linux_amd64 + tar -zxvf Scert_v1.52.4_linux_amd64.tar.gz + cd Scert_v1.52.4_linux_amd64 ``` 2. 执行安装脚本: @@ -188,7 +188,7 @@ node deploy/package.mjs --target=windows_amd64 --version=v1.52.3 ### Windows -1. 解压 `Scert_v1.52.3_windows_amd64.zip`。 +1. 解压 `Scert_v1.52.4_windows_amd64.zip`。 2. 以管理员权限启动 PowerShell 并执行: ```powershell powershell -ExecutionPolicy Bypass -File .\install-windows.ps1 -SourceDirectory . diff --git a/backend/internal/buildinfo/version.go b/backend/internal/buildinfo/version.go index 702bcf6..342c30c 100644 --- a/backend/internal/buildinfo/version.go +++ b/backend/internal/buildinfo/version.go @@ -1,3 +1,3 @@ -package buildinfo +package buildinfo -const Version = "1.52.3" +const Version = "1.52.4" diff --git a/backend/internal/notification/service.go b/backend/internal/notification/service.go index 268b0f7..859f06f 100644 --- a/backend/internal/notification/service.go +++ b/backend/internal/notification/service.go @@ -401,9 +401,11 @@ func (s *Service) buildPayload(event Event) (mailPayload, error) { } status := eventStatus(event.Status) domainName := strings.TrimSpace(event.Domain) - if domainName == "" { + if domainName == "" || isLikelyInternalIdentifier(domainName) { for _, domain := range event.Domains { - if domainName = strings.TrimSpace(domain); domainName != "" { + candidate := strings.TrimSpace(domain) + if candidate != "" && !isLikelyInternalIdentifier(candidate) { + domainName = candidate break } } @@ -519,3 +521,28 @@ func sleepContext(ctx context.Context, duration time.Duration) error { return nil } } + + +func isLikelyInternalIdentifier(value string) bool { + value = strings.TrimSpace(value) + if value == "" { + return false + } + if strings.HasPrefix(value, "internal-") || strings.HasPrefix(value, "domain-") || strings.HasPrefix(value, "task-") || strings.HasPrefix(value, "cert-") { + return true + } + if len(value) == 36 && strings.Count(value, "-") == 4 { + isHexUUID := true + for _, r := range value { + if r == '-' || (r >= '0' && r <= '9') || (r >= 'a' && r <= 'f') || (r >= 'A' && r <= 'F') { + continue + } + isHexUUID = false + break + } + if isHexUUID { + return true + } + } + return false +} diff --git a/backend/internal/notification/template_safety_test.go b/backend/internal/notification/template_safety_test.go index 798bc28..4658a0b 100644 --- a/backend/internal/notification/template_safety_test.go +++ b/backend/internal/notification/template_safety_test.go @@ -97,20 +97,25 @@ func TestVerifiedRecoveryDoesNotRequireManualUnlock(t *testing.T) { } func TestMailUsesCertificateDomainInsteadOfInternalID(t *testing.T) { - for _, domains := range [][]string{{" ", "example.test"}, nil} { + for _, tc := range []struct { + domain string + domainID string + domains []string + expected string + }{ + {domain: "", domainID: "internal-domain-id", domains: []string{" ", "example.test"}, expected: "example.test"}, + {domain: "", domainID: "internal-domain-id", domains: nil, expected: "未指定域名"}, + {domain: "b6824906-fea9-4f2a-a682-3c2b1ade1ee3", domains: []string{"scert-multi-20260930.apmmk.cn"}, expected: "scert-multi-20260930.apmmk.cn"}, + } { payload, err := New(newTestConfig("http://mail.example.test"), nil).buildPayload(Event{ - Status: "success", DomainID: "internal-domain-id", Domains: domains, + Status: "success", Domain: tc.domain, DomainID: tc.domainID, Domains: tc.domains, }) if err != nil { t.Fatal(err) } - expected := "未指定域名" - if len(domains) > 0 { - expected = "example.test" - } for _, body := range []string{payload.Subject, payload.Text, payload.HTML} { - if strings.Contains(body, "internal-domain-id") || !strings.Contains(body, expected) { - t.Fatal("用户邮件应显示证书域名而非内部记录编号") + if (tc.domainID != "" && strings.Contains(body, tc.domainID)) || strings.Contains(body, "b6824906-fea9-4f2a-a682-3c2b1ade1ee3") || !strings.Contains(body, tc.expected) { + t.Fatalf("用户邮件应显示证书域名而非内部记录编号或UUID: %s", body) } } } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 61712e0..1329ac9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "scert-frontend", - "version": "1.52.3", + "version": "1.52.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "scert-frontend", - "version": "1.52.3", + "version": "1.52.4", "dependencies": { "vue": "3.5.41" }, diff --git a/frontend/package.json b/frontend/package.json index 665baa0..a65bef4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "scert-frontend", "private": true, - "version": "1.52.3", + "version": "1.52.4", "type": "module", "packageManager": "npm@11.17.0", "engines": { diff --git a/frontend/src/views/Dashboard/DashboardNavigation.vue b/frontend/src/views/Dashboard/DashboardNavigation.vue index 5e14e73..1cbd339 100644 --- a/frontend/src/views/Dashboard/DashboardNavigation.vue +++ b/frontend/src/views/Dashboard/DashboardNavigation.vue @@ -85,7 +85,7 @@ defineEmits(["select", "settings"]);