Validation: Reject object names with trailing "/". (#1619)

Fixes #1616
master
Krishna Srinivas 9 years ago committed by Harshavardhana
parent 43539a0c86
commit d267696110
  1. 28
      object-utils.go
  2. 2
      object-utils_test.go
  3. 2
      object_api_suite_test.go

@ -73,27 +73,35 @@ func IsValidBucketName(bucket string) bool {
// - Caret ("^") // - Caret ("^")
// - Grave accent / back tick ("`") // - Grave accent / back tick ("`")
// - Vertical bar / pipe ("|") // - Vertical bar / pipe ("|")
//
// Minio does not support object names with trailing "/".
func IsValidObjectName(object string) bool { func IsValidObjectName(object string) bool {
if len(object) > 1024 || len(object) == 0 { if len(object) == 0 {
return false return false
} }
if !utf8.ValidString(object) { if strings.HasSuffix(object, slashSeparator) {
return false return false
} }
// Reject unsupported characters in object name. if strings.HasPrefix(object, slashSeparator) {
return !strings.ContainsAny(object, "`^*|\\\"") return false
}
return IsValidObjectPrefix(object)
} }
// IsValidObjectPrefix verifies whether the prefix is a valid object name. // IsValidObjectPrefix verifies whether the prefix is a valid object name.
// Its valid to have a empty prefix. // Its valid to have a empty prefix.
func IsValidObjectPrefix(object string) bool { func IsValidObjectPrefix(object string) bool {
// Prefix can be empty or "/". if len(object) > 1024 {
if object == "" || object == "/" { return false
return true
} }
// Verify if prefix is a valid object name. if !utf8.ValidString(object) {
return IsValidObjectName(object) return false
}
// Reject unsupported characters in object name.
if strings.ContainsAny(object, "`^*|\\\"") {
return false
}
return true
} }
// Slash separator. // Slash separator.

@ -90,6 +90,8 @@ func TestIsValidObjectName(t *testing.T) {
// cases for which test should fail. // cases for which test should fail.
// passing invalid object names. // passing invalid object names.
{"", false}, {"", false},
{"a/b/c/", false},
{"/a/b/c", false},
{string([]byte{0xff, 0xfe, 0xfd}), false}, {string([]byte{0xff, 0xfe, 0xfd}), false},
} }

@ -417,7 +417,7 @@ func testGetDirectoryReturnsObjectNotFound(c *check.C, create func() ObjectLayer
_, err = obj.GetObject("bucket", "dir1/", 0) _, err = obj.GetObject("bucket", "dir1/", 0)
switch err := err.(type) { switch err := err.(type) {
case ObjectNotFound: case ObjectNameInvalid:
c.Assert(err.Bucket, check.Equals, "bucket") c.Assert(err.Bucket, check.Equals, "bucket")
c.Assert(err.Object, check.Equals, "dir1/") c.Assert(err.Object, check.Equals, "dir1/")
default: default:

Loading…
Cancel
Save