diff --git a/src/main/java/org/caosdb/server/transaction/Retrieve.java b/src/main/java/org/caosdb/server/transaction/Retrieve.java index e9a67f5ffccdea6be5e8f2c4a82e37590b38e862..04922d9c208280452b94ed051932757c910a6975 100644 --- a/src/main/java/org/caosdb/server/transaction/Retrieve.java +++ b/src/main/java/org/caosdb/server/transaction/Retrieve.java @@ -79,7 +79,7 @@ public class Retrieve extends Transaction<RetrieveContainer> { protected void postTransaction() { // generate Error for missing RETRIEVE:ENTITY Permission. for (final EntityInterface e : getContainer()) { - if (e.getEntityACL() != null) { + if (e.getEntityStatus() != EntityStatus.NONEXISTENT) { try { e.checkPermission(EntityPermission.RETRIEVE_ENTITY); } catch (final AuthorizationException exc) { diff --git a/src/test/java/org/caosdb/server/transaction/RetrieveTest.java b/src/test/java/org/caosdb/server/transaction/RetrieveTest.java new file mode 100644 index 0000000000000000000000000000000000000000..45e9e5ec32bb34ea5394ee2c691ed9d00d0c49e6 --- /dev/null +++ b/src/test/java/org/caosdb/server/transaction/RetrieveTest.java @@ -0,0 +1,78 @@ +package org.caosdb.server.transaction; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; +import org.caosdb.server.CaosDBServer; +import org.caosdb.server.ServerProperties; +import org.caosdb.server.accessControl.AnonymousAuthenticationToken; +import org.caosdb.server.accessControl.Role; +import org.caosdb.server.database.BackendTransaction; +import org.caosdb.server.database.access.Access; +import org.caosdb.server.database.backend.interfaces.RetrieveRoleImpl; +import org.caosdb.server.database.exceptions.TransactionException; +import org.caosdb.server.database.misc.TransactionBenchmark; +import org.caosdb.server.entity.EntityInterface; +import org.caosdb.server.entity.RetrieveEntity; +import org.caosdb.server.entity.container.RetrieveContainer; +import org.caosdb.server.entity.xml.IdAndServerMessagesOnlyStrategy; +import org.caosdb.server.permissions.EntityACLFactory; +import org.caosdb.server.utils.EntityStatus; +import org.caosdb.server.utils.ServerMessages; +import org.junit.BeforeClass; +import org.junit.Test; + +public class RetrieveTest { + + @BeforeClass + public static void setup() throws IOException { + CaosDBServer.initServerProperties(); + CaosDBServer.setProperty(ServerProperties.KEY_AUTH_OPTIONAL, "TRUE"); + CaosDBServer.initShiro(); + + BackendTransaction.setImpl(RetrieveRoleImpl.class, RetrieveRoleMockup.class); + } + + /** a mock-up which returns null */ + public static class RetrieveRoleMockup implements RetrieveRoleImpl { + + public RetrieveRoleMockup(Access a) {} + + @Override + public void setTransactionBenchmark(TransactionBenchmark b) {} + + @Override + public TransactionBenchmark getBenchmark() { + return null; + } + + @Override + public Role retrieve(String role) throws TransactionException { + return null; + } + } + + @Test + public void testMissingRetrievePermission() { + Subject subject = SecurityUtils.getSubject(); + subject.login(AnonymousAuthenticationToken.getInstance()); + EntityInterface entity = new RetrieveEntity(1234); + EntityACLFactory fac = new EntityACLFactory(); + fac.deny(AnonymousAuthenticationToken.PRINCIPAL, "RETRIEVE:ENTITY"); + entity.setEntityACL(fac.create()); + RetrieveContainer container = new RetrieveContainer(null, null, null, null); + assertTrue(entity.getMessages().isEmpty()); + assertEquals(entity.getEntityStatus(), EntityStatus.QUALIFIED); + container.add(entity); + Retrieve retrieve = new Retrieve(container); + retrieve.postTransaction(); + assertFalse(entity.getMessages().isEmpty()); + assertEquals(entity.getMessages("error").get(0), ServerMessages.AUTHORIZATION_ERROR); + assertEquals(entity.getEntityStatus(), EntityStatus.UNQUALIFIED); + assertTrue(entity.getSerializeFieldStrategy() instanceof IdAndServerMessagesOnlyStrategy); + } +}