From 917c8a428e2214f37d13682b319a8687ec51ab2e Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Fri, 26 Apr 2019 12:27:04 -0700 Subject: [PATCH] rgw: rgw_user api adjustments Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_bucket.cc | 2 - src/rgw/rgw_user.cc | 134 +++++++++++++++++++---------------- src/rgw/rgw_user.h | 20 +++--- src/rgw/services/svc_user.cc | 12 ++-- src/rgw/services/svc_user.h | 2 +- 5 files changed, 89 insertions(+), 81 deletions(-) diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index b9ccd604131..b26c58cb183 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -2543,8 +2543,6 @@ public: }; class RGWBucketMetadataHandler : public RGWMetadataHandler { - RGWSI_MetaBackend::ModuleRef be_module; - public: string get_type() override { return "bucket"; } diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc index 171a5bd9440..4a6dbbb4524 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -141,7 +141,7 @@ int rgw_user_get_all_buckets_stats(RGWRados *store, const rgw_user& user_id, map * Save the given user information to storage. * Returns: 0 on success, -ERR# on failure. */ -int rgw_store_user_info(RGWUserCtl& user_ctl, +int rgw_store_user_info(RGWUserCtl *user_ctl, RGWUserInfo& info, RGWUserInfo *old_info, RGWObjVersionTracker *objv_tracker, @@ -149,19 +149,20 @@ int rgw_store_user_info(RGWUserCtl& user_ctl, bool exclusive, map *pattrs) { - return user_ctl.store_info(info, RGWUserCtl::PutParams() - .set_old_info(&info) - .set_objv_tracker(objv_tracker) - .set_mtime(mtime) - .set_exclusive(exclusive) - .set_attrs(pattrs)); + return user_ctl->store_info(info, RGWUserCtl::PutParams() + .set_old_info(&info) + .set_objv_tracker(objv_tracker) + .set_mtime(mtime) + .set_exclusive(exclusive) + .set_attrs(pattrs) + .set_yield(null_yield)); } /** * Given a uid, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ -int rgw_get_user_info_by_uid(RGWUserCtl& user_ctl, +int rgw_get_user_info_by_uid(RGWUserCtl *user_ctl, const rgw_user& uid, RGWUserInfo& info, RGWObjVersionTracker * const objv_tracker, @@ -169,70 +170,75 @@ int rgw_get_user_info_by_uid(RGWUserCtl& user_ctl, rgw_cache_entry_info * const cache_info, map * const pattrs) { - return user_ctl.get_info_by_uid(uid, RGWUserCtl::GetParams() - .set_info(&info) - .set_objv_tracker(objv_tracker) - .set_mtime(pmtime) - .set_cache_info(cache_info) - .set_attrs(pattrs)); + return user_ctl->get_info_by_uid(uid, RGWUserCtl::GetParams() + .set_info(&info) + .set_objv_tracker(objv_tracker) + .set_mtime(pmtime) + .set_cache_info(cache_info) + .set_attrs(pattrs) + .set_yield(null_yield)); } /** * Given an email, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ -int rgw_get_user_info_by_email(RGWUserCtl& user_ctl, string& email, RGWUserInfo& info, +int rgw_get_user_info_by_email(RGWUserCtl *user_ctl, string& email, RGWUserInfo& info, RGWObjVersionTracker *objv_tracker, real_time *pmtime) { - return user_ctl.get_info_by_email(email, RGWUserCtl::GetParams() - .set_info(&info) - .set_objv_tracker(objv_tracker) - .set_mtime(pmtime)); + return user_ctl->get_info_by_email(email, RGWUserCtl::GetParams() + .set_info(&info) + .set_objv_tracker(objv_tracker) + .set_mtime(pmtime) + .set_yield(null_yield)); } /** * Given an swift username, finds the user_info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ -extern int rgw_get_user_info_by_swift(RGWUserCtl& user_ctl, +extern int rgw_get_user_info_by_swift(RGWUserCtl *user_ctl, const string& swift_name, RGWUserInfo& info, /* out */ RGWObjVersionTracker * const objv_tracker, real_time * const pmtime) { - return user_ctl.get_info_by_swift(swift_name, RGWUserCtl::GetParams() - .set_info(&info) - .set_objv_tracker(objv_tracker) - .set_mtime(pmtime)); + return user_ctl->get_info_by_swift(swift_name, RGWUserCtl::GetParams() + .set_info(&info) + .set_objv_tracker(objv_tracker) + .set_mtime(pmtime) + .set_yield(null_yield)); } /** * Given an access key, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ -extern int rgw_get_user_info_by_access_key(RGWUserCtl& user_ctl, +extern int rgw_get_user_info_by_access_key(RGWUserCtl *user_ctl, const std::string& access_key, RGWUserInfo& info, RGWObjVersionTracker* objv_tracker, real_time *pmtime) { - return user_ctl.get_info_by_access_key(access_key, RGWUserCtl::GetParams() - .set_info(&info) - .set_objv_tracker(objv_tracker) - .set_mtime(pmtime)); + return user_ctl->get_info_by_access_key(access_key, RGWUserCtl::GetParams() + .set_info(&info) + .set_objv_tracker(objv_tracker) + .set_mtime(pmtime) + .set_yield(null_yield)); } -int rgw_get_user_attrs_by_uid(RGWUserCtl& user_ctl, +int rgw_get_user_attrs_by_uid(RGWUserCtl *user_ctl, const rgw_user& user_id, map& attrs, RGWObjVersionTracker *objv_tracker) { RGWUserInfo user_info; - return user_ctl.get_info_by_uid(user_id, RGWUserCtl::GetParams() - .set_info(&user_info) - .set_objv_tracker(objv_tracker) - .set_attrs(&attrs)); + return user_ctl->get_info_by_uid(user_id, RGWUserCtl::GetParams() + .set_info(&user_info) + .set_objv_tracker(objv_tracker) + .set_attrs(&attrs) + .set_yield(null_yield)); } /** @@ -241,10 +247,10 @@ int rgw_get_user_attrs_by_uid(RGWUserCtl& user_ctl, * from the user and user email pools. This leaves the pools * themselves alone, as well as any ACLs embedded in object xattrs. */ -int rgw_delete_user(RGWUserCtl& user_ctl, RGWUserInfo& info, RGWObjVersionTracker& objv_tracker) { - return user_ctl.remove_info(info, RGWUserCtl::RemoveParams() - .set_objv_tracker(&objv_tracker) - .set_yield(null_yield)); +int rgw_delete_user(RGWUserCtl *user_ctl, RGWUserInfo& info, RGWObjVersionTracker& objv_tracker) { + return user_ctl->remove_info(info, RGWUserCtl::RemoveParams() + .set_objv_tracker(&objv_tracker) + .set_yield(null_yield)); } static bool char_is_unreserved_url(char c) @@ -643,13 +649,13 @@ int RGWAccessKeyPool::generate_key(RGWUserAdminOpState& op_state, std::string *e if (!id.empty()) { switch (key_type) { case KEY_TYPE_SWIFT: - if (rgw_get_user_info_by_swift(store, id, duplicate_check) >= 0) { + if (rgw_get_user_info_by_swift(user_ctl, id, duplicate_check) >= 0) { set_err_msg(err_msg, "existing swift key in RGW system:" + id); return -ERR_KEY_EXIST; } break; case KEY_TYPE_S3: - if (rgw_get_user_info_by_access_key(store, id, duplicate_check) >= 0) { + if (rgw_get_user_info_by_access_key(user_ctl, id, duplicate_check) >= 0) { set_err_msg(err_msg, "existing S3 key in RGW system:" + id); return -ERR_KEY_EXIST; } @@ -689,7 +695,7 @@ int RGWAccessKeyPool::generate_key(RGWUserAdminOpState& op_state, std::string *e if (!validate_access_key(id)) continue; - } while (!rgw_get_user_info_by_access_key(store, id, duplicate_check)); + } while (!rgw_get_user_info_by_access_key(user_ctl, id, duplicate_check)); } if (key_type == KEY_TYPE_SWIFT) { @@ -700,7 +706,7 @@ int RGWAccessKeyPool::generate_key(RGWUserAdminOpState& op_state, std::string *e } // check that the access key doesn't exist - if (rgw_get_user_info_by_swift(store, id, duplicate_check) >= 0) { + if (rgw_get_user_info_by_swift(user_ctl, id, duplicate_check) >= 0) { set_err_msg(err_msg, "cannot create existing swift key"); return -ERR_KEY_EXIST; } @@ -889,7 +895,6 @@ int RGWAccessKeyPool::execute_remove(RGWUserAdminOpState& op_state, std::string return -ERR_INVALID_ACCESS_KEY; } - rgw_remove_key_index(store, kiter->second); keys_map->erase(kiter); if (!defer_user_update) @@ -956,7 +961,6 @@ int RGWAccessKeyPool::remove_subuser_keys(RGWUserAdminOpState& op_state, keys_map = swift_keys; kiter = keys_map->find(swift_kid); if (kiter != keys_map->end()) { - rgw_remove_key_index(store, kiter->second); keys_map->erase(kiter); } @@ -964,12 +968,11 @@ int RGWAccessKeyPool::remove_subuser_keys(RGWUserAdminOpState& op_state, std::string subuser_str = op_state.get_subuser(); keys_map = access_keys; RGWUserInfo user_info = op_state.get_user_info(); - map::iterator user_kiter = user_info.access_keys.begin(); + auto user_kiter = user_info.access_keys.begin(); for (; user_kiter != user_info.access_keys.end(); ++user_kiter) { if (user_kiter->second.subuser == subuser_str) { kiter = keys_map->find(user_kiter->first); if (kiter != keys_map->end()) { - rgw_remove_key_index(store, kiter->second); keys_map->erase(kiter); } } @@ -1433,7 +1436,7 @@ int RGWUser::init_storage(RGWRados *storage) } store = storage; - user_ctl = *store->ctl.user; + user_ctl = store->ctl.user; clear_populated(); @@ -1473,21 +1476,21 @@ int RGWUser::init(RGWUserAdminOpState& op_state) } if (!user_id.empty() && (user_id.compare(RGW_USER_ANON_ID) != 0)) { - found = (rgw_get_user_info_by_uid(store, user_id, user_info, &op_state.objv) >= 0); + found = (rgw_get_user_info_by_uid(user_ctl, user_id, user_info, &op_state.objv) >= 0); op_state.found_by_uid = found; } if (store->ctx()->_conf.get_val("rgw_user_unique_email")) { if (!user_email.empty() && !found) { - found = (rgw_get_user_info_by_email(store, user_email, user_info, &op_state.objv) >= 0); + found = (rgw_get_user_info_by_email(user_ctl, user_email, user_info, &op_state.objv) >= 0); op_state.found_by_email = found; } } if (!swift_user.empty() && !found) { - found = (rgw_get_user_info_by_swift(store, swift_user, user_info, &op_state.objv) >= 0); + found = (rgw_get_user_info_by_swift(user_ctl, swift_user, user_info, &op_state.objv) >= 0); op_state.found_by_key = found; } if (!access_key.empty() && !found) { - found = (rgw_get_user_info_by_access_key(store, access_key, user_info, &op_state.objv) >= 0); + found = (rgw_get_user_info_by_access_key(user_ctl, access_key, user_info, &op_state.objv) >= 0); op_state.found_by_key = found; } @@ -1545,7 +1548,7 @@ int RGWUser::update(RGWUserAdminOpState& op_state, std::string *err_msg) RGWUserInfo *pold_info = (is_populated() ? &old_info : nullptr); - ret = rgw_store_user_info(store, user_info, pold_info, &op_state.objv, real_time(), false); + ret = rgw_store_user_info(user_ctl, user_info, pold_info, &op_state.objv, real_time(), false); if (ret < 0) { set_err_msg(err_msg, "unable to store user info"); return ret; @@ -1788,7 +1791,7 @@ int RGWUser::execute_remove(RGWUserAdminOpState& op_state, std::string *err_msg, } while (is_truncated); - ret = rgw_delete_user(store, user_info, op_state.objv); + ret = rgw_delete_user(user_ctl, user_info, op_state.objv); if (ret < 0) { set_err_msg(err_msg, "unable to remove user from RADOS"); return ret; @@ -1857,8 +1860,8 @@ int RGWUser::execute_modify(RGWUserAdminOpState& op_state, std::string *err_msg) std::string old_email = old_info.user_email; if (!op_email.empty()) { // make sure we are not adding a duplicate email - if (old_email.compare(op_email) != 0) { - ret = rgw_get_user_info_by_email(store, op_email, duplicate_check); + if (old_email != op_email) { + ret = rgw_get_user_info_by_email(user_ctl, op_email, duplicate_check); if (ret >= 0 && duplicate_check.user_id.compare(user_id) != 0) { set_err_msg(err_msg, "cannot add duplicate email"); return -ERR_EMAIL_EXIST; @@ -1866,14 +1869,9 @@ int RGWUser::execute_modify(RGWUserAdminOpState& op_state, std::string *err_msg) } user_info.user_email = op_email; } else if (op_email.empty() && op_state.user_email_specified) { - ldout(store->ctx(), 10) << "removing email index: " << user_info.user_email << dendl; - ret = rgw_remove_email_index(store, user_info.user_email); - if (ret < 0 && ret != -ENOENT) { - ldout(store->ctx(), 0) << "ERROR: could not remove " << user_info.user_id << " index (err=" << ret << ")" << dendl; - return ret; - } - user_info.user_email = ""; + /* will be physically removed later when calling update() */ + user_info.user_email.clear(); } // update the remaining user info @@ -2453,6 +2451,18 @@ public: return 0; } + RGWMetadataObject *get_meta_obj(JSONObj *jo, const obj_version& objv, const ceph::real_time& mtime) override { + RGWUserCompleteInfo uci; + + try { + decode_json_obj(uci, jo); + } catch (JSONDecoder::err& e) { + return nullptr; + } + + return new RGWUserMetadataObject(uci, objv, mtime); + } + int do_put(RGWSI_MetaBackend::Context *ctx, string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker, diff --git a/src/rgw/rgw_user.h b/src/rgw/rgw_user.h index b69a74c07f1..5451c40f0d1 100644 --- a/src/rgw/rgw_user.h +++ b/src/rgw/rgw_user.h @@ -63,7 +63,7 @@ extern void rgw_get_anon_user(RGWUserInfo& info); * Save the given user information to storage. * Returns: 0 on success, -ERR# on failure. */ -extern int rgw_store_user_info(RGWUserCtl& user_ctl, +extern int rgw_store_user_info(RGWUserCtl *user_ctl, RGWUserInfo& info, RGWUserInfo *old_info, RGWObjVersionTracker *objv_tracker, @@ -75,7 +75,7 @@ extern int rgw_store_user_info(RGWUserCtl& user_ctl, * Given an user_id, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ -extern int rgw_get_user_info_by_uid(RGWUserCtl& user_ctl, +extern int rgw_get_user_info_by_uid(RGWUserCtl *user_ctl, const rgw_user& user_id, RGWUserInfo& info, RGWObjVersionTracker *objv_tracker = nullptr, @@ -86,7 +86,7 @@ extern int rgw_get_user_info_by_uid(RGWUserCtl& user_ctl, * Given an email, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ -extern int rgw_get_user_info_by_email(RGWUserCtl& user_ctl, +extern int rgw_get_user_info_by_email(RGWUserCtl *user_ctl, string& email, RGWUserInfo& info, RGWObjVersionTracker *objv_tracker = NULL, real_time *pmtime = nullptr); @@ -94,7 +94,7 @@ extern int rgw_get_user_info_by_email(RGWUserCtl& user_ctl, * Given an swift username, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ -extern int rgw_get_user_info_by_swift(RGWUserCtl& user_ctl, +extern int rgw_get_user_info_by_swift(RGWUserCtl *user_ctl, const string& swift_name, RGWUserInfo& info, /* out */ RGWObjVersionTracker *objv_tracker = nullptr, @@ -103,7 +103,7 @@ extern int rgw_get_user_info_by_swift(RGWUserCtl& user_ctl, * Given an access key, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ -extern int rgw_get_user_info_by_access_key(RGWUserCtl& user_ctl, +extern int rgw_get_user_info_by_access_key(RGWUserCtl *user_ctl, const std::string& access_key, RGWUserInfo& info, RGWObjVersionTracker* objv_tracker = nullptr, @@ -113,14 +113,14 @@ extern int rgw_get_user_info_by_access_key(RGWUserCtl& user_ctl, * and put it into @attrs. * Returns: 0 on success, -ERR# on failure. */ -extern int rgw_get_user_attrs_by_uid(RGWUserCtl& user_ctl, +extern int rgw_get_user_attrs_by_uid(RGWUserCtl *user_ctl, const rgw_user& user_id, map& attrs, RGWObjVersionTracker *objv_tracker = nullptr); /** * Given an RGWUserInfo, deletes the user and its bucket ACLs. */ -extern int rgw_delete_user(RGWUserCtl& user_ctl, RGWUserInfo& user, RGWObjVersionTracker& objv_tracker); +extern int rgw_delete_user(RGWUserCtl *user_ctl, RGWUserInfo& user, RGWObjVersionTracker& objv_tracker); extern void rgw_perm_to_str(uint32_t mask, char *buf, int len); extern uint32_t rgw_str_to_perm(const char *str); @@ -623,9 +623,9 @@ public: class RGWUserCapPool { - RGWUserCaps *caps{false}; + RGWUserCaps *caps{nullptr}; bool caps_allowed{false}; - RGWUser *user{false}; + RGWUser *user{nullptr}; private: int add(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save); @@ -784,7 +784,7 @@ class RGWUserMetadataObject : public RGWMetadataObject { RGWUserCompleteInfo uci; public: RGWUserMetadataObject() {} - RGWUserMetadataObject(const RGWUserCompleteInfo& _uci, obj_version& v, real_time m) + RGWUserMetadataObject(const RGWUserCompleteInfo& _uci, const obj_version& v, real_time m) : uci(_uci) { objv = v; mtime = m; diff --git a/src/rgw/services/svc_user.cc b/src/rgw/services/svc_user.cc index 733ea63b8d8..aa076f03f33 100644 --- a/src/rgw/services/svc_user.cc +++ b/src/rgw/services/svc_user.cc @@ -83,7 +83,7 @@ class PutOperation RGWSI_User::Svc& svc; RGWSI_MetaBackend_SObj::Context_SObj *ctx; RGWUID ui; - RGWUserInfo& info; + const RGWUserInfo& info; RGWUserInfo *old_info; RGWObjVersionTracker *objv_tracker; real_time& mtime; @@ -102,7 +102,7 @@ class PutOperation public: PutOperation(RGWSI_User::Svc& svc, RGWSI_MetaBackend::Context *_ctx, - RGWUserInfo& info, + const RGWUserInfo& info, RGWUserInfo *old_info, RGWObjVersionTracker *objv_tracker, real_time& mtime, @@ -138,7 +138,7 @@ public: /* check if swift mapping exists */ RGWUserInfo inf; int r = svc.user->get_user_info_by_swift(ctx, k.id, inf, nullptr, nullptr); - if (r >= 0 && inf.user_id.compare(info.user_id) != 0) { + if (r >= 0 && inf.user_id != info.user_id) { ldout(svc.meta_be->ctx(), 0) << "WARNING: can't store user info, swift id (" << k.id << ") already mapped to another user (" << info.user_id << ")" << dendl; return -EEXIST; @@ -152,7 +152,7 @@ public: RGWAccessKey& k = iter->second; RGWUserInfo inf; int r = svc.user->get_user_info_by_access_key(ctx, k.id, &inf, nullptr, nullptr, y); - if (r >= 0 && inf.user_id.compare(info.user_id) != 0) { + if (r >= 0 && inf.user_id != info.user_id) { ldout(svc.meta_be->ctx(), 0) << "WARNING: can't store user info, access key already mapped to another user" << dendl; return -EEXIST; } @@ -243,7 +243,7 @@ public: } if (!old_info.user_email.empty() && - old_info.user_email.compare(new_info.user_email) != 0) { + old_info.user_email != new_info.user_email) { ret = svc.user->remove_email_index(ctx, old_info.user_email, y); if (ret < 0 && ret != -ENOENT) { set_err_msg("ERROR: could not remove index for email " + old_info.user_email); @@ -273,7 +273,7 @@ public: }; int RGWSI_User::store_user_info(RGWSI_MetaBackend::Context *ctx, - RGWUserInfo& info, + const RGWUserInfo& info, RGWUserInfo *old_info, RGWObjVersionTracker *objv_tracker, real_time& mtime, diff --git a/src/rgw/services/svc_user.h b/src/rgw/services/svc_user.h index 0cd0f3ea361..3b1518cd701 100644 --- a/src/rgw/services/svc_user.h +++ b/src/rgw/services/svc_user.h @@ -210,7 +210,7 @@ public: optional_yield y); int store_user_info(RGWSI_MetaBackend::Context *ctx, - RGWUserInfo& info, + const RGWUserInfo& info, RGWUserInfo *old_info, RGWObjVersionTracker *objv_tracker, real_time& mtime, -- 2.39.5