}
}
+int RGWPutMetadataAccount::handle_temp_url_update(const map<int, string>& temp_url_keys) {
+ RGWUserAdminOpState user_op;
+ user_op.set_user_id(s->user.user_id);
+
+ map<int, string>::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)) {
return 0;
}
+void RGWPutMetadataAccount::filter_out_temp_url(map<string, bufferlist>& add_attrs,
+ const set<string>& rmattr_names,
+ map<int, string>& temp_url_keys)
+{
+ map<string, bufferlist>::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<string>::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;
prepare_add_del_attrs(orig_attrs, rmattr_names, attrs, rmattrs);
populate_with_generic_attrs(s, attrs);
+ /* Handle the TempURL-related stuff. */
+ map<int, string> 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()
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<int, string>::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))
virtual int get_params() = 0;
virtual void send_response() = 0;
+ virtual void filter_out_temp_url(map<string, bufferlist>& add_attrs,
+ const set<string>& rmattr_names,
+ map<int, string>& temp_url_keys);
+ virtual int handle_temp_url_update(const map<int, string>& 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; }
virtual uint32_t op_mask() { return RGW_OP_TYPE_WRITE; }
};
-class RGWSetTempUrl : public RGWOp {
-protected:
- int ret;
- map<int, string> 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;
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;
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;
}