lockbox

password manager
Log | Files | Refs | README | LICENSE

commit 9b7ebca42742958668aca2a4f4c43bbd9794533c
parent 1e8c074b66f81509f9d4c4978aa77223f52591fb
Author: Sean Enck <sean@ttypty.com>
Date:   Fri, 15 Jul 2022 18:31:48 -0400

move hooks out

Diffstat:
Mcmd/lb/main.go | 28++--------------------------
Ainternal/hooks.go | 43+++++++++++++++++++++++++++++++++++++++++++
Mtests/expected.log | 6+++---
3 files changed, 48 insertions(+), 29 deletions(-)

diff --git a/cmd/lb/main.go b/cmd/lb/main.go @@ -37,30 +37,6 @@ func getEntry(store string, args []string, idx int) string { return filepath.Join(store, args[idx]) + internal.Extension } -func hooks(store, action, step string) { - hookDir := os.Getenv("LOCKBOX_HOOKDIR") - if !internal.PathExists(hookDir) { - return - } - dirs, err := os.ReadDir(hookDir) - if err != nil { - internal.Die("unable to read hookdir", err) - } - for _, d := range dirs { - if !d.IsDir() { - name := d.Name() - cmd := exec.Command(filepath.Join(hookDir, name), action, step) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - if err := cmd.Run(); err != nil { - internal.Die(fmt.Sprintf("hook failed: %s", name), err) - } - continue - } - internal.Die("invalid hook", internal.NewLockboxError("hook is not file and/or has wrong mode")) - } -} - func main() { args := os.Args if len(args) < 2 { @@ -149,7 +125,7 @@ func main() { internal.Die("failed to save password", err) } fmt.Println("") - hooks(store, command, postStep) + internal.Hooks(store, internal.InsertHook, internal.PostHookStep) case "rm": entry := getEntry(store, args, 2) if !internal.PathExists(entry) { @@ -157,7 +133,7 @@ func main() { } if confirm("remove entry") { os.Remove(entry) - hooks(store, command, postStep) + internal.Hooks(store, internal.RemoveHook, internal.PostHookStep) } case "show", "-c", "clip", "dump": isDump := command == "dump" diff --git a/internal/hooks.go b/internal/hooks.go @@ -0,0 +1,43 @@ +package internal + +import ( + "os" + "os/exec" + "path/filepath" +) + +type ( + HookAction string + HookStep string +) + +const ( + RemoveHook HookAction = "remove" + InsertHook HookAction = "insert" + PostHookStep HookStep = "post" +) + +func Hooks(store string, action HookAction, step HookStep) error { + hookDir := os.Getenv("LOCKBOX_HOOKDIR") + if !PathExists(hookDir) { + return nil + } + dirs, err := os.ReadDir(hookDir) + if err != nil { + return err + } + for _, d := range dirs { + if !d.IsDir() { + name := d.Name() + cmd := exec.Command(filepath.Join(hookDir, name), string(action), string(step)) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + return err + } + continue + } + return NewLockboxError("hook is not a file") + } + return nil +} diff --git a/tests/expected.log b/tests/expected.log @@ -27,7 +27,7 @@ keys2/three rekeying: /keys/one.lb rekeying: /keys/one2.lb rekeying: /keys2/three.lb -remove entry? (y/N) HOOK RAN rm post +remove entry? (y/N) HOOK RAN remove post keys/one2 keys2/three @@ -46,9 +46,9 @@ HOOK RAN insert post test XXXXXX test2 -remove entry? (y/N) HOOK RAN rm post +remove entry? (y/N) HOOK RAN remove post -remove entry? (y/N) HOOK RAN rm post +remove entry? (y/N) HOOK RAN remove post unable to decrypt (decrypt not ok) rekeying: /keys/one2.lb