]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/acl/s3: write_policy_xml() as free function
authorCasey Bodley <cbodley@redhat.com>
Fri, 17 Nov 2023 20:31:17 +0000 (15:31 -0500)
committerCasey Bodley <cbodley@redhat.com>
Thu, 30 Nov 2023 16:09:34 +0000 (11:09 -0500)
Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/rgw/driver/rados/rgw_bucket.cc
src/rgw/rgw_acl.h
src/rgw/rgw_acl_s3.cc
src/rgw/rgw_acl_s3.h
src/rgw/rgw_op.cc
src/rgw/rgw_rest_s3.cc

index 002485c672ff088ef000fc09faa0fa12f85c8679..6cbcbeae9a2b030c4f0e16a9b583a146e98044e1 100644 (file)
@@ -978,7 +978,7 @@ int RGWBucketAdminOp::dump_s3_policy(rgw::sal::Driver* driver, RGWBucketAdminOpS
   if (ret < 0)
     return ret;
 
-  policy.to_xml(dpp, os);
+  rgw::s3::write_policy_xml(policy, os);
 
   return 0;
 }
index f60295d90ab4ce155a188d1bb7b5b9fa93d15b5a..c69ee88404e3a0531cc25d0774a629753093fdf3 100644 (file)
@@ -27,6 +27,8 @@ protected:
   ACLGroupTypeEnum group;
   std::string url_spec;
 
+  friend void to_xml(const ACLGrant& grant, std::ostream& out);
+
 public:
   ACLGrant() : group(ACL_GROUP_NONE) {}
   virtual ~ACLGrant() {}
index f2150dda79bd74547b5cd57f8ea3a206dd998f1e..f663e38309219e973fa232fbca25aa9bc728f620 100644 (file)
@@ -25,8 +25,9 @@ using namespace std;
 static string rgw_uri_all_users = RGW_URI_ALL_USERS;
 static string rgw_uri_auth_users = RGW_URI_AUTH_USERS;
 
