return ret;
}
}
-
- if (! s->user->user_id.empty()) {
+ // We don't need user policies in case of STS token returned by AssumeRole,
+ // hence the check for user type
+ if (! s->user->user_id.empty() && s->user->type != TYPE_NONE) {
try {
map<string, bufferlist> uattrs;
if (ret = rgw_get_user_attrs_by_uid(store, s->user->user_id, uattrs); ! ret) {
- s->iam_user_policies = get_iam_user_policy_from_attr(s->cct, store, uattrs, s->user->user_id.tenant);
+ if (s->iam_user_policies.empty()) {
+ s->iam_user_policies = get_iam_user_policy_from_attr(s->cct, store, uattrs, s->user->user_id.tenant);
+ } else {
+ // This scenario can happen when a STS token has a policy, then we need to append other user policies
+ // to the existing ones. (e.g. token returned by GetSessionToken)
+ auto user_policies = get_iam_user_policy_from_attr(s->cct, store, uattrs, s->user->user_id.tenant);
+ s->iam_user_policies.insert(s->iam_user_policies.end(), user_policies.begin(), user_policies.end());
+ }
} else {
if (ret == -ENOENT)
ret = 0;
role_policies.push_back(std::move(perm_policy));
}
}
- role_policies.push_back(std::move(token.policy));
+ if (! token.policy.empty()) {
+ role_policies.push_back(std::move(token.policy));
+ }
+ // This is mostly needed to assign the owner of a bucket during its creation
+ user_info.user_id = token.user;
}
- if (! token.user.empty()) {
+ if (! token.user.empty() && token.acct_type != TYPE_NONE) {
// get user info
int ret = rgw_get_user_info_by_uid(store, token.user, user_info, NULL);
if (ret < 0) {
//Role and Policy provide the authorization info, user id and applier info are not needed
if (ret = cred.generateCredentials(cct, req.getDuration(),
req.getPolicy(), roleId,
- boost::none, nullptr); ret < 0) {
+ user_id, nullptr); ret < 0) {
return make_tuple(ret, user, cred, packedPolicySize);
}