From cef83d451bec15379837bea18c26247dbe28d3a7 Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Fri, 22 Oct 2021 13:51:06 +0200
Subject: [PATCH] WIP: ACM Service

---
 caosdb-proto                                  |  2 +-
 .../server/database/BackendTransaction.java   |  3 ++
 .../implementation/MySQL/MySQLListRoles.java  | 44 ++++++++++++++++
 .../backend/interfaces/ListRolesImpl.java     |  9 ++++
 .../AccessControlManagementServiceImpl.java   | 52 +++++++++++++++++++
 .../caosdb/server/transaction/ListRoles.java  | 21 ++++++++
 .../transaction/ListRolesTransaction.java     | 19 +++++++
 7 files changed, 149 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLListRoles.java
 create mode 100644 src/main/java/org/caosdb/server/database/backend/interfaces/ListRolesImpl.java
 create mode 100644 src/main/java/org/caosdb/server/grpc/AccessControlManagementServiceImpl.java
 create mode 100644 src/main/java/org/caosdb/server/transaction/ListRoles.java
 create mode 100644 src/main/java/org/caosdb/server/transaction/ListRolesTransaction.java

diff --git a/caosdb-proto b/caosdb-proto
index 73d85fb2..26b47c4c 160000
--- a/caosdb-proto
+++ b/caosdb-proto
@@ -1 +1 @@
-Subproject commit 73d85fb20bb16902c0a89dda697eed17994712bc
+Subproject commit 26b47c4c875ab6f664e83ae332434550ea12d663
diff --git a/src/main/java/org/caosdb/server/database/BackendTransaction.java b/src/main/java/org/caosdb/server/database/BackendTransaction.java
index 7c26db1e..f42c849c 100644
--- a/src/main/java/org/caosdb/server/database/BackendTransaction.java
+++ b/src/main/java/org/caosdb/server/database/BackendTransaction.java
@@ -44,6 +44,7 @@ import org.caosdb.server.database.backend.implementation.MySQL.MySQLInsertRole;
 import org.caosdb.server.database.backend.implementation.MySQL.MySQLInsertSparseEntity;
 import org.caosdb.server.database.backend.implementation.MySQL.MySQLInsertTransactionHistory;
 import org.caosdb.server.database.backend.implementation.MySQL.MySQLIsSubType;
+import org.caosdb.server.database.backend.implementation.MySQL.MySQLListRoles;
 import org.caosdb.server.database.backend.implementation.MySQL.MySQLRegisterSubDomain;
 import org.caosdb.server.database.backend.implementation.MySQL.MySQLRetrieveAll;
 import org.caosdb.server.database.backend.implementation.MySQL.MySQLRetrieveAllUncheckedFiles;
@@ -99,6 +100,7 @@ import org.caosdb.server.database.backend.interfaces.InsertRoleImpl;
 import org.caosdb.server.database.backend.interfaces.InsertSparseEntityImpl;
 import org.caosdb.server.database.backend.interfaces.InsertTransactionHistoryImpl;
 import org.caosdb.server.database.backend.interfaces.IsSubTypeImpl;
+import org.caosdb.server.database.backend.interfaces.ListRolesImpl;
 import org.caosdb.server.database.backend.interfaces.RegisterSubDomainImpl;
 import org.caosdb.server.database.backend.interfaces.RetrieveAllImpl;
 import org.caosdb.server.database.backend.interfaces.RetrieveAllUncheckedFilesImpl;
