Browse Source

S3: add s3: prefix to x-amz-* condition keys for AWS compatibility (#8765)

AWS S3 policy conditions reference request headers with the s3: namespace
prefix (e.g., s3:x-amz-server-side-encryption). The extraction code was
storing these headers without the prefix, so bucket policy conditions
using the standard AWS key names would never match.
pull/8756/merge
Chris Lu 1 day ago
committed by GitHub
parent
commit
152884eff2
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 7
      weed/s3api/policy_engine/engine.go
  2. 4
      weed/s3api/policy_engine/engine_test.go

7
weed/s3api/policy_engine/engine.go

@ -427,10 +427,11 @@ func ExtractConditionValuesFromRequest(r *http.Request) map[string][]string {
// HTTP method
values["s3:RequestMethod"] = []string{r.Method}
// Extract custom headers
// Extract custom headers with s3: prefix for AWS-compatible condition keys
for key, headerValues := range r.Header {
if strings.HasPrefix(strings.ToLower(key), "x-amz-") {
values[strings.ToLower(key)] = headerValues
lowerKey := strings.ToLower(key)
if strings.HasPrefix(lowerKey, "x-amz-") {
values["s3:"+lowerKey] = headerValues
}
}

4
weed/s3api/policy_engine/engine_test.go

@ -444,8 +444,8 @@ func TestExtractConditionValuesFromRequest(t *testing.T) {
t.Errorf("Expected RequestMethod to be GET, got %v", values["s3:RequestMethod"])
}
if len(values["x-amz-copy-source"]) != 1 || values["x-amz-copy-source"][0] != "source-bucket/source-object" {
t.Errorf("Expected X-Amz-Copy-Source header to be extracted, got %v", values["x-amz-copy-source"])
if len(values["s3:x-amz-copy-source"]) != 1 || values["s3:x-amz-copy-source"][0] != "source-bucket/source-object" {
t.Errorf("Expected X-Amz-Copy-Source header to be extracted with s3: prefix, got %v", values["s3:x-amz-copy-source"])
}
// Check that aws:CurrentTime is properly set

Loading…
Cancel
Save