aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Lebedev <9497591+kmlebedev@users.noreply.github.com>2023-09-21 20:20:05 +0500
committerGitHub <noreply@github.com>2023-09-21 08:20:05 -0700
commita46f873edd8a5fb0c25aeb1c5c3c33e925ed63dd (patch)
treeb0fe92a5f834fecd84c5b03b3a40c8b5b2bf1e2d
parentd8b424d123300aad13b934b25f5670506396da7b (diff)
downloadseaweedfs-a46f873edd8a5fb0c25aeb1c5c3c33e925ed63dd.tar.xz
seaweedfs-a46f873edd8a5fb0c25aeb1c5c3c33e925ed63dd.zip
[s3acl] Step 0: Put bucket ACL only responds success if the ACL is private. (#4856)
* Passing test: test_bucket_acl_default test_bucket_acl_canned_private_to_private https://github.com/seaweedfs/seaweedfs/issues/4519 * Update weed/s3api/s3api_bucket_handlers.go --------- Co-authored-by: Konstantin Lebedev <9497591+kmlebedev@users.noreply.github.co> Co-authored-by: Chris Lu <chrislusf@users.noreply.github.com>
-rw-r--r--docker/compose/s3tests.conf4
-rw-r--r--weed/s3api/s3api_bucket_handlers.go68
-rw-r--r--weed/s3api/s3api_bucket_skip_handlers.go6
3 files changed, 47 insertions, 31 deletions
diff --git a/docker/compose/s3tests.conf b/docker/compose/s3tests.conf
index 68d9ddeb7..2bffe20d4 100644
--- a/docker/compose/s3tests.conf
+++ b/docker/compose/s3tests.conf
@@ -18,10 +18,10 @@ bucket prefix = yournamehere-{random}-
[s3 main]
# main display_name set in vstart.sh
-display_name = M. Tester
+display_name = s3_tests
# main user_idname set in vstart.sh
-user_id = testid
+user_id = s3_tests
# main email set in vstart.sh
email = tester@ceph.com
diff --git a/weed/s3api/s3api_bucket_handlers.go b/weed/s3api/s3api_bucket_handlers.go
index d4d81905d..d2e987a25 100644
--- a/weed/s3api/s3api_bucket_handlers.go
+++ b/weed/s3api/s3api_bucket_handlers.go
@@ -259,32 +259,54 @@ func (s3a *S3ApiServer) GetBucketAclHandler(w http.ResponseWriter, r *http.Reque
return
}
- response := AccessControlPolicy{}
- for _, ident := range s3a.iam.identities {
- if len(ident.Credentials) == 0 {
- continue
+ identityId := r.Header.Get(s3_constants.AmzIdentityId)
+ response := AccessControlPolicy{
+ Owner: CanonicalUser{
+ ID: identityId,
+ DisplayName: identityId,
+ },
+ }
+ response.AccessControlList.Grant = append(response.AccessControlList.Grant, Grant{
+ Grantee: Grantee{
+ ID: identityId,
+ DisplayName: identityId,
+ Type: "CanonicalUser",
+ XMLXSI: "CanonicalUser",
+ XMLNS: "http://www.w3.org/2001/XMLSchema-instance"},
+ Permission: s3.PermissionFullControl,
+ })
+ writeSuccessResponseXML(w, r, response)
+}
+
+// PutBucketAclHandler Put bucket ACL only responds success if the ACL is private.
+// https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAcl.html //
+func (s3a *S3ApiServer) PutBucketAclHandler(w http.ResponseWriter, r *http.Request) {
+ // collect parameters
+ bucket, _ := s3_constants.GetBucketAndObject(r)
+ glog.V(3).Infof("PutBucketAclHandler %s", bucket)
+
+ if err := s3a.checkBucket(r, bucket); err != s3err.ErrNone {
+ s3err.WriteErrorResponse(w, r, err)
+ return
+ }
+ cannedAcl := r.Header.Get(s3_constants.AmzCannedAcl)
+ switch {
+ case cannedAcl == "":
+ acl := &s3.AccessControlPolicy{}
+ if err := xmlDecoder(r.Body, acl, r.ContentLength); err != nil {
+ glog.Errorf("PutBucketAclHandler: %s", err)
+ s3err.WriteErrorResponse(w, r, s3err.ErrInvalidRequest)
+ return
}
- for _, action := range ident.Actions {
- if !action.overBucket(bucket) || action.getPermission() == "" {
- continue
- }
- id := ident.Credentials[0].AccessKey
- if response.Owner.DisplayName == "" && action.isOwner(bucket) && len(ident.Credentials) > 0 {
- response.Owner.DisplayName = ident.Name
- response.Owner.ID = id
- }
- response.AccessControlList.Grant = append(response.AccessControlList.Grant, Grant{
- Grantee: Grantee{
- ID: id,
- DisplayName: ident.Name,
- Type: "CanonicalUser",
- XMLXSI: "CanonicalUser",
- XMLNS: "http://www.w3.org/2001/XMLSchema-instance"},
- Permission: action.getPermission(),
- })
+ if len(acl.Grants) == 1 && acl.Grants[0].Permission != nil && *acl.Grants[0].Permission == s3_constants.PermissionFullControl {
+ writeSuccessResponseEmpty(w, r)
+ return
}
+ case cannedAcl == s3_constants.CannedAclPrivate:
+ writeSuccessResponseEmpty(w, r)
+ return
}
- writeSuccessResponseXML(w, r, response)
+ s3err.WriteErrorResponse(w, r, s3err.ErrNotImplemented)
}
// GetBucketLifecycleConfigurationHandler Get Bucket Lifecycle configuration
diff --git a/weed/s3api/s3api_bucket_skip_handlers.go b/weed/s3api/s3api_bucket_skip_handlers.go
index 70fd38424..62d5b8ce7 100644
--- a/weed/s3api/s3api_bucket_skip_handlers.go
+++ b/weed/s3api/s3api_bucket_skip_handlers.go
@@ -41,9 +41,3 @@ func (s3a *S3ApiServer) PutBucketPolicyHandler(w http.ResponseWriter, r *http.Re
func (s3a *S3ApiServer) DeleteBucketPolicyHandler(w http.ResponseWriter, r *http.Request) {
s3err.WriteErrorResponse(w, r, http.StatusNoContent)
}
-
-// PutBucketAclHandler Put bucket ACL
-// https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAcl.html
-func (s3a *S3ApiServer) PutBucketAclHandler(w http.ResponseWriter, r *http.Request) {
- s3err.WriteErrorResponse(w, r, s3err.ErrNotImplemented)
-}