Skip to content

fix(caddy): 修复 buildOIDCRoutes 传 nil 给值类型形参导致 main 编译失败 - #130

Closed
suantea wants to merge 1 commit into
PIKACHUIM:mainfrom
suantea:fix/caddy-page-login-nil-rule
Closed

suantea wants to merge 1 commit into
PIKACHUIM:mainfrom
suantea:fix/caddy-page-login-nil-rule

Conversation

@suantea

@suantea suantea commented Sep 30, 2026

Copy link
Copy Markdown
Collaborator

问题

main 分支当前编译不过:

service/caddy/manager.go:934:61: cannot use nil as "github.com/netpanel/netpanel/model".AccessRule
    value in argument to m.buildPageLoginRoutes

go build ./... 整个 backend 失败,因此 #125 ~ #129 五个 PR 的 CI 全部处于 UNSTABLE,无法通过门禁。

根因

buildPageLoginRoutes 的形参是值类型 model.AccessRule:

func (m *Manager) buildPageLoginRoutes(hostMatchers []interface{}, mainHandlers []interface{}, rule model.AccessRule) []interface{}

但 buildOIDCRoutes 中 providerID == 0 的分支传了 nil:

providerID := rule.OidcProviderID
if providerID == 0 {
    return m.buildPageLoginRoutes(hostMatchers, mainHandlers, nil)  // ← 编译错误
}

应是函数签名重构(从 *model.CaddySite 改为 model.AccessRule)时遗漏了改这一处调用点。仓库中 buildPageLoginRoutes 有两个调用点,另一个(authMode == "page_login")已正确传 authRule。

修复

providerID := rule.OidcProviderID
if providerID == 0 {
    return m.buildPageLoginRoutes(hostMatchers, mainHandlers, model.AccessRule{})
}

为什么传空值是正确的,不只是「让编译过」

buildPageLoginRoutes 的函数体只用 rule.AllowedUserIDs 一个字段来决定 netpanel_session_auth handler 是否附带 allowed_user_ids:

var allowedIDs []uint
if rule.AllowedUserIDs != "" {
    json.Unmarshal([]byte(rule.AllowedUserIDs), &allowedIDs)
}
if len(allowedIDs) > 0 {
    authHandler["allowed_user_ids"] = allowedIDs
}

model.AccessRule{} 的 AllowedUserIDs 为空 → 不附加 allowed_user_ids → 认证中间件接受任意已启用用户。

这与该分支的语义一致:provider 缺失时本就无法按 provider 限定可登录用户。若改为传 rule(保留原 OidcProviderID == 0 的那条规则),反而会把该规则的 AllowedUserIDs 带入页面登录路径,与「provider 不存在则回退」的设计意图不符。

验证

  • go build ./... 通过
  • go vet ./... 通过
  • go test ./...:仅 service/storage 的 TestValidateRootPath 失败,为上游既有失败,与本 PR 无关(详见下)

关于 TestValidateRootPath

该测试在 macOS 上失败、在 Linux CI 上通过,原因是 macOS 的 t.TempDir() 返回 /var/folders/...,而它是指向 /private/var/folders/... 的符号链接;被测函数 ValidateRootPath 会调 filepath.EvalSymlinks 解析软链(这是刻意设计,用于防止用软链绕过目录校验),而测试拿未解析的 dir 做比较:

got=/private/var/folders/... want=/var/folders/...

未在本 PR 处理——与编译错误无关,且建议单独提 PR 修测试断言(应先 EvalSymlinks(dir) 再比较)。

buildPageLoginRoutes 的形参是 model.AccessRule(值类型),
但 buildOIDCRoutes 的 providerID==0 分支传了 nil:

    cannot use nil as "model.AccessRule" value in argument to
    m.buildPageLoginRoutes

改为传 model.AccessRule{}。该分支语义是「未绑定 OIDC provider,
退回页面跳转登录」,AllowedUserIDs 为空恰好表示不限定可登录用户,
与原意图一致(provider 缺失时本就无法按 provider 限定用户)。

这行是 main 分支上的编译错误,go build ./... 整个 backend 失败,
连带 PIKACHUIM#125~PIKACHUIM#129 五个 PR 的 CI 全部 UNSTABLE。

验证:go build ./... 与 go vet ./... 均通过。
@suantea

suantea commented Sep 30, 2026

Copy link
Copy Markdown
Collaborator Author

CI 修复已合并进 #133(与前端 tslib 修复一起)。

本 PR 的修复是 #133 后端部分的内容,已在 #133 上验证 Backend job 全绿(pass 1m57s)。建议关闭本 PR、直接 review #133,以免同一修复出现在两个 PR 里。

@suantea

suantea commented Sep 30, 2026

Copy link
Copy Markdown
Collaborator Author

Duplicate of #133 — 本 PR 的 Caddy 编译修复已包含在 #133 内并验证 Backend job 转绿

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant