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:
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.