gitlink-cli/internal/auth/token_store.go

90 lines
1.8 KiB
Go

package auth
import (
"os"
"path/filepath"
"runtime"
"github.com/zalando/go-keyring"
)
const (
keyringService = "gitlink-cli"
keyringUser = "default"
)
func StoreToken(token string) error {
err := keyring.Set(keyringService, keyringUser, token)
if err != nil {
// Fallback to file-based storage
return storeTokenFile(token)
}
return nil
}
func LoadToken() (string, error) {
token, err := keyring.Get(keyringService, keyringUser)
if err != nil {
// Fallback to file-based storage
return loadTokenFile()
}
return token, nil
}
func DeleteToken() error {
err := keyring.Delete(keyringService, keyringUser)
if err != nil {
return deleteTokenFile()
}
return nil
}
// File-based fallback
func credentialPath() string {
return filepath.Join(configDir(), "credentials")
}
func configDir() string {
if dir := os.Getenv("GITLINK_CONFIG_DIR"); dir != "" {
return dir
}
switch runtime.GOOS {
case "windows":
if appData := os.Getenv("APPDATA"); appData != "" {
return filepath.Join(appData, "gitlink-cli")
}
home, _ := os.UserHomeDir()
return filepath.Join(home, "AppData", "Roaming", "gitlink-cli")
case "darwin":
home, _ := os.UserHomeDir()
return filepath.Join(home, "Library", "Application Support", "gitlink-cli")
default:
if xdg := os.Getenv("XDG_CONFIG_HOME"); xdg != "" {
return filepath.Join(xdg, "gitlink-cli")
}
home, _ := os.UserHomeDir()
return filepath.Join(home, ".config", "gitlink-cli")
}
}
func storeTokenFile(token string) error {
p := credentialPath()
if err := os.MkdirAll(filepath.Dir(p), 0700); err != nil {
return err
}
return os.WriteFile(p, []byte(token), 0600)
}
func loadTokenFile() (string, error) {
data, err := os.ReadFile(credentialPath())
if err != nil {
return "", err
}
return string(data), nil
}
func deleteTokenFile() error {
return os.Remove(credentialPath())
}