lockbox

password manager
Log | Files | Refs | README | LICENSE

commit 31a70a304aefdd536e0f1c096f5db6d89d8e8b28
parent aee4561166ec184eb93e87188ea5354d22bea6d8
Author: Sean Enck <sean@ttypty.com>
Date:   Sat,  1 Oct 2022 11:47:09 -0400

index is not reliable

Diffstat:
Minternal/backend/query.go | 6++----
Minternal/backend/transact.go | 15++++++++-------
Mtests/expected.log | 7+------
3 files changed, 11 insertions(+), 17 deletions(-)

diff --git a/internal/backend/query.go b/internal/backend/query.go @@ -26,7 +26,6 @@ type ( QueryEntity struct { Path string Value string - Index int backing gokeepasslib.Entry } ) @@ -78,7 +77,7 @@ func (t *Transaction) QueryCallback(args QueryOptions) ([]QueryEntity, error) { isSort := args.Mode == ListMode || args.Mode == FindMode || args.Mode == SuffixMode decrypt := args.Values != BlankValue err := t.act(func(ctx Context) error { - for idx, entry := range ctx.db.Content.Root.Groups[0].Entries { + for _, entry := range ctx.db.Content.Root.Groups[0].Entries { path := getPathName(entry) if isSort { switch args.Mode { @@ -100,7 +99,7 @@ func (t *Transaction) QueryCallback(args QueryOptions) ([]QueryEntity, error) { } } keys = append(keys, path) - entities[path] = QueryEntity{backing: entry, Index: idx} + entities[path] = QueryEntity{backing: entry} } if decrypt { return ctx.db.UnlockProtectedEntries() @@ -118,7 +117,6 @@ func (t *Transaction) QueryCallback(args QueryOptions) ([]QueryEntity, error) { entity := QueryEntity{Path: k} if args.Values != BlankValue { e := entities[k] - entity.Index = e.Index val := getValue(e.backing, notesKey) if strings.TrimSpace(val) == "" { val = e.backing.GetPassword() diff --git a/internal/backend/transact.go b/internal/backend/transact.go @@ -158,15 +158,16 @@ func (t *Transaction) Insert(path, val string, entity *QueryEntity, multi bool) func remove(entity *QueryEntity, c Context) error { entries := c.db.Content.Root.Groups[0].Entries - if entity.Index >= len(entries) { - return errors.New("index out of bounds") + idx := -1 + for i, e := range entries { + if entity.Path == getPathName(e) { + idx = i + } } - e := entries[entity.Index] - n := getPathName(e) - if n != entity.Path { - return errors.New("validation failed, index/name mismatch") + if idx < 0 { + return errors.New("unable to select entity for deletion") } - c.db.Content.Root.Groups[0].Entries = append(entries[:entity.Index], entries[entity.Index+1:]...) + c.db.Content.Root.Groups[0].Entries = append(entries[:idx], entries[idx+1:]...) return nil } diff --git a/tests/expected.log b/tests/expected.log @@ -6,10 +6,8 @@ keys/one keys/one2 keys2/three delete entry? (y/N) -keys/one keys/one2 keys2/three -keys/one keys/one2 keys2/three test2 @@ -18,8 +16,6 @@ test4 test/totp XXXXXX -keys/one: -hash:ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff keys/one2: hash:6d201beeefb589b08ef0672dac82353d0cbd9ad99e1642c83a1601f3d647bcca003257b5e8f31bdc1d73fbec84fb085c79d6e2677b7ff927e823a54e789140d9 keys2/three: @@ -27,4 +23,4 @@ hash:132ab0244293c495a027cec12d0050598616daca888449920fc652719be0987830827d069ef test/totp: hash:7ef183065ba70aaa417b87ea0a96b7e550a938a52440c640a07537f7794d8a89e50078eca6a7cbcfacabd97a2db06d11e82ddf7556ca909c4df9fc0d006013b1 delete entry? (y/N) -delete entry? (y/N) -\ No newline at end of file +delete entry? (y/N) delete entry? (y/N) unable to remove entry (entity is empty/invalid)