Skip to content

Commit 40e1afe

Browse files
committed
XWIKI-22030: Improve escaping in macros list
* Improve escaping in XWikiSyntaxMacrosList * Add test case to XWikiSyntaxMacrosListPageTest
1 parent f76aee9 commit 40e1afe

File tree

2 files changed

+56
-18
lines changed

2 files changed

+56
-18
lines changed

xwiki-platform-core/xwiki-platform-help/xwiki-platform-help-ui/src/main/resources/XWiki/XWikiSyntaxMacrosList.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@
3939
<content>{{velocity}}
4040
## If the translation key exists, use its value, otherwise use to the provided fallback value.
4141
#macro (translateOrElse $translationKey $fallback)
42-
#if($services.localization.get($translationKey))
42+
#if($services.localization.get($translationKey))
4343
$services.rendering.escape($services.localization.render($translationKey), 'xwiki/2.1')##
4444
#else
45-
$fallback##
45+
$services.rendering.escape($fallback, 'xwiki/2.1')##
4646
#end
4747
#end
4848

xwiki-platform-core/xwiki-platform-help/xwiki-platform-help-ui/src/test/java/org/xwiki/help/XWikiSyntaxMacrosListPageTest.java

+54-16
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.jsoup.nodes.Document;
2828
import org.jsoup.nodes.Element;
2929
import org.jsoup.select.Elements;
30+
import org.junit.jupiter.api.BeforeEach;
3031
import org.junit.jupiter.api.Test;
3132
import org.xwiki.context.internal.concurrent.DefaultContextStoreManager;
3233
import org.xwiki.localization.macro.internal.TranslationMacro;
@@ -49,13 +50,15 @@
4950
import org.xwiki.test.annotation.ComponentList;
5051
import org.xwiki.test.page.HTML50ComponentList;
5152
import org.xwiki.test.page.PageTest;
53+
import org.xwiki.test.page.TestNoScriptMacro;
5254
import org.xwiki.test.page.XWikiSyntax21ComponentList;
5355

5456
import com.xpn.xwiki.DefaultSkinAccessBridge;
5557
import com.xpn.xwiki.doc.XWikiDocument;
5658
import com.xpn.xwiki.objects.BaseObject;
5759

5860
import static org.junit.jupiter.api.Assertions.assertEquals;
61+
import static org.junit.jupiter.api.Assertions.assertNotNull;
5962
import static org.mockito.ArgumentMatchers.any;
6063
import static org.mockito.Mockito.mock;
6164
import static org.mockito.Mockito.when;
@@ -88,19 +91,30 @@
8891
// End of XWikiWikiModel
8992
DocumentXHTMLLinkTypeRenderer.class,
9093
DocumentResourceReferenceEntityReferenceResolver.class,
94+
TestNoScriptMacro.class,
9195
TranslationMacro.class
9296
})
9397
class XWikiSyntaxMacrosListPageTest extends PageTest
9498
{
9599
public static final DocumentReference DOCUMENT_REFERENCE =
96100
new DocumentReference("xwiki", "XWiki", "XWikiSyntaxMacrosList");
97101

98-
@Test
99-
void renderTable() throws Exception
102+
private DefaultWikiMacro myMacro;
103+
104+
@BeforeEach
105+
void setUp() throws Exception
100106
{
101107
// Initialize "WikiMacroClass"
102108
this.xwiki.initializeMandatoryDocuments(this.context);
103109

110+
// Mock the database.
111+
Query query = mock(Query.class);
112+
QueryManagerScriptService queryManagerScriptService =
113+
this.componentManager.registerMockComponent(ScriptService.class, "query", QueryManagerScriptService.class,
114+
false);
115+
when(queryManagerScriptService.xwql(any())).thenReturn(query);
116+
when(query.execute()).thenReturn(List.of("xwiki:XWiki.MyMacro"));
117+
104118
// Create a wiki macro.
105119
XWikiDocument myMacroDocument = this.xwiki.getDocument(new DocumentReference("xwiki", "XWiki", "MyMacro"),
106120
this.context);
@@ -111,20 +125,17 @@ void renderTable() throws Exception
111125
this.xwiki.saveDocument(myMacroDocument, this.context);
112126

113127
// Register the wiki macro component.
114-
DefaultWikiMacro myMacro =
128+
this.myMacro =
115129
this.componentManager.registerMockComponent(Macro.class, "mymacro", DefaultWikiMacro.class, false);
116-
DefaultMacroDescriptor macroDescriptor =
117-
new DefaultMacroDescriptor(new MacroId("mymacro"), "My Macro", "My Macro Description");
118-
macroDescriptor.setDefaultCategories(Set.of("Category1", "Category2"));
119-
when(myMacro.getDescriptor()).thenReturn(macroDescriptor);
130+
}
120131

121-
// Mock the database.
122-
Query query = mock(Query.class);
123-
QueryManagerScriptService queryManagerScriptService =
124-
this.componentManager.registerMockComponent(ScriptService.class, "query", QueryManagerScriptService.class,
125-
false);
126-
when(queryManagerScriptService.xwql(any())).thenReturn(query);
127-
when(query.execute()).thenReturn(List.of("xwiki:XWiki.MyMacro"));
132+
@Test
133+
void renderTable() throws Exception
134+
{
135+
DefaultMacroDescriptor macroDescriptor = new DefaultMacroDescriptor(new MacroId("mymacro"), "My Macro",
136+
"My Macro Description");
137+
macroDescriptor.setDefaultCategories(Set.of("Category1", "Category2"));
138+
when(this.myMacro.getDescriptor()).thenReturn(macroDescriptor);
128139

129140
// Render the page.
130141
Document document = renderHTMLPage(DOCUMENT_REFERENCE);
@@ -144,12 +155,39 @@ void renderTable() throws Exception
144155
"XWiki.WikiMacroClass_visibility_Global");
145156
assertWikiMacro(trs.get(3), "mymacro", "/xwiki/bin/view/XWiki/MyMacro", "My Macro",
146157
Set.of("Category1", "Category2"), "My Macro Description", "XWiki.WikiMacroClass_visibility_WIKI");
147-
assertJavaMacro(trs.get(4), "translation", "Translation", "Content",
158+
assertJavaMacro(trs.get(4), "noscript", "NoScript", "", "No Script!", "XWiki.WikiMacroClass_visibility_Global");
159+
assertJavaMacro(trs.get(5), "translation", "Translation", "Content",
148160
"Display a translation message.", "XWiki.WikiMacroClass_visibility_Global");
149-
assertJavaMacro(trs.get(5), "velocity", "Velocity", "Development", "Executes a Velocity script.",
161+
assertJavaMacro(trs.get(6), "velocity", "Velocity", "Development", "Executes a Velocity script.",
150162
"XWiki.WikiMacroClass_visibility_Global");
151163
}
152164

165+
@Test
166+
void checkTableEscaping() throws Exception
167+
{
168+
String unescapedString = "{{noscript /}}";
169+
170+
DefaultMacroDescriptor macroDescriptor = new DefaultMacroDescriptor(new MacroId("mymacro"), unescapedString,
171+
unescapedString);
172+
macroDescriptor.setDefaultCategories(Set.of(unescapedString));
173+
when(this.myMacro.getDescriptor()).thenReturn(macroDescriptor);
174+
175+
Document document = renderHTMLPage(DOCUMENT_REFERENCE);
176+
177+
Elements trs = document.select("tr");
178+
Element myMacroTr = null;
179+
for (Element tr : trs) {
180+
Element th = tr.selectFirst("td");
181+
if (th != null && th.text().equals("mymacro")) {
182+
myMacroTr = tr;
183+
}
184+
}
185+
186+
assertNotNull(myMacroTr);
187+
assertWikiMacro(myMacroTr, "mymacro", "/xwiki/bin/view/XWiki/MyMacro", unescapedString, Set.of(unescapedString),
188+
unescapedString, "XWiki.WikiMacroClass_visibility_WIKI");
189+
}
190+
153191
private void assertWikiMacro(Element rowElement, String id, String link, String name, Set<String> categories,
154192
String description, String visibility)
155193
{

0 commit comments

Comments
 (0)