Implement a dummy GetBucketACL for legacy reasons (#5906)
GetBucketACL call returns empty for all GET in ACL requests, the primary purpose of this PR is to provide legacy API support for legacy applications. Fixes #5706master
parent
518f856900
commit
5b74f918d4
@ -0,0 +1,141 @@ |
|||||||
|
/* |
||||||
|
* Minio Cloud Storage, (C) 2018 Minio, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package cmd |
||||||
|
|
||||||
|
import ( |
||||||
|
"encoding/xml" |
||||||
|
"net/http" |
||||||
|
|
||||||
|
"github.com/gorilla/mux" |
||||||
|
"github.com/minio/minio/pkg/policy" |
||||||
|
) |
||||||
|
|
||||||
|
// Data types used for returning dummy access control
|
||||||
|
// policy XML, these variables shouldn't be used elsewhere
|
||||||
|
// they are only defined to be used in this file alone.
|
||||||
|
type grantee struct { |
||||||
|
XMLNS string `xml:"xmlns:xsi,attr"` |
||||||
|
XMLXSI string `xml:"xsi:type,attr"` |
||||||
|
Type string `xml:"Type"` |
||||||
|
ID string `xml:"ID,omitempty"` |
||||||
|
DisplayName string `xml:"DisplayName,omitempty"` |
||||||
|
URI string `xml:"URI,omitempty"` |
||||||
|
} |
||||||
|
|
||||||
|
type grant struct { |
||||||
|
Grantee grantee `xml:"Grantee"` |
||||||
|
Permission string `xml:"Permission"` |
||||||
|
} |
||||||
|
|
||||||
|
type accessControlPolicy struct { |
||||||
|
XMLName xml.Name `xml:"AccessControlPolicy"` |
||||||
|
Owner Owner `xml:"Owner"` |
||||||
|
AccessControlList struct { |
||||||
|
Grants []grant `xml:"Grant"` |
||||||
|
} `xml:"AccessControlList"` |
||||||
|
} |
||||||
|
|
||||||
|
// GetBucketACLHandler - GET Bucket ACL
|
||||||
|
// -----------------
|
||||||
|
// This operation uses the ACL
|
||||||
|
// subresource to return the ACL of a specified bucket.
|
||||||
|
func (api objectAPIHandlers) GetBucketACLHandler(w http.ResponseWriter, r *http.Request) { |
||||||
|
ctx := newContext(r, "GetBucketACL") |
||||||
|
|
||||||
|
vars := mux.Vars(r) |
||||||
|
bucket := vars["bucket"] |
||||||
|
|
||||||
|
objAPI := api.ObjectAPI() |
||||||
|
if objAPI == nil { |
||||||
|
writeErrorResponse(w, ErrServerNotInitialized, r.URL) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
// Allow getBucketACL if policy action is set, since this is a dummy call
|
||||||
|
// we are simply re-purposing the bucketPolicyAction.
|
||||||
|
if s3Error := checkRequestAuthType(ctx, r, policy.GetBucketPolicyAction, bucket, ""); s3Error != ErrNone { |
||||||
|
writeErrorResponse(w, s3Error, r.URL) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
// Before proceeding validate if bucket exists.
|
||||||
|
_, err := objAPI.GetBucketInfo(ctx, bucket) |
||||||
|
if err != nil { |
||||||
|
writeErrorResponse(w, toAPIErrorCode(err), r.URL) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
acl := &accessControlPolicy{} |
||||||
|
acl.AccessControlList.Grants = append(acl.AccessControlList.Grants, grant{ |
||||||
|
Grantee: grantee{ |
||||||
|
Type: "CanonicalUser", |
||||||
|
}, |
||||||
|
Permission: "FULL_CONTROL", |
||||||
|
}) |
||||||
|
if err := xml.NewEncoder(w).Encode(acl); err != nil { |
||||||
|
writeErrorResponse(w, toAPIErrorCode(err), r.URL) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
w.(http.Flusher).Flush() |
||||||
|
} |
||||||
|
|
||||||
|
// GetObjectACLHandler - GET Object ACL
|
||||||
|
// -----------------
|
||||||
|
// This operation uses the ACL
|
||||||
|
// subresource to return the ACL of a specified object.
|
||||||
|
func (api objectAPIHandlers) GetObjectACLHandler(w http.ResponseWriter, r *http.Request) { |
||||||
|
ctx := newContext(r, "GetObjectACL") |
||||||
|
|
||||||
|
vars := mux.Vars(r) |
||||||
|
bucket := vars["bucket"] |
||||||
|
object := vars["object"] |
||||||
|
|
||||||
|
objAPI := api.ObjectAPI() |
||||||
|
if objAPI == nil { |
||||||
|
writeErrorResponse(w, ErrServerNotInitialized, r.URL) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
// Allow getObjectACL if policy action is set, since this is a dummy call
|
||||||
|
// we are simply re-purposing the bucketPolicyAction.
|
||||||
|
if s3Error := checkRequestAuthType(ctx, r, policy.GetBucketPolicyAction, bucket, ""); s3Error != ErrNone { |
||||||
|
writeErrorResponse(w, s3Error, r.URL) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
// Before proceeding validate if object exists.
|
||||||
|
_, err := objAPI.GetObjectInfo(ctx, bucket, object) |
||||||
|
if err != nil { |
||||||
|
writeErrorResponse(w, toAPIErrorCode(err), r.URL) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
acl := &accessControlPolicy{} |
||||||
|
acl.AccessControlList.Grants = append(acl.AccessControlList.Grants, grant{ |
||||||
|
Grantee: grantee{ |
||||||
|
Type: "CanonicalUser", |
||||||
|
}, |
||||||
|
Permission: "FULL_CONTROL", |
||||||
|
}) |
||||||
|
if err := xml.NewEncoder(w).Encode(acl); err != nil { |
||||||
|
writeErrorResponse(w, toAPIErrorCode(err), r.URL) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
w.(http.Flusher).Flush() |
||||||
|
} |
Loading…
Reference in new issue