From 4d59b1d36f8924290c3ecb5b7608747191470188 Mon Sep 17 00:00:00 2001 From: Aran85 Date: Mon, 28 Sep 2015 08:23:22 +0800 Subject: [PATCH] rgw:bucket link now set the bucket.instance acl Fixes: #11076 Signed-off-by: Zengran Zhang --- src/rgw/rgw_bucket.cc | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index a070508c3150c..d5edddfade3b1 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -203,9 +203,6 @@ int rgw_link_bucket(RGWRados *store, const rgw_user& user_id, rgw_bucket& bucket ret = store->get_bucket_entrypoint_info(obj_ctx, tenant_name, bucket_name, ep, &ot, NULL, &attrs); if (ret < 0 && ret != -ENOENT) { ldout(store->ctx(), 0) << "ERROR: store->get_bucket_entrypoint_info() returned " << ret << dendl; - } else if (ret >= 0 && ep.linked && ep.owner != user_id) { - ldout(store->ctx(), 0) << "can't link bucket, already linked to a different user: " << ep.owner << dendl; - return -EINVAL; } } @@ -613,6 +610,8 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, std::string *err_msg) return r; } + rgw_user user_id = op_state.get_user_id(); + map::iterator aiter = attrs.find(RGW_ATTR_ACL); if (aiter != attrs.end()) { bufferlist aclbl = aiter->second; @@ -627,7 +626,7 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, std::string *err_msg) return -EIO; } - r = rgw_unlink_bucket(store, owner.get_id(), bucket.tenant, bucket.name); + r = rgw_unlink_bucket(store, owner.get_id(), bucket.tenant, bucket.name, false); if (r < 0) { set_err_msg(err_msg, "could not unlink policy from user " + owner.get_id().to_str()); return r; @@ -654,6 +653,17 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, std::string *err_msg) if (r < 0) return r; + RGWAccessControlPolicy policy_instance; + policy_instance.create_default(user_info.user_id, display_name); + aclbl.clear(); + policy_instance.encode(aclbl); + + string oid_bucket_instance = RGW_BUCKET_INSTANCE_MD_PREFIX + key; + rgw_bucket bucket_instance; + bucket_instance.name = oid_bucket_instance; + rgw_obj obj_bucket_instance(bucket_instance, no_oid); + r = store->system_obj_set_attr(NULL, obj_bucket_instance, RGW_ATTR_ACL, aclbl, &objv_tracker); + r = rgw_link_bucket(store, user_info.user_id, bucket, 0); if (r < 0) return r; -- 2.39.5