diff --git a/tuf/store/filestore.go b/tuf/store/filestore.go index b01b117588..7e7ea02f8c 100644 --- a/tuf/store/filestore.go +++ b/tuf/store/filestore.go @@ -75,6 +75,9 @@ func (f *FilesystemStore) SetMeta(name string, meta []byte) error { return err } + // if something already exists, just delete it and re-write it + os.RemoveAll(path) + // Write the file to disk if err = ioutil.WriteFile(path, meta, 0600); err != nil { return err diff --git a/tuf/store/filestore_test.go b/tuf/store/filestore_test.go index ff79c5ebda..ea013fca2a 100644 --- a/tuf/store/filestore_test.go +++ b/tuf/store/filestore_test.go @@ -4,6 +4,7 @@ import ( "io/ioutil" "os" "path" + "path/filepath" "testing" "github.com/stretchr/testify/assert" @@ -57,6 +58,24 @@ func TestSetMetaWithNoParentDirectory(t *testing.T) { assert.Equal(t, testContent, content, "Content written to file was corrupted.") } +// if something already existed there, remove it first and write a new file +func TestSetMetaRemovesExistingFileBeforeWriting(t *testing.T) { + s, err := NewFilesystemStore(testDir, "metadata", "json", "targets") + assert.Nil(t, err, "Initializing FilesystemStore returned unexpected error: %v", err) + defer os.RemoveAll(testDir) + + // make a directory where we want metadata to go + os.Mkdir(filepath.Join(testDir, "metadata", "root.json"), 0700) + + testContent := []byte("test data") + err = s.SetMeta("root", testContent) + assert.NoError(t, err, "SetMeta returned unexpected error: %v", err) + + content, err := ioutil.ReadFile(path.Join(testDir, "metadata", "root.json")) + assert.NoError(t, err, "Error reading file: %v", err) + assert.Equal(t, testContent, content, "Content written to file was corrupted.") +} + func TestGetMeta(t *testing.T) { s, err := NewFilesystemStore(testDir, "metadata", "json", "targets") assert.Nil(t, err, "Initializing FilesystemStore returned unexpected error: %v", err)