-void ACLPermission_S3::to_xml(ostream& out)
+void to_xml(ACLPermission perm, std::ostream& out)
 {
+  const uint32_t flags = perm.get_permissions();
   if ((flags & RGW_PERM_FULL_CONTROL) == RGW_PERM_FULL_CONTROL) {
    out << "<Permission>FULL_CONTROL</Permission>";
   } else {
@@ -143,14 +144,15 @@ bool ACLOwner_S3::xml_end(const char *el) {
   return true;
 }
 
-void  ACLOwner_S3::to_xml(ostream& out) {
+void to_xml(const ACLOwner& o, std::ostream& out)
+{
   string s;
-  id.to_str(s);
+  o.id.to_str(s);
   if (s.empty())
     return;
   out << "<Owner>" << "<ID>" << s << "</ID>";
-  if (!display_name.empty())
-    out << "<DisplayName>" << display_name << "</DisplayName>";
+  if (!o.display_name.empty())
+    out << "<DisplayName>" << o.display_name << "</DisplayName>";
   out << "</Owner>";
 }
 
@@ -211,8 +213,9 @@ bool ACLGrant_S3::xml_end(const char *el) {
   return true;
 }
 
-void ACLGrant_S3::to_xml(const DoutPrefixProvider* dpp, ostream& out) {
-  ACLPermission_S3& perm = static_cast<ACLPermission_S3 &>(permission);
+void to_xml(const ACLGrant& grant, ostream& out)
+{
+  const ACLPermission perm = grant.get_permission();
 
   /* only show s3 compatible permissions */
   if (!(perm.get_permissions() & RGW_PERM_ALL_S3))
@@ -221,20 +224,19 @@ void ACLGrant_S3::to_xml(const DoutPrefixProvider* dpp, ostream& out) {
   string uri;
 
   out << "<Grant>" <<
-         "<Grantee xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"" << ACLGranteeType_S3::to_string(type) << "\">";
-  switch (type.get_type()) {
+         "<Grantee xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"" << ACLGranteeType_S3::to_string(grant.type) << "\">";
+  switch (grant.type.get_type()) {
   case ACL_TYPE_CANON_USER:
-    out << "<ID>" << id << "</ID>";
-    if (name.size()) {
-      out << "<DisplayName>" << name << "</DisplayName>";
+    out << "<ID>" << grant.id << "</ID>";
+    if (grant.name.size()) {
+      out << "<DisplayName>" << grant.name << "</DisplayName>";
     }
     break;
   case ACL_TYPE_EMAIL_USER:
-    out << "<EmailAddress>" << email << "</EmailAddress>";
+    out << "<EmailAddress>" << grant.email << "</EmailAddress>";
     break;
   case ACL_TYPE_GROUP:
-    if (!group_to_uri(group, uri)) {
-      ldpp_dout(dpp, 0) << "ERROR: group_to_uri failed with group=" << (int)group << dendl;
+    if (!ACLGrant_S3::group_to_uri(grant.group, uri)) {
       break;
     }
     out << "<URI>" << uri << "</URI>";
@@ -243,7 +245,7 @@ void ACLGrant_S3::to_xml(const DoutPrefixProvider* dpp, ostream& out) {
     break;
   }
   out << "</Grantee>";
-  perm.to_xml(out);
+  to_xml(perm, out);
   out << "</Grant>";
 }
 
@@ -271,12 +273,11 @@ bool RGWAccessControlList_S3::xml_end(const char *el) {
   return true;
 }
 
-void RGWAccessControlList_S3::to_xml(const DoutPrefixProvider* dpp, ostream& out) {
-  multimap<string, ACLGrant>::iterator iter;
+void to_xml(const RGWAccessControlList& acl, std::ostream& out)
+{
   out << "<AccessControlList>";
-  for (iter = grant_map.begin(); iter != grant_map.end(); ++iter) {
-    ACLGrant_S3& grant = static_cast<ACLGrant_S3 &>(iter->second);
-    grant.to_xml(dpp, out);
+  for (const auto& p : acl.get_grant_map()) {
+    to_xml(p.second, out);
   }
   out << "</AccessControlList>";
 }
@@ -415,12 +416,11 @@ bool RGWAccessControlPolicy_S3::xml_end(const char *el) {
   return true;
 }
 
-void RGWAccessControlPolicy_S3::to_xml(const DoutPrefixProvider* dpp, ostream& out) {
+void to_xml(const RGWAccessControlPolicy& p, std::ostream& out)
+{
   out << "<AccessControlPolicy xmlns=\"" << XMLNS_AWS_S3 << "\">";
-  ACLOwner_S3& _owner = static_cast<ACLOwner_S3 &>(owner);
-  RGWAccessControlList_S3& _acl = static_cast<RGWAccessControlList_S3 &>(acl);
-  _owner.to_xml(out);
-  _acl.to_xml(dpp, out);
+  to_xml(p.get_owner(), out);
+  to_xml(p.get_acl(), out);
   out << "</AccessControlPolicy>";
 }
 
@@ -585,6 +585,12 @@ ACLGroupTypeEnum ACLGrant_S3::uri_to_group(string& uri)
 
 namespace rgw::s3 {
 
+void write_policy_xml(const RGWAccessControlPolicy& policy,
+                      std::ostream& out)
+{
+  to_xml(policy, out);
+}
+
 int create_canned_acl(const ACLOwner& owner,
                       const ACLOwner& bucket_owner,
                       const std::string& canned_acl,
index 9753dd55b70eda9e0cf44204abf1b715b0561f9d..7b8489299715ca15965baa1b6371f59508538da4 100644 (file)
@@ -22,7 +22,6 @@ public:
   virtual ~ACLPermission_S3() override {}
 
   bool xml_end(const char *el) override;
-  void to_xml(std::ostream& out);
 };
 
 class ACLGrantee_S3 : public XMLObj
@@ -41,7 +40,6 @@ public:
   ACLGrant_S3() {}
   virtual ~ACLGrant_S3() override {}
 
-  void to_xml(const DoutPrefixProvider* dpp, std::ostream& out);
   bool xml_end(const char *el) override;
   bool xml_start(const char *el, const char **attr);
 
@@ -53,7 +51,6 @@ class RGWAccessControlList_S3 : public RGWAccessControlList, public XMLObj
 {
 public:
   bool xml_end(const char *el) override;
-  void to_xml(const DoutPrefixProvider* dpp, std::ostream& out);
 };
 
 class ACLOwner_S3 : public ACLOwner, public XMLObj
@@ -63,7 +60,6 @@ public:
   virtual ~ACLOwner_S3() override {}
 
   bool xml_end(const char *el) override;
-  void to_xml(std::ostream& out);
 };
 
 class RGWEnv;
@@ -73,7 +69,6 @@ class RGWAccessControlPolicy_S3 : public RGWAccessControlPolicy, public XMLObj
 public:
   bool xml_end(const char *el) override;
 
-  void to_xml(const DoutPrefixProvider* dpp, std::ostream& out);
   int rebuild(const DoutPrefixProvider *dpp, rgw::sal::Driver* driver, ACLOwner *owner,
              RGWAccessControlPolicy& dest, std::string &err_msg);
 };
@@ -93,6 +88,10 @@ public:
 
 namespace rgw::s3 {
 
+/// Write an AccessControlPolicy xml document for the given policy.
+void write_policy_xml(const RGWAccessControlPolicy& policy,
+                      std::ostream& out);
+
 /// Construct a policy from a s3 canned acl string.
 int create_canned_acl(const ACLOwner& owner,
                       const ACLOwner& bucket_owner,
index cbc13d593f122ee407faf88761fe3382e4af5b64..f822c13932dfa3283397b43c57691d822287518e 100644 (file)
@@ -230,8 +230,7 @@ static int decode_policy(const DoutPrefixProvider *dpp,
   }
   if (cct->_conf->subsys.should_gather<ceph_subsys_rgw, 15>()) {
     ldpp_dout(dpp, 15) << __func__ << " Read AccessControlPolicy";
-    RGWAccessControlPolicy_S3 *s3policy = static_cast<RGWAccessControlPolicy_S3 *>(policy);
-    s3policy->to_xml(dpp, *_dout);
+    rgw::s3::write_policy_xml(*policy, *_dout);
     *_dout << dendl;
   }
   return 0;
@@ -1640,9 +1639,8 @@ int rgw_policy_from_attrset(const DoutPrefixProvider *dpp, CephContext *cct, map
     return -EIO;
   }
   if (cct->_conf->subsys.should_gather<ceph_subsys_rgw, 15>()) {
-    RGWAccessControlPolicy_S3 *s3policy = static_cast<RGWAccessControlPolicy_S3 *>(policy);
     ldpp_dout(dpp, 15) << __func__ << " Read AccessControlPolicy";
-    s3policy->to_xml(dpp, *_dout);
+    rgw::s3::write_policy_xml(*policy, *_dout);
     *_dout << dendl;
   }
   return 0;
@@ -5889,11 +5887,11 @@ void RGWGetACLs::pre_exec()
 void RGWGetACLs::execute(optional_yield y)
 {
   stringstream ss;
-  RGWAccessControlPolicy* const acl = \
-    (!rgw::sal::Object::empty(s->object.get()) ? s->object_acl.get() : s->bucket_acl.get());
-  RGWAccessControlPolicy_S3* const s3policy = \
-    static_cast<RGWAccessControlPolicy_S3*>(acl);
-  s3policy->to_xml(this, ss);
+  if (rgw::sal::Object::empty(s->object.get())) {
+    rgw::s3::write_policy_xml(*s->bucket_acl, ss);
+  } else {
+    rgw::s3::write_policy_xml(*s->object_acl, ss);
+  }
   acls = ss.str();
 }
 
@@ -6080,7 +6078,7 @@ void RGWPutACLs::execute(optional_yield y)
 
   if (s->cct->_conf->subsys.should_gather<ceph_subsys_rgw, 15>()) {
     ldpp_dout(this, 15) << "Old AccessControlPolicy";
-    policy->to_xml(this, *_dout);
+    rgw::s3::write_policy_xml(*policy, *_dout);
     *_dout << dendl;
   }
 
@@ -6090,7 +6088,7 @@ void RGWPutACLs::execute(optional_yield y)
 
   if (s->cct->_conf->subsys.should_gather<ceph_subsys_rgw, 15>()) {
     ldpp_dout(this, 15) << "New AccessControlPolicy:";
-    new_policy.to_xml(this, *_dout);
+    rgw::s3::write_policy_xml(new_policy, *_dout);
     *_dout << dendl;
   }
 
index a5956def0d25fb5e7dc4f97c70c3677026672f6d..73f16e449e9943b991009df6cd04f6ca1b6b6e91 100644 (file)
@@ -3638,7 +3638,7 @@ int RGWPutACLs_ObjStore_S3::get_policy_from_state(rgw::sal::Driver* driver,
   if (r < 0)
     return r;
 
-  s3policy.to_xml(this, ss);
+  rgw::s3::write_policy_xml(s3policy, ss);
 
   return 0;
 }