From f33df066b2fa60c4da37fa630fed12c6ea655ceb Mon Sep 17 00:00:00 2001 From: Timm Fitschen <timm.fitschen@ds.mpg.de> Date: Mon, 10 Dec 2018 23:06:41 +0100 Subject: [PATCH] MAINT: refactoring some permissions classes --- .../permissions/AbstractEntityACLFactory.java | 99 +++++++++---------- .../caosdb/server/permissions/EntityACL.java | 70 ++++++------- .../server/permissions/EntityPermission.java | 10 +- .../java/caosdb/server/permissions/Role.java | 2 + 4 files changed, 86 insertions(+), 95 deletions(-) diff --git a/src/main/java/caosdb/server/permissions/AbstractEntityACLFactory.java b/src/main/java/caosdb/server/permissions/AbstractEntityACLFactory.java index d9657d9c..6460cb34 100644 --- a/src/main/java/caosdb/server/permissions/AbstractEntityACLFactory.java +++ b/src/main/java/caosdb/server/permissions/AbstractEntityACLFactory.java @@ -26,26 +26,19 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.Map; import java.util.Map.Entry; -class EntityACLFactory extends AbstractEntityACLFactory<EntityACL> { - - @Override - protected EntityACL create(final Collection<EntityACI> acis) { - return new EntityACL(acis); - } -} - public abstract class AbstractEntityACLFactory<T extends EntityACL> { - private final HashMap<ResponsibleAgent, Long> normal_grants = - new HashMap<ResponsibleAgent, Long>(); - private final HashMap<ResponsibleAgent, Long> priority_grants = - new HashMap<ResponsibleAgent, Long>(); - private final HashMap<ResponsibleAgent, Long> normal_denials = - new HashMap<ResponsibleAgent, Long>(); - private final HashMap<ResponsibleAgent, Long> priority_denials = - new HashMap<ResponsibleAgent, Long>(); + private final Map<ResponsibleAgent, Long> normalGrants = + new HashMap<>(); + private final Map<ResponsibleAgent, Long> priorityGrants = + new HashMap<>(); + private final Map<ResponsibleAgent, Long> normalDenials = + new HashMap<>(); + private final Map<ResponsibleAgent, Long> priorityDenials = + new HashMap<>(); public void grant(final ResponsibleAgent role, final int... permissionBitNumber) { grant(role, false, permissionBitNumber); @@ -120,23 +113,23 @@ public abstract class AbstractEntityACLFactory<T extends EntityACL> { public void grant( final ResponsibleAgent role, final boolean priority, final EntityPermission... permission) { if (priority) { - addACI(this.priority_grants, role, permission); + addACI(this.priorityGrants, role, permission); } else { - addACI(this.normal_grants, role, permission); + addACI(this.normalGrants, role, permission); } } public void deny( final ResponsibleAgent role, final boolean priority, final EntityPermission... permission) { if (priority) { - addACI(this.priority_denials, role, permission); + addACI(this.priorityDenials, role, permission); } else { - addACI(this.normal_denials, role, permission); + addACI(this.normalDenials, role, permission); } } private static void addACI( - final HashMap<ResponsibleAgent, Long> map, + final Map<ResponsibleAgent, Long> map, final ResponsibleAgent role, final EntityPermission permission) { long bitSet = permission.getBitSet(); @@ -149,7 +142,7 @@ public abstract class AbstractEntityACLFactory<T extends EntityACL> { } private static void addACI( - final HashMap<ResponsibleAgent, Long> map, + final Map<ResponsibleAgent, Long> map, final ResponsibleAgent role, final EntityPermission[] permission) { for (final EntityPermission p : permission) { @@ -158,7 +151,7 @@ public abstract class AbstractEntityACLFactory<T extends EntityACL> { } private EntityACI[] toEntityACIArray( - final HashMap<ResponsibleAgent, Long> map, final long modBitSet) { + final Map<ResponsibleAgent, Long> map, final long modBitSet) { final EntityACI[] ret = new EntityACI[map.size()]; int i = 0; for (final Entry<ResponsibleAgent, Long> e : map.entrySet()) { @@ -169,54 +162,54 @@ public abstract class AbstractEntityACLFactory<T extends EntityACL> { public T create() { normalize(); - final ArrayList<EntityACI> acis = new ArrayList<EntityACI>(); - Collections.addAll(acis, toEntityACIArray(this.normal_grants, 0)); - Collections.addAll(acis, toEntityACIArray(this.normal_denials, Long.MIN_VALUE)); - Collections.addAll(acis, toEntityACIArray(this.priority_grants, EntityACL.MIN_PRIORITY_BITSET)); + final ArrayList<EntityACI> acis = new ArrayList<>(); + Collections.addAll(acis, toEntityACIArray(this.normalGrants, 0)); + Collections.addAll(acis, toEntityACIArray(this.normalDenials, Long.MIN_VALUE)); + Collections.addAll(acis, toEntityACIArray(this.priorityGrants, EntityACL.MIN_PRIORITY_BITSET)); Collections.addAll( acis, - toEntityACIArray(this.priority_denials, Long.MIN_VALUE | EntityACL.MIN_PRIORITY_BITSET)); + toEntityACIArray(this.priorityDenials, Long.MIN_VALUE | EntityACL.MIN_PRIORITY_BITSET)); return create(acis); } private void normalize() { - for (final Entry<ResponsibleAgent, Long> set : this.priority_denials.entrySet()) { - if (this.priority_grants.containsKey(set.getKey())) { - this.priority_grants.put( - set.getKey(), this.priority_grants.get(set.getKey()) & ~set.getValue()); + 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()); } - if (this.normal_denials.containsKey(set.getKey())) { - this.normal_denials.put( - set.getKey(), this.normal_denials.get(set.getKey()) & ~set.getValue()); + if (this.normalDenials.containsKey(set.getKey())) { + this.normalDenials.put( + set.getKey(), this.normalDenials.get(set.getKey()) & ~set.getValue()); } - if (this.normal_grants.containsKey(set.getKey())) { - this.normal_grants.put( - set.getKey(), this.normal_grants.get(set.getKey()) & ~set.getValue()); + if (this.normalGrants.containsKey(set.getKey())) { + this.normalGrants.put( + set.getKey(), this.normalGrants.get(set.getKey()) & ~set.getValue()); } } - for (final Entry<ResponsibleAgent, Long> set : this.priority_grants.entrySet()) { - if (this.normal_denials.containsKey(set.getKey())) { - this.normal_denials.put( - set.getKey(), this.normal_denials.get(set.getKey()) & ~set.getValue()); + 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()); } - if (this.normal_grants.containsKey(set.getKey())) { - this.normal_grants.put( - set.getKey(), this.normal_grants.get(set.getKey()) & ~set.getValue()); + if (this.normalGrants.containsKey(set.getKey())) { + this.normalGrants.put( + set.getKey(), this.normalGrants.get(set.getKey()) & ~set.getValue()); } } - for (final Entry<ResponsibleAgent, Long> set : this.normal_denials.entrySet()) { - if (this.normal_grants.containsKey(set.getKey())) { - this.normal_grants.put( - set.getKey(), this.normal_grants.get(set.getKey()) & ~set.getValue()); + 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()); } } } public void clear() { - this.normal_grants.clear(); - this.normal_denials.clear(); - this.priority_grants.clear(); - this.priority_denials.clear(); + this.normalGrants.clear(); + this.normalDenials.clear(); + this.priorityGrants.clear(); + this.priorityDenials.clear(); } protected abstract T create(Collection<EntityACI> acis); diff --git a/src/main/java/caosdb/server/permissions/EntityACL.java b/src/main/java/caosdb/server/permissions/EntityACL.java index 79008947..154c2bf7 100644 --- a/src/main/java/caosdb/server/permissions/EntityACL.java +++ b/src/main/java/caosdb/server/permissions/EntityACL.java @@ -24,15 +24,10 @@ package caosdb.server.permissions; import static caosdb.server.permissions.Role.OTHER_ROLE; import static caosdb.server.permissions.Role.OWNER_ROLE; - -import caosdb.server.accessControl.AuthenticationUtils; -import caosdb.server.accessControl.Principal; -import caosdb.server.database.exceptions.TransactionException; import java.util.ArrayList; import java.util.BitSet; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -41,6 +36,9 @@ import org.apache.shiro.subject.Subject; import org.eclipse.jetty.util.ajax.JSON; import org.jdom2.DataConversionException; import org.jdom2.Element; +import caosdb.server.accessControl.AuthenticationUtils; +import caosdb.server.accessControl.Principal; +import caosdb.server.database.exceptions.TransactionException; public class EntityACL { @@ -53,7 +51,7 @@ public class EntityACL { if (acl != null) { this.acl = acl; } else { - this.acl = new ArrayList<EntityACI>(); + this.acl = new ArrayList<>(); } } @@ -68,7 +66,7 @@ public class EntityACL { } EntityACL(final EntityACI... aci) { - this.acl = new ArrayList<EntityACI>(); + this.acl = new ArrayList<>(); for (final EntityACI a : aci) { this.acl.add(a); } @@ -88,7 +86,7 @@ public class EntityACL { } public static final Set<EntityPermission> getPermissionsFromBitSet(final long bitSet) { - final HashSet<EntityPermission> ret = new HashSet<EntityPermission>(); + final Set<EntityPermission> ret = new HashSet<>(); final boolean[] ba = convertToArray(bitSet); for (int i = 0; i < 62; i++) { if (ba[i]) { @@ -104,9 +102,9 @@ public class EntityACL { return true; } if (permission instanceof EntityPermission) { - final ArrayList<EntityACI> acl = new ArrayList<EntityACI>(this.acl); - acl.addAll(GLOBAL_PERMISSIONS.acl); - final Set<EntityPermission> permissions = getPermissionsFor(subject, acl); + final List<EntityACI> localAcl = new ArrayList<>(this.acl); + localAcl.addAll(GLOBAL_PERMISSIONS.acl); + final Set<EntityPermission> permissions = getPermissionsFor(subject, localAcl); return permissions.contains(permission); } return false; @@ -114,15 +112,13 @@ public class EntityACL { public static final Set<EntityPermission> getPermissionsFor( final Subject subject, final Collection<EntityACI> entityACL) { - final ArrayList<Long> acl = new ArrayList<Long>(); + final List<Long> acl = new ArrayList<>(); final List<ResponsibleAgent> owners = getOwners(entityACL); - final ArrayList<Long> forOthers = new ArrayList<Long>(); + final List<Long> forOthers = new ArrayList<>(); for (final EntityACI aci : entityACL) { - if (aci.getResponsibleAgent().equals(OWNER_ROLE)) { - if (subjectIsOwner(subject, owners)) { - acl.add(aci.getBitSet()); - break; - } + if (aci.getResponsibleAgent().equals(OWNER_ROLE) && subjectIsOwner(subject, owners)) { + acl.add(aci.getBitSet()); + break; } if (subjectHasRole(subject, aci.getResponsibleAgent())) { acl.add(aci.getBitSet()); @@ -157,9 +153,7 @@ public class EntityACL { private static boolean subjectIsOwner( final Subject subject, final List<ResponsibleAgent> owners) { for (final ResponsibleAgent owner : owners) { - if (owner instanceof Role && subject.hasRole(owner.toString())) { - return true; - } else if (owner instanceof Principal && subject.getPrincipal().equals(owner)) { + if ((owner instanceof Role && subject.hasRole(owner.toString())) || (owner instanceof Principal && subject.getPrincipal().equals(owner))) { return true; } } @@ -171,7 +165,7 @@ public class EntityACL { } public static final List<ResponsibleAgent> getOwners(final Collection<EntityACI> acl) { - final ArrayList<ResponsibleAgent> owners = new ArrayList<ResponsibleAgent>(); + final List<ResponsibleAgent> owners = new ArrayList<>(); for (final EntityACI aci : acl) { if (isOwnerBitSet(aci.getBitSet()) && !aci.getResponsibleAgent().equals(OWNER_ROLE)) { owners.add(aci.getResponsibleAgent()); @@ -187,15 +181,15 @@ public class EntityACL { public static final long getResultingACL(final Collection<Long> acl) { long allowance = 0; long denial = Long.MIN_VALUE; - long priority_allowance = 0; - long priority_denial = Long.MIN_VALUE; + long priorityAllowance = 0; + long priorityDenial = Long.MIN_VALUE; for (final long aci : acl) { if (isPriorityBitSet(aci)) { if (isDenial(aci)) { - priority_denial = priority_denial | aci; + priorityDenial = priorityDenial | aci; } else { - priority_allowance = priority_allowance | aci; + priorityAllowance = priorityAllowance | aci; } } else { if (isDenial(aci)) { @@ -205,7 +199,7 @@ public class EntityACL { } } } - return ((allowance & ~denial) | (priority_allowance & ~MIN_PRIORITY_BITSET)) & ~priority_denial; + return ((allowance & ~denial) | (priorityAllowance & ~MIN_PRIORITY_BITSET)) & ~priorityDenial; } public static final boolean isPriorityBitSet(final long bitSet) { @@ -254,13 +248,13 @@ public class EntityACL { } public static final EntityACL getPriorityEntityACL(final EntityACL acl) { - final ArrayList<EntityACI> priority_acl = new ArrayList<EntityACI>(); + final List<EntityACI> priorityAcl = new ArrayList<>(); for (final EntityACI aci : acl.acl) { if (isPriorityBitSet(aci.getBitSet())) { - priority_acl.add(aci); + priorityAcl.add(aci); } } - return new EntityACL(priority_acl); + return new EntityACL(priorityAcl); } public static final EntityACL parseFromElement(final Element e) { @@ -322,7 +316,7 @@ public class EntityACL { } public static final EntityACL combine(final EntityACL... acls) { - final ArrayList<EntityACI> newACL = new ArrayList<EntityACI>(); + final List<EntityACI> newACL = new ArrayList<>(); for (final EntityACL acl : acls) { newACL.addAll(acl.acl); } @@ -341,11 +335,11 @@ public class EntityACL { public boolean equals(final Object obj) { if (obj instanceof EntityACL) { final EntityACL that = (EntityACL) obj; - final HashSet<EntityACI> that_acis = new HashSet<EntityACI>(); - that_acis.addAll(that.acl); - final HashSet<EntityACI> this_acis = new HashSet<EntityACI>(); - this_acis.addAll(this.acl); - return that_acis.equals(this_acis); + final Set<EntityACI> thatAcis = new HashSet<>(); + thatAcis.addAll(that.acl); + final Set<EntityACI> thisAcis = new HashSet<>(); + thisAcis.addAll(this.acl); + return thatAcis.equals(thisAcis); } return false; } @@ -361,7 +355,7 @@ public class EntityACL { public static EntityACL fromJSON(final String input) { final Object parse = JSON.parse(input); - final ArrayList<EntityACI> acl = new ArrayList<EntityACI>(); + final List<EntityACI> acl = new ArrayList<>(); if (parse.getClass().isArray()) { final Object[] array = (Object[]) parse; for (final Object aci : array) { @@ -386,7 +380,7 @@ public class EntityACL { } public static String toJSON(final EntityACL acl) { - final ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>(); + final List<Map<String, Object>> list = new ArrayList<>(); for (final EntityACI aci : acl.acl) { list.add(aci.toMap()); diff --git a/src/main/java/caosdb/server/permissions/EntityPermission.java b/src/main/java/caosdb/server/permissions/EntityPermission.java index c4fd8224..7fae8a76 100644 --- a/src/main/java/caosdb/server/permissions/EntityPermission.java +++ b/src/main/java/caosdb/server/permissions/EntityPermission.java @@ -22,9 +22,11 @@ */ package caosdb.server.permissions; +import caosdb.server.CaosDBException; import caosdb.server.entity.xml.ToElementable; import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -33,7 +35,7 @@ import org.jdom2.Element; public class EntityPermission extends Permission { private static final long serialVersionUID = 1L; - private static ArrayList<EntityPermission> instances = new ArrayList<EntityPermission>(); + private static List<EntityPermission> instances = new ArrayList<>(); private final int bitNumber; public static ToElementable getAllEntityPermissions() { @@ -59,11 +61,11 @@ public class EntityPermission extends Permission { super(shortName, description); this.bitNumber = bitNumber; if (bitNumber > 61) { - throw new RuntimeException( + throw new CaosDBException( "This bitNumber is too big. This implementation only handles bitNumbers up to 61."); } if (instances.contains(this)) { - throw new RuntimeException("This EntityPermission is defined yet."); + throw new CaosDBException("This EntityPermission is defined yet."); } else { instances.add(this); } @@ -72,7 +74,7 @@ public class EntityPermission extends Permission { public static Set<EntityPermission> getPermissionsPerWildCard(final String s) { final Pattern pattern = Pattern.compile(s.replaceAll("\\*", ".*")); - final HashSet<EntityPermission> ret = new HashSet<EntityPermission>(); + final Set<EntityPermission> ret = new HashSet<>(); for (final EntityPermission p : instances) { final Matcher m = pattern.matcher(p.getShortName()); if (m.matches()) { diff --git a/src/main/java/caosdb/server/permissions/Role.java b/src/main/java/caosdb/server/permissions/Role.java index eed068fc..95ce7289 100644 --- a/src/main/java/caosdb/server/permissions/Role.java +++ b/src/main/java/caosdb/server/permissions/Role.java @@ -25,11 +25,13 @@ package caosdb.server.permissions; import java.util.HashMap; import org.jdom2.Attribute; import org.jdom2.Element; +import caosdb.server.accessControl.UserSources; public class Role implements ResponsibleAgent { public static final Role OWNER_ROLE = new Role("?OWNER?"); public static final Role OTHER_ROLE = new Role("?OTHER?"); + public static final Role ANONYMOUS_ROLE = new Role(UserSources.ANONYMOUS_ROLE); private final String role; -- GitLab