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

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


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

commit 6ee8159664748bac4fa593ab11f4750d42db52bf
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 0fc9cd7db6..9a49b40581 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 9f4b3ca576..457dd7e5c7 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;
     }
@@ -649,7 +645,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()) {
@@ -689,7 +685,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());
@@ -2377,7 +2373,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 c989c32819..a6b1d2de7b 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 98a93862b4..3574d4ee3a 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
@@ -125,7 +125,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 0a6c002000..3ef9584126 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 6c767af158..b749cecc99 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
@@ -962,7 +962,7 @@ public 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