Skip to content
Snippets Groups Projects
Verified Commit a98dc728 authored by Timm Fitschen's avatar Timm Fitschen
Browse files

WIP: ACM

parent cef83d45
No related branches found
No related tags found
2 merge requests!58REL: prepare release 0.7.2,!45F grpc f acm
caosdb-proto @ d58c9a81
Subproject commit 26b47c4c875ab6f664e83ae332434550ea12d663 Subproject commit d58c9a81babf25c374b6a0db8c76b162855c06e9
package org.caosdb.server.transaction; package org.caosdb.server.database.backend.transaction;
import java.util.List; import java.util.List;
import org.caosdb.server.accessControl.Role; import org.caosdb.server.accessControl.Role;
......
...@@ -3,33 +3,24 @@ package org.caosdb.server.grpc; ...@@ -3,33 +3,24 @@ package org.caosdb.server.grpc;
import io.grpc.stub.StreamObserver; import io.grpc.stub.StreamObserver;
import java.util.List; import java.util.List;
import org.caosdb.api.acm.v1alpha1.AccessControlManagementServiceGrpc.AccessControlManagementServiceImplBase; 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.ListRolesRequest;
import org.caosdb.api.acm.v1alpha1.ListRolesResponse; import org.caosdb.api.acm.v1alpha1.ListRolesResponse;
import org.caosdb.server.accessControl.Role; import org.caosdb.server.accessControl.Role;
import org.caosdb.server.transaction.InsertRoleTransaction;
import org.caosdb.server.transaction.ListRolesTransaction; import org.caosdb.server.transaction.ListRolesTransaction;
public class AccessControlManagementServiceImpl extends AccessControlManagementServiceImplBase { public class AccessControlManagementServiceImpl extends AccessControlManagementServiceImplBase {
@Override /////////////////////////////////// CONVERTERS
public void listRoles(
ListRolesRequest request, StreamObserver<ListRolesResponse> responseObserver) {
try {
final ListRolesResponse response = listRolesTransaction(request);
responseObserver.onNext(response);
responseObserver.onCompleted();
} catch (final Exception e) { private Role convert(org.caosdb.api.acm.v1alpha1.Role role) {
e.printStackTrace(); Role result = new Role();
responseObserver.onError(e);
}
}
private ListRolesResponse listRolesTransaction(ListRolesRequest request) throws Exception {
ListRolesTransaction transaction = new ListRolesTransaction();
transaction.execute();
List<Role> roles = transaction.getRoles();
return convert(roles); result.name = role.getName();
result.description = role.getDescription();
return result;
} }
private ListRolesResponse convert(List<Role> roles) { private ListRolesResponse convert(List<Role> roles) {
...@@ -49,4 +40,55 @@ public class AccessControlManagementServiceImpl extends AccessControlManagementS ...@@ -49,4 +40,55 @@ public class AccessControlManagementServiceImpl extends AccessControlManagementS
return result; 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);
}
}
} }
...@@ -26,6 +26,7 @@ import io.grpc.netty.GrpcSslContexts; ...@@ -26,6 +26,7 @@ import io.grpc.netty.GrpcSslContexts;
import io.grpc.netty.NettyServerBuilder; import io.grpc.netty.NettyServerBuilder;
import io.grpcweb.GrpcPortNumRelay; import io.grpcweb.GrpcPortNumRelay;
import io.grpcweb.JettyWebserverForGrpcwebTraffic; import io.grpcweb.JettyWebserverForGrpcwebTraffic;
import io.grpcweb.ServiceToClassMapping;
import io.netty.handler.ssl.ApplicationProtocolConfig; import io.netty.handler.ssl.ApplicationProtocolConfig;
import io.netty.handler.ssl.ApplicationProtocolConfig.Protocol; import io.netty.handler.ssl.ApplicationProtocolConfig.Protocol;
import io.netty.handler.ssl.ApplicationProtocolConfig.SelectedListenerFailureBehavior; import io.netty.handler.ssl.ApplicationProtocolConfig.SelectedListenerFailureBehavior;
...@@ -44,6 +45,10 @@ import java.util.LinkedList; ...@@ -44,6 +45,10 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.net.ssl.KeyManagerFactory; 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.CaosDBServer;
import org.caosdb.server.ServerProperties; import org.caosdb.server.ServerProperties;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -116,12 +121,27 @@ public class GRPCServer { ...@@ -116,12 +121,27 @@ public class GRPCServer {
private List<ServerServiceDefinition> getEnabledServices() { private List<ServerServiceDefinition> getEnabledServices() {
final List<ServerServiceDefinition> services = new LinkedList<>(); 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(); final GeneralInfoServiceImpl generalInfoService = new GeneralInfoServiceImpl();
services.add(ServerInterceptors.intercept(generalInfoService, authInterceptor)); 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(); final FileTransmissionServiceImpl fileTransmissionService = new FileTransmissionServiceImpl();
services.add(ServerInterceptors.intercept(fileTransmissionService, authInterceptor)); 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 = final EntityTransactionServiceImpl entityTransactionService =
new EntityTransactionServiceImpl(fileTransmissionService); new EntityTransactionServiceImpl(fileTransmissionService);
services.add(ServerInterceptors.intercept(entityTransactionService, authInterceptor)); services.add(ServerInterceptors.intercept(entityTransactionService, authInterceptor));
...@@ -194,18 +214,19 @@ public class GRPCServer { ...@@ -194,18 +214,19 @@ public class GRPCServer {
CaosDBServer.addPreShutdownHook(new ServerStopper(server)); CaosDBServer.addPreShutdownHook(new ServerStopper(server));
server.start(); server.start();
logger.info("Started GRPC (HTTP) on port {}", port_http); 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) { } else if (!started) {
logger.warn( logger.warn(
"No GRPC Server has been started. Please configure {} or {} to do so.", "No GRPC Server has been started. Please configure {} or {} to do so.",
ServerProperties.KEY_GRPC_SERVER_PORT_HTTP, ServerProperties.KEY_GRPC_SERVER_PORT_HTTP,
ServerProperties.KEY_GRPC_SERVER_PORT_HTTPS); 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 { private static class ServerStopper implements Runnable {
......
...@@ -21,11 +21,16 @@ package org.caosdb.server.grpc; ...@@ -21,11 +21,16 @@ package org.caosdb.server.grpc;
import io.grpc.stub.StreamObserver; import io.grpc.stub.StreamObserver;
import org.caosdb.api.info.v1alpha1.GeneralInfoServiceGrpc.GeneralInfoServiceImplBase; 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.GetVersionInfoRequest;
import org.caosdb.api.info.v1alpha1.GetVersionInfoResponse; import org.caosdb.api.info.v1alpha1.GetVersionInfoResponse;
import org.caosdb.api.info.v1alpha1.VersionInfo; import org.caosdb.api.info.v1alpha1.VersionInfo;
import org.caosdb.server.CaosDBServer; import org.caosdb.server.CaosDBServer;
import org.caosdb.server.ServerProperties; import org.caosdb.server.ServerProperties;
import org.caosdb.server.accessControl.Principal;
/** /**
* Implementation of the GeneralInfoService. * Implementation of the GeneralInfoService.
...@@ -65,4 +70,20 @@ public class GeneralInfoServiceImpl extends GeneralInfoServiceImplBase { ...@@ -65,4 +70,20 @@ public class GeneralInfoServiceImpl extends GeneralInfoServiceImplBase {
responseObserver.onNext(response); responseObserver.onNext(response);
responseObserver.onCompleted(); 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();
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment