lockbox

password manager
Log | Files | Refs | README | LICENSE

commit a17bc6a96a06dc345aa1c0bf1868f60e76e6c6f3
parent c7806f0d0e2ee625e37e7ff2b043349ff377f2cf
Author: Sean Enck <sean@ttypty.com>
Date:   Sun, 21 Jul 2024 21:07:00 -0400

color path should be common for all of lockbox (if needed)

Diffstat:
Minternal/app/totp.go | 22++--------------------
Minternal/config/vars.go | 21+++++++++++++++++++++
Minternal/config/vars_test.go | 28++++++++++++++++++++++++++++
3 files changed, 51 insertions(+), 20 deletions(-)

diff --git a/internal/app/totp.go b/internal/app/totp.go @@ -156,7 +156,7 @@ func (args *TOTPArguments) display(opts TOTPOptions) error { if err != nil { return err } - allowColor, err := canColor() + allowColor, err := config.CanColor() if err != nil { return err } @@ -195,9 +195,7 @@ func (args *TOTPArguments) display(opts TOTPOptions) error { } txt := fmt.Sprintf("%s (%s)", now.Format("15:04:05"), leftString) if isColor { - if _, noColor := os.LookupEnv("NO_COLOR"); !noColor { - txt = fmt.Sprintf("\x1b[31m%s\x1b[39m", txt) - } + txt = fmt.Sprintf("\x1b[31m%s\x1b[39m", txt) } outputs := []string{txt} if !clip { @@ -293,19 +291,3 @@ func NewTOTPArguments(args []string, tokenType string) (*TOTPArguments, error) { } return opts, nil } - -func canColor() (bool, error) { - interactive, err := config.EnvInteractive.Get() - if err != nil { - return false, err - } - colors := interactive - if colors { - isColored, err := config.EnvNoColor.Get() - if err != nil { - return false, err - } - colors = !isColored - } - return colors, nil -} diff --git a/internal/config/vars.go b/internal/config/vars.go @@ -5,6 +5,7 @@ import ( "flag" "fmt" "net/url" + "os" "sort" "strings" "time" @@ -377,3 +378,23 @@ func LoadCompletionProfiles() []CompletionProfile { profiles = append(profiles, CompletionProfile{Clip: true, Write: true, TOTP: true, List: true, Default: true}) return profiles } + +// CanColor indicates if colorized output is allowed (or disabled) +func CanColor() (bool, error) { + if _, noColor := os.LookupEnv("NO_COLOR"); noColor { + return false, nil + } + interactive, err := EnvInteractive.Get() + if err != nil { + return false, err + } + colors := interactive + if colors { + isColored, err := EnvNoColor.Get() + if err != nil { + return false, err + } + colors = !isColored + } + return colors, nil +} diff --git a/internal/config/vars_test.go b/internal/config/vars_test.go @@ -307,3 +307,31 @@ func TestLoadCompletionProfiles(t *testing.T) { } } } + +func TestCanColor(t *testing.T) { + defer os.Clearenv() + os.Clearenv() + if can, _ := config.CanColor(); !can { + t.Error("should be able to color") + } + for raw, expect := range map[string]bool{ + "INTERACTIVE": true, + "NOCOLOR": false, + } { + os.Clearenv() + key := fmt.Sprintf("LOCKBOX_%s", raw) + os.Setenv(key, "yes") + if can, _ := config.CanColor(); can != expect { + t.Errorf("expect != actual: %s", key) + } + os.Setenv(key, "no") + if can, _ := config.CanColor(); can == expect { + t.Errorf("expect == actual: %s", key) + } + } + os.Clearenv() + os.Setenv("NO_COLOR", "1") + if can, _ := config.CanColor(); can { + t.Error("should NOT be able to color") + } +}