diff --git a/src/org/labkey/test/pages/query/SourceQueryPage.java b/src/org/labkey/test/pages/query/SourceQueryPage.java index 750aa77ec4..0bcc1117e9 100644 --- a/src/org/labkey/test/pages/query/SourceQueryPage.java +++ b/src/org/labkey/test/pages/query/SourceQueryPage.java @@ -101,6 +101,12 @@ public ExecuteQueryPage clickSaveAndFinish() return new ExecuteQueryPage(getDriver()); } + public String clickSaveExpectingError() + { + Ext4Helper.Locators.ext4Button("Save").findElement(getDriver()).click(); + return waitForElement(Locator.tagWithId("div","status")).getText(); + } + @Override protected ElementCache newElementCache() { diff --git a/src/org/labkey/test/tests/PermissionsTestForJavascriptExecution.java b/src/org/labkey/test/tests/PermissionsTestForJavascriptExecution.java new file mode 100644 index 0000000000..56d29f7e0c --- /dev/null +++ b/src/org/labkey/test/tests/PermissionsTestForJavascriptExecution.java @@ -0,0 +1,140 @@ +package org.labkey.test.tests; + +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.labkey.test.BaseWebDriverTest; +import org.labkey.test.Locator; +import org.labkey.test.categories.Daily; +import org.labkey.test.pages.query.QueryMetadataEditorPage; +import org.labkey.test.pages.query.SourceQueryPage; +import org.labkey.test.util.ApiPermissionsHelper; +import org.labkey.test.util.PermissionsHelper; + +import java.util.Arrays; +import java.util.List; + +@Category({Daily.class}) +public class PermissionsTestForJavascriptExecution extends BaseWebDriverTest +{ + private static final String USER = "javascripttestuser@permissionstestforjavascriptexecution.test"; + private static final String XML_METADATA_1 = """ + + + + + + alert('Hello'); + + + http://www.labkey.com + + + +
+
"""; + private static final String XML_METADATA_2 = """ + \s + + + + \s + + org.labkey.api.data.JavaScriptDisplayColumnFactory + + ehr/window/ManageRecordWindow.js + onclick="EHR.window.ManageRecordWindow.buttonHandler(${Id:jsString}, ${objectid:jsString}, ${queryName:jsString}, '${dataRegionName}');" + + + + +
+
"""; + ApiPermissionsHelper _apiPermissionsHelper = new ApiPermissionsHelper(this); + + @BeforeClass + public static void setupProject() + { + PermissionsTestForJavascriptExecution init = (PermissionsTestForJavascriptExecution) getCurrentTest(); + init.doSetup(); + } + + @Override + protected void doCleanup(boolean afterTest) + { + _containerHelper.deleteProject(getProjectName(), afterTest); + _userHelper.deleteUsers(afterTest, USER); + } + + private void doSetup() + { + _containerHelper.createProject(getProjectName(), null); + _containerHelper.enableModule("simpletest"); + + _userHelper.createUser(USER); + _apiPermissionsHelper.addMemberToRole(USER, "Project Administrator", PermissionsHelper.MemberType.user); + } + + /* + Regression coverage for : Secure Issue 48660: SaveSourceQueryAction doesn't check for JavaScriptDisplayColumnFactory and + Secure Issue 48508: SaveSourceQueryAction doesn't check for JavaScript in XML payload + */ + @Test + public void testSteps() + { + String schema = "vehicle"; + String query = "Models"; + + log("Verify editing the metadata without developer permissions throws error"); + goToProjectHome(); + impersonate(USER); + clickTab("Query"); + selectQuery(schema, query); + waitAndClickAndWait(Locator.linkContainingText("edit metadata")); + QueryMetadataEditorPage metadataPage = new QueryMetadataEditorPage(getDriver()); + SourceQueryPage sourceQueryPage = metadataPage.clickEditSource(); + sourceQueryPage.setMetadataXml(XML_METADATA_2); + Assert.assertEquals("Incorrect error message", + "Failed to Save: An exception occurred: For permissions to use JavaScriptDisplayColumn, contact your system administrator", + sourceQueryPage.clickSaveExpectingError()); + sourceQueryPage.setMetadataXml(XML_METADATA_1); + Assert.assertEquals("Incorrect error message", + "Failed to Save: An exception occurred: Illegal element . For permissions to use this element, contact your system administrator", + sourceQueryPage.clickSaveExpectingError()); + stopImpersonating(); + + log("Adding developer role to the user"); + _apiPermissionsHelper.setSiteAdminRoleUserPermissions(USER, "Platform Developer"); + + log("Verifying editing metadata is success"); + goToProjectHome(); + impersonate(USER); + editSource(schema, query, XML_METADATA_1); + editSource(schema, query, XML_METADATA_2); + stopImpersonating(); + + checkExpectedErrors(2); + } + + private void editSource(String schema, String query, String xml) + { + goToSchemaBrowser(); + selectQuery(schema, query); + waitAndClickAndWait(Locator.linkContainingText("edit metadata")); + SourceQueryPage sourceQueryPage = new QueryMetadataEditorPage(getDriver()).clickEditSource(); + sourceQueryPage.setMetadataXml(xml).clickSave(); + } + + @Override + protected String getProjectName() + { + return "PermissionsTestForJavascriptExecution Project"; + } + + @Override + public List getAssociatedModules() + { + return Arrays.asList("simpletest"); + } +}