iam:ResourceTags.
Signed-off-by: Pritha Srivastava <prsrivas@redhat.com>
}
}
}
+
+ if (role_tags) {
+ for (auto& it : role_tags.get()) {
+ std::string p_key = "aws:PrincipalTag/";
+ p_key.append(it.first);
+ s->principal_tags.emplace_back(std::make_pair(p_key, it.second));
+ ldpp_dout(dpp, 10) << "Principal Tag Key: " << p_key << " Value: " << it.second << dendl;
+
+ std::string e_key = "iam:ResourceTag/";
+ e_key.append(it.first);
+ s->env.emplace(e_key, it.second);
+ ldpp_dout(dpp, 10) << "RGW Env Tag Key: " << e_key << " Value: " << it.second << dendl;
+ }
+ }
}
bool rgw::auth::WebIdentityApplier::is_identity(const idset_t& ids) const
std::string role_session;
std::string role_tenant;
std::unordered_multimap<std::string, std::string> token_claims;
+ boost::optional<std::multimap<std::string,std::string>> role_tags;
boost::optional<std::set<std::pair<std::string, std::string>>> principal_tags;
std::string get_idp_url() const;
const std::string& role_session,
const std::string& role_tenant,
const std::unordered_multimap<std::string, std::string>& token_claims,
+ boost::optional<std::multimap<std::string,std::string>> role_tags,
boost::optional<std::set<std::pair<std::string, std::string>>> principal_tags)
: cct(cct),
store(store),
role_session(role_session),
role_tenant(role_tenant),
token_claims(token_claims),
+ role_tags(role_tags),
principal_tags(principal_tags) {
const auto& sub = token_claims.find("sub");
if(sub != token_claims.end()) {
const std::string& role_session,
const std::string& role_tenant,
const std::unordered_multimap<std::string, std::string>& token,
+ boost::optional<std::multimap<std::string, std::string>>,
boost::optional<std::set<std::pair<std::string, std::string>>> principal_tags) const = 0;
};
};
}
bool is_identity(const idset_t& ids) const override;
uint32_t get_perm_mask() const override {
- return RGW_PERM_NONE;
+ return RGW_PERM_NONE;
}
void to_str(std::ostream& out) const override;
void load_acct_info(const DoutPrefixProvider* dpp, RGWUserInfo& user_info) const override; /* out */
return tenant;
}
+std::string
+WebTokenEngine::get_role_name(const string& role_arn) const
+{
+ string role_name;
+ auto r_arn = rgw::ARN::parse(role_arn);
+ if (r_arn) {
+ role_name = r_arn->resource;
+ }
+ if (!role_name.empty()) {
+ auto pos = role_name.find_last_of('/');
+ if(pos != string::npos) {
+ role_name = role_name.substr(pos + 1);
+ }
+ }
+ return role_name;
+}
+
std::unique_ptr<rgw::sal::RGWOIDCProvider>
WebTokenEngine::get_provider(const DoutPrefixProvider *dpp, const string& role_arn, const string& iss) const
{
}
string role_arn = s->info.args.get("RoleArn");
string role_tenant = get_role_tenant(role_arn);
- auto apl = apl_factory->create_apl_web_identity(cct, s, role_session, role_tenant, *t, princ_tags);
+ string role_name = get_role_name(role_arn);
+ std::unique_ptr<rgw::sal::RGWRole> role = store->get_role(role_name, role_tenant);
+ int ret = role->get(dpp, y);
+ if (ret < 0) {
+ ldpp_dout(dpp, 0) << "Role not found: name:" << role_name << " tenant: " << role_tenant << dendl;
+ return result_t::deny(-EACCES);
+ }
+ boost::optional<multimap<string,string>> role_tags = role->get_tags();
+ auto apl = apl_factory->create_apl_web_identity(cct, s, role_session, role_tenant, *t, role_tags, princ_tags);
return result_t::grant(std::move(apl));
}
return result_t::deny(-EACCES);
std::string get_role_tenant(const std::string& role_arn) const;
- std::string get_cert_url(const std::string& iss, const DoutPrefixProvider *dpp,optional_yield y) const;
+ std::string get_role_name(const string& role_arn) const;
+ std::string get_cert_url(const std::string& iss, const DoutPrefixProvider *dpp,optional_yield y) const;
+
std::tuple<boost::optional<WebTokenEngine::token_t>, boost::optional<WebTokenEngine::principal_tags_t>>
get_from_jwt(const DoutPrefixProvider* dpp, const std::string& token, const req_state* const s, optional_yield y) const;
const req_state* s,
const std::string& role_session,
const std::string& role_tenant,
- const std::unordered_multimap<string, string>& token,
+ const std::unordered_multimap<std::string, std::string>& token,
+ boost::optional<std::multimap<std::string, std::string>> role_tags,
boost::optional<std::set<std::pair<std::string, std::string>>> principal_tags) const override {
auto apl = rgw::auth::add_sysreq(cct, store, s,
- rgw::auth::WebIdentityApplier(cct, store, role_session, role_tenant, token, principal_tags));
+ rgw::auth::WebIdentityApplier(cct, store, role_session, role_tenant, token, role_tags, principal_tags));
return aplptr_t(new decltype(apl)(std::move(apl)));
}