mirror of
https://github.com/versity/versitygw.git
synced 2026-04-26 15:35:05 +00:00
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:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user