Skip to content

Commit 82daf70

Browse files
committed
Merge remote-tracking branch 'origin/develop' into fb_crossSampleTypeWarnings
2 parents 990f510 + 31a5b5c commit 82daf70

7 files changed

Lines changed: 107 additions & 42 deletions

src/org/labkey/test/tests/AbstractAdminConsoleTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.List;
2626

2727
import static org.labkey.test.util.PermissionsHelper.APP_ADMIN_ROLE;
28+
import static org.labkey.test.util.PermissionsHelper.TROUBLESHOOTER_ROLE;
2829

2930
public abstract class AbstractAdminConsoleTest extends BaseWebDriverTest
3031
{
@@ -79,7 +80,7 @@ protected void createTestUsers()
7980

8081
int troubleshooterId = _userHelper.createUser(TROUBLESHOOTER_USER, true, false).getUserId();
8182
setInitialPassword(troubleshooterId);
82-
apiPermissionsHelper.addMemberToRole(TROUBLESHOOTER_USER, "Troubleshooter", PermissionsHelper.MemberType.user, "/");
83+
apiPermissionsHelper.addMemberToRole(TROUBLESHOOTER_USER, TROUBLESHOOTER_ROLE, PermissionsHelper.MemberType.user, "/");
8384
}
8485

8586
@Override

src/org/labkey/test/tests/AdminConsoleNavigationTest.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,13 @@
3333

3434
import static org.junit.Assert.assertFalse;
3535
import static org.junit.Assert.assertTrue;
36+
import static org.labkey.test.util.PermissionsHelper.TROUBLESHOOTER_ROLE;
3637

3738
@Category({Git.class})
3839
@BaseWebDriverTest.ClassTimeout(minutes = 6)
3940
public class AdminConsoleNavigationTest extends BaseWebDriverTest
4041
{
41-
private static final String TROUBLESHOOTER = "troubleshooter@adminconsolelinks.test";
42+
private static final String TROUBLESHOOTER_USER = "troubleshooter@adminconsolelinks.test";
4243
private static final String NON_ADMIN = "nonadmin@adminconsolelinks.test";
4344

4445
public ApiPermissionsHelper _apiPermissionsHelper = new ApiPermissionsHelper(this);
@@ -52,16 +53,16 @@ public static void setupProject()
5253

5354
private void doSetup()
5455
{
55-
_userHelper.createUser(TROUBLESHOOTER);
56-
_apiPermissionsHelper.addMemberToRole(TROUBLESHOOTER, "Troubleshooter", PermissionsHelper.MemberType.user, "/");
56+
_userHelper.createUser(TROUBLESHOOTER_USER);
57+
_apiPermissionsHelper.addMemberToRole(TROUBLESHOOTER_USER, TROUBLESHOOTER_ROLE, PermissionsHelper.MemberType.user, "/");
5758

5859
_userHelper.createUser(NON_ADMIN);
5960
}
6061

6162
@Override
6263
protected void doCleanup(boolean afterTest)
6364
{
64-
_userHelper.deleteUsers(false, TROUBLESHOOTER, NON_ADMIN);
65+
_userHelper.deleteUsers(false, TROUBLESHOOTER_USER, NON_ADMIN);
6566
}
6667

6768
@Test
@@ -120,7 +121,7 @@ public void testTroubleshooterLinkAccess()
120121
"Profiler" //Profiler can be edited by the troubleshooter
121122
));
122123
ShowAdminPage adminConsole = goToAdminConsole();
123-
impersonate(TROUBLESHOOTER);
124+
impersonate(TROUBLESHOOTER_USER);
124125
Map<String, String> linkHrefs = new LinkedHashMap<>();
125126
List<WebElement> troubleshooterLinks = adminConsole.getAllAdminConsoleLinks();
126127
assertTrue(String.format("Failed sanity check. Only found %s admin links. There should be more.", troubleshooterLinks.size()), troubleshooterLinks.size() > 10);

src/org/labkey/test/tests/core/admin/CspResourceHostsTest.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,20 @@
2727
import static org.assertj.core.api.Assertions.assertThat;
2828
import static org.junit.Assert.assertEquals;
2929
import static org.labkey.test.util.PermissionsHelper.MemberType.user;
30+
import static org.labkey.test.util.PermissionsHelper.TROUBLESHOOTER_ROLE;
3031

