// 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 }