aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchrislu <chris.lu@gmail.com>2025-03-18 08:35:53 -0700
committerchrislu <chris.lu@gmail.com>2025-03-18 08:35:53 -0700
commitcb33ee006ea570dc770f0a8be4af2f6601fd170f (patch)
treeede4d156595b11a678e860494d7c0e794f07a9a3
parente60aa718908ccf1c94784ed507aa4e3b9578131d (diff)
downloadseaweedfs-cb33ee006ea570dc770f0a8be4af2f6601fd170f.tar.xz
seaweedfs-cb33ee006ea570dc770f0a8be4af2f6601fd170f.zip
skip headers when signing a request
fix https://github.com/seaweedfs/seaweedfs/issues/6576#issuecomment-2724577279
-rw-r--r--weed/s3api/auth_signature_v4.go23
1 files changed, 16 insertions, 7 deletions
diff --git a/weed/s3api/auth_signature_v4.go b/weed/s3api/auth_signature_v4.go
index 7ee761a67..33780a1cc 100644
--- a/weed/s3api/auth_signature_v4.go
+++ b/weed/s3api/auth_signature_v4.go
@@ -62,6 +62,19 @@ const (
streamingUnsignedPayload = "STREAMING-UNSIGNED-PAYLOAD-TRAILER"
)
+// AWS S3 authentication headers that should be skipped when signing the request
+// https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html
+var awsS3AuthHeaders = map[string]struct{}{
+ "x-amz-content-sha256": {},
+ "x-amz-security-token": {},
+ "x-amz-algorithm": {},
+ "x-amz-date": {},
+ "x-amz-expires": {},
+ "x-amz-signedheaders": {},
+ "x-amz-credential": {},
+ "x-amz-signature": {},
+}
+
// Returns SHA256 for calculating canonical-request.
func getContentSha256Cksum(r *http.Request) string {
var (
@@ -424,15 +437,11 @@ func (iam *IdentityAccessManagement) doesPresignedSignatureMatch(hashedPayload s
// Save other headers available in the request parameters.
for k, v := range req.URL.Query() {
-
- // Handle the metadata in presigned put query string
- if strings.Contains(strings.ToLower(k), "x-amz-meta-") {
- query.Set(k, v[0])
- }
-
- if strings.HasPrefix(strings.ToLower(k), "x-amz") {
+ // Skip AWS S3 authentication headers
+ if _, ok := awsS3AuthHeaders[strings.ToLower(k)]; ok {
continue
}
+
query[k] = v
}