diff --git a/src/main/java/org/caosdb/server/entity/UpdateEntity.java b/src/main/java/org/caosdb/server/entity/UpdateEntity.java index aa6d591602df66cc9317351cf6a1ea980bc53ea3..884632b5ed3f92d740f2eea69ed49ef77511fd1b 100644 --- a/src/main/java/org/caosdb/server/entity/UpdateEntity.java +++ b/src/main/java/org/caosdb/server/entity/UpdateEntity.java @@ -22,11 +22,21 @@ */ package org.caosdb.server.entity; +import org.caosdb.server.transaction.WriteTransaction; import org.caosdb.server.utils.EntityStatus; import org.jdom2.Element; +/** + * UpdateEntity class represents entities which are to be updated. The previous version is appeded + * during the {@link WriteTransaction} transactions initialization. + * + * @author Timm Fitschen (t.fitschen@indiscale.com) + */ public class UpdateEntity extends WritableEntity { + /** The previous version of this entity. */ + private EntityInterface original = null; + public UpdateEntity(final Element element) { super(element); } @@ -35,4 +45,12 @@ public class UpdateEntity extends WritableEntity { public boolean skipJob() { return getEntityStatus() != EntityStatus.QUALIFIED; } + + public void setOriginal(EntityInterface original) { + this.original = original; + } + + public EntityInterface getOriginal() { + return this.original; + } } diff --git a/src/main/java/org/caosdb/server/permissions/AbstractEntityACLFactory.java b/src/main/java/org/caosdb/server/permissions/AbstractEntityACLFactory.java index 675d65dcfee5b8f98e0410bd33992094308fa461..7d7120ebd65dc5a21c9e76271aede9e58aa05f95 100644 --- a/src/main/java/org/caosdb/server/permissions/AbstractEntityACLFactory.java +++ b/src/main/java/org/caosdb/server/permissions/AbstractEntityACLFactory.java @@ -242,13 +242,19 @@ public abstract class AbstractEntityACLFactory<T extends EntityACL> { for (EntityACI aci : permissions.getRules()) { if (EntityACL.isAllowance(aci.getBitSet())) { if (EntityACL.isPriorityBitSet(aci.getBitSet())) { - long bitset = this.priorityGrants.get(aci.getResponsibleAgent()); + Long bitset = this.priorityGrants.get(aci.getResponsibleAgent()); + if (bitset == null) { + continue; + } long bitset2 = bitset; bitset2 &= aci.getBitSet(); bitset ^= bitset2; this.priorityGrants.put(aci.getResponsibleAgent(), bitset); } else { - long bitset = this.normalGrants.get(aci.getResponsibleAgent()); + Long bitset = this.normalGrants.get(aci.getResponsibleAgent()); + if (bitset == null) { + continue; + } long bitset2 = bitset; bitset2 &= aci.getBitSet(); bitset ^= bitset2; @@ -256,13 +262,19 @@ public abstract class AbstractEntityACLFactory<T extends EntityACL> { } } else { if (EntityACL.isPriorityBitSet(aci.getBitSet())) { - long bitset = this.priorityDenials.get(aci.getResponsibleAgent()); + Long bitset = this.priorityDenials.get(aci.getResponsibleAgent()); + if (bitset == null) { + continue; + } long bitset2 = bitset; bitset2 &= aci.getBitSet(); bitset ^= bitset2; this.priorityDenials.put(aci.getResponsibleAgent(), bitset); } else { - long bitset = this.normalDenials.get(aci.getResponsibleAgent()); + Long bitset = this.normalDenials.get(aci.getResponsibleAgent()); + if (bitset == null) { + continue; + } long bitset2 = bitset; bitset2 &= aci.getBitSet(); bitset ^= bitset2; diff --git a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java index 87e15e9226c4b40c70630a25ee98c88b65bfcd44..570fce2c2b001699fdb48c1379e807ae05d62996 100644 --- a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java +++ b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java @@ -285,7 +285,9 @@ public class WriteTransaction extends Transaction<WritableContainer> protected void preCheck() throws InterruptedException, Exception { for (final EntityInterface entity : getContainer()) { try { - checkPermissions(entity, deriveUpdate(entity, ((UpdateEntity) entity).getOriginal())); + if (entity.getEntityStatus() == EntityStatus.QUALIFIED) { + checkPermissions(entity, deriveUpdate(entity, ((UpdateEntity) entity).getOriginal())); + } } catch (final AuthorizationException exc) { entity.setEntityStatus(EntityStatus.UNQUALIFIED); entity.addError(ServerMessages.AUTHORIZATION_ERROR); @@ -377,21 +379,6 @@ public class WriteTransaction extends Transaction<WritableContainer> newEntity.setEntityACL(oldEntity.getEntityACL()); } - // new acl? - if (newEntity.hasEntityACL() && !newEntity.getEntityACL().equals(oldEntity.getEntityACL())) { - oldEntity.checkPermission(EntityPermission.EDIT_ACL); - if (!newEntity - .getEntityACL() - .getPriorityEntityACL() - .equals(oldEntity.getEntityACL().getPriorityEntityACL())) { - // priority acl is to be changed? - oldEntity.checkPermission(Permission.EDIT_PRIORITY_ACL); - } - updatetable = true; - } else if (!newEntity.hasEntityACL()) { - newEntity.setEntityACL(oldEntity.getEntityACL()); - } - // new query template definition? if (!Objects.equals( newEntity.getQueryTemplateDefinition(), oldEntity.getQueryTemplateDefinition())) {