lockbox

password manager
Log | Files | Refs | README | LICENSE

commit d1167167e7a1b3cd49f14beb46fbc5ba997cb567
parent 277f8ee2cd7e5977b09322365a6c5b4ef675745e
Author: Sean Enck <sean@ttypty.com>
Date:   Wed,  2 Nov 2022 18:25:57 -0400

hooks will work by calling before/after transaction

Diffstat:
Minternal/backend/actions.go | 64++++++++++++++++++++++++++++++++++++++++++----------------------
Minternal/backend/types.go | 5+++++
Mscripts/tests.expected.log | 12++++++------
3 files changed, 53 insertions(+), 28 deletions(-)

diff --git a/internal/backend/actions.go b/internal/backend/actions.go @@ -235,11 +235,11 @@ func (t *Transaction) Move(src QueryEntity, dst string) error { if err != nil { return err } + if err := hook.Run(HookPre); err != nil { + return err + } multi := len(strings.Split(strings.TrimSpace(src.Value), "\n")) > 1 - return t.change(func(c Context) error { - if err := hook.Run(HookPre); err != nil { - return err - } + err = t.change(func(c Context) error { c.removeEntity(sOffset, sTitle) if action == MoveAction { c.removeEntity(dOffset, dTitle) @@ -265,8 +265,12 @@ func (t *Transaction) Move(src QueryEntity, dst string) error { e.Values = append(e.Values, protectedValue(field, v)) c.insertEntity(dOffset, dTitle, e) - return hook.Run(HookPost) + return nil }) + if err != nil { + return err + } + return hook.Run(HookPost) } // Insert is a move to the same location @@ -287,28 +291,44 @@ func (t *Transaction) RemoveAll(entities []QueryEntity) error { if len(entities) == 0 { return errors.New("no entities given") } - return t.change(func(c Context) error { - for _, entity := range entities { - offset, title, err := splitComponents(entity.Path) - if err != nil { - return err - } - hook, err := NewHook(entity.Path, RemoveAction) - if err != nil { - return err - } - if err := hook.Run(HookPre); err != nil { - return err - } - if ok := c.removeEntity(offset, title); !ok { + removals := []removal{} + hasHooks := false + for _, entity := range entities { + offset, title, err := splitComponents(entity.Path) + if err != nil { + return err + } + hook, err := NewHook(entity.Path, RemoveAction) + if err != nil { + return err + } + if err := hook.Run(HookPre); err != nil { + return err + } + if hook.enabled { + hasHooks = true + } + removals = append(removals, removal{parts: offset, title: title, hook: hook}) + } + err := t.change(func(c Context) error { + for _, entity := range removals { + if ok := c.removeEntity(entity.parts, entity.title); !ok { return errors.New("failed to remove entity") } - if err := hook.Run(HookPost); err != nil { - return err - } } return nil }) + if err != nil { + return err + } + if hasHooks { + for _, entity := range removals { + if err := entity.hook.Run(HookPost); err != nil { + return err + } + } + } + return nil } func getValue(e gokeepasslib.Entry, key string) string { diff --git a/internal/backend/types.go b/internal/backend/types.go @@ -48,6 +48,11 @@ type ( enabled bool scripts []string } + removal struct { + parts []string + title string + hook Hook + } ) const ( diff --git a/scripts/tests.expected.log b/scripts/tests.expected.log @@ -79,18 +79,18 @@ selected entities: delete entries? (y/N) pre rm keys/k2/one CALLED -post rm keys/k2/one -CALLED pre rm keys/k2/one2 CALLED -post rm keys/k2/one2 -CALLED pre rm keys/k2/t2/one CALLED -post rm keys/k2/t2/one -CALLED pre rm keys/k2/t2/one2 CALLED +post rm keys/k2/one +CALLED +post rm keys/k2/one2 +CALLED +post rm keys/k2/t2/one +CALLED post rm keys/k2/t2/one2 CALLED