diff --git a/s3api/utils/utils.go b/s3api/utils/utils.go index 80d2a86..d8d5850 100644 --- a/s3api/utils/utils.go +++ b/s3api/utils/utils.go @@ -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 } diff --git a/tests/integration/group-tests.go b/tests/integration/group-tests.go index 3a9e709..1254ca9 100644 --- a/tests/integration/group-tests.go +++ b/tests/integration/group-tests.go @@ -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, diff --git a/tests/integration/tests.go b/tests/integration/tests.go index c277b8a..a667fdc 100644 --- a/tests/integration/tests.go +++ b/tests/integration/tests.go @@ -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 {