remove delimiter if not set by client, also fetchOwner is optional (#17366)

This commit is contained in:
Harshavardhana 2023-06-06 21:31:47 -07:00 committed by GitHub
parent d1448adbda
commit 442c50ff00
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 18 additions and 13 deletions

View File

@ -85,7 +85,7 @@ type ListVersionsResponse struct {
VersionIDMarker string `xml:"VersionIdMarker"` VersionIDMarker string `xml:"VersionIdMarker"`
MaxKeys int MaxKeys int
Delimiter string Delimiter string `xml:"Delimiter,omitempty"`
// A flag that indicates whether or not ListObjects returned all of the results // A flag that indicates whether or not ListObjects returned all of the results
// that satisfied the search criteria. // that satisfied the search criteria.
IsTruncated bool IsTruncated bool
@ -115,7 +115,7 @@ type ListObjectsResponse struct {
NextMarker string `xml:"NextMarker,omitempty"` NextMarker string `xml:"NextMarker,omitempty"`
MaxKeys int MaxKeys int
Delimiter string Delimiter string `xml:"Delimiter,omitempty"`
// A flag that indicates whether or not ListObjects returned all of the results // A flag that indicates whether or not ListObjects returned all of the results
// that satisfied the search criteria. // that satisfied the search criteria.
IsTruncated bool IsTruncated bool
@ -146,7 +146,7 @@ type ListObjectsV2Response struct {
KeyCount int KeyCount int
MaxKeys int MaxKeys int
Delimiter string Delimiter string `xml:"Delimiter,omitempty"`
// A flag that indicates whether or not ListObjects returned all of the results // A flag that indicates whether or not ListObjects returned all of the results
// that satisfied the search criteria. // that satisfied the search criteria.
IsTruncated bool IsTruncated bool
@ -205,7 +205,7 @@ type ListMultipartUploadsResponse struct {
UploadIDMarker string `xml:"UploadIdMarker"` UploadIDMarker string `xml:"UploadIdMarker"`
NextKeyMarker string NextKeyMarker string
NextUploadIDMarker string `xml:"NextUploadIdMarker"` NextUploadIDMarker string `xml:"NextUploadIdMarker"`
Delimiter string Delimiter string `xml:"Delimiter,omitempty"`
Prefix string Prefix string
EncodingType string `xml:"EncodingType,omitempty"` EncodingType string `xml:"EncodingType,omitempty"`
MaxUploads int MaxUploads int
@ -360,7 +360,7 @@ type Object struct {
Size int64 Size int64
// Owner of the object. // Owner of the object.
Owner Owner Owner *Owner `xml:"Owner,omitempty"`
// The class of storage used to store the object. // The class of storage used to store the object.
StorageClass string 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 { func generateListVersionsResponse(bucket, prefix, marker, versionIDMarker, delimiter, encodingType string, maxKeys int, resp ListObjectVersionsInfo, metadata metaCheckFn) ListVersionsResponse {
versions := make([]ObjectVersion, 0, len(resp.Objects)) versions := make([]ObjectVersion, 0, len(resp.Objects))
owner := Owner{ owner := &Owner{
ID: globalMinioDefaultOwnerID, ID: globalMinioDefaultOwnerID,
DisplayName: "minio", 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. // 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 { func generateListObjectsV1Response(bucket, prefix, marker, delimiter, encodingType string, maxKeys int, resp ListObjectsInfo) ListObjectsResponse {
contents := make([]Object, 0, len(resp.Objects)) contents := make([]Object, 0, len(resp.Objects))
owner := Owner{ owner := &Owner{
ID: globalMinioDefaultOwnerID, ID: globalMinioDefaultOwnerID,
DisplayName: "minio", 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. // 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 { 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)) contents := make([]Object, 0, len(objects))
owner := Owner{ var owner *Owner
ID: globalMinioDefaultOwnerID, if fetchOwner {
DisplayName: "minio", owner = &Owner{
ID: globalMinioDefaultOwnerID,
DisplayName: "minio",
}
} }
data := ListObjectsV2Response{} data := ListObjectsV2Response{}
for _, object := range objects { for _, object := range objects {

View File

@ -190,7 +190,6 @@ func (api objectAPIHandlers) listObjectsV2Handler(ctx context.Context, w http.Re
} }
// Validate the query params before beginning to serve the request. // 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 { if s3Error := validateListObjectsArgs(prefix, token, delimiter, encodingType, maxKeys); s3Error != ErrNone {
writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL) writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL)
return return

View File

@ -356,7 +356,10 @@ func setRequestValidityHandler(h http.Handler) http.Handler {
return return
} }
// Check for bad components in URL query values. // 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 { for _, v := range vv {
if hasBadPathComponent(v) { if hasBadPathComponent(v) {
if ok { if ok {

View File

@ -1608,7 +1608,6 @@ func (s *TestSuiteCommon) TestListObjectsHandler(c *check) {
[]string{ []string{
"<Key>foo bar 1</Key>", "<Key>foo bar 1</Key>",
"<Key>foo bar 2</Key>", "<Key>foo bar 2</Key>",
fmt.Sprintf("<Owner><ID>%s</ID><DisplayName>minio</DisplayName></Owner>", globalMinioDefaultOwnerID),
}, },
}, },
{ {