@@ -9570,6 +9570,119 @@ void RGWDeleteBucketEncryption::execute(optional_yield y)
95709570 }, y);
95719571}
95729572
9573+ int RGWPutBucketOwnershipControls::verify_permission (optional_yield y)
9574+ {
9575+ if (!verify_bucket_permission (this , s, rgw::IAM::s3PutBucketOwnershipControls)) {
9576+ return -EACCES;
9577+ }
9578+ return 0 ;
9579+ }
9580+
9581+ void RGWPutBucketOwnershipControls::execute (optional_yield y)
9582+ {
9583+ op_ret = get_params (y);
9584+ if (op_ret < 0 ) {
9585+ return ;
9586+ }
9587+
9588+ op_ret = rgw_forward_request_to_master (this , *s->penv .site , s->owner .id ,
9589+ &data, nullptr , s->info , s->err , y);
9590+ if (op_ret < 0 ) {
9591+ ldpp_dout (this , 20 ) << " forward_request_to_master returned ret=" << op_ret << dendl;
9592+ return ;
9593+ }
9594+
9595+ bufferlist conf_bl;
9596+ encode (ownership, conf_bl);
9597+
9598+ // construct a default private acl for BucketOwnerEnforced comparison
9599+ RGWAccessControlPolicy private_acl;
9600+ private_acl.create_default (s->bucket_owner .id ,
9601+ s->bucket_owner .display_name );
9602+
9603+ op_ret = retry_raced_bucket_write (this , s->bucket .get (),
9604+ [this , y, &conf_bl, &private_acl] {
9605+ rgw::sal::Attrs& attrs = s->bucket ->get_attrs ();
9606+
9607+ using rgw::s3::ObjectOwnership::BucketOwnerEnforced;
9608+ if (ownership.object_ownership == BucketOwnerEnforced) {
9609+ // reject BucketOwnerEnforced if the bucket's acl doesn't
9610+ // match the default private acl policy
9611+ RGWAccessControlPolicy bucket_acl;
9612+ if (auto i = attrs.find (RGW_ATTR_ACL); i != attrs.end ()) {
9613+ try {
9614+ auto p = i->second .cbegin ();
9615+ decode (bucket_acl, p);
9616+ } catch (const buffer::error&) {
9617+ ldpp_dout (this , 20 ) << " failed to decode RGW_ATTR_ACL" << dendl;
9618+ return -EIO;
9619+ }
9620+ if (bucket_acl != private_acl) {
9621+ s->err .message = " The bucket's ACL must be made private "
9622+ " before setting BucketOwnerEnforced." ;
9623+ return -ERR_INVALID_BUCKET_ACL;
9624+ }
9625+ }
9626+ }
9627+
9628+ attrs[RGW_ATTR_OWNERSHIP_CONTROLS] = conf_bl;
9629+ return s->bucket ->put_info (this , false , real_time (), y);
9630+ }, y);
9631+ }
9632+
9633+ int RGWGetBucketOwnershipControls::verify_permission (optional_yield y)
9634+ {
9635+ if (!verify_bucket_permission (this , s, rgw::IAM::s3GetBucketOwnershipControls)) {
9636+ return -EACCES;
9637+ }
9638+ return 0 ;
9639+ }
9640+
9641+ void RGWGetBucketOwnershipControls::execute (optional_yield y)
9642+ {
9643+ const auto & attrs = s->bucket_attrs ;
9644+ if (auto aiter = attrs.find (RGW_ATTR_OWNERSHIP_CONTROLS);
9645+ aiter == attrs.end ()) {
9646+ op_ret = -ENOENT;
9647+ s->err .message = " The bucket ownership controls were not found" ;
9648+ return ;
9649+ } else {
9650+ bufferlist::const_iterator iter{&aiter->second };
9651+ try {
9652+ decode (ownership, iter);
9653+ } catch (const buffer::error& e) {
9654+ ldpp_dout (this , 0 ) << __func__ << " failed to decode "
9655+ " RGW_ATTR_OWNERSHIP_CONTROLS: " << e.what () << dendl;
9656+ op_ret = -EIO;
9657+ return ;
9658+ }
9659+ }
9660+ }
9661+
9662+ int RGWDeleteBucketOwnershipControls::verify_permission (optional_yield y)
9663+ {
9664+ if (!verify_bucket_permission (this , s, rgw::IAM::s3PutBucketOwnershipControls)) {
9665+ return -EACCES;
9666+ }
9667+ return 0 ;
9668+ }
9669+
9670+ void RGWDeleteBucketOwnershipControls::execute (optional_yield y)
9671+ {
9672+ op_ret = rgw_forward_request_to_master (this , *s->penv .site , s->owner .id ,
9673+ nullptr , nullptr , s->info , s->err , y);
9674+ if (op_ret < 0 ) {
9675+ ldpp_dout (this , 0 ) << " forward_request_to_master returned ret=" << op_ret << dendl;
9676+ return ;
9677+ }
9678+
9679+ op_ret = retry_raced_bucket_write (this , s->bucket .get (), [this , y] {
9680+ rgw::sal::Attrs& attrs = s->bucket ->get_attrs ();
9681+ attrs.erase (RGW_ATTR_OWNERSHIP_CONTROLS);
9682+ return s->bucket ->put_info (this , false , real_time (), y);
9683+ }, y);
9684+ }
9685+
95739686void rgw_slo_entry::decode_json (JSONObj *obj)
95749687{
95759688 JSONDecoder::decode_json (" path" , path, obj);
0 commit comments