From 3d3b75fb8d42409d717c27b1c1c70b4a925d0e3f Mon Sep 17 00:00:00 2001 From: poornas Date: Wed, 10 Jun 2020 08:16:30 -0700 Subject: [PATCH] Avoid overwriting object tags when changing lock (#9794) --- cmd/object-handlers.go | 9 ++++++++- cmd/storage-datatypes.go | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/cmd/object-handlers.go b/cmd/object-handlers.go index 63a0f95e1..c38c3a962 100644 --- a/cmd/object-handlers.go +++ b/cmd/object-handlers.go @@ -2699,8 +2699,11 @@ func (api objectAPIHandlers) PutObjectLegalHoldHandler(w http.ResponseWriter, r return } objInfo.UserDefined[strings.ToLower(xhttp.AmzObjectLockLegalHold)] = strings.ToUpper(string(legalHold.Status)) + if objInfo.UserTags != "" { + objInfo.UserDefined[xhttp.AmzTagDirective] = replaceDirective + objInfo.UserDefined[xhttp.AmzObjectTagging] = objInfo.UserTags + } objInfo.metadataOnly = true - if _, err = objectAPI.CopyObject(ctx, bucket, object, bucket, object, objInfo, ObjectOptions{}, ObjectOptions{}); err != nil { writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) return @@ -2857,6 +2860,10 @@ func (api objectAPIHandlers) PutObjectRetentionHandler(w http.ResponseWriter, r objInfo.UserDefined[strings.ToLower(xhttp.AmzObjectLockMode)] = string(objRetention.Mode) objInfo.UserDefined[strings.ToLower(xhttp.AmzObjectLockRetainUntilDate)] = objRetention.RetainUntilDate.UTC().Format(time.RFC3339) + if objInfo.UserTags != "" { + objInfo.UserDefined[xhttp.AmzTagDirective] = replaceDirective + objInfo.UserDefined[xhttp.AmzObjectTagging] = objInfo.UserTags + } objInfo.metadataOnly = true // Perform only metadata updates. if _, err = objectAPI.CopyObject(ctx, bucket, object, bucket, object, objInfo, ObjectOptions{}, ObjectOptions{}); err != nil { writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) diff --git a/cmd/storage-datatypes.go b/cmd/storage-datatypes.go index 743204f4d..12f3ed194 100644 --- a/cmd/storage-datatypes.go +++ b/cmd/storage-datatypes.go @@ -85,7 +85,7 @@ func (entry FileInfo) ToObjectInfo() ObjectInfo { ContentEncoding: entry.Metadata["content-encoding"], } - // Extrat object tagging information + // Extract object tagging information objInfo.UserTags = entry.Metadata[xhttp.AmzObjectTagging] // Extract etag from metadata.