lockbox

password manager
Log | Files | Refs | README | LICENSE

commit 82890f9c53306267bc98e3d7bc6a08c7f8a26313
parent 9c347498bcd14e70bc25b18bd028d64f39d1e06c
Author: Sean Enck <sean@ttypty.com>
Date:   Mon, 11 Oct 2021 18:01:54 -0400

disable interactive mode

Diffstat:
Mcmd/lb-totp/main.go | 21++++++++++++++++++---
Minternal/utils.go | 37++++++++++++++++++++++++++++++++++---
Mtests/expected.log | 2+-
Mtests/run.sh | 4++--
4 files changed, 55 insertions(+), 9 deletions(-)

diff --git a/cmd/lb-totp/main.go b/cmd/lb-totp/main.go @@ -46,6 +46,13 @@ func clear() { } func display(token string, clip bool) error { + interactive, err := internal.IsInteractive() + if err != nil { + return err + } + if !interactive && clip { + return internal.NewLockboxError("clipboard not available in non-interactive mode") + } redStart, redEnd, err := internal.GetColor(internal.ColorRed) if err != nil { return err @@ -63,13 +70,21 @@ func display(token string, clip bool) error { if err != nil { return err } - if !clip { - clear() - } totpToken := string(val) + if !interactive { + code, err := otp.GenerateCode(totpToken, time.Now()) + if err != nil { + return err + } + fmt.Println(code) + return nil + } first := true running := 0 lastSecond := -1 + if !clip { + clear() + } for { if !first { time.Sleep(500 * time.Millisecond) diff --git a/internal/utils.go b/internal/utils.go @@ -26,15 +26,46 @@ const ( ColorRed = iota ) +func isYesNoEnv(defaultValue bool, env string) (bool, error) { + value := strings.ToLower(strings.TrimSpace(os.Getenv(env))) + if len(value) == 0 { + return defaultValue, nil + } + switch value { + case "no": + return false, nil + case "yes": + return true, nil + } + return false, NewLockboxError(fmt.Sprintf("invalid yes/no env value for %s", env)) +} + +// IsInteractive indicates if running as a user UI experience. +func IsInteractive() (bool, error) { + return isYesNoEnv(true, "LOCKBOX_INTERACTIVE") +} + // GetColor will retrieve start/end terminal coloration indicators. func GetColor(color Color) (string, string, error) { if color != ColorRed { return "", "", NewLockboxError("bad color") } - if os.Getenv("LOCKBOX_NOCOLOR") == "yes" { - return "", "", nil + interactive, err := IsInteractive() + if err != nil { + return "", "", err + } + colors := interactive + if colors { + isColored, err := isYesNoEnv(false, "LOCKBOX_NOCOLOR") + if err != nil { + return "", "", err + } + colors = isColored + } + if colors { + return termBeginRed, termEndRed, nil } - return termBeginRed, termEndRed, nil + return "", "", nil } // GetStore gets the lockbox directory. diff --git a/tests/expected.log b/tests/expected.log @@ -22,7 +22,7 @@ test3 test4 test -test +XXXXXX [ { "entry": "keys/one2", diff --git a/tests/run.sh b/tests/run.sh @@ -5,7 +5,7 @@ TESTS="$PWD/bin" export LOCKBOX_STORE="$TESTS/lb" export LOCKBOX_KEYMODE="plaintext" export LOCKBOX_TOTP="totp" -export LOCKBOX_NOCOLOR="yes" +export LOCKBOX_INTERACTIVE="no" export PWGEN_SOURCE="$PWD" export PWGEN_SPECIAL="u" export PWGEN_SED="s/[[:alnum:]]/u/g;s/\./u/g" @@ -36,7 +36,7 @@ _run() { $BIN/lb show keys2/three echo "5ae472abqdekjqykoyxk7hvc2leklq5n" | $BIN/lb insert totp/test $BIN/lb-totp ls - $BIN/lb-totp test | head -3 | tail -n 1 + $BIN/lb-totp test | tr '[:digit:]' 'XXXXXX' $BIN/lb-stats keys/one $BIN/lb-diff bin/lb/keys/one.lb bin/lb/keys/one2.lb yes 2>/dev/null | $BIN/lb rm keys2/three