Files
goget/internal/auth/basic.go
T

77 lines
1.8 KiB
Go
Raw Normal View History

//go:build linux || freebsd
// +build linux freebsd
package auth
import (
"encoding/base64"
"net/http"
"net/url"
"strings"
)
// BasicAuth adds Basic Authentication header to the request
func BasicAuth(req *http.Request, username, password string) {
if username == "" {
return
}
auth := username + ":" + password
encoded := base64.StdEncoding.EncodeToString([]byte(auth))
req.Header.Set("Authorization", "Basic "+encoded)
}
// ParseURLAuth extracts username/password from URL (https://user:pass@host)
func ParseURLAuth(u *url.URL) (username, password string, hasAuth bool) {
if u == nil || u.User == nil {
return "", "", false
}
username = u.User.Username()
if username == "" {
return "", "", false
}
password, hasAuth = u.User.Password()
return username, password, true
}
// StripAuthFromURL removes credentials from URL for safe logging
func StripAuthFromURL(u *url.URL) *url.URL {
if u == nil {
return nil
}
// Clone URL to avoid modifying original
clean := *u
clean.User = nil
return &clean
}
// MaskPassword returns a masked version of the password for logging
func MaskPassword(password string) string {
if password == "" {
return ""
}
if len(password) <= 4 {
return "****"
}
return password[:2] + strings.Repeat("*", len(password)-2)
}
// GetAuthForURL gets credentials for a given URL (priority: CLI > URL > config)
func GetAuthForURL(cliUsername, cliPassword, configUsername, configPassword string, u *url.URL) (username, password string) {
// 1. CLI flags have highest priority
if cliUsername != "" {
return cliUsername, cliPassword
}
// 2. URL-embedded credentials
if urlUser, urlPass, ok := ParseURLAuth(u); ok {
return urlUser, urlPass
}
// 3. Config file credentials
if configUsername != "" {
return configUsername, configPassword
}
return "", ""
}