diff --git a/caosdb-proto b/caosdb-proto index 73d85fb20bb16902c0a89dda697eed17994712bc..26b47c4c875ab6f664e83ae332434550ea12d663 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 7c26db1ed05e76c30f9d30f0c3d9965ed0c59b6b..f42c849c08e982b835df2629c07d70e1df882a8e 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 0000000000000000000000000000000000000000..695499cec3a37cf584fb3f825a3f57d189dbc4a2 --- /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 0000000000000000000000000000000000000000..fbd0b0e5e109e2c6c4aed76746d335633d511f6b --- /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 0000000000000000000000000000000000000000..fa664a7358f2f0910ced07e3efa8e545137a5fa3 --- /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 0000000000000000000000000000000000000000..2dcad4600953b39b9c3f56114dac0a3a6bfd0fa8 --- /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 0000000000000000000000000000000000000000..244fc1689e2baff06c0443319105b10f1a4fe4b7 --- /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; + } +}