fix: 优化邮件通知域名显示与错误信息提炼并升级版本号至v1.52.4
Some checks failed
Build and Release / Build Release Package (tar.gz, amd64, linux) (push) Has been cancelled
Build and Release / Build Release Package (tar.gz, arm64, linux) (push) Has been cancelled
Build and Release / Build Release Package (zip, amd64, windows) (push) Has been cancelled

This commit is contained in:
xuans 2026-10-19 02:04:58 +08:00
parent fb2b877350
commit cdc7967aae
8 changed files with 57 additions and 25 deletions

View File

@ -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 .

View File

@ -1,3 +1,3 @@
package buildinfo
package buildinfo
const Version = "1.52.3"
const Version = "1.52.4"

View File

@ -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
}

View File

@ -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)
}
}
}

View File

@ -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"
},

View File

@ -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": {

View File

@ -85,7 +85,7 @@ defineEmits(["select", "settings"]);
<div v-if="currentUser" class="navigation-account-card" aria-label="当前登录账号">
<div class="navigation-account-header">
<span class="navigation-account-label">当前账号</span>
<span class="navigation-version-label">版本 {{ version ? (version.startsWith("v") || version.startsWith("V") ? version : "V" + version) : "V1.52.3" }}</span>
<span class="navigation-version-label">版本 {{ version ? (version.startsWith("v") || version.startsWith("V") ? version : "V" + version) : "V1.52.4" }}</span>
</div>
<div class="navigation-account-row">
<strong class="navigation-account-name" :title="currentUser.account">{{ currentUser.account || "未命名账号" }}</strong>

View File

@ -60,7 +60,7 @@ test("系统设置导航仅对当前已确认的超级管理员显示", async ()
const html = await renderComponent("../Dashboard/DashboardNavigation.vue", {
activeSection: "overview", sections: [],
currentUser: role ? { account: "测试", role } : null,
version: "1.52.3",
version: "1.52.4",
roleLabels: workspaceRoleLabels,
loggingOut: false, error: "", logout() {},
});