From f8db6ce4b142d6c8cd19b9fdb980612713376372 Mon Sep 17 00:00:00 2001 From: xuans Date: Thu, 1 Oct 2026 20:10:32 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9A=90=E8=97=8F=E5=AF=86=E7=A0=81=E9=87=8D?= =?UTF-8?q?=E7=BD=AE=E9=A1=B5=E9=9D=A2=E7=9A=84=E6=9C=AC=E6=9C=BA=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../httpapi/password_reset_account.go | 2 +- .../httpapi/password_reset_local_test.go | 5 ++++- .../views/PasswordReset/PasswordReset.test.js | 19 ++++++++-------- .../src/views/PasswordReset/PasswordReset.vue | 4 +--- .../LocalResetGuide/LocalResetGuide.vue | 22 ++++++------------- 5 files changed, 22 insertions(+), 30 deletions(-) diff --git a/backend/internal/httpapi/password_reset_account.go b/backend/internal/httpapi/password_reset_account.go index 125bb36..37d6c53 100644 --- a/backend/internal/httpapi/password_reset_account.go +++ b/backend/internal/httpapi/password_reset_account.go @@ -49,7 +49,7 @@ func (s *Server) resolvePasswordResetAccount(c *gin.Context) { AccountType: "super_admin", AccountLabel: "超级管理员", Title: "超级管理员密码重置", - Description: "已识别为超级管理员账户。超级管理员不能通过普通重置页面修改密码,请使用 Scert-admin 开启的一次性重置入口。", + Description: "已识别为超级管理员账户。该账户不能通过普通重置页面修改密码,请联系系统管理员按照服务器本机安全维护流程处理。", Action: "local_admin_command", }) return diff --git a/backend/internal/httpapi/password_reset_local_test.go b/backend/internal/httpapi/password_reset_local_test.go index d5d274b..2626816 100644 --- a/backend/internal/httpapi/password_reset_local_test.go +++ b/backend/internal/httpapi/password_reset_local_test.go @@ -31,7 +31,10 @@ func TestPasswordResetResolutionOnlyOffersLocalAdminCommand(t *testing.T) { t.Fatal(err) } if payload["account_type"] != "super_admin" || payload["action"] != "local_admin_command" { - t.Fatalf("超级管理员没有返回本机命令指引:%v", payload) + t.Fatalf("超级管理员没有返回受控本机处理标识:%v", payload) + } + if description, _ := payload["description"].(string); strings.Contains(strings.ToLower(description), "scert-admin") || strings.Contains(description, "systemctl") { + t.Fatalf("公开查询不应泄露本机管理命令:%s", description) } for _, field := range []string{"reset_path", "reset_url", "token", "nonce"} { if _, exists := payload[field]; exists { diff --git a/frontend/src/views/PasswordReset/PasswordReset.test.js b/frontend/src/views/PasswordReset/PasswordReset.test.js index 8cf1069..342c958 100644 --- a/frontend/src/views/PasswordReset/PasswordReset.test.js +++ b/frontend/src/views/PasswordReset/PasswordReset.test.js @@ -40,24 +40,23 @@ test("超级管理员查询保留本机处理标识,不生成网页重置链 assert.equal(state.resolution.value, null); }); -test("本机命令指引仅对接口明确标记的处理方式显示", () => { +test("密码重置页面不显示本机管理命令", () => { const root = template("./PasswordReset.vue"); const guides = elements(root, (node) => node.tag === "LocalResetGuide"); - assert.equal(guides.length, 1); - assert.equal(guides[0].props.find((prop) => prop.name === "if").exp.content, - "resolution.action === 'local_admin_command'"); + assert.equal(guides.length, 0); + const source = readFileSync(new URL("./PasswordReset.vue", import.meta.url), "utf8"); + assert.doesNotMatch(source, /systemctl|scert-admin|本机管理命令/iu); const message = elements(root, (node) => node.tag === "p" && node.props.some((prop) => prop.name === "if" && prop.exp?.content === "message && !resolution")); assert.equal(message.length, 1); }); -test("本机指引只显示固定命令,解释放入悬浮提示", () => { +test("本机指引不包含可执行命令", () => { const root = template("../components/LocalResetGuide/LocalResetGuide.vue"); assert.equal(elements(root, (node) => ["a", "input", "form"].includes(node.tag)).length, 0); assert.equal(elements(root, (node) => node.tag === "HelpTip").length, 1); - const commands = elements(root, (node) => node.tag === "code") - .map((node) => node.children.filter((child) => child.type === 2) - .map((child) => child.content).join("")); - assert.deepEqual(commands, ["systemctl start Scert-admin", ".\\scert-admin.exe"]); -}); \ No newline at end of file + assert.equal(elements(root, (node) => node.tag === "code").length, 0); + const source = readFileSync(new URL("../components/LocalResetGuide/LocalResetGuide.vue", import.meta.url), "utf8"); + assert.doesNotMatch(source, /systemctl|scert-admin| import AccessShell from "../components/AccessShell/AccessShell.vue"; -import LocalResetGuide from "../components/LocalResetGuide/LocalResetGuide.vue"; import { usePasswordReset } from "./PasswordReset.js"; const { @@ -55,7 +54,6 @@ const { 处理方式 {{ resolution.title }}

{{ resolution.description }}

- - \ No newline at end of file + diff --git a/frontend/src/views/components/LocalResetGuide/LocalResetGuide.vue b/frontend/src/views/components/LocalResetGuide/LocalResetGuide.vue index 0c2d7b3..eb5af60 100644 --- a/frontend/src/views/components/LocalResetGuide/LocalResetGuide.vue +++ b/frontend/src/views/components/LocalResetGuide/LocalResetGuide.vue @@ -5,24 +5,16 @@ import HelpTip from "../HelpTip/HelpTip.vue"; - \ No newline at end of file +