fix: reject a ListBuckets bucket-region other than the gateway region
S3 never lists an empty result for another region: a valid region other than the endpoint's own gets 400 InvalidArgument, "Requests with bucket-region specified must be made to the corresponding regional endpoint", with no ArgumentValue. The gateway is a single regional endpoint, so it now does the same instead of clearing the listing. Match the region case-insensitively like S3, and check an empty bucket-region= too by looking for the query argument itself, since an empty value is not a valid AWS region either.
This commit is contained in:
1 parent
5d293b1316
commit
e1d2284906
7 files changed
+104
-56
No files matched your search
@@ -19,7 +19,6 @@ import (
|
||||
"github.com/versity/versitygw/auth"
|
||||
"github.com/versity/versitygw/debuglogger"
|
||||
"github.com/versity/versitygw/s3api/utils"
|
||||
"github.com/versity/versitygw/s3err"
|
||||
"github.com/versity/versitygw/s3response"
|
||||
)
|
||||
|
||||
@@ -58,11 +57,14 @@ func (c S3ApiController) ListBuckets(ctx fiber.Ctx) (*Response, error) {
|
||||
}, err
|
||||
}
|
||||
|
||||
if bucketRegion != "" && !utils.IsValidBucketRegion(bucketRegion, region) {
|
||||
debuglogger.Logf("invalid bucket region: %s", bucketRegion)
|
||||
return &Response{
|
||||
MetaOpts: &MetaOptions{},
|
||||
}, s3err.GetInvalidArgBucketRegion(bucketRegion)
|
||||
// an empty bucket-region= is checked too, so look for the argument itself
|
||||
if ctx.Request().URI().QueryArgs().Has("bucket-region") {
|
||||
if err := utils.ValidateBucketRegion(bucketRegion, region); err != nil {
|
||||
debuglogger.Logf("invalid bucket region: %q", bucketRegion)
|
||||
return &Response{
|
||||
MetaOpts: &MetaOptions{},
|
||||
}, err
|
||||
}
|
||||
}
|
||||
|
||||
// IsAdmin is the backends' "return every bucket, unfiltered" flag.
|
||||
@@ -78,13 +80,6 @@ func (c S3ApiController) ListBuckets(ctx fiber.Ctx) (*Response, error) {
|
||||
return &Response{}, err
|
||||
}
|
||||
|
||||
// every bucket lives in the gateway region, so there is nothing
|
||||
// to list for any other region
|
||||
if bucketRegion != "" && bucketRegion != region {
|
||||
res.Buckets.Bucket = nil
|
||||
res.ContinuationToken = ""
|
||||
}
|
||||
|
||||
for i := range res.Buckets.Bucket {
|
||||
res.Buckets.Bucket[i].BucketRegion = region
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user