54 lines
1.5 KiB
Go
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
|
|
}
|