fix: fixes checksum header and algorithm mismatch error

Fixes #1598

`PutObject` and `UploadPart` accept x-amz-checksum-* calculated checksum headers and `x-amz-sdk-checksum-algorithm`. If the checksum algorithm specified in sdk algorithm doesn't match the one in x-amz-checksum-*, it now returns the correct error message: `Value for x-amz-sdk-checksum-algorithm header is invalid.`.
This commit is contained in:
niksis02
2025-10-27 20:58:37 +04:00
committed by Ben McClelland
parent 559d636846
commit 8c3e49d0bb
3 changed files with 32 additions and 6 deletions

View File

@@ -522,14 +522,14 @@ func ParseChecksumHeadersAndSdkAlgo(ctx *fiber.Ctx) (types.ChecksumAlgorithm, Ch
}
for al, val := range checksums {
if !IsValidChecksum(val, al) {
return sdkAlgorithm, checksums, s3err.GetInvalidChecksumHeaderErr(fmt.Sprintf("x-amz-checksum-%v", strings.ToLower(string(al))))
}
// If any other checksum value is provided,
// rather than x-amz-sdk-checksum-algorithm
if sdkAlgorithm != "" && sdkAlgorithm != al {
return sdkAlgorithm, checksums, s3err.GetAPIError(s3err.ErrChecksumSDKAlgoMismatch)
}
if !IsValidChecksum(val, al) {
return sdkAlgorithm, checksums, s3err.GetInvalidChecksumHeaderErr(fmt.Sprintf("x-amz-checksum-%v", strings.ToLower(string(al))))
return sdkAlgorithm, checksums, s3err.GetInvalidChecksumHeaderErr("x-amz-sdk-checksum-algorithm")
}
sdkAlgorithm = al
}

View File

@@ -386,6 +386,7 @@ func TestUploadPart(ts *TestState) {
if !ts.conf.azureTests {
ts.Run(UploadPart_multiple_checksum_headers)
ts.Run(UploadPart_invalid_checksum_header)
ts.Run(UploadPart_checksum_header_and_algo_mismatch)
ts.Run(UploadPart_checksum_algorithm_mistmatch_on_initialization)
ts.Run(UploadPart_checksum_algorithm_mistmatch_on_initialization_with_value)
ts.Run(UploadPart_incorrect_checksums)
@@ -1313,6 +1314,7 @@ func GetIntTests() IntTests {
"UploadPart_non_existing_mp_upload": UploadPart_non_existing_mp_upload,
"UploadPart_multiple_checksum_headers": UploadPart_multiple_checksum_headers,
"UploadPart_invalid_checksum_header": UploadPart_invalid_checksum_header,
"UploadPart_checksum_header_and_algo_mismatch": UploadPart_checksum_header_and_algo_mismatch,
"UploadPart_checksum_algorithm_mistmatch_on_initialization": UploadPart_checksum_algorithm_mistmatch_on_initialization,
"UploadPart_checksum_algorithm_mistmatch_on_initialization_with_value": UploadPart_checksum_algorithm_mistmatch_on_initialization_with_value,
"UploadPart_incorrect_checksums": UploadPart_incorrect_checksums,

View File

@@ -3254,7 +3254,7 @@ func PutObject_checksum_algorithm_and_header_mismatch(s *S3Conf) error {
// FIXME: The error message for PutObject is not properly serialized by the sdk
// References to aws sdk issue https://github.com/aws/aws-sdk-go-v2/issues/2921
// if err := checkApiErr(err, s3err.GetAPIError(s3err.ErrMultipleChecksumHeaders)); err != nil {
// if err := checkApiErr(err, s3err.GetInvalidChecksumHeaderErr("x-amz-sdk-checksum-algorithm"); err != nil {
// return err
// }
if err := checkSdkApiErr(err, "InvalidRequest"); err != nil {
@@ -10001,6 +10001,30 @@ func UploadPart_invalid_checksum_header(s *S3Conf) error {
})
}
func UploadPart_checksum_header_and_algo_mismatch(s *S3Conf) error {
testName := "UploadPart_checksum_header_and_algo_mismatch"
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {
obj := "my-object"
mp, err := createMp(s3client, bucket, obj)
if err != nil {
return err
}
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
_, err = s3client.UploadPart(ctx, &s3.UploadPartInput{
Bucket: &bucket,
Key: &obj,
UploadId: mp.UploadId,
PartNumber: getPtr(int32(1)),
Body: strings.NewReader("dummy"),
ChecksumAlgorithm: types.ChecksumAlgorithmCrc32,
ChecksumCRC32C: getPtr("muDarg=="),
})
cancel()
return checkApiErr(err, s3err.GetInvalidChecksumHeaderErr("x-amz-sdk-checksum-algorithm"))
})
}
func UploadPart_checksum_algorithm_mistmatch_on_initialization(s *S3Conf) error {
testName := "UploadPart_checksum_algorithm_mistmatch_on_initialization"
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {