From d3c59d18e56d55fc0466ec42cab55f2f8630acdd Mon Sep 17 00:00:00 2001 From: Alexander Weiss Date: Thu, 5 Dec 2019 14:29:34 +0100 Subject: [PATCH] Fix inconsistency of saving/loading config file Fix saving/loading config file: Always set ID to a zero ID. --- internal/repository/repository.go | 10 +++++++++- internal/repository/repository_test.go | 8 ++++++++ internal/repository/testing.go | 4 ++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/internal/repository/repository.go b/internal/repository/repository.go index 64781f9e4..e11e5bdb3 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -82,6 +82,10 @@ func (r *Repository) LoadAndDecrypt(ctx context.Context, buf []byte, t restic.Fi debug.Log("load %v with id %v", t, id) + if t == restic.ConfigFile { + id = restic.ID{} + } + h := restic.Handle{Type: t, Name: id.String()} err := r.be.Load(ctx, h, 0, 0, func(rd io.Reader) error { // make sure this call is idempotent, in case an error occurs @@ -295,7 +299,11 @@ func (r *Repository) SaveUnpacked(ctx context.Context, t restic.FileType, p []by ciphertext = r.key.Seal(ciphertext, nonce, p, nil) - id = restic.Hash(ciphertext) + if t == restic.ConfigFile { + id = restic.ID{} + } else { + id = restic.Hash(ciphertext) + } h := restic.Handle{Type: t, Name: id.String()} err = r.be.Save(ctx, h, restic.NewByteReader(ciphertext)) diff --git a/internal/repository/repository_test.go b/internal/repository/repository_test.go index 5d275b4e6..f640ed631 100644 --- a/internal/repository/repository_test.go +++ b/internal/repository/repository_test.go @@ -274,6 +274,14 @@ func TestLoadJSONUnpacked(t *testing.T) { rtest.Equals(t, sn.Hostname, sn2.Hostname) rtest.Equals(t, sn.Username, sn2.Username) + + var cf restic.Config + + // load and check Config + err = repo.LoadJSONUnpacked(context.TODO(), restic.ConfigFile, id, &cf) + rtest.OK(t, err) + + rtest.Equals(t, cf.ChunkerPolynomial, repository.TestChunkerPol) } var repoFixture = filepath.Join("testdata", "test-repo.tar.gz") diff --git a/internal/repository/testing.go b/internal/repository/testing.go index e070cdc8a..77f1e145d 100644 --- a/internal/repository/testing.go +++ b/internal/repository/testing.go @@ -36,7 +36,7 @@ func TestBackend(t testing.TB) (be restic.Backend, cleanup func()) { return mem.New(), func() {} } -const testChunkerPol = chunker.Pol(0x3DA3358B4DC173) +const TestChunkerPol = chunker.Pol(0x3DA3358B4DC173) // TestRepositoryWithBackend returns a repository initialized with a test // password. If be is nil, an in-memory backend is used. A constant polynomial @@ -53,7 +53,7 @@ func TestRepositoryWithBackend(t testing.TB, be restic.Backend) (r restic.Reposi repo := New(be) - cfg := restic.TestCreateConfig(t, testChunkerPol) + cfg := restic.TestCreateConfig(t, TestChunkerPol) err := repo.init(context.TODO(), test.TestPassword, cfg) if err != nil { t.Fatalf("TestRepository(): initialize repo failed: %v", err)