Skip to content

Commit e728eef

Browse files
committed
rootFS tests
1 parent bf7d11c commit e728eef

File tree

3 files changed

+39
-10
lines changed

3 files changed

+39
-10
lines changed

internal/servegit/gitservice.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"bytes"
66
"compress/gzip"
77
"context"
8+
"io"
89
"net/http"
910
"os"
1011
"os/exec"
@@ -77,7 +78,7 @@ type Handler struct {
7778
// failed, it will pass in a non-nil error.
7879
Trace func(ctx context.Context, svc, repo, protocol string) func(error)
7980

80-
// RootFS is a traversal safe API that ensures file outside of the
81+
// RootFS is a traversal safe API that ensures files outside of the
8182
// root cannot be opened.
8283
RootFS *os.Root
8384
}
@@ -108,7 +109,10 @@ func (s *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
108109
return
109110
}
110111

111-
if _, err = s.RootFS.Stat(dir); os.IsNotExist(err) {
112+
// os.Root only accepts relative paths from it's root. So we trim the
113+
// prefix.
114+
relDir := strings.TrimPrefix(dir, s.RootFS.Name()+string(os.PathSeparator))
115+
if _, err = s.RootFS.Stat(relDir); os.IsNotExist(err) {
112116
http.Error(w, "repository not found", http.StatusNotFound)
113117
return
114118
} else if err != nil {

internal/servegit/gitservice_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"context"
66
"fmt"
77
"net/http/httptest"
8+
"os"
89
"os/exec"
910
"path/filepath"
1011
"strings"
@@ -31,10 +32,16 @@ func TestHandler(t *testing.T) {
3132
runCmd(t, repo, "git", "tag", fmt.Sprintf("v%d", i+1))
3233
}
3334

35+
rootFS, err := os.OpenRoot(root)
36+
if err != nil {
37+
t.Fatal(err)
38+
}
39+
3440
ts := httptest.NewServer(&Handler{
3541
Dir: func(_ context.Context, s string) (string, error) {
3642
return filepath.Join(root, s, ".git"), nil
3743
},
44+
RootFS: rootFS,
3845
})
3946
defer ts.Close()
4047

internal/servegit/serve_test.go

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,20 @@ func TestReposHandler(t *testing.T) {
3636
}}
3737
for _, tc := range cases {
3838
t.Run(tc.name, func(t *testing.T) {
39+
3940
root := gitInitRepos(t, tc.repos...)
4041

42+
rootFS, err := os.OpenRoot(root)
43+
if err != nil {
44+
t.Fatal(err)
45+
}
46+
4147
h := (&Serve{
42-
Info: testLogger(t),
43-
Debug: discardLogger,
44-
Addr: testAddress,
45-
Root: root,
48+
Info: testLogger(t),
49+
Debug: discardLogger,
50+
Addr: testAddress,
51+
Root: root,
52+
RootFS: rootFS,
4653
}).handler()
4754

4855
var want []Repo
@@ -134,6 +141,11 @@ func gitInitRepos(t *testing.T, names ...string) string {
134141
root := t.TempDir()
135142
root = filepath.Join(root, "repos-root")
136143

144+
err := os.Mkdir(root, 0755)
145+
if err != nil {
146+
t.Fatal(err)
147+
}
148+
137149
for _, name := range names {
138150
p := filepath.Join(root, name)
139151
if err := os.MkdirAll(p, 0755); err != nil {
@@ -161,10 +173,16 @@ func TestIgnoreGitSubmodules(t *testing.T) {
161173
t.Fatal(err)
162174
}
163175

176+
rootFS, err := os.OpenRoot(root)
177+
if err != nil {
178+
t.Fatal(err)
179+
}
180+
164181
repos, err := (&Serve{
165-
Info: testLogger(t),
166-
Debug: discardLogger,
167-
Root: root,
182+
Info: testLogger(t),
183+
Debug: discardLogger,
184+
Root: root,
185+
RootFS: rootFS,
168186
}).Repos()
169187
if err != nil {
170188
t.Fatal(err)
@@ -201,6 +219,6 @@ type testWriter struct {
201219
}
202220

203221
func (tw testWriter) Write(p []byte) (n int, err error) {
204-
tw.T.Log(string(p))
222+
tw.Log(string(p))
205223
return len(p), nil
206224
}

0 commit comments

Comments
 (0)