@@ -192,6 +194,7 @@ public abstract class BackendTransaction implements Undoable {
       setImpl(FileCheckSize.class, UnixFileSystemCheckSize.class);
       setImpl(InsertRoleImpl.class, MySQLInsertRole.class);
       setImpl(RetrieveRoleImpl.class, MySQLRetrieveRole.class);
+      setImpl(ListRolesImpl.class, MySQLListRoles.class);
       setImpl(DeleteRoleImpl.class, MySQLDeleteRole.class);
       setImpl(SetPermissionRulesImpl.class, MySQLSetPermissionRules.class);
       setImpl(RetrievePermissionRulesImpl.class, MySQLRetrievePermissionRules.class);
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLListRoles.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLListRoles.java
new file mode 100644
index 00000000..695499ce
--- /dev/null
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLListRoles.java
@@ -0,0 +1,44 @@
+package org.caosdb.server.database.backend.implementation.MySQL;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.LinkedList;
+import java.util.List;
+import org.caosdb.server.accessControl.Role;
+import org.caosdb.server.database.access.Access;
+import org.caosdb.server.database.backend.interfaces.ListRolesImpl;
+import org.caosdb.server.database.exceptions.TransactionException;
+
+public class MySQLListRoles extends MySQLTransaction implements ListRolesImpl {
+
+  public MySQLListRoles(Access access) {
+    super(access);
+  }
+
+  public static final String STMT_LIST_ROLES = "SELECT name, description FROM roles";
+
+  @Override
+  public List<Role> execute() {
+    List<Role> roles = new LinkedList<>();
+    try {
+      final PreparedStatement stmt = prepareStatement(STMT_LIST_ROLES);
+      final ResultSet rs = stmt.executeQuery();
+      try {
+        while (rs.next()) {
+          final Role role = new Role();
+          role.name = rs.getString("name");
+          role.description = rs.getString("description");
+          roles.add(role);
+        }
+      } finally {
+        rs.close();
+      }
+    } catch (final SQLException e) {
+      throw new TransactionException(e);
+    } catch (final ConnectionException e) {
+      throw new TransactionException(e);
+    }
+    return roles;
+  }
+}
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/ListRolesImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/ListRolesImpl.java
new file mode 100644
index 00000000..fbd0b0e5
--- /dev/null
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/ListRolesImpl.java
@@ -0,0 +1,9 @@
+package org.caosdb.server.database.backend.interfaces;
+
+import java.util.List;
+import org.caosdb.server.accessControl.Role;
+
+public interface ListRolesImpl extends BackendTransactionImpl {
+
+  public List<Role> execute();
+}
diff --git a/src/main/java/org/caosdb/server/grpc/AccessControlManagementServiceImpl.java b/src/main/java/org/caosdb/server/grpc/AccessControlManagementServiceImpl.java
new file mode 100644
index 00000000..fa664a73
--- /dev/null
+++ b/src/main/java/org/caosdb/server/grpc/AccessControlManagementServiceImpl.java
@@ -0,0 +1,52 @@
+package org.caosdb.server.grpc;
+
+import io.grpc.stub.StreamObserver;
+import java.util.List;
+import org.caosdb.api.acm.v1alpha1.AccessControlManagementServiceGrpc.AccessControlManagementServiceImplBase;
+import org.caosdb.api.acm.v1alpha1.ListRolesRequest;
+import org.caosdb.api.acm.v1alpha1.ListRolesResponse;
+import org.caosdb.server.accessControl.Role;
+import org.caosdb.server.transaction.ListRolesTransaction;
+
+public class AccessControlManagementServiceImpl extends AccessControlManagementServiceImplBase {
+
+  @Override
+  public void listRoles(
+      ListRolesRequest request, StreamObserver<ListRolesResponse> responseObserver) {
+    try {
+      final ListRolesResponse response = listRolesTransaction(request);
+      responseObserver.onNext(response);
+      responseObserver.onCompleted();
+
+    } catch (final Exception e) {
+      e.printStackTrace();
+      responseObserver.onError(e);
+    }
+  }
+
+  private ListRolesResponse listRolesTransaction(ListRolesRequest request) throws Exception {
+    ListRolesTransaction transaction = new ListRolesTransaction();
+    transaction.execute();
+    List<Role> roles = transaction.getRoles();
+
+    return convert(roles);
+  }
+
+  private ListRolesResponse convert(List<Role> roles) {
+    ListRolesResponse.Builder response = ListRolesResponse.newBuilder();
+    roles.forEach(
+        role -> {
+          response.addRoles(convert(role));
+        });
+
+    return response.build();
+  }
+
+  private org.caosdb.api.acm.v1alpha1.Role.Builder convert(Role role) {
+    org.caosdb.api.acm.v1alpha1.Role.Builder result = org.caosdb.api.acm.v1alpha1.Role.newBuilder();
+    result.setDescription(role.description);
+    result.setName(role.name);
+
+    return result;
+  }
+}
diff --git a/src/main/java/org/caosdb/server/transaction/ListRoles.java b/src/main/java/org/caosdb/server/transaction/ListRoles.java
new file mode 100644
index 00000000..2dcad460
--- /dev/null
+++ b/src/main/java/org/caosdb/server/transaction/ListRoles.java
@@ -0,0 +1,21 @@
+package org.caosdb.server.transaction;
+
+import java.util.List;
+import org.caosdb.server.accessControl.Role;
+import org.caosdb.server.database.BackendTransaction;
+import org.caosdb.server.database.backend.interfaces.ListRolesImpl;
+
+public class ListRoles extends BackendTransaction {
+
+  private List<Role> roles;
+
+  @Override
+  protected void execute() {
+    ListRolesImpl t = getImplementation(ListRolesImpl.class);
+    roles = t.execute();
+  }
+
+  public List<Role> getRoles() {
+    return roles;
+  }
+}
diff --git a/src/main/java/org/caosdb/server/transaction/ListRolesTransaction.java b/src/main/java/org/caosdb/server/transaction/ListRolesTransaction.java
new file mode 100644
index 00000000..244fc168
--- /dev/null
+++ b/src/main/java/org/caosdb/server/transaction/ListRolesTransaction.java
@@ -0,0 +1,19 @@
+package org.caosdb.server.transaction;
+
+import java.util.List;
+import org.caosdb.server.accessControl.Role;
+import org.caosdb.server.database.backend.transaction.ListRoles;
+
+public class ListRolesTransaction extends AccessControlTransaction {
+
+  private List<Role> roles = null;
+
+  @Override
+  protected void transaction() throws Exception {
+    roles = execute(new ListRoles(), getAccess()).getRoles();
+  }
+
+  public List<Role> getRoles() {
+    return roles;
+  }
+}
-- 
GitLab