diff --git a/CHANGELOG.md b/CHANGELOG.md index 88d01a2e..b9b2011d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ### Bugs + * Fix bug where JsonStore was not being created #612 + ### New Features * Config Wizard now prompts for `ProfileFormat` #590 diff --git a/internal/storage/json_store.go b/internal/storage/json_store.go index 56ac04a1..08621a23 100644 --- a/internal/storage/json_store.go +++ b/internal/storage/json_store.go @@ -20,7 +20,9 @@ package storage import ( "encoding/json" + "errors" "fmt" + "io/fs" "os" // "github.com/davecgh/go-spew/spew" @@ -38,9 +40,9 @@ type JsonStore struct { } // OpenJsonStore opens our insecure JSON storage backend -func OpenJsonStore(fileName string) (*JsonStore, error) { +func OpenJsonStore(filename string) (*JsonStore, error) { cache := JsonStore{ - filename: fileName, + filename: filename, RegisterClient: map[string]RegisterClientData{}, StartDeviceAuth: map[string]StartDeviceAuthData{}, CreateTokenResponse: map[string]CreateTokenResponse{}, @@ -48,10 +50,14 @@ func OpenJsonStore(fileName string) (*JsonStore, error) { StaticCredentials: map[string]StaticCredentials{}, } - cacheBytes, err := os.ReadFile(fileName) - if err != nil { - log.Infof("Creating new cache file: %s", fileName) - } else if len(cacheBytes) > 0 { + cacheBytes, err := os.ReadFile(filename) + if errors.Is(err, fs.ErrNotExist) { + return &cache, nil + } else if err != nil { + return &cache, fmt.Errorf("Unable to open %s: %s", filename, err.Error()) + } + + if len(cacheBytes) > 0 { err = json.Unmarshal(cacheBytes, &cache) } @@ -66,6 +72,7 @@ func (jc *JsonStore) save() error { log.WithError(err).Errorf("Unable to marshal json") return err } + err = utils.EnsureDirExists(jc.filename) if err != nil { return err diff --git a/internal/storage/json_store_test.go b/internal/storage/json_store_test.go index 4ccbf8f9..3a4093e5 100644 --- a/internal/storage/json_store_test.go +++ b/internal/storage/json_store_test.go @@ -29,6 +29,28 @@ import ( const TEST_JSON_STORE_FILE = "./testdata/store.json" +func TestNewFile(t *testing.T) { + fname := "./testdata/new-store.json" + defer os.Remove(fname) + s, err := OpenJsonStore(fname) + assert.Nil(t, err) + + assert.Error(t, s.GetRegisterClientData("foobar", &RegisterClientData{})) + + err = s.save() + assert.Nil(t, err) +} + +func TestBadFilePerms(t *testing.T) { + fname := "./testdata/new-store.json" + defer os.Remove(fname) + err := os.WriteFile(fname, []byte{}, 0000) + assert.NoError(t, err) + + _, err = OpenJsonStore(fname) + assert.Error(t, err) +} + type JsonStoreTestSuite struct { suite.Suite json *JsonStore