From: Radoslaw Zarzynski Date: Wed, 7 Jun 2017 10:42:17 +0000 (+0200) Subject: rgw: handle the Boto2 compatibility of AWSv4 in an abstract way. X-Git-Tag: v12.1.0~155^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2417b6400727dc024094ce9b100f40518f34877b;p=ceph.git rgw: handle the Boto2 compatibility of AWSv4 in an abstract way. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/rgw/rgw_auth_registry.h b/src/rgw/rgw_auth_registry.h index 1d0582cca92d..2b918f4fc3d2 100644 --- a/src/rgw/rgw_auth_registry.h +++ b/src/rgw/rgw_auth_registry.h @@ -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 - using s3_strategy_t = rgw::auth::s3::AWSAuthStrategy; + template + using s3_strategy_t = rgw::auth::s3::AWSAuthStrategy; + + struct s3_main_strategy_t : public Strategy { + using s3_main_strategy_plain_t = \ + s3_strategy_t; + using s3_main_strategy_boto2_t = \ + s3_strategy_t; + + 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; using s3_post_strategy_t = \ s3_strategy_t; - - 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; } diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 84a800daf771..1cca4cc83713 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -3503,6 +3503,16 @@ AWSGeneralAbstractor::get_auth_data(const req_state* const s) const } } +boost::optional +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 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 +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 + get_v4_canonical_headers(const req_info& info, + const boost::string_view& signedheaders, + const bool using_qs) const; + std::tuple + 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) {