From 0e1f97ee0398e02d086b6da28f7317610801f0b8 Mon Sep 17 00:00:00 2001 From: will Date: Thu, 13 Aug 2026 15:32:40 +0900 Subject: [PATCH] fix(security): remove hardcoded Gitea token from xbctl binary Token now read from credentials.env (GITEA_TOKEN key) at runtime, with fallback to GITEA_TOKEN environment variable. --- cmd/xbctl/main.go | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/cmd/xbctl/main.go b/cmd/xbctl/main.go index 6d38a99..8f7bb8c 100644 --- a/cmd/xbctl/main.go +++ b/cmd/xbctl/main.go @@ -31,7 +31,6 @@ const ( serviceFilePath = "/etc/systemd/system/xboard-node.service" defaultInstallRoot = "/etc/xboard-node" downloadBase = "https://gitea.fp-will.xyz/will/xboard-node" - downloadToken = "cf6634b57d2c60c66030dbb29d77c4ed25370e94" ) var ( @@ -598,14 +597,28 @@ func resolveDownloadURL(artifact, version string) string { return downloadBase + "/releases/download/" + version + "/" + artifact } +// readDownloadToken returns the Gitea API token for downloading release assets. +// Lookup order: GITEA_TOKEN in credentials.env, then GITEA_TOKEN env var. +func readDownloadToken() string { + if data, err := os.ReadFile(defaultCredentialsPath); err == nil { + for _, line := range strings.Split(string(data), "\n") { + line = strings.TrimSpace(line) + if k, v, ok := strings.Cut(line, "="); ok && k == "GITEA_TOKEN" { + return v + } + } + } + return os.Getenv("GITEA_TOKEN") +} + func downloadFile(url, dest string) error { client := &http.Client{Timeout: 120 * time.Second} req, err := http.NewRequest("GET", url, nil) if err != nil { return err } - if downloadToken != "" { - req.Header.Set("Authorization", "token "+downloadToken) + if tok := readDownloadToken(); tok != "" { + req.Header.Set("Authorization", "token "+tok) } resp, err := client.Do(req) if err != nil {