diff --git a/.gitmodules b/.gitmodules index 7a232e00813ac832eb23f82ae0e3104738bf9b9d..eef89829173252edcff5a843594857000bfaf748 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,3 +2,6 @@ path = caosdb-webui url = ../caosdb-webui/ branch = dev +[submodule "caosdb-proto"] + path = caosdb-proto + url = git@gitlab.indiscale.com:caosdb/src/caosdb-proto.git diff --git a/caosdb-proto b/caosdb-proto new file mode 160000 index 0000000000000000000000000000000000000000..b0cade5e02daff99eaa46e1201f2786ac873114b --- /dev/null +++ b/caosdb-proto @@ -0,0 +1 @@ +Subproject commit b0cade5e02daff99eaa46e1201f2786ac873114b diff --git a/pom.xml b/pom.xml index 2f4b8191e3b1d6addf9236d8a1d1c47349441172..e352041795bfbf19075b8874dff3925a03e360ca 100644 --- a/pom.xml +++ b/pom.xml @@ -374,6 +374,7 @@ <artifactId>protobuf-maven-plugin</artifactId> <version>0.6.1</version> <configuration> + <protoSourceRoot>${basedir}/caosdb-proto/proto/</protoSourceRoot> <protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact> diff --git a/src/main/java/org/caosdb/server/CaosDBServer.java b/src/main/java/org/caosdb/server/CaosDBServer.java index a81c2f3c0f7ffb55a6a26518220cbdcd06be97d5..9b727412bc99a2e050bb45e636cf30d8e9d19cad 100644 --- a/src/main/java/org/caosdb/server/CaosDBServer.java +++ b/src/main/java/org/caosdb/server/CaosDBServer.java @@ -151,7 +151,7 @@ public class CaosDBServer extends Application { initBackend(); initWebServer(); initShutDownHook(); - } catch (Exception e1) { + } catch (final Exception e1) { logger.error("Could not start the server.", e1); System.exit(1); } @@ -204,7 +204,7 @@ public class CaosDBServer extends Application { * @throws IOException */ public static void initTimeZone() throws InterruptedException, IOException { - String serverProperty = getServerProperty(ServerProperties.KEY_TIMEZONE); + final String serverProperty = getServerProperty(ServerProperties.KEY_TIMEZONE); if (serverProperty != null && !serverProperty.isEmpty()) { logger.info( "SET TIMEZONE = " @@ -217,7 +217,7 @@ public class CaosDBServer extends Application { return; } - String prop = System.getProperty("user.timezone"); + final String prop = System.getProperty("user.timezone"); if (prop != null && !prop.isEmpty()) { logger.info("SET TIMEZONE = " + prop + " from JVM property `user.timezone`."); TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of(prop))); @@ -225,7 +225,7 @@ public class CaosDBServer extends Application { return; } - String envVar = System.getenv("TZ"); + final String envVar = System.getenv("TZ"); if (envVar != null && !envVar.isEmpty()) { logger.info("SET TIMEZONE = " + envVar + " from evironment variable `TZ`."); TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of(envVar))); @@ -233,7 +233,7 @@ public class CaosDBServer extends Application { return; } - String fromDate = getTimeZoneFromDate(); + final String fromDate = getTimeZoneFromDate(); if (fromDate != null && fromDate.isEmpty()) { logger.info("SET TIMEZONE = " + fromDate + " from `date +%Z`."); TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of(fromDate))); @@ -299,8 +299,8 @@ public class CaosDBServer extends Application { return config; } - public static void initShiro(Ini config) { - BasicIniEnvironment env = new BasicIniEnvironment(config); + public static void initShiro(final Ini config) { + final BasicIniEnvironment env = new BasicIniEnvironment(config); final SecurityManager securityManager = env.getSecurityManager(); SecurityUtils.setSecurityManager(securityManager); } @@ -339,7 +339,7 @@ public class CaosDBServer extends Application { try { port_redirect_https = Integer.parseInt(getServerProperty(ServerProperties.KEY_REDIRECT_HTTP_TO_HTTPS_PORT)); - } catch (NumberFormatException e) { + } catch (final NumberFormatException e) { port_redirect_https = port_https; } final int initialConnections = @@ -353,7 +353,7 @@ public class CaosDBServer extends Application { runHTTPSServer( port_https, port_http, port_redirect_https, initialConnections, maxTotalConnections); } - GRPCServer.startServer(8080, 8443, 8070); + GRPCServer.startServer(8080, 8443); } private static void initDatatypes(final Access access) throws Exception { @@ -371,10 +371,10 @@ public class CaosDBServer extends Application { */ private static void runHTTPServer( final int port_http, final int initialConnections, final int maxTotalConnections) - throws Exception { + throws Exception { Engine.getInstance() - .getRegisteredServers() - .add(new org.restlet.ext.jetty.HttpServerHelper(null)); + .getRegisteredServers() + .add(new org.restlet.ext.jetty.HttpServerHelper(null)); // Create a component. component = new CaosDBComponent(); @@ -397,16 +397,16 @@ public class CaosDBServer extends Application { // Create an application (this class). final Application application = new CaosDBServer(); application - .getStatusService() - .setContactEmail(getServerProperty(ServerProperties.KEY_ADMIN_EMAIL)); + .getStatusService() + .setContactEmail(getServerProperty(ServerProperties.KEY_ADMIN_EMAIL)); application - .getStatusService() - .setHomeRef(new Reference(getServerProperty(ServerProperties.KEY_CONTEXT_ROOT) + "/")); + .getStatusService() + .setHomeRef(new Reference(getServerProperty(ServerProperties.KEY_CONTEXT_ROOT) + "/")); // Attach the application to the component with a defined contextRoot. component - .getDefaultHost() - .attach(getServerProperty(ServerProperties.KEY_CONTEXT_ROOT), application); + .getDefaultHost() + .attach(getServerProperty(ServerProperties.KEY_CONTEXT_ROOT), application); component.start(); @@ -432,7 +432,7 @@ public class CaosDBServer extends Application { final int port_redirect_https, final int initialConnections, final int maxTotalConnections) - throws Exception { + throws Exception { Engine.getInstance().getRegisteredServers().add(new CaosDBServerConnectorHelper(null)); @@ -453,9 +453,9 @@ public class CaosDBServer extends Application { if (port_http != 0) { logger.info("Redirecting to " + port_redirect_https); component - .getServers() - .add(Protocol.HTTP, port_http) - .setNext(new HttpToHttpsRedirector(port_redirect_https)); + .getServers() + .add(Protocol.HTTP, port_http) + .setNext(new HttpToHttpsRedirector(port_redirect_https)); } // set initial and maximal connections @@ -485,20 +485,20 @@ public class CaosDBServer extends Application { // Create an application (this class). final Application application = new CaosDBServer(); application - .getStatusService() - .setContactEmail( - getServerProperty(ServerProperties.KEY_ADMIN_NAME) - + " <" - + getServerProperty(ServerProperties.KEY_ADMIN_EMAIL) - + ">"); + .getStatusService() + .setContactEmail( + getServerProperty(ServerProperties.KEY_ADMIN_NAME) + + " <" + + getServerProperty(ServerProperties.KEY_ADMIN_EMAIL) + + ">"); application - .getStatusService() - .setHomeRef(new Reference(getServerProperty(ServerProperties.KEY_CONTEXT_ROOT) + "/")); + .getStatusService() + .setHomeRef(new Reference(getServerProperty(ServerProperties.KEY_CONTEXT_ROOT) + "/")); component - .getDefaultHost() - .attach(getServerProperty(ServerProperties.KEY_CONTEXT_ROOT), application); + .getDefaultHost() + .attach(getServerProperty(ServerProperties.KEY_CONTEXT_ROOT), application); component.start(); @@ -520,16 +520,16 @@ public class CaosDBServer extends Application { /** ProtectedRouter. Is protected by the authenticator. */ final Router protectedRouter = new Router(getContext()) { - @Override - public void handle(final Request request, final Response response) { - try { - super.handle(request, response); - } catch (final NullPointerException e) { - response.setStatus(Status.CLIENT_ERROR_REQUEST_URI_TOO_LONG); - response.setEntity(null); - } - } - }; + @Override + public void handle(final Request request, final Response response) { + try { + super.handle(request, response); + } catch (final NullPointerException e) { + response.setStatus(Status.CLIENT_ERROR_REQUEST_URI_TOO_LONG); + response.setEntity(null); + } + } + }; /** * BaseRouter. Routes the call to some special Resources, which are available without any @@ -538,59 +538,59 @@ public class CaosDBServer extends Application { */ final Router baseRouter = new Router(getContext()) { - @Override - public void handle(final Request request, final Response response) { - try { - super.handle(request, response); + @Override + public void handle(final Request request, final Response response) { + try { + super.handle(request, response); + + // after everything, set session cookies + setSessionCookies(response); + + } finally { + // remove subject from this thread so that we can reuse the + // thread. + ThreadContext.unbindSubject(); + } + } - // after everything, set session cookies - setSessionCookies(response); + private void setSessionCookies(final Response response) { - } finally { - // remove subject from this thread so that we can reuse the - // thread. - ThreadContext.unbindSubject(); - } + final Subject subject = SecurityUtils.getSubject(); + // if authenticated as a normal user: generate and set session cookie. + if (subject.isAuthenticated() + && subject.getPrincipal() != AnonymousAuthenticationToken.PRINCIPAL) { + final SessionToken sessionToken = SessionToken.generate(subject); + + // set session token cookie (httpOnly, secure cookie which + // is used to recognize a user session) + final CookieSetting sessionTokenCookie = + AuthenticationUtils.createSessionTokenCookie(sessionToken); + if (sessionTokenCookie != null) { + response.getCookieSettings().add(sessionTokenCookie); } - private void setSessionCookies(final Response response) { - - final Subject subject = SecurityUtils.getSubject(); - // if authenticated as a normal user: generate and set session cookie. - if (subject.isAuthenticated() - && subject.getPrincipal() != AnonymousAuthenticationToken.PRINCIPAL) { - final SessionToken sessionToken = SessionToken.generate(subject); - - // set session token cookie (httpOnly, secure cookie which - // is used to recognize a user session) - final CookieSetting sessionTokenCookie = - AuthenticationUtils.createSessionTokenCookie(sessionToken); - if (sessionTokenCookie != null) { - response.getCookieSettings().add(sessionTokenCookie); - } - - // set session timeout cookie (secure cookie which may be - // used - // by the user interfaces for anything) - final CookieSetting sessionTimeoutCookie = - AuthenticationUtils.createSessionTimeoutCookie(sessionToken); - if (sessionTimeoutCookie != null) { - response.getCookieSettings().add(sessionTimeoutCookie); - } - } + // set session timeout cookie (secure cookie which may be + // used + // by the user interfaces for anything) + final CookieSetting sessionTimeoutCookie = + AuthenticationUtils.createSessionTimeoutCookie(sessionToken); + if (sessionTimeoutCookie != null) { + response.getCookieSettings().add(sessionTimeoutCookie); } - }; + } + } + }; // These routes can be used without logging in: baseRouter.attach("/webinterface/version/build", WebinterfaceBuildNumber.class); baseRouter - .attach("/webinterface/{path}", Webinterface.class) - .getTemplate() - .getDefaultVariable() - .setType(Variable.TYPE_URI_PATH); + .attach("/webinterface/{path}", Webinterface.class) + .getTemplate() + .getDefaultVariable() + .setType(Variable.TYPE_URI_PATH); baseRouter - .attach("/login?username={username}", AuthenticationResource.class) - .setMatchingQuery(true); + .attach("/login?username={username}", AuthenticationResource.class) + .setMatchingQuery(true); baseRouter.attach("/login", AuthenticationResource.class); baseRouter.attach("", authenticator).setMatchingQuery(false); @@ -656,22 +656,22 @@ public class CaosDBServer extends Application { // FileSystem etc. needs to accept parameters which contain slashes and would otherwise be // split at the first separator protectedRouter - .attach("/FileSystem/{path}", FileSystemResource.class) - .getTemplate() - .getDefaultVariable() - .setType(Variable.TYPE_URI_PATH); + .attach("/FileSystem/{path}", FileSystemResource.class) + .getTemplate() + .getDefaultVariable() + .setType(Variable.TYPE_URI_PATH); protectedRouter - .attach("/Thumbnails/{path}", ThumbnailsResource.class) - .getTemplate() - .getDefaultVariable() - .setType(Variable.TYPE_URI_PATH); + .attach("/Thumbnails/{path}", ThumbnailsResource.class) + .getTemplate() + .getDefaultVariable() + .setType(Variable.TYPE_URI_PATH); protectedRouter.attach("/Shared", SharedFileResource.class); protectedRouter.attach("/Shared/", SharedFileResource.class); protectedRouter - .attach("/Shared/{path}", SharedFileResource.class) - .getTemplate() - .getDefaultVariable() - .setType(Variable.TYPE_URI_PATH); + .attach("/Shared/{path}", SharedFileResource.class) + .getTemplate() + .getDefaultVariable() + .setType(Variable.TYPE_URI_PATH); ; protectedRouter.attach("/Info", InfoResource.class); protectedRouter.attach("/Info/", InfoResource.class); @@ -680,11 +680,11 @@ public class CaosDBServer extends Application { protectedRouter.attach("/PermissionRules/{specifier}", PermissionRulesResource.class); protectedRouter.attach("/PermissionRules/{realm}/{specifier}", PermissionRulesResource.class); protectedRouter - .attach("/ServerLogs/", ServerLogsResource.class) - .setMatchingMode(Template.MODE_STARTS_WITH); + .attach("/ServerLogs/", ServerLogsResource.class) + .setMatchingMode(Template.MODE_STARTS_WITH); protectedRouter - .attach("/ServerLogs", ServerLogsResource.class) - .setMatchingMode(Template.MODE_STARTS_WITH); + .attach("/ServerLogs", ServerLogsResource.class) + .setMatchingMode(Template.MODE_STARTS_WITH); protectedRouter.attach("/login?username={username}", AuthenticationResource.class); protectedRouter.attach("/logout", LogoutResource.class); protectedRouter.attach("/_server_properties", ServerPropertiesResource.class); @@ -700,37 +700,37 @@ public class CaosDBServer extends Application { final Handler handler = new Handler() { - @Override - public void publish(final LogRecord record) { - if (record.getLevel() == Level.WARNING - && record - .getMessage() - .startsWith( - "StackOverflowError exception encountered while matching this string")) { - // cause a NullPointerException - throw new NullPointerException(); - } - } + @Override + public void publish(final LogRecord record) { + if (record.getLevel() == Level.WARNING + && record + .getMessage() + .startsWith( + "StackOverflowError exception encountered while matching this string")) { + // cause a NullPointerException + throw new NullPointerException(); + } + } - @Override - public void flush() {} + @Override + public void flush() {} - @Override - public void close() throws SecurityException {} - }; + @Override + public void close() throws SecurityException {} + }; routes: - for (final Route r : protectedRouter.getRoutes()) { - if (r instanceof TemplateRoute) { - final TemplateRoute t = (TemplateRoute) r; - for (final Handler h : t.getTemplate().getLogger().getHandlers()) { - if (h == handler) { - continue routes; + for (final Route r : protectedRouter.getRoutes()) { + if (r instanceof TemplateRoute) { + final TemplateRoute t = (TemplateRoute) r; + for (final Handler h : t.getTemplate().getLogger().getHandlers()) { + if (h == handler) { + continue routes; + } } + t.getTemplate().getLogger().addHandler(handler); } - t.getTemplate().getLogger().addHandler(handler); } - } return baseRouter; } @@ -779,22 +779,22 @@ public class CaosDBServer extends Application { private static void initShutDownHook() { Runtime.getRuntime() - .addShutdownHook( - new Thread("SHUTDOWN_HTTP_SERVER") { - @Override - public void run() { - callPreShutdownHooks(); - try { - component.stop(); - System.err.print("Stopping HTTP server [OK]\n"); - } catch (final Exception e) { - System.err.print("Stopping HTTP server [failed]\n"); - e.printStackTrace(); - } finally { - callPostShutdownHooks(); - } - } - }); + .addShutdownHook( + new Thread("SHUTDOWN_HTTP_SERVER") { + @Override + public void run() { + callPreShutdownHooks(); + try { + component.stop(); + System.err.print("Stopping HTTP server [OK]\n"); + } catch (final Exception e) { + System.err.print("Stopping HTTP server [failed]\n"); + e.printStackTrace(); + } finally { + callPostShutdownHooks(); + } + } + }); } public static Component getComponent() { @@ -812,7 +812,7 @@ public class CaosDBServer extends Application { * @param key, the server property. * @param value, the new value. */ - public static void setProperty(String key, String value) { + public static void setProperty(final String key, final String value) { SERVER_PROPERTIES.setProperty(key, value); } @@ -820,7 +820,7 @@ public class CaosDBServer extends Application { return SERVER_PROPERTIES; } - public static void scheduleJob(JobDetail job, Trigger trigger) throws SchedulerException { + public static void scheduleJob(final JobDetail job, final Trigger trigger) throws SchedulerException { SCHEDULER.scheduleJob(job, trigger); } } @@ -850,7 +850,7 @@ class CaosDBComponent extends Component { */ @Override public void handle(final Request request, final Response response) { - long t1 = System.currentTimeMillis(); + final long t1 = System.currentTimeMillis(); // The server request ID is just a long random number request.getAttributes().put("SRID", UUID.randomUUID().toString()); response.setServerInfo(CaosDBServer.getServerInfo()); @@ -858,7 +858,7 @@ class CaosDBComponent extends Component { log(request, response, t1); } - private void log(final Request request, final Response response, long t1) { + private void log(final Request request, final Response response, final long t1) { if (response.getStatus() == Status.SERVER_ERROR_INTERNAL) { final Object object = request.getAttributes().get("THROWN"); Throwable t = null; diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionImpl.java index c482f2421db1e4d133d0e5f46494e6d1fd6cc593..6165b31670b83b56a1e5cbe42505d509ddf676e6 100644 --- a/src/main/java/org/caosdb/server/grpc/EntityTransactionImpl.java +++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionImpl.java @@ -1,47 +1,19 @@ package org.caosdb.server.grpc; +import org.caosdb.api.info.v1alpha1.GeneralInfoServiceGrpc.GeneralInfoServiceImplBase; +import org.caosdb.api.info.v1alpha1.GetVersionInfoRequest; +import org.caosdb.api.info.v1alpha1.GetVersionInfoResponse; +import org.caosdb.api.info.v1alpha1.VersionInfo; import io.grpc.stub.StreamObserver; -import java.util.UUID; -import org.apache.shiro.SecurityUtils; -import org.caosdb.grpc.Entity; -import org.caosdb.grpc.EntityTransactionServiceGrpc.EntityTransactionServiceImplBase; -import org.caosdb.server.entity.EntityInterface; -import org.caosdb.server.entity.container.RetrieveContainer; -import org.caosdb.server.transaction.Retrieve; -import org.caosdb.server.utils.EntityStatus; -public class EntityTransactionImpl extends EntityTransactionServiceImplBase { +public class EntityTransactionImpl extends GeneralInfoServiceImplBase { @Override - public void retrieve(Entity request, StreamObserver<Entity> responseObserver) { - String requested_entity_id = request.getEid(); + public void getVersionInfo(final GetVersionInfoRequest request, + final StreamObserver<GetVersionInfoResponse> responseObserver) { - RetrieveContainer container = - new RetrieveContainer( - SecurityUtils.getSubject(), - System.currentTimeMillis(), - UUID.randomUUID().toString(), - null); - container.add(Integer.parseInt(requested_entity_id)); - Retrieve retrieve = new Retrieve(container); - try { - retrieve.execute(); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - EntityInterface retrieved_entity = retrieve.getContainer().get(0); - - Entity response; - if (retrieved_entity.getEntityStatus() == EntityStatus.VALID) { - response = - Entity.newBuilder(request) - .setName(retrieved_entity.getName()) - .setDescription(retrieved_entity.getDescription()) - .build(); - } else { - response = Entity.newBuilder(request).setDescription("DOES NOT EXIST").build(); - } + final VersionInfo versionInfo = VersionInfo.newBuilder().setMajor(0).setMinor(0).setPatch(1).build(); + final GetVersionInfoResponse response = GetVersionInfoResponse.newBuilder().setVersionInfo(versionInfo).build(); responseObserver.onNext(response); responseObserver.onCompleted(); diff --git a/src/main/java/org/caosdb/server/grpc/GRPCServer.java b/src/main/java/org/caosdb/server/grpc/GRPCServer.java index f145e35badfa5d8ff34ba81cde879a73bd0c2fd8..3bbba23eadef5ea48593e7fa555c2fcaf47ccd3d 100644 --- a/src/main/java/org/caosdb/server/grpc/GRPCServer.java +++ b/src/main/java/org/caosdb/server/grpc/GRPCServer.java @@ -1,34 +1,25 @@ package org.caosdb.server.grpc; +import java.io.IOException; import io.grpc.Server; import io.grpc.ServerBuilder; -import io.grpcweb.GrpcPortNumRelay; -import io.grpcweb.JettyWebserverForGrpcwebTraffic; -import java.io.File; -import java.io.IOException; public class GRPCServer { - public static void startServer(int port_http, int port_https, int port_web) + public static void startServer(final int port_http, final int port_https) throws IOException, InterruptedException { - Server https_server = - ServerBuilder.forPort(port_https) - .useTransportSecurity( - new File("/home/tf/ssl/server-certificates/localhost-belial/localhost-belial.pem"), - new File( - "/home/tf/ssl/server-certificates/localhost-belial/localhost-belial.key.pk8")) - .addService(new EntityTransactionImpl()) - .build(); - https_server.start(); + // Server https_server = + // ServerBuilder.forPort(port_https) + // .useTransportSecurity( + // new File("/home/tf/ssl/server-certificates/localhost-belial/localhost-belial.pem"), + // new File( + // "/home/tf/ssl/server-certificates/localhost-belial/localhost-belial.key.pk8")) + // .addService(new EntityTransactionImpl()) + // .build(); + // https_server.start(); - Server http_server = + final Server http_server = ServerBuilder.forPort(port_http).addService(new EntityTransactionImpl()).build(); http_server.start(); - - JettyWebserverForGrpcwebTraffic web = new JettyWebserverForGrpcwebTraffic(8070); - web.starts(); - - // grpc-web proxy needs to know the grpc-port# so it could connect to the grpc service. - GrpcPortNumRelay.setGrpcPortNum(port_http); } } diff --git a/src/main/proto/EntityService.proto b/src/main/proto/EntityService.proto deleted file mode 100644 index d7868caab6b9a6ea99597e3505d5d0873001cb64..0000000000000000000000000000000000000000 --- a/src/main/proto/EntityService.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; -option java_multiple_files = true; -option java_package = "org.caosdb.grpc"; -package caosdb; - -message Entity { - string eid = 1; - string name = 2; - string description = 3; -} - -service EntityTransactionService { - rpc retrieve(Entity) returns (Entity); -}