string get_subuser() const override {
return {};
}
+ const std::string& get_tenant() const override {
+ return id.tenant;
+ }
void to_str(std::ostream& out) const override {
out << "RGWDummyIdentityApplier(auth_id=" << id
/* Subuser of Account */
virtual std::string get_subuser() const = 0;
- virtual std::string get_role_tenant() const { return ""; }
+ /* Identity's tenant namespace */
+ virtual const std::string& get_tenant() const = 0;
/* write any auth-specific fields that are safe to expose in the ops log */
virtual void write_ops_log_entry(rgw_log_entry& entry) const {};
std::string get_subuser() const override {
return {};
}
+ const std::string& get_tenant() const override {
+ return role_tenant;
+ }
struct Factory {
virtual ~Factory() {}
uint32_t get_identity_type() const override { return info.acct_type; }
std::string get_acct_name() const override { return info.acct_name; }
std::string get_subuser() const override { return {}; }
+ const std::string& get_tenant() const override {
+ return info.acct_user.tenant;
+ }
struct Factory {
virtual ~Factory() {}
uint32_t get_identity_type() const override { return TYPE_RGW; }
std::string get_acct_name() const override { return {}; }
std::string get_subuser() const override { return subuser; }
+ const std::string& get_tenant() const override {
+ return user_info.user_id.tenant;
+ }
+
void write_ops_log_entry(rgw_log_entry& entry) const override;
struct Factory {
uint32_t get_identity_type() const override { return TYPE_ROLE; }
std::string get_acct_name() const override { return {}; }
std::string get_subuser() const override { return {}; }
+ const std::string& get_tenant() const override { return role.tenant; }
+
void modify_request_state(const DoutPrefixProvider* dpp, req_state* s) const override;
- std::string get_role_tenant() const override { return role.tenant; }
struct Factory {
virtual ~Factory() {}
get_decoratee().to_str(out);
}
- std::string get_role_tenant() const override { /* in/out */
- return get_decoratee().get_role_tenant();
+ const std::string& get_tenant() const override {
+ return get_decoratee().get_tenant();
}
void load_acct_info(const DoutPrefixProvider* dpp, RGWUserInfo& user_info) const override { /* out */
return -EINVAL;
}
+ const std::string& auth_tenant = s->auth.identity->get_tenant();
const std::string bucket_name = url_decode(prefix_view.substr(0, pos));
const std::string obj_prefix = url_decode(prefix_view.substr(pos + 1));
if (bucket_name.compare(s->bucket->get_name()) != 0) {
map<string, bufferlist> bucket_attrs;
- r = driver->load_bucket(this, rgw_bucket(s->user->get_tenant(), bucket_name),
+ r = driver->load_bucket(this, rgw_bucket(auth_tenant, bucket_name),
&ubucket, y);
if (r < 0) {
ldpp_dout(this, 0) << "could not get bucket info for bucket="
ldpp_dout(this, 0) << "failed to read bucket policy" << dendl;
return r;
}
- _bucket_policy = get_iam_policy_from_attr(s->cct, bucket_attrs, s->user->get_tenant());
+ _bucket_policy = get_iam_policy_from_attr(s->cct, bucket_attrs, auth_tenant);
bucket_policy = &_bucket_policy;
pbucket = ubucket.get();
} else {
vector<RGWAccessControlPolicy> allocated_acls;
map<string, pair<RGWAccessControlPolicy *, boost::optional<Policy>>> policies;
map<string, std::unique_ptr<rgw::sal::Bucket>> buckets;
+ const std::string& auth_tenant = s->auth.identity->get_tenant();
map<uint64_t, rgw_slo_part> slo_parts;
RGWAccessControlPolicy& _bucket_acl = allocated_acls.emplace_back();
std::unique_ptr<rgw::sal::Bucket> tmp_bucket;
- int r = driver->load_bucket(this, rgw_bucket(s->user->get_tenant(),
- bucket_name),
+ int r = driver->load_bucket(this, rgw_bucket(auth_tenant, bucket_name),
&tmp_bucket, y);
if (r < 0) {
ldpp_dout(this, 0) << "could not get bucket info for bucket="
return r;
}
auto _bucket_policy = get_iam_policy_from_attr(
- s->cct, tmp_bucket->get_attrs(), tmp_bucket->get_tenant());
+ s->cct, tmp_bucket->get_attrs(), auth_tenant);
bucket_policy = _bucket_policy.get_ptr();
buckets[bucket_name].swap(tmp_bucket);
policies[bucket_name] = make_pair(bucket_acl, _bucket_policy);
rgw::Partition partition = rgw::Partition::aws;
rgw::Service service = rgw::Service::s3;
- string tenant;
- if (s->auth.identity->get_identity_type() == TYPE_ROLE) {
- tenant = s->auth.identity->get_role_tenant();
- } else {
- tenant = s->user->get_tenant();
- }
-
+ const std::string& tenant = s->auth.identity->get_tenant();
if (!verify_user_permission(this, s, ARN(partition, service, "", tenant, "*"), rgw::IAM::s3ListAllMyBuckets, false)) {
return -EACCES;
}
return -EACCES;
}
- if (s->user->get_tenant() != s->bucket_tenant) {
+ if (s->auth.identity->get_tenant() != s->bucket_tenant) {
//AssumeRole is meant for cross account access
if (s->auth.identity->get_identity_type() != TYPE_ROLE) {
ldpp_dout(this, 10) << "user cannot create a bucket in a different tenant"
pos = copy_source_bucket_name.find(":");
if (pos == std::string::npos) {
// if tenant is not specified in x-amz-copy-source, use tenant of the requester
- copy_source_tenant_name = s->user->get_tenant();
+ copy_source_tenant_name = s->auth.identity->get_tenant();
} else {
copy_source_tenant_name = copy_source_bucket_name.substr(0, pos);
copy_source_bucket_name = copy_source_bucket_name.substr(pos + 1, copy_source_bucket_name.size());
ACLOwner bowner;
RGWObjVersionTracker ot;
- int ret = driver->load_bucket(dpp, rgw_bucket(s->user->get_tenant(),
+ int ret = driver->load_bucket(dpp, rgw_bucket(s->auth.identity->get_tenant(),
path.bucket_name),
&bucket, y);
if (ret < 0) {
return -EACCES;
}
- if (s->user->get_tenant() != s->bucket_tenant) {
+ if (s->auth.identity->get_tenant() != s->bucket_tenant) {
ldpp_dout(this, 10) << "user cannot create a bucket in a different tenant"
- << " (user_id.tenant=" << s->user->get_tenant()
+ << " (authorized user tenant=" << s->auth.identity->get_tenant()
<< " requested=" << s->bucket_tenant << ")" << dendl;
return -EACCES;
}
std::unique_ptr<rgw::sal::Bucket> bucket;
ACLOwner bowner;
- op_ret = driver->load_bucket(this, rgw_bucket(s->user->get_tenant(),
+ op_ret = driver->load_bucket(this, rgw_bucket(s->auth.identity->get_tenant(),
bucket_name),
&bucket, y);
if (op_ret < 0) {
: std::stoul(sleep_dur);
}
-RGWPubSub::RGWPubSub(rgw::sal::Driver* _driver, const std::string& _tenant)
- : driver(_driver), tenant(_tenant)
-{}
-
RGWPubSub::RGWPubSub(rgw::sal::Driver* _driver,
const std::string& _tenant,
const rgw::SiteConfig& site)
RGWObjVersionTracker* objv_tracker, optional_yield y) const;
public:
- RGWPubSub(rgw::sal::Driver* _driver, const std::string& tenant);
-
- RGWPubSub(rgw::sal::Driver* _driver,
- const std::string& _tenant,
- const rgw::SiteConfig& site);
+ RGWPubSub(rgw::sal::Driver* _driver,
+ const std::string& _tenant,
+ const rgw::SiteConfig& site);
class Bucket {
friend class RGWPubSub;
const auto bl = bufferlist::static_from_string(policy_text);
try {
return rgw::IAM::Policy(
- s->cct, s->owner.id.tenant, bl,
+ s->cct, s->auth.identity->get_tenant(), bl,
s->cct->_conf.get_val<bool>("rgw_policy_reject_invalid_principals"));
} catch (rgw::IAM::PolicyParseException& e) {
ldout(s->cct, 1) << "failed to parse policy: '" << policy_text
return ret;
}
- const RGWPubSub ps(driver, s->owner.id.tenant, *s->penv.site);
+ const RGWPubSub ps(driver, s->auth.identity->get_tenant(), *s->penv.site);
rgw_pubsub_topic result;
ret = ps.get_topic(this, topic_name, result, y, nullptr);
if (ret == -ENOENT) {
return;
}
}
- const RGWPubSub ps(driver, s->owner.id.tenant, *s->penv.site);
+ const RGWPubSub ps(driver, s->auth.identity->get_tenant(), *s->penv.site);
op_ret = ps.create_topic(this, topic_name, dest, topic_arn, opaque_data,
s->owner.id, policy_text, y);
if (op_ret < 0) {
void RGWPSListTopicsOp::execute(optional_yield y) {
const std::string start_token = s->info.args.get("NextToken");
- const RGWPubSub ps(driver, s->owner.id.tenant, *s->penv.site);
+ const RGWPubSub ps(driver, s->auth.identity->get_tenant(), *s->penv.site);
constexpr int max_items = 100;
op_ret = ps.get_topics(this, start_token, max_items, result, next_token, y);
// if there are no topics it is not considered an error
if (op_ret < 0) {
return;
}
- const RGWPubSub ps(driver, s->owner.id.tenant, *s->penv.site);
+ const RGWPubSub ps(driver, s->auth.identity->get_tenant(), *s->penv.site);
op_ret = ps.get_topic(this, topic_name, result, y, nullptr);
if (op_ret < 0) {
ldpp_dout(this, 1) << "failed to get topic '" << topic_name << "', ret=" << op_ret << dendl;
if (op_ret < 0) {
return;
}
- const RGWPubSub ps(driver, s->owner.id.tenant, *s->penv.site);
+ const RGWPubSub ps(driver, s->auth.identity->get_tenant(), *s->penv.site);
op_ret = ps.get_topic(this, topic_name, result, y, nullptr);
if (op_ret < 0) {
ldpp_dout(this, 1) << "failed to get topic '" << topic_name << "', ret=" << op_ret << dendl;
return ret;
}
rgw_pubsub_topic result;
- const RGWPubSub ps(driver, s->owner.id.tenant, *s->penv.site);
+ const RGWPubSub ps(driver, s->auth.identity->get_tenant(), *s->penv.site);
ret = ps.get_topic(this, topic_name, result, y, nullptr);
if (ret < 0) {
ldpp_dout(this, 1) << "failed to get topic '" << topic_name
return;
}
}
- const RGWPubSub ps(driver, s->owner.id.tenant, *s->penv.site);
+ const RGWPubSub ps(driver, s->auth.identity->get_tenant(), *s->penv.site);
op_ret = ps.create_topic(this, topic_name, dest, topic_arn, opaque_data,
topic_owner, policy_text, y);
if (op_ret < 0) {
return;
}
}
- const RGWPubSub ps(driver, s->owner.id.tenant, *s->penv.site);
+ const RGWPubSub ps(driver, s->auth.identity->get_tenant(), *s->penv.site);
rgw_pubsub_topic result;
op_ret = ps.get_topic(this, topic_name, result, y, nullptr);
return;
}
- const RGWPubSub ps(driver, s->owner.id.tenant);
+ const RGWPubSub ps(driver, s->auth.identity->get_tenant(), *s->penv.site);
const RGWPubSub::Bucket b(ps, bucket.get());
if(configurations.list.empty()) {
<< "' , ret = " << op_ret << dendl;
return;
}
- const RGWPubSub ps(driver, s->owner.id.tenant, *s->penv.site);
+ const RGWPubSub ps(driver, s->auth.identity->get_tenant(), *s->penv.site);
std::unordered_map<std::string, rgw_pubsub_topic> topics;
for (const auto& c : configurations.list) {
const auto& notif_name = c.id;
return;
}
- const RGWPubSub ps(driver, s->owner.id.tenant);
+ const RGWPubSub ps(driver, s->auth.identity->get_tenant(), *s->penv.site);
const RGWPubSub::Bucket b(ps, bucket.get());
// get all topics on a bucket
driver->stat_topics_v1(s->bucket_tenant, y, this) == -ENOENT) {
op_ret = get_bucket_notifications(this, bucket.get(), bucket_topics);
} else {
- const RGWPubSub ps(driver, s->owner.id.tenant);
+ const RGWPubSub ps(driver, s->auth.identity->get_tenant(), *s->penv.site);
const RGWPubSub::Bucket b(ps, bucket.get());
op_ret = b.get_topics(this, bucket_topics, y);
}
{
struct req_init_state *t = &s->init_state;
- int ret = rgw_parse_url_bucket(t->url_bucket, s->user->get_tenant(),
+ const std::string& auth_tenant = s->auth.identity->get_tenant();
+
+ int ret = rgw_parse_url_bucket(t->url_bucket, auth_tenant,
s->bucket_tenant, s->bucket_name);
if (ret) {
return ret;
}
- if (s->auth.identity->get_identity_type() == TYPE_ROLE) {
- s->bucket_tenant = s->auth.identity->get_role_tenant();
- }
ldpp_dout(s, 10) << "s->object=" << s->object
<< " s->bucket=" << rgw_make_bucket_entry_name(s->bucket_tenant, s->bucket_name) << dendl;
}
if (!t->src_bucket.empty()) {
- string auth_tenant;
- if (s->auth.identity->get_identity_type() == TYPE_ROLE) {
- auth_tenant = s->auth.identity->get_role_tenant();
- } else {
- auth_tenant = s->user->get_tenant();
- }
ret = rgw_parse_url_bucket(t->src_bucket, auth_tenant,
s->src_tenant_name, s->src_bucket_name);
if (ret) {
&& s->user->get_id().id == RGW_USER_ANON_ID) {
s->bucket_tenant = s->account_name;
} else {
- s->bucket_tenant = s->user->get_tenant();
+ s->bucket_tenant = s->auth.identity->get_tenant();
}
s->bucket_name = t->url_bucket;
return 0;
}
+ const std::string& get_tenant() const override {
+ ceph_abort();
+ static std::string empty;
+ return empty;
+ }
+
void to_str(std::ostream& out) const override {
out << id;
}
return "";
}
+ const std::string& get_tenant() const override {
+ static std::string empty;
+ return empty;
+ }
+
void to_str(std::ostream& out) const override {
return;
}