commit 4f54140c40be9cc1af820d420fcde838dedd5111
parent 17533b065542dd709e6da6764e81472be3109851
Author: Sean Enck <sean@ttypty.com>
Date: Fri, 31 Mar 2023 20:00:09 -0400
use an output mode
Diffstat:
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
}