lockbox

password manager
Log | Files | Refs | README | LICENSE

commit 10950880f4b5dd7928e2bc866c96d94448464c20
parent 75c9378d9f58f9ec009a946758d716a9a2d96007
Author: Sean Enck <sean@ttypty.com>
Date:   Wed,  3 Aug 2022 18:20:49 -0400

support coloring totp outputs via vars

Diffstat:
Mcmd/lb-totp/main.go | 57++++++++++++++++++++++++++++++++++++++++++++++++++++++---
Minternal/inputs/env.go | 2++
2 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/cmd/lb-totp/main.go b/cmd/lb-totp/main.go @@ -7,6 +7,7 @@ import ( "os/exec" "path/filepath" "sort" + "strconv" "strings" "time" @@ -24,6 +25,13 @@ var ( mainExe = "" ) +type ( + colorWhen struct { + start int + end int + } +) + func clear() { cmd := exec.Command("clear") cmd.Stdout = os.Stdout @@ -36,6 +44,43 @@ func totpEnv() string { return inputs.EnvOrDefault(inputs.TotpEnv, "totp") } +func colorWhenRules() ([]colorWhen, error) { + envTime := os.Getenv(inputs.ColorBetweenEnv) + if envTime == "" { + return []colorWhen{ + colorWhen{start: 0, end: 5}, + colorWhen{start: 30, end: 35}, + }, nil + } + var rules []colorWhen + for _, item := range strings.Split(envTime, ",") { + line := strings.TrimSpace(item) + if line == "" { + continue + } + parts := strings.Split(line, ":") + if len(parts) != 2 { + return nil, fmt.Errorf("invalid colorization rule found: %s", line) + } + s, err := strconv.Atoi(parts[0]) + if err != nil { + return nil, err + } + e, err := strconv.Atoi(parts[1]) + if err != nil { + return nil, err + } + if s < 0 || e < 0 || e < s || s > 59 || e > 59 { + return nil, fmt.Errorf("invalid time found for colorization rule: %s", line) + } + rules = append(rules, colorWhen{start: s, end: e}) + } + if len(rules) == 0 { + return nil, errors.New("invalid colorization rules for totp, none found") + } + return rules, nil +} + func display(token string, args cli.Arguments) error { interactive, err := inputs.IsInteractive() if err != nil { @@ -86,6 +131,10 @@ func display(token string, args cli.Arguments) error { misc.Die("invalid clipboard", err) } } + colorRules, err := colorWhenRules() + if err != nil { + misc.Die("invalid totp output coloring rules", err) + } for { if !first { time.Sleep(500 * time.Millisecond) @@ -109,9 +158,11 @@ func display(token string, args cli.Arguments) error { } startColor := "" endColor := "" - if left < 5 || (left < 35 && left >= 30) { - startColor = coloring.Start - endColor = coloring.End + for _, when := range colorRules { + if left < when.end && left >= when.start { + startColor = coloring.Start + endColor = coloring.End + } } leftString := fmt.Sprintf("%d", left) if len(leftString) < 2 { diff --git a/internal/inputs/env.go b/internal/inputs/env.go @@ -29,6 +29,8 @@ const ( StoreEnv = prefixKey + "STORE" // ClipMaxEnv is the max time a value should be stored in the clipboard. ClipMaxEnv = prefixKey + "CLIPMAX" + // ColorBetweenEnv is a comma-delimited list of times to color totp outputs (e.g. 0:5,30:35 which is the default). + ColorBetweenEnv = prefixKey + "TOTPBETWEEN" ) // EnvOrDefault will get the environment value OR default if env is not set.