commit 31a70a304aefdd536e0f1c096f5db6d89d8e8b28
parent aee4561166ec184eb93e87188ea5354d22bea6d8
Author: Sean Enck <sean@ttypty.com>
Date: Sat, 1 Oct 2022 11:47:09 -0400
index is not reliable
Diffstat:
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)