You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2022/07/07 17:03:19 UTC

[trafficserver] branch 9.2.x updated (5d182742d -> 281936259)

This is an automated email from the ASF dual-hosted git repository.

zwoop pushed a change to branch 9.2.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


    from 5d182742d Fixed issues when compiling with -Og (#8665)
     new 34a79dcb7 Fixes compacting spaces in S3 auth plugin (#8579)
     new 281936259 trim white spaces before and after the equal sign (#8638)

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 plugins/s3_auth/aws_auth_v4.cc                 | 45 ++++++++------
 plugins/s3_auth/s3_auth.cc                     | 39 ++++++------
 plugins/s3_auth/unit_tests/test_aws_auth_v4.cc | 85 +++++++++++++++++---------
 plugins/s3_auth/unit_tests/test_aws_auth_v4.h  |  2 +-
 4 files changed, 106 insertions(+), 65 deletions(-)


[trafficserver] 02/02: trim white spaces before and after the equal sign (#8638)

Posted by zw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

zwoop pushed a commit to branch 9.2.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git

commit 281936259b0f2e38c15dc9b14a84927111c53df7
Author: Fei Deng <du...@gmail.com>
AuthorDate: Mon Feb 7 18:04:19 2022 -0600

    trim white spaces before and after the equal sign (#8638)
    
    (cherry picked from commit 8c5fb9c0127b909a85cd8e5fafaf619b3e0f00c9)
---
 plugins/s3_auth/aws_auth_v4.cc                 | 43 +++++++++++---------------
 plugins/s3_auth/s3_auth.cc                     | 39 +++++++++++++----------
 plugins/s3_auth/unit_tests/test_aws_auth_v4.cc |  9 +++---
 3 files changed, 44 insertions(+), 47 deletions(-)

diff --git a/plugins/s3_auth/aws_auth_v4.cc b/plugins/s3_auth/aws_auth_v4.cc
index 89ebb07e3..004c0b393 100644
--- a/plugins/s3_auth/aws_auth_v4.cc
+++ b/plugins/s3_auth/aws_auth_v4.cc
@@ -176,39 +176,32 @@ canonicalEncode(const String &in, bool isObjectName)
  * @param inLen input character count
  * @return pointer to the trimmed string.
  */
-std::string
+String
 trimWhiteSpacesAndSqueezeInnerSpaces(const char *in, size_t inLen)
 {
   if (nullptr == in || inLen == 0) {
-    return std::string(in, inLen);
-  }
-
-  const char *first = in;
-  while (size_t(first - in) < inLen && isspace(*first)) {
-    first++;
-  }
-
-  const char *last = in + inLen - 1;
-  while (last > in && isspace(*last)) {
-    last--;
+    return "";
   }
 
-  std::stringstream result;
-  int consecutiveSpaces = 0;
-  while (first <= last) {
-    if (*first == ' ') {
-      consecutiveSpaces++;
-    } else {
-      if (consecutiveSpaces > 0) {
-        result << ' ';
-      }
-      consecutiveSpaces = 0;
-      result << *first;
+  String in_str = trimWhiteSpaces(String(in, inLen));
+  String out_str;
+  out_str.reserve(in_str.size());
+  size_t n    = 0;
+  char prev_c = '\0';
+
+  for (auto &c : in_str) {
+    if (!isspace(c)) {
+      out_str += c;
+      ++n;
+    } else if (isspace(c) && !isspace(prev_c)) {
+      out_str += ' ';
+      ++n;
     }
-    first++;
+    prev_c = c;
   }
+  out_str.resize(n);
 
-  return result.str();
+  return out_str;
 }
 
 /**
diff --git a/plugins/s3_auth/s3_auth.cc b/plugins/s3_auth/s3_auth.cc
index 78129b04a..df5c09077 100644
--- a/plugins/s3_auth/s3_auth.cc
+++ b/plugins/s3_auth/s3_auth.cc
@@ -554,24 +554,29 @@ S3Config::parse_config(const std::string &config_fname)
       }
 
       // Identify the keys (and values if appropriate)
-      if (0 == strncasecmp(pos2, "secret_key=", 11)) {
-        set_secret(pos2 + 11);
-      } else if (0 == strncasecmp(pos2, "access_key=", 11)) {
-        set_keyid(pos2 + 11);
-      } else if (0 == strncasecmp(pos2, "session_token=", 14)) {
-        set_token(pos2 + 14);
-      } else if (0 == strncasecmp(pos2, "version=", 8)) {
-        set_version(pos2 + 8);
-      } else if (0 == strncasecmp(pos2, "virtual_host", 12)) {
+      std::string key_val(pos2, pos1 - pos2 + 1);
+      size_t eq_pos       = key_val.find_first_of("=");
+      std::string key_str = trimWhiteSpaces(key_val.substr(0, eq_pos == String::npos ? key_val.size() : eq_pos));
+      std::string val_str = eq_pos == String::npos ? "" : trimWhiteSpaces(key_val.substr(eq_pos + 1, key_val.size()));
+
+      if (key_str == "secret_key") {
+        set_secret(val_str.c_str());
+      } else if (key_str == "access_key") {
+        set_keyid(val_str.c_str());
+      } else if (key_str == "session_token") {
+        set_token(val_str.c_str());
+      } else if (key_str == "version") {
+        set_version(val_str.c_str());
+      } else if (key_str == "virtual_host") {
         set_virt_host();
-      } else if (0 == strncasecmp(pos2, "v4-include-headers=", 19)) {
-        set_include_headers(pos2 + 19);
-      } else if (0 == strncasecmp(pos2, "v4-exclude-headers=", 19)) {
-        set_exclude_headers(pos2 + 19);
-      } else if (0 == strncasecmp(pos2, "v4-region-map=", 14)) {
-        set_region_map(pos2 + 14);
-      } else if (0 == strncasecmp(pos2, "expiration=", 11)) {
-        set_expiration(pos2 + 11);
+      } else if (key_str == "v4-include-headers") {
+        set_include_headers(val_str.c_str());
+      } else if (key_str == "v4-exclude-headers") {
+        set_exclude_headers(val_str.c_str());
+      } else if (key_str == "v4-region-map") {
+        set_region_map(val_str.c_str());
+      } else if (key_str == "expiration") {
+        set_expiration(val_str.c_str());
       } else {
         // ToDo: warnings?
       }
diff --git a/plugins/s3_auth/unit_tests/test_aws_auth_v4.cc b/plugins/s3_auth/unit_tests/test_aws_auth_v4.cc
index 635dc63e4..b3866ba46 100644
--- a/plugins/s3_auth/unit_tests/test_aws_auth_v4.cc
+++ b/plugins/s3_auth/unit_tests/test_aws_auth_v4.cc
@@ -260,16 +260,15 @@ TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): squeeze middle spaces multipl
   CHECK(inLen - 6 == trimmed.length());
 }
 
-TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): does not squeeze middle whitespaces different from spaces, check string",
-          "[utility]")
+TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): squeeze middle whitespaces, check string", "[utility]")
 {
-  const char in[] = "Very \t\tImportant \t\t\tMessage";
+  const char in[] = "Very \t\nImportant \v\f\rMessage";
   size_t inLen    = strlen(in);
 
   const std::string trimmed = trimWhiteSpacesAndSqueezeInnerSpaces(in, inLen);
 
-  CHECK_FALSE(trimmed.compare("Very \t\tImportant \t\t\tMessage"));
-  CHECK(inLen == trimmed.length());
+  CHECK_FALSE(trimmed.compare("Very Important Message"));
+  CHECK(inLen - 5 == trimmed.length());
 }
 
 TEST_CASE("trimWhiteSpaces(): trim both, check string", "[utility]")


[trafficserver] 01/02: Fixes compacting spaces in S3 auth plugin (#8579)

Posted by zw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

zwoop pushed a commit to branch 9.2.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git

commit 34a79dcb76766c377b0fe4b1bb86e695d154f7aa
Author: Julian Rubin <ru...@gmail.com>
AuthorDate: Tue Jan 11 19:37:57 2022 +0100

    Fixes compacting spaces in S3 auth plugin (#8579)
    
    Co-authored-by: Julian Rubin <ju...@rtbhouse.com>
    (cherry picked from commit ca2a06ef1ef2adac278c143085309ed9c4598dd9)
---
 plugins/s3_auth/aws_auth_v4.cc                 | 36 +++++++----
 plugins/s3_auth/unit_tests/test_aws_auth_v4.cc | 86 +++++++++++++++++---------
 plugins/s3_auth/unit_tests/test_aws_auth_v4.h  |  2 +-
 3 files changed, 84 insertions(+), 40 deletions(-)

diff --git a/plugins/s3_auth/aws_auth_v4.cc b/plugins/s3_auth/aws_auth_v4.cc
index 3f9aea077..89ebb07e3 100644
--- a/plugins/s3_auth/aws_auth_v4.cc
+++ b/plugins/s3_auth/aws_auth_v4.cc
@@ -168,18 +168,19 @@ canonicalEncode(const String &in, bool isObjectName)
 }
 
 /**
- * @brief trim the white-space character from the beginning and the end of the string ("in-place", just moving pointers around)
+ * @brief Trim white spaces from beginning and end. Squeeze consecutive spaces from middle.
+ *
+ * @see AWS spec: https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html
  *
  * @param in ptr to an input string
  * @param inLen input character count
- * @param newLen trimmed string character count.
  * @return pointer to the trimmed string.
  */
-const char *
-trimWhiteSpaces(const char *in, size_t inLen, size_t &newLen)
+std::string
+trimWhiteSpacesAndSqueezeInnerSpaces(const char *in, size_t inLen)
 {
   if (nullptr == in || inLen == 0) {
-    return in;
+    return std::string(in, inLen);
   }
 
   const char *first = in;
@@ -192,8 +193,22 @@ trimWhiteSpaces(const char *in, size_t inLen, size_t &newLen)
     last--;
   }
 
-  newLen = last - first + 1;
-  return first;
+  std::stringstream result;
+  int consecutiveSpaces = 0;
+  while (first <= last) {
+    if (*first == ' ') {
+      consecutiveSpaces++;
+    } else {
+      if (consecutiveSpaces > 0) {
+        result << ' ';
+      }
+      consecutiveSpaces = 0;
+      result << *first;
+    }
+    first++;
+  }
+
+  return result.str();
 }
 
 /**
@@ -381,14 +396,13 @@ getCanonicalRequestSha256Hash(TsInterface &api, bool signPayload, const StringSe
       }
     }
 
-    size_t trimValueLen   = 0;
-    const char *trimValue = trimWhiteSpaces(value, valueLen, trimValueLen);
+    std::string trimValue = trimWhiteSpacesAndSqueezeInnerSpaces(value, valueLen);
 
     signedHeadersSet.insert(lowercaseName);
     if (headersMap.find(lowercaseName) == headersMap.end()) {
-      headersMap[lowercaseName] = String(trimValue, trimValueLen);
+      headersMap[lowercaseName] = trimValue;
     } else {
-      headersMap[lowercaseName].append(",").append(String(trimValue, trimValueLen));
+      headersMap[lowercaseName].append(",").append(trimValue);
     }
   }
 
diff --git a/plugins/s3_auth/unit_tests/test_aws_auth_v4.cc b/plugins/s3_auth/unit_tests/test_aws_auth_v4.cc
index 595fe003e..635dc63e4 100644
--- a/plugins/s3_auth/unit_tests/test_aws_auth_v4.cc
+++ b/plugins/s3_auth/unit_tests/test_aws_auth_v4.cc
@@ -172,74 +172,104 @@ TEST_CASE("base16Encode(): base16 encode RFC4648 test vectors", "[utility]")
 
 /* trimWhiteSpaces() ******************************************************************************************************** */
 
-TEST_CASE("trimWhiteSpaces(): trim invalid arguments, check pointers", "[utility]")
+TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): trim invalid arguments, check string", "[utility]")
 {
   const char *in = nullptr;
   size_t inLen   = 0;
-  size_t outLen  = 0;
 
-  const char *start = trimWhiteSpaces(in, inLen, outLen);
+  const std::string trimmed = trimWhiteSpacesAndSqueezeInnerSpaces(in, inLen);
 
-  CHECK(in == start);
+  CHECK_FALSE(trimmed.compare(""));
+  CHECK(inLen == trimmed.length());
 }
 
-TEST_CASE("trimWhiteSpaces(): trim empty input, check pointers", "[utility]")
+TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): trim empty input, check string", "[utility]")
 {
   const char *in = "";
   size_t inLen   = 0;
-  size_t outLen  = 0;
 
-  const char *start = trimWhiteSpaces(in, inLen, outLen);
+  const std::string trimmed = trimWhiteSpacesAndSqueezeInnerSpaces(in, inLen);
 
-  CHECK(in == start);
+  CHECK_FALSE(trimmed.compare(""));
+  CHECK(inLen == trimmed.length());
 }
 
-TEST_CASE("trimWhiteSpaces(): trim nothing to trim, check pointers", "[utility]")
+TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): trim nothing to trim, check string", "[utility]")
 {
   const char in[] = "Important Message";
   size_t inLen    = strlen(in);
-  size_t newLen   = 0;
 
-  const char *start = trimWhiteSpaces(in, inLen, newLen);
+  const std::string trimmed = trimWhiteSpacesAndSqueezeInnerSpaces(in, inLen);
 
-  CHECK(in == start);
-  CHECK(inLen == newLen);
+  CHECK_FALSE(trimmed.compare("Important Message"));
+  CHECK(inLen == trimmed.length());
 }
 
-TEST_CASE("trimWhiteSpaces(): trim beginning, check pointers", "[utility]")
+TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): trim beginning, check string", "[utility]")
 {
   const char in[] = " \t\nImportant Message";
   size_t inLen    = strlen(in);
-  size_t newLen   = 0;
 
-  const char *start = trimWhiteSpaces(in, inLen, newLen);
+  const std::string trimmed = trimWhiteSpacesAndSqueezeInnerSpaces(in, inLen);
 
-  CHECK(in + 3 == start);
-  CHECK(inLen - 3 == newLen);
+  CHECK_FALSE(trimmed.compare("Important Message"));
+  CHECK(inLen - 3 == trimmed.length());
 }
 
-TEST_CASE("trimWhiteSpaces(): trim end, check pointers", "[utility]")
+TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): trim end, check string", "[utility]")
 {
   const char in[] = "Important Message \t\n";
   size_t inLen    = strlen(in);
-  size_t newLen   = 0;
 
-  const char *start = trimWhiteSpaces(in, inLen, newLen);
+  const std::string trimmed = trimWhiteSpacesAndSqueezeInnerSpaces(in, inLen);
 
-  CHECK(in == start);
-  CHECK(inLen - 3 == newLen);
+  CHECK_FALSE(trimmed.compare("Important Message"));
+  CHECK(inLen - 3 == trimmed.length());
 }
 
-TEST_CASE("trimWhiteSpaces(): trim both ends, check pointers", "[utility]")
+TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): trim both ends, check string", "[utility]")
 {
   const char in[] = "\v\t\n Important Message \t\n";
   size_t inLen    = strlen(in);
-  size_t newLen   = 0;
 
-  const char *start = trimWhiteSpaces(in, inLen, newLen);
+  const std::string trimmed = trimWhiteSpacesAndSqueezeInnerSpaces(in, inLen);
+
+  CHECK_FALSE(trimmed.compare("Important Message"));
+  CHECK(inLen - 7 == trimmed.length());
+}
+
+TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): trim both ends and squeeze middle spaces, check string", "[utility]")
+{
+  const char in[] = "\v\t\n Important     Message \t\n";
+  size_t inLen    = strlen(in);
+
+  const std::string trimmed = trimWhiteSpacesAndSqueezeInnerSpaces(in, inLen);
+
+  CHECK_FALSE(trimmed.compare("Important Message"));
+  CHECK(inLen - 11 == trimmed.length());
+}
+
+TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): squeeze middle spaces multiple groups, check string", "[utility]")
+{
+  const char in[] = "Very   Important     Message";
+  size_t inLen    = strlen(in);
+
+  const std::string trimmed = trimWhiteSpacesAndSqueezeInnerSpaces(in, inLen);
+
+  CHECK_FALSE(trimmed.compare("Very Important Message"));
+  CHECK(inLen - 6 == trimmed.length());
+}
+
+TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): does not squeeze middle whitespaces different from spaces, check string",
+          "[utility]")
+{
+  const char in[] = "Very \t\tImportant \t\t\tMessage";
+  size_t inLen    = strlen(in);
+
+  const std::string trimmed = trimWhiteSpacesAndSqueezeInnerSpaces(in, inLen);
 
-  CHECK(in + 4 == start);
-  CHECK(inLen - 7 == newLen);
+  CHECK_FALSE(trimmed.compare("Very \t\tImportant \t\t\tMessage"));
+  CHECK(inLen == trimmed.length());
 }
 
 TEST_CASE("trimWhiteSpaces(): trim both, check string", "[utility]")
diff --git a/plugins/s3_auth/unit_tests/test_aws_auth_v4.h b/plugins/s3_auth/unit_tests/test_aws_auth_v4.h
index e295d750f..42f415716 100644
--- a/plugins/s3_auth/unit_tests/test_aws_auth_v4.h
+++ b/plugins/s3_auth/unit_tests/test_aws_auth_v4.h
@@ -123,7 +123,7 @@ String base16Encode(const char *in, size_t inLen);
 String uriEncode(const String &in, bool isObjectName = false);
 bool isUriEncoded(const String &in, bool isObjectName = false);
 String lowercase(const char *in, size_t inLen);
-const char *trimWhiteSpaces(const char *in, size_t inLen, size_t &newLen);
+String trimWhiteSpacesAndSqueezeInnerSpaces(const char *in, size_t inLen);
 
 String getCanonicalRequestSha256Hash(TsInterface &api, bool signPayload, const StringSet &includeHeaders,
                                      const StringSet &excludeHeaders, String &signedHeaders);