Roberto Sánchez
2013-12-19 cc3f9054f478d9698e240bfb644d0d9de9a37c85
#333 feature - Refactoring to use JEtty and RestEasy with Guice
7 files added
4 files modified
changed files
securis/pom.xml patch | view | blame | history
securis/src/main/java/net/curisit/securis/AuthFilter.java patch | view | blame | history
securis/src/main/java/net/curisit/securis/MainApp.java patch | view | blame | history
securis/src/main/java/net/curisit/securis/RestServicesApplication.java patch | view | blame | history
securis/src/main/java/net/curisit/securis/ioc/RequestsModule.java patch | view | blame | history
securis/src/main/java/net/curisit/securis/ioc/SecurisModule.java patch | view | blame | history
securis/src/main/java/net/curisit/securis/services/BasicServices.java patch | view | blame | history
securis/src/main/java/net/curisit/securis/services/LicenseServices.java patch | view | blame | history
securis/src/main/resources/static/index.html patch | view | blame | history
securis/src/main/resources/static/login.html patch | view | blame | history
securis/src/main/resources/static/main.html patch | view | blame | history
securis/pom.xml
....@@ -7,16 +7,6 @@
77 <description>CurisTEC Server Licenses</description>
88 <dependencies>
99 <dependency>
10
- <groupId>com.sun.jersey</groupId>
11
- <artifactId>jersey-grizzly2</artifactId>
12
- <version>1.18</version>
13
- </dependency>
14
- <dependency>
15
- <groupId>org.glassfish.jersey.media</groupId>
16
- <artifactId>jersey-media-json-jackson</artifactId>
17
- <version>2.4.1</version>
18
- </dependency>
19
- <dependency>
2010 <groupId>commons-lang</groupId>
2111 <artifactId>commons-lang</artifactId>
2212 <version>2.6</version>
....@@ -27,9 +17,29 @@
2717 <version>0.0.1-SNAPSHOT</version>
2818 </dependency>
2919 <dependency>
30
- <groupId>com.sun.jersey.contribs</groupId>
31
- <artifactId>jersey-guice</artifactId>
32
- <version>1.18</version>
20
+ <groupId>javax.servlet</groupId>
21
+ <artifactId>javax.servlet-api</artifactId>
22
+ <version>3.1.0</version>
23
+ </dependency>
24
+ <dependency>
25
+ <groupId>org.eclipse.jetty</groupId>
26
+ <artifactId>jetty-webapp</artifactId>
27
+ <version>9.0.7.v20131107</version>
28
+ </dependency>
29
+ <dependency>
30
+ <groupId>org.jboss.resteasy</groupId>
31
+ <artifactId>resteasy-guice</artifactId>
32
+ <version>3.0.5.Final</version>
33
+ </dependency>
34
+ <dependency>
35
+ <groupId>org.jboss.resteasy</groupId>
36
+ <artifactId>resteasy-jaxrs</artifactId>
37
+ <version>3.0.5.Final</version>
38
+ </dependency>
39
+ <dependency>
40
+ <groupId>org.jboss.resteasy</groupId>
41
+ <artifactId>resteasy-jackson-provider</artifactId>
42
+ <version>3.0.5.Final</version>
3343 </dependency>
3444 </dependencies>
3545 <build>
securis/src/main/java/net/curisit/securis/AuthFilter.java
....@@ -0,0 +1,76 @@
1
+package net.curisit.securis;
2
+
3
+import java.io.IOException;
4
+import java.security.Principal;
5
+
6
+import javax.inject.Singleton;
7
+import javax.servlet.Filter;
8
+import javax.servlet.FilterChain;
9
+import javax.servlet.FilterConfig;
10
+import javax.servlet.ServletException;
11
+import javax.servlet.ServletRequest;
12
+import javax.servlet.ServletResponse;
13
+import javax.servlet.annotation.WebFilter;
14
+import javax.servlet.http.HttpServletRequest;
15
+import javax.servlet.http.HttpServletRequestWrapper;
16
+
17
+@Singleton
18
+@WebFilter(urlPatterns = "/*")
19
+public class AuthFilter implements Filter {
20
+
21
+ @Override
22
+ public void init(FilterConfig fc) throws ServletException {
23
+ }
24
+
25
+ @Override
26
+ public void doFilter(ServletRequest sr, ServletResponse sr1, FilterChain fc) throws IOException, ServletException {
27
+ HttpServletRequest req = (HttpServletRequest) sr;
28
+
29
+ // System.out.println("filter: " + req.getRequestURI() + " user: " + sr.getParameter("user"));
30
+ if (sr.getParameter("user") != null) {
31
+ // ResteasyProviderFactory.pushContext(User.class, new User(sr.getParameter("user")));
32
+ fc.doFilter(new UserRoleRequestWrapper("user", sr.getParameter("user"), req), sr1);
33
+ } else {
34
+ fc.doFilter(req, sr1);
35
+ }
36
+
37
+ }
38
+
39
+ @Override
40
+ public void destroy() {
41
+ }
42
+
43
+ private class UserRoleRequestWrapper extends HttpServletRequestWrapper {
44
+
45
+ private String role;
46
+ private String user;
47
+
48
+ public UserRoleRequestWrapper(String role, String user, HttpServletRequest request) {
49
+ super(request);
50
+ this.role = role;
51
+ this.user = user;
52
+ }
53
+
54
+ @Override
55
+ public boolean isUserInRole(String role) {
56
+ if (this.role == null) {
57
+ return super.isUserInRole(role);
58
+ }
59
+ return this.role.equals(role);
60
+ }
61
+
62
+ @Override
63
+ public Principal getUserPrincipal() {
64
+ if (this.user == null) {
65
+ return super.getUserPrincipal();
66
+ }
67
+
68
+ return new Principal() {
69
+ @Override
70
+ public String getName() {
71
+ return user;
72
+ }
73
+ };
74
+ }
75
+ }
76
+}
securis/src/main/java/net/curisit/securis/MainApp.java
....@@ -1,15 +1,19 @@
11 package net.curisit.securis;
22
3
-import java.io.IOException;
43 import java.net.URI;
5
-import java.util.Arrays;
64
75 import javax.inject.Inject;
86 import javax.inject.Named;
97
8
+import net.curisit.securis.ioc.RequestsModule;
109 import net.curisit.securis.ioc.SecurisModule;
1110
12
-import org.glassfish.grizzly.http.server.HttpServer;
11
+import org.eclipse.jetty.server.Server;
12
+import org.eclipse.jetty.servlet.FilterHolder;
13
+import org.eclipse.jetty.servlet.ServletContextHandler;
14
+import org.eclipse.jetty.servlet.ServletHolder;
15
+import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener;
16
+import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;
1317 import org.slf4j.Logger;
1418 import org.slf4j.LoggerFactory;
1519
....@@ -17,39 +21,51 @@
1721 import com.google.inject.Injector;
1822 import com.google.inject.Key;
1923 import com.google.inject.name.Names;
20
-import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
21
-import com.sun.jersey.api.core.PackagesResourceConfig;
22
-import com.sun.jersey.api.core.ResourceConfig;
23
-import com.sun.jersey.core.spi.component.ioc.IoCComponentProviderFactory;
24
-import com.sun.jersey.guice.spi.container.GuiceComponentProviderFactory;
2524
2625 public class MainApp {
2726
2827 private static final Logger log = LoggerFactory.getLogger(MainApp.class);
2928
30
- private static HttpServer mHttpServer;
29
+ private static Server server;
3130 private static Injector injector = null;
3231
3332 @Inject
3433 @Named("base-uri")
3534 private URI uri;
3635
37
- public static void main(String[] args) throws IOException, InterruptedException {
36
+ public static void main(String[] args) throws Exception {
3837 log.info("SeCuris init...");
3938
40
- injector = Guice.createInjector(Arrays.asList(new SecurisModule()));
41
- mHttpServer = startServer(injector.getInstance(Key.get(URI.class, Names.named("base-uri"))));
39
+ injector = Guice.createInjector(new SecurisModule(), new RequestsModule());
40
+ // createBiDirectionalGuiceBridge(ServiceLocatorFactory.getInstance().create("default"), new SecurisModule());
41
+ startServer(injector.getInstance(Key.get(URI.class, Names.named("base-uri"))));
4242 while (true) {
4343 Thread.currentThread().sleep(100);
4444 }
4545 }
4646
47
- private static HttpServer startServer(URI uri) throws IOException {
48
- System.out.println("Starting grizzly2...");
49
- ResourceConfig rc = new PackagesResourceConfig("net.curisit.securis.services", "org.codehaus.jackson.jaxrs");
50
- IoCComponentProviderFactory ioc = new GuiceComponentProviderFactory(rc, injector);
47
+ private static void startServer(URI uri) throws Exception {
48
+ System.out.println("Starting jetty...");
49
+ // ResourceConfig rc = new PackagesResourceConfig("net.curisit.securis.services", "org.codehaus.jackson.jaxrs");
50
+ // IoCComponentProviderFactory ioc = new GuiceComponentProviderFactory(rc, injector);
51
+ server = new Server(9997);
52
+ ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
53
+ context.setContextPath("/");
54
+ context.addEventListener(injector.getInstance(GuiceResteasyBootstrapServletContextListener.class));
5155
52
- return GrizzlyServerFactory.createHttpServer(uri, rc, ioc);
56
+ ServletHolder sh = new ServletHolder(HttpServletDispatcher.class);
57
+ context.setInitParameter("resteasy.role.based.security", "true");
58
+ context.addFilter(new FilterHolder(injector.getInstance(AuthFilter.class)), "/*", null);
59
+ // context.addServlet(DefaultServlet.class, "/*");
60
+ context.addServlet(sh, "/*");
61
+
62
+ server.setHandler(context);
63
+ server.start();
64
+ server.join();
65
+ // rc.packages("net.curisit.securis.services", "org.codehaus.jackson.jaxrs");
66
+
67
+ // new CLStaticHttpHandler(new URLClassLoader(new URL[] {new URL("file:///home/username/staticfiles.jar")})), "/www")
68
+
5369 }
5470
5571 }
securis/src/main/java/net/curisit/securis/RestServicesApplication.java
....@@ -0,0 +1,28 @@
1
+package net.curisit.securis;
2
+
3
+import java.util.HashSet;
4
+import java.util.Set;
5
+
6
+import javax.ws.rs.core.Application;
7
+
8
+import net.curisit.securis.services.BasicServices;
9
+import net.curisit.securis.services.LicenseServices;
10
+
11
+import org.slf4j.Logger;
12
+import org.slf4j.LoggerFactory;
13
+
14
+public class RestServicesApplication extends Application {
15
+
16
+ private static final Logger log = LoggerFactory.getLogger(RestServicesApplication.class);
17
+
18
+ @Override
19
+ public Set<Class<?>> getClasses() {
20
+ Set<Class<?>> classes = new HashSet<>();
21
+ classes.add(LicenseServices.class);
22
+ classes.add(BasicServices.class);
23
+
24
+ log.info("Returnes classes for services: {}", classes);
25
+ return classes;
26
+ }
27
+
28
+}
securis/src/main/java/net/curisit/securis/ioc/RequestsModule.java
....@@ -0,0 +1,28 @@
1
+package net.curisit.securis.ioc;
2
+
3
+import net.curisit.securis.services.BasicServices;
4
+import net.curisit.securis.services.LicenseServices;
5
+
6
+import org.eclipse.jetty.server.Authentication.User;
7
+import org.jboss.resteasy.plugins.guice.RequestScoped;
8
+import org.jboss.resteasy.plugins.guice.ext.RequestScopeModule;
9
+import org.jboss.resteasy.spi.ResteasyProviderFactory;
10
+
11
+import com.google.inject.Provides;
12
+
13
+public class RequestsModule extends RequestScopeModule {
14
+
15
+ @Override
16
+ protected void configure() {
17
+ super.configure();
18
+ bind(BasicServices.class);
19
+ bind(LicenseServices.class);
20
+ }
21
+
22
+ @Provides
23
+ @RequestScoped
24
+ public User provideUser() {
25
+ return ResteasyProviderFactory.getContextData(User.class);
26
+ }
27
+
28
+}
securis/src/main/java/net/curisit/securis/ioc/SecurisModule.java
....@@ -7,8 +7,6 @@
77 import java.util.List;
88 import java.util.Properties;
99
10
-import javafx.application.Application;
11
-
1210 import javax.inject.Named;
1311 import javax.inject.Singleton;
1412 import javax.ws.rs.core.UriBuilder;
....@@ -22,20 +20,10 @@
2220
2321 public class SecurisModule extends AbstractModule {
2422
25
- Application app = null;
26
-
2723 private static final int DEFAULT_PORT = 9997;
2824 private static final String PROPERTIES_FILE_NAME = "/server.properties";
2925
3026 private static final Logger log = LoggerFactory.getLogger(SecurisModule.class);
31
-
32
- public SecurisModule(Application app) {
33
- this.app = app;
34
- }
35
-
36
- public SecurisModule() {
37
- this.app = null;
38
- }
3927
4028 @Override
4129 protected void configure() {
....@@ -89,8 +77,14 @@
8977 return Arrays.asList("/db/schema.sql");
9078 }
9179
92
- protected Application getApp() {
93
- return this.app;
94
- }
80
+ // @Provides
81
+ // @Singleton
82
+ // public HelloWorld provideHelloWorld() {
83
+ // if (args.length > 0 && args[0].equals("fi")) {
84
+ // return new HelloWorldFI();
85
+ // } else {
86
+ // return new HelloWorldPL();
87
+ // }
88
+ // }
9589
9690 }
securis/src/main/java/net/curisit/securis/services/BasicServices.java
....@@ -0,0 +1,135 @@
1
+package net.curisit.securis.services;
2
+
3
+import java.io.IOException;
4
+import java.net.URI;
5
+
6
+import javax.servlet.http.HttpServletRequest;
7
+import javax.ws.rs.FormParam;
8
+import javax.ws.rs.GET;
9
+import javax.ws.rs.POST;
10
+import javax.ws.rs.Path;
11
+import javax.ws.rs.Produces;
12
+import javax.ws.rs.core.Context;
13
+import javax.ws.rs.core.MediaType;
14
+import javax.ws.rs.core.Response;
15
+import javax.ws.rs.core.Response.Status;
16
+import javax.ws.rs.core.UriBuilder;
17
+
18
+import org.apache.commons.io.IOUtils;
19
+import org.slf4j.Logger;
20
+import org.slf4j.LoggerFactory;
21
+
22
+/**
23
+ * Basic services for login a nd basic app wrkflow
24
+ *
25
+ * @author roberto <roberto.sanchez@curisit.net>
26
+ */
27
+@Path("/")
28
+public class BasicServices {
29
+
30
+ // private LicenseHelper licenseHelper = InjectorFactory.getInjector().getInstance(LicenseHelper.class);
31
+ private static final Logger log = LoggerFactory.getLogger(BasicServices.class);
32
+
33
+ public BasicServices() {
34
+ }
35
+
36
+ /**
37
+ *
38
+ * @return the server version in format majorVersion.minorVersion
39
+ */
40
+ @GET
41
+ @Produces(
42
+ { MediaType.TEXT_HTML })
43
+ public Response index() {
44
+
45
+ URI uri = UriBuilder.fromUri("/login").build();
46
+ return Response.seeOther(uri).build();
47
+ // return Response.ok().entity("License server").build();
48
+ }
49
+
50
+ @GET
51
+ @Path("/login")
52
+ @Produces(
53
+ { MediaType.TEXT_HTML })
54
+ public Response login() {
55
+ try {
56
+ String index = IOUtils.toString(this.getClass().getResourceAsStream("/static/login.html"));
57
+ return Response.ok().entity(index).build();
58
+ } catch (IOException e) {
59
+ // TODO Auto-generated catch block
60
+ e.printStackTrace();
61
+ }
62
+ return Response.serverError().build();
63
+ }
64
+
65
+ @POST
66
+ @Path("/login")
67
+ @Produces(
68
+ { MediaType.TEXT_HTML })
69
+ public Response login(@FormParam("user") String user, @FormParam("password") String password, @Context HttpServletRequest request) {
70
+ log.info("Request: " + request.getParameter("user"));
71
+ log.info("user/pass: {} == {} ? ", user, password);
72
+ // log.info("user: {} == {} ? " + request.getParameter("user"), user);
73
+ URI uri = UriBuilder.fromUri("/main").build();
74
+ return Response.seeOther(uri).build();
75
+ }
76
+
77
+ /**
78
+ * @return the version of the three entities that can be synchronized (Users, DataSet and Settings)
79
+ */
80
+ @GET
81
+ @Path("/main")
82
+ @Produces(
83
+ { MediaType.TEXT_HTML })
84
+ public Response main() {
85
+ try {
86
+ String index = IOUtils.toString(this.getClass().getResourceAsStream("/static/main.html"));
87
+ return Response.ok().entity(index).build();
88
+ } catch (IOException e) {
89
+ // TODO Auto-generated catch block
90
+ e.printStackTrace();
91
+ }
92
+ return Response.status(Status.FORBIDDEN).build();
93
+
94
+ }
95
+ //
96
+ // private <T> ServiceResponse<T> buildErrorResponse(ServiceResponse<T> response, String msgErrorCode) {
97
+ // response.setSuccess(false);
98
+ // response.setErrorMessage(localManager.getString(msgErrorCode));
99
+ // response.setErrorMessageCode(msgErrorCode);
100
+ // return response;
101
+ // }
102
+ //
103
+ // private Date calculateCaducation() {
104
+ // Integer licenseExpiration = systemParams.getParamAsInt(SystemParams.Keys.CONFIG_SERVER_LICENSE_EXPIRATION);
105
+ // if (licenseExpiration == null)
106
+ // licenseExpiration = DEFAULT_LICENSE_EXPIRATION;
107
+ // return Utils.addDays(new Date(), licenseExpiration);
108
+ // }
109
+ //
110
+ // private boolean validateLicense(String license) {
111
+ // BasicApplication ba = basicApplicationDao.findByLicense(license);
112
+ // return (ba != null);
113
+ // }
114
+ //
115
+ // private boolean validateVersion(int minorVersion, int majorVersion) {
116
+ // return (versionManager.getMajorVersion() == majorVersion);
117
+ // }
118
+ //
119
+ // private BasicApplication findBasicApp(String license) {
120
+ // BasicApplication ba = basicApplicationDao.findByLicense(license);
121
+ // return ba;
122
+ // }
123
+ //
124
+ // private License generateLicense() {
125
+ // // TODO complete all field of the license
126
+ // License license = new License();
127
+ // license.setCustomerCode(systemParams.getParam(SystemParams.Keys.CONFIG_COMMON_CUSTOMER_CODE));
128
+ // license.setCSCode(systemParams.getParam(SystemParams.Keys.CONFIG_COMMON_CS_CODE));
129
+ // license.setCRCLogo("00000000");
130
+ // license.setExpirationDate(calculateCaducation());
131
+ // license.setInstallCode(codeGenerator.generateInstalationNumber());
132
+ // return license;
133
+ // }
134
+
135
+}
securis/src/main/java/net/curisit/securis/services/LicenseServices.java
....@@ -1,22 +1,25 @@
11 package net.curisit.securis.services;
22
3
+import java.io.IOException;
34 import java.net.URI;
45 import java.text.MessageFormat;
56
6
-import javax.inject.Inject;
77 import javax.inject.Named;
8
+import javax.servlet.http.HttpServletRequest;
89 import javax.ws.rs.DefaultValue;
910 import javax.ws.rs.GET;
1011 import javax.ws.rs.Path;
1112 import javax.ws.rs.PathParam;
1213 import javax.ws.rs.Produces;
1314 import javax.ws.rs.QueryParam;
15
+import javax.ws.rs.core.Context;
1416 import javax.ws.rs.core.MediaType;
1517 import javax.ws.rs.core.Response;
1618
1719 import net.curisit.integrity.beans.ServerConfigVersions;
1820 import net.curisit.integrity.beans.ServiceResponse;
1921
22
+import org.apache.commons.io.IOUtils;
2023 import org.slf4j.Logger;
2124 import org.slf4j.LoggerFactory;
2225
....@@ -27,14 +30,13 @@
2730 // private LicenseHelper licenseHelper = InjectorFactory.getInjector().getInstance(LicenseHelper.class);
2831 private static final Logger log = LoggerFactory.getLogger(LicenseServices.class);
2932
30
- private static final int DEFAULT_LICENSE_EXPIRATION = 3650; // 10 years;
33
+ private static final int DEFAULT_LICENSE_EXPIRATION = 365;
3134 private static final String LICENSE_STRING = "CurisIntegrity Config Server v{0}.{1}";
3235
33
- @Inject
36
+ @com.google.inject.Inject
3437 @Named("base-uri")
3538 private URI uri;
3639
37
- @Inject
3840 public LicenseServices() {
3941 }
4042
....@@ -43,10 +45,16 @@
4345 * @return the server version in format majorVersion.minorVersion
4446 */
4547 @GET
46
- @Path("/")
4748 @Produces(
48
- { MediaType.TEXT_PLAIN })
49
- public Response currentVersion() {
49
+ { MediaType.TEXT_HTML })
50
+ public Response index() {
51
+ try {
52
+ String index = IOUtils.toString(this.getClass().getResourceAsStream("/static/index.html"));
53
+ return Response.ok().entity(index).build();
54
+ } catch (IOException e) {
55
+ // TODO Auto-generated catch block
56
+ e.printStackTrace();
57
+ }
5058 return Response.ok().entity(MessageFormat.format(LICENSE_STRING, 0, 1)).build();
5159 }
5260
....@@ -54,8 +62,9 @@
5462 @Path("/dummy")
5563 @Produces(
5664 { MediaType.TEXT_PLAIN })
57
- public Response dummy() {
58
- return Response.ok().entity(uri.toString()).build();
65
+ public Response dummy(@Context HttpServletRequest request) {
66
+ log.info("Request: " + request.getPathInfo());
67
+ return Response.ok().entity((uri == null)).build();
5968 }
6069
6170 /**
securis/src/main/resources/static/index.html
....@@ -0,0 +1,5 @@
1
+<html>
2
+ <body>
3
+ <h1>INDEX example !!!</h1>
4
+ </body>
5
+</html>
securis/src/main/resources/static/login.html
....@@ -0,0 +1,17 @@
1
+<!DOCTYPE html>
2
+<html>
3
+ <head>
4
+ <title>CurisTEC License server</title>
5
+ </head>
6
+ <body>
7
+ <h1>LOGIN example !!!</h1>
8
+
9
+ <form action="/login" method="POST">
10
+ <label>User:</label><input type="text" name="user" id="user">
11
+ <br/>
12
+ <label>Password:</label><input type="text" name="password" id="password">
13
+ <button type="submit">Login</button>
14
+ </form>
15
+
16
+ </body>
17
+</html>
securis/src/main/resources/static/main.html
....@@ -0,0 +1,5 @@
1
+<html>
2
+ <body>
3
+ <h1>Main page</h1>
4
+ </body>
5
+</html>