]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: unify mechanisms for setting TempURL and Swift account metadata.
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Tue, 10 Mar 2015 15:58:23 +0000 (16:58 +0100)
committerRadoslaw Zarzynski <rzarzynski@mirantis.com>
Mon, 20 Apr 2015 16:27:54 +0000 (18:27 +0200)
Fixes: #11037
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
src/rgw/rgw_common.h
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rest.h
src/rgw/rgw_rest_swift.cc
src/rgw/rgw_rest_swift.h

index 0a796c08deaf4bcba2e4d574b650e4fc0cd74163..3b7893e7a9d4ecd90f0c1ee123573cf6321e2a64 100644 (file)
@@ -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"
index f14facc50fb0fccc97b2941e6a3aa0eb5c5441d9..d0939e7b1535a82979c1536de271d92e886a260e 100644 (file)
@@ -2091,6 +2091,31 @@ static void prepare_add_del_attrs(const map<string, bufferlist>& orig_attrs,
   }
 }
 
+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)) {
@@ -2099,6 +2124,37 @@ int RGWPutMetadataAccount::verify_permission()
   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;
@@ -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<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()
@@ -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<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))
index 45e322a5deace706c3488ff86a83bdebda3d067c..8f6a8f9c9bf1d8e083eb494cfc272cb45d453284 100644 (file)
@@ -531,6 +531,10 @@ public:
 
   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; }
@@ -591,22 +595,6 @@ public:
   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;
index 5b707b62abbcf59550ae7357aa6e7358ac0f9b2a..b28486c6e428b6083d2f7b54bece43510b5a50ae 100644 (file)
@@ -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() {}
index 1dc18b4716e1d2cf1d07791e214a28df6e484cce..f9bd512f6d53b08ce7dbd7ca7023d5e282acd553 100644 (file)
@@ -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;
 }
 
index 7fae8d03eb76d11a624d3a686eaaf8d557c88e22..892cde4be77e9dfcc0c53af14f0115b40eab566d 100644 (file)
@@ -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() {}