From 8a25837c36071d799e65dc5686fda53736b2a852 Mon Sep 17 00:00:00 2001 From: anttil <anttil> Date: Tue, 26 Jun 2012 10:32:52 +0000 Subject: [PATCH] BIS-100 / SP-138: Add authorization checks for space and material creation to AtomicOperationsPredicate. SVN: 25859 --- .../predicate/AtomicOperationsPredicate.java | 53 +++++++++++++++++++ .../systemtest/EntityOperationTest.java | 21 +++----- 2 files changed, 61 insertions(+), 13 deletions(-) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/AtomicOperationsPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/AtomicOperationsPredicate.java index 190341ae9a0..55e3bdcd779 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/AtomicOperationsPredicate.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/AtomicOperationsPredicate.java @@ -23,11 +23,13 @@ import ch.systemsx.cisd.openbis.generic.shared.authorization.IAuthorizationDataP import ch.systemsx.cisd.openbis.generic.shared.authorization.RoleWithIdentifier; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleCode; import ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails; import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO; import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO; import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData; import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; +import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE; import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; @@ -142,10 +144,61 @@ public class AtomicOperationsPredicate extends AbstractPredicate<AtomicEntityOpe { result = evaluateDataSetUpdatesPredicate(); } + if (result.equals(Status.OK)) + { + result = evaluateSpaceRegistrations(); + } + if (result.equals(Status.OK)) + { + result = evaluateMaterialRegistrations(); + } return result; } + private Status evaluateSpaceRegistrations() + { + if (value.getSpaceRegistrations() != null && value.getSpaceRegistrations().size() > 0) + { + return isInstanceEtlServer(person); + } else + { + return Status.OK; + } + } + + private Status evaluateMaterialRegistrations() + { + if (value.getMaterialRegistrations() != null + && value.getMaterialRegistrations().size() > 0) + { + return isInstanceEtlServer(person); + } else + { + return Status.OK; + } + } + + private Status isInstanceEtlServer(PersonPE person) + { + for (RoleAssignmentPE role : person.getRoleAssignments()) + { + if (role.getSpace() == null) + { + RoleCode roleCode = role.getRole(); + if (RoleCode.ADMIN.equals(roleCode) || RoleCode.ETL_SERVER.equals(roleCode)) + { + return Status.OK; + } + } + } + return Status + .createError( + false, + "None of method roles '[INSTANCE_ETL_SERVER, INSTANCE_ADMIN]' could be found in roles of user '" + + person.getUserId() + "'."); + } + private Status evaluateExperimentUpdatePredicate() { for (ExperimentUpdatesDTO experimentUpdates : value.getExperimentUpdates()) diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityOperationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityOperationTest.java index 7ab242acd2e..4c075d45d7d 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityOperationTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityOperationTest.java @@ -296,15 +296,15 @@ public class EntityOperationTest extends SystemTestCase assertEquals("CISD/TEST_SPACE", space.toString()); } - @Test - public void testCreateSpaceAsInstanceAdminButLoginAsSpaceETLServer() + @Test(expectedExceptions = + { AuthorizationFailureException.class }) + public void testCreateSpaceAsInstanceAdminButLoginAsSpaceETLServerFails() { String sessionToken = authenticateAs(SPACE_ETL_SERVER_FOR_A); AtomicEntityOperationDetails eo = new EntityOperationBuilder().user(INSTANCE_ADMIN).space("TEST_SPACE").create(); - AtomicEntityOperationResult result = etlService.performEntityOperations(sessionToken, eo); - assertEquals(1, result.getSpacesCreatedCount()); + etlService.performEntityOperations(sessionToken, eo); } @Test @@ -338,8 +338,9 @@ public class EntityOperationTest extends SystemTestCase assertEquals("[GENE_SYMBOL: 42]", material.getProperties().toString()); } - @Test - public void testCreateMaterialAsInstanceAdminButLoginAsSpaceETLServer() + @Test(expectedExceptions = + { AuthorizationFailureException.class }) + public void testCreateMaterialAsInstanceAdminButLoginAsSpaceETLServerFails() { String sessionToken = authenticateAs(SPACE_ETL_SERVER_FOR_A); AtomicEntityOperationDetails eo = @@ -350,13 +351,7 @@ public class EntityOperationTest extends SystemTestCase new MaterialBuilder().code("ALPHA").property("GENE_SYMBOL", "42") .getMaterial()).create(); - AtomicEntityOperationResult result = etlService.performEntityOperations(sessionToken, eo); - assertEquals(1, result.getMaterialsCreatedCount()); - - Material material = - etlService.tryGetMaterial(sessionToken, new MaterialIdentifier("ALPHA", "GENE")); - assertEquals("ALPHA (GENE)", material.toString()); - assertEquals("[GENE_SYMBOL: 42]", material.getProperties().toString()); + etlService.performEntityOperations(sessionToken, eo); } @Test -- GitLab