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

mridulpathak pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 83d8ff9b36 Fixed: Escape the backslash and the braces in the macro 
strings of the menu, tree and form renderers (OFBIZ-13649)
83d8ff9b36 is described below

commit 83d8ff9b36194ca9a8f9be9c8ea7e4cd9dcb9eec
Author: Mridul Pathak <[email protected]>
AuthorDate: Tue Oct 6 19:32:44 2026 +0530

    Fixed: Escape the backslash and the braces in the macro strings of the 
menu, tree and form renderers (OFBIZ-13649)
    
    The macro menu, tree and form renderers escaped only the double quote of 
the values they put inside the string literals of the macro calls they build, 
so a value containing a backslash or an interpolation such as ${...} was 
interpreted by FreeMarker instead of being rendered literally. The macro screen 
renderer already escaped the backslash, the double quote and the opening brace.
    
    - Add MacroCommonRenderer.escapeFtlString, which escapes the backslash, the 
double quote and the opening brace of a value placed in a double-quoted 
FreeMarker string literal.
    - Use it in MacroMenuRenderer.executeMacro, in the imgStr of 
MacroTreeRenderer and in the three places of MacroFormRenderer that used 
encodeDoubleQuotes (which is removed), and in place of the inline escaping of 
MacroScreenRenderer.executeMacro.
    - The values that these renderers append without any escaping are not 
changed here.
---
 .../ofbiz/widget/renderer/macro/MacroCommonRenderer.java      | 11 +++++++++++
 .../apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java | 10 +++-------
 .../apache/ofbiz/widget/renderer/macro/MacroMenuRenderer.java |  2 +-
 .../ofbiz/widget/renderer/macro/MacroScreenRenderer.java      |  2 +-
 .../apache/ofbiz/widget/renderer/macro/MacroTreeRenderer.java |  2 +-
 .../ofbiz/widget/renderer/macro/MacroFormRendererTest.java    |  2 +-
 6 files changed, 18 insertions(+), 11 deletions(-)

diff --git 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroCommonRenderer.java
 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroCommonRenderer.java
index 8be5547151..060fcb1d6a 100644
--- 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroCommonRenderer.java
+++ 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroCommonRenderer.java
@@ -38,6 +38,17 @@ import org.apache.ofbiz.widget.model.ModelForm;
 
 public class MacroCommonRenderer {
 
+    /**
+     * Escape a value so that it is rendered literally when it is placed 
inside a double-quoted FreeMarker
+     * string literal of a macro call: the backslash and the double quote are 
escaped, and so is the opening
+     * brace, so that neither <code>${...}</code> nor <code>#{...}</code> is 
interpolated.
+     * @param value the value to escape, may be null
+     * @return the escaped value, or an empty string if the value is null
+     */
+    public static String escapeFtlString(String value) {
+        return value == null ? "" : value.replace("\\", "\\\\").replace("\"", 
"\\\"").replace("{", "\\{");
+    }
+
     /**
      * Create an ajaxXxxx JavaScript CSV string from a list of UpdateArea 
objects. See
      * <code>OfbizUtil.js</code>.
diff --git 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java
 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java
index 87994dd20b..cc28442ca6 100644
--- 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java
+++ 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java
@@ -131,10 +131,6 @@ public final class MacroFormRenderer implements 
FormStringRenderer {
                 : new RenderableFtlFormElementsBuilder(this.visualTheme, rh, 
request, response, staticContentUrlProvider);
     }
 
-    private static String encodeDoubleQuotes(String htmlString) {
-        return htmlString.replace("\"", "\\\"");
-    }
-
     public boolean getRenderPagination() {
         return this.renderPagination;
     }
@@ -653,7 +649,7 @@ public final class MacroFormRenderer implements 
FormStringRenderer {
                     sr.append(" name=\"");
                     sr.append(modelFormField.getModelForm().getName());
                     sr.append("\" title=\"");
-                    sr.append(encodeDoubleQuotes(title));
+                    sr.append(MacroCommonRenderer.escapeFtlString(title));
                     sr.append("\" />");
                     executeMacro(writer, sr.toString());
                 } else if (modelFormField.isSortField()) {
@@ -693,7 +689,7 @@ public final class MacroFormRenderer implements 
FormStringRenderer {
                 String helpText = 
UtilHelpText.getEntityFieldDescription(entityName, fieldName, delegator, 
locale);
 
                 sr.append("\" fieldHelpText=\"");
-                sr.append(encodeDoubleQuotes(helpText));
+                sr.append(MacroCommonRenderer.escapeFtlString(helpText));
             }
             sr.append("\" title=\"");
             sr.append(sb.toString());
@@ -2389,7 +2385,7 @@ public final class MacroFormRenderer implements 
FormStringRenderer {
             sr.append("\" alternate=\"");
             sr.append(alt);
             sr.append("\" targetParameters=\"");
-            sr.append(encodeDoubleQuotes(targetParameters.toString()));
+            
sr.append(MacroCommonRenderer.escapeFtlString(targetParameters.toString()));
             sr.append("\" linkUrl=\"");
             sr.append(linkUrl.toString());
             sr.append("\" targetWindow=\"");
diff --git 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroMenuRenderer.java
 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroMenuRenderer.java
index 13148312f6..5aaf198709 100644
--- 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroMenuRenderer.java
+++ 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroMenuRenderer.java
@@ -124,7 +124,7 @@ public class MacroMenuRenderer implements 
MenuStringRenderer {
                 Object value = parameter.getValue();
                 if (value instanceof String) {
                     sb.append('"');
-                    sb.append(((String) value).replace("\"", "\\\""));
+                    sb.append(MacroCommonRenderer.escapeFtlString((String) 
value));
                     sb.append('"');
                 } else {
                     sb.append(value);
diff --git 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroScreenRenderer.java
 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroScreenRenderer.java
index 4bc9db855b..3a7cf63566 100644
--- 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroScreenRenderer.java
+++ 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroScreenRenderer.java
@@ -126,7 +126,7 @@ public class MacroScreenRenderer implements 
ScreenStringRenderer {
                 Object value = parameter.getValue();
                 if (value instanceof String) {
                     sb.append('"');
-                    sb.append(((String) value).replace("\\", 
"\\\\").replace("\"", "\\\"").replace("{", "\\{"));
+                    sb.append(MacroCommonRenderer.escapeFtlString((String) 
value));
                     sb.append('"');
                 } else {
                     sb.append(value);
diff --git 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroTreeRenderer.java
 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroTreeRenderer.java
index 43d4815a8f..4dd3bb23a3 100644
--- 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroTreeRenderer.java
+++ 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroTreeRenderer.java
@@ -292,7 +292,7 @@ public class MacroTreeRenderer implements 
TreeStringRenderer {
         sr.append("\" linkText=\"");
         sr.append(linkText);
         sr.append("\" imgStr=\"");
-        sr.append(imgStr.replace("\"", "\\\""));
+        sr.append(MacroCommonRenderer.escapeFtlString(imgStr));
         sr.append("\" />");
         executeMacro(sr.toString().replace("|", "%7C")); // Fix for OFBIZ-9191
     }
diff --git 
a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java
 
b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java
index 5d9b53904c..40097f106c 100644
--- 
a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java
+++ 
b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java
@@ -797,7 +797,7 @@ public final class MacroFormRendererTest {
                 .put("description", description)
                 .put("linkUrl", "Encoded%20Target")
                 .put("id", id)
-                .put("targetParameters", 
"{\\\"k1\\\":\\\"v1\\\",\\\"k2\\\":\\\"v2\\\",\\\"presentation\\\":\\\"layer\\\"}")
+                .put("targetParameters", 
"\\{\\\"k1\\\":\\\"v1\\\",\\\"k2\\\":\\\"v2\\\",\\\"presentation\\\":\\\"layer\\\"}")
                 .put("width", width)
                 .put("confirmation", confirmation)
                 .put("targetWindow", targetWindow)

Reply via email to