Skip to content

Commit 494f207

Browse files
committed
Unit test for restricted API keys
1 parent c4c67ed commit 494f207

1 file changed

Lines changed: 56 additions & 0 deletions

File tree

api/src/org/labkey/api/security/ApiKeyManager.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.jetbrains.annotations.Nullable;
2323
import org.junit.Assert;
2424
import org.junit.Test;
25+
import org.labkey.api.data.ContainerManager;
2526
import org.labkey.api.data.CoreSchema;
2627
import org.labkey.api.data.DbScope;
2728
import org.labkey.api.data.DbScope.Transaction;
@@ -39,6 +40,13 @@
3940
import org.labkey.api.query.FieldKey;
4041
import org.labkey.api.security.UserManager.SessionHandler;
4142
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;
4250
import org.labkey.api.security.roles.Role;
4351
import org.labkey.api.security.roles.RoleManager;
4452
import org.labkey.api.settings.AppProps;
@@ -62,6 +70,7 @@
6270
import java.util.Map;
6371
import java.util.Objects;
6472
import java.util.Set;
73+
import java.util.stream.Stream;
6574

6675
import static org.labkey.api.util.IntegerUtils.asInteger;
6776

@@ -362,6 +371,53 @@ public void testTransaction()
362371
ApiKeyManager.get().deleteKey(apikey);
363372
assertNull(ApiKeyManager.get().authenticateFromApiKey(apikey));
364373
}
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+
}
365421
}
366422

367423
public static class ApiKeyMaintenanceTask implements MaintenanceTask

0 commit comments

Comments
 (0)