From 8a6c3aa3cd407ac80e6199776013b9f7278ca059 Mon Sep 17 00:00:00 2001 From: Andreas Auernhammer Date: Fri, 19 Oct 2018 19:50:52 +0200 Subject: [PATCH] crypto: add RemoveInternalEntries function (#6616) This commit adds a function for removing crypto-specific internal entries from the object metadata. See #6604 --- cmd/crypto/metadata.go | 12 +++++++++ cmd/crypto/metadata_test.go | 50 +++++++++++++++++++++++++++++++++++++ cmd/object-handlers.go | 8 +----- 3 files changed, 63 insertions(+), 7 deletions(-) diff --git a/cmd/crypto/metadata.go b/cmd/crypto/metadata.go index a85e598c5..08680f3d4 100644 --- a/cmd/crypto/metadata.go +++ b/cmd/crypto/metadata.go @@ -40,6 +40,18 @@ func RemoveSensitiveEntries(metadata map[string]string) { // The functions is te delete(metadata, SSECopyKey) } +// RemoveInternalEntries removes all crypto-specific internal +// metadata entries from the metadata map. +func RemoveInternalEntries(metadata map[string]string) { + delete(metadata, SSEMultipart) + delete(metadata, SSEIV) + delete(metadata, SSESealAlgorithm) + delete(metadata, SSECSealedKey) + delete(metadata, S3SealedKey) + delete(metadata, S3KMSKeyID) + delete(metadata, S3KMSSealedKey) +} + // IsEncrypted returns true if the object metadata indicates // that it was uploaded using some form of server-side-encryption. // diff --git a/cmd/crypto/metadata_test.go b/cmd/crypto/metadata_test.go index 3fc448eca..ed73988a9 100644 --- a/cmd/crypto/metadata_test.go +++ b/cmd/crypto/metadata_test.go @@ -387,3 +387,53 @@ func TestIsETagSealed(t *testing.T) { } } } + +var removeInternalEntriesTests = []struct { + Metadata, Expected map[string]string +}{ + { // 0 + Metadata: map[string]string{ + SSEMultipart: "", + SSEIV: "", + SSESealAlgorithm: "", + SSECSealedKey: "", + S3SealedKey: "", + S3KMSKeyID: "", + S3KMSSealedKey: "", + }, + Expected: map[string]string{}, + }, + { // 1 + Metadata: map[string]string{ + SSEMultipart: "", + SSEIV: "", + "X-Amz-Meta-A": "X", + "X-Minio-Internal-B": "Y", + }, + Expected: map[string]string{ + "X-Amz-Meta-A": "X", + "X-Minio-Internal-B": "Y", + }, + }, +} + +func TestRemoveInternalEntries(t *testing.T) { + isEqual := func(x, y map[string]string) bool { + if len(x) != len(y) { + return false + } + for k, v := range x { + if u, ok := y[k]; !ok || v != u { + return false + } + } + return true + } + + for i, test := range removeInternalEntriesTests { + RemoveInternalEntries(test.Metadata) + if !isEqual(test.Metadata, test.Expected) { + t.Errorf("Test %d: got %v - want %v", i, test.Metadata, test.Expected) + } + } +} diff --git a/cmd/object-handlers.go b/cmd/object-handlers.go index 5a5339d27..5f3614150 100644 --- a/cmd/object-handlers.go +++ b/cmd/object-handlers.go @@ -890,13 +890,7 @@ func (api objectAPIHandlers) CopyObjectHandler(w http.ResponseWriter, r *http.Re if isSourceEncrypted { // Remove all source encrypted related metadata to // avoid copying them in target object. - delete(srcInfo.UserDefined, crypto.SSEIV) - delete(srcInfo.UserDefined, crypto.SSESealAlgorithm) - delete(srcInfo.UserDefined, crypto.SSECSealedKey) - delete(srcInfo.UserDefined, crypto.SSEMultipart) - delete(srcInfo.UserDefined, crypto.S3SealedKey) - delete(srcInfo.UserDefined, crypto.S3KMSSealedKey) - delete(srcInfo.UserDefined, crypto.S3KMSKeyID) + crypto.RemoveInternalEntries(srcInfo.UserDefined) } srcInfo.Reader, err = hash.NewReader(reader, targetSize, "", "", targetSize) // do not try to verify encrypted content