diff --git a/src/main/java/caosdb/server/entity/container/TransactionContainer.java b/src/main/java/caosdb/server/entity/container/TransactionContainer.java index 58cdb8d953ecf60c3ee49380ea7e2407f8348a39..ff799a4df5eb74a0d15e48a990e735af609925ec 100644 --- a/src/main/java/caosdb/server/entity/container/TransactionContainer.java +++ b/src/main/java/caosdb/server/entity/container/TransactionContainer.java @@ -158,6 +158,13 @@ public class TransactionContainer extends Container<Entity> implements ToElement return this.owner; } + /** + * Get the first entity from this container which has this name. + * + * <p>Return null if no matching is in this container. + * + * @param name + */ public EntityInterface getEntityByName(final String name) { for (final EntityInterface e : this) { if (e.hasName() && e.getName().equals(name)) { diff --git a/src/main/java/caosdb/server/jobs/core/CheckDatatypePresent.java b/src/main/java/caosdb/server/jobs/core/CheckDatatypePresent.java index 7948900d28bb876c15d75e28e29766af4255af91..69d36f42fa2f457b05dcc394659b5c088976bff4 100644 --- a/src/main/java/caosdb/server/jobs/core/CheckDatatypePresent.java +++ b/src/main/java/caosdb/server/jobs/core/CheckDatatypePresent.java @@ -48,10 +48,11 @@ public final class CheckDatatypePresent extends EntityJob { @Override public final void run() { try { - resolveId(getEntity()); // inherit datatype if (!getEntity().hasDatatype()) { + resolveId(getEntity()); + inheritDatatypeFromAbstractEntity(); // still no data type ??? try to get it from parent... @@ -199,7 +200,9 @@ public final class CheckDatatypePresent extends EntityJob { if (!entity.hasId() && entity.hasName()) { try { entity.setId(retrieveValidIDByName(entity.getName())); - entity.setEntityStatus(EntityStatus.VALID); + if (entity.getEntityStatus() != EntityStatus.UNQUALIFIED) { + entity.setEntityStatus(EntityStatus.VALID); + } } catch (final EntityDoesNotExistException exc) { entity.addError(ServerMessages.ENTITY_DOES_NOT_EXIST); } catch (final EntityWasNotUniqueException exc) { diff --git a/src/main/java/caosdb/server/jobs/core/CheckNamePresent.java b/src/main/java/caosdb/server/jobs/core/CheckNamePresent.java index 813c7dc88bab149204b5410a45bffd654339f8be..d63a9cc54d4c413a0c827a562afa023b610ff872 100644 --- a/src/main/java/caosdb/server/jobs/core/CheckNamePresent.java +++ b/src/main/java/caosdb/server/jobs/core/CheckNamePresent.java @@ -42,6 +42,7 @@ public class CheckNamePresent extends EntityJob { break; case SHOULD: getEntity().addWarning(ServerMessages.ENTITY_HAS_NO_NAME); + break; default: break; } diff --git a/src/main/java/caosdb/server/jobs/extension/AWIBoxLoan.java b/src/main/java/caosdb/server/jobs/extension/AWIBoxLoan.java index 900042d34d62ca305d65d55aa49a823b38f26f47..9255a351b9bd2ff2da812e13f80c8509089946e7 100644 --- a/src/main/java/caosdb/server/jobs/extension/AWIBoxLoan.java +++ b/src/main/java/caosdb/server/jobs/extension/AWIBoxLoan.java @@ -1,23 +1,31 @@ package caosdb.server.jobs.extension; +import static caosdb.server.permissions.Role.ANONYMOUS_ROLE; + import caosdb.server.CaosDBServer; import caosdb.server.accessControl.UserSources; import caosdb.server.entity.Entity; import caosdb.server.entity.EntityInterface; import caosdb.server.entity.Message; +import caosdb.server.entity.Role; import caosdb.server.entity.wrapper.Property; import caosdb.server.jobs.ContainerJob; import caosdb.server.jobs.JobAnnotation; import caosdb.server.jobs.core.CheckNoAdditionalPropertiesPresent; import caosdb.server.jobs.core.CheckNoOverridesPresent; import caosdb.server.jobs.core.CheckPropValid; +import caosdb.server.permissions.EntityACL; +import caosdb.server.permissions.EntityACLFactory; +import caosdb.server.permissions.EntityPermission; import caosdb.server.query.Query; import caosdb.server.transaction.Insert; import caosdb.server.transaction.Update; import caosdb.server.utils.EntityStatus; import caosdb.server.utils.ServerMessages; import caosdb.server.utils.Utils; +import java.util.HashSet; import java.util.List; +import java.util.Set; @JobAnnotation(transaction = caosdb.server.transaction.WriteTransaction.class, loadAlways = true) public class AWIBoxLoan extends ContainerJob { @@ -27,6 +35,12 @@ public class AWIBoxLoan extends ContainerJob { private static final Message BOX_HAS_LOAN = new Message( "This box cannot be be requested right now because it appears to have a Loan property attached to it. This usually means, that the box is already requested or borrowed by someone."); + private static final Message PROPERTY_NOT_ALLOWED_REQUEST_RETURN = + new Message( + "It is not allowed to update this property during a return request as an anonymous user."); + private static final Message MULTIPLE_PROPERTIES = + new Message( + "This property appears multiple times in this return request and is marked for an update. This is not allowed for an anonymous user."); @Override protected void run() { @@ -37,9 +51,41 @@ public class AWIBoxLoan extends ContainerJob { || isRequestReturnSetUser() || isRequestReturnUpdateLoan())) { addError(ServerMessages.AUTHORIZATION_ERROR); + return; + } + + // special ACL for boxes, loans and persons + if (getTransaction() instanceof Insert) { + for (EntityInterface e : getContainer()) { + if (isBoxRecord(e)) { + e.setEntityACL(EntityACL.combine(e.getEntityACL(), getBoxACL())); + } else if (isLoanRecord(e)) { + e.setEntityACL(EntityACL.combine(e.getEntityACL(), getLoanACL())); + } else if (isPersonRecord(e)) { + e.setEntityACL(EntityACL.combine(e.getEntityACL(), getPersonACL())); + } + } } } + EntityACL getPersonACL() { + // same as loan acl - property updates are allowed for anonymous. + return getLoanACL(); + } + + EntityACL getLoanACL() { + EntityACLFactory f = new EntityACLFactory(); + f.grant(ANONYMOUS_ROLE, false, EntityPermission.UPDATE_ADD_PROPERTY); + f.grant(ANONYMOUS_ROLE, false, EntityPermission.UPDATE_REMOVE_PROPERTY); + return f.create(); + } + + EntityACL getBoxACL() { + EntityACLFactory f = new EntityACLFactory(); + f.grant(ANONYMOUS_ROLE, false, EntityPermission.UPDATE_ADD_PROPERTY); + return f.create(); + } + boolean isAnonymous() { return getUser().hasRole(UserSources.ANONYMOUS_ROLE); } @@ -49,7 +95,7 @@ public class AWIBoxLoan extends ContainerJob { if (getTransaction() instanceof Update) { // Container has only loan elements with special properties for (EntityInterface e : getContainer()) { - if (!isLoan(e) || !hasOnlyAllowedLoanProperties4RequestReturn(e)) { + if (!isLoanRecord(e) || !hasOnlyAllowedLoanProperties4RequestReturn(e)) { return false; } setReturnRequestedDate(e); @@ -73,7 +119,7 @@ public class AWIBoxLoan extends ContainerJob { e.addError(BOX_HAS_LOAN); return true; } - if (!isBox(e) || !hasOnlyAllowedBoxProperties4RequestLoan(e)) { + if (!isBoxRecord(e) || !hasOnlyAllowedBoxProperties4RequestLoan(e)) { return false; } } @@ -119,7 +165,7 @@ public class AWIBoxLoan extends ContainerJob { if (getTransaction() instanceof Insert) { // Container has only loan elements for (EntityInterface e : getContainer()) { - if (!isLoan(e)) { + if (!isLoanRecord(e)) { return false; } setLoanRequestDate(e); @@ -151,7 +197,7 @@ public class AWIBoxLoan extends ContainerJob { // Container has only one element, user if ((getTransaction() instanceof Update || getTransaction() instanceof Insert) && getContainer().size() == 1 - && isUser(getContainer().get(0)) + && isPersonRecord(getContainer().get(0)) && checkUniqueName(getContainer().get(0)) && checkEmail(getContainer().get(0))) { appendJob(getContainer().get(0), CheckNoAdditionalPropertiesPresent.class); @@ -180,7 +226,7 @@ public class AWIBoxLoan extends ContainerJob { Query q = new Query( "FIND " - + getUserID().toString() + + getPersonID().toString() + " WITH " + getFirstNameId().toString() + "='" @@ -200,43 +246,50 @@ public class AWIBoxLoan extends ContainerJob { return false; } - /** Has single user parent. */ - boolean isUser(Entity entity) { + /** Is Record and has single user parent. */ + boolean isPersonRecord(EntityInterface entity) { return entity.getParents().size() == 1 - && retrieveValidIDByName(entity.getParents().get(0).getName()) == getUserID(); + && retrieveValidIDByName(entity.getParents().get(0).getName()) == getPersonID(); } - /** Has single box parent. */ - boolean isBox(EntityInterface e) { - return e.getParents().size() == 1 + /** Is Record an has single box parent. */ + boolean isBoxRecord(EntityInterface e) { + return e.getRole() == Role.Record + && e.getParents().size() == 1 && retrieveValidIDByName(e.getParents().get(0).getName()) == getBoxId(); } - /** has single loan parent */ - private boolean isLoan(EntityInterface e) { - return e.getParents().size() == 1 + /** Is Record and has single loan parent */ + private boolean isLoanRecord(EntityInterface e) { + return e.getRole() == Role.Record + && e.getParents().size() == 1 && retrieveValidIDByName(e.getParents().get(0).getName()) == getLoanId(); } /** * Has only 5/6 new/updated properties: content, returnRequested, destination, Borrower, comment * (optional), location + * + * @throws Message */ boolean hasOnlyAllowedLoanProperties4RequestReturn(EntityInterface e) { runJobFromSchedule(e, CheckPropValid.class); + appendJob(e, CheckNoOverridesPresent.class); + Set<Integer> found = new HashSet<>(); for (Property p : e.getProperties()) { if (p.getEntityStatus() == EntityStatus.QUALIFIED) { // this means update - if (p.getId() == getContentId()) { - - } else if (p.getId() == getDestinationId()) { - - } else if (p.getId() == getBorrowerId()) { - - } else if (p.getId() == getCommentId()) { - - } else if (p.getId() == getLocationId()) { - + if (found.contains(p.getId())) { + p.addError(MULTIPLE_PROPERTIES); + return false; + } + found.add(p.getId()); + if (!(p.getId() == getContentId() + || p.getId() == getDestinationId() + || p.getId() == getBorrowerId() + || p.getId() == getCommentId() + || p.getId() == getLocationId())) { + p.addError(PROPERTY_NOT_ALLOWED_REQUEST_RETURN); + return false; // this is not a property which may be updated by anonymous. } - return false; // this is not a property which may be updated by anonymous. } } return true; @@ -282,7 +335,7 @@ public class AWIBoxLoan extends ContainerJob { return getIdOf("Loan"); } - Integer getUserID() { + Integer getPersonID() { return getIdOf("Person"); } diff --git a/src/main/java/caosdb/server/permissions/AbstractEntityACLFactory.java b/src/main/java/caosdb/server/permissions/AbstractEntityACLFactory.java index d9657d9ce7fd5e781f2643185554090f076af0f0..5d8174711c2dfd06798c5f5690b61540f55e5c56 100644 --- a/src/main/java/caosdb/server/permissions/AbstractEntityACLFactory.java +++ b/src/main/java/caosdb/server/permissions/AbstractEntityACLFactory.java @@ -26,26 +26,15 @@ 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 +109,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 +138,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 +147,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 +158,51 @@ 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 79008947823e9625283c03e1dd539328a58fef7f..86346bdfa3c3846e7951e41268e117ec2a99aaab 100644 --- a/src/main/java/caosdb/server/permissions/EntityACL.java +++ b/src/main/java/caosdb/server/permissions/EntityACL.java @@ -32,7 +32,6 @@ 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; @@ -53,7 +52,7 @@ public class EntityACL { if (acl != null) { this.acl = acl; } else { - this.acl = new ArrayList<EntityACI>(); + this.acl = new ArrayList<>(); } } @@ -68,7 +67,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 +87,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 +103,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 +113,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 +154,8 @@ 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 +167,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 +183,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 +201,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 +250,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 +318,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 +337,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 +357,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 +382,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/EntityACLFactory.java b/src/main/java/caosdb/server/permissions/EntityACLFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..eeacb1260729f78f490e592891c0a93a334b42fa --- /dev/null +++ b/src/main/java/caosdb/server/permissions/EntityACLFactory.java @@ -0,0 +1,11 @@ +package caosdb.server.permissions; + +import java.util.Collection; + +public class EntityACLFactory extends AbstractEntityACLFactory<EntityACL> { + + @Override + protected EntityACL create(final Collection<EntityACI> acis) { + return new EntityACL(acis); + } +} diff --git a/src/main/java/caosdb/server/permissions/EntityPermission.java b/src/main/java/caosdb/server/permissions/EntityPermission.java index c4fd82245d32a488a4e2155e2c3171441f4a2d30..7fae8a76a8cc87cbfb2525c34102d5418d58e94e 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 eed068fc6bed1f8a3e5fd18bcdc6ef30bb9447a1..70e1a61f754b4beeffe8f8fe203b42842d49cb6d 100644 --- a/src/main/java/caosdb/server/permissions/Role.java +++ b/src/main/java/caosdb/server/permissions/Role.java @@ -22,6 +22,7 @@ */ package caosdb.server.permissions; +import caosdb.server.accessControl.UserSources; import java.util.HashMap; import org.jdom2.Attribute; import org.jdom2.Element; @@ -30,6 +31,7 @@ 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; diff --git a/update_box_loan_acl.py b/update_box_loan_acl.py new file mode 100644 index 0000000000000000000000000000000000000000..c49dd01eb1adf8b266ec2f8af3ce417a20e59c12 --- /dev/null +++ b/update_box_loan_acl.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 + +import sys +import caosdb as db + +boxes = db.execute_query("FIND RECORD Box") +persons = db.execute_query("FIND RECORD Person") +loans = db.execute_query("FIND RECORD LOAN") + +num = len(boxes) + len(persons) + len(loans) +i = 0 + +def progress(): + global i + i += 1 + sys.stdout.write("\rprocessing {i}/{num} entities, {perc}%".format(i=i,num=num, perc=float(100*i)/float(num))) + sys.stdout.flush() + +for Box in boxes: + progress() + box.retrieve_acl() + box.grant(role="anonymous", permissions="UPDATE:PROPERTY:ADD") + box.update_acl() + +for person in persons: + progress() + person.retrieve_acl() + person.grant(role="anonymous", permissions="UPDATE:PROPERTY:ADD") + person.grant(role="anonymous", permissions="UPDATE:PROPERTY:REMOVE") + person.update_acl() + +for loan in loans: + progress() + loan.retrieve_acl() + loan.grant(role="anonymous", permissions="UPDATE:PROPERTY:ADD") + loan.grant(role="anonymous", permissions="UPDATE:PROPERTY:REMOVE") + loan.update_acl()