* Save the given user information to storage.
* Returns: 0 on success, -ERR# on failure.
*/
-int rgw_store_user_info(RGWRados *store, RGWUserInfo& info, RGWUserInfo *old_info,
- RGWObjVersionTracker *objv_tracker, time_t mtime, bool exclusive)
+int rgw_store_user_info(RGWRados *store,
+ RGWUserInfo& info,
+ RGWUserInfo *old_info,
+ RGWObjVersionTracker *objv_tracker,
+ time_t mtime,
+ bool exclusive,
+ map<string, bufferlist> *pattrs)
{
bufferlist bl;
info.encode(bl);
::encode(ui, data_bl);
::encode(info, data_bl);
- ret = store->meta_mgr->put_entry(user_meta_handler, info.user_id, data_bl, exclusive, &ot, mtime);
+ ret = store->meta_mgr->put_entry(user_meta_handler, info.user_id, data_bl, exclusive, &ot, mtime, pattrs);
if (ret < 0)
return ret;
return ret;
}
+int rgw_store_user_attrs(RGWRados *const store,
+ string& user_id,
+ map<string, bufferlist>& attrs,
+ map<string, bufferlist>* const rmattrs,
+ RGWObjVersionTracker * const objv_tracker)
+{
+ rgw_obj obj(store->zone.user_uid_pool, user_id);
+
+ return store->meta_mgr->set_attrs(user_meta_handler, user_id, obj,
+ attrs, rmattrs, objv_tracker);
+}
+
struct user_info_entry {
RGWUserInfo info;
RGWObjVersionTracker objv_tracker;
* 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(RGWRados *store, string& uid, RGWUserInfo& info,
- RGWObjVersionTracker *objv_tracker, time_t *pmtime,
- rgw_cache_entry_info *cache_info)
+int rgw_get_user_info_by_uid(RGWRados *store,
+ string& uid,
+ RGWUserInfo& info,
+ RGWObjVersionTracker *objv_tracker,
+ time_t *pmtime,
+ rgw_cache_entry_info *cache_info,
+ map<string, bufferlist> *pattrs)
{
bufferlist bl;
RGWUID user_id;
RGWObjectCtx obj_ctx(store);
- int ret = rgw_get_system_obj(store, obj_ctx, store->zone.user_uid_pool, uid, bl, objv_tracker, pmtime, NULL, cache_info);
- if (ret < 0)
+ int ret = rgw_get_system_obj(store, obj_ctx, store->zone.user_uid_pool, uid, bl, objv_tracker, pmtime, pattrs, cache_info);
+ if (ret < 0) {
return ret;
+ }
bufferlist::iterator iter = bl.begin();
try {
return rgw_get_user_info_from_index(store, access_key, store->zone.user_keys_pool, info, objv_tracker, pmtime);
}
+int rgw_get_user_attrs_by_uid(RGWRados *store,
+ const string& user_id,
+ map<string, bufferlist>& attrs,
+ RGWObjVersionTracker *objv_tracker)
+{
+ RGWObjectCtx obj_ctx(store);
+ rgw_obj obj(store->zone.user_uid_pool, user_id);
+ RGWRados::SystemObject src(store, obj_ctx, obj);
+ RGWRados::SystemObject::Read rop(&src);
+
+ rop.stat_params.attrs = &attrs;
+ return rop.stat(objv_tracker);
+}
+
int rgw_remove_key_index(RGWRados *store, RGWAccessKey& access_key)
{
rgw_obj obj(store->zone.user_keys_pool, access_key.id);
return 0;
}
-class RGWUserMetadataObject : public RGWMetadataObject {
+struct RGWUserCompleteInfo {
RGWUserInfo info;
+ map<string, bufferlist> attrs;
+ bool has_attrs;
+
+ RGWUserCompleteInfo()
+ : has_attrs(false)
+ {}
+
+ void dump(Formatter * const f) const {
+ info.dump(f);
+ encode_json("attrs", attrs, f);
+ }
+
+ void decode_json(JSONObj *obj) {
+ decode_json_obj(info, obj);
+ has_attrs = JSONDecoder::decode_json("attrs", attrs, obj);
+ }
+};
+
+class RGWUserMetadataObject : public RGWMetadataObject {
+ RGWUserCompleteInfo uci;
public:
- RGWUserMetadataObject(RGWUserInfo& i, obj_version& v, time_t m) : info(i) {
+ RGWUserMetadataObject(const RGWUserCompleteInfo& _uci, obj_version& v, time_t m)
+ : uci(_uci) {
objv = v;
mtime = m;
}
void dump(Formatter *f) const {
- info.dump(f);
+ uci.dump(f);
}
};
string get_type() { return "user"; }
int get(RGWRados *store, string& entry, RGWMetadataObject **obj) {
- RGWUserInfo info;
-
+ RGWUserCompleteInfo uci;
RGWObjVersionTracker objv_tracker;
time_t mtime;
- int ret = rgw_get_user_info_by_uid(store, entry, info, &objv_tracker, &mtime);
- if (ret < 0)
+ int ret = rgw_get_user_info_by_uid(store, entry, uci.info, &objv_tracker,
+ &mtime, NULL, &uci.attrs);
+ if (ret < 0) {
return ret;
+ }
- RGWUserMetadataObject *mdo = new RGWUserMetadataObject(info, objv_tracker.read_version, mtime);
-
+ RGWUserMetadataObject *mdo = new RGWUserMetadataObject(uci, objv_tracker.read_version, mtime);
*obj = mdo;
return 0;
int put(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker,
time_t mtime, JSONObj *obj, sync_type_t sync_mode) {
- RGWUserInfo info;
+ RGWUserCompleteInfo uci;
- decode_json_obj(info, obj);
+ decode_json_obj(uci, obj);
+
+ map<string, bufferlist> *pattrs = NULL;
+ if (uci.has_attrs) {
+ pattrs = &uci.attrs;
+ }
RGWUserInfo old_info;
time_t orig_mtime;
return STATUS_NO_APPLY;
}
- ret = rgw_store_user_info(store, info, &old_info, &objv_tracker, mtime, false);
- if (ret < 0)
+ ret = rgw_store_user_info(store, uci.info, &old_info, &objv_tracker, mtime, false, pattrs);
+ if (ret < 0) {
return ret;
+ }
return STATUS_APPLIED;
}
* Save the given user information to storage.
* Returns: 0 on success, -ERR# on failure.
*/
-extern int rgw_store_user_info(RGWRados *store, RGWUserInfo& info, RGWUserInfo *old_info,
- RGWObjVersionTracker *objv_tracker, time_t mtime, bool exclusive);
+extern int rgw_store_user_info(RGWRados *store,
+ RGWUserInfo& info,
+ RGWUserInfo *old_info,
+ RGWObjVersionTracker *objv_tracker,
+ time_t mtime,
+ bool exclusive,
+ map<string, bufferlist> *pattrs = NULL);
+/**
+ * Save the custom user metadata given in @attrs and delete those in @rmattrs
+ * for user specified in @user_id.
+ * Returns: 0 on success, -ERR# on failure.
+ */
+extern int rgw_store_user_attrs(RGWRados *store,
+ string& user_id,
+ map<string, bufferlist>& attrs,
+ map<string, bufferlist>* rmattrs,
+ RGWObjVersionTracker *objv_tracker);
+
/**
* 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_uid(RGWRados *store, string& user_id, RGWUserInfo& info,
- RGWObjVersionTracker *objv_tracker = NULL, time_t *pmtime = NULL,
- rgw_cache_entry_info *cache_info = NULL);
+extern int rgw_get_user_info_by_uid(RGWRados *store,
+ string& user_id,
+ RGWUserInfo& info,
+ RGWObjVersionTracker *objv_tracker = NULL,
+ time_t *pmtime = NULL,
+ rgw_cache_entry_info *cache_info = NULL,
+ map<string, bufferlist> *pattrs = NULL);
/**
* 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_access_key(RGWRados *store, string& access_key, RGWUserInfo& info,
RGWObjVersionTracker *objv_tracker = NULL, time_t *pmtime = NULL);
+/**
+ * Get all the custom metadata stored for user specified in @user_id
+ * and put it into @attrs.
+ * Returns: 0 on success, -ERR# on failure.
+ */
+extern int rgw_get_user_attrs_by_uid(RGWRados *store,
+ const string& user_id,
+ map<string, bufferlist>& attrs,
+ RGWObjVersionTracker *objv_tracker = NULL);
/**
* Given an RGWUserInfo, deletes the user and its bucket ACLs.
*/