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