Files
2026-10-08 00:33:27 +08:00

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()
}