lockbox

password manager
Log | Files | Refs | README | LICENSE

commit e42e21f3cc15e53d7db2fe704365f703f49e2a23
parent e5d68c07d1c4f71e5a4f3039b4963c0d538d3606
Author: Sean Enck <sean@ttypty.com>
Date:   Thu, 27 Jul 2023 19:02:40 -0400

merging definitions into env/var

Diffstat:
Dinternal/inputs/coloring.go | 68--------------------------------------------------------------------
Dinternal/inputs/coloring_test.go | 40----------------------------------------
Minternal/inputs/env.go | 50++++++++++++++++++++++++++++++++++++++++++++++++--
Minternal/inputs/env_test.go | 33+++++++++++++++++++++++++++++++++
Minternal/inputs/vars.go | 4++++
5 files changed, 85 insertions(+), 110 deletions(-)

diff --git a/internal/inputs/coloring.go b/internal/inputs/coloring.go @@ -1,68 +0,0 @@ -// Package inputs handles user inputs/UI elements. -package inputs - -import ( - "errors" - "fmt" - "strconv" - "strings" -) - -const ( - colorWindowDelimiter = "," - colorWindowSpan = ":" -) - -var ( - // TOTPDefaultColorWindow is the default coloring rules for totp - TOTPDefaultColorWindow = []ColorWindow{{Start: 0, End: 5}, {Start: 30, End: 35}} - // TOTPDefaultBetween is the default color window as a string - TOTPDefaultBetween = toString(TOTPDefaultColorWindow) -) - -type ( - // ColorWindow for handling terminal colors based on timing - ColorWindow struct { - Start int - End int - } -) - -func toString(windows []ColorWindow) string { - var results []string - for _, w := range windows { - results = append(results, fmt.Sprintf("%d%s%d", w.Start, colorWindowSpan, w.End)) - } - return strings.Join(results, colorWindowDelimiter) -} - -// ParseColorWindow will handle parsing a window of colors for TOTP operations -func ParseColorWindow(windowString string) ([]ColorWindow, error) { - var rules []ColorWindow - for _, item := range strings.Split(windowString, colorWindowDelimiter) { - line := strings.TrimSpace(item) - if line == "" { - continue - } - parts := strings.Split(line, colorWindowSpan) - 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, ColorWindow{Start: s, End: e}) - } - if len(rules) == 0 { - return nil, errors.New("invalid colorization rules for totp, none found") - } - return rules, nil -} diff --git a/internal/inputs/coloring_test.go b/internal/inputs/coloring_test.go @@ -1,40 +0,0 @@ -package inputs_test - -import ( - "testing" - - "github.com/enckse/lockbox/internal/inputs" -) - -func TestParseWindows(t *testing.T) { - if _, err := inputs.ParseColorWindow(""); err.Error() != "invalid colorization rules for totp, none found" { - t.Errorf("invalid error: %v", err) - } - if _, err := inputs.ParseColorWindow(",2"); err.Error() != "invalid colorization rule found: 2" { - t.Errorf("invalid error: %v", err) - } - if _, err := inputs.ParseColorWindow(",1:200"); err.Error() != "invalid time found for colorization rule: 1:200" { - t.Errorf("invalid error: %v", err) - } - if _, err := inputs.ParseColorWindow(",1:-1"); err.Error() != "invalid time found for colorization rule: 1:-1" { - t.Errorf("invalid error: %v", err) - } - if _, err := inputs.ParseColorWindow(",200:1"); err.Error() != "invalid time found for colorization rule: 200:1" { - t.Errorf("invalid error: %v", err) - } - if _, err := inputs.ParseColorWindow(",-1:1"); err.Error() != "invalid time found for colorization rule: -1:1" { - t.Errorf("invalid error: %v", err) - } - if _, err := inputs.ParseColorWindow(",2:1"); err.Error() != "invalid time found for colorization rule: 2:1" { - t.Errorf("invalid error: %v", err) - } - if _, err := inputs.ParseColorWindow(",xxx:1"); err.Error() != "strconv.Atoi: parsing \"xxx\": invalid syntax" { - t.Errorf("invalid error: %v", err) - } - if _, err := inputs.ParseColorWindow(",1:xxx"); err.Error() != "strconv.Atoi: parsing \"xxx\": invalid syntax" { - t.Errorf("invalid error: %v", err) - } - if _, err := inputs.ParseColorWindow(",1:2,11:22"); err != nil { - t.Errorf("invalid error: %v", err) - } -} diff --git a/internal/inputs/env.go b/internal/inputs/env.go @@ -13,8 +13,10 @@ import ( ) const ( - yes = "yes" - no = "no" + colorWindowDelimiter = "," + colorWindowSpan = ":" + yes = "yes" + no = "no" // MacOSPlatform is the macos indicator for platform MacOSPlatform = "macos" // LinuxWaylandPlatform for linux+wayland @@ -72,6 +74,11 @@ type ( values() (string, []string) self() environmentBase } + // ColorWindow for handling terminal colors based on timing + ColorWindow struct { + Start int + End int + } ) func shlex(in string) ([]string, error) { @@ -233,3 +240,42 @@ func NewPlatform() (SystemPlatform, error) { } return unknownPlatform, errors.New("unable to detect clipboard mode") } + +func toString(windows []ColorWindow) string { + var results []string + for _, w := range windows { + results = append(results, fmt.Sprintf("%d%s%d", w.Start, colorWindowSpan, w.End)) + } + return strings.Join(results, colorWindowDelimiter) +} + +// ParseColorWindow will handle parsing a window of colors for TOTP operations +func ParseColorWindow(windowString string) ([]ColorWindow, error) { + var rules []ColorWindow + for _, item := range strings.Split(windowString, colorWindowDelimiter) { + line := strings.TrimSpace(item) + if line == "" { + continue + } + parts := strings.Split(line, colorWindowSpan) + 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, ColorWindow{Start: s, End: e}) + } + if len(rules) == 0 { + return nil, errors.New("invalid colorization rules for totp, none found") + } + return rules, nil +} diff --git a/internal/inputs/env_test.go b/internal/inputs/env_test.go @@ -49,3 +49,36 @@ func TestNewPlatformUnknown(t *testing.T) { t.Errorf("error expected for platform: %v", err) } } + +func TestParseWindows(t *testing.T) { + if _, err := inputs.ParseColorWindow(""); err.Error() != "invalid colorization rules for totp, none found" { + t.Errorf("invalid error: %v", err) + } + if _, err := inputs.ParseColorWindow(",2"); err.Error() != "invalid colorization rule found: 2" { + t.Errorf("invalid error: %v", err) + } + if _, err := inputs.ParseColorWindow(",1:200"); err.Error() != "invalid time found for colorization rule: 1:200" { + t.Errorf("invalid error: %v", err) + } + if _, err := inputs.ParseColorWindow(",1:-1"); err.Error() != "invalid time found for colorization rule: 1:-1" { + t.Errorf("invalid error: %v", err) + } + if _, err := inputs.ParseColorWindow(",200:1"); err.Error() != "invalid time found for colorization rule: 200:1" { + t.Errorf("invalid error: %v", err) + } + if _, err := inputs.ParseColorWindow(",-1:1"); err.Error() != "invalid time found for colorization rule: -1:1" { + t.Errorf("invalid error: %v", err) + } + if _, err := inputs.ParseColorWindow(",2:1"); err.Error() != "invalid time found for colorization rule: 2:1" { + t.Errorf("invalid error: %v", err) + } + if _, err := inputs.ParseColorWindow(",xxx:1"); err.Error() != "strconv.Atoi: parsing \"xxx\": invalid syntax" { + t.Errorf("invalid error: %v", err) + } + if _, err := inputs.ParseColorWindow(",1:xxx"); err.Error() != "strconv.Atoi: parsing \"xxx\": invalid syntax" { + t.Errorf("invalid error: %v", err) + } + if _, err := inputs.ParseColorWindow(",1:2,11:22"); err != nil { + t.Errorf("invalid error: %v", err) + } +} diff --git a/internal/inputs/vars.go b/internal/inputs/vars.go @@ -32,6 +32,10 @@ const ( ) var ( + // TOTPDefaultColorWindow is the default coloring rules for totp + TOTPDefaultColorWindow = []ColorWindow{{Start: 0, End: 5}, {Start: 30, End: 35}} + // TOTPDefaultBetween is the default color window as a string + TOTPDefaultBetween = toString(TOTPDefaultColorWindow) // EnvClipMax gets the maximum clipboard time EnvClipMax = EnvironmentInt{environmentBase: environmentBase{key: clipBaseEnv + "MAX", desc: "override the amount of time before totp clears the clipboard (e.g. 10),\nmust be an integer"}, shortDesc: "clipboard max time", allowZero: false, defaultValue: 45} // EnvHashLength handles the hashing output length