]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/rgw/rgw_rest_user_policy.cc
import ceph quincy 17.2.4
[ceph.git] / ceph / src / rgw / rgw_rest_user_policy.cc
index 7c8429bdcb284ebaff7533ed63b7113efc44dbd7..f6c7d2314dc09fb4f013cf340fd6eb8cd8c3c553 100644 (file)
 #include "rgw_op.h"
 #include "rgw_rest.h"
 #include "rgw_rest_user_policy.h"
-#include "rgw_sal_rados.h"
+#include "rgw_sal.h"
 #include "services/svc_zone.h"
 
 #define dout_subsys ceph_subsys_rgw
 
+using namespace std;
 using rgw::IAM::Policy;
 
 void RGWRestUserPolicy::dump(Formatter *f) const
 {
-  encode_json("Policyname", policy_name , f);
-  encode_json("Username", user_name , f);
-  encode_json("Policydocument", policy, f);
+  encode_json("PolicyName", policy_name , f);
+  encode_json("UserName", user_name , f);
+  encode_json("PolicyDocument", policy, f);
 }
 
 void RGWRestUserPolicy::send_response()
@@ -62,13 +63,13 @@ int RGWRestUserPolicy::verify_permission(optional_yield y)
 bool RGWRestUserPolicy::validate_input()
 {
   if (policy_name.length() > MAX_POLICY_NAME_LEN) {
-    ldout(s->cct, 0) << "ERROR: Invalid policy name length " << dendl;
+    ldpp_dout(this, 0) << "ERROR: Invalid policy name length " << dendl;
     return false;
   }
 
   std::regex regex_policy_name("[A-Za-z0-9:=,.@-]+");
   if (! std::regex_match(policy_name, regex_policy_name)) {
-    ldout(s->cct, 0) << "ERROR: Invalid chars in policy name " << dendl;
+    ldpp_dout(this, 0) << "ERROR: Invalid chars in policy name " << dendl;
     return false;
   }
 
@@ -97,7 +98,7 @@ int RGWPutUserPolicy::get_params()
   policy = url_decode(s->info.args.get("PolicyDocument"), true);
 
   if (policy_name.empty() || user_name.empty() || policy.empty()) {
-    ldout(s->cct, 20) << "ERROR: one of policy name, user name or policy document is empty"
+    ldpp_dout(this, 20) << "ERROR: one of policy name, user name or policy document is empty"
     << dendl;
     return -EINVAL;
   }
@@ -118,23 +119,22 @@ void RGWPutUserPolicy::execute(optional_yield y)
 
   bufferlist bl = bufferlist::static_from_string(policy);
 
-  RGWUserInfo info;
-  rgw_user user_id(user_name);
-  op_ret = store->ctl()->user->get_info_by_uid(user_id, &info, s->yield);
+  std::unique_ptr<rgw::sal::User> user = store->get_user(rgw_user(user_name));
+
+  op_ret = user->load_user(s, s->yield);
   if (op_ret < 0) {
     op_ret = -ERR_NO_SUCH_ENTITY;
     return;
   }
 
-  map<string, bufferlist> uattrs;
-  op_ret = store->ctl()->user->get_attrs_by_uid(user_id, &uattrs, s->yield);
+  op_ret = user->read_attrs(s, s->yield);
   if (op_ret == -ENOENT) {
     op_ret = -ERR_NO_SUCH_ENTITY;
     return;
   }
 
   ceph::bufferlist in_data;
-  op_ret = store->forward_request_to_master(s->user.get(), nullptr, in_data, nullptr, s->info, y);
+  op_ret = store->forward_request_to_master(this, s->user.get(), nullptr, in_data, nullptr, s->info, y);
   if (op_ret < 0) {
     ldpp_dout(this, 0) << "ERROR: forward_request_to_master returned ret=" << op_ret << dendl;
     return;
@@ -143,25 +143,21 @@ void RGWPutUserPolicy::execute(optional_yield y)
   try {
     const Policy p(s->cct, s->user->get_tenant(), bl);
     map<string, string> policies;
-    if (auto it = uattrs.find(RGW_ATTR_USER_POLICY); it != uattrs.end()) {
-      bufferlist out_bl = uattrs[RGW_ATTR_USER_POLICY];
+    if (auto it = user->get_attrs().find(RGW_ATTR_USER_POLICY); it != user->get_attrs().end()) {
+      bufferlist out_bl = it->second;
       decode(policies, out_bl);
     }
     bufferlist in_bl;
     policies[policy_name] = policy;
     encode(policies, in_bl);
-    uattrs[RGW_ATTR_USER_POLICY] = in_bl;
+    user->get_attrs()[RGW_ATTR_USER_POLICY] = in_bl;
 
-    RGWObjVersionTracker objv_tracker;
-    op_ret = store->ctl()->user->store_info(info, s->yield,
-                                         RGWUserCtl::PutParams()
-                                         .set_objv_tracker(&objv_tracker)
-                                         .set_attrs(&uattrs));
+    op_ret = user->store_user(s, s->yield, false);
     if (op_ret < 0) {
       op_ret = -ERR_INTERNAL_ERROR;
     }
   } catch (rgw::IAM::PolicyParseException& e) {
-    ldout(s->cct, 20) << "failed to parse policy: " << e.what() << dendl;
+    ldpp_dout(this, 20) << "failed to parse policy: " << e.what() << dendl;
     op_ret = -ERR_MALFORMED_DOC;
   }
 
@@ -185,7 +181,7 @@ int RGWGetUserPolicy::get_params()
   user_name = s->info.args.get("UserName");
 
   if (policy_name.empty() || user_name.empty()) {
-    ldout(s->cct, 20) << "ERROR: one of policy name or user name is empty"
+    ldpp_dout(this, 20) << "ERROR: one of policy name or user name is empty"
     << dendl;
     return -EINVAL;
   }
@@ -200,11 +196,10 @@ void RGWGetUserPolicy::execute(optional_yield y)
     return;
   }
 
-  rgw_user user_id(user_name);
-  map<string, bufferlist> uattrs;
-  op_ret = store->ctl()->user->get_attrs_by_uid(user_id, &uattrs, s->yield);
+  std::unique_ptr<rgw::sal::User> user = store->get_user(rgw_user(user_name));
+  op_ret = user->read_attrs(s, s->yield);
   if (op_ret == -ENOENT) {
-    ldout(s->cct, 0) << "ERROR: attrs not found for user" << user_name << dendl;
+    ldpp_dout(this, 0) << "ERROR: attrs not found for user" << user_name << dendl;
     op_ret = -ERR_NO_SUCH_ENTITY;
     return;
   }
@@ -216,19 +211,19 @@ void RGWGetUserPolicy::execute(optional_yield y)
     s->formatter->close_section();
     s->formatter->open_object_section("GetUserPolicyResult");
     map<string, string> policies;
-    if (auto it = uattrs.find(RGW_ATTR_USER_POLICY); it != uattrs.end()) {
-      bufferlist bl = uattrs[RGW_ATTR_USER_POLICY];
+    if (auto it = user->get_attrs().find(RGW_ATTR_USER_POLICY); it != user->get_attrs().end()) {
+      bufferlist bl = it->second;
       decode(policies, bl);
       if (auto it = policies.find(policy_name); it != policies.end()) {
         policy = policies[policy_name];
         dump(s->formatter);
       } else {
-        ldout(s->cct, 0) << "ERROR: policy not found" << policy << dendl;
+        ldpp_dout(this, 0) << "ERROR: policy not found" << policy << dendl;
         op_ret = -ERR_NO_SUCH_ENTITY;
         return;
       }
     } else {
-      ldout(s->cct, 0) << "ERROR: RGW_ATTR_USER_POLICY not found" << dendl;
+      ldpp_dout(this, 0) << "ERROR: RGW_ATTR_USER_POLICY not found" << dendl;
       op_ret = -ERR_NO_SUCH_ENTITY;
       return;
     }
@@ -250,7 +245,7 @@ int RGWListUserPolicies::get_params()
   user_name = s->info.args.get("UserName");
 
   if (user_name.empty()) {
-    ldout(s->cct, 20) << "ERROR: user name is empty" << dendl;
+    ldpp_dout(this, 20) << "ERROR: user name is empty" << dendl;
     return -EINVAL;
   }
 
@@ -264,34 +259,39 @@ void RGWListUserPolicies::execute(optional_yield y)
     return;
   }
 
-  rgw_user user_id(user_name);
-  map<string, bufferlist> uattrs;
-  op_ret = store->ctl()->user->get_attrs_by_uid(user_id, &uattrs, s->yield);
+  std::unique_ptr<rgw::sal::User> user = store->get_user(rgw_user(user_name));
+  op_ret = user->read_attrs(s, s->yield);
   if (op_ret == -ENOENT) {
-    ldout(s->cct, 0) << "ERROR: attrs not found for user" << user_name << dendl;
+    ldpp_dout(this, 0) << "ERROR: attrs not found for user" << user_name << dendl;
     op_ret = -ERR_NO_SUCH_ENTITY;
     return;
   }
 
   if (op_ret == 0) {
     map<string, string> policies;
-    if (auto it = uattrs.find(RGW_ATTR_USER_POLICY); it != uattrs.end()) {
+    if (auto it = user->get_attrs().find(RGW_ATTR_USER_POLICY); it != user->get_attrs().end()) {
       s->formatter->open_object_section("ListUserPoliciesResponse");
       s->formatter->open_object_section("ResponseMetadata");
       s->formatter->dump_string("RequestId", s->trans_id);
       s->formatter->close_section();
       s->formatter->open_object_section("ListUserPoliciesResult");
-      bufferlist bl = uattrs[RGW_ATTR_USER_POLICY];
-      decode(policies, bl);
+      bufferlist bl = it->second;
+      try {
+        decode(policies, bl);
+      } catch (buffer::error& err) {
+        ldpp_dout(this, 0) << "ERROR: failed to decode user policies" << dendl;
+        op_ret = -EIO;
+        return;
+      }
+      s->formatter->open_object_section("PolicyNames");
       for (const auto& p : policies) {
-        s->formatter->open_object_section("PolicyNames");
         s->formatter->dump_string("member", p.first);
-        s->formatter->close_section();
       }
       s->formatter->close_section();
       s->formatter->close_section();
+      s->formatter->close_section();
     } else {
-      ldout(s->cct, 0) << "ERROR: RGW_ATTR_USER_POLICY not found" << dendl;
+      ldpp_dout(this, 0) << "ERROR: RGW_ATTR_USER_POLICY not found" << dendl;
       op_ret = -ERR_NO_SUCH_ENTITY;
       return;
     }
@@ -312,7 +312,7 @@ int RGWDeleteUserPolicy::get_params()
   user_name = s->info.args.get("UserName");
 
   if (policy_name.empty() || user_name.empty()) {
-    ldout(s->cct, 20) << "ERROR: One of policy name or user name is empty"<< dendl;
+    ldpp_dout(this, 20) << "ERROR: One of policy name or user name is empty"<< dendl;
     return -EINVAL;
   }
 
@@ -326,19 +326,21 @@ void RGWDeleteUserPolicy::execute(optional_yield y)
     return;
   }
 
-  RGWUserInfo info;
-  map<string, bufferlist> uattrs;
-  rgw_user user_id(user_name);
-  op_ret = store->ctl()->user->get_info_by_uid(user_id, &info, s->yield,
-                                            RGWUserCtl::GetParams()
-                                            .set_attrs(&uattrs));
+  std::unique_ptr<rgw::sal::User> user = store->get_user(rgw_user(user_name));
+  op_ret = user->load_user(s, s->yield);
   if (op_ret < 0) {
     op_ret = -ERR_NO_SUCH_ENTITY;
     return;
   }
 
+  op_ret = user->read_attrs(this, s->yield);
+  if (op_ret == -ENOENT) {
+    op_ret = -ERR_NO_SUCH_ENTITY;
+    return;
+  }
+
   ceph::bufferlist in_data;
-  op_ret = store->forward_request_to_master(s->user.get(), nullptr, in_data, nullptr, s->info, y);
+  op_ret = store->forward_request_to_master(this, s->user.get(), nullptr, in_data, nullptr, s->info, y);
   if (op_ret < 0) {
     // a policy might've been uploaded to this site when there was no sync
     // req. in earlier releases, proceed deletion
@@ -350,22 +352,17 @@ void RGWDeleteUserPolicy::execute(optional_yield y)
   }
 
   map<string, string> policies;
-  if (auto it = uattrs.find(RGW_ATTR_USER_POLICY); it != uattrs.end()) {
-    bufferlist out_bl = uattrs[RGW_ATTR_USER_POLICY];
+  if (auto it = user->get_attrs().find(RGW_ATTR_USER_POLICY); it != user->get_attrs().end()) {
+    bufferlist out_bl = it->second;
     decode(policies, out_bl);
 
     if (auto p = policies.find(policy_name); p != policies.end()) {
       bufferlist in_bl;
       policies.erase(p);
       encode(policies, in_bl);
-      uattrs[RGW_ATTR_USER_POLICY] = in_bl;
-
-      RGWObjVersionTracker objv_tracker;
-      op_ret = store->ctl()->user->store_info(info, s->yield,
-                                           RGWUserCtl::PutParams()
-                                           .set_old_info(&info)
-                                           .set_objv_tracker(&objv_tracker)
-                                           .set_attrs(&uattrs));
+      user->get_attrs()[RGW_ATTR_USER_POLICY] = in_bl;
+
+      op_ret = user->store_user(s, s->yield, false);
       if (op_ret < 0) {
         op_ret = -ERR_INTERNAL_ERROR;
       }