This is an automated email from the ASF dual-hosted git repository. jongyoul pushed a commit to branch branch-0.11 in repository https://gitbox.apache.org/repos/asf/zeppelin.git
commit ca178c11c7ce1e7647652b3c47ba965d8c2375da Author: Jongyoul Lee <jongy...@gmail.com> AuthorDate: Sun Mar 10 12:38:17 2024 +0900 [HOTFIX] Escape HeliumPackage information (#4728) (cherry picked from commit 83685795e0ec8d3059fd7a3dbcae5c0532b63b79) --- .../org/apache/zeppelin/helium/HeliumPackage.java | 45 +++++++++++++++++++++- .../apache/zeppelin/helium/SpellPackageInfo.java | 5 +++ .../zeppelin/helium/ApplicationLoaderTest.java | 3 +- .../apache/zeppelin/helium/HeliumPackageTest.java | 3 +- .../apache/zeppelin/rest/HeliumRestApiTest.java | 5 ++- .../helium/HeliumApplicationFactoryTest.java | 9 +++-- .../zeppelin/helium/HeliumBundleFactoryTest.java | 13 ++++--- .../zeppelin/helium/HeliumLocalRegistryTest.java | 3 +- .../org/apache/zeppelin/helium/HeliumTest.java | 9 +++-- 9 files changed, 74 insertions(+), 21 deletions(-) diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/helium/HeliumPackage.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/helium/HeliumPackage.java index e9995c1066..51b0fcbe51 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/helium/HeliumPackage.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/helium/HeliumPackage.java @@ -17,10 +17,16 @@ package org.apache.zeppelin.helium; import com.google.gson.Gson; +import org.apache.commons.text.StringEscapeUtils; import org.apache.zeppelin.annotation.Experimental; import org.apache.zeppelin.common.JsonSerializable; +import java.util.Arrays; +import java.util.HashMap; import java.util.Map; +import java.util.Optional; + +import static org.apache.commons.text.StringEscapeUtils.escapeHtml4; /** * Helium package definition @@ -47,7 +53,7 @@ public class HeliumPackage implements JsonSerializable { private SpellPackageInfo spell; private Map<String, Object> config; - public HeliumPackage(HeliumType type, + private HeliumPackage(HeliumType type, String name, String description, String artifact, @@ -140,6 +146,41 @@ public class HeliumPackage implements JsonSerializable { } public static HeliumPackage fromJson(String json) { - return gson.fromJson(json, HeliumPackage.class); + return preventXss(gson.fromJson(json, HeliumPackage.class)); + } + + // This is only for test + public static HeliumPackage newHeliumPackage(HeliumType type, + String name, + String description, + String artifact, + String className, + String[][] resources, + String license, + String icon) { + return preventXss(new HeliumPackage( + type, name, description, artifact, className, resources, license, icon)); + } + + private static HeliumPackage preventXss(HeliumPackage heliumPackage) { + heliumPackage.name = escapeHtml4(heliumPackage.name); + heliumPackage.description = escapeHtml4(heliumPackage.description); + heliumPackage.artifact = escapeHtml4(heliumPackage.artifact); + heliumPackage.className = escapeHtml4(heliumPackage.className); + heliumPackage.resources = + Optional.ofNullable(heliumPackage.getResources()).map(r -> Arrays.stream(r) + .map(resource -> Arrays.stream(resource).map(StringEscapeUtils::escapeHtml4) + .toArray(String[]::new)) + .toArray(String[][]::new)).orElse(null); + heliumPackage.license = escapeHtml4(heliumPackage.license); + heliumPackage.published = escapeHtml4(heliumPackage.published); + heliumPackage.groupId = escapeHtml4(heliumPackage.groupId); + heliumPackage.artifactId = escapeHtml4(heliumPackage.artifactId); + heliumPackage.spell = Optional.ofNullable(heliumPackage.getSpellInfo()) + .map(spellPackageInfo -> new SpellPackageInfo( + escapeHtml4(spellPackageInfo.getMagic()), + escapeHtml4(spellPackageInfo.getUsage()))) + .orElse(null); + return heliumPackage; } } diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/helium/SpellPackageInfo.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/helium/SpellPackageInfo.java index 519d09d70e..52e17dbd3f 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/helium/SpellPackageInfo.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/helium/SpellPackageInfo.java @@ -24,6 +24,11 @@ public class SpellPackageInfo { private String magic; private String usage; + public SpellPackageInfo(String magic, String usage) { + this.magic = magic; + this.usage = usage; + } + public String getMagic() { return magic; } diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/helium/ApplicationLoaderTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/helium/ApplicationLoaderTest.java index 21d3d751b8..52508b48dd 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/helium/ApplicationLoaderTest.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/helium/ApplicationLoaderTest.java @@ -25,6 +25,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import static org.apache.zeppelin.helium.HeliumPackage.newHeliumPackage; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -74,7 +75,7 @@ class ApplicationLoaderTest { } public HeliumPackage createPackageInfo(String className, String artifact) { - HeliumPackage app1 = new HeliumPackage( + HeliumPackage app1 = newHeliumPackage( HeliumType.APPLICATION, "name1", "desc1", diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/helium/HeliumPackageTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/helium/HeliumPackageTest.java index 1d168d1448..4efeda7dca 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/helium/HeliumPackageTest.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/helium/HeliumPackageTest.java @@ -17,6 +17,7 @@ package org.apache.zeppelin.helium; +import static org.apache.commons.text.StringEscapeUtils.escapeHtml4; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Map; @@ -42,7 +43,7 @@ class HeliumPackageTest { HeliumPackage p = HeliumPackage.fromJson(examplePackage); assertEquals("%echo", p.getSpellInfo().getMagic()); - assertEquals("%echo <TEXT>", p.getSpellInfo().getUsage()); + assertEquals(escapeHtml4("%echo <TEXT>"), p.getSpellInfo().getUsage()); } @Test diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/HeliumRestApiTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/HeliumRestApiTest.java index 87af88507f..ed74641892 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/HeliumRestApiTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/HeliumRestApiTest.java @@ -36,6 +36,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import static org.apache.zeppelin.helium.HeliumPackage.newHeliumPackage; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -64,7 +65,7 @@ class HeliumRestApiTest extends AbstractTestRestApi { HeliumTestRegistry registry = new HeliumTestRegistry("r1", "r1"); helium.clear(); - registry.add(new HeliumPackage( + registry.add(newHeliumPackage( HeliumType.APPLICATION, "name1", "desc1", @@ -74,7 +75,7 @@ class HeliumRestApiTest extends AbstractTestRestApi { "", "")); - registry.add(new HeliumPackage( + registry.add(newHeliumPackage( HeliumType.APPLICATION, "name2", "desc2", diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumApplicationFactoryTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumApplicationFactoryTest.java index 95a3858885..574b4e2255 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumApplicationFactoryTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumApplicationFactoryTest.java @@ -16,6 +16,7 @@ */ package org.apache.zeppelin.helium; +import static org.apache.zeppelin.helium.HeliumPackage.newHeliumPackage; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.Mockito.mock; @@ -90,7 +91,7 @@ public class HeliumApplicationFactoryTest extends AbstractInterpreterTest { public void testLoadRunUnloadApplication() throws IOException, ApplicationException, InterruptedException { // given - HeliumPackage pkg1 = new HeliumPackage(HeliumType.APPLICATION, + HeliumPackage pkg1 = newHeliumPackage(HeliumType.APPLICATION, "name1", "desc1", "", @@ -139,7 +140,7 @@ public class HeliumApplicationFactoryTest extends AbstractInterpreterTest { @Disabled public void testUnloadOnParagraphRemove() throws IOException { // given - HeliumPackage pkg1 = new HeliumPackage(HeliumType.APPLICATION, + HeliumPackage pkg1 = newHeliumPackage(HeliumType.APPLICATION, "name1", "desc1", "", @@ -182,7 +183,7 @@ public class HeliumApplicationFactoryTest extends AbstractInterpreterTest { @Disabled public void testUnloadOnInterpreterUnbind() throws IOException { // given - HeliumPackage pkg1 = new HeliumPackage(HeliumType.APPLICATION, + HeliumPackage pkg1 = newHeliumPackage(HeliumType.APPLICATION, "name1", "desc1", "", @@ -249,7 +250,7 @@ public class HeliumApplicationFactoryTest extends AbstractInterpreterTest { @Disabled public void testUnloadOnInterpreterRestart() throws IOException, InterpreterException { // given - HeliumPackage pkg1 = new HeliumPackage(HeliumType.APPLICATION, + HeliumPackage pkg1 = newHeliumPackage(HeliumType.APPLICATION, "name1", "desc1", "", diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumBundleFactoryTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumBundleFactoryTest.java index 9c84251ee7..00f5bb0058 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumBundleFactoryTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumBundleFactoryTest.java @@ -17,6 +17,7 @@ package org.apache.zeppelin.helium; import static org.apache.zeppelin.helium.HeliumBundleFactory.HELIUM_LOCAL_REPO; +import static org.apache.zeppelin.helium.HeliumPackage.newHeliumPackage; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotSame; import static org.junit.jupiter.api.Assertions.assertNull; @@ -72,7 +73,7 @@ public class HeliumBundleFactoryTest { @Test public void downloadPackage() throws TaskRunnerException { HeliumPackage pkg = - new HeliumPackage( + newHeliumPackage( HeliumType.VISUALIZATION, "lodash", "lodash", @@ -89,7 +90,7 @@ public class HeliumBundleFactoryTest { @Test public void bundlePackage() throws IOException, TaskRunnerException { HeliumPackage pkg = - new HeliumPackage( + newHeliumPackage( HeliumType.VISUALIZATION, "zeppelin-bubblechart", "zeppelin-bubblechart", @@ -114,7 +115,7 @@ public class HeliumBundleFactoryTest { String localPkg = resDir + "/../../../src/test/resources/helium/vis1"; HeliumPackage pkg = - new HeliumPackage( + newHeliumPackage( HeliumType.VISUALIZATION, "vis1", "vis1", @@ -135,7 +136,7 @@ public class HeliumBundleFactoryTest { String localPkg = resDir + "/../../../src/test/resources/helium/vis2"; HeliumPackage pkg = - new HeliumPackage( + newHeliumPackage( HeliumType.VISUALIZATION, "vis2", "vis2", @@ -161,7 +162,7 @@ public class HeliumBundleFactoryTest { String resDir = new File(res.getFile()).getParent(); HeliumPackage pkgV1 = - new HeliumPackage( + newHeliumPackage( HeliumType.VISUALIZATION, "zeppelin-bubblechart", "zeppelin-bubblechart", @@ -172,7 +173,7 @@ public class HeliumBundleFactoryTest { "icon"); HeliumPackage pkgV2 = - new HeliumPackage( + newHeliumPackage( HeliumType.VISUALIZATION, "zeppelin-bubblechart", "zeppelin-bubblechart", diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumLocalRegistryTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumLocalRegistryTest.java index 972e461ffb..328656a58d 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumLocalRegistryTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumLocalRegistryTest.java @@ -25,6 +25,7 @@ import org.junit.jupiter.api.Test; import java.io.File; import java.io.IOException; +import static org.apache.zeppelin.helium.HeliumPackage.newHeliumPackage; import static org.junit.jupiter.api.Assertions.assertEquals; public class HeliumLocalRegistryTest { @@ -50,7 +51,7 @@ public class HeliumLocalRegistryTest { // when Gson gson = new Gson(); - HeliumPackage pkg1 = new HeliumPackage(HeliumType.APPLICATION, + HeliumPackage pkg1 = newHeliumPackage(HeliumType.APPLICATION, "app1", "desc1", "artifact1", diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumTest.java index 021e6cb786..384103c262 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumTest.java @@ -26,6 +26,7 @@ import java.io.File; import java.io.IOException; import java.net.URISyntaxException; +import static org.apache.zeppelin.helium.HeliumPackage.newHeliumPackage; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -77,7 +78,7 @@ public class HeliumTest { helium.addRegistry(registry2); // when - registry1.add(new HeliumPackage( + registry1.add(newHeliumPackage( HeliumType.APPLICATION, "name1", "desc1", @@ -87,7 +88,7 @@ public class HeliumTest { "", "")); - registry2.add(new HeliumPackage( + registry2.add(newHeliumPackage( HeliumType.APPLICATION, "name2", "desc2", @@ -110,7 +111,7 @@ public class HeliumTest { helium.addRegistry(registry1); // when - registry1.add(new HeliumPackage( + registry1.add(newHeliumPackage( HeliumType.APPLICATION, "name1", "desc1", @@ -124,7 +125,7 @@ public class HeliumTest { assertEquals(1, helium.getAllPackageInfo().size()); // when - registry1.add(new HeliumPackage( + registry1.add(newHeliumPackage( HeliumType.APPLICATION, "name2", "desc2",