From 32dc5d882da41f4d4a79ee0d5ccceeba3640a3fb Mon Sep 17 00:00:00 2001 From: Marcus Watts Date: Fri, 17 Dec 2021 23:09:56 -0500 Subject: [PATCH] rgw/sse-s3: save sse attributes in req_state->crypt_attribute_map req_state->crypt_attribute_map to save sse-s3 cryptographic attributes this is not quite a duplicate of x_meta_map because I think some of of its uses conflict with sse-s3. (for instance, bucketencryption vs. signatures) Signed-off-by: Marcus Watts --- src/rgw/rgw_common.cc | 33 +++++++++++++++++++++++++++++++++ src/rgw/rgw_common.h | 10 ++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index 5e30c14f3cc55..5b5a1a60530ed 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -393,6 +393,7 @@ struct str_len meta_prefixes[] = { STR_LEN_ENTRY("HTTP_X_AMZ"), void req_info::init_meta_info(const DoutPrefixProvider *dpp, bool *found_bad_meta) { x_meta_map.clear(); + crypt_attribute_map.clear(); for (const auto& kv: env->get_map()) { const char *prefix; @@ -432,6 +433,9 @@ void req_info::init_meta_info(const DoutPrefixProvider *dpp, bool *found_bad_met } else { x_meta_map[name_low] = val; } + if (strncmp(name_low, "x-amz-server-side-encryption", 20) == 0) { + crypt_attribute_map[name_low] = val; + } } } } @@ -463,6 +467,35 @@ void rgw_add_amz_meta_header( } } +bool rgw_set_amz_meta_header( + meta_map_t& x_meta_map, + const std::string& k, + const std::string& v, + rgw_set_action_if_set a) +{ + auto it { x_meta_map.find(k) }; + bool r { it != x_meta_map.end() }; + switch(a) { + default: + ceph_assert(a == 0); + case DISCARD: + break; + case APPEND: + if (r) { + std::string old { it->second }; + boost::algorithm::trim_right(old); + old.append(","); + old.append(v); + x_meta_map[k] = old; + break; + } + /* fall through */ + case OVERWRITE: + x_meta_map[k] = v; + } + return r; +} + string rgw_string_unquote(const string& s) { if (s[0] != '"' || s.size() < 2) diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index ddb455f041cf9..a532fde1d1767 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -1225,6 +1225,7 @@ struct req_info { const RGWEnv *env; RGWHTTPArgs args; meta_map_t x_meta_map; + meta_map_t crypt_attribute_map; std::string host; const char *method; @@ -2055,6 +2056,15 @@ void rgw_add_amz_meta_header( const std::string& k, const std::string& v); +enum rgw_set_action_if_set { + DISCARD=0, OVERWRITE, APPEND +}; + +bool rgw_set_amz_meta_header( + meta_map_t& x_meta_map, + const std::string& k, + const std::string& v, rgw_set_action_if_set f); + extern std::string rgw_string_unquote(const std::string& s); extern void parse_csv_string(const std::string& ival, std::vector& ovals); extern int parse_key_value(std::string& in_str, std::string& key, std::string& val); -- 2.39.5