diff --git a/api/handler/delete.go b/api/handler/delete.go index 39769ff..8ac9fa9 100644 --- a/api/handler/delete.go +++ b/api/handler/delete.go @@ -246,7 +246,7 @@ func (h *handler) DeleteBucketHandler(w http.ResponseWriter, r *http.Request) { } if err = checkOwner(bktInfo, reqInfo.User); err != nil { - h.logAndSendError(w, "request owner id does not match bucket owner id", reqInfo, err) + h.logAndSendError(ctx, w, "request owner id does not match bucket owner id", reqInfo, err) return } diff --git a/api/layer/multipart_upload.go b/api/layer/multipart_upload.go index ed7612c..f0e78b4 100644 --- a/api/layer/multipart_upload.go +++ b/api/layer/multipart_upload.go @@ -224,8 +224,12 @@ func (n *Layer) uploadPart(ctx context.Context, multipartInfo *data.MultipartInf } decSize := p.Size + md5Hash := md5.New() if p.Info.Encryption.Enabled() { - r, encSize, err := encryptionReader(p.Reader, p.Size, p.Info.Encryption.Key()) + rr := wrapReader(p.Reader, 64*1024, func(buf []byte) { + md5Hash.Write(buf) + }) + r, encSize, err := encryptionReader(rr, p.Size, p.Info.Encryption.Key()) if err != nil { return nil, fmt.Errorf("failed to create ecnrypted reader: %w", err) } @@ -246,7 +250,12 @@ func (n *Layer) uploadPart(ctx context.Context, multipartInfo *data.MultipartInf if err != nil { return nil, apierr.GetAPIError(apierr.ErrInvalidDigest) } - if hex.EncodeToString(hashBytes) != hex.EncodeToString(createdObj.MD5Sum) { + + match := hex.EncodeToString(hashBytes) == hex.EncodeToString(createdObj.MD5Sum) + if p.Info.Encryption.Enabled() { + match = hex.EncodeToString(hashBytes) == hex.EncodeToString(md5Hash.Sum(nil)) + } + if !match { prm := frostfs.PrmObjectDelete{ Object: createdObj.ID, Container: bktInfo.CID, @@ -449,7 +458,6 @@ func (n *Layer) CompleteMultipartUpload(ctx context.Context, p *CompleteMultipar initMetadata[AttributeHMACKey] = encInfo.HMACKey initMetadata[AttributeHMACSalt] = encInfo.HMACSalt initMetadata[AttributeDecryptedSize] = strconv.FormatUint(multipartObjetSize, 10) - multipartObjetSize = encMultipartObjectSize } partsData, err := json.Marshal(parts)