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
commit ddccb6d363ec70259b3e584690a4722054d20bd7 Author: Mridul Pathak <[email protected]> AuthorDate: Sun Oct 18 22:39:10 2026 +0530 Fixed: Build the sort links of list forms with an encoded query string The sort links of list forms URL-encoded their whole query string and appended it to the request path, and FindGeneric turned that encoding off with the escapeUrlEncode context flag because it broke its sort links, so its sort links carried the request parameters unencoded. The sort link is now built like the pagination links, with a regular query string whose parameter names and values are URL-encoded. The escapeUrlEncode flag and UtilCodec.encodeUrl(String, Map) are removed. --- .../main/java/org/apache/ofbiz/base/util/UtilCodec.java | 13 ------------- .../org/apache/ofbiz/webtools/entity/FindGeneric.groovy | 4 ---- .../ofbiz/widget/renderer/macro/MacroFormRenderer.java | 17 +---------------- .../widget/renderer/macro/MacroFormRendererTest.java | 3 ++- 4 files changed, 3 insertions(+), 34 deletions(-) diff --git a/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilCodec.java b/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilCodec.java index 2f37c0ddeb..6475906032 100644 --- a/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilCodec.java +++ b/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilCodec.java @@ -402,19 +402,6 @@ public class UtilCodec { return getEncoder("url").encode(queryString); } - /** - * Check if an escapeUrlEncode is present in the context, to escape url encoding in a specific case - * This is necessary if the url is sent to another encoding tool. - * @param queryString - * @param context - * @return encoding url with OFBiz rule - */ - public static String encodeUrl(String queryString, Map<String, Object> context) { - return "true".equalsIgnoreCase((String) context.get("escapeUrlEncode")) - ? queryString - : encodeUrl(queryString); - } - /** * Uses a black-list approach for necessary characters for HTML. * Does not allow various characters (after canonicalization), including diff --git a/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/FindGeneric.groovy b/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/FindGeneric.groovy index f96e4f3a91..5103a0b204 100644 --- a/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/FindGeneric.groovy +++ b/framework/webtools/src/main/groovy/org/apache/ofbiz/webtools/entity/FindGeneric.groovy @@ -33,10 +33,6 @@ import org.w3c.dom.Document ModelEntity modelEntity = null -// escape the security url encoding that break the sortField with the ftl rendering -// no security issue here, nothing come from the request -context.escapeUrlEncode = 'true' - try { modelEntity = delegator.getModelEntity(parameters.entityName) } catch (GenericEntityException e) { 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 b79ab21049..fafbd32e8e 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 @@ -733,23 +733,8 @@ public final class MacroFormRenderer implements FormStringRenderer { if (ajaxEnabled) { linkUrl = MacroCommonRenderer.createAjaxParamsFromUpdateAreas(updateAreas, paramMap, modelForm, null, context); } else { - StringBuilder sb = new StringBuilder("?"); - Iterator<Map.Entry<String, Object>> iter = paramMap.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry<String, Object> entry = iter.next(); - sb.append(entry.getKey()).append("=").append(entry.getValue()); - if (iter.hasNext()) { - sb.append("&"); - } - } - String newQueryString = sb.toString(); String urlPath = UtilHttp.removeQueryStringFromTarget(paginateTarget); - if (newQueryString.contains("?null=")) { // FIXME, not sure how to handle URL encoding in tests - newQueryString = newQueryString.replace("?null=LinkFromQBEString", "?sortField=LinkFromQBEString"); - linkUrl = rh.makeLink(this.request, this.response, urlPath.concat(newQueryString)); - } else { - linkUrl = rh.makeLink(this.request, this.response, urlPath.concat(UtilCodec.encodeUrl(newQueryString, context))); - } + linkUrl = rh.makeLink(this.request, this.response, urlPath + "?" + UtilHttp.urlEncodeArgs(paramMap)); } String tooltip = modelFormField.getSortFieldHelpText(context); writeFtlElement(writer, renderableFtlFormElementsBuilder.sortField(sortFieldStyle, titleText, linkUrl, ajaxEnabled, tooltip)); 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 911992ff25..12608166e1 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 @@ -646,11 +646,12 @@ public final class MacroFormRendererTest { final ModelForm modelForm = mock(ModelForm.class); final String paginateTarget = "TARGET"; final String qbeString = "field2=value2 with spaces"; + final String encodedQbeString = "field2=value2+with+spaces"; final String linkFromQbeString = "LinkFromQBEString"; when(modelFormField.getModelForm()).thenReturn(modelForm); when(modelForm.getPaginateTarget(notNull())).thenReturn(paginateTarget); - when(requestHandler.makeLink(notNull(), notNull(), contains(qbeString))).thenReturn(linkFromQbeString); + when(requestHandler.makeLink(notNull(), notNull(), contains(encodedQbeString))).thenReturn(linkFromQbeString); when(modelFormField.getSortFieldHelpText(notNull())).thenReturn("HELPTEXT"); when(renderableFtlFormElementsBuilder.sortField(nullable(String.class), eq(""), eq(linkFromQbeString), eq(false), eq("HELPTEXT"))).thenReturn(genericMacroCall);

