From 60af96829a10276513a50d010a7630824143d281 Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Thu, 27 Jan 2022 17:27:38 +0100
Subject: [PATCH] FIX: missing file descriptor serialization in GRPC API

---
 CHANGELOG.md                                        |  4 +---
 .../caosdb/server/grpc/CaosDBToGrpcConverters.java  | 12 ++++++++++++
 .../caosdb/server/grpc/GrpcToCaosDBConverters.java  |  2 +-
 .../server/grpc/CaosDBToGrpcConvertersTest.java     | 13 +++++++++++++
 4 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index a410c02f..09aa1b26 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,8 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ## [Unreleased]
 
-This is an important security update.
-
 ### Added
 
 ### Changed
@@ -21,10 +19,10 @@ This is an important security update.
 
 * Wrong serialization of date time values in the GRPC-API (resulting in
   org.caosdb.server.datatime@12347abcd or similar).
+* Missing serialization of file descriptors in the GRPC-API during retrievals.
 
 ### Security
 
-
 ## [v0.7.1] - 2021-12-13
 (Timm Fitschen)
 
diff --git a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java
index 168b90d8..8b93acc9 100644
--- a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java
+++ b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java
@@ -35,6 +35,7 @@ import org.caosdb.api.entity.v1.EntityPermissionRule;
 import org.caosdb.api.entity.v1.EntityPermissionRuleCapability;
 import org.caosdb.api.entity.v1.EntityResponse;
 import org.caosdb.api.entity.v1.EntityRole;
+import org.caosdb.api.entity.v1.FileDescriptor;
 import org.caosdb.api.entity.v1.Importance;
 import org.caosdb.api.entity.v1.ListDataType;
 import org.caosdb.api.entity.v1.MessageCode;
@@ -61,6 +62,7 @@ import org.caosdb.server.datatype.ReferenceValue;
 import org.caosdb.server.datatype.TextDatatype;
 import org.caosdb.server.datatype.Value;
 import org.caosdb.server.entity.EntityInterface;
+import org.caosdb.server.entity.FileProperties;
 import org.caosdb.server.entity.MagicTypes;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.Role;
@@ -131,6 +133,9 @@ public class CaosDBToGrpcConverters {
     if (from.hasParents()) {
       entityBuilder.addAllParents(convert(from.getParents()));
     }
+    if (from.hasFileProperties()) {
+      entityBuilder.setFileDescriptor(convert(from.getFileProperties()));
+    }
 
     final EntityResponse.Builder responseBuilder = EntityResponse.newBuilder();
     responseBuilder.setEntity(entityBuilder);
@@ -140,6 +145,13 @@ public class CaosDBToGrpcConverters {
     return responseBuilder;
   }
 
+  private FileDescriptor.Builder convert(FileProperties fileProperties) {
+    FileDescriptor.Builder result = FileDescriptor.newBuilder();
+    result.setPath(fileProperties.getPath());
+    result.setSize(fileProperties.getSize());
+    return result;
+  }
+
   private EntityRole convert(final Role role) {
     switch (role) {
       case RecordType:
diff --git a/src/main/java/org/caosdb/server/grpc/GrpcToCaosDBConverters.java b/src/main/java/org/caosdb/server/grpc/GrpcToCaosDBConverters.java
index 5420a8d8..582edb2d 100644
--- a/src/main/java/org/caosdb/server/grpc/GrpcToCaosDBConverters.java
+++ b/src/main/java/org/caosdb/server/grpc/GrpcToCaosDBConverters.java
@@ -125,7 +125,7 @@ public class GrpcToCaosDBConverters {
     if (from.getParentsCount() > 0) {
       entity.getParents().addAll(convertParents(from.getParentsList()));
     }
-    if (from.hasFileDescriptor()) {
+    if (entity.getRole() == Role.File && from.hasFileDescriptor()) {
       entity.setFileProperties(convert(from.getFileDescriptor()));
     }
     return entity;
diff --git a/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java
index 445ec018..6b21c9b1 100644
--- a/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java
+++ b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java
@@ -6,6 +6,8 @@ import static org.junit.Assert.assertNull;
 import java.util.TimeZone;
 import org.caosdb.datetime.DateTimeFactory2;
 import org.caosdb.server.datatype.Value;
+import org.caosdb.server.entity.FileProperties;
+import org.caosdb.server.entity.RetrieveEntity;
 import org.junit.Test;
 
 public class CaosDBToGrpcConvertersTest {
@@ -40,4 +42,15 @@ public class CaosDBToGrpcConvertersTest {
         converters.convertScalarValue(value).toString(),
         "string_value: \"2022-12-24T16:15:00.999999+0000\"\n");
   }
+
+  @Test
+  public void testConvertEntity_FileDescriptor() {
+    RetrieveEntity entity = new RetrieveEntity(null);
+    CaosDBToGrpcConverters converters = new CaosDBToGrpcConverters(null);
+    assertEquals(converters.convert(entity).toString(), "entity {\n}\n");
+    entity.setFileProperties(new FileProperties("checksum1234", "the/path", 1024L));
+    assertEquals(
+        converters.convert(entity).toString(),
+        "entity {\n  file_descriptor {\n    path: \"the/path\"\n    size: 1024\n  }\n}\n");
+  }
 }
-- 
GitLab