diff --git a/src/org/labkey/test/pages/PermissionsEditor.java b/src/org/labkey/test/pages/PermissionsEditor.java deleted file mode 100644 index 17c6fabe6c..0000000000 --- a/src/org/labkey/test/pages/PermissionsEditor.java +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Copyright (c) 2015-2019 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.labkey.test.pages; - -import org.jetbrains.annotations.NotNull; -import org.labkey.test.BaseWebDriverTest; -import org.labkey.test.Locator; -import org.labkey.test.Locators; -import org.labkey.test.WebDriverWrapper; -import org.labkey.test.WebTestHelper; -import org.labkey.test.components.ext4.Window; -import org.labkey.test.util.Ext4Helper; -import org.labkey.test.util.LogMethod; -import org.labkey.test.util.LoggedParam; -import org.labkey.test.util.PermissionsHelper.PrincipalType; -import org.labkey.test.util.ext4cmp.Ext4CmpRef; -import org.openqa.selenium.NoSuchElementException; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; - -import java.util.List; - -public class PermissionsEditor -{ - private static final String READY_SIGNAL = "policyRendered"; - private static final Locator SIGNAL_LOC = Locators.pageSignal(READY_SIGNAL); - - private final WebDriverWrapper _test; - - public PermissionsEditor(WebDriverWrapper test) - { - _test = test; - } - - public static PermissionsEditor beginAt(WebDriverWrapper wdw, String containerPath) - { - wdw.beginAt(WebTestHelper.buildURL("security", containerPath, "permissions")); - return new PermissionsEditor(wdw); - } - - public void selectFolder(String folderName) - { - _test.clickAndWait(Locator.linkWithText(folderName).withClass("x4-tree-node-text")); - } - - public void createPermissionsGroup(String groupName) - { - _test.log("Creating permissions group " + groupName); - _test._ext4Helper.clickTabContainingText("Project Groups"); - _test.setFormElement(Locator.xpath("//input[contains(@name, 'projectgroupsname')]"), groupName); - _test.clickButton("Create New Group", 0); - _test._extHelper.waitForExtDialog(groupName + " Information"); - _test.assertTextPresent("Group " + groupName); - _test.click(Ext4Helper.Locators.ext4Button("Done")); - _test.waitForElement(Locator.css(".groupPicker .x4-grid-cell-inner").withText(groupName), BaseWebDriverTest.WAIT_FOR_JAVASCRIPT); - } - - public String toRole(String perm) - { - String R = "security.roles."; - if ("No Permissions".equals(perm)) - return R + "NoPermissionsRole"; - if ("Project Administrator".equals(perm)) - return R + "ProjectAdminRole"; - else if (!perm.contains(".")) - return R + perm + "Role"; - return perm; - } - - public void checkInheritedPermissions() - { - _test._ext4Helper.checkCheckbox("Inherit permissions from parent"); - } - - public void uncheckInheritedPermissions() - { - _test._ext4Helper.uncheckCheckbox("Inherit permissions from parent"); - } - - public void savePermissions() - { - _test.doAndWaitForPageSignal(() -> _test.clickButton("Save", 0), READY_SIGNAL); - _test._ext4Helper.waitForMaskToDisappear(); - } - - public Window clickSaveExpectingError() - { - _test.clickButton("Save", 0); - return new Window.WindowFinder(_test.getDriver()).withTitle("Error").waitFor(); - } - - @LogMethod - public void setPermissions(@LoggedParam String groupName, @LoggedParam String... permissionStrings) - { - for(String permissionString : permissionStrings) - { - _setPermissions(groupName, permissionString, "pGroup"); - } - } - - @LogMethod - public void setSiteGroupPermissions(@LoggedParam String groupName, @LoggedParam String... permissionStrings) - { - for(String permissionString : permissionStrings) - { - _setPermissions(groupName, permissionString, "pSite"); - } - } - - @LogMethod - public void setUserPermissions(@LoggedParam String userName, @LoggedParam String... permissionsStrings) - { - for(String permissionString : permissionsStrings) - { - _setPermissions(userName, permissionString, "pUser"); - } - } - - private void _setPermissions(String userOrGroupName, String permissionString, String className) - { - String role = toRole(permissionString); - if ("org.labkey.api.security.roles.NoPermissionsRole".equals(role)) - { - throw new IllegalArgumentException("Can't set NoPermissionRole; call removePermission()"); - } - else - { - _test.log("Setting permissions for group " + userOrGroupName + " to " + role); - _test._ext4Helper.clickTabContainingText("Permissions"); - - String group = userOrGroupName; - if (className.equals("pSite")) - group = "Site: " + group; - _selectPermission(userOrGroupName, group, permissionString); - } - } - - private void _selectPermission(String userOrGroupName, String group, String permissionString) - { - Locator.XPathLocator roleCombo = rolePanelLoc(permissionString); - _test.waitForElement(roleCombo); - _test.scrollIntoView(roleCombo); - _test._ext4Helper.selectComboBoxItem(roleCombo, Ext4Helper.TextMatchTechnique.STARTS_WITH, group); - _test.waitForElement(Locator.permissionButton(userOrGroupName, permissionString)); - } - - @NotNull - private static Locator.XPathLocator rolePanelLoc(String permissionString) - { - return Locator.xpath("//div[contains(@class, 'rolepanel')][.//h3[text()='" + permissionString + "']]"); - } - - public void removeSiteGroupPermission(String groupName, String permissionString) - { - _removePermission(groupName, permissionString, "pSite"); - } - - public void removePermission(String groupName, String permissionString) - { - _removePermission(groupName, permissionString, "pGroup"); - } - - public void _removePermission(String groupName, String permissionString, String className) - { - Locator close = Locator.closePermissionButton(groupName, permissionString); - if (_test.isElementPresent(close)) - { - _test.click(close); - _test.waitForElementToDisappear(close); - } - } - - public boolean isRoleEditable(String roleName) - { - WebElement rolePanel = rolePanelLoc(roleName).findElement(_test.getDriver()); - boolean canAddMembers = Locator.tag("input").findElement(rolePanel).isEnabled(); - List memberButton = Locator.tagWithClass("a", "x4-btn").findElements(rolePanel); - for (WebElement button : memberButton) - { - // Ensure consistency between adding and removing members - if (button.getAttribute("class").contains("disabled") == canAddMembers) - { - String able = canAddMembers ? "add" : "remove"; - String unable = canAddMembers ? "remove" : "add"; - throw new IllegalStateException("Able to %s members to role '%s' but can't %s them".formatted(able, roleName, unable)); - } - } - return canAddMembers; - } - - /** - * Adds a new or existing user to an existing group within an the current project - * - * @param userName new or existing user name - * @param groupName existing group within the project to which we should add the user - */ - public void addUserToProjGroup(String userName, String groupName) - { - addUsersToGroup(groupName, userName); - } - - private PermissionsEditor enterPermissionsUI() - { - return enterPermissionsUI(_test); - } - - public static PermissionsEditor enterPermissionsUI(WebDriverWrapper test) - { - if (!test.isElementPresent(SIGNAL_LOC)) - { - test.clickAdminMenuItem("Folder", "Permissions"); - test.waitForElement(SIGNAL_LOC); - } - return new PermissionsEditor(test); - } - - public void saveAndFinish() - { - _test.clickButton("Save and Finish"); - } - - public void deleteGroup(String groupName) - { - deleteGroup(groupName, false); - } - - public void deleteAllUsersFromGroup() - { - Locator.XPathLocator l = Locator.xpath("//td/a/span[text()='remove']"); - - while (_test.isElementPresent(l)) - { - int i = _test.getElementCount(l) - 1; - _test.click(l); - _test.waitForElementToDisappear(l.index(i), BaseWebDriverTest.WAIT_FOR_JAVASCRIPT); - } - } - - @LogMethod(quiet = true) - public void deleteGroup(@LoggedParam String groupName, boolean failIfNotFound) - { - _test.log("Attempting to delete group: " + groupName); - if (selectGroup(groupName, failIfNotFound)) - { - _test.assertElementPresent(Locator.css(".x4-grid-cell-first").withText(groupName)); - deleteAllUsersFromGroup(); - _test.click(Locator.xpath("//td/a/span[text()='Delete Empty Group']")); - _test.waitForElementToDisappear(Locator.css(".x4-grid-cell-first").withText(groupName), BaseWebDriverTest.WAIT_FOR_JAVASCRIPT); - } - } - - public void removeUserFromGroup(String groupName, String userName) - { - if (!_test.isTextPresent("Group " + groupName)) - selectGroup(groupName); - - Locator l = Locator.xpath("//td[text()='" + userName + "']/..//td/a/span[text()='remove']"); - _test.click(l); - } - - public void addUserToGroup(String groupName, String userName) - { - if (!_test.isTextPresent("Group " + groupName)) - selectGroup(groupName); - String dialogTitle = groupName + " Information"; - - _test._ext4Helper.selectComboBoxItem(Locator.xpath(_test._extHelper.getExtDialogXPath(dialogTitle) + "//table[contains(@id, 'labkey-principalcombo')]"), userName); - Locator.css(".userinfo td").withText(userName).waitForElement(_test.getDriver(), BaseWebDriverTest.WAIT_FOR_JAVASCRIPT); - _test._extHelper.clickExtButton(dialogTitle, "Done", 0); - _test._extHelper.waitForExtDialogToDisappear(dialogTitle); - - _test.clickButton("Done"); - } - - public boolean selectGroup(String groupName, boolean failIfNotFound) - { - if (!_test.isElementPresent(Locator.css(".x4-tab-active").withText("Site Groups"))) - _test.goToSiteGroups(); - - _test.waitForElement(Locator.css(".groupPicker .x4-grid-body"), BaseWebDriverTest.WAIT_FOR_JAVASCRIPT); - if (_test.isElementPresent(Locator.xpath("//div[text()='" + groupName + "']"))) - { - _test.click(Locator.xpath("//div[text()='" + groupName + "']")); - _test._extHelper.waitForExtDialog(groupName + " Information"); - return true; - } - else if (failIfNotFound) - throw new NoSuchElementException("Group not found:" + groupName); - - return false; - } - - public void openGroupPermissionsDisplay(String groupName) - { - _test._ext4Helper.clickTabContainingText("Project Groups"); - // warning Adminstrators can apper multiple times - List refs = _test._ext4Helper.componentQuery("grid", Ext4CmpRef.class); - Ext4CmpRef ref = refs.get(0); - Long idx = (Long) ref.getEval("getStore().find(\"name\", \"" + groupName + "\")"); - ref.eval("getSelectionModel().select(" + idx + ")"); - } - - public void clickManageGroup(String groupName) - { - openGroupPermissionsDisplay(groupName); - _test.waitAndClickAndWait(Locator.tagContainingText("a", "manage group")); - _test.waitForElement(Locator.name("names")); - } - - public void clickManageSiteGroup(String groupName) - { - _test._ext4Helper.clickTabContainingText("Site Groups"); - // warning Adminstrators can apper multiple times - List refs = _test._ext4Helper.componentQuery("grid", Ext4CmpRef.class); - Ext4CmpRef ref = refs.get(0); - Long idx = (Long) ref.getEval("getStore().find(\"name\", \"" + groupName + "\")"); - ref.eval("getSelectionModel().select(" + idx + ")"); - _test.waitAndClickAndWait(Locator.tagContainingText("a", "manage group")); - _test.waitForElement(Locator.name("names")); - } - - @LogMethod - public PermissionsEditor createPermissionsGroup(@LoggedParam String groupName, String... memberNames) - { - createPermissionsGroup(groupName); - addUsersToGroup(groupName, memberNames); - return enterPermissionsUI(); - } - - @LogMethod(quiet = true) - public void dragGroupToRole(@LoggedParam String group, @LoggedParam String srcRole, @LoggedParam String destRole, BaseWebDriverTest _test) - { - Actions builder = new Actions(_test.getDriver()); - builder - .clickAndHold(Locator.permissionButton(group, srcRole).findElement(_test.getDriver())) - .moveToElement(Locator.xpath("//div[contains(@class, 'rolepanel')][.//h3[text()='" + destRole + "']]/div/div").findElement(_test.getDriver())) - .release() - .build().perform(); - - _test.waitForElementToDisappear(Locator.permissionButton(group, srcRole), BaseWebDriverTest.WAIT_FOR_JAVASCRIPT); - _test.waitForElement(Locator.permissionButton(group, destRole)); - } - - public boolean isUserInGroup(String user, String groupName, PrincipalType principalType) - { - _test._ext4Helper.clickTabContainingText("Project Groups"); - _test.waitForElement(Locator.css(".groupPicker"), BaseWebDriverTest.WAIT_FOR_JAVASCRIPT); - _test.waitAndClick(Locator.xpath("//div[text()='" + groupName + "']")); - _test._extHelper.waitForExtDialog(groupName + " Information"); - boolean ret; - if (principalType == PrincipalType.USER) - ret = _test.isElementPresent(Locator.xpath("//table[contains(@class, 'userinfo')]//td[starts-with(text(), '" + user + "')]")); - else - ret = _test.isElementPresent(Locator.linkContainingText(user)); - _test.clickButton("Done", 0); - _test._extHelper.waitForExtDialogToDisappear(groupName + " Information"); - return ret; - } - - public void selectGroup(String groupName) - { - selectGroup(groupName, true); - } - - public boolean doesGroupExist(String groupName) - { - _test._ext4Helper.clickTabContainingText("Project Groups"); - _test.waitForText("Member Groups"); - List refs = _test._ext4Helper.componentQuery("grid", Ext4CmpRef.class); - Ext4CmpRef ref = refs.get(0); - Long idx = (Long) ref.getEval("getStore().find(\"name\", \"" + groupName + "\")"); - return (idx >= 0); - } - - public boolean doesPermissionExist(String groupName, String permissionSetting) - { - waitForReady(); - return _test.waitForElement(Locator.permissionButton(groupName, permissionSetting), BaseWebDriverTest.WAIT_FOR_JAVASCRIPT, false); - } - - private void waitForReady() - { - _test.waitForElement(Locators.pageSignal(READY_SIGNAL), BaseWebDriverTest.WAIT_FOR_JAVASCRIPT); - } - - @LogMethod - private void addUsersToGroup(String groupName, @LoggedParam String... userNames) - { - clickManageGroup(groupName); - - _test.uncheckCheckbox(Locator.name("sendEmail")); - _test.setFormElement(Locator.name("names"), String.join("\n", userNames)); - _test.clickButton("Update Group Membership"); - } -} diff --git a/src/org/labkey/test/pages/admin/PermissionsPage.java b/src/org/labkey/test/pages/admin/PermissionsPage.java index 201044bc85..bbc6087052 100644 --- a/src/org/labkey/test/pages/admin/PermissionsPage.java +++ b/src/org/labkey/test/pages/admin/PermissionsPage.java @@ -15,6 +15,7 @@ */ package org.labkey.test.pages.admin; +import org.jetbrains.annotations.NotNull; import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; import org.labkey.test.Locators; @@ -61,6 +62,7 @@ public static PermissionsPage beginAt(WebDriverWrapper driver, String containerP @Override protected void waitForPage() { + waitForElement(SIGNAL_LOC, BaseWebDriverTest.WAIT_FOR_JAVASCRIPT); waitForElement(Locator.tag("table").withAttributeContaining("id", "labkey-principalcombo-")); } @@ -69,6 +71,15 @@ public void clickSaveAndFinish() clickAndWait(elementCache().saveAndFinishButton); } + public static PermissionsPage enterPermissionsUI(WebDriverWrapper test) + { + if (!test.isElementPresent(SIGNAL_LOC)) + { + test.clickAdminMenuItem("Folder", "Permissions"); + } + return new PermissionsPage(test.getDriver()); + } + public PermissionsPage selectFolder(String folderName) { clickAndWait(Locator.linkWithText(folderName).withClass("x4-tree-node-text")); @@ -100,6 +111,12 @@ else if (!perm.contains(".")) return perm; } + @NotNull + private static Locator.XPathLocator rolePanelLoc(String permissionString) + { + return Locator.xpath("//div[contains(@class, 'rolepanel')][.//h3[text()='" + permissionString + "']]"); + } + public PermissionsPage checkInheritedPermissions() { checkCheckbox(elementCache().inheritedCheckbox); @@ -174,14 +191,13 @@ private void _setPermissions(String userOrGroupName, String permissionString, St } } - private PermissionsPage _selectPermission(String userOrGroupName, String group, String permissionString) + private void _selectPermission(String userOrGroupName, String group, String permissionString) { - Locator.XPathLocator roleCombo = Locator.xpath("//div[contains(@class, 'rolepanel')][.//h3[text()='" + permissionString + "']]"); + Locator.XPathLocator roleCombo = rolePanelLoc(permissionString); waitForElement(roleCombo); scrollIntoView(roleCombo); _ext4Helper.selectComboBoxItem(roleCombo, Ext4Helper.TextMatchTechnique.STARTS_WITH, group); waitForElement(Locator.permissionButton(userOrGroupName, permissionString)); - return this; } public PermissionsPage removeSiteGroupPermission(String groupName, String permissionString) @@ -206,6 +222,24 @@ public PermissionsPage _removePermission(String groupName, String permissionStri return this; } + public boolean isRoleEditable(String roleName) + { + WebElement rolePanel = rolePanelLoc(roleName).findElement(getDriver()); + boolean canAddMembers = Locator.tag("input").findElement(rolePanel).isEnabled(); + List memberButton = Locator.tagWithClass("a", "x4-btn").findElements(rolePanel); + for (WebElement button : memberButton) + { + // Ensure consistency between adding and removing members + if (button.getAttribute("class").contains("disabled") == canAddMembers) + { + String able = canAddMembers ? "add" : "remove"; + String unable = canAddMembers ? "remove" : "add"; + throw new IllegalStateException("Able to %s members to role '%s' but can't %s them".formatted(able, roleName, unable)); + } + } + return canAddMembers; + } + /** * Adds a new or existing user to an existing group within an the current project * @@ -419,7 +453,7 @@ public boolean doesPermissionExist(String groupName, String permissionSetting) private PermissionsPage waitForReady() { - waitForElement(Locators.pageSignal(READY_SIGNAL), WAIT_FOR_JAVASCRIPT); + waitForElement(SIGNAL_LOC, WAIT_FOR_JAVASCRIPT); return this; } @@ -501,7 +535,7 @@ protected ElementCache newElementCache() return new ElementCache(); } - protected class ElementCache extends LabKeyPage.ElementCache + protected class ElementCache extends LabKeyPage.ElementCache { WebElement saveAndFinishButton = Locator.tagWithText("span", "Save and Finish") diff --git a/src/org/labkey/test/tests/SecurityTest.java b/src/org/labkey/test/tests/SecurityTest.java index d30e12beb0..d1d983c987 100644 --- a/src/org/labkey/test/tests/SecurityTest.java +++ b/src/org/labkey/test/tests/SecurityTest.java @@ -30,7 +30,7 @@ import org.labkey.test.WebTestHelper; import org.labkey.test.categories.BVT; import org.labkey.test.components.dumbster.EmailRecordTable; -import org.labkey.test.pages.PermissionsEditor; +import org.labkey.test.pages.admin.PermissionsPage; import org.labkey.test.pages.user.ShowUsersPage; import org.labkey.test.util.ApiPermissionsHelper; import org.labkey.test.util.DataRegionTable; @@ -591,7 +591,7 @@ protected void impersonationTest() // 17037 Regression impersonate(PROJECT_ADMIN_USER); clickProject(PROJECT_NAME); - PermissionsEditor.enterPermissionsUI(this); + PermissionsPage.enterPermissionsUI(this); _ext4Helper.clickTabContainingText("Project Groups"); assertTextPresent("Total Users"); stopImpersonating(); diff --git a/src/org/labkey/test/tests/core/security/AppAdminRoleTest.java b/src/org/labkey/test/tests/core/security/AppAdminRoleTest.java index 2026e96e2e..262279452f 100644 --- a/src/org/labkey/test/tests/core/security/AppAdminRoleTest.java +++ b/src/org/labkey/test/tests/core/security/AppAdminRoleTest.java @@ -24,7 +24,7 @@ import org.labkey.test.TestTimeoutException; import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Daily; -import org.labkey.test.pages.PermissionsEditor; +import org.labkey.test.pages.admin.PermissionsPage; import org.labkey.test.util.ApiPermissionsHelper; import org.labkey.test.util.LogMethod; import org.labkey.test.util.PasswordUtil; @@ -169,10 +169,10 @@ public void testModifyPrivilegedGroup() public void testPermissionsUi() { impersonate(APP_ADMIN); - PermissionsEditor permissionsEditor; + PermissionsPage permissionsEditor; log("Test adding roles"); - permissionsEditor = PermissionsEditor.beginAt(this, "/"); + permissionsEditor = PermissionsPage.beginAt(this, "/"); for (String role : List.of(SITE_ADMIN_ROLE, DEVELOPER_ROLE, IMP_TROUBLESHOOTER_ROLE)) { checker().verifyFalse("App admin user shouldn't be able to modify " + role + " role", permissionsEditor.isRoleEditable(role)); diff --git a/src/org/labkey/test/util/UIPermissionsHelper.java b/src/org/labkey/test/util/UIPermissionsHelper.java index c114eb7b01..14ee8fe086 100644 --- a/src/org/labkey/test/util/UIPermissionsHelper.java +++ b/src/org/labkey/test/util/UIPermissionsHelper.java @@ -19,7 +19,7 @@ import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; import org.labkey.test.WebTestHelper; -import org.labkey.test.pages.PermissionsEditor; +import org.labkey.test.pages.admin.PermissionsPage; import org.labkey.test.util.ext4cmp.Ext4CmpRef; import org.openqa.selenium.Keys; import org.openqa.selenium.NoSuchElementException; @@ -267,9 +267,9 @@ public void addUserToProjGroup(String userName, String projectName, String group } //addUserToProjGroup() @Deprecated - public void enterPermissionsUI() + public PermissionsPage enterPermissionsUI() { - PermissionsEditor.enterPermissionsUI(_driver); + return PermissionsPage.enterPermissionsUI(_driver); } public void exitPermissionsUI()