From 67cafcff59f29ce6b069b53ee5718d6359868b5b Mon Sep 17 00:00:00 2001 From: ceo Date: Thu, 10 Sep 2026 10:30:46 +0800 Subject: [PATCH] =?UTF-8?q?cmd/xcheck=EF=BC=9A=E5=B8=B3=E8=99=9F=E6=94=B9?= =?UTF-8?q?=E7=94=B1=20/user=20API=20=E5=8F=96=E5=BE=97=EF=BC=8C=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=20USERNAME=20=E9=A0=90=E8=A8=AD=20ceo=EF=BC=88?= =?UTF-8?q?=E5=AF=A9=E6=A0=B8=E6=84=8F=E8=A6=8B=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 依 #12 第二輪審核意見:xcheck 原以 USERNAME 環境變數取帳號、 未設時靜默退回 ceo,與 gitea.py find_stalled_work 的 get_current_username()(打 /user 取 token 實際帳號)不同源。 非 ceo 帳號跑 xcheck 時催促冷卻會以錯誤身分套用,造成漏掃, 兩版輸出表面位元組相同實則基準錯誤。 改法:apiSource 新增 CurrentUser(),呼叫 /user 並依 username → login 取值;失敗或取不到帳號即報錯退出, 不靜默退回任何預設。移除 USERNAME 環境變數與 ceo fallback。 驗證:go build/go vet/go test 全綠(16 個測試函式); USERNAME 未設下 xcheck 與 gitea.py stalled 並行交叉驗證, 輸出位元組相同(1749B cmp IDENTICAL)。 --- cmd/xcheck/main.go | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/cmd/xcheck/main.go b/cmd/xcheck/main.go index f7af081..9c8dd8c 100644 --- a/cmd/xcheck/main.go +++ b/cmd/xcheck/main.go @@ -96,6 +96,26 @@ func (s *apiSource) listAll(path string, params map[string]string, out any) erro return json.Unmarshal([]byte(b.String()), out) } +// CurrentUser 以 token 呼叫 /user 取實際帳號,與 gitea.py 的 +// get_current_username() 同源(token 決定帳號,不接受環境變數覆寫, +// 失敗即報錯退出,不靜默退回預設值)。 +func (s *apiSource) CurrentUser() (string, error) { + var user struct { + Username string `json:"username"` + Login string `json:"login"` + } + if err := s.getJSON("user", nil, &user); err != nil { + return "", err + } + if user.Username != "" { + return user.Username, nil + } + if user.Login != "" { + return user.Login, nil + } + return "", fmt.Errorf("無法從 Gitea API /user 取得目前帳號") +} + func (s *apiSource) MyOrganizations() ([]string, error) { var orgs []struct { Username string `json:"username"` @@ -202,14 +222,15 @@ func main() { token: token, hc: &http.Client{Timeout: 30 * time.Second}, } - username := os.Getenv("USERNAME") - if username == "" { - username = "ceo" + username, err := src.CurrentUser() + if err != nil { + fmt.Fprintln(os.Stderr, "CurrentUser:", err) + os.Exit(1) } hours := 4.0 - items, err := workflow.ScanStalled(src, username, hours, time.Now()) - if err != nil { - fmt.Fprintln(os.Stderr, "ScanStalled:", err) + items, scanErr := workflow.ScanStalled(src, username, hours, time.Now()) + if scanErr != nil { + fmt.Fprintln(os.Stderr, "ScanStalled:", scanErr) os.Exit(1) } // json.Marshal* 會把 <、>、& 轉義成 \u003c 等(含自訂 MarshalJSON 的輸出),