lockbox

password manager
Log | Files | Refs | README | LICENSE

commit 245760ac5449108bd06112570622f963ca970fed
parent da19c68595f4901537631f19fe5b1dc6caac3b58
Author: Sean Enck <sean@ttypty.com>
Date:   Sun,  3 Sep 2023 06:51:45 -0400

allow key check without loading

Diffstat:
Minternal/app/completions.go | 2+-
Minternal/backend/actions.go | 2+-
Minternal/config/vars.go | 5++++-
Minternal/config/vars_test.go | 25++++++++++++++++++-------
4 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/internal/app/completions.go b/internal/app/completions.go @@ -81,7 +81,7 @@ func GenerateCompletions(isBash, defaults bool, exe string) ([]string, error) { if noTOTP { isTOTP = false } - k, err := config.GetKey() + k, err := config.GetKey(true) if err != nil { return nil, err } diff --git a/internal/backend/actions.go b/internal/backend/actions.go @@ -31,7 +31,7 @@ func (t *Transaction) act(cb action) error { if !t.valid { return errors.New("invalid transaction") } - key, err := config.GetKey() + key, err := config.GetKey(false) if err != nil { return err } diff --git a/internal/config/vars.go b/internal/config/vars.go @@ -122,7 +122,7 @@ func GetReKey(args []string) ([]string, error) { } // GetKey will get the encryption key setup for lb -func GetKey() (*Key, error) { +func GetKey(dryrun bool) (*Key, error) { useKey := envKey.Get() keyMode := envKeyMode.Get() if keyMode == interactiveKeyMode { @@ -141,6 +141,9 @@ func GetKey() (*Key, error) { if useKey == "" { return nil, nil } + if dryrun { + return &Key{key: []byte{0}}, nil + } var data []byte switch keyMode { case commandKeyMode: diff --git a/internal/config/vars_test.go b/internal/config/vars_test.go @@ -79,40 +79,51 @@ func TestTOTP(t *testing.T) { func TestGetKey(t *testing.T) { os.Setenv("LOCKBOX_KEY", "aaa") os.Setenv("LOCKBOX_KEYMODE", "lak;jfea") - if k, err := config.GetKey(); err.Error() != "unknown keymode" || k != nil { + if k, err := config.GetKey(false); err.Error() != "unknown keymode" || k != nil { t.Errorf("invalid error: %v", err) } os.Setenv("LOCKBOX_KEYMODE", "plaintext") os.Setenv("LOCKBOX_KEY", "") - if k, err := config.GetKey(); err != nil || k != nil { + if k, err := config.GetKey(false); err != nil || k != nil { t.Errorf("invalid error: %v", err) } os.Setenv("LOCKBOX_KEY", "key") - k, err := config.GetKey() + k, err := config.GetKey(false) if err != nil || k == nil || string(k.Key()) != "key" || k.Interactive() { t.Error("invalid key retrieval") } + os.Setenv("LOCKBOX_KEY", "key") + k, err = config.GetKey(true) + if err != nil || k == nil || len(k.Key()) != 1 || k.Key()[0] != 0 || k.Interactive() { + t.Error("invalid key retrieval") + } os.Setenv("LOCKBOX_KEYMODE", "command") os.Setenv("LOCKBOX_KEY", "invalid command text is long and invalid via shlex") - if k, err := config.GetKey(); err == nil || k != nil { + if k, err := config.GetKey(false); err == nil || k != nil { t.Error("should have failed") } os.Setenv("LOCKBOX_INTERACTIVE", "yes") os.Setenv("LOCKBOX_KEYMODE", "interactive") os.Setenv("LOCKBOX_KEY", "") - if k, err := config.GetKey(); err != nil || k == nil || !k.Interactive() { + if k, err := config.GetKey(false); err != nil || k == nil || !k.Interactive() { + t.Errorf("invalid error: %v", err) + } + os.Setenv("LOCKBOX_INTERACTIVE", "yes") + os.Setenv("LOCKBOX_KEYMODE", "interactive") + os.Setenv("LOCKBOX_KEY", "") + if k, err := config.GetKey(true); err != nil || k == nil || !k.Interactive() { t.Errorf("invalid error: %v", err) } os.Setenv("LOCKBOX_INTERACTIVE", "no") os.Setenv("LOCKBOX_KEYMODE", "interactive") os.Setenv("LOCKBOX_KEY", "") - if k, err := config.GetKey(); err == nil || err.Error() != "interactive key mode requested in non-interactive mode" || k != nil { + if k, err := config.GetKey(false); err == nil || err.Error() != "interactive key mode requested in non-interactive mode" || k != nil { t.Errorf("invalid error: %v", err) } os.Setenv("LOCKBOX_INTERACTIVE", "yes") os.Setenv("LOCKBOX_KEYMODE", "interactive") os.Setenv("LOCKBOX_KEY", "aaa") - if k, err := config.GetKey(); err == nil || err.Error() != "key can NOT be set in interactive mode" || k != nil { + if k, err := config.GetKey(false); err == nil || err.Error() != "key can NOT be set in interactive mode" || k != nil { t.Errorf("invalid error: %v", err) } }