CI / verify (push) Canceled after 0s
- frps.toml 同源配置预览泄露明文密钥:FRPSServerConfig(对外预览入口)改为走 maskFRPSSecrets,auth.token / auth.oidc.clientSecret 的值换成 ********(键名与结构保留、注释行不动);下发路径 PushFRPSConfigToAgent 与安装流程仍用未脱敏内容。弹窗补说明,「复制」改「复制(已脱敏)」 - agent 0.12.4:frps 日志 6 行 → 最近 20 行、最新在最上面;日期由 short-iso 的 2026-09-22T18:43:34+08:00 RainYun-XXX 重写为 2026-09-22 18:43:34 进程: 消息(去掉 T 分隔、时区偏移与每行重复的主机名),frps/action 失败日志一并统一 - 日志界面:FRP 日志「来源」列由 Go 源码文件名(client/control.go:174)改为中文模块名;规则详情「日志」页签倒序;「公网服务端」弹窗改为显示 VPS 上的 frps 服务日志 - 测试:maskFRPSSecrets 脱敏(明文不出现、非敏感行不误伤)与注释行不改写;gofmt / go build / go vet / go test / vue-tsc / vite build 全绿 - AgentVersion 0.12.2 → 0.12.4,双架构内嵌二进制已重编:需在 VPS 上点一次「升级 Agent」才生效
44 lines
1.3 KiB
Go
44 lines
1.3 KiB
Go
package frp
|
||
|
||
import (
|
||
"strings"
|
||
"testing"
|
||
)
|
||
|
||
// frps.toml 的预览(FRPSServerConfig 返回的内容)绝不能带明文密钥:
|
||
// 拉到的内容会直接渲染在浏览器的「即将下发的内容」里。
|
||
func TestMaskFRPSSecrets(t *testing.T) {
|
||
content := strings.Join([]string{
|
||
`bindPort = 7000`,
|
||
`auth.method = "token"`,
|
||
`auth.token = "s3cr3t-token"`,
|
||
`auth.oidc.clientSecret = "s3cr3t-oidc"`,
|
||
`# auth.token = "注释里的示例不应受影响"`,
|
||
`webServer.addr = "0.0.0.0"`,
|
||
}, "\n")
|
||
|
||
masked := maskFRPSSecrets(content)
|
||
if strings.Contains(masked, "s3cr3t-token") || strings.Contains(masked, "s3cr3t-oidc") {
|
||
t.Fatalf("预览里仍能看到明文密钥:\n%s", masked)
|
||
}
|
||
for _, expected := range []string{
|
||
`auth.token = "********"`,
|
||
`auth.oidc.clientSecret = "********"`,
|
||
`bindPort = 7000`,
|
||
`auth.method = "token"`,
|
||
`webServer.addr = "0.0.0.0"`,
|
||
} {
|
||
if !strings.Contains(masked, expected) {
|
||
t.Fatalf("脱敏后缺少 %q:\n%s", expected, masked)
|
||
}
|
||
}
|
||
}
|
||
|
||
// 注释行不是生效配置,不参与脱敏(保持模板原样)
|
||
func TestMaskFRPSSecretsKeepsComments(t *testing.T) {
|
||
content := `# auth.token = "说明文字"`
|
||
if got := maskFRPSSecrets(content); got != content {
|
||
t.Fatalf("注释行被改写:%q", got)
|
||
}
|
||
}
|