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