hugin/cli/internal/keystore/keystore.go
2026-10-27 08:33:21 +01:00

54 lines
1.5 KiB
Go

// Package keystore verwaltet den Key für den Hugin-Server: zuerst die
// Umgebungsvariable HUGIN_KEY, sonst der Schlüsselbund des Betriebssystems.
package keystore
import (
"errors"
"fmt"
"os"
"strings"
"github.com/zalando/go-keyring"
)
const (
Env = "HUGIN_KEY"
ServerEnv = "HUGIN_SERVER"
service = "hugin"
)
func normalize(server string) string {
return strings.ToLower(strings.TrimRight(strings.TrimSpace(server), "/"))
}
var ErrNoKey = errors.New("kein Key: hugin login aufrufen oder HUGIN_KEY setzen")
// Get liefert den Key für server.
//
// Ein Key aus HUGIN_KEY gilt für jeden Server; in CI kommt server aber aus der
// eingecheckten .hugin.yaml, die ein Pull Request ändern kann. Ist HUGIN_SERVER
// gesetzt, geht der Key deshalb nur an diesen Server. Im Schlüsselbund ist der
// Key ohnehin an die Adresse gebunden.
func Get(server string) (string, error) {
if key := os.Getenv(Env); key != "" {
if fixed := os.Getenv(ServerEnv); fixed != "" && normalize(fixed) != normalize(server) {
return "", fmt.Errorf("Server %s weicht von %s=%s ab; %s wird nicht gesendet", server, ServerEnv, fixed, Env)
}
return key, nil
}
key, err := keyring.Get(service, server)
if errors.Is(err, keyring.ErrNotFound) {
return "", ErrNoKey
}
return key, err
}
func Save(server, key string) error { return keyring.Set(service, server, key) }
func Delete(server string) error {
err := keyring.Delete(service, server)
if errors.Is(err, keyring.ErrNotFound) {
return nil
}
return err
}