@@ -243,19 +243,70 @@ func TestFilesystemLargeFile(t *testing.T) {
243243 assertLargeFileRoundTrip (t , createTestFilesystem (t ))
244244}
245245
246- func TestFilesystemRejectsTraversal (t * testing.T ) {
246+ func TestFilesystemRejectsInvalidPaths (t * testing.T ) {
247247 tmp := t .TempDir ()
248248 fs , err := NewFilesystem (tmp )
249249 if err != nil {
250250 t .Fatal (err )
251251 }
252- for _ , p := range []string {"../etc/passwd" , "../../etc/passwd" , "a/../../etc/passwd" } {
253- if _ , err := fs .Open (context .Background (), p ); err == nil {
254- t .Errorf ("Open(%q) should reject traversal" , p )
255- }
256- if _ , _ , err := fs .Store (context .Background (), p , strings .NewReader ("x" )); err == nil {
257- t .Errorf ("Store(%q) should reject traversal" , p )
252+ for _ , p := range []string {
253+ "" ,
254+ "." ,
255+ "../etc/passwd" ,
256+ "../../etc/passwd" ,
257+ "a/../../etc/passwd" ,
258+ "/etc/passwd" ,
259+ "test//file.txt" ,
260+ "test/./file.txt" ,
261+ "test/../file.txt" ,
262+ `test\..\file.txt` ,
263+ } {
264+ name := p
265+ if name == "" {
266+ name = "empty"
258267 }
268+
269+ t .Run (name , func (t * testing.T ) {
270+ ctx := context .Background ()
271+
272+ if _ , err := fs .FullPath (p ); ! errors .Is (err , ErrNotFound ) {
273+ t .Errorf ("FullPath(%q) = %v, want ErrNotFound" , p , err )
274+ }
275+ if _ , err := fs .Open (ctx , p ); err == nil {
276+ t .Errorf ("Open(%q) should reject invalid path" , p )
277+ }
278+ if _ , _ , err := fs .Store (ctx , p , strings .NewReader ("x" )); err == nil {
279+ t .Errorf ("Store(%q) should reject invalid path" , p )
280+ }
281+ if _ , err := fs .Exists (ctx , p ); err == nil {
282+ t .Errorf ("Exists(%q) should reject invalid path" , p )
283+ }
284+ if err := fs .Delete (ctx , p ); err == nil {
285+ t .Errorf ("Delete(%q) should reject invalid path" , p )
286+ }
287+ if _ , err := fs .Size (ctx , p ); err == nil {
288+ t .Errorf ("Size(%q) should reject invalid path" , p )
289+ }
290+ if _ , err := fs .ListPrefix (ctx , p ); p != "" && err == nil {
291+ t .Errorf ("ListPrefix(%q) should reject invalid path" , p )
292+ }
293+ })
294+ }
295+ }
296+
297+ func TestFilesystemListPrefixAllowsEmptyPrefix (t * testing.T ) {
298+ fs := createTestFilesystem (t )
299+ ctx := context .Background ()
300+
301+ _ , _ , _ = fs .Store (ctx , "a.txt" , strings .NewReader ("aaaa" ))
302+ _ , _ , _ = fs .Store (ctx , "c/d.txt" , strings .NewReader ("ccccc" ))
303+
304+ objects , err := fs .ListPrefix (ctx , "" )
305+ if err != nil {
306+ t .Fatalf ("ListPrefix empty prefix failed: %v" , err )
307+ }
308+ if len (objects ) != 2 {
309+ t .Fatalf ("ListPrefix empty prefix returned %d objects, want 2" , len (objects ))
259310 }
260311}
261312
0 commit comments