lockbox

password manager
Log | Files | Refs | README | LICENSE

commit 76c289333893fc7e32d534999d89f2942025f278
parent 4621884e95ad9aa32753edf5b3d57642fe3230a7
Author: Sean Enck <sean@ttypty.com>
Date:   Mon, 27 Mar 2023 21:50:21 -0400

update totp option handling

Diffstat:
Mcmd/main.go | 14+-------------
Minternal/totp/core.go | 30+++++++++++++++++++++++++-----
Minternal/totp/core_test.go | 51++++++++++++++++++---------------------------------
3 files changed, 44 insertions(+), 51 deletions(-)

diff --git a/cmd/main.go b/cmd/main.go @@ -95,11 +95,7 @@ func run() error { p.SetArgs(args.Entry) return app.Insert(p, app.TOTPInsert) } - opts := totp.Options{App: p} - opts.Clear = clear - opts.IsNoTOTP = inputs.IsNoTOTP - opts.IsInteractive = inputs.IsInteractive - return args.Do(opts) + return args.Do(totp.NewDefaultOptions(p)) default: return fmt.Errorf("unknown command: %s", command) } @@ -134,11 +130,3 @@ func clearClipboard() error { } return clipboard.CopyTo("") } - -func clear() { - cmd := exec.Command("clear") - cmd.Stdout = os.Stdout - if err := cmd.Run(); err != nil { - fmt.Printf("unable to clear screen: %v\n", err) - } -} diff --git a/internal/totp/core.go b/internal/totp/core.go @@ -4,6 +4,8 @@ package totp import ( "errors" "fmt" + "os" + "os/exec" "strconv" "strings" "time" @@ -40,7 +42,7 @@ type ( } // Options are TOTP call options Options struct { - App app.CommandOptions + app app.CommandOptions Clear func() IsNoTOTP func() (bool, error) IsInteractive func() (bool, error) @@ -64,6 +66,24 @@ const ( OnceMode ) +// NewDefaultOptions gets the default option set +func NewDefaultOptions(app app.CommandOptions) Options { + return Options{ + app: app, + Clear: clear, + IsInteractive: inputs.IsInteractive, + IsNoTOTP: inputs.IsNoTOTP, + } +} + +func clear() { + cmd := exec.Command("clear") + cmd.Stdout = os.Stdout + if err := cmd.Run(); err != nil { + fmt.Printf("unable to clear screen: %v\n", err) + } +} + func colorWhenRules() ([]inputs.ColorWindow, error) { envTime := inputs.EnvOrDefault(inputs.ColorBetweenEnv, inputs.TOTPDefaultBetween) if envTime == inputs.TOTPDefaultBetween { @@ -93,7 +113,7 @@ func (args *Arguments) display(opts Options) error { if err != nil { return err } - entity, err := opts.App.Transaction().Get(backend.NewPath(args.Entry, args.token), backend.SecretValue) + entity, err := opts.app.Transaction().Get(backend.NewPath(args.Entry, args.token), backend.SecretValue) if err != nil { return err } @@ -111,7 +131,7 @@ func (args *Arguments) display(opts Options) error { wrapper.opts.Digits = k.Digits() wrapper.opts.Algorithm = k.Algorithm() wrapper.opts.Period = uint(k.Period()) - writer := opts.App.Writer() + writer := opts.app.Writer() if !interactive { code, err := wrapper.generateCode() if err != nil { @@ -214,11 +234,11 @@ func (args *Arguments) Do(opts Options) error { return ErrNoTOTP } if args.Mode == ListMode { - e, err := opts.App.Transaction().QueryCallback(backend.QueryOptions{Mode: backend.SuffixMode, Criteria: backend.NewSuffix(args.token)}) + e, err := opts.app.Transaction().QueryCallback(backend.QueryOptions{Mode: backend.SuffixMode, Criteria: backend.NewSuffix(args.token)}) if err != nil { return err } - writer := opts.App.Writer() + writer := opts.app.Writer() for _, entry := range e { fmt.Fprintf(writer, "%s\n", entry.Directory()) } diff --git a/internal/totp/core_test.go b/internal/totp/core_test.go @@ -18,14 +18,24 @@ type ( } ) -func newMock(t *testing.T) *mockOptions { +func newMock(t *testing.T) (*mockOptions, totp.Options) { fullSetup(t, true).Insert(backend.NewPath("test", "test2", "test1"), "pass") fullSetup(t, true).Insert(backend.NewPath("test", "test3", "totp"), "5ae472abqdekjqykoyxk7hvc2leklq5n") fullSetup(t, true).Insert(backend.NewPath("test", "test2", "totp"), "5ae472abqdekjqykoyxk7hvc2leklq5n") - return &mockOptions{ + m := &mockOptions{ buf: bytes.Buffer{}, tx: fullSetup(t, true), } + opts := totp.NewDefaultOptions(m) + opts.Clear = func() { + } + opts.IsNoTOTP = func() (bool, error) { + return false, nil + } + opts.IsInteractive = func() (bool, error) { + return true, nil + } + return m, opts } func fullSetup(t *testing.T, keep bool) *backend.Transaction { @@ -149,9 +159,7 @@ func TestDoErrors(t *testing.T) { func TestList(t *testing.T) { setup(t) args, _ := totp.NewArguments([]string{"ls"}, "totp") - opts := testOptions() - m := newMock(t) - opts.App = m + m, opts := newMock(t) if err := args.Do(opts); err != nil { t.Errorf("invalid error: %v", err) } @@ -163,9 +171,7 @@ func TestList(t *testing.T) { func TestNonListError(t *testing.T) { setup(t) args, _ := totp.NewArguments([]string{"clip", "test"}, "totp") - opts := testOptions() - m := newMock(t) - opts.App = m + _, opts := newMock(t) opts.IsInteractive = func() (bool, error) { return false, nil } @@ -183,9 +189,7 @@ func TestNonListError(t *testing.T) { func TestMinimal(t *testing.T) { setup(t) args, _ := totp.NewArguments([]string{"minimal", "test/test3"}, "totp") - opts := testOptions() - m := newMock(t) - opts.App = m + m, opts := newMock(t) if err := args.Do(opts); err != nil { t.Errorf("invalid error: %v", err) } @@ -197,9 +201,7 @@ func TestMinimal(t *testing.T) { func TestNonInteractive(t *testing.T) { setup(t) args, _ := totp.NewArguments([]string{"show", "test/test3"}, "totp") - opts := testOptions() - m := newMock(t) - opts.App = m + m, opts := newMock(t) opts.IsInteractive = func() (bool, error) { return false, nil } @@ -214,9 +216,7 @@ func TestNonInteractive(t *testing.T) { func TestOnce(t *testing.T) { setup(t) args, _ := totp.NewArguments([]string{"once", "test/test3"}, "totp") - opts := testOptions() - m := newMock(t) - opts.App = m + m, opts := newMock(t) if err := args.Do(opts); err != nil { t.Errorf("invalid error: %v", err) } @@ -228,9 +228,7 @@ func TestOnce(t *testing.T) { func TestShow(t *testing.T) { setup(t) args, _ := totp.NewArguments([]string{"show", "test/test3"}, "totp") - m := newMock(t) - opts := testOptions() - opts.App = m + m, opts := newMock(t) if err := args.Do(opts); err != nil { t.Errorf("invalid error: %v", err) } @@ -238,16 +236,3 @@ func TestShow(t *testing.T) { t.Errorf("invalid short: %s", m.buf.String()) } } - -func testOptions() totp.Options { - opts := totp.Options{} - opts.Clear = func() { - } - opts.IsNoTOTP = func() (bool, error) { - return false, nil - } - opts.IsInteractive = func() (bool, error) { - return true, nil - } - return opts -}