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,
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;
}
}
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,
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,
// 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,
}
-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,
{
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;
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"));
}
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};
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,