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