]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: handle the Boto2 compatibility of AWSv4 in an abstract way. 14885/head
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Wed, 7 Jun 2017 10:42:17 +0000 (12:42 +0200)
committerRadoslaw Zarzynski <rzarzynski@mirantis.com>
Wed, 7 Jun 2017 10:48:47 +0000 (12:48 +0200)
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
src/rgw/rgw_auth_registry.h
src/rgw/rgw_rest_s3.cc
src/rgw/rgw_rest_s3.h

index 1d0582cca92d55a43fecfb39cacfac5bc342a24c..2b918f4fc3d208503809c9d091ffd439b03945d3 100644 (file)
@@ -21,15 +21,32 @@ namespace auth {
 /* A class aggregating the knowledge about all Strategies in RadosGW. It is
  * responsible for handling the dynamic reconfiguration on e.g. realm update. */
 class StrategyRegistry {
-  template <class ExtractorT>
-  using s3_strategy_t = rgw::auth::s3::AWSAuthStrategy<ExtractorT>;
+  template <class AbstractorT>
+  using s3_strategy_t = rgw::auth::s3::AWSAuthStrategy<AbstractorT>;
+
+  struct s3_main_strategy_t : public Strategy {
+    using s3_main_strategy_plain_t = \
+      s3_strategy_t<rgw::auth::s3::AWSGeneralAbstractor>;
+    using s3_main_strategy_boto2_t = \
+      s3_strategy_t<rgw::auth::s3::AWSGeneralBoto2Abstractor>;
+
+    s3_main_strategy_plain_t s3_main_strategy_plain;
+    s3_main_strategy_boto2_t s3_main_strategy_boto2;
+
+    s3_main_strategy_t(CephContext* const cct, RGWRados* const store)
+      : s3_main_strategy_plain(cct, store),
+        s3_main_strategy_boto2(cct, store) {
+      add_engine(Strategy::Control::SUFFICIENT, s3_main_strategy_plain);
+      add_engine(Strategy::Control::FALLBACK, s3_main_strategy_boto2);
+    }
+
+    const char* get_name() const noexcept override {
+      return "rgw::auth::StrategyRegistry::s3_main_strategy_t";
+    }
+  } s3_main_strategy;
 
-  using s3_main_strategy_t = \
-    s3_strategy_t<rgw::auth::s3::AWSGeneralAbstractor>;
   using s3_post_strategy_t = \
     s3_strategy_t<rgw::auth::s3::AWSBrowserUploadAbstractor>;
-
-  s3_main_strategy_t s3_main_strategy;
   s3_post_strategy_t s3_post_strategy;
 
   rgw::auth::swift::DefaultStrategy swift_strategy;
@@ -42,7 +59,6 @@ public:
       swift_strategy(cct, store) {
   }
 
-public:
   const s3_main_strategy_t& get_s3_main() const {
     return s3_main_strategy;
   }
index 84a800daf7710223469d4a96605e51756ca07b15..1cca4cc83713ed387a82d8f253b6bf9204aa8fe0 100644 (file)
@@ -3503,6 +3503,16 @@ AWSGeneralAbstractor::get_auth_data(const req_state* const s) const
   }
 }
 
+boost::optional<std::string>
+AWSGeneralAbstractor::get_v4_canonical_headers(
+  const req_info& info,
+  const boost::string_view& signedheaders,
+  const bool using_qs) const
+{
+  return rgw::auth::s3::get_v4_canonical_headers(info, signedheaders,
+                                                 using_qs, false);
+}
+
 std::tuple<AWSVerAbstractor::access_key_id_t,
            AWSVerAbstractor::client_signature_t,
            AWSVerAbstractor::string_to_sign_t,
@@ -3532,8 +3542,7 @@ AWSGeneralAbstractor::get_auth_data_v4(const req_state* const s,
 
   /* craft canonical headers */
   boost::optional<std::string> canonical_headers = \
-    rgw::auth::s3::get_v4_canonical_headers(s->info, signed_hdrs, using_qs,
-                                            true /* FIXME: force_boto2_compat*/);
+    get_v4_canonical_headers(s->info, signed_hdrs, using_qs);
   if (canonical_headers) {
     ldout(s->cct, 10) << "canonical headers format = " << *canonical_headers
                       << dendl;
@@ -3673,6 +3682,17 @@ AWSGeneralAbstractor::get_auth_data_v4(const req_state* const s,
 }
 
 
+boost::optional<std::string>
+AWSGeneralBoto2Abstractor::get_v4_canonical_headers(
+  const req_info& info,
+  const boost::string_view& signedheaders,
+  const bool using_qs) const
+{
+  return rgw::auth::s3::get_v4_canonical_headers(info, signedheaders,
+                                                 using_qs, true);
+}
+
+
 std::tuple<AWSVerAbstractor::access_key_id_t,
            AWSVerAbstractor::client_signature_t,
            AWSVerAbstractor::string_to_sign_t,
index 6586f25b5986ac4ce0a673a918bfe191060fefb5..65d1b36ad1531139d3b5eb70c55f8a5b509c4e0b 100644 (file)
@@ -740,6 +740,11 @@ class AWSGeneralAbstractor : public AWSEngine::VersionAbstractor {
   bool is_time_skew_ok(const utime_t& header_time,
                        const bool qsr) const;
 
+  virtual boost::optional<std::string>
+  get_v4_canonical_headers(const req_info& info,
+                           const boost::string_view& signedheaders,
+                           const bool using_qs) const;
+
   std::tuple<access_key_id_t,
              client_signature_t,
              string_to_sign_t,
@@ -767,6 +772,15 @@ public:
   get_auth_data(const req_state* s) const override;
 };
 
+class AWSGeneralBoto2Abstractor : public AWSGeneralAbstractor {
+  boost::optional<std::string>
+  get_v4_canonical_headers(const req_info& info,
+                           const boost::string_view& signedheaders,
+                           const bool using_qs) const override;
+
+public:
+  using AWSGeneralAbstractor::AWSGeneralAbstractor;
+};
 
 class AWSBrowserUploadAbstractor : public AWSEngine::VersionAbstractor {
   static std::string to_string(ceph::bufferlist bl) {