From: Radoslaw Zarzynski Date: Tue, 10 Mar 2015 15:58:23 +0000 (+0100) Subject: rgw: unify mechanisms for setting TempURL and Swift account metadata. X-Git-Tag: v9.0.3~179^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=632205131ba9579584a5e6ce10227a9c6e458a79;p=ceph.git rgw: unify mechanisms for setting TempURL and Swift account metadata. Fixes: #11037 Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index 0a796c08deaf..3b7893e7a9d4 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -70,6 +70,9 @@ using ceph::crypto::MD5; #define RGW_ATTR_MANIFEST RGW_ATTR_PREFIX "manifest" #define RGW_ATTR_USER_MANIFEST RGW_ATTR_PREFIX "user_manifest" +#define RGW_ATTR_TEMPURL_KEY1 RGW_ATTR_META_PREFIX "temp-url-key" +#define RGW_ATTR_TEMPURL_KEY2 RGW_ATTR_META_PREFIX "temp-url-key-2" + #define RGW_ATTR_OLH_PREFIX RGW_ATTR_PREFIX "olh." #define RGW_ATTR_OLH_INFO RGW_ATTR_OLH_PREFIX "info" diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index f14facc50fb0..d0939e7b1535 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -2091,6 +2091,31 @@ static void prepare_add_del_attrs(const map& orig_attrs, } } +int RGWPutMetadataAccount::handle_temp_url_update(const map& temp_url_keys) { + RGWUserAdminOpState user_op; + user_op.set_user_id(s->user.user_id); + + map::const_iterator iter; + for (iter = temp_url_keys.begin(); iter != temp_url_keys.end(); ++iter) { + user_op.set_temp_url_key(iter->second, iter->first); + } + + RGWUser user; + ret = user.init(store, user_op); + if (ret < 0) { + ldout(store->ctx(), 0) << "ERROR: could not init user ret=" << ret << dendl; + return ret; + } + + string err_msg; + ret = user.modify(user_op, &err_msg); + if (ret < 0) { + ldout(store->ctx(), 10) << "user.modify() returned " << ret << ": " << err_msg << dendl; + return ret; + } + return 0; +} + int RGWPutMetadataAccount::verify_permission() { if (!rgw_user_is_authenticated(s->user)) { @@ -2099,6 +2124,37 @@ int RGWPutMetadataAccount::verify_permission() return 0; } +void RGWPutMetadataAccount::filter_out_temp_url(map& add_attrs, + const set& rmattr_names, + map& temp_url_keys) +{ + map::iterator iter; + for (iter = add_attrs.begin(); iter != add_attrs.end(); ++iter) { + const string name = iter->first; + + if (name.compare(RGW_ATTR_TEMPURL_KEY1) == 0) { + temp_url_keys[0] = iter->second.c_str(); + add_attrs.erase(name); + } + if (name.compare(RGW_ATTR_TEMPURL_KEY2) == 0) { + temp_url_keys[1] = iter->second.c_str(); + add_attrs.erase(name); + } + } + + set::const_iterator riter; + for(riter = rmattr_names.begin(); riter != rmattr_names.end(); ++riter) { + const string& name = *riter; + + if (name.compare(RGW_ATTR_TEMPURL_KEY1) == 0) { + temp_url_keys[0] = string(); + } + if (name.compare(RGW_ATTR_TEMPURL_KEY2) == 0) { + temp_url_keys[1] = string(); + } + } +} + void RGWPutMetadataAccount::execute() { rgw_obj obj; @@ -2120,7 +2176,27 @@ void RGWPutMetadataAccount::execute() prepare_add_del_attrs(orig_attrs, rmattr_names, attrs, rmattrs); populate_with_generic_attrs(s, attrs); + /* Handle the TempURL-related stuff. */ + map temp_url_keys; + filter_out_temp_url(attrs, rmattr_names, temp_url_keys); + if (!temp_url_keys.empty()) { + if (s->perm_mask != RGW_PERM_FULL_CONTROL) { + ret = -EPERM; + return; + } + } + ret = rgw_store_user_attrs(store, s->user.user_id, attrs, &rmattrs, &acct_op_tracker); + if (ret < 0) { + return; + } + + if (!temp_url_keys.empty()) { + ret = handle_temp_url_update(temp_url_keys); + if (ret < 0) { + return; + } + } } int RGWPutMetadataBucket::verify_permission() @@ -2214,43 +2290,6 @@ void RGWPutMetadataObject::execute() ret = store->set_attrs(s->obj_ctx, obj, attrs, &rmattrs, NULL); } -int RGWSetTempUrl::verify_permission() -{ - if (s->perm_mask != RGW_PERM_FULL_CONTROL) - return -EACCES; - - return 0; -} - -void RGWSetTempUrl::execute() -{ - ret = get_params(); - if (ret < 0) { - return; - } - - RGWUserAdminOpState user_op; - user_op.set_user_id(s->user.user_id); - map::iterator iter; - for (iter = temp_url_keys.begin(); iter != temp_url_keys.end(); ++iter) { - user_op.set_temp_url_key(iter->second, iter->first); - } - - RGWUser user; - ret = user.init(store, user_op); - if (ret < 0) { - ldout(store->ctx(), 0) << "ERROR: could not init user ret=" << ret << dendl; - return; - } - string err_msg; - ret = user.modify(user_op, &err_msg); - if (ret < 0) { - ldout(store->ctx(), 10) << "user.modify() returned " << ret << ": " << err_msg << dendl; - return; - } -} - - int RGWDeleteObj::verify_permission() { if (!verify_bucket_permission(s, RGW_PERM_WRITE)) diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index 45e322a5deac..8f6a8f9c9bf1 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -531,6 +531,10 @@ public: virtual int get_params() = 0; virtual void send_response() = 0; + virtual void filter_out_temp_url(map& add_attrs, + const set& rmattr_names, + map& temp_url_keys); + virtual int handle_temp_url_update(const map& temp_url_keys); virtual const string name() { return "put_account_metadata"; } virtual RGWOpType get_type() { return RGW_OP_PUT_METADATA_ACCOUNT; } virtual uint32_t op_mask() { return RGW_OP_TYPE_WRITE; } @@ -591,22 +595,6 @@ public: virtual uint32_t op_mask() { return RGW_OP_TYPE_WRITE; } }; -class RGWSetTempUrl : public RGWOp { -protected: - int ret; - map temp_url_keys; -public: - RGWSetTempUrl() : ret(0) {} - - int verify_permission(); - void execute(); - - virtual int get_params() = 0; - virtual void send_response() = 0; - virtual const string name() { return "set_temp_url"; } - virtual RGWOpType get_type() { return RGW_OP_SET_TEMPURL; } -}; - class RGWDeleteObj : public RGWOp { protected: int ret; diff --git a/src/rgw/rgw_rest.h b/src/rgw/rgw_rest.h index 5b707b62abbc..b28486c6e428 100644 --- a/src/rgw/rgw_rest.h +++ b/src/rgw/rgw_rest.h @@ -184,12 +184,6 @@ public: ~RGWPutMetadataObject_ObjStore() {} }; -class RGWSetTempUrl_ObjStore : public RGWSetTempUrl { -public: - RGWSetTempUrl_ObjStore() {} - ~RGWSetTempUrl_ObjStore() {} -}; - class RGWDeleteObj_ObjStore : public RGWDeleteObj { public: RGWDeleteObj_ObjStore() {} diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index 1dc18b4716e1..f9bd512f6d53 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -600,36 +600,6 @@ void RGWPutMetadataObject_ObjStore_SWIFT::send_response() rgw_flush_formatter_and_reset(s, s->formatter); } -int RGWSetTempUrl_ObjStore_SWIFT::get_params() -{ - const char *temp_url = s->info.env->get("HTTP_X_ACCOUNT_META_TEMP_URL_KEY"); - if (temp_url) { - temp_url_keys[0] = temp_url; - } - - temp_url = s->info.env->get("HTTP_X_ACCOUNT_META_TEMP_URL_KEY_2"); - if (temp_url) { - temp_url_keys[1] = temp_url; - } - - if (temp_url_keys.empty()) - return -EINVAL; - - return 0; -} - -void RGWSetTempUrl_ObjStore_SWIFT::send_response() -{ - int r = ret; - if (!r) - r = STATUS_NO_CONTENT; - - set_req_state_err(s, r); - dump_errno(s); - end_header(s, this); - rgw_flush_formatter_and_reset(s, s->formatter); -} - void RGWDeleteObj_ObjStore_SWIFT::send_response() { int r = ret; @@ -805,14 +775,6 @@ RGWOp *RGWHandler_ObjStore_Service_SWIFT::op_head() RGWOp *RGWHandler_ObjStore_Service_SWIFT::op_post() { - const char *temp_url = s->info.env->get("HTTP_X_ACCOUNT_META_TEMP_URL_KEY"); - if (temp_url) { - return new RGWSetTempUrl_ObjStore_SWIFT; - } - temp_url = s->info.env->get("HTTP_X_ACCOUNT_META_TEMP_URL_KEY_2"); - if (temp_url) { - return new RGWSetTempUrl_ObjStore_SWIFT; - } return new RGWPutMetadataAccount_ObjStore_SWIFT; } diff --git a/src/rgw/rgw_rest_swift.h b/src/rgw/rgw_rest_swift.h index 7fae8d03eb76..892cde4be77e 100644 --- a/src/rgw/rgw_rest_swift.h +++ b/src/rgw/rgw_rest_swift.h @@ -116,15 +116,6 @@ public: void send_response(); }; -class RGWSetTempUrl_ObjStore_SWIFT : public RGWSetTempUrl_ObjStore { -public: - RGWSetTempUrl_ObjStore_SWIFT() {} - ~RGWSetTempUrl_ObjStore_SWIFT() {} - - int get_params(); - void send_response(); -}; - class RGWDeleteObj_ObjStore_SWIFT : public RGWDeleteObj_ObjStore { public: RGWDeleteObj_ObjStore_SWIFT() {}