CRM_Utils_JS - Fix backslash handling
authorColeman Watts <coleman@civicrm.org>
Fri, 13 Sep 2019 01:58:23 +0000 (21:58 -0400)
committerColeman Watts <coleman@civicrm.org>
Fri, 13 Sep 2019 01:58:23 +0000 (21:58 -0400)
CRM/Utils/JS.php
tests/phpunit/CRM/Utils/JSTest.php

index d7854bcb58f3793a0c37f0ecdead03c4c394a5f2..5110ac188fea73865faf034a75990dc29749442d 100644 (file)
@@ -147,7 +147,8 @@ class CRM_Utils_JS {
     $last = substr($js, -1);
     if ($last === $first && ($first === "'" || $first === '"')) {
       // Use a temp placeholder for escaped backslashes
-      return str_replace(['\\\\', "\\'", '\\"', '\\&', '\\/', '**backslash**'], ['**backslash**', "'", '"', '&', '/', '\\'], substr($js, 1, -1));
+      $backslash = chr(0) . 'backslash' . chr(0);
+      return str_replace(['\\\\', "\\'", '\\"', '\\&', '\\/', $backslash], [$backslash, "'", '"', '&', '/', '\\'], substr($js, 1, -1));
     }
     if (($first === '{' && $last === '}') || ($first === '[' && $last === ']')) {
       $obj = self::getRawProps($js);
@@ -182,7 +183,8 @@ class CRM_Utils_JS {
     $result = json_encode($value, JSON_UNESCAPED_SLASHES);
     // Convert double-quotes around string to single quotes
     if (is_string($value) && substr($result, 0, 1) === '"' && substr($result, -1) === '"') {
-      return "'" . str_replace(['\\\\', '\\"', "'", '**backslash**'], ['**backslash**', '"', "\\'", '\\'], substr($result, 1, -1)) . "'";
+      $backslash = chr(0) . 'backslash' . chr(0);
+      return "'" . str_replace(['\\\\', '\\"', "'", $backslash], [$backslash, '"', "\\'", '\\\\'], substr($result, 1, -1)) . "'";
     }
     return $result;
   }
index 42ca9e20e99dc613804a7fa7e711cef57bd0ca0d..b1f064c4e3178540425bbb300bcc416a8559c1e9 100644 (file)
@@ -244,8 +244,8 @@ class CRM_Utils_JSTest extends CiviUnitTestCase {
         "{a: 'Apple', b: 'Banana', c: [0, -2, 3.15]}",
       ],
       [
-        ['a' => ['foo', 'bar'], 'b' => ["'a'" => ['foo/bar&', 'bar(foo)'], 'b' => ['a' => ["fo'oo", '"bar"'], 'b' => []]]],
-        "{a: ['foo', 'bar'], b: {\"'a'\": ['foo/bar&', 'bar(foo)'], b: {a: ['fo\\'oo', '\"bar\"'], b: {}}}}",
+        ['a' => ['foo', 'bar'], 'b' => ["'a'" => ['foo/bar&', 'bar(foo)'], 'b' => ['a' => ["fo\\\\'oo", '"bar"'], 'b' => []]]],
+        "{a: ['foo', 'bar'], b: {\"'a'\": ['foo/bar&', 'bar(foo)'], b: {a: ['fo\\\\\\\\\\'oo', '\"bar\"'], b: {}}}}",
       ],
       [TRUE, 'true'],
       [' ', "' '"],