]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: replace '+' with "%20" in canonical query string for s3 v4 auth.
authorZhang Shaowen <zhangshaowen@cmss.chinamobile.com>
Tue, 4 Jul 2017 09:18:11 +0000 (17:18 +0800)
committerMarcus Watts <mwatts@redhat.com>
Tue, 15 Aug 2017 04:08:31 +0000 (00:08 -0400)
( note: this patch modified: now replaces "+" with " ".  mwatts@redhat.com )

Fixes: http://tracker.ceph.com/issues/20501
Signed-off-by: Zhang Shaowen <zhangshaowen@cmss.chinamobile.com>
src/rgw/rgw_auth_s3.cc

index 4a64378dd621953aa592fa08ba3ed8e0cdf7f068..e183465b95c2ffec7b1c859a911496881b624339 100644 (file)
@@ -501,15 +501,22 @@ static inline std::string aws4_uri_recode(const boost::string_view& src)
 
 std::string get_v4_canonical_qs(const req_info& info, const bool using_qs)
 {
-  if (info.request_params.empty()) {
+  const std::string *params = &info.request_params;
+  std::string copy_params;
+  if (params->empty()) {
     /* Optimize the typical flow. */
     return std::string();
   }
+  if (params->find_first_of('+') != std::string::npos) {
+    copy_params = *params;
+    boost::replace_all(copy_params, "+", " ");
+    params = &copy_params;
+  }
 
   /* Handle case when query string exists. Step 3 described in: http://docs.
    * aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html */
   std::map<std::string, std::string> canonical_qs_map;
-  for (const auto& s : get_str_vec<5>(info.request_params, "&")) {
+  for (const auto& s : get_str_vec<5>(*params, "&")) {
     boost::string_view key, val;
     const auto parsed_pair = parse_key_value(s);
     if (parsed_pair) {