diff --git a/changelog/unreleased/issue-219 b/changelog/unreleased/issue-219 new file mode 100644 index 0000000..55a0358 --- /dev/null +++ b/changelog/unreleased/issue-219 @@ -0,0 +1,9 @@ +Bugfix: Ignore unexpected files in the data/ folder + +If the data folder of a repository contained files, this would prevent restic +from retrieving a list of file data files. This has been fixed. As a workaround +remove the files that are directly contained in the data folder (e.g., +`.DS_Store` files). + +https://github.com/restic/rest-server/issues/219 +https://github.com/restic/rest-server/pull/221 diff --git a/handlers_test.go b/handlers_test.go index 4ebd195..7907825 100644 --- a/handlers_test.go +++ b/handlers_test.go @@ -379,6 +379,32 @@ func TestResticErrorHandler(t *testing.T) { } } +func TestListWithUnexpectedFiles(t *testing.T) { + mux, _, _, tempdir, cleanup := createTestHandler(t, Server{ + AppendOnly: true, + NoAuth: true, + Debug: true, + }) + defer cleanup() + + // create the repo + checkRequest(t, mux.ServeHTTP, + newRequest(t, "POST", "/?create=true", nil), + []wantFunc{wantCode(http.StatusOK)}) + err := os.WriteFile(path.Join(tempdir, "data", "temp"), []byte{}, 0o666) + if err != nil { + t.Fatalf("creating unexpected file failed: %v", err) + } + + for i := 1; i <= 2; i++ { + req := newRequest(t, "GET", "/data/", nil) + req.Header.Set("Accept", "application/vnd.x.restic.rest.v2") + + checkRequest(t, mux.ServeHTTP, req, + []wantFunc{wantCode(http.StatusOK)}) + } +} + func TestSplitURLPath(t *testing.T) { var tests = []struct { // Params diff --git a/repo/repo.go b/repo/repo.go index 5fc9883..3162980 100644 --- a/repo/repo.go +++ b/repo/repo.go @@ -379,6 +379,10 @@ func (h *Handler) listBlobsV1(w http.ResponseWriter, r *http.Request) { var names []string for _, i := range items { if isHashed(objectType) { + if !i.IsDir() { + // ignore files in intermediate directories + continue + } subpath := filepath.Join(path, i.Name()) var subitems []os.FileInfo subitems, err = ioutil.ReadDir(subpath) @@ -434,6 +438,10 @@ func (h *Handler) listBlobsV2(w http.ResponseWriter, r *http.Request) { var blobs []Blob for _, i := range items { if isHashed(objectType) { + if !i.IsDir() { + // ignore files in intermediate directories + continue + } subpath := filepath.Join(path, i.Name()) var subitems []os.FileInfo subitems, err = ioutil.ReadDir(subpath)