From cc3f9054f478d9698e240bfb644d0d9de9a37c85 Mon Sep 17 00:00:00 2001
From: Roberto Sánchez <roberto.sanchez@curisit.net>
Date: Thu, 19 Dec 2013 14:10:36 +0000
Subject: [PATCH] #333 feature - Refactoring to use JEtty and RestEasy with Guice
---
securis/src/main/java/net/curisit/securis/services/LicenseServices.java | 27 ++-
securis/pom.xml | 36 ++-
securis/src/main/java/net/curisit/securis/RestServicesApplication.java | 28 +++
securis/src/main/java/net/curisit/securis/AuthFilter.java | 76 +++++++++
securis/src/main/resources/static/index.html | 5
securis/src/main/resources/static/main.html | 5
securis/src/main/java/net/curisit/securis/MainApp.java | 50 ++++--
securis/src/main/java/net/curisit/securis/ioc/RequestsModule.java | 28 +++
securis/src/main/java/net/curisit/securis/ioc/SecurisModule.java | 24 +-
securis/src/main/java/net/curisit/securis/services/BasicServices.java | 135 ++++++++++++++++
securis/src/main/resources/static/login.html | 17 ++
11 files changed, 377 insertions(+), 54 deletions(-)
diff --git a/securis/pom.xml b/securis/pom.xml
index be7e644..f1c4cdc 100644
--- a/securis/pom.xml
+++ b/securis/pom.xml
@@ -7,16 +7,6 @@
<description>CurisTEC Server Licenses</description>
<dependencies>
<dependency>
- <groupId>com.sun.jersey</groupId>
- <artifactId>jersey-grizzly2</artifactId>
- <version>1.18</version>
- </dependency>
- <dependency>
- <groupId>org.glassfish.jersey.media</groupId>
- <artifactId>jersey-media-json-jackson</artifactId>
- <version>2.4.1</version>
- </dependency>
- <dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
@@ -27,9 +17,29 @@
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
- <groupId>com.sun.jersey.contribs</groupId>
- <artifactId>jersey-guice</artifactId>
- <version>1.18</version>
+ <groupId>javax.servlet</groupId>
+ <artifactId>javax.servlet-api</artifactId>
+ <version>3.1.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-webapp</artifactId>
+ <version>9.0.7.v20131107</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-guice</artifactId>
+ <version>3.0.5.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-jaxrs</artifactId>
+ <version>3.0.5.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-jackson-provider</artifactId>
+ <version>3.0.5.Final</version>
</dependency>
</dependencies>
<build>
diff --git a/securis/src/main/java/net/curisit/securis/AuthFilter.java b/securis/src/main/java/net/curisit/securis/AuthFilter.java
new file mode 100644
index 0000000..d01c6dc
--- /dev/null
+++ b/securis/src/main/java/net/curisit/securis/AuthFilter.java
@@ -0,0 +1,76 @@
+package net.curisit.securis;
+
+import java.io.IOException;
+import java.security.Principal;
+
+import javax.inject.Singleton;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+@Singleton
+@WebFilter(urlPatterns = "/*")
+public class AuthFilter implements Filter {
+
+ @Override
+ public void init(FilterConfig fc) throws ServletException {
+ }
+
+ @Override
+ public void doFilter(ServletRequest sr, ServletResponse sr1, FilterChain fc) throws IOException, ServletException {
+ HttpServletRequest req = (HttpServletRequest) sr;
+
+ // System.out.println("filter: " + req.getRequestURI() + " user: " + sr.getParameter("user"));
+ if (sr.getParameter("user") != null) {
+ // ResteasyProviderFactory.pushContext(User.class, new User(sr.getParameter("user")));
+ fc.doFilter(new UserRoleRequestWrapper("user", sr.getParameter("user"), req), sr1);
+ } else {
+ fc.doFilter(req, sr1);
+ }
+
+ }
+
+ @Override
+ public void destroy() {
+ }
+
+ private class UserRoleRequestWrapper extends HttpServletRequestWrapper {
+
+ private String role;
+ private String user;
+
+ public UserRoleRequestWrapper(String role, String user, HttpServletRequest request) {
+ super(request);
+ this.role = role;
+ this.user = user;
+ }
+
+ @Override
+ public boolean isUserInRole(String role) {
+ if (this.role == null) {
+ return super.isUserInRole(role);
+ }
+ return this.role.equals(role);
+ }
+
+ @Override
+ public Principal getUserPrincipal() {
+ if (this.user == null) {
+ return super.getUserPrincipal();
+ }
+
+ return new Principal() {
+ @Override
+ public String getName() {
+ return user;
+ }
+ };
+ }
+ }
+}
\ No newline at end of file
diff --git a/securis/src/main/java/net/curisit/securis/MainApp.java b/securis/src/main/java/net/curisit/securis/MainApp.java
index 5b00695..0cfe9b7 100644
--- a/securis/src/main/java/net/curisit/securis/MainApp.java
+++ b/securis/src/main/java/net/curisit/securis/MainApp.java
@@ -1,15 +1,19 @@
package net.curisit.securis;
-import java.io.IOException;
import java.net.URI;
-import java.util.Arrays;
import javax.inject.Inject;
import javax.inject.Named;
+import net.curisit.securis.ioc.RequestsModule;
import net.curisit.securis.ioc.SecurisModule;
-import org.glassfish.grizzly.http.server.HttpServer;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.servlet.FilterHolder;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener;
+import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -17,39 +21,51 @@
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.name.Names;
-import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
-import com.sun.jersey.api.core.PackagesResourceConfig;
-import com.sun.jersey.api.core.ResourceConfig;
-import com.sun.jersey.core.spi.component.ioc.IoCComponentProviderFactory;
-import com.sun.jersey.guice.spi.container.GuiceComponentProviderFactory;
public class MainApp {
private static final Logger log = LoggerFactory.getLogger(MainApp.class);
- private static HttpServer mHttpServer;
+ private static Server server;
private static Injector injector = null;
@Inject
@Named("base-uri")
private URI uri;
- public static void main(String[] args) throws IOException, InterruptedException {
+ public static void main(String[] args) throws Exception {
log.info("SeCuris init...");
- injector = Guice.createInjector(Arrays.asList(new SecurisModule()));
- mHttpServer = startServer(injector.getInstance(Key.get(URI.class, Names.named("base-uri"))));
+ injector = Guice.createInjector(new SecurisModule(), new RequestsModule());
+ // createBiDirectionalGuiceBridge(ServiceLocatorFactory.getInstance().create("default"), new SecurisModule());
+ startServer(injector.getInstance(Key.get(URI.class, Names.named("base-uri"))));
while (true) {
Thread.currentThread().sleep(100);
}
}
- private static HttpServer startServer(URI uri) throws IOException {
- System.out.println("Starting grizzly2...");
- ResourceConfig rc = new PackagesResourceConfig("net.curisit.securis.services", "org.codehaus.jackson.jaxrs");
- IoCComponentProviderFactory ioc = new GuiceComponentProviderFactory(rc, injector);
+ private static void startServer(URI uri) throws Exception {
+ System.out.println("Starting jetty...");
+ // ResourceConfig rc = new PackagesResourceConfig("net.curisit.securis.services", "org.codehaus.jackson.jaxrs");
+ // IoCComponentProviderFactory ioc = new GuiceComponentProviderFactory(rc, injector);
+ server = new Server(9997);
+ ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
+ context.setContextPath("/");
+ context.addEventListener(injector.getInstance(GuiceResteasyBootstrapServletContextListener.class));
- return GrizzlyServerFactory.createHttpServer(uri, rc, ioc);
+ ServletHolder sh = new ServletHolder(HttpServletDispatcher.class);
+ context.setInitParameter("resteasy.role.based.security", "true");
+ context.addFilter(new FilterHolder(injector.getInstance(AuthFilter.class)), "/*", null);
+ // context.addServlet(DefaultServlet.class, "/*");
+ context.addServlet(sh, "/*");
+
+ server.setHandler(context);
+ server.start();
+ server.join();
+ // rc.packages("net.curisit.securis.services", "org.codehaus.jackson.jaxrs");
+
+ // new CLStaticHttpHandler(new URLClassLoader(new URL[] {new URL("file:///home/username/staticfiles.jar")})), "/www")
+
}
}
diff --git a/securis/src/main/java/net/curisit/securis/RestServicesApplication.java b/securis/src/main/java/net/curisit/securis/RestServicesApplication.java
new file mode 100644
index 0000000..164d029
--- /dev/null
+++ b/securis/src/main/java/net/curisit/securis/RestServicesApplication.java
@@ -0,0 +1,28 @@
+package net.curisit.securis;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.ws.rs.core.Application;
+
+import net.curisit.securis.services.BasicServices;
+import net.curisit.securis.services.LicenseServices;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RestServicesApplication extends Application {
+
+ private static final Logger log = LoggerFactory.getLogger(RestServicesApplication.class);
+
+ @Override
+ public Set<Class<?>> getClasses() {
+ Set<Class<?>> classes = new HashSet<>();
+ classes.add(LicenseServices.class);
+ classes.add(BasicServices.class);
+
+ log.info("Returnes classes for services: {}", classes);
+ return classes;
+ }
+
+}
diff --git a/securis/src/main/java/net/curisit/securis/ioc/RequestsModule.java b/securis/src/main/java/net/curisit/securis/ioc/RequestsModule.java
new file mode 100644
index 0000000..fe876c2
--- /dev/null
+++ b/securis/src/main/java/net/curisit/securis/ioc/RequestsModule.java
@@ -0,0 +1,28 @@
+package net.curisit.securis.ioc;
+
+import net.curisit.securis.services.BasicServices;
+import net.curisit.securis.services.LicenseServices;
+
+import org.eclipse.jetty.server.Authentication.User;
+import org.jboss.resteasy.plugins.guice.RequestScoped;
+import org.jboss.resteasy.plugins.guice.ext.RequestScopeModule;
+import org.jboss.resteasy.spi.ResteasyProviderFactory;
+
+import com.google.inject.Provides;
+
+public class RequestsModule extends RequestScopeModule {
+
+ @Override
+ protected void configure() {
+ super.configure();
+ bind(BasicServices.class);
+ bind(LicenseServices.class);
+ }
+
+ @Provides
+ @RequestScoped
+ public User provideUser() {
+ return ResteasyProviderFactory.getContextData(User.class);
+ }
+
+}
diff --git a/securis/src/main/java/net/curisit/securis/ioc/SecurisModule.java b/securis/src/main/java/net/curisit/securis/ioc/SecurisModule.java
index 70acdbf..72c9c1f 100644
--- a/securis/src/main/java/net/curisit/securis/ioc/SecurisModule.java
+++ b/securis/src/main/java/net/curisit/securis/ioc/SecurisModule.java
@@ -7,8 +7,6 @@
import java.util.List;
import java.util.Properties;
-import javafx.application.Application;
-
import javax.inject.Named;
import javax.inject.Singleton;
import javax.ws.rs.core.UriBuilder;
@@ -22,20 +20,10 @@
public class SecurisModule extends AbstractModule {
- Application app = null;
-
private static final int DEFAULT_PORT = 9997;
private static final String PROPERTIES_FILE_NAME = "/server.properties";
private static final Logger log = LoggerFactory.getLogger(SecurisModule.class);
-
- public SecurisModule(Application app) {
- this.app = app;
- }
-
- public SecurisModule() {
- this.app = null;
- }
@Override
protected void configure() {
@@ -89,8 +77,14 @@
return Arrays.asList("/db/schema.sql");
}
- protected Application getApp() {
- return this.app;
- }
+ // @Provides
+ // @Singleton
+ // public HelloWorld provideHelloWorld() {
+ // if (args.length > 0 && args[0].equals("fi")) {
+ // return new HelloWorldFI();
+ // } else {
+ // return new HelloWorldPL();
+ // }
+ // }
}
diff --git a/securis/src/main/java/net/curisit/securis/services/BasicServices.java b/securis/src/main/java/net/curisit/securis/services/BasicServices.java
new file mode 100644
index 0000000..8fea2fd
--- /dev/null
+++ b/securis/src/main/java/net/curisit/securis/services/BasicServices.java
@@ -0,0 +1,135 @@
+package net.curisit.securis.services;
+
+import java.io.IOException;
+import java.net.URI;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.UriBuilder;
+
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Basic services for login a nd basic app wrkflow
+ *
+ * @author roberto <roberto.sanchez@curisit.net>
+ */
+@Path("/")
+public class BasicServices {
+
+ // private LicenseHelper licenseHelper = InjectorFactory.getInjector().getInstance(LicenseHelper.class);
+ private static final Logger log = LoggerFactory.getLogger(BasicServices.class);
+
+ public BasicServices() {
+ }
+
+ /**
+ *
+ * @return the server version in format majorVersion.minorVersion
+ */
+ @GET
+ @Produces(
+ { MediaType.TEXT_HTML })
+ public Response index() {
+
+ URI uri = UriBuilder.fromUri("/login").build();
+ return Response.seeOther(uri).build();
+ // return Response.ok().entity("License server").build();
+ }
+
+ @GET
+ @Path("/login")
+ @Produces(
+ { MediaType.TEXT_HTML })
+ public Response login() {
+ try {
+ String index = IOUtils.toString(this.getClass().getResourceAsStream("/static/login.html"));
+ return Response.ok().entity(index).build();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return Response.serverError().build();
+ }
+
+ @POST
+ @Path("/login")
+ @Produces(
+ { MediaType.TEXT_HTML })
+ public Response login(@FormParam("user") String user, @FormParam("password") String password, @Context HttpServletRequest request) {
+ log.info("Request: " + request.getParameter("user"));
+ log.info("user/pass: {} == {} ? ", user, password);
+ // log.info("user: {} == {} ? " + request.getParameter("user"), user);
+ URI uri = UriBuilder.fromUri("/main").build();
+ return Response.seeOther(uri).build();
+ }
+
+ /**
+ * @return the version of the three entities that can be synchronized (Users, DataSet and Settings)
+ */
+ @GET
+ @Path("/main")
+ @Produces(
+ { MediaType.TEXT_HTML })
+ public Response main() {
+ try {
+ String index = IOUtils.toString(this.getClass().getResourceAsStream("/static/main.html"));
+ return Response.ok().entity(index).build();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return Response.status(Status.FORBIDDEN).build();
+
+ }
+ //
+ // private <T> ServiceResponse<T> buildErrorResponse(ServiceResponse<T> response, String msgErrorCode) {
+ // response.setSuccess(false);
+ // response.setErrorMessage(localManager.getString(msgErrorCode));
+ // response.setErrorMessageCode(msgErrorCode);
+ // return response;
+ // }
+ //
+ // private Date calculateCaducation() {
+ // Integer licenseExpiration = systemParams.getParamAsInt(SystemParams.Keys.CONFIG_SERVER_LICENSE_EXPIRATION);
+ // if (licenseExpiration == null)
+ // licenseExpiration = DEFAULT_LICENSE_EXPIRATION;
+ // return Utils.addDays(new Date(), licenseExpiration);
+ // }
+ //
+ // private boolean validateLicense(String license) {
+ // BasicApplication ba = basicApplicationDao.findByLicense(license);
+ // return (ba != null);
+ // }
+ //
+ // private boolean validateVersion(int minorVersion, int majorVersion) {
+ // return (versionManager.getMajorVersion() == majorVersion);
+ // }
+ //
+ // private BasicApplication findBasicApp(String license) {
+ // BasicApplication ba = basicApplicationDao.findByLicense(license);
+ // return ba;
+ // }
+ //
+ // private License generateLicense() {
+ // // TODO complete all field of the license
+ // License license = new License();
+ // license.setCustomerCode(systemParams.getParam(SystemParams.Keys.CONFIG_COMMON_CUSTOMER_CODE));
+ // license.setCSCode(systemParams.getParam(SystemParams.Keys.CONFIG_COMMON_CS_CODE));
+ // license.setCRCLogo("00000000");
+ // license.setExpirationDate(calculateCaducation());
+ // license.setInstallCode(codeGenerator.generateInstalationNumber());
+ // return license;
+ // }
+
+}
diff --git a/securis/src/main/java/net/curisit/securis/services/LicenseServices.java b/securis/src/main/java/net/curisit/securis/services/LicenseServices.java
index 00c266a..bbf1a0d 100644
--- a/securis/src/main/java/net/curisit/securis/services/LicenseServices.java
+++ b/securis/src/main/java/net/curisit/securis/services/LicenseServices.java
@@ -1,22 +1,25 @@
package net.curisit.securis.services;
+import java.io.IOException;
import java.net.URI;
import java.text.MessageFormat;
-import javax.inject.Inject;
import javax.inject.Named;
+import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import net.curisit.integrity.beans.ServerConfigVersions;
import net.curisit.integrity.beans.ServiceResponse;
+import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -27,14 +30,13 @@
// private LicenseHelper licenseHelper = InjectorFactory.getInjector().getInstance(LicenseHelper.class);
private static final Logger log = LoggerFactory.getLogger(LicenseServices.class);
- private static final int DEFAULT_LICENSE_EXPIRATION = 3650; // 10 years;
+ private static final int DEFAULT_LICENSE_EXPIRATION = 365;
private static final String LICENSE_STRING = "CurisIntegrity Config Server v{0}.{1}";
- @Inject
+ @com.google.inject.Inject
@Named("base-uri")
private URI uri;
- @Inject
public LicenseServices() {
}
@@ -43,10 +45,16 @@
* @return the server version in format majorVersion.minorVersion
*/
@GET
- @Path("/")
@Produces(
- { MediaType.TEXT_PLAIN })
- public Response currentVersion() {
+ { MediaType.TEXT_HTML })
+ public Response index() {
+ try {
+ String index = IOUtils.toString(this.getClass().getResourceAsStream("/static/index.html"));
+ return Response.ok().entity(index).build();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
return Response.ok().entity(MessageFormat.format(LICENSE_STRING, 0, 1)).build();
}
@@ -54,8 +62,9 @@
@Path("/dummy")
@Produces(
{ MediaType.TEXT_PLAIN })
- public Response dummy() {
- return Response.ok().entity(uri.toString()).build();
+ public Response dummy(@Context HttpServletRequest request) {
+ log.info("Request: " + request.getPathInfo());
+ return Response.ok().entity((uri == null)).build();
}
/**
diff --git a/securis/src/main/resources/static/index.html b/securis/src/main/resources/static/index.html
new file mode 100644
index 0000000..7761cb1
--- /dev/null
+++ b/securis/src/main/resources/static/index.html
@@ -0,0 +1,5 @@
+<html>
+ <body>
+ <h1>INDEX example !!!</h1>
+ </body>
+</html>
\ No newline at end of file
diff --git a/securis/src/main/resources/static/login.html b/securis/src/main/resources/static/login.html
new file mode 100644
index 0000000..60c77dd
--- /dev/null
+++ b/securis/src/main/resources/static/login.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>CurisTEC License server</title>
+ </head>
+ <body>
+ <h1>LOGIN example !!!</h1>
+
+ <form action="/login" method="POST">
+ <label>User:</label><input type="text" name="user" id="user">
+ <br/>
+ <label>Password:</label><input type="text" name="password" id="password">
+ <button type="submit">Login</button>
+ </form>
+
+ </body>
+</html>
\ No newline at end of file
diff --git a/securis/src/main/resources/static/main.html b/securis/src/main/resources/static/main.html
new file mode 100644
index 0000000..b02ea24
--- /dev/null
+++ b/securis/src/main/resources/static/main.html
@@ -0,0 +1,5 @@
+<html>
+ <body>
+ <h1>Main page</h1>
+ </body>
+</html>
\ No newline at end of file
--
Gitblit v1.3.2