Browse Source

Merge topic 'productbuild-encode-pkg-url-ref'

7954ba9bc1 productbuild: escape pkg-ref urls
652210e901 cmSystemTools: Add EncodeURL helper

Acked-by: Kitware Robot <[email protected]>
Merge-request: !2681
Brad King 7 years ago
parent
commit
81bea69bd1

+ 2 - 1
Source/CPack/cmCPackPKGGenerator.cxx

@@ -225,7 +225,8 @@ void cmCPackPKGGenerator::CreateChoice(const cmCPackComponent& component,
     xout.Content(this->GetPackageName(component));
     xout.Content(this->GetPackageName(component));
   } else {
   } else {
     xout.Content("file:./");
     xout.Content("file:./");
-    xout.Content(relativePackageLocation);
+    xout.Content(cmSystemTools::EncodeURL(relativePackageLocation,
+                                          /*escapeSlashes=*/false));
   }
   }
   xout.EndElement(); // pkg-ref
   xout.EndElement(); // pkg-ref
 }
 }

+ 1 - 20
Source/CTest/cmCTestSubmitHandler.cxx

@@ -407,26 +407,7 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP(
       *this->LogFile << "\tUpload file: " << local_file << " to "
       *this->LogFile << "\tUpload file: " << local_file << " to "
                      << remote_file << std::endl;
                      << remote_file << std::endl;
 
 
-      std::string ofile;
-      for (char c : remote_file) {
-        char hexCh[4] = { 0, 0, 0, 0 };
-        hexCh[0] = c;
-        switch (c) {
-          case '+':
-          case '?':
-          case '/':
-          case '\\':
-          case '&':
-          case ' ':
-          case '=':
-          case '%':
-            sprintf(hexCh, "%%%02X", static_cast<int>(c));
-            ofile.append(hexCh);
-            break;
-          default:
-            ofile.append(hexCh);
-        }
-      }
+      std::string ofile = cmSystemTools::EncodeURL(remote_file);
       std::string upload_as = url +
       std::string upload_as = url +
         ((url.find('?') == std::string::npos) ? '?' : '&') +
         ((url.find('?') == std::string::npos) ? '?' : '&') +
         "FileName=" + ofile;
         "FileName=" + ofile;

+ 29 - 0
Source/cmSystemTools.cxx

@@ -3009,6 +3009,35 @@ bool cmSystemTools::StringToULong(const char* str, unsigned long* value)
   return (*endp == '\0') && (endp != str) && (errno == 0);
   return (*endp == '\0') && (endp != str) && (errno == 0);
 }
 }
 
 
+std::string cmSystemTools::EncodeURL(std::string const& in, bool escapeSlashes)
+{
+  std::string out;
+  for (char c : in) {
+    char hexCh[4] = { 0, 0, 0, 0 };
+    hexCh[0] = c;
+    switch (c) {
+      case '+':
+      case '?':
+      case '\\':
+      case '&':
+      case ' ':
+      case '=':
+      case '%':
+        sprintf(hexCh, "%%%02X", static_cast<int>(c));
+        break;
+      case '/':
+        if (escapeSlashes) {
+          strcpy(hexCh, "%2F");
+        }
+        break;
+      default:
+        break;
+    }
+    out.append(hexCh);
+  }
+  return out;
+}
+
 bool cmSystemTools::CreateSymlink(const std::string& origName,
 bool cmSystemTools::CreateSymlink(const std::string& origName,
                                   const std::string& newName)
                                   const std::string& newName)
 {
 {

+ 4 - 0
Source/cmSystemTools.h

@@ -495,6 +495,10 @@ public:
   static bool StringToLong(const char* str, long* value);
   static bool StringToLong(const char* str, long* value);
   static bool StringToULong(const char* str, unsigned long* value);
   static bool StringToULong(const char* str, unsigned long* value);
 
 
+  /** Encode a string as a URL.  */
+  static std::string EncodeURL(std::string const& in,
+                               bool escapeSlashes = true);
+
 #ifdef _WIN32
 #ifdef _WIN32
   struct WindowsFileRetry
   struct WindowsFileRetry
   {
   {