commit 76c289333893fc7e32d534999d89f2942025f278
parent 4621884e95ad9aa32753edf5b3d57642fe3230a7
Author: Sean Enck <sean@ttypty.com>
Date: Mon, 27 Mar 2023 21:50:21 -0400
update totp option handling
Diffstat:
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
-}