mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-10-27 01:53:28 +08:00
44 lines
1.2 KiB
Go
44 lines
1.2 KiB
Go
// Package githubauth provides shared GitHub API credentials.
|
|
package githubauth
|
|
|
|
import (
|
|
"net/url"
|
|
"os"
|
|
"strings"
|
|
"sync/atomic"
|
|
)
|
|
|
|
var configuredToken atomic.Pointer[string]
|
|
|
|
// SetToken replaces the global configured token, including clearing it on reload.
|
|
func SetToken(token string) {
|
|
token = strings.TrimSpace(token)
|
|
configuredToken.Store(&token)
|
|
}
|
|
|
|
// ResolveToken prefers the server configuration, then the legacy environment settings.
|
|
func ResolveToken() string {
|
|
if token := configuredToken.Load(); token != nil && *token != "" {
|
|
return *token
|
|
}
|
|
for _, name := range []string{"GITHUB_TOKEN", "github_token"} {
|
|
if token := strings.TrimSpace(os.Getenv(name)); token != "" {
|
|
return token
|
|
}
|
|
}
|
|
gitURL := strings.ToLower(strings.TrimSpace(os.Getenv("GITSTORE_GIT_URL")))
|
|
if !strings.Contains(gitURL, "github.com") {
|
|
return ""
|
|
}
|
|
return strings.TrimSpace(os.Getenv("GITSTORE_GIT_TOKEN"))
|
|
}
|
|
|
|
// TokenForURL never exposes the shared credential outside the HTTPS GitHub API.
|
|
func TokenForURL(rawURL string) string {
|
|
u, err := url.Parse(rawURL)
|
|
if err != nil || !strings.EqualFold(u.Scheme, "https") || !strings.EqualFold(u.Hostname(), "api.github.com") || u.User != nil || (u.Port() != "" && u.Port() != "443") {
|
|
return ""
|
|
}
|
|
return ResolveToken()
|
|
}
|