lockbox

password manager
Log | Files | Refs | README | LICENSE

commit 4f54140c40be9cc1af820d420fcde838dedd5111
parent 17533b065542dd709e6da6764e81472be3109851
Author: Sean Enck <sean@ttypty.com>
Date:   Fri, 31 Mar 2023 20:00:09 -0400

use an output mode

Diffstat:
Minternal/app/rekey.go | 3+--
Minternal/backend/query.go | 20+++++++++++++-------
Minternal/backend/query_test.go | 15++++++++++++++-
Minternal/backend/types.go | 2+-
Minternal/inputs/env.go | 17+++++++++--------
Minternal/inputs/env_test.go | 4----
Mtests/expected.log | 5+++++
Mtests/run.sh | 4+++-
8 files changed, 46 insertions(+), 24 deletions(-)

diff --git a/internal/app/rekey.go b/internal/app/rekey.go @@ -11,7 +11,6 @@ import ( "github.com/enckse/lockbox/internal/backend" "github.com/enckse/lockbox/internal/cli" "github.com/enckse/lockbox/internal/inputs" - "github.com/enckse/pgl/os/env" ) type ( @@ -82,7 +81,7 @@ func ReKey(cmd CommandOptions, r Keyer) error { return nil } - os.Setenv(inputs.JSONPlainTextEnv, env.Yes) + os.Setenv(inputs.JSONDataOutputEnv, inputs.JSONDataOutputRaw) entries, err := r.JSON() if err != nil { return err diff --git a/internal/backend/query.go b/internal/backend/query.go @@ -118,11 +118,14 @@ func (t *Transaction) QueryCallback(args QueryOptions) ([]QueryEntity, error) { if isSort { sort.Strings(keys) } - plain, err := inputs.IsJSONPlainText() - if err != nil { - return nil, err + jsonMode := inputs.JSONBlankMode + if args.Values == JSONValue { + m, err := inputs.ParseJSONOutput() + if err != nil { + return nil, err + } + jsonMode = m } - jsonHash := !plain var results []QueryEntity for _, k := range keys { entity := QueryEntity{Path: k} @@ -137,11 +140,14 @@ func (t *Transaction) QueryCallback(args QueryOptions) ([]QueryEntity, error) { } switch args.Values { case JSONValue: - t := getValue(e.backing, modTimeKey) - data := val - if jsonHash { + data := "" + switch jsonMode { + case inputs.JSONRawMode: + data = val + case inputs.JSONHashMode: data = fmt.Sprintf("%x", sha512.Sum512([]byte(val))) } + t := getValue(e.backing, modTimeKey) s := JSON{ModTime: t, Data: data} m, err := json.Marshal(s) if err != nil { diff --git a/internal/backend/query_test.go b/internal/backend/query_test.go @@ -114,7 +114,7 @@ func TestValueModes(t *testing.T) { if len(m.ModTime) < 20 || m.Data == "" { t.Errorf("invalid json: %v", m) } - os.Setenv("LOCKBOX_JSON_PLAINTEXT", "yes") + os.Setenv("LOCKBOX_JSON_DATA_OUTPUT", "plAINtExt") defer os.Clearenv() q, err = fullSetup(t, true).Get("test/test/abc", backend.JSONValue) if err != nil { @@ -127,6 +127,19 @@ func TestValueModes(t *testing.T) { if len(m.ModTime) < 20 || m.Data != "tedst" { t.Errorf("invalid json: %v", m) } + os.Setenv("LOCKBOX_JSON_DATA_OUTPUT", "emPTY") + defer os.Clearenv() + q, err = fullSetup(t, true).Get("test/test/abc", backend.JSONValue) + if err != nil { + t.Errorf("no error: %v", err) + } + m = backend.JSON{} + if err := json.Unmarshal([]byte(q.Value), &m); err != nil { + t.Errorf("no error: %v", err) + } + if len(m.ModTime) < 20 || m.Data != "" { + t.Errorf("invalid json: %v", m) + } } func TestQueryCallback(t *testing.T) { diff --git a/internal/backend/types.go b/internal/backend/types.go @@ -56,7 +56,7 @@ type ( // JSON is an entry as a JSON string JSON struct { ModTime string `json:"modtime"` - Data string `json:"data"` + Data string `json:"data,omitempty"` } ) diff --git a/internal/inputs/env.go b/internal/inputs/env.go @@ -66,8 +66,14 @@ const ( ModTimeFormat = time.RFC3339 // MaxTOTPTimeDefault is the max TOTP time to run (default) MaxTOTPTimeDefault = "120" - // JSONPlainTextEnv toggles plain text on for JSON outputs - JSONPlainTextEnv = prefixKey + "JSON_PLAINTEXT" + // JSONDataOutputEnv controls how JSON is output + JSONDataOutputEnv = prefixKey + "JSON_DATA_OUTPUT" + // JSONDataOutputHash means output data is hashed + JSONDataOutputHash = "hash" + // JSONDataOutputBlank means an empty entry is set + JSONDataOutputBlank = "empty" + // JSONDataOutputRaw means the RAW (unencrypted) value is displayed + JSONDataOutputRaw = "plaintext" ) var isYesNoArgs = []string{env.Yes, env.No} @@ -228,11 +234,6 @@ func IsInteractive() (bool, error) { return isYesNoEnv(true, interactiveEnv) } -// IsJSONPlainText indicates if JSON should plaintext values (not hashed) -func IsJSONPlainText() (bool, error) { - return isYesNoEnv(false, JSONPlainTextEnv) -} - // TOTPToken gets the name of the totp special case tokens func TOTPToken() string { return env.GetOrDefault(fieldTOTPEnv, defaultTOTPField) @@ -284,6 +285,6 @@ func ListEnvironmentVariables(showValues bool) []string { results = append(results, e.formatEnvironmentVariable(false, clipOSC52Env, env.No, "enable OSC52 clipboard mode", isYesNoArgs)) results = append(results, e.formatEnvironmentVariable(false, KeyFileEnv, "", "additional keyfile to access/protect the database", []string{"keyfile"})) results = append(results, e.formatEnvironmentVariable(false, ModTimeEnv, ModTimeFormat, fmt.Sprintf("input modification time to set for the entry\n(expected format: %s)", ModTimeFormat), []string{"modtime"})) - results = append(results, e.formatEnvironmentVariable(false, JSONPlainTextEnv, env.No, "JSON output will show values as plaintext (not hashed)\nuse this option with CAUTION", isYesNoArgs)) + results = append(results, e.formatEnvironmentVariable(false, JSONDataOutputEnv, JSONDataOutputHash, fmt.Sprintf("changes what the data field in JSON outputs will contain\nuse '%s' with CAUTION", JSONDataOutputRaw), []string{JSONDataOutputRaw, JSONDataOutputHash, JSONDataOutputBlank})) return results } diff --git a/internal/inputs/env_test.go b/internal/inputs/env_test.go @@ -53,10 +53,6 @@ func TestIsReadOnly(t *testing.T) { checkYesNo("LOCKBOX_READONLY", t, inputs.IsReadOnly, false) } -func TestIsJSONPlaintext(t *testing.T) { - checkYesNo("LOCKBOX_JSON_PLAINTEXT", t, inputs.IsJSONPlainText, false) -} - func TestIsOSC52(t *testing.T) { checkYesNo("LOCKBOX_CLIP_OSC52", t, inputs.IsClipOSC52, false) } diff --git a/tests/expected.log b/tests/expected.log @@ -133,5 +133,10 @@ test2 "data": "test2" } } +{ + "keys/k/one2": { + "modtime": "XXXX-XX-XX", + } +} clipboard will clear in 5 seconds Wrong password? HMAC-SHA256 of header mismatching diff --git a/tests/run.sh b/tests/run.sh @@ -99,7 +99,9 @@ _rekey() { echo ${LB_BINARY} ls ${LB_BINARY} show keys/k/one2 - export LOCKBOX_JSON_PLAINTEXT=yes + export LOCKBOX_JSON_DATA_OUTPUT=plaintext + ${LB_BINARY} json k + export LOCKBOX_JSON_DATA_OUTPUT=empty ${LB_BINARY} json k }