5 changed files with 101 additions and 70 deletions
-
7weed/command/filer_remote_gateway_buckets.go
-
22weed/filer/empty_folder_cleanup/empty_folder_cleaner.go
-
46weed/filer/empty_folder_cleanup/empty_folder_cleaner_test.go
-
33weed/util/buckets.go
-
63weed/util/buckets_test.go
@ -0,0 +1,33 @@ |
|||
package util |
|||
|
|||
import "strings" |
|||
|
|||
// ExtractBucketPath returns the bucket path under basePath that contains target.
|
|||
// If requireChild is true, the target must include additional segments beyond the bucket itself.
|
|||
func ExtractBucketPath(basePath, target string, requireChild bool) (string, bool) { |
|||
cleanBase := strings.TrimSuffix(basePath, "/") |
|||
if cleanBase == "" { |
|||
return "", false |
|||
} |
|||
|
|||
prefix := cleanBase + "/" |
|||
if !strings.HasPrefix(target, prefix) { |
|||
return "", false |
|||
} |
|||
|
|||
rest := strings.TrimPrefix(target, prefix) |
|||
if rest == "" { |
|||
return "", false |
|||
} |
|||
|
|||
bucketName, _, found := strings.Cut(rest, "/") |
|||
if bucketName == "" { |
|||
return "", false |
|||
} |
|||
|
|||
if requireChild && !found { |
|||
return "", false |
|||
} |
|||
|
|||
return prefix + bucketName, true |
|||
} |
|||
@ -0,0 +1,63 @@ |
|||
package util |
|||
|
|||
import "testing" |
|||
|
|||
func TestExtractBucketPath(t *testing.T) { |
|||
for _, tt := range []struct { |
|||
name string |
|||
base string |
|||
target string |
|||
requireChild bool |
|||
expected string |
|||
ok bool |
|||
}{ |
|||
{ |
|||
name: "child paths return bucket", |
|||
base: "/buckets", |
|||
target: "/buckets/test/folder/file", |
|||
requireChild: true, |
|||
expected: "/buckets/test", |
|||
ok: true, |
|||
}, |
|||
{ |
|||
name: "bucket root without child fails when required", |
|||
base: "/buckets", |
|||
target: "/buckets/test", |
|||
requireChild: true, |
|||
ok: false, |
|||
}, |
|||
{ |
|||
name: "bucket root allowed when not required", |
|||
base: "/buckets", |
|||
target: "/buckets/test", |
|||
requireChild: false, |
|||
expected: "/buckets/test", |
|||
ok: true, |
|||
}, |
|||
{ |
|||
name: "path outside buckets fails", |
|||
base: "/buckets", |
|||
target: "/data/test/folder", |
|||
requireChild: true, |
|||
ok: false, |
|||
}, |
|||
{ |
|||
name: "trailing slash on base is normalized", |
|||
base: "/buckets/", |
|||
target: "/buckets/test/sub", |
|||
requireChild: true, |
|||
expected: "/buckets/test", |
|||
ok: true, |
|||
}, |
|||
} { |
|||
t.Run(tt.name, func(t *testing.T) { |
|||
got, ok := ExtractBucketPath(tt.base, tt.target, tt.requireChild) |
|||
if ok != tt.ok { |
|||
t.Fatalf("expected ok=%v, got %v", tt.ok, ok) |
|||
} |
|||
if got != tt.expected { |
|||
t.Fatalf("expected path %q, got %q", tt.expected, got) |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue