|
22 | 22 | import org.jetbrains.annotations.Nullable; |
23 | 23 | import org.junit.Assert; |
24 | 24 | import org.junit.Test; |
| 25 | +import org.labkey.api.data.ContainerManager; |
25 | 26 | import org.labkey.api.data.CoreSchema; |
26 | 27 | import org.labkey.api.data.DbScope; |
27 | 28 | import org.labkey.api.data.DbScope.Transaction; |
|
39 | 40 | import org.labkey.api.query.FieldKey; |
40 | 41 | import org.labkey.api.security.UserManager.SessionHandler; |
41 | 42 | import org.labkey.api.security.ValidEmail.InvalidEmailException; |
| 43 | +import org.labkey.api.security.permissions.AdminPermission; |
| 44 | +import org.labkey.api.security.permissions.DeletePermission; |
| 45 | +import org.labkey.api.security.permissions.InsertPermission; |
| 46 | +import org.labkey.api.security.permissions.ReadPermission; |
| 47 | +import org.labkey.api.security.permissions.UpdatePermission; |
| 48 | +import org.labkey.api.security.roles.EditorRole; |
| 49 | +import org.labkey.api.security.roles.ReaderRole; |
42 | 50 | import org.labkey.api.security.roles.Role; |
43 | 51 | import org.labkey.api.security.roles.RoleManager; |
44 | 52 | import org.labkey.api.settings.AppProps; |
|
62 | 70 | import java.util.Map; |
63 | 71 | import java.util.Objects; |
64 | 72 | import java.util.Set; |
| 73 | +import java.util.stream.Stream; |
65 | 74 |
|
66 | 75 | import static org.labkey.api.util.IntegerUtils.asInteger; |
67 | 76 |
|
@@ -362,6 +371,53 @@ public void testTransaction() |
362 | 371 | ApiKeyManager.get().deleteKey(apikey); |
363 | 372 | assertNull(ApiKeyManager.get().authenticateFromApiKey(apikey)); |
364 | 373 | } |
| 374 | + |
| 375 | + private record UserAndKey(User user, String apiKey){} |
| 376 | + |
| 377 | + @Test |
| 378 | + public void testRoleRestrictions() |
| 379 | + { |
| 380 | + User admin = TestContext.get().getUser(); |
| 381 | + UserAndKey readerUAK = createApiKeyAndRetrieveUser(admin, ReaderRole.class); |
| 382 | + User reader = readerUAK.user(); |
| 383 | + UserAndKey editorUAK = createApiKeyAndRetrieveUser(admin, EditorRole.class); |
| 384 | + User editor = editorUAK.user(); |
| 385 | + |
| 386 | + ContainerManager.getAllChildren(ContainerManager.getRoot(), admin, AdminPermission.class).stream() |
| 387 | + .limit(5) |
| 388 | + .forEach(child -> { |
| 389 | + assertTrue(child.hasPermission(admin, AdminPermission.class)); |
| 390 | + assertFalse(child.hasPermission(editor, AdminPermission.class)); |
| 391 | + assertFalse(child.hasPermission(reader, AdminPermission.class)); |
| 392 | + Stream.of(DeletePermission.class, UpdatePermission.class, InsertPermission.class) |
| 393 | + .forEach(perm -> { |
| 394 | + assertTrue(child.hasPermission(admin, perm)); |
| 395 | + assertTrue(child.hasPermission(editor, perm)); |
| 396 | + assertFalse(child.hasPermission(reader, perm)); |
| 397 | + }); |
| 398 | + assertTrue(child.hasPermission(admin, ReadPermission.class)); |
| 399 | + assertTrue(child.hasPermission(editor, ReadPermission.class)); |
| 400 | + assertTrue(child.hasPermission(reader, ReadPermission.class)); |
| 401 | + }); |
| 402 | + |
| 403 | + ApiKeyManager.get().deleteKey(readerUAK.apiKey()); |
| 404 | + ApiKeyManager.get().deleteKey(editorUAK.apiKey()); |
| 405 | + assertNull(ApiKeyManager.get().authenticateFromApiKey(readerUAK.apiKey())); |
| 406 | + assertNull(ApiKeyManager.get().authenticateFromApiKey(editorUAK.apiKey())); |
| 407 | + } |
| 408 | + |
| 409 | + private UserAndKey createApiKeyAndRetrieveUser(User user, Class<? extends Role> restrictionRole) |
| 410 | + { |
| 411 | + String apiKey = ApiKeyManager.get().createKey(user, 10, "Created by ApiKeyManager.TestCase", restrictionRole); |
| 412 | + ApiKeyAuthentication auth = ApiKeyManager.get().authenticateFromApiKey(apiKey); |
| 413 | + assertNotNull(auth); |
| 414 | + User restrictedUser = auth.getUser(); |
| 415 | + assertNotNull(restrictedUser); |
| 416 | + assertEquals(user.getUserId(), restrictedUser.getUserId()); |
| 417 | + assertTrue(restrictedUser instanceof PermissionsRestrictedUser); |
| 418 | + |
| 419 | + return new UserAndKey(restrictedUser, apiKey); |
| 420 | + } |
365 | 421 | } |
366 | 422 |
|
367 | 423 | public static class ApiKeyMaintenanceTask implements MaintenanceTask |
|
0 commit comments