}
static int load_role(const DoutPrefixProvider* dpp, optional_yield y,
- rgw::sal::Driver* driver,
- const std::string& tenant,
+ rgw::sal::Driver* driver, const rgw_owner& owner,
+ rgw_account_id& account_id, const std::string& tenant,
const std::string& name,
std::unique_ptr<rgw::sal::RGWRole>& role,
- rgw::ARN& resource,
- std::string& message)
+ rgw::ARN& resource, std::string& message)
{
+ if (const auto* id = std::get_if<rgw_account_id>(&owner); id) {
+ account_id = *id;
+
+ // look up account role by RoleName
+ int r = driver->load_account_role_by_name(dpp, y, account_id, name, &role);
+ if (r == -ENOENT) {
+ message = "No such RoleName in the account";
+ return -ERR_NO_ROLE_FOUND;
+ }
+ if (r >= 0) {
+ resource = make_role_arn(role->get_path(), role->get_name(), account_id);
+ }
+ return r;
+ }
+
role = driver->get_role(name, tenant);
const int r = role->get(dpp, y);
if (r == -ENOENT) {
return -ERR_LIMIT_EXCEEDED;
}
- resource = make_role_arn(role_path, role_name, s->user->get_tenant());
+
+ if (const auto* id = std::get_if<rgw_account_id>(&s->owner.id); id) {
+ resource = make_role_arn(role_path, role_name, *id);
+ } else {
+ resource = make_role_arn(role_path, role_name, s->user->get_tenant());
+ }
return 0;
}
return -EINVAL;
}
- return load_role(this, y, driver, s->user->get_tenant(), role_name,
- role, resource, s->err.message);
+ return load_role(this, y, driver, s->owner.id, account_id,
+ s->user->get_tenant(), role_name, role, resource,
+ s->err.message);
}
void RGWDeleteRole::execute(optional_yield y)
return -EINVAL;
}
- return load_role(this, y, driver, s->user->get_tenant(), role_name,
- role, resource, s->err.message);
+ return load_role(this, y, driver, s->owner.id, account_id,
+ s->user->get_tenant(), role_name, role, resource,
+ s->err.message);
}
void RGWGetRole::execute(optional_yield y)
return -ERR_MALFORMED_DOC;
}
- return load_role(this, y, driver, s->user->get_tenant(), role_name,
- role, resource, s->err.message);
+ return load_role(this, y, driver, s->owner.id, account_id,
+ s->user->get_tenant(), role_name, role, resource,
+ s->err.message);
}
void RGWModifyRoleTrustPolicy::execute(optional_yield y)
void RGWListRoles::execute(optional_yield y)
{
+ // TODO: list_account_roles() for account owner
vector<std::unique_ptr<rgw::sal::RGWRole>> result;
op_ret = driver->get_roles(s, y, path_prefix, s->user->get_tenant(), result);
return -ERR_MALFORMED_DOC;
}
- return load_role(this, y, driver, s->user->get_tenant(), role_name,
- role, resource, s->err.message);
+ return load_role(this, y, driver, s->owner.id, account_id,
+ s->user->get_tenant(), role_name, role, resource,
+ s->err.message);
}
void RGWPutRolePolicy::execute(optional_yield y)
return -EINVAL;
}
- return load_role(this, y, driver, s->user->get_tenant(), role_name,
- role, resource, s->err.message);
+ return load_role(this, y, driver, s->owner.id, account_id,
+ s->user->get_tenant(), role_name, role, resource,
+ s->err.message);
}
void RGWGetRolePolicy::execute(optional_yield y)
return -EINVAL;
}
- return load_role(this, y, driver, s->user->get_tenant(), role_name,
- role, resource, s->err.message);
+ return load_role(this, y, driver, s->owner.id, account_id,
+ s->user->get_tenant(), role_name, role, resource,
+ s->err.message);
}
void RGWListRolePolicies::execute(optional_yield y)
return -EINVAL;
}
- return load_role(this, y, driver, s->user->get_tenant(), role_name,
- role, resource, s->err.message);
+ return load_role(this, y, driver, s->owner.id, account_id,
+ s->user->get_tenant(), role_name, role, resource,
+ s->err.message);
}
void RGWDeleteRolePolicy::execute(optional_yield y)
return r;
}
- return load_role(this, y, driver, s->user->get_tenant(), role_name,
- role, resource, s->err.message);
+ return load_role(this, y, driver, s->owner.id, account_id,
+ s->user->get_tenant(), role_name, role, resource,
+ s->err.message);
}
void RGWTagRole::execute(optional_yield y)
return -EINVAL;
}
- return load_role(this, y, driver, s->user->get_tenant(), role_name,
- role, resource, s->err.message);
+ return load_role(this, y, driver, s->owner.id, account_id,
+ s->user->get_tenant(), role_name, role, resource,
+ s->err.message);
}
void RGWListRoleTags::execute(optional_yield y)
});
}
- return load_role(this, y, driver, s->user->get_tenant(), role_name,
- role, resource, s->err.message);
+ return load_role(this, y, driver, s->owner.id, account_id,
+ s->user->get_tenant(), role_name, role, resource,
+ s->err.message);
}
void RGWUntagRole::execute(optional_yield y)
max_session_duration = s->info.args.get("MaxSessionDuration");
- return load_role(this, y, driver, s->user->get_tenant(), role_name,
- role, resource, s->err.message);
+ return load_role(this, y, driver, s->owner.id, account_id,
+ s->user->get_tenant(), role_name, role, resource,
+ s->err.message);
}
void RGWUpdateRole::execute(optional_yield y)