From 7ea1de8245cca42748e4cb4725f75342d34f651a Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Sat, 18 Feb 2017 13:41:59 -0800 Subject: [PATCH] copyObject: Be case sensitive for windows only server. (#3766) For case sensitive platforms we should honor case. Fixes #3765 ``` 1) python s3cmd -c s3cfg_localminio put logo.png s3://testbucket/xyz/etc2/logo.PNG 2) python s3cmd -c s3cfg_localminio ls s3://testbucket/xyz/etc2/ 2017-02-18 10:58 22059 s3://testbucket/xyz/etc2/logo.PNG 3) python s3cmd -c s3cfg_localminio cp s3://testbucket/xyz/etc2/logo.PNG s3://testbucket/xyz/etc2/logo.png remote copy: 's3://testbucket/xyz/etc2/logo.PNG' -> 's3://testbucket/xyz/etc2/logo.png' 4) python s3cmd -c s3cfg_localminio ls s3://testbucket/xyz/etc2/ 2017-02-18 10:58 22059 s3://testbucket/xyz/etc2/logo.PNG 2017-02-18 11:10 22059 s3://testbucket/xyz/etc2/logo.png ``` --- cmd/fs-v1.go | 3 +-- cmd/object-api-utils.go | 12 ++++++++++-- cmd/xl-v1-object.go | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/cmd/fs-v1.go b/cmd/fs-v1.go index de778b32b..530a81c39 100644 --- a/cmd/fs-v1.go +++ b/cmd/fs-v1.go @@ -26,7 +26,6 @@ import ( "path/filepath" "runtime" "sort" - "strings" "syscall" "github.com/minio/minio/pkg/disk" @@ -367,7 +366,7 @@ func (fs fsObjects) CopyObject(srcBucket, srcObject, dstBucket, dstObject string } // Check if this request is only metadata update. - cpMetadataOnly := strings.EqualFold(pathJoin(srcBucket, srcObject), pathJoin(dstBucket, dstObject)) + cpMetadataOnly := isStringEqual(pathJoin(srcBucket, srcObject), pathJoin(dstBucket, dstObject)) if cpMetadataOnly { fsMetaPath := pathJoin(fs.fsPath, minioMetaBucket, bucketMetaPrefix, srcBucket, srcObject, fsMetaJSONFile) var wlk *lock.LockedFile diff --git a/cmd/object-api-utils.go b/cmd/object-api-utils.go index 4cf72acde..9c1878a23 100644 --- a/cmd/object-api-utils.go +++ b/cmd/object-api-utils.go @@ -164,7 +164,7 @@ func getCompleteMultipartMD5(parts []completePart) (string, error) { // For example on windows since its case insensitive we are supposed // to do case insensitive checks. func hasPrefix(s string, prefix string) bool { - if runtime.GOOS == "windows" { + if runtime.GOOS == globalWindowsOSName { return strings.HasPrefix(strings.ToLower(s), strings.ToLower(prefix)) } return strings.HasPrefix(s, prefix) @@ -174,12 +174,20 @@ func hasPrefix(s string, prefix string) bool { // For example on windows since its case insensitive we are supposed // to do case insensitive checks. func hasSuffix(s string, suffix string) bool { - if runtime.GOOS == "windows" { + if runtime.GOOS == globalWindowsOSName { return strings.HasSuffix(strings.ToLower(s), strings.ToLower(suffix)) } return strings.HasSuffix(s, suffix) } +// Validates if two strings are equal. +func isStringEqual(s1 string, s2 string) bool { + if runtime.GOOS == globalWindowsOSName { + return strings.EqualFold(s1, s2) + } + return s1 == s2 +} + // Ignores all reserved bucket names or invalid bucket names. func isReservedOrInvalidBucket(bucketEntry string) bool { bucketEntry = strings.TrimSuffix(bucketEntry, slashSeparator) diff --git a/cmd/xl-v1-object.go b/cmd/xl-v1-object.go index 1ac3f23fe..0381f0946 100644 --- a/cmd/xl-v1-object.go +++ b/cmd/xl-v1-object.go @@ -64,7 +64,7 @@ func (xl xlObjects) CopyObject(srcBucket, srcObject, dstBucket, dstObject string length := xlMeta.Stat.Size // Check if this request is only metadata update. - cpMetadataOnly := strings.EqualFold(pathJoin(srcBucket, srcObject), pathJoin(dstBucket, dstObject)) + cpMetadataOnly := isStringEqual(pathJoin(srcBucket, srcObject), pathJoin(dstBucket, dstObject)) if cpMetadataOnly { xlMeta.Meta = metadata partsMetadata := make([]xlMetaV1, len(xl.storageDisks))