diff --git a/caosdb-proto b/caosdb-proto index 26b47c4c875ab6f664e83ae332434550ea12d663..d58c9a81babf25c374b6a0db8c76b162855c06e9 160000 --- a/caosdb-proto +++ b/caosdb-proto @@ -1 +1 @@ -Subproject commit 26b47c4c875ab6f664e83ae332434550ea12d663 +Subproject commit d58c9a81babf25c374b6a0db8c76b162855c06e9 diff --git a/src/main/java/org/caosdb/server/transaction/ListRoles.java b/src/main/java/org/caosdb/server/database/backend/transaction/ListRoles.java similarity index 89% rename from src/main/java/org/caosdb/server/transaction/ListRoles.java rename to src/main/java/org/caosdb/server/database/backend/transaction/ListRoles.java index 2dcad4600953b39b9c3f56114dac0a3a6bfd0fa8..f2f0cc9fab0235f76148d535b9424f71dda6f281 100644 --- a/src/main/java/org/caosdb/server/transaction/ListRoles.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/ListRoles.java @@ -1,4 +1,4 @@ -package org.caosdb.server.transaction; +package org.caosdb.server.database.backend.transaction; import java.util.List; import org.caosdb.server.accessControl.Role; diff --git a/src/main/java/org/caosdb/server/grpc/AccessControlManagementServiceImpl.java b/src/main/java/org/caosdb/server/grpc/AccessControlManagementServiceImpl.java index fa664a7358f2f0910ced07e3efa8e545137a5fa3..5987b28936e4ea6b4444fad6fe73fe7bd2a71edc 100644 --- a/src/main/java/org/caosdb/server/grpc/AccessControlManagementServiceImpl.java +++ b/src/main/java/org/caosdb/server/grpc/AccessControlManagementServiceImpl.java @@ -3,33 +3,24 @@ 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.CreateSingleRoleRequest; +import org.caosdb.api.acm.v1alpha1.CreateSingleRoleResponse; 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.InsertRoleTransaction; 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(); + /////////////////////////////////// CONVERTERS - } 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(); + private Role convert(org.caosdb.api.acm.v1alpha1.Role role) { + Role result = new Role(); - return convert(roles); + result.name = role.getName(); + result.description = role.getDescription(); + return result; } private ListRolesResponse convert(List<Role> roles) { @@ -49,4 +40,55 @@ public class AccessControlManagementServiceImpl extends AccessControlManagementS return result; } + + ////////////////////////////////////// RPC Methods (Implementation) + + ////////////////// ... for roles + + private ListRolesResponse listRolesTransaction(ListRolesRequest request) throws Exception { + ListRolesTransaction transaction = new ListRolesTransaction(); + transaction.execute(); + List<Role> roles = transaction.getRoles(); + + return convert(roles); + } + + private CreateSingleRoleResponse createSingleRoleTransaction(CreateSingleRoleRequest request) + throws Exception { + Role role = convert(request.getRole()); + InsertRoleTransaction transaction = new InsertRoleTransaction(role); + transaction.execute(); + + return CreateSingleRoleResponse.newBuilder().build(); + } + + ///////////////////////////////////// RPC Methods (API) + + @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); + } + } + + @Override + public void createSingleRole( + CreateSingleRoleRequest request, StreamObserver<CreateSingleRoleResponse> responseObserver) { + try { + final CreateSingleRoleResponse response = createSingleRoleTransaction(request); + responseObserver.onNext(response); + responseObserver.onCompleted(); + + } catch (final Exception e) { + e.printStackTrace(); + responseObserver.onError(e); + } + } } diff --git a/src/main/java/org/caosdb/server/grpc/GRPCServer.java b/src/main/java/org/caosdb/server/grpc/GRPCServer.java index 1fd965047eff71db02bdfd6394386d4625ca3703..ff939976d2ea1ec6999770c60b8348f98be58ad1 100644 --- a/src/main/java/org/caosdb/server/grpc/GRPCServer.java +++ b/src/main/java/org/caosdb/server/grpc/GRPCServer.java @@ -26,6 +26,7 @@ import io.grpc.netty.GrpcSslContexts; import io.grpc.netty.NettyServerBuilder; import io.grpcweb.GrpcPortNumRelay; import io.grpcweb.JettyWebserverForGrpcwebTraffic; +import io.grpcweb.ServiceToClassMapping; import io.netty.handler.ssl.ApplicationProtocolConfig; import io.netty.handler.ssl.ApplicationProtocolConfig.Protocol; import io.netty.handler.ssl.ApplicationProtocolConfig.SelectedListenerFailureBehavior; @@ -44,6 +45,10 @@ import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; import javax.net.ssl.KeyManagerFactory; +import org.caosdb.api.acm.v1alpha1.AccessControlManagementServiceGrpc; +import org.caosdb.api.entity.v1alpha1.EntityTransactionServiceGrpc; +import org.caosdb.api.entity.v1alpha1.FileTransmissionServiceGrpc; +import org.caosdb.api.info.v1alpha1.GeneralInfoServiceGrpc; import org.caosdb.server.CaosDBServer; import org.caosdb.server.ServerProperties; import org.slf4j.Logger; @@ -116,12 +121,27 @@ public class GRPCServer { private List<ServerServiceDefinition> getEnabledServices() { final List<ServerServiceDefinition> services = new LinkedList<>(); + // Add mapping from the service name to the service class (for the grpc-web proxy) + ServiceToClassMapping.put( + AccessControlManagementServiceGrpc.SERVICE_NAME, AccessControlManagementServiceGrpc.class); + final AccessControlManagementServiceImpl accessControlManagementService = + new AccessControlManagementServiceImpl(); + services.add(ServerInterceptors.intercept(accessControlManagementService, authInterceptor)); + + // Add mapping from the service name to the service class (for the grpc-web proxy) + ServiceToClassMapping.put(GeneralInfoServiceGrpc.SERVICE_NAME, GeneralInfoServiceGrpc.class); final GeneralInfoServiceImpl generalInfoService = new GeneralInfoServiceImpl(); services.add(ServerInterceptors.intercept(generalInfoService, authInterceptor)); + // Add mapping from the service name to the service class (for the grpc-web proxy) + ServiceToClassMapping.put( + FileTransmissionServiceGrpc.SERVICE_NAME, FileTransmissionServiceGrpc.class); final FileTransmissionServiceImpl fileTransmissionService = new FileTransmissionServiceImpl(); services.add(ServerInterceptors.intercept(fileTransmissionService, authInterceptor)); + // Add mapping from the service name to the service class (for the grpc-web proxy) + ServiceToClassMapping.put( + EntityTransactionServiceGrpc.SERVICE_NAME, EntityTransactionServiceGrpc.class); final EntityTransactionServiceImpl entityTransactionService = new EntityTransactionServiceImpl(fileTransmissionService); services.add(ServerInterceptors.intercept(entityTransactionService, authInterceptor)); @@ -194,18 +214,19 @@ public class GRPCServer { CaosDBServer.addPreShutdownHook(new ServerStopper(server)); server.start(); logger.info("Started GRPC (HTTP) on port {}", port_http); + + // Start the grpc-web proxy on grpc-web-port. + (new JettyWebserverForGrpcwebTraffic(9443)).start(); + + // grpc-web proxy needs to know the grpc-port# so it could connect to the grpc service. + GrpcPortNumRelay.setGrpcPortNum(port_http); + } else if (!started) { logger.warn( "No GRPC Server has been started. Please configure {} or {} to do so.", ServerProperties.KEY_GRPC_SERVER_PORT_HTTP, ServerProperties.KEY_GRPC_SERVER_PORT_HTTPS); } - - // Start the grpc-web proxy on grpc-web-port. - (new JettyWebserverForGrpcwebTraffic(9443)).start(); - - // grpc-web proxy needs to know the grpc-port# so it could connect to the grpc service. - GrpcPortNumRelay.setGrpcPortNum(8080); } private static class ServerStopper implements Runnable { diff --git a/src/main/java/org/caosdb/server/grpc/GeneralInfoServiceImpl.java b/src/main/java/org/caosdb/server/grpc/GeneralInfoServiceImpl.java index dfd10ac86090de97a6151e330ade846c1de6273e..4caa160c18b2f72310fdbe8ed05f221166b51145 100644 --- a/src/main/java/org/caosdb/server/grpc/GeneralInfoServiceImpl.java +++ b/src/main/java/org/caosdb/server/grpc/GeneralInfoServiceImpl.java @@ -21,11 +21,16 @@ package org.caosdb.server.grpc; import io.grpc.stub.StreamObserver; import org.caosdb.api.info.v1alpha1.GeneralInfoServiceGrpc.GeneralInfoServiceImplBase; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; +import org.caosdb.api.info.v1alpha1.GetSessionInfoRequest; +import org.caosdb.api.info.v1alpha1.GetSessionInfoResponse; import org.caosdb.api.info.v1alpha1.GetVersionInfoRequest; import org.caosdb.api.info.v1alpha1.GetVersionInfoResponse; import org.caosdb.api.info.v1alpha1.VersionInfo; import org.caosdb.server.CaosDBServer; import org.caosdb.server.ServerProperties; +import org.caosdb.server.accessControl.Principal; /** * Implementation of the GeneralInfoService. @@ -65,4 +70,20 @@ public class GeneralInfoServiceImpl extends GeneralInfoServiceImplBase { responseObserver.onNext(response); responseObserver.onCompleted(); } + + @Override + public void getSessionInfo(GetSessionInfoRequest request, + StreamObserver<GetSessionInfoResponse> responseObserver) { + final GetSessionInfoResponse.Builder response = + GetSessionInfoResponse.newBuilder(); + + Subject user = SecurityUtils.getSubject(); + Principal principal = (Principal) user.getPrincipal(); + + response.setUsername(principal.getUsername()); + response.setRealm(principal.getRealm()); + + responseObserver.onNext(response.build()); + responseObserver.onCompleted(); + } }