]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: add support for putting Swift account ACLs.
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Mon, 11 Jan 2016 18:27:21 +0000 (19:27 +0100)
committerRadoslaw Zarzynski <rzarzynski@mirantis.com>
Thu, 2 Jun 2016 13:35:49 +0000 (15:35 +0200)
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rest_swift.cc

index 785c1a8272ac6b7a11ba6fa19592589a800e6c0c..76fd4d2c78543f76c2449ff796f0f53a2acb6d37 100644 (file)
@@ -2951,6 +2951,12 @@ int RGWPutMetadataAccount::init_processing()
     return op_ret;
   }
 
+  if (has_policy) {
+    bufferlist acl_bl;
+    policy.encode(acl_bl);
+    attrs.emplace(RGW_ATTR_ACL, std::move(acl_bl));
+  }
+
   rgw_get_request_metadata(s->cct, s->info, attrs, false);
   prepare_add_del_attrs(orig_attrs, rmattr_names, attrs);
   populate_with_generic_attrs(s, attrs);
index 7bc6f84a21482a1dfeed19eb038662d9cc50971a..4993ef165c67205fde2d31546fb1bec43efbb593 100644 (file)
@@ -754,10 +754,12 @@ protected:
   RGWObjVersionTracker acct_op_tracker;
 
   RGWAccessControlPolicy policy;
+  bool has_policy;
 
 public:
   RGWPutMetadataAccount()
-    : new_quota_extracted(false) {
+    : new_quota_extracted(false),
+      has_policy(false) {
   }
 
   virtual void init(RGWRados *store, struct req_state *s, RGWHandler *h) {
index bfe80f9f3bc3e917a4b275262a94d0e63a211408..b4430783425ff4ff233dcc6b73b358425b258776 100644 (file)
@@ -756,12 +756,47 @@ void RGWPutObj_ObjStore_SWIFT::send_response()
   rgw_flush_formatter_and_reset(s, s->formatter);
 }
 
+static int get_swift_account_settings(req_state * const s,
+                                      RGWRados * const store,
+                                      RGWAccessControlPolicy_SWIFTAcct * const policy,
+                                      bool * const has_policy)
+{
+  *has_policy = false;
+
+  const char * const acl_attr = s->info.env->get("HTTP_X_ACCOUNT_ACCESS_CONTROL");
+  if (acl_attr) {
+    RGWAccessControlPolicy_SWIFTAcct swift_acct_policy(s->cct);
+    int r = swift_acct_policy.create(store,
+                                     s->user->user_id,
+                                     s->user->display_name,
+                                     string(acl_attr));
+    if (r < 0) {
+      return r;
+    }
+
+    *policy = swift_acct_policy;
+    *has_policy = true;
+  }
+
+  return 0;
+}
+
 int RGWPutMetadataAccount_ObjStore_SWIFT::get_params()
 {
   if (s->has_bad_meta) {
     return -EINVAL;
   }
 
+  int ret = get_swift_account_settings(s,
+                                       store,
+                                       // FIXME: we need to carry unique_ptr in generic class
+                                       // and allocate appropriate ACL class in the ctor
+                                       static_cast<RGWAccessControlPolicy_SWIFTAcct *>(&policy),
+                                       &has_policy);
+  if (ret < 0) {
+    return ret;
+  }
+
   get_rmattrs_from_headers(s, ACCT_PUT_ATTR_PREFIX, ACCT_REMOVE_ATTR_PREFIX,
                           rmattr_names);
   return 0;