cmd/xcheck:帳號改由 /user API 取得,移除 USERNAME 預設 ceo(審核意見)
依 #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)。
This commit is contained in:
+27
-6
@@ -96,6 +96,26 @@ func (s *apiSource) listAll(path string, params map[string]string, out any) erro
|
|||||||
return json.Unmarshal([]byte(b.String()), out)
|
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) {
|
func (s *apiSource) MyOrganizations() ([]string, error) {
|
||||||
var orgs []struct {
|
var orgs []struct {
|
||||||
Username string `json:"username"`
|
Username string `json:"username"`
|
||||||
@@ -202,14 +222,15 @@ func main() {
|
|||||||
token: token,
|
token: token,
|
||||||
hc: &http.Client{Timeout: 30 * time.Second},
|
hc: &http.Client{Timeout: 30 * time.Second},
|
||||||
}
|
}
|
||||||
username := os.Getenv("USERNAME")
|
username, err := src.CurrentUser()
|
||||||
if username == "" {
|
if err != nil {
|
||||||
username = "ceo"
|
fmt.Fprintln(os.Stderr, "CurrentUser:", err)
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
hours := 4.0
|
hours := 4.0
|
||||||
items, err := workflow.ScanStalled(src, username, hours, time.Now())
|
items, scanErr := workflow.ScanStalled(src, username, hours, time.Now())
|
||||||
if err != nil {
|
if scanErr != nil {
|
||||||
fmt.Fprintln(os.Stderr, "ScanStalled:", err)
|
fmt.Fprintln(os.Stderr, "ScanStalled:", scanErr)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
// json.Marshal* 會把 <、>、& 轉義成 \u003c 等(含自訂 MarshalJSON 的輸出),
|
// json.Marshal* 會把 <、>、& 轉義成 \u003c 等(含自訂 MarshalJSON 的輸出),
|
||||||
|
|||||||
Reference in New Issue
Block a user