diff --git a/src/main/java/org/caosdb/server/permissions/AbstractEntityACLFactory.java b/src/main/java/org/caosdb/server/permissions/AbstractEntityACLFactory.java index 3a3d03d18bc7b0913a522e2edd6c235f9a7d39a7..675d65dcfee5b8f98e0410bd33992094308fa461 100644 --- a/src/main/java/org/caosdb/server/permissions/AbstractEntityACLFactory.java +++ b/src/main/java/org/caosdb/server/permissions/AbstractEntityACLFactory.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; @@ -169,31 +170,60 @@ public abstract class AbstractEntityACLFactory<T extends EntityACL> { } private void normalize() { - for (final Entry<ResponsibleAgent, Long> set : this.priorityDenials.entrySet()) { - if (this.priorityGrants.containsKey(set.getKey())) { - this.priorityGrants.put( - set.getKey(), this.priorityGrants.get(set.getKey()) & ~set.getValue()); + Iterator<Entry<ResponsibleAgent, Long>> iterator = this.priorityDenials.entrySet().iterator(); + while (iterator.hasNext()) { + Entry<ResponsibleAgent, Long> next = iterator.next(); + final ResponsibleAgent agent = next.getKey(); + long bitset = next.getValue(); + if (bitset == 0L) { + iterator.remove(); + continue; } - if (this.normalDenials.containsKey(set.getKey())) { - this.normalDenials.put( - set.getKey(), this.normalDenials.get(set.getKey()) & ~set.getValue()); + if (this.priorityGrants.containsKey(agent)) { + this.priorityGrants.put(agent, this.priorityGrants.get(agent) & ~bitset); } - if (this.normalGrants.containsKey(set.getKey())) { - this.normalGrants.put(set.getKey(), this.normalGrants.get(set.getKey()) & ~set.getValue()); + if (this.normalDenials.containsKey(agent)) { + this.normalDenials.put(agent, this.normalDenials.get(agent) & ~bitset); + } + if (this.normalGrants.containsKey(agent)) { + this.normalGrants.put(agent, this.normalGrants.get(agent) & ~bitset); + } + } + iterator = this.priorityGrants.entrySet().iterator(); + while (iterator.hasNext()) { + Entry<ResponsibleAgent, Long> next = iterator.next(); + final ResponsibleAgent agent = next.getKey(); + long bitset = next.getValue(); + if (bitset == 0L) { + iterator.remove(); + continue; + } + if (this.normalDenials.containsKey(agent)) { + this.normalDenials.put(agent, this.normalDenials.get(agent) & ~bitset); + } + if (this.normalGrants.containsKey(agent)) { + this.normalGrants.put(agent, this.normalGrants.get(agent) & ~bitset); } } - for (final Entry<ResponsibleAgent, Long> set : this.priorityGrants.entrySet()) { - if (this.normalDenials.containsKey(set.getKey())) { - this.normalDenials.put( - set.getKey(), this.normalDenials.get(set.getKey()) & ~set.getValue()); + iterator = this.normalDenials.entrySet().iterator(); + while (iterator.hasNext()) { + Entry<ResponsibleAgent, Long> next = iterator.next(); + final ResponsibleAgent agent = next.getKey(); + long bitset = next.getValue(); + if (bitset == 0L) { + iterator.remove(); + continue; } - if (this.normalGrants.containsKey(set.getKey())) { - this.normalGrants.put(set.getKey(), this.normalGrants.get(set.getKey()) & ~set.getValue()); + if (this.normalGrants.containsKey(agent)) { + this.normalGrants.put(agent, this.normalGrants.get(agent) & ~bitset); } } - for (final Entry<ResponsibleAgent, Long> set : this.normalDenials.entrySet()) { - if (this.normalGrants.containsKey(set.getKey())) { - this.normalGrants.put(set.getKey(), this.normalGrants.get(set.getKey()) & ~set.getValue()); + iterator = this.normalGrants.entrySet().iterator(); + while (iterator.hasNext()) { + Entry<ResponsibleAgent, Long> next = iterator.next(); + long bitset = next.getValue(); + if (bitset == 0L) { + iterator.remove(); } } } @@ -206,4 +236,41 @@ public abstract class AbstractEntityACLFactory<T extends EntityACL> { } protected abstract T create(Collection<EntityACI> acis); + + public AbstractEntityACLFactory<T> remove(EntityACL permissions) { + if (permissions != null) { + for (EntityACI aci : permissions.getRules()) { + if (EntityACL.isAllowance(aci.getBitSet())) { + if (EntityACL.isPriorityBitSet(aci.getBitSet())) { + long bitset = this.priorityGrants.get(aci.getResponsibleAgent()); + long bitset2 = bitset; + bitset2 &= aci.getBitSet(); + bitset ^= bitset2; + this.priorityGrants.put(aci.getResponsibleAgent(), bitset); + } else { + long bitset = this.normalGrants.get(aci.getResponsibleAgent()); + long bitset2 = bitset; + bitset2 &= aci.getBitSet(); + bitset ^= bitset2; + this.normalGrants.put(aci.getResponsibleAgent(), bitset); + } + } else { + if (EntityACL.isPriorityBitSet(aci.getBitSet())) { + long bitset = this.priorityDenials.get(aci.getResponsibleAgent()); + long bitset2 = bitset; + bitset2 &= aci.getBitSet(); + bitset ^= bitset2; + this.priorityDenials.put(aci.getResponsibleAgent(), bitset); + } else { + long bitset = this.normalDenials.get(aci.getResponsibleAgent()); + long bitset2 = bitset; + bitset2 &= aci.getBitSet(); + bitset ^= bitset2; + this.normalDenials.put(aci.getResponsibleAgent(), bitset); + } + } + } + } + return this; + } } diff --git a/src/main/java/org/caosdb/server/permissions/EntityACL.java b/src/main/java/org/caosdb/server/permissions/EntityACL.java index df1915bd460079eb52dfc6d4f3bbf4fe42795918..d8533cba2f98adc7a56287af914472cb9f759c57 100644 --- a/src/main/java/org/caosdb/server/permissions/EntityACL.java +++ b/src/main/java/org/caosdb/server/permissions/EntityACL.java @@ -103,7 +103,7 @@ public class EntityACL { } public static final EntityACL getOwnerACLFor(final ResponsibleAgent agent) { - final EntityACLFactory f = new EntityACLFactory(); + final AbstractEntityACLFactory<EntityACL> f = new EntityACLFactory(); f.grant(agent, "*"); return f.create(); } @@ -291,7 +291,7 @@ public class EntityACL { * @return */ public static final EntityACL parseFromElement(final Element e) { - final EntityACLFactory factory = new EntityACLFactory(); + final AbstractEntityACLFactory<EntityACL> factory = new EntityACLFactory(); for (final Element c : e.getChildren()) { boolean priority; @@ -323,7 +323,7 @@ public class EntityACL { } } } - return factory.create(); + return factory.remove(GLOBAL_PERMISSIONS).create(); } public static BitSet convert(final long value) { diff --git a/src/test/java/org/caosdb/server/permissions/EntityACLTest.java b/src/test/java/org/caosdb/server/permissions/EntityACLTest.java index 0e0e3ee121b09332b6cbb7d86a22458bb5fbf17f..8e8b0a10dd340bce53bca01ffb519868d13ca027 100644 --- a/src/test/java/org/caosdb/server/permissions/EntityACLTest.java +++ b/src/test/java/org/caosdb/server/permissions/EntityACLTest.java @@ -307,7 +307,7 @@ public class EntityACLTest { @Test public void testFactory() { - final EntityACLFactory f = new EntityACLFactory(); + final AbstractEntityACLFactory<EntityACL> f = new EntityACLFactory(); org.caosdb.server.permissions.Role role1 = org.caosdb.server.permissions.Role.create("role1"); Config config1 = new Config();