3132
@Category({Daily.class})
3233
public class CspResourceHostsTest extends BaseWebDriverTest
3334
{
3435
private static final String APP_ADMIN = "csp_app_admin@cspresourcehoststest.test";
35-
private static final String TROUBLESHOOTER = "csp_troubleshooter@cspresourcehoststest.test";
36+
private static final String TROUBLESHOOTER_USER = "csp_troubleshooter@cspresourcehoststest.test";
3637

3738
private final CspConfigHelper _cspConfigHelper = new CspConfigHelper(this);
3839

3940
@Override
4041
protected void doCleanup(boolean afterTest)
4142
{
42-
_userHelper.deleteUsers(afterTest, APP_ADMIN, TROUBLESHOOTER);
43+
_userHelper.deleteUsers(afterTest, APP_ADMIN, TROUBLESHOOTER_USER);
4344
}
4445

4546
@BeforeClass
@@ -53,10 +54,10 @@ public static void setupProject()
5354
private void doSetup()
5455
{
5556
_userHelper.createUser(APP_ADMIN);
56-
_userHelper.createUser(TROUBLESHOOTER);
57+
_userHelper.createUser(TROUBLESHOOTER_USER);
5758
ApiPermissionsHelper apiPermissionsHelper = new ApiPermissionsHelper(this);
5859
apiPermissionsHelper.addUserAsAppAdmin(APP_ADMIN);
59-
apiPermissionsHelper.addMemberToRole(TROUBLESHOOTER, "Troubleshooter", user, null);
60+
apiPermissionsHelper.addMemberToRole(TROUBLESHOOTER_USER, TROUBLESHOOTER_ROLE, user, null);
6061
}
6162

6263
@Before
@@ -84,7 +85,7 @@ public void testTroubleshooterPermissions() throws Exception
8485
checker().verifyEquals("Defined directives", expectedHosts, externalSourcesPage.getExistingHosts());
8586
checker().screenShotIfNewError("site_admin_csp");
8687

87-
impersonate(TROUBLESHOOTER);
88+
impersonate(TROUBLESHOOTER_USER);
8889
externalSourcesPage = ShowAdminPage.beginAt(this).clickAllowedExternalResourceHosts();
8990

9091
buttons = getTexts(Locator.lkButton().findElements(getDriver()));

src/org/labkey/test/tests/core/security/ImpersonatingTroubleshooterRoleTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public void testModifyPrivilegedPermission() throws Exception
7070
public void testAdminConsoleVisibility()
7171
{
7272
signOut();
73-
signIn(TROUBLESHOOTER);
73+
signIn(TROUBLESHOOTER_USER);
7474
log("Verify permissions from troubleshooter");
7575
verifySitePermissionSetting(false);
7676

@@ -81,12 +81,12 @@ public void testAdminConsoleVisibility()
8181

8282
private ApiPermissionsHelper apiAsTroubleshooter()
8383
{
84-
return new ApiPermissionsHelper(this, () -> new Connection(WebTestHelper.getBaseURL(), TROUBLESHOOTER, PasswordUtil.getPassword()));
84+
return new ApiPermissionsHelper(this, () -> new Connection(WebTestHelper.getBaseURL(), TROUBLESHOOTER_USER, PasswordUtil.getPassword()));
8585
}
8686

8787
private ApiPermissionsHelper apiAsImpersonatingSiteAdmin() throws IOException, CommandException
8888
{
89-
Connection connection = new Connection(WebTestHelper.getBaseURL(), TROUBLESHOOTER, PasswordUtil.getPassword());
89+
Connection connection = new Connection(WebTestHelper.getBaseURL(), TROUBLESHOOTER_USER, PasswordUtil.getPassword());
9090
new ImpersonateRolesCommand(toRole(SITE_ADMIN_ROLE)).execute(connection, "/");
9191
return new ApiPermissionsHelper(this, () -> connection);
9292
}

src/org/labkey/test/tests/core/security/TroubleshooterRoleTest.java

Lines changed: 77 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,39 @@
22

33
import org.apache.commons.collections4.IteratorUtils;
44
import org.apache.commons.io.FileUtils;
5+
import org.jetbrains.annotations.Nullable;
56
import org.junit.BeforeClass;
67
import org.junit.Test;
78
import org.junit.experimental.categories.Category;
89
import org.labkey.test.BaseWebDriverTest;
910
import org.labkey.test.Locator;
11+
import org.labkey.test.Locators;
1012
import org.labkey.test.TestTimeoutException;
13+
import org.labkey.test.WebTestHelper;
1114
import org.labkey.test.categories.Git;
1215
import org.labkey.test.pages.core.admin.ShowAdminPage;
1316
import org.labkey.test.pages.core.admin.ShowAuditLogPage;
1417
import org.labkey.test.params.list.IntListDefinition;
18+
import org.labkey.test.util.AbstractDataRegionExportOrSignHelper;
1519
import org.labkey.test.util.ApiPermissionsHelper;
20+
import org.labkey.test.util.DataRegionExportHelper;
1621
import org.labkey.test.util.DataRegionTable;
17-
import org.labkey.test.util.PermissionsHelper;
22+
import org.labkey.test.util.SummaryStatisticsHelper;
23+
import org.openqa.selenium.By;
24+
import org.openqa.selenium.support.ui.ExpectedConditions;
1825

1926
import java.io.File;
2027
import java.util.Arrays;
2128
import java.util.List;
2229

2330
import static org.junit.Assert.assertTrue;
31+
import static org.labkey.test.util.PermissionsHelper.TROUBLESHOOTER_ROLE;
2432

2533
@Category({Git.class})
2634
@BaseWebDriverTest.ClassTimeout(minutes = 4)
2735
public class TroubleshooterRoleTest extends BaseWebDriverTest
2836
{
29-
protected static final String TROUBLESHOOTER = "troubleshooter@troubleshooter.test";
37+
protected static final String TROUBLESHOOTER_USER = "troubleshooter@troubleshooter.test";
3038
protected int _troubleShooterId;
3139

3240
@BeforeClass
@@ -39,30 +47,30 @@ public static void setupProject()
3947
@Override
4048
protected void doCleanup(boolean afterTest) throws TestTimeoutException
4149
{
42-
_userHelper.deleteUsers(false, TROUBLESHOOTER);
50+
_userHelper.deleteUsers(false, TROUBLESHOOTER_USER);
4351
_containerHelper.deleteProject(getProjectName(), afterTest);
4452
}
4553

4654
protected void doSetup()
4755
{
48-
_troubleShooterId = _userHelper.createUser(TROUBLESHOOTER).getUserId();
56+
_troubleShooterId = _userHelper.createUser(TROUBLESHOOTER_USER).getUserId();
4957
ApiPermissionsHelper apiPermissionsHelper = new ApiPermissionsHelper(this);
50-
apiPermissionsHelper.addMemberToRole(TROUBLESHOOTER, getRole(), PermissionsHelper.MemberType.user,"/");
58+
apiPermissionsHelper.addMemberToRole(_troubleShooterId, getRole(), "/");
5159
_containerHelper.createProject(getProjectName());
5260
}
5361

5462
protected String getRole()
5563
{
56-
return "Troubleshooter";
64+
return TROUBLESHOOTER_ROLE;
5765
}
5866

5967
@Test
6068
public void testAuditLogsIsAccessible() throws Exception
6169
{
62-
// Ensure that there is at least on event to see
70+
// Ensure that there is at least one event to see
6371
new IntListDefinition("AuditList", "id").create(createDefaultConnection(), getProjectName());
6472

65-
impersonate(TROUBLESHOOTER);
73+
impersonate(TROUBLESHOOTER_USER);
6674
ShowAdminPage showAdminPage = goToAdminConsole().goToSettingsSection();
6775

6876
log("Verifying audit log link is present");
@@ -82,7 +90,7 @@ public void testAuditLogsIsAccessible() throws Exception
8290
@Test
8391
public void testAdminConsoleVisibility()
8492
{
85-
impersonate(TROUBLESHOOTER);
93+
impersonate(TROUBLESHOOTER_USER);
8694

8795
log("Verify permissions from troubleshooter");
8896
verifySitePermissionSetting(false);
@@ -93,20 +101,19 @@ public void testAdminConsoleVisibility()
93101
verifySitePermissionSetting(true);
94102
}
95103

96-
/**
97-
* Issue 47508: auditLog table visibility is inconsistent
98-
* Assert broken behavior to prompt a test update once issue is fixed.
99-
*/
104+
// Verify fix for Issue 47508 / GitHub Issue #26: auditLog table visibility is inconsistent
100105
@Test
101106
public void testAllAuditTableVisibility()
102107
{
103-
impersonate(TROUBLESHOOTER);
108+
impersonate(TROUBLESHOOTER_USER);
104109
ShowAdminPage showAdminPage = goToAdminConsole().goToSettingsSection();
105110

106-
log("Verify the export file is non empty");
111+
log("Verify \"Group and role\" audit event table is viewable");
107112
ShowAuditLogPage auditLogPage = showAdminPage.clickAuditLog();
108113
auditLogPage.selectView("Group and role events");
109-
assertTextPresent("You do not have permission to see this data.");
114+
assertTextNotPresent("You do not have permission to see this data.");
115+
DataRegionTable logTable = auditLogPage.getLogTable();
116+
assertTrue(logTable.getDataRowCount() > 0);
110117
}
111118

112119
protected void verifySitePermissionSetting(boolean canSave)
@@ -132,6 +139,60 @@ protected void verifySitePermissionSetting(boolean canSave)
132139
isElementPresent(Locator.button("Save and Finish")));
133140
}
134141

142+
// Verifications for GitHub Issue #785 - Troubleshooters should have read access in the root (but not elsewhere)
143+
@Test
144+
public void testQueryAccessInRoot()
145+
{
146+
goToAdminConsole();
147+
impersonate(TROUBLESHOOTER_USER);
148+
testQueryAccess();
149+
stopImpersonating();
150+
151+
goToAdminConsole();
152+
impersonateRole(TROUBLESHOOTER_ROLE);
153+
testQueryAccess();
154+
stopImpersonating();
155+
}
156+
157+
private void testQueryAccess()
158+
{
159+
// Verify that Troubleshooters can access the schema browser and view an arbitrary query in the root
160+
goToSchemaBrowser(null, false);
161+
DataRegionTable dataRegionTable = viewQueryData("core", "Modules");
162+
dataRegionTable.showAll();
163+
int rowCount = dataRegionTable.getDataRowCount();
164+
assertTrue(rowCount > 6);
165+
166+
// Verify that basic summary statistics work
167+
dataRegionTable.setSummaryStatistic("Name", SummaryStatisticsHelper.BASE_STAT_COUNT, String.valueOf(rowCount));
168+
169+
// Verify that exports using POST work
170+
DataRegionExportHelper exportHelper = new DataRegionExportHelper(dataRegionTable);
171+
exportHelper.exportExcel(AbstractDataRegionExportOrSignHelper.ExcelFileType.XLSX);
172+
exportHelper.exportScript(DataRegionExportHelper.ScriptExportType.JAVA);
173+
174+
// Troubleshooters should NOT have read access outside the root
175+
goToProjectHome();
176+
assertTextPresent("User does not have permission to perform this operation.");
177+
goToSchemaBrowser(getProjectName(), true);
178+
}
179+
180+
// Troubleshooters don't get the "Go To Module" menu item, so can't use goToSchemaBrowser()
181+
public void goToSchemaBrowser(@Nullable String container, boolean expectPermissionError)
182+
{
183+
beginAt(WebTestHelper.buildRelativeUrl("query", container,"begin"));
184+
185+
if (expectPermissionError)
186+
{
187+
assertTextPresent("User does not have permission to perform this operation.");
188+
}
189+
else
190+
{
191+
shortWait().until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("div.lk-sb-instructions")));
192+
waitForElement(Locators.pageSignal("queryTreeRendered"));
193+
}
194+
}
195+
135196
@Override
136197
protected String getProjectName()
137198
{

src/org/labkey/test/util/ApiPermissionsHelper.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -444,11 +444,16 @@ public void addMemberToRole(String userOrGroupName, String roleName, MemberType
444444
}
445445

446446
public void addMemberToRole(String userOrGroupName, String roleName, MemberType memberType, String container)
447+
{
448+
Integer principalId = getPrincipalId(userOrGroupName, memberType, container);
449+
addMemberToRole(principalId, roleName, container);
450+
}
451+
452+
public void addMemberToRole(Integer principalId, String roleName, String container)
447453
{
448454
AddAssignmentCommand command = new AddAssignmentCommand();
449455
Connection connection = getConnection();
450456

451-
Integer principalId = getPrincipalId(userOrGroupName, memberType, container);
452457
command.setPrincipalId(principalId);
453458
command.setRoleClassName(toRole(roleName));
454459

@@ -464,22 +469,17 @@ public void addMemberToRole(String userOrGroupName, String roleName, MemberType
464469

465470
public void addMemberToRoles(String userOrGroupName, List<String> roleNames, MemberType memberType)
466471
{
467-
roleNames.forEach(roleName -> {addMemberToRole(userOrGroupName, roleName, memberType);});
472+
roleNames.forEach(roleName -> addMemberToRole(userOrGroupName, roleName, memberType));
468473
}
469474

470475
protected Integer getPrincipalId(String userOrGroupName, MemberType principalType, String project)
471476
{
472-
switch (principalType)
477+
return switch (principalType)
473478
{
474-
case user:
475-
return getUserId(userOrGroupName);
476-
case group:
477-
return getProjectGroupId(userOrGroupName, project);
478-
case siteGroup:
479-
return getSiteGroupId(userOrGroupName);
480-
default:
481-
throw new IllegalArgumentException("Unknown principal type: " + principalType);
482-
}
479+
case user -> getUserId(userOrGroupName);
480+
case group -> getProjectGroupId(userOrGroupName, project);
481+
case siteGroup -> getSiteGroupId(userOrGroupName);
482+
};
483483
}
484484

485485
@Override

src/org/labkey/test/util/PermissionsHelper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public abstract class PermissionsHelper
3939
public static final String APP_ADMIN_ROLE = "Application Admin";
4040
public static final String DEVELOPER_ROLE = "Platform Developer";
4141
public static final String IMP_TROUBLESHOOTER_ROLE = "Impersonating Troubleshooter";
42+
public static final String TROUBLESHOOTER_ROLE = "Troubleshooter";
4243
public static final String PROJECT_ADMIN_ROLE = "Project Administrator";
4344
public static final String FOLDER_ADMIN_ROLE = "Folder Administrator";
4445
public static final String READER_ROLE = "Reader";

0 commit comments

Comments
 (0)