Skip to content

Commit c98ae52

Browse files
authored
UE: Encoding HTML in Tooltip and Description using XSSAPI (#1267)
* Encoding HTML in strings using custom serializer * Adding test cases * Removing encoding annotation for AbstractBase * Clean up * Moving Serializer to FormStructParser * Fixing formatting
1 parent 65f973f commit c98ae52

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/form/FormStructureParserImpl.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.io.StringWriter;
2020
import java.io.Writer;
2121

22+
import org.apache.commons.lang3.StringEscapeUtils;
2223
import org.apache.sling.api.SlingHttpServletRequest;
2324
import org.apache.sling.api.resource.Resource;
2425
import org.apache.sling.models.annotations.Model;
@@ -33,7 +34,11 @@
3334
import com.adobe.cq.forms.core.components.models.form.FormStructureParser;
3435
import com.adobe.cq.forms.core.components.util.ComponentUtils;
3536
import com.adobe.cq.forms.core.components.views.Views;
37+
import com.fasterxml.jackson.core.JsonGenerator;
38+
import com.fasterxml.jackson.databind.JsonSerializer;
3639
import com.fasterxml.jackson.databind.ObjectMapper;
40+
import com.fasterxml.jackson.databind.SerializerProvider;
41+
import com.fasterxml.jackson.databind.module.SimpleModule;
3742

3843
@Model(
3944
adaptables = { SlingHttpServletRequest.class, Resource.class },
@@ -118,6 +123,7 @@ public String getFormDefinition() {
118123
FormContainer formContainer = resource.adaptTo(FormContainer.class);
119124
try {
120125
ObjectMapper mapper = new ObjectMapper();
126+
mapper.registerModule(new SimpleModule().addSerializer(String.class, new FormStructureParserImpl.EncodeHTMLSerializer()));
121127
Writer writer = new StringWriter();
122128
// return publish view specific properties only for runtime
123129
mapper.writerWithView(Views.Publish.class).writeValue(writer, formContainer);
@@ -127,4 +133,14 @@ public String getFormDefinition() {
127133
}
128134
return result;
129135
}
136+
137+
private static class EncodeHTMLSerializer extends JsonSerializer<String> {
138+
@Override
139+
public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
140+
if (value != null) {
141+
String escapedValue = StringEscapeUtils.escapeHtml4(value);
142+
jsonGenerator.writeString(escapedValue);
143+
}
144+
}
145+
}
130146
}

bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/FormStructureParserImplTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.commons.lang3.StringUtils;
2626
import org.apache.sling.api.resource.Resource;
2727
import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletRequest;
28+
import org.junit.jupiter.api.Assertions;
2829
import org.junit.jupiter.api.BeforeEach;
2930
import org.junit.jupiter.api.Test;
3031
import org.junit.jupiter.api.extension.ExtendWith;
@@ -100,6 +101,19 @@ void testFormDefinition() throws JsonProcessingException {
100101
assertEquals(formJson.get("fieldType"), "form");
101102
}
102103

104+
@Test
105+
void testFormDefinitionWithHTMLEncoding() throws JsonProcessingException {
106+
String path = FORM_CONTAINER_PATH;
107+
FormStructureParser formStructureParser = getFormStructureParserUnderTest(path);
108+
String formDef = formStructureParser.getFormDefinition();
109+
HashMap<String, Object> formJson = (HashMap<String, Object>) new ObjectMapper().readValue(formDef,
110+
new TypeReference<Map<String, Object>>() {});
111+
Assertions.assertNotNull(formStructureParser.getFormDefinition());
112+
Map<String, Object> datepicker = (Map<String, Object>) ((Map<String, Object>) formJson.get(":items")).get("datepicker");
113+
Assertions.assertEquals(datepicker.get("description"), "&lt;p&gt;dummy&lt;/p&gt;");
114+
Assertions.assertEquals(datepicker.get("tooltip"), "&lt;p&gt;test-short-description&lt;/p&gt;");
115+
}
116+
103117
@Test
104118
void testFormContainerPathEmbedWithoutIframe() {
105119
FormStructureParser formStructureParser = getFormStructureParserUnderTest(JCR_CONTENT_PATH, FORM_CONTAINER_PATH);

bundles/af-core/src/test/resources/form/formstructparser/test-content.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
"name": "abc",
2121
"jcr:title": "def",
2222
"hideTitle": false,
23-
"description": "dummy",
24-
"visible": false
23+
"description": "<p>dummy</p>",
24+
"tooltip": "<p>test-short-description</p>",
25+
"visible": false,
26+
"fieldType": "datepicker"
2527
},
2628
"container1": {
2729
"jcr:primaryType": "nt:unstructured",

0 commit comments

Comments
 (0)