}
uint32_t get_perms_from_aclspec(const DoutPrefixProvider* dpp, const aclspec_t& aclspec) const override {
- return rgw_perms_from_aclspec_default_strategy(id, aclspec, dpp);
+ return rgw_perms_from_aclspec_default_strategy(id.to_str(), aclspec, dpp);
}
bool is_admin_of(const rgw_user& acct_id) const override {
uint32_t rgw_perms_from_aclspec_default_strategy(
- const rgw_user& uid,
+ const std::string& uid,
const rgw::auth::Identity::aclspec_t& aclspec,
const DoutPrefixProvider *dpp)
{
ldpp_dout(dpp, 5) << "Searching permissions for uid=" << uid << dendl;
- const auto iter = aclspec.find(uid.to_str());
+ const auto iter = aclspec.find(uid);
if (std::end(aclspec) != iter) {
ldpp_dout(dpp, 5) << "Found permission: " << iter->second << dendl;
return iter->second;
uint32_t perm = 0;
/* For backward compatibility with ACLOwner. */
- perm |= rgw_perms_from_aclspec_default_strategy(info.acct_user,
+ perm |= rgw_perms_from_aclspec_default_strategy(info.acct_user.to_str(),
aclspec, dpp);
/* We also need to cover cases where rgw_keystone_implicit_tenants
if (info.acct_user.tenant.empty()) {
const rgw_user tenanted_acct_user(info.acct_user.id, info.acct_user.id);
- perm |= rgw_perms_from_aclspec_default_strategy(tenanted_acct_user,
+ perm |= rgw_perms_from_aclspec_default_strategy(tenanted_acct_user.to_str(),
aclspec, dpp);
}
uint32_t rgw::auth::LocalApplier::get_perms_from_aclspec(const DoutPrefixProvider* dpp, const aclspec_t& aclspec) const
{
- return rgw_perms_from_aclspec_default_strategy(user_info.user_id, aclspec, dpp);
+ // match acl grants to the specific user id
+ uint32_t mask = rgw_perms_from_aclspec_default_strategy(
+ user_info.user_id.to_str(), aclspec, dpp);
+
+ if (!user_info.account_id.empty()) {
+ // account users also match acl grants to the account id. in aws, grantees
+ // ONLY refer to accounts. but we continue to match user grants to preserve
+ // access when moving legacy users into new accounts
+ mask |= rgw_perms_from_aclspec_default_strategy(
+ user_info.account_id, aclspec, dpp);
+ }
+
+ return mask;
}
bool rgw::auth::LocalApplier::is_admin_of(const rgw_user& uid) const