commit 072659c0fb185191796e7d60d5fd941e84a9fff2
parent a9ab6b7ac44a0531d297f72fb66388983e83ae8e
Author: Sean Enck <sean@ttypty.com>
Date: Thu, 30 Mar 2023 18:58:03 -0400
Revert "use json instead of text parsing"
This reverts commit a309066244a6bff06e1b83637fa210333b2603c6.
Diffstat:
8 files changed, 36 insertions(+), 56 deletions(-)
diff --git a/cmd/vers.txt b/cmd/vers.txt
@@ -1 +1 @@
-76d0142
-\ No newline at end of file
+6bf2506-1
+\ No newline at end of file
diff --git a/internal/app/rekey.go b/internal/app/rekey.go
@@ -1,7 +1,6 @@
package app
import (
- "encoding/json"
"errors"
"fmt"
"io"
@@ -18,7 +17,7 @@ type (
// Keyer defines how rekeying happens
Keyer interface {
List() ([]string, error)
- Stats(string) ([]byte, error)
+ Stats(string) ([]string, error)
Show(string) ([]byte, error)
Insert(ReKeyEntry) error
}
@@ -49,8 +48,8 @@ func (r DefaultKeyer) List() ([]string, error) {
}
// Stats will get stats for an entry
-func (r DefaultKeyer) Stats(entry string) ([]byte, error) {
- return exec.Command(r.exe, cli.StatsCommand, entry).Output()
+func (r DefaultKeyer) Stats(entry string) ([]string, error) {
+ return r.getCommandLines(cli.StatsCommand, entry)
}
func (r DefaultKeyer) getCommandLines(args ...string) ([]string, error) {
@@ -99,14 +98,18 @@ func ReKey(writer io.Writer, r Keyer) error {
}
stats, err := r.Stats(entry)
if err != nil {
- return fmt.Errorf("failed to get modtime: %w", err)
+ return fmt.Errorf("failed to get modtime, command failed: %w", err)
}
modTime := ""
- j := backend.Stats{}
- if err := json.Unmarshal(stats, &j); err != nil {
- return fmt.Errorf("invalid stats json: %w", err)
+ for _, stat := range stats {
+ if strings.HasPrefix(stat, backend.ModTimeField) {
+ if modTime != "" {
+ return errors.New("unable to read modtime, too many values")
+ }
+ modTime = strings.TrimPrefix(stat, backend.ModTimeField)
+ }
}
- modTime = strings.TrimSpace(j.ModTime)
+ modTime = strings.TrimSpace(modTime)
if modTime == "" {
return errors.New("did not read modtime")
}
diff --git a/internal/app/rekey_test.go b/internal/app/rekey_test.go
@@ -5,7 +5,6 @@ import (
"errors"
"fmt"
"os"
- "strings"
"testing"
"github.com/enckse/lockbox/internal/app"
@@ -15,7 +14,7 @@ type (
mockKeyer struct {
entries []string
data map[string][]byte
- stats map[string][]byte
+ stats map[string][]string
err error
rekeys []app.ReKeyEntry
}
@@ -36,7 +35,7 @@ func (m *mockKeyer) Show(entry string) ([]byte, error) {
return val, nil
}
-func (m *mockKeyer) Stats(entry string) ([]byte, error) {
+func (m *mockKeyer) Stats(entry string) ([]string, error) {
val, ok := m.stats[entry]
if !ok {
return nil, errors.New("no stats")
@@ -67,21 +66,20 @@ func TestErrors(t *testing.T) {
}
m.err = nil
m.entries = []string{"test1", "error"}
- if err := app.ReKey(&buf, m); err == nil || err.Error() != "failed to get modtime: no stats" {
+ if err := app.ReKey(&buf, m); err == nil || err.Error() != "failed to get modtime, command failed: no stats" {
t.Errorf("invalid error: %v", err)
}
- m.stats = make(map[string][]byte)
- m.stats["test1"] = []byte("modtime")
- if err := app.ReKey(&buf, m); err == nil || !strings.HasPrefix(err.Error(), "invalid stats json:") {
+ m.stats = make(map[string][]string)
+ m.stats["test1"] = []string{"modtime"}
+ m.stats["error"] = []string{"modtime: 3"}
+ if err := app.ReKey(&buf, m); err == nil || err.Error() != "did not read modtime" {
t.Errorf("invalid error: %v", err)
}
- m.stats = make(map[string][]byte)
- m.stats["test1"] = []byte("{\"modtime\": \"\"}")
- if err := app.ReKey(&buf, m); err == nil || err.Error() != "did not read modtime" {
+ m.stats["test1"] = []string{"modtime: 1", "modtime: 2"}
+ if err := app.ReKey(&buf, m); err == nil || err.Error() != "unable to read modtime, too many values" {
t.Errorf("invalid error: %v", err)
}
- m.stats["test1"] = []byte("{\"modtime\": \"1\"}")
- m.stats["error"] = []byte("{\"modtime\": \"1\"}")
+ m.stats["test1"] = []string{"modtime: 1"}
if err := app.ReKey(&buf, m); err == nil || err.Error() != "no data" {
t.Errorf("invalid error: %v", err)
}
@@ -107,9 +105,9 @@ func TestReKey(t *testing.T) {
m.data = make(map[string][]byte)
m.data["test1"] = []byte{1}
m.data["test2"] = []byte{2}
- m.stats = make(map[string][]byte)
- m.stats["test1"] = []byte("{\"modtime\": \"1\"}")
- m.stats["test2"] = []byte("{\"modtime\": \"2\"}")
+ m.stats = make(map[string][]string)
+ m.stats["test1"] = []string{"modtime: 1", "modtime2"}
+ m.stats["test2"] = []string{"moime: 1", "modtime: 2"}
if err := app.ReKey(&buf, m); err != nil {
t.Errorf("invalid error: %v", err)
}
diff --git a/internal/backend/query.go b/internal/backend/query.go
@@ -3,7 +3,6 @@ package backend
import (
"crypto/sha512"
- "encoding/json"
"errors"
"fmt"
"sort"
@@ -132,17 +131,12 @@ func (t *Transaction) QueryCallback(args QueryOptions) ([]QueryEntity, error) {
switch args.Values {
case SecretValue:
entity.Value = val
- case StatsValue:
+ case HashedValue, StatsValue:
t := getValue(e.backing, modTimeKey)
- s := Stats{Path: k, ModTime: t}
- m, err := json.MarshalIndent(s, "", " ")
- if err != nil {
- return nil, err
+ res := fmt.Sprintf("%s %s", ModTimeField, t)
+ if args.Values == HashedValue {
+ res = fmt.Sprintf("%s\nhash: %x", res, sha512.Sum512([]byte(val)))
}
- entity.Value = string(m)
- case HashedValue:
- t := getValue(e.backing, modTimeKey)
- res := fmt.Sprintf("modtime: %s\nhash: %x", t, sha512.Sum512([]byte(val)))
entity.Value = res
}
}
diff --git a/internal/backend/query_test.go b/internal/backend/query_test.go
@@ -1,7 +1,6 @@
package backend_test
import (
- "encoding/json"
"fmt"
"os"
"strings"
@@ -107,15 +106,8 @@ func TestValueModes(t *testing.T) {
t.Errorf("invalid result value: %s", q.Value)
}
q, err = fullSetup(t, true).Get("test/test/abc", backend.StatsValue)
- if err != nil {
- t.Errorf("no error: %v", err)
- }
- r := backend.Stats{}
- if err := json.Unmarshal([]byte(q.Value), &r); err != nil {
- t.Errorf("json error: %v", err)
- }
- if len(r.ModTime) != 25 || r.Path != "test/test/abc" {
- t.Errorf("invalid stats: %v", r)
+ if err != nil || !strings.HasPrefix(q.Value, "modtime: ") || len(strings.Split(q.Value, "\n")) != 1 {
+ t.Errorf("invalid stats: %s", q.Value)
}
}
diff --git a/internal/backend/types.go b/internal/backend/types.go
@@ -48,11 +48,6 @@ type (
enabled bool
scripts []string
}
- // Stats shows information about the entry
- Stats struct {
- ModTime string `json:"modtime"`
- Path string `json:"path"`
- }
removal struct {
parts []string
title string
@@ -105,6 +100,8 @@ const (
pathSep = "/"
isGlob = pathSep + "*"
modTimeKey = "ModTime"
+ // ModTimeField is the stats field for modification time
+ ModTimeField = "modtime:"
)
var errPath = errors.New("input paths must contain at LEAST 2 components")
diff --git a/tests/expected.log b/tests/expected.log
@@ -15,10 +15,7 @@ keys2/k/three
test2
test3
test4
-{
- "modtime": "XXXX-XX-XX",
- "path": "keys2/k/three"
-}
+modtime: XXXX-XX-XX
test/k
XXXXXX
XXXXXX
diff --git a/tests/run.sh b/tests/run.sh
@@ -122,7 +122,6 @@ _clipboard() {
_logtest() {
_execute 2>&1 | \
sed 's/modtime: [0-9].*$/modtime: XXXX-XX-XX/g' | \
- sed 's/\"modtime\": \"[0-9].*$/"modtime": "XXXX-XX-XX",/g' | \
sed 's/^[0-9][0-9][0-9][0-9][0-9][0-9]$/XXXXXX/g'
}