lockbox

password manager
Log | Files | Refs | README | LICENSE

commit fbea22f67861e99b19572bef9929b57e41d530c7
parent 71f259fc28ec722c35b9a8f1f0c52164268b5e86
Author: Sean Enck <sean@ttypty.com>
Date:   Thu, 30 Mar 2023 21:24:46 -0400

json should be a filter operation

Diffstat:
Minternal/app/conv.go | 16++++++++++++----
Minternal/app/json.go | 24++++--------------------
Minternal/app/json_test.go | 2+-
Minternal/app/rekey_test.go | 12++++--------
Minternal/cli/core.go | 2+-
Mtests/expected.log | 6++++--
6 files changed, 26 insertions(+), 36 deletions(-)

diff --git a/internal/app/conv.go b/internal/app/conv.go @@ -22,21 +22,28 @@ func Conv(cmd CommandOptions) error { if err != nil { return err } - if err := serialize(w, t); err != nil { + if err := serialize(w, t, ""); err != nil { return err } } return nil } -func serialize(w io.Writer, tx *backend.Transaction) error { +func serialize(w io.Writer, tx *backend.Transaction, filter string) error { e, err := tx.QueryCallback(backend.QueryOptions{Mode: backend.ListMode, Values: backend.JSONValue}) if err != nil { return err } fmt.Fprint(w, "{\n") - for idx, item := range e { - if idx > 0 { + hasFilter := len(filter) > 0 + printed := false + for _, item := range e { + if hasFilter { + if !strings.HasPrefix(item.Path, filter) { + continue + } + } + if printed { fmt.Fprintf(w, ",\n") } b, err := json.MarshalIndent(map[string]json.RawMessage{item.Path: json.RawMessage([]byte(item.Value))}, "", " ") @@ -47,6 +54,7 @@ func serialize(w io.Writer, tx *backend.Transaction) error { trimmed = strings.TrimPrefix(trimmed, "{") trimmed = strings.TrimSuffix(trimmed, "}") fmt.Fprintf(w, " %s", strings.TrimSpace(trimmed)) + printed = true } fmt.Fprintf(w, "\n}\n") return nil diff --git a/internal/app/json.go b/internal/app/json.go @@ -2,12 +2,7 @@ package app import ( - "bytes" - "encoding/json" "errors" - "fmt" - - "github.com/enckse/lockbox/internal/backend" ) // JSON will get entries (1 or ALL) in JSON format @@ -16,20 +11,9 @@ func JSON(cmd CommandOptions) error { if len(args) > 1 { return errors.New("invalid arguments") } - if len(args) == 0 { - return serialize(cmd.Writer(), cmd.Transaction()) - } - entry := args[0] - v, err := cmd.Transaction().Get(entry, backend.JSONValue) - if err != nil { - return fmt.Errorf("unable to get json: %w", err) - } - if v != nil { - var buf bytes.Buffer - if err := json.Indent(&buf, []byte(v.Value), "", " "); err != nil { - return err - } - fmt.Fprintln(cmd.Writer(), buf.String()) + filter := "" + if len(args) == 1 { + filter = args[0] } - return nil + return serialize(cmd.Writer(), cmd.Transaction(), filter) } diff --git a/internal/app/json_test.go b/internal/app/json_test.go @@ -28,7 +28,7 @@ func TestJSON(t *testing.T) { if err := app.JSON(m); err != nil { t.Errorf("invalid error: %v", err) } - if m.buf.String() != "" { + if m.buf.String() == "" { t.Error("no data") } } diff --git a/internal/app/rekey_test.go b/internal/app/rekey_test.go @@ -3,7 +3,6 @@ package app_test import ( "bytes" "errors" - "fmt" "os" "testing" @@ -15,7 +14,7 @@ type ( mockKeyer struct { data map[string][]byte err error - rekeys []app.ReKeyEntry + rekeys int items map[string]backend.JSON } ) @@ -36,7 +35,7 @@ func (m *mockKeyer) Show(entry string) ([]byte, error) { } func (m *mockKeyer) Insert(entry app.ReKeyEntry) error { - m.rekeys = append(m.rekeys, entry) + m.rekeys++ if entry.Path == "error" { return errors.New("bad insert") } @@ -97,10 +96,7 @@ func TestReKey(t *testing.T) { if buf.String() == "" { t.Error("invalid data") } - if len(m.rekeys) != 2 { - t.Error("invalid rekeys") - } - if fmt.Sprintf("%v", m.rekeys) != `[{test1 [LOCKBOX_KEYMODE= LOCKBOX_KEY=abc LOCKBOX_KEYFILE= LOCKBOX_STORE=store LOCKBOX_SET_MODTIME=1] [1]} {test2 [LOCKBOX_KEYMODE= LOCKBOX_KEY=abc LOCKBOX_KEYFILE= LOCKBOX_STORE=store LOCKBOX_SET_MODTIME=2] [2]}]` { - t.Errorf("invalid results: %v", m.rekeys) + if m.rekeys != 2 { + t.Errorf("invalid results") } } diff --git a/internal/cli/core.go b/internal/cli/core.go @@ -213,7 +213,7 @@ func Usage(verbose bool) ([]string, error) { results = append(results, command(HelpCommand, "", "show this usage information")) results = append(results, subCommand(HelpCommand, HelpAdvancedCommand, "", "display verbose help information")) results = append(results, command(InsertCommand, "entry", "insert a new entry into the store")) - results = append(results, command(JSONCommand, "", "display detailed information")) + results = append(results, command(JSONCommand, "filter", "display detailed information")) results = append(results, command(ListCommand, "", "list entries")) results = append(results, command(MoveCommand, "src dst", "move an entry from source to destination")) results = append(results, command(MultiLineCommand, "entry", "insert a multiline entry into the store")) diff --git a/tests/expected.log b/tests/expected.log @@ -31,8 +31,10 @@ test2 test3 test4 { - "modtime": "XXXX-XX-XX", - "hash": "132ab0244293c495a027cec12d0050598616daca888449920fc652719be0987830827d069ef78cc613e348de37c9b592d3406e2fb8d99a6961bf0c58da8a334f" + "keys2/k/three": { + "modtime": "XXXX-XX-XX", + "hash": "132ab0244293c495a027cec12d0050598616daca888449920fc652719be0987830827d069ef78cc613e348de37c9b592d3406e2fb8d99a6961bf0c58da8a334f" + } } test/k