lockbox

password manager
Log | Files | Refs | README | LICENSE

commit 503bcdee60d0cc30176893674c4a78219a59870e
parent b45a1dda0a422f538a4fb61d73325a4151e0d30a
Author: Sean Enck <sean@ttypty.com>
Date:   Thu,  2 Mar 2023 20:23:15 -0500

insert moved

Diffstat:
Minternal/app/core.go | 66++----------------------------------------------------------------
Ainternal/commands/insert.go | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 85 insertions(+), 64 deletions(-)

diff --git a/internal/app/core.go b/internal/app/core.go @@ -44,10 +44,6 @@ func handleEarly(command string, args []string) (bool, error) { return false, nil } -func wrapped(message string, err error) error { - return fmt.Errorf("%s (%w)", message, err) -} - // Run invokes the app func Run() error { args := os.Args @@ -65,7 +61,7 @@ func Run() error { } t, err := backend.NewTransaction() if err != nil { - return wrapped("unable to build transaction model", err) + return fmt.Errorf("unable to build transaction model: %w", err) } switch command { case cli.ReKeyCommand: @@ -77,65 +73,7 @@ func Run() error { case cli.MoveCommand: return commands.Move(t, sub, confirm) case cli.InsertCommand: - multi := false - isTOTP := false - idx := 2 - switch len(args) { - case 2: - return errors.New("insert requires an entry") - case 3: - case 4: - opt := args[2] - switch opt { - case cli.InsertMultiCommand: - multi = true - case cli.InsertTOTPCommand: - off, err := inputs.IsNoTOTP() - if err != nil { - return err - } - if off { - return totp.ErrNoTOTP - } - isTOTP = true - default: - return errors.New("unknown argument") - } - multi = true - idx = 3 - default: - return errors.New("too many arguments") - } - isPipe := inputs.IsInputFromPipe() - entry := args[idx] - if isTOTP { - totpToken := inputs.TOTPToken() - if !strings.HasSuffix(entry, backend.NewSuffix(totpToken)) { - entry = backend.NewPath(entry, totpToken) - } - } - existing, err := t.Get(entry, backend.BlankValue) - if err != nil { - return wrapped("unable to check for existing entry", err) - } - if existing != nil { - if !isPipe { - if !confirm("overwrite existing") { - return nil - } - } - } - password, err := inputs.GetUserInputPassword(isPipe, multi) - if err != nil { - return wrapped("invalid input", err) - } - p := strings.TrimSpace(string(password)) - if err := t.Insert(entry, p); err != nil { - return wrapped("failed to insert", err) - } - if !isPipe { - fmt.Println() - } + return commands.Insert(os.Stdout, t, sub, confirm) case cli.RemoveCommand: return commands.Remove(os.Stdout, t, sub, confirm) case cli.StatsCommand: diff --git a/internal/commands/insert.go b/internal/commands/insert.go @@ -0,0 +1,83 @@ +// Package commands can insert +package commands + +import ( + "errors" + "fmt" + "io" + "strings" + + "github.com/enckse/lockbox/internal/backend" + "github.com/enckse/lockbox/internal/cli" + "github.com/enckse/lockbox/internal/inputs" + "github.com/enckse/lockbox/internal/totp" +) + +func insertError(message string, err error) error { + return fmt.Errorf("%s (%w)", message, err) +} + +// Insert will insert new entries +// NOTE: almost entirely tested via regresssion due to complexities around piping/inputs +func Insert(w io.Writer, t *backend.Transaction, args []string, confirm func(string) bool) error { + multi := false + isTOTP := false + idx := 0 + switch len(args) { + case 0: + return errors.New("insert requires an entry") + case 1: + case 2: + opt := args[0] + switch opt { + case cli.InsertMultiCommand: + multi = true + case cli.InsertTOTPCommand: + off, err := inputs.IsNoTOTP() + if err != nil { + return err + } + if off { + return totp.ErrNoTOTP + } + isTOTP = true + default: + return errors.New("unknown argument") + } + multi = true + idx = 1 + default: + return errors.New("too many arguments") + } + isPipe := inputs.IsInputFromPipe() + entry := args[idx] + if isTOTP { + totpToken := inputs.TOTPToken() + if !strings.HasSuffix(entry, backend.NewSuffix(totpToken)) { + entry = backend.NewPath(entry, totpToken) + } + } + existing, err := t.Get(entry, backend.BlankValue) + if err != nil { + return insertError("unable to check for existing entry", err) + } + if existing != nil { + if !isPipe { + if !confirm("overwrite existing") { + return nil + } + } + } + password, err := inputs.GetUserInputPassword(isPipe, multi) + if err != nil { + return insertError("invalid input", err) + } + p := strings.TrimSpace(string(password)) + if err := t.Insert(entry, p); err != nil { + return insertError("failed to insert", err) + } + if !isPipe { + fmt.Println() + } + return nil +}