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