From: Seena Fallah Date: Wed, 5 Mar 2025 19:52:48 +0000 (+0100) Subject: rgw: pass rgwx-perm-check-uid for multisite fetch object X-Git-Tag: v20.1.0~329^2~13 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2201a1e005d366e4ec8b2079018256a474589396;p=ceph.git rgw: pass rgwx-perm-check-uid for multisite fetch object Signed-off-by: Seena Fallah (cherry picked from commit 86aa6d36e24b78604fd15ac52452ab2cfcc539a9) --- diff --git a/src/rgw/driver/rados/rgw_cr_rados.cc b/src/rgw/driver/rados/rgw_cr_rados.cc index 8bb30f0f3e54..6e00e02721c3 100644 --- a/src/rgw/driver/rados/rgw_cr_rados.cc +++ b/src/rgw/driver/rados/rgw_cr_rados.cc @@ -813,7 +813,8 @@ int RGWAsyncFetchRemoteObj::_send_request(const DoutPrefixProvider *dpp) std::optional bytes_transferred; const req_context rctx{dpp, null_yield, nullptr}; int r = store->getRados()->fetch_remote_obj(obj_ctx, - user_id.value_or(rgw_user()), + NULL, /* uid */ + user_id ? &*user_id : nullptr, /* replication uid */ NULL, /* req_info */ source_zone, dest_obj.get_obj(), @@ -875,7 +876,6 @@ int RGWAsyncStatRemoteObj::_send_request(const DoutPrefixProvider *dpp) { RGWObjectCtx obj_ctx(store); - string user_id; char buf[16]; snprintf(buf, sizeof(buf), ".%lld", (long long)store->getRados()->instance_id()); @@ -884,7 +884,7 @@ int RGWAsyncStatRemoteObj::_send_request(const DoutPrefixProvider *dpp) int r = store->getRados()->stat_remote_obj(dpp, obj_ctx, - rgw_user(user_id), + nullptr, /* user_id */ nullptr, /* req_info */ source_zone, src_obj, diff --git a/src/rgw/driver/rados/rgw_rados.cc b/src/rgw/driver/rados/rgw_rados.cc index 8a38a6bebcef..bf2be16f5063 100644 --- a/src/rgw/driver/rados/rgw_rados.cc +++ b/src/rgw/driver/rados/rgw_rados.cc @@ -4140,7 +4140,7 @@ public: int RGWRados::stat_remote_obj(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, - const rgw_user& user_id, + const rgw_owner* user_id, req_info *info, const rgw_zone_id& source_zone, const rgw_obj& src_obj, @@ -4208,11 +4208,11 @@ int RGWRados::stat_remote_obj(const DoutPrefixProvider *dpp, static constexpr int NUM_ENPOINT_IOERROR_RETRIES = 20; for (int tries = 0; tries < NUM_ENPOINT_IOERROR_RETRIES; tries++) { - int ret = conn->get_obj(dpp, user_id, info, src_obj, pmod, unmod_ptr, - dest_mtime_weight.zone_short_id, dest_mtime_weight.pg_ver, - prepend_meta, get_op, rgwx_stat, - sync_manifest, skip_decrypt, nullptr, sync_cloudtiered, - true, &cb, &in_stream_req); + int ret = conn->get_obj(dpp, user_id, nullptr, info, src_obj, pmod, unmod_ptr, + dest_mtime_weight.zone_short_id, dest_mtime_weight.pg_ver, + prepend_meta, get_op, rgwx_stat, + sync_manifest, skip_decrypt, nullptr, sync_cloudtiered, + true, &cb, &in_stream_req); if (ret < 0) { return ret; } @@ -4288,7 +4288,8 @@ int RGWFetchObjFilter_Default::filter(CephContext *cct, } int RGWRados::fetch_remote_obj(RGWObjectCtx& dest_obj_ctx, - const rgw_user& user_id, + const rgw_owner* user_id, + const rgw_user* perm_check_uid, req_info *info, const rgw_zone_id& source_zone, const rgw_obj& dest_obj, @@ -4448,7 +4449,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& dest_obj_ctx, static constexpr int NUM_ENPOINT_IOERROR_RETRIES = 20; for (int tries = 0; tries < NUM_ENPOINT_IOERROR_RETRIES; tries++) { - ret = conn->get_obj(rctx.dpp, user_id, info, src_obj, pmod, unmod_ptr, + ret = conn->get_obj(rctx.dpp, user_id, perm_check_uid, info, src_obj, pmod, unmod_ptr, dest_mtime_weight.zone_short_id, dest_mtime_weight.pg_ver, prepend_meta, get_op, rgwx_stat, sync_manifest, skip_decrypt, &dst_zone_trace, sync_cloudtiered, true, @@ -4831,7 +4832,8 @@ int RGWRados::copy_obj(RGWObjectCtx& src_obj_ctx, // response to the frontend socket. call fetch_remote_obj() synchronously so // that only one thread tries to suspend that coroutine const req_context rctx{dpp, null_yield, nullptr}; - return fetch_remote_obj(dest_obj_ctx, remote_user, info, source_zone, + const rgw_owner remote_user_owner(remote_user); + return fetch_remote_obj(dest_obj_ctx, &remote_user_owner, nullptr, info, source_zone, dest_obj, src_obj, dest_bucket_info, &src_bucket_info, dest_placement, src_mtime, mtime, mod_ptr, unmod_ptr, high_precision_time, diff --git a/src/rgw/driver/rados/rgw_rados.h b/src/rgw/driver/rados/rgw_rados.h index 8359a0bce1b7..f676cfeed79a 100644 --- a/src/rgw/driver/rados/rgw_rados.h +++ b/src/rgw/driver/rados/rgw_rados.h @@ -1129,7 +1129,7 @@ public: int stat_remote_obj(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, - const rgw_user& user_id, + const rgw_owner* user_id, req_info *info, const rgw_zone_id& source_zone, const rgw_obj& src_obj, @@ -1148,7 +1148,8 @@ public: std::string *petag, optional_yield y); int fetch_remote_obj(RGWObjectCtx& dest_obj_ctx, - const rgw_user& user_id, + const rgw_owner* user_id, + const rgw_user* perm_check_uid, req_info *info, const rgw_zone_id& source_zone, const rgw_obj& dest_obj, diff --git a/src/rgw/rgw_rest_conn.cc b/src/rgw/rgw_rest_conn.cc index 770ccae29909..ba819e49cc17 100644 --- a/src/rgw/rgw_rest_conn.cc +++ b/src/rgw/rgw_rest_conn.cc @@ -296,7 +296,9 @@ static void set_header(T val, map& headers, const string& header } -int RGWRESTConn::get_obj(const DoutPrefixProvider *dpp, const rgw_owner& uid, req_info *info /* optional */, const rgw_obj& obj, +int RGWRESTConn::get_obj(const DoutPrefixProvider *dpp, const rgw_owner *uid, + const rgw_user *perm_check_uid, + req_info *info /* optional */, const rgw_obj& obj, const real_time *mod_ptr, const real_time *unmod_ptr, uint32_t mod_zone_id, uint64_t mod_pg_ver, bool prepend_metadata, bool get_op, bool rgwx_stat, @@ -306,6 +308,7 @@ int RGWRESTConn::get_obj(const DoutPrefixProvider *dpp, const rgw_owner& uid, re { get_obj_params params; params.uid = uid; + params.perm_check_uid = perm_check_uid; params.info = info; params.mod_ptr = mod_ptr; params.mod_pg_ver = mod_pg_ver; @@ -328,7 +331,10 @@ int RGWRESTConn::get_obj(const DoutPrefixProvider *dpp, const rgw_obj& obj, cons return ret; param_vec_t params; - populate_params(params, &in_params.uid, self_zone_group); + populate_params(params, in_params.uid, self_zone_group); + if (in_params.perm_check_uid) { + params.push_back(param_pair_t(RGW_SYS_PARAM_PREFIX "perm-check-uid", to_string(*in_params.perm_check_uid))); + } if (in_params.prepend_metadata) { params.push_back(param_pair_t(RGW_SYS_PARAM_PREFIX "prepend-metadata", "true")); } diff --git a/src/rgw/rgw_rest_conn.h b/src/rgw/rgw_rest_conn.h index 7abf86a3d3f0..d23a27a86541 100644 --- a/src/rgw/rgw_rest_conn.h +++ b/src/rgw/rgw_rest_conn.h @@ -145,7 +145,8 @@ public: ceph::real_time *mtime, optional_yield y); struct get_obj_params { - rgw_owner uid; + const rgw_owner *uid{nullptr}; + const rgw_user *perm_check_uid{nullptr}; req_info *info{nullptr}; const ceph::real_time *mod_ptr{nullptr}; const ceph::real_time *unmod_ptr{nullptr}; @@ -173,7 +174,9 @@ public: int get_obj(const DoutPrefixProvider *dpp, const rgw_obj& obj, const get_obj_params& params, bool send, RGWRESTStreamRWRequest **req); - int get_obj(const DoutPrefixProvider *dpp, const rgw_owner& uid, req_info *info /* optional */, const rgw_obj& obj, + int get_obj(const DoutPrefixProvider *dpp, const rgw_owner* uid, + const rgw_user* perm_check_uid, + req_info *info /* optional */, const rgw_obj& obj, const ceph::real_time *mod_ptr, const ceph::real_time *unmod_ptr, uint32_t mod_zone_id, uint64_t mod_pg_ver, bool prepend_metadata, bool get_op, bool rgwx_stat, bool sync_manifest,