diff --git a/api/src/org/labkey/api/data/JsonTest.java b/api/src/org/labkey/api/data/JsonTest.java index 0ad347a0582..d1e1378eb42 100644 --- a/api/src/org/labkey/api/data/JsonTest.java +++ b/api/src/org/labkey/api/data/JsonTest.java @@ -101,12 +101,14 @@ public void jsonOrgViaJackson() throws IOException obj.put("str", "hello"); obj.put("arr", new JSONArray(Arrays.asList("one", null, 3, new JSONObject(Collections.singletonMap("four", 4))))); obj.put("nul", (Object)null); + obj.put("key", " - +   diff --git a/api/src/org/labkey/api/reports/report/r/RReport.java b/api/src/org/labkey/api/reports/report/r/RReport.java index 97905d564e1..fc3a67f241a 100644 --- a/api/src/org/labkey/api/reports/report/r/RReport.java +++ b/api/src/org/labkey/api/reports/report/r/RReport.java @@ -219,12 +219,48 @@ public static synchronized String getDefaultRPath() return DEFAULT_APP_PATH; } + public static String toR(String s) { - String r = PageFlowUtil.jsString(s); - return "\"" + StringUtils.strip(r, "'") + "\""; + if (s == null) + return "\"\""; + + StringBuilder r = new StringBuilder(s.length() + 10); + r.append("\""); + int len = s.length(); + for (int i = 0 ; i inputParameters) { diff --git a/api/src/org/labkey/api/util/PageFlowUtil.java b/api/src/org/labkey/api/util/PageFlowUtil.java index c2da9c75e85..1bf3f453f0e 100644 --- a/api/src/org/labkey/api/util/PageFlowUtil.java +++ b/api/src/org/labkey/api/util/PageFlowUtil.java @@ -428,6 +428,9 @@ public static String jsString(String s) case '\\': js.append("\\\\"); break; + case '/': + js.append("\\/"); + break; case '\n': js.append("\\n"); break; diff --git a/core/src/org/labkey/core/CoreModule.java b/core/src/org/labkey/core/CoreModule.java index 5b98596092e..9f0d431b2d5 100644 --- a/core/src/org/labkey/core/CoreModule.java +++ b/core/src/org/labkey/core/CoreModule.java @@ -15,6 +15,7 @@ */ package org.labkey.core; +import com.fasterxml.jackson.core.io.CharTypes; import com.google.common.collect.Sets; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; @@ -317,6 +318,18 @@ public class CoreModule extends SpringModule implements SearchService.DocumentPr // Register dialect extra early, since we need to initialize the data sources before calling DefaultModule.initialize() SqlDialectRegistry.register(new PostgreSqlDialectFactory()); + + try + { + var field = CharTypes.class.getDeclaredField("sOutputEscapes128"); + field.setAccessible(true); + ((int[])field.get(null))['/'] = '/'; + field.setAccessible(false); + } + catch (NoSuchFieldException|IllegalArgumentException|IllegalAccessException x) + { + // pass + } } private CoreWarningProvider _warningProvider; diff --git a/core/src/org/labkey/core/user/securityAccess.jsp b/core/src/org/labkey/core/user/securityAccess.jsp index 7d8c722748a..e14a8848ff8 100644 --- a/core/src/org/labkey/core/user/securityAccess.jsp +++ b/core/src/org/labkey/core/user/securityAccess.jsp @@ -79,7 +79,7 @@ However, if this account were re-enabled, it would have the following permissions. <% } %> - lk-region-name=<%=q(accessRegion.getName())%> class="labkey-data-region-legacy labkey-show-borders"> +
diff --git a/survey/src/org/labkey/survey/view/customizeSurveysWebPart.jsp b/survey/src/org/labkey/survey/view/customizeSurveysWebPart.jsp index 833abb6289d..cb787d61612 100644 --- a/survey/src/org/labkey/survey/view/customizeSurveysWebPart.jsp +++ b/survey/src/org/labkey/survey/view/customizeSurveysWebPart.jsp @@ -40,7 +40,7 @@ %> This webpart displays a list of survey instances created by the end user. Select which survey design this webpart should use:

-
>
+