goldwarden-vaultwarden-bitw.../cli/agent/systemauth/pinentry/go-pinentry.go

84 lines
1.8 KiB
Go

//go:build freebsd || linux || darwin
package pinentry
import (
"errors"
"runtime"
"github.com/twpayne/go-pinentry"
)
func getBinaryClientOption() (clientOption pinentry.ClientOption) {
binaryClientOption := pinentry.WithBinaryNameFromGnuPGAgentConf()
if runtime.GOOS == "darwin" {
binaryClientOption = pinentry.WithBinaryName("pinentry-mac")
}
return binaryClientOption
}
func getPassword(title string, description string) (string, error) {
binaryClientOption := getBinaryClientOption()
client, err := pinentry.NewClient(
binaryClientOption,
pinentry.WithGPGTTY(),
pinentry.WithTitle(title),
pinentry.WithDesc(description),
pinentry.WithPrompt(title),
)
log.Info("Asking for pin |%s|%s|", title, description)
if err != nil {
return "", err
}
defer client.Close()
switch pin, fromCache, err := client.GetPIN(); {
case pinentry.IsCancelled(err):
log.Info("Cancelled")
return "", errors.New("Cancelled")
case err != nil:
return "", err
case fromCache:
log.Info("Got pin from cache")
return pin, nil
default:
log.Info("Got pin from user")
return pin, nil
}
}
func getApproval(title string, description string) (bool, error) {
if systemAuthDisabled {
return true, nil
}
binaryClientOption := getBinaryClientOption()
client, err := pinentry.NewClient(
binaryClientOption,
pinentry.WithGPGTTY(),
pinentry.WithTitle(title),
pinentry.WithDesc(description),
pinentry.WithPrompt(title),
)
log.Info("Asking for approval |%s|%s|", title, description)
if err != nil {
return false, err
}
defer client.Close()
switch _, err := client.Confirm("Confirm"); {
case pinentry.IsCancelled(err):
log.Info("Cancelled")
return false, errors.New("Cancelled")
case err != nil:
return false, err
default:
log.Info("Got approval from user")
return true, nil
}
}