diff --git a/cmd/api-response.go b/cmd/api-response.go index da194031c..190fab8f4 100644 --- a/cmd/api-response.go +++ b/cmd/api-response.go @@ -85,7 +85,7 @@ type ListVersionsResponse struct { VersionIDMarker string `xml:"VersionIdMarker"` MaxKeys int - Delimiter string + Delimiter string `xml:"Delimiter,omitempty"` // A flag that indicates whether or not ListObjects returned all of the results // that satisfied the search criteria. IsTruncated bool @@ -115,7 +115,7 @@ type ListObjectsResponse struct { NextMarker string `xml:"NextMarker,omitempty"` MaxKeys int - Delimiter string + Delimiter string `xml:"Delimiter,omitempty"` // A flag that indicates whether or not ListObjects returned all of the results // that satisfied the search criteria. IsTruncated bool @@ -146,7 +146,7 @@ type ListObjectsV2Response struct { KeyCount int MaxKeys int - Delimiter string + Delimiter string `xml:"Delimiter,omitempty"` // A flag that indicates whether or not ListObjects returned all of the results // that satisfied the search criteria. IsTruncated bool @@ -205,7 +205,7 @@ type ListMultipartUploadsResponse struct { UploadIDMarker string `xml:"UploadIdMarker"` NextKeyMarker string NextUploadIDMarker string `xml:"NextUploadIdMarker"` - Delimiter string + Delimiter string `xml:"Delimiter,omitempty"` Prefix string EncodingType string `xml:"EncodingType,omitempty"` MaxUploads int @@ -360,7 +360,7 @@ type Object struct { Size int64 // Owner of the object. - Owner Owner + Owner *Owner `xml:"Owner,omitempty"` // The class of storage used to store the object. StorageClass string @@ -506,7 +506,7 @@ func generateListBucketsResponse(buckets []BucketInfo) ListBucketsResponse { func generateListVersionsResponse(bucket, prefix, marker, versionIDMarker, delimiter, encodingType string, maxKeys int, resp ListObjectVersionsInfo, metadata metaCheckFn) ListVersionsResponse { versions := make([]ObjectVersion, 0, len(resp.Objects)) - owner := Owner{ + owner := &Owner{ ID: globalMinioDefaultOwnerID, DisplayName: "minio", } @@ -602,7 +602,7 @@ func generateListVersionsResponse(bucket, prefix, marker, versionIDMarker, delim // generates an ListObjectsV1 response for the said bucket with other enumerated options. func generateListObjectsV1Response(bucket, prefix, marker, delimiter, encodingType string, maxKeys int, resp ListObjectsInfo) ListObjectsResponse { contents := make([]Object, 0, len(resp.Objects)) - owner := Owner{ + owner := &Owner{ ID: globalMinioDefaultOwnerID, DisplayName: "minio", } @@ -651,10 +651,14 @@ func generateListObjectsV1Response(bucket, prefix, marker, delimiter, encodingTy // generates an ListObjectsV2 response for the said bucket with other enumerated options. func generateListObjectsV2Response(bucket, prefix, token, nextToken, startAfter, delimiter, encodingType string, fetchOwner, isTruncated bool, maxKeys int, objects []ObjectInfo, prefixes []string, metadata metaCheckFn) ListObjectsV2Response { contents := make([]Object, 0, len(objects)) - owner := Owner{ - ID: globalMinioDefaultOwnerID, - DisplayName: "minio", + var owner *Owner + if fetchOwner { + owner = &Owner{ + ID: globalMinioDefaultOwnerID, + DisplayName: "minio", + } } + data := ListObjectsV2Response{} for _, object := range objects { diff --git a/cmd/bucket-listobjects-handlers.go b/cmd/bucket-listobjects-handlers.go index 56af2b9d9..b1c91e098 100644 --- a/cmd/bucket-listobjects-handlers.go +++ b/cmd/bucket-listobjects-handlers.go @@ -190,7 +190,6 @@ func (api objectAPIHandlers) listObjectsV2Handler(ctx context.Context, w http.Re } // Validate the query params before beginning to serve the request. - // fetch-owner is not validated since it is a boolean if s3Error := validateListObjectsArgs(prefix, token, delimiter, encodingType, maxKeys); s3Error != ErrNone { writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL) return diff --git a/cmd/generic-handlers.go b/cmd/generic-handlers.go index 777c937a7..77f9e06c3 100644 --- a/cmd/generic-handlers.go +++ b/cmd/generic-handlers.go @@ -356,7 +356,10 @@ func setRequestValidityHandler(h http.Handler) http.Handler { return } // Check for bad components in URL query values. - for _, vv := range r.Form { + for k, vv := range r.Form { + if k == "delimiter" { // delimiters are allowed to have `.` or `..` + continue + } for _, v := range vv { if hasBadPathComponent(v) { if ok { diff --git a/cmd/server_test.go b/cmd/server_test.go index 418823a86..8463593bc 100644 --- a/cmd/server_test.go +++ b/cmd/server_test.go @@ -1608,7 +1608,6 @@ func (s *TestSuiteCommon) TestListObjectsHandler(c *check) { []string{ "foo bar 1", "foo bar 2", - fmt.Sprintf("%sminio", globalMinioDefaultOwnerID), }, }, {