commit 82890f9c53306267bc98e3d7bc6a08c7f8a26313
parent 9c347498bcd14e70bc25b18bd028d64f39d1e06c
Author: Sean Enck <sean@ttypty.com>
Date: Mon, 11 Oct 2021 18:01:54 -0400
disable interactive mode
Diffstat:
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