Skip to content

Commit 8337ac8

Browse files
committed
XWIKI-23462: Some extension IDs in log messages aren't displayed correctly
* Properly escape the extension ID when the extension isn't found * Add a page test to test the escaping.
1 parent accbf8d commit 8337ac8

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

xwiki-platform-core/xwiki-platform-web/xwiki-platform-web-templates/src/main/resources/templates/logging_macros.vm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ Caused by: #printThrowable($throwable.cause true)
113113
#set ($version = $argument.versionConstraint)
114114
#end
115115
#set ($_extensionURL = "#getExtensionURL($argument.id, $version)")
116-
#set ($_extensionName = $argument)
116+
#set ($_extensionName = $!escapetool.xml($argument))
117117
#end
118118
#set ($message = "$message<a href=""$_extensionURL"" class=""extension-link"">$_extensionName</a>")
119119
#elseif ($argument.listIterator())

xwiki-platform-core/xwiki-platform-web/xwiki-platform-web-templates/src/test/java/org/xwiki/web/DistributionPageTest.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,33 @@
1919
*/
2020
package org.xwiki.web;
2121

22+
import java.util.List;
23+
2224
import javax.inject.Inject;
2325
import javax.inject.Named;
2426

2527
import org.junit.jupiter.api.BeforeEach;
2628
import org.junit.jupiter.api.Test;
2729
import org.xwiki.extension.DefaultExtensionDependency;
2830
import org.xwiki.extension.ExtensionDependency;
31+
import org.xwiki.extension.ExtensionId;
32+
import org.xwiki.extension.job.InstallRequest;
33+
import org.xwiki.extension.job.plan.internal.DefaultExtensionPlan;
2934
import org.xwiki.extension.script.ExtensionManagerScriptService;
3035
import org.xwiki.extension.version.internal.DefaultVersionConstraint;
36+
import org.xwiki.logging.LogQueue;
3137
import org.xwiki.script.service.ScriptService;
3238
import org.xwiki.template.TemplateManager;
3339
import org.xwiki.test.junit5.mockito.MockComponent;
3440
import org.xwiki.test.page.PageTest;
3541

3642
import static org.hamcrest.MatcherAssert.assertThat;
3743
import static org.hamcrest.Matchers.containsString;
44+
import static org.hamcrest.Matchers.matchesRegex;
45+
import static org.hamcrest.Matchers.not;
3846
import static org.mockito.Mockito.doReturn;
47+
import static org.mockito.Mockito.mock;
48+
import static org.mockito.Mockito.verify;
3949
import static org.mockito.Mockito.when;
4050

4151
/**
@@ -78,4 +88,37 @@ void nonExistingExtensionRequest() throws Exception
7888
<span class="extension-name">&#60;test&#62;</span><span
7989
class="extension-version">&#60;test&#62;</span>"""));
8090
}
91+
92+
@Test
93+
void nonExistingExtensionRequestWithJobStatus() throws Exception
94+
{
95+
String testValue = "<test>";
96+
this.stubRequest.put("extensionId", testValue);
97+
this.stubRequest.put("extensionVersion", testValue);
98+
this.stubRequest.put("extensionSection", "progress");
99+
String namespace = "wiki:xwiki";
100+
this.stubRequest.put("extensionNamespace", namespace);
101+
ExtensionId extensionId = new ExtensionId(testValue, testValue);
102+
103+
// Mock an extension job status for an installation request with the necessary properties to trigger the
104+
// display of the log message.
105+
ExtensionManagerScriptService service = (ExtensionManagerScriptService) this.extensionManagerScriptService;
106+
InstallRequest installRequest = mock();
107+
when(installRequest.getExtensions()).thenReturn(List.of(extensionId));
108+
LogQueue logEvents = new LogQueue();
109+
logEvents.info("Resolving extension [{}] on namespace [{}]", extensionId, namespace);
110+
DefaultExtensionPlan<InstallRequest> extensionPlan = mock();
111+
when(extensionPlan.getRequest()).thenReturn(installRequest);
112+
when(extensionPlan.getLogTail()).thenReturn(logEvents);
113+
when(service.getExtensionPlanJobStatus(testValue, namespace)).thenReturn(extensionPlan);
114+
115+
String output = this.templateManager.render("distribution.vm");
116+
117+
verify(service).getExtensionPlanJobStatus(testValue, namespace);
118+
119+
assertThat(output, containsString("&#60;test&#62;"));
120+
assertThat(output, not(containsString(testValue)));
121+
assertThat(output, matchesRegex("(?s).*Resolving extension \\[<a href=\"[^\"]*\" class=\"extension-link\">&#60;"
122+
+ "test&#62;/&#60;test&#62;</a>].*"));
123+
}
81124
}

0 commit comments

Comments
 (0)