From 05de46fa526583331ac07040f17a4f7ed9d86a53 Mon Sep 17 00:00:00 2001 From: Timm Fitschen <t.fitschen@indiscale.com> Date: Fri, 4 Feb 2022 13:40:23 +0100 Subject: [PATCH] Update proto --- caosdb-proto | 2 +- .../server/grpc/CaosDBToGrpcConverters.java | 28 ++-- .../server/grpc/GrpcToCaosDBConverters.java | 10 +- .../server/permissions/EntityPermission.java | 141 ++++++++++++++---- .../permissions/EntityPermissionTest.java | 92 ++++++++++++ 5 files changed, 227 insertions(+), 46 deletions(-) create mode 100644 src/test/java/org/caosdb/server/permissions/EntityPermissionTest.java diff --git a/caosdb-proto b/caosdb-proto index 2f3e4ad1..5d5e3170 160000 --- a/caosdb-proto +++ b/caosdb-proto @@ -1 +1 @@ -Subproject commit 2f3e4ad1cf515450fcfedb300f66198b82122b7e +Subproject commit 5d5e317091b1c8f03466ce701bbe6eba70cd4458 diff --git a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java index 8b93acc9..d9ac193c 100644 --- a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java +++ b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java @@ -31,6 +31,7 @@ import org.caosdb.api.entity.v1.DataType; import org.caosdb.api.entity.v1.Entity; import org.caosdb.api.entity.v1.Entity.Builder; import org.caosdb.api.entity.v1.EntityACL; +import org.caosdb.api.entity.v1.EntityAclPermission; import org.caosdb.api.entity.v1.EntityPermissionRule; import org.caosdb.api.entity.v1.EntityPermissionRuleCapability; import org.caosdb.api.entity.v1.EntityResponse; @@ -496,25 +497,21 @@ public class CaosDBToGrpcConverters { builder.addAllRules(convert(e.getEntityACL(), true)); } builder.addAllRules(convert(org.caosdb.server.permissions.EntityACL.GLOBAL_PERMISSIONS, false)); - builder.addAllPermissions(getCurrentACLPermissions(e)); - // TODO errors? + EntityAclPermission entityAclPermission = getCurrentACLPermission(e); + if (entityAclPermission != null) { + builder.setPermission(entityAclPermission); + } return builder.build(); } - private Iterable<? extends org.caosdb.api.entity.v1.EntityPermission> getCurrentACLPermissions( - EntityInterface e) { - List<org.caosdb.api.entity.v1.EntityPermission> result = new LinkedList<>(); - if (e.hasPermission(EntityPermission.EDIT_ACL)) { - org.caosdb.api.entity.v1.EntityPermission.Builder builder = - org.caosdb.api.entity.v1.EntityPermission.newBuilder(); - result.add(builder.setName(EntityPermission.EDIT_ACL.getShortName()).build()); - } + private org.caosdb.api.entity.v1.EntityAclPermission getCurrentACLPermission(EntityInterface e) { if (e.hasPermission(EntityPermission.EDIT_PRIORITY_ACL)) { - org.caosdb.api.entity.v1.EntityPermission.Builder builder = - org.caosdb.api.entity.v1.EntityPermission.newBuilder(); - result.add(builder.setName(EntityPermission.EDIT_PRIORITY_ACL.getShortName()).build()); + return EntityAclPermission.ENTITY_ACL_PERMISSION_EDIT_PRIORITY_ACL; } - return result; + if (e.hasPermission(EntityPermission.EDIT_ACL)) { + return EntityAclPermission.ENTITY_ACL_PERMISSION_EDIT_ACL; + } + return null; } private Iterable<? extends EntityPermissionRule> convert( @@ -540,8 +537,7 @@ public class CaosDBToGrpcConverters { List<org.caosdb.api.entity.v1.EntityPermission> result = new LinkedList<>(); for (EntityPermission p : aci.getPermission()) { - result.add( - org.caosdb.api.entity.v1.EntityPermission.newBuilder().setName(p.getShortName()).build()); + result.add(p.getMapping()); } return result; } diff --git a/src/main/java/org/caosdb/server/grpc/GrpcToCaosDBConverters.java b/src/main/java/org/caosdb/server/grpc/GrpcToCaosDBConverters.java index 582edb2d..d7c515a4 100644 --- a/src/main/java/org/caosdb/server/grpc/GrpcToCaosDBConverters.java +++ b/src/main/java/org/caosdb/server/grpc/GrpcToCaosDBConverters.java @@ -363,12 +363,14 @@ public class GrpcToCaosDBConverters { return fac.remove(org.caosdb.server.permissions.EntityACL.GLOBAL_PERMISSIONS).create(); } - private String[] convert(List<EntityPermission> permissionsList) { - ArrayList<String> result = new ArrayList<>(permissionsList.size()); + private org.caosdb.server.permissions.EntityPermission[] convert( + List<EntityPermission> permissionsList) { + ArrayList<org.caosdb.server.permissions.EntityPermission> result = + new ArrayList<>(permissionsList.size()); permissionsList.forEach( (p) -> { - result.add(p.getName()); + result.add(org.caosdb.server.permissions.EntityPermission.getEntityPermission(p)); }); - return result.toArray(new String[0]); + return result.toArray(new org.caosdb.server.permissions.EntityPermission[0]); } } diff --git a/src/main/java/org/caosdb/server/permissions/EntityPermission.java b/src/main/java/org/caosdb/server/permissions/EntityPermission.java index 31e9cc47..f8f21a35 100644 --- a/src/main/java/org/caosdb/server/permissions/EntityPermission.java +++ b/src/main/java/org/caosdb/server/permissions/EntityPermission.java @@ -37,6 +37,7 @@ public class EntityPermission extends Permission { private static final long serialVersionUID = -8935713878537140286L; private static List<EntityPermission> instances = new ArrayList<>(); private final int bitNumber; + private final org.caosdb.api.entity.v1.EntityPermission mapping; public static final Permission EDIT_PRIORITY_ACL = new Permission( "ADMIN:ENTITY:EDIT:PRIORITY_ACL", @@ -61,9 +62,14 @@ public class EntityPermission extends Permission { }; } - private EntityPermission(final String shortName, final String description, final int bitNumber) { + private EntityPermission( + final String shortName, + final String description, + final int bitNumber, + org.caosdb.api.entity.v1.EntityPermission mapping) { super(shortName, description); this.bitNumber = bitNumber; + this.mapping = mapping; if (bitNumber > 61) { throw new CaosDBException( "This bitNumber is too big. This implementation only handles bitNumbers up to 61."); @@ -106,6 +112,16 @@ public class EntityPermission extends Permission { throw new IllegalArgumentException("Permission is not defined."); } + public static EntityPermission getEntityPermission( + final org.caosdb.api.entity.v1.EntityPermission permission) { + for (final EntityPermission p : instances) { + if (p.getMapping() == permission) { + return p; + } + } + throw new IllegalArgumentException("Permission not found." + permission.name()); + } + public long getBitSet() { return (long) Math.pow(2, getBitNumber()); } @@ -120,78 +136,153 @@ public class EntityPermission extends Permission { return ret; } + public org.caosdb.api.entity.v1.EntityPermission getMapping() { + return mapping; + } + public static final EntityPermission RETRIEVE_ENTITY = new EntityPermission( "RETRIEVE:ENTITY", "Permission to retrieve the full entity (name, description, data type, ...) with all parents and properties (unless prohibited by another rule on the property level).", - 4); + 4, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_RETRIEVE_ENTITY); public static final EntityPermission RETRIEVE_ACL = new EntityPermission( - "RETRIEVE:ACL", "Permission to retrieve the full and final ACL of this entity.", 5); + "RETRIEVE:ACL", + "Permission to retrieve the full and final ACL of this entity.", + 5, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_RETRIEVE_ACL); public static final EntityPermission RETRIEVE_HISTORY = new EntityPermission( - "RETRIEVE:HISTORY", "Permission to retrieve the history of this entity.", 6); + "RETRIEVE:HISTORY", + "Permission to retrieve the history of this entity.", + 6, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_RETRIEVE_HISTORY); public static final EntityPermission RETRIEVE_OWNER = new EntityPermission( - "RETRIEVE:OWNER", "Permission to retrieve the owner(s) of this entity.", 9); + "RETRIEVE:OWNER", + "Permission to retrieve the owner(s) of this entity.", + 9, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_RETRIEVE_OWNER); public static final EntityPermission RETRIEVE_FILE = new EntityPermission( - "RETRIEVE:FILE", "Permission to download the file belonging to this entity.", 10); + "RETRIEVE:FILE", + "Permission to download the file belonging to this entity.", + 10, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_RETRIEVE_FILE); public static final EntityPermission DELETE = - new EntityPermission("DELETE", "Permission to delete an entity.", 1); + new EntityPermission( + "DELETE", + "Permission to delete an entity.", + 1, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_DELETE); public static final EntityPermission EDIT_ACL = new EntityPermission( "EDIT:ACL", "Permission to change the user-specified part of this entity's ACL. Roles with this Permission are called 'Owners'.", - 0); + 0, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_EDIT_ACL); public static final EntityPermission UPDATE_DESCRIPTION = new EntityPermission( - "UPDATE:DESCRIPTION", "Permission to change the value of this entity.", 11); + "UPDATE:DESCRIPTION", + "Permission to change the value of this entity.", + 11, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_DESCRIPTION); public static final EntityPermission UPDATE_VALUE = - new EntityPermission("UPDATE:VALUE", "Permission to change the value of this entity.", 12); + new EntityPermission( + "UPDATE:VALUE", + "Permission to change the value of this entity.", + 12, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_VALUE); public static final EntityPermission UPDATE_ROLE = - new EntityPermission("UPDATE:ROLE", "Permission to change the role of this entity.", 13); + new EntityPermission( + "UPDATE:ROLE", + "Permission to change the role of this entity.", + 13, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_ROLE); public static final EntityPermission UPDATE_REMOVE_PARENT = new EntityPermission( - "UPDATE:PARENT:REMOVE", "Permission to remove parents from this entity.", 14); + "UPDATE:PARENT:REMOVE", + "Permission to remove parents from this entity.", + 14, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_REMOVE_PARENT); public static final EntityPermission UPDATE_ADD_PARENT = - new EntityPermission("UPDATE:PARENT:ADD", "Permission to add a parent to this entity.", 15); + new EntityPermission( + "UPDATE:PARENT:ADD", + "Permission to add a parent to this entity.", + 15, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_ADD_PARENT); public static final EntityPermission UPDATE_REMOVE_PROPERTY = new EntityPermission( - "UPDATE:PROPERTY:REMOVE", "Permission to remove properties from this entity.", 16); + "UPDATE:PROPERTY:REMOVE", + "Permission to remove properties from this entity.", + 16, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_REMOVE_PROPERTY); public static final EntityPermission UPDATE_ADD_PROPERTY = new EntityPermission( - "UPDATE:PROPERTY:ADD", "Permission to add a property to this entity.", 17); + "UPDATE:PROPERTY:ADD", + "Permission to add a property to this entity.", + 17, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_ADD_PROPERTY); public static final EntityPermission UPDATE_NAME = - new EntityPermission("UPDATE:NAME", "Permission to change the name of this entity.", 19); + new EntityPermission( + "UPDATE:NAME", + "Permission to change the name of this entity.", + 19, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_NAME); public static final EntityPermission UPDATE_DATA_TYPE = new EntityPermission( - "UPDATE:DATA_TYPE", "Permission to change the data type of this entity.", 20); + "UPDATE:DATA_TYPE", + "Permission to change the data type of this entity.", + 20, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_DATA_TYPE); public static final EntityPermission UPDATE_REMOVE_FILE = new EntityPermission( - "UPDATE:FILE:REMOVE", "Permission to delete the file of this entity.", 21); + "UPDATE:FILE:REMOVE", + "Permission to delete the file of this entity.", + 21, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_REMOVE_FILE); public static final EntityPermission UPDATE_ADD_FILE = - new EntityPermission("UPDATE:FILE:ADD", "Permission to set a file for this entity.", 22); + new EntityPermission( + "UPDATE:FILE:ADD", + "Permission to set a file for this entity.", + 22, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_ADD_FILE); public static final EntityPermission UPDATE_MOVE_FILE = new EntityPermission( - "UPDATE:FILE:MOVE", "Permission to move an existing file to a new location.", 23); + "UPDATE:FILE:MOVE", + "Permission to move an existing file to a new location.", + 23, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_MOVE_FILE); public static final EntityPermission USE_AS_REFERENCE = new EntityPermission( - "USE:AS_REFERENCE", "Permission to refer to this entity via a reference property.", 24); + "USE:AS_REFERENCE", + "Permission to refer to this entity via a reference property.", + 24, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_USE_AS_REFERENCE); public static final EntityPermission USE_AS_PROPERTY = new EntityPermission( - "USE:AS_PROPERTY", "Permission to implement this entity as a property.", 25); + "USE:AS_PROPERTY", + "Permission to implement this entity as a property.", + 25, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_USE_AS_PROPERTY); public static final EntityPermission USE_AS_PARENT = new EntityPermission( - "USE:AS_PARENT", "Permission to use this entity as a super type for other entities.", 26); + "USE:AS_PARENT", + "Permission to use this entity as a super type for other entities.", + 26, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_USE_AS_PARENT); public static final EntityPermission USE_AS_DATA_TYPE = new EntityPermission( "USE:AS_DATA_TYPE", "Permission to use this entity as a data type for reference properties.", - 27); + 27, + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_USE_AS_DATA_TYPE); public static final EntityPermission UPDATE_QUERY_TEMPLATE_DEFINITION = new EntityPermission( "UPDATE:QUERY_TEMPLATE_DEFINITION", "Permission to update the query template definition of this QueryTemplate", - 28); + 28, + org.caosdb.api.entity.v1.EntityPermission + .ENTITY_PERMISSION_UPDATE_QUERY_TEMPLATE_DEFINITION); } diff --git a/src/test/java/org/caosdb/server/permissions/EntityPermissionTest.java b/src/test/java/org/caosdb/server/permissions/EntityPermissionTest.java new file mode 100644 index 00000000..fd7c3e8e --- /dev/null +++ b/src/test/java/org/caosdb/server/permissions/EntityPermissionTest.java @@ -0,0 +1,92 @@ +package org.caosdb.server.permissions; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class EntityPermissionTest { + + @Test + public void testGRPCMapping() { + assertEquals( + EntityPermission.EDIT_ACL.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_EDIT_ACL); + + assertEquals( + EntityPermission.DELETE.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_DELETE); + + assertEquals( + EntityPermission.USE_AS_DATA_TYPE.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_USE_AS_DATA_TYPE); + assertEquals( + EntityPermission.USE_AS_PARENT.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_USE_AS_PARENT); + assertEquals( + EntityPermission.USE_AS_PROPERTY.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_USE_AS_PROPERTY); + assertEquals( + EntityPermission.USE_AS_REFERENCE.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_USE_AS_REFERENCE); + + assertEquals( + EntityPermission.RETRIEVE_ENTITY.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_RETRIEVE_ENTITY); + assertEquals( + EntityPermission.RETRIEVE_ACL.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_RETRIEVE_ACL); + assertEquals( + EntityPermission.RETRIEVE_OWNER.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_RETRIEVE_OWNER); + assertEquals( + EntityPermission.RETRIEVE_HISTORY.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_RETRIEVE_HISTORY); + assertEquals( + EntityPermission.RETRIEVE_FILE.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_RETRIEVE_FILE); + + assertEquals( + EntityPermission.UPDATE_VALUE.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_VALUE); + assertEquals( + EntityPermission.UPDATE_DESCRIPTION.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_DESCRIPTION); + assertEquals( + EntityPermission.UPDATE_DATA_TYPE.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_DATA_TYPE); + assertEquals( + EntityPermission.UPDATE_NAME.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_NAME); + assertEquals( + EntityPermission.UPDATE_QUERY_TEMPLATE_DEFINITION.getMapping(), + org.caosdb.api.entity.v1.EntityPermission + .ENTITY_PERMISSION_UPDATE_QUERY_TEMPLATE_DEFINITION); + assertEquals( + EntityPermission.UPDATE_ROLE.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_ROLE); + + assertEquals( + EntityPermission.UPDATE_ADD_PARENT.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_ADD_PARENT); + assertEquals( + EntityPermission.UPDATE_REMOVE_PARENT.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_REMOVE_PARENT); + + assertEquals( + EntityPermission.UPDATE_ADD_PROPERTY.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_ADD_PROPERTY); + assertEquals( + EntityPermission.UPDATE_REMOVE_PROPERTY.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_REMOVE_PROPERTY); + + assertEquals( + EntityPermission.UPDATE_ADD_FILE.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_ADD_FILE); + assertEquals( + EntityPermission.UPDATE_REMOVE_FILE.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_REMOVE_FILE); + assertEquals( + EntityPermission.UPDATE_MOVE_FILE.getMapping(), + org.caosdb.api.entity.v1.EntityPermission.ENTITY_PERMISSION_UPDATE_MOVE_FILE); + } +} -- GitLab