From 01dfda888acee9b0f50d408373e523dd4366aab3 Mon Sep 17 00:00:00 2001 From: xuans Date: Mon, 31 Aug 2026 01:17:37 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E6=A1=8C=E9=9D=A2=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=8E=AF=E5=A2=83=E9=85=8D=E7=BD=AE=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/service/runtime.go | 8 ++++++- backend/service/runtime_test.go | 38 +++++++++++++++++++++++++++++++++ doc/Scert开发任务清单.md | 14 ++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/backend/service/runtime.go b/backend/service/runtime.go index 0cf10d4..06f4c8d 100644 --- a/backend/service/runtime.go +++ b/backend/service/runtime.go @@ -28,12 +28,18 @@ func Open(configPath, baseDir string) (*Runtime, error) { baseDir = filepath.Dir(filepath.Dir(configPath)) } - cfg, err := config.Load(configPath) + cfg, err := config.LoadWithEnv(configPath) if err != nil { if !errors.Is(err, os.ErrNotExist) { return nil, err } cfg = defaultConfig(baseDir) + if err := cfg.ApplyEnvironment(); err != nil { + return nil, err + } + if err := cfg.Validate(); err != nil { + return nil, err + } } ctx, cancel := context.WithCancel(context.Background()) diff --git a/backend/service/runtime_test.go b/backend/service/runtime_test.go index 6123034..03962fd 100644 --- a/backend/service/runtime_test.go +++ b/backend/service/runtime_test.go @@ -66,3 +66,41 @@ func (r *recordingResponse) Write(body []byte) (int, error) { r.body += string(body) return len(body), nil } + +func TestOpenAppliesEnvironmentOverrides(t *testing.T) { + baseDir := t.TempDir() + configPath := filepath.Join(baseDir, "config", "scert.json") + cfg := defaultConfig(baseDir) + if err := cfg.Save(configPath); err != nil { + t.Fatalf("保存测试配置失败:%v", err) + } + t.Setenv("SCERT_WEB_ENABLED", "false") + runtime, err := Open(configPath, baseDir) + if err != nil { + t.Fatalf("应用环境覆盖后打开桌面核心服务失败:%v", err) + } + defer runtime.Close() + + request, err := http.NewRequest(http.MethodGet, "http://127.0.0.1/", nil) + if err != nil { + t.Fatal(err) + } + request.RemoteAddr = "127.0.0.1:1234" + response := newRecordingResponse() + runtime.Handler().ServeHTTP(response, request) + if response.status != http.StatusNotFound { + t.Fatalf("SCERT_WEB_ENABLED=false 未关闭 Web 页面,状态码:%d", response.status) + } +} + +func TestOpenRejectsInvalidEnvironmentOverride(t *testing.T) { + baseDir := t.TempDir() + configPath := filepath.Join(baseDir, "config", "scert.json") + if err := defaultConfig(baseDir).Save(configPath); err != nil { + t.Fatalf("保存测试配置失败:%v", err) + } + t.Setenv("SCERT_WEB_ENABLED", "无效") + if _, err := Open(configPath, baseDir); err == nil { + t.Fatal("无效环境覆盖不应打开桌面核心服务") + } +} diff --git a/doc/Scert开发任务清单.md b/doc/Scert开发任务清单.md index e9c5cbe..2ba26c1 100644 --- a/doc/Scert开发任务清单.md +++ b/doc/Scert开发任务清单.md @@ -3011,3 +3011,17 @@ Linux Ubuntu 22.04 上的 `Scert-admin` 手动启停、无开机自启动、无 - `[✓]` 网页端和桌面端前端 `npm.cmd run build` 已通过。 - `[✓]` 桌面端 Go `go test ./...` 和 `go vet ./...` 已通过。 - `[!]` 真实 ACME、DNS 服务商、远程 SSH、Nginx 反向代理和生产 HTTPS 验收仍需授权后的目标环境测试。 + +## 七十六、桌面核心服务环境配置一致性(2026-08-30) + +### 76.1 本轮需求清单 + +- `[✓]` 桌面/Wails 核心服务入口统一使用 `LoadWithEnv()` 读取受控环境变量。 +- `[✓]` 配置文件不存在时,默认配置同样应用环境变量并执行完整校验。 +- `[✓]` 桌面核心服务支持通过 `SCERT_WEB_ENABLED=false` 关闭 Web 静态页面。 +- `[✓]` 桌面核心服务拒绝非法环境变量值,避免带错误配置启动。 + +### 76.2 验证状态 + +- `[✓]` `backend/service` 环境配置专项测试通过。 +- `[!]` 真实 Wails 桌面打包、Windows Service 和 Linux systemd 实机验收仍需在授权目标环境执行。 \ No newline at end of file