/* 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;
swift_strategy(cct, store) {
}
-public:
const s3_main_strategy_t& get_s3_main() const {
return s3_main_strategy;
}
}
}
+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,
/* 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;
}
+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,
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,
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) {