From 6284745661f25c6db0ba5077237c035002153948 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Sun, 11 Feb 2024 12:17:14 -0500 Subject: [PATCH] rgw/iam: ListUserPolicies supports Marker/MaxItems Signed-off-by: Casey Bodley --- src/rgw/rgw_rest_user_policy.cc | 23 +++++++++++++++++++++-- src/rgw/rgw_rest_user_policy.h | 3 +++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/rgw/rgw_rest_user_policy.cc b/src/rgw/rgw_rest_user_policy.cc index 79d7912d12a3d..2dc10711ea599 100644 --- a/src/rgw/rgw_rest_user_policy.cc +++ b/src/rgw/rgw_rest_user_policy.cc @@ -243,6 +243,19 @@ RGWListUserPolicies::RGWListUserPolicies() { } +int RGWListUserPolicies::get_params() +{ + marker = s->info.args.get("Marker"); + + int r = s->info.args.get_int("MaxItems", &max_items, max_items); + if (r < 0 || max_items > 1000) { + s->err.message = "Invalid value for MaxItems"; + return -EINVAL; + } + + return RGWRestUserPolicy::get_params(); +} + void RGWListUserPolicies::execute(optional_yield y) { std::map policies; @@ -262,10 +275,16 @@ void RGWListUserPolicies::execute(optional_yield y) s->formatter->close_section(); s->formatter->open_object_section("ListUserPoliciesResult"); s->formatter->open_array_section("PolicyNames"); - for (const auto& p : policies) { - s->formatter->dump_string("member", p.first); + auto policy = policies.lower_bound(marker); + for (; policy != policies.end() && max_items > 0; ++policy, --max_items) { + s->formatter->dump_string("member", policy->first); } s->formatter->close_section(); // PolicyNames + const bool is_truncated = (policy != policies.end()); + encode_json("IsTruncated", is_truncated, s->formatter); + if (is_truncated) { + encode_json("Marker", policy->first, s->formatter); + } s->formatter->close_section(); // ListUserPoliciesResult s->formatter->close_section(); // ListUserPoliciesResponse } diff --git a/src/rgw/rgw_rest_user_policy.h b/src/rgw/rgw_rest_user_policy.h index f4188687f86ed..117226edc27d2 100644 --- a/src/rgw/rgw_rest_user_policy.h +++ b/src/rgw/rgw_rest_user_policy.h @@ -50,6 +50,9 @@ public: }; class RGWListUserPolicies : public RGWRestUserPolicy { + std::string marker; + int max_items = 100; + int get_params() override; public: RGWListUserPolicies(); void execute(optional_yield y) override; -- 2.39.5