Roberto Sánchez
2013-12-23 d7ee99d10fc17ca29511b2f1e551fcd1dd1c2c8e
#333 feature - Added login and first main page design
6 files added
5 files modified
changed files
securis/src/main/java/net/curisit/securis/MainApp.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/services/BasicServices.java patch | view | blame | history
securis/src/main/java/net/curisit/securis/services/UserResource.java patch | view | blame | history
securis/src/main/resources/static/favicon.ico patch | view | blame | history
securis/src/main/resources/static/images/securis_100.png patch | view | blame | history
securis/src/main/resources/static/images/securis_40.png patch | view | blame | history
securis/src/main/resources/static/js/login.js patch | view | blame | history
securis/src/main/resources/static/js/main.js 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/src/main/java/net/curisit/securis/MainApp.java
....@@ -12,14 +12,16 @@
1212 import net.curisit.securis.ioc.RequestsModule;
1313 import net.curisit.securis.ioc.SecurisModule;
1414
15
+import org.eclipse.jetty.server.Handler;
1516 import org.eclipse.jetty.server.Server;
16
-import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
17
+import org.eclipse.jetty.server.handler.ContextHandlerCollection;
18
+import org.eclipse.jetty.server.handler.ResourceHandler;
1719 import org.eclipse.jetty.servlet.FilterHolder;
1820 import org.eclipse.jetty.servlet.ServletContextHandler;
1921 import org.eclipse.jetty.servlet.ServletHolder;
22
+import org.eclipse.jetty.util.resource.Resource;
2023 import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener;
2124 import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;
22
-import org.jboss.resteasy.util.HttpResponseCodes;
2325 import org.slf4j.Logger;
2426 import org.slf4j.LoggerFactory;
2527
....@@ -52,8 +54,7 @@
5254
5355 private static void startServer(URI uri) throws Exception {
5456 System.out.println("Starting jetty...");
55
- // ResourceConfig rc = new PackagesResourceConfig("net.curisit.securis.services", "org.codehaus.jackson.jaxrs");
56
- // IoCComponentProviderFactory ioc = new GuiceComponentProviderFactory(rc, injector);
57
+
5758 server = new Server(9997);
5859 ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
5960 context.setContextPath("/");
....@@ -64,25 +65,35 @@
6465 context.addFilter(new FilterHolder(injector.getInstance(AuthFilter.class)), "/*", null);
6566
6667 ServletHolder sh = new ServletHolder(HttpServletDispatcher.class);
67
- // context.addServlet(DefaultServlet.class, "/*");
68
- context.addServlet(sh, "/");
69
- ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
70
- context.setErrorHandler(errorHandler);
71
- errorHandler.addErrorPage(HttpResponseCodes.SC_FORBIDDEN, "/login");
72
- errorHandler.addErrorPage(HttpResponseCodes.SC_NOT_FOUND, "/");
73
- errorHandler.addErrorPage(javax.ws.rs.NotFoundException.class, "/");
74
- errorHandler.addErrorPage(javax.ws.rs.ForbiddenException.class, "/");
75
- errorHandler.addErrorPage(javax.ws.rs.ForbiddenException.class.getCanonicalName(), "/");
76
- errorHandler.addErrorPage(ErrorPageErrorHandler.GLOBAL_ERROR_PAGE, "/");
68
+ sh.setName("resteasy");
69
+ context.addServlet(sh, "/*");
7770
71
+ ResourceHandler staticResources = new ResourceHandler();
72
+ staticResources.setBaseResource(Resource.newResource(MainApp.class.getResource("/static").toURI()));
73
+ staticResources.setWelcomeFiles(new String[]
74
+ { "/login.html" });
75
+ context.setHandler(staticResources);
76
+
77
+ // ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
78
+ // context.setErrorHandler(errorHandler);
79
+ // errorHandler.addErrorPage(HttpResponseCodes.SC_FORBIDDEN, "/login");
80
+ // errorHandler.addErrorPage(HttpResponseCodes.SC_NOT_FOUND, "/");
81
+ // errorHandler.addErrorPage(javax.ws.rs.NotFoundException.class, "/");
82
+ // errorHandler.addErrorPage(javax.ws.rs.ForbiddenException.class, "/");
83
+ // errorHandler.addErrorPage(javax.ws.rs.ForbiddenException.class.getCanonicalName(), "/");
84
+ // errorHandler.addErrorPage(ErrorPageErrorHandler.GLOBAL_ERROR_PAGE, "/");
85
+ context.setWelcomeFiles(new String[]
86
+ { "/index" });
7887 log.info("Error Handlers: " + context.getErrorHandler());
79
- server.setHandler(context);
88
+ ContextHandlerCollection contexts = new ContextHandlerCollection();
8089
90
+ contexts.setHandlers(new Handler[]
91
+ { staticResources, context });
92
+ // server.setHandler(contexts);
93
+
94
+ server.setHandler(context);
8195 server.start();
8296 server.join();
83
- // rc.packages("net.curisit.securis.services", "org.codehaus.jackson.jaxrs");
84
-
85
- // new CLStaticHttpHandler(new URLClassLoader(new URL[] {new URL("file:///home/username/staticfiles.jar")})), "/www")
8697
8798 }
8899
....@@ -98,6 +109,8 @@
98109
99110 @Override
100111 public Response toResponse(Exception e) {
112
+ // log.info("Creating DefaultExceptionHandler ");
113
+ e.printStackTrace();
101114 // For simplicity I am preparing error xml by hand.
102115 // Ideally we should create an ErrorResponse class to hold the error info.
103116 StringBuilder response = new StringBuilder("<response>");
securis/src/main/java/net/curisit/securis/ioc/RequestsModule.java
....@@ -2,6 +2,7 @@
22
33 import net.curisit.securis.services.BasicServices;
44 import net.curisit.securis.services.LicenseServices;
5
+import net.curisit.securis.services.UserResource;
56
67 import org.eclipse.jetty.server.Authentication.User;
78 import org.jboss.resteasy.plugins.guice.RequestScoped;
....@@ -17,6 +18,7 @@
1718 super.configure();
1819 bind(BasicServices.class);
1920 bind(LicenseServices.class);
21
+ bind(UserResource.class);
2022 }
2123
2224 @Provides
securis/src/main/java/net/curisit/securis/services/BasicServices.java
....@@ -1,34 +1,29 @@
11 package net.curisit.securis.services;
22
3
-import java.io.IOException;
43 import java.net.URI;
4
+import java.util.Date;
55
6
-import javax.annotation.security.RolesAllowed;
76 import javax.servlet.http.HttpServletRequest;
8
-import javax.ws.rs.FormParam;
7
+import javax.servlet.http.HttpSession;
98 import javax.ws.rs.GET;
10
-import javax.ws.rs.POST;
119 import javax.ws.rs.Path;
1210 import javax.ws.rs.Produces;
1311 import javax.ws.rs.core.Context;
1412 import javax.ws.rs.core.MediaType;
1513 import javax.ws.rs.core.Response;
16
-import javax.ws.rs.core.Response.Status;
1714 import javax.ws.rs.core.UriBuilder;
1815
19
-import org.apache.commons.io.IOUtils;
2016 import org.slf4j.Logger;
2117 import org.slf4j.LoggerFactory;
2218
2319 /**
24
- * Basic services for login a nd basic app wrkflow
20
+ * Basic services for login and basic app wrkflow
2521 *
2622 * @author roberto <roberto.sanchez@curisit.net>
2723 */
2824 @Path("/")
2925 public class BasicServices {
3026
31
- // private LicenseHelper licenseHelper = InjectorFactory.getInjector().getInstance(LicenseHelper.class);
3227 private static final Logger log = LoggerFactory.getLogger(BasicServices.class);
3328
3429 public BasicServices() {
....@@ -39,115 +34,24 @@
3934 * @return the server version in format majorVersion.minorVersion
4035 */
4136 @GET
37
+ @Path("/index")
4238 @Produces(
4339 { MediaType.TEXT_HTML })
4440 public Response index(@Context HttpServletRequest request) {
4541 log.info("index session: " + request.getSession());
46
- URI uri = UriBuilder.fromUri("/login").build();
42
+ HttpSession session = request.getSession(false);
43
+ String page = session != null && session.getAttribute("user") != null ? "/main.html" : "/login.html";
44
+ URI uri = UriBuilder.fromUri(page).build();
4745 return Response.seeOther(uri).build();
4846 // return Response.ok().entity("License server").build();
4947 }
5048
5149 @GET
52
- @Path("/login")
50
+ @Path("/info")
5351 @Produces(
54
- { MediaType.TEXT_HTML })
55
- public Response login(@Context HttpServletRequest request) {
56
- log.info("index login: " + request.getSession());
57
- try {
58
- String index = IOUtils.toString(this.getClass().getResourceAsStream("/static/login.html"));
59
- return Response.ok().entity(index).build();
60
- } catch (IOException e) {
61
- // TODO Auto-generated catch block
62
- e.printStackTrace();
63
- }
64
- return Response.serverError().build();
52
+ { MediaType.TEXT_PLAIN })
53
+ public Response info(@Context HttpServletRequest request) {
54
+ return Response.ok().entity("License server running OK. Date: " + new Date()).build();
6555 }
66
-
67
- @POST
68
- @Path("/login")
69
- @Produces(
70
- { MediaType.TEXT_HTML })
71
- public Response login(@FormParam("user") String user, @FormParam("password") String password, @Context HttpServletRequest request) {
72
- log.info("index session: " + request.getSession());
73
- log.info("Request: " + request.getParameter("user"));
74
- log.info("is user in role: {} == {} ? ", "advance", request.isUserInRole("advance"));
75
- // log.info("user: {} == {} ? " + request.getParameter("user"), user);
76
- request.getSession().setAttribute("user", user);
77
- URI uri = UriBuilder.fromUri("/main").build();
78
- return Response.seeOther(uri).build();
79
- }
80
-
81
- /**
82
- * @return the version of the three entities that can be synchronized (Users, DataSet and Settings)
83
- */
84
- @GET
85
- @Path("/main")
86
- @Produces(
87
- { MediaType.TEXT_HTML })
88
- @RolesAllowed("advance")
89
- public Response main(@Context HttpServletRequest request) {
90
- try {
91
- log.info("Is user in role advance: {}", request.isUserInRole("advance"));
92
- String index = IOUtils.toString(this.getClass().getResourceAsStream("/static/main.html"));
93
- return Response.ok().entity(index).build();
94
- } catch (IOException e) {
95
- // TODO Auto-generated catch block
96
- e.printStackTrace();
97
- }
98
- return Response.status(Status.FORBIDDEN).build();
99
-
100
- }
101
-
102
- @GET
103
- @Path("/logout")
104
- @Produces(
105
- { MediaType.TEXT_HTML })
106
- public Response logout(@Context HttpServletRequest request) {
107
- request.getSession().setAttribute("user", null);
108
- URI uri = UriBuilder.fromUri("/login").build();
109
- return Response.seeOther(uri).build();
110
-
111
- }
112
-
113
- //
114
- // private <T> ServiceResponse<T> buildErrorResponse(ServiceResponse<T> response, String msgErrorCode) {
115
- // response.setSuccess(false);
116
- // response.setErrorMessage(localManager.getString(msgErrorCode));
117
- // response.setErrorMessageCode(msgErrorCode);
118
- // return response;
119
- // }
120
- //
121
- // private Date calculateCaducation() {
122
- // Integer licenseExpiration = systemParams.getParamAsInt(SystemParams.Keys.CONFIG_SERVER_LICENSE_EXPIRATION);
123
- // if (licenseExpiration == null)
124
- // licenseExpiration = DEFAULT_LICENSE_EXPIRATION;
125
- // return Utils.addDays(new Date(), licenseExpiration);
126
- // }
127
- //
128
- // private boolean validateLicense(String license) {
129
- // BasicApplication ba = basicApplicationDao.findByLicense(license);
130
- // return (ba != null);
131
- // }
132
- //
133
- // private boolean validateVersion(int minorVersion, int majorVersion) {
134
- // return (versionManager.getMajorVersion() == majorVersion);
135
- // }
136
- //
137
- // private BasicApplication findBasicApp(String license) {
138
- // BasicApplication ba = basicApplicationDao.findByLicense(license);
139
- // return ba;
140
- // }
141
- //
142
- // private License generateLicense() {
143
- // // TODO complete all field of the license
144
- // License license = new License();
145
- // license.setCustomerCode(systemParams.getParam(SystemParams.Keys.CONFIG_COMMON_CUSTOMER_CODE));
146
- // license.setCSCode(systemParams.getParam(SystemParams.Keys.CONFIG_COMMON_CS_CODE));
147
- // license.setCRCLogo("00000000");
148
- // license.setExpirationDate(calculateCaducation());
149
- // license.setInstallCode(codeGenerator.generateInstalationNumber());
150
- // return license;
151
- // }
15256
15357 }
securis/src/main/java/net/curisit/securis/services/UserResource.java
....@@ -0,0 +1,123 @@
1
+package net.curisit.securis.services;
2
+
3
+import javax.annotation.security.RolesAllowed;
4
+import javax.servlet.http.HttpServletRequest;
5
+import javax.ws.rs.FormParam;
6
+import javax.ws.rs.GET;
7
+import javax.ws.rs.POST;
8
+import javax.ws.rs.Path;
9
+import javax.ws.rs.PathParam;
10
+import javax.ws.rs.Produces;
11
+import javax.ws.rs.core.Context;
12
+import javax.ws.rs.core.MediaType;
13
+import javax.ws.rs.core.Response;
14
+import javax.ws.rs.core.Response.Status;
15
+
16
+import net.curisit.integrity.commons.Utils;
17
+
18
+import org.slf4j.Logger;
19
+import org.slf4j.LoggerFactory;
20
+
21
+/**
22
+ * User resource
23
+ *
24
+ * @author roberto <roberto.sanchez@curisit.net>
25
+ */
26
+@Path("/user")
27
+public class UserResource {
28
+
29
+ // private LicenseHelper licenseHelper = InjectorFactory.getInjector().getInstance(LicenseHelper.class);
30
+ private static final Logger log = LoggerFactory.getLogger(UserResource.class);
31
+
32
+ public UserResource() {
33
+ }
34
+
35
+ /**
36
+ *
37
+ * @return the server version in format majorVersion.minorVersion
38
+ */
39
+ @GET
40
+ @Path("/")
41
+ @Produces(
42
+ { MediaType.TEXT_PLAIN })
43
+ public Response index(@Context HttpServletRequest request) {
44
+ return Response.ok("User resource").build();
45
+ }
46
+
47
+ @POST
48
+ @Path("/login")
49
+ @Produces(
50
+ { MediaType.APPLICATION_JSON })
51
+ public Response login(@FormParam("username") String user, @FormParam("password") String password, @Context HttpServletRequest request) {
52
+ log.info("index session: " + request.getSession());
53
+ log.info("user: {}, pass: {}", user, password);
54
+ log.info("is user in role: {} == {} ? ", "advance", request.isUserInRole("advance"));
55
+
56
+ request.getSession().setAttribute("username", user);
57
+ if ("no".equals(password))
58
+ return Response.status(Status.FORBIDDEN).build();
59
+ return Response.ok(Utils.createMap("name", "Pepito", "username", user)).build();
60
+ }
61
+
62
+ /**
63
+ * @return the version of the three entities that can be synchronized (Users, DataSet and Settings)
64
+ */
65
+ @GET
66
+ @Path("/{username}")
67
+ @Produces(
68
+ { MediaType.APPLICATION_JSON })
69
+ @RolesAllowed("advance")
70
+ public Response main(@PathParam("username") String username) {
71
+ return Response.ok().entity(Utils.createMap("name", "Pepito", "username", username)).build();
72
+ }
73
+
74
+ @GET
75
+ @Path("/logout")
76
+ @Produces(
77
+ { MediaType.APPLICATION_JSON })
78
+ public Response logout(@Context HttpServletRequest request) {
79
+ request.getSession().invalidate();
80
+ return Response.ok().build();
81
+ }
82
+
83
+ //
84
+ // private <T> ServiceResponse<T> buildErrorResponse(ServiceResponse<T> response, String msgErrorCode) {
85
+ // response.setSuccess(false);
86
+ // response.setErrorMessage(localManager.getString(msgErrorCode));
87
+ // response.setErrorMessageCode(msgErrorCode);
88
+ // return response;
89
+ // }
90
+ //
91
+ // private Date calculateCaducation() {
92
+ // Integer licenseExpiration = systemParams.getParamAsInt(SystemParams.Keys.CONFIG_SERVER_LICENSE_EXPIRATION);
93
+ // if (licenseExpiration == null)
94
+ // licenseExpiration = DEFAULT_LICENSE_EXPIRATION;
95
+ // return Utils.addDays(new Date(), licenseExpiration);
96
+ // }
97
+ //
98
+ // private boolean validateLicense(String license) {
99
+ // BasicApplication ba = basicApplicationDao.findByLicense(license);
100
+ // return (ba != null);
101
+ // }
102
+ //
103
+ // private boolean validateVersion(int minorVersion, int majorVersion) {
104
+ // return (versionManager.getMajorVersion() == majorVersion);
105
+ // }
106
+ //
107
+ // private BasicApplication findBasicApp(String license) {
108
+ // BasicApplication ba = basicApplicationDao.findByLicense(license);
109
+ // return ba;
110
+ // }
111
+ //
112
+ // private License generateLicense() {
113
+ // // TODO complete all field of the license
114
+ // License license = new License();
115
+ // license.setCustomerCode(systemParams.getParam(SystemParams.Keys.CONFIG_COMMON_CUSTOMER_CODE));
116
+ // license.setCSCode(systemParams.getParam(SystemParams.Keys.CONFIG_COMMON_CS_CODE));
117
+ // license.setCRCLogo("00000000");
118
+ // license.setExpirationDate(calculateCaducation());
119
+ // license.setInstallCode(codeGenerator.generateInstalationNumber());
120
+ // return license;
121
+ // }
122
+
123
+}
securis/src/main/resources/static/favicon.ico
Binary files differ
securis/src/main/resources/static/images/securis_100.png
Binary files differ
securis/src/main/resources/static/images/securis_40.png
Binary files differ
securis/src/main/resources/static/js/login.js
....@@ -0,0 +1,46 @@
1
+(function() {
2
+ 'use strict';
3
+
4
+ var app = angular.module('app', ['ngRoute']);
5
+
6
+ app.controller('LoginCtrl', ['$scope', '$http', '$window',
7
+ function($scope, $http, $window) {
8
+
9
+ $scope.$loginerror = false;
10
+ $('#loginError').removeClass('hide');
11
+
12
+ $scope.hideAlert = function() {
13
+ $scope.$loginerror = false;
14
+ $('#user').focus();
15
+ }
16
+ $scope.submit = function() {
17
+ console.log('Sending user: ' + $scope.username + ' pass: ' + $scope.password);
18
+ $scope.hideAlert();
19
+ $http({ method: 'POST',
20
+ url: '/user/login',
21
+ headers: {
22
+ "Content-Type": "application/x-www-form-urlencoded"
23
+ },
24
+ data: $.param({
25
+ username: $scope.username,
26
+ password: $scope.password
27
+ })
28
+ }).
29
+ success(function(data, status, headers, config) {
30
+ $window.location.href = "/main.html";
31
+ }).
32
+ error(function(data, status, headers, config) {
33
+ console.error(data + " status: "+ status);
34
+ $scope.$loginerror = true;
35
+ if (status === 403 /* forbidden */) {
36
+ $scope.$errormsg = 'Invalid credentials'
37
+ } else {
38
+ $scope.$errormsg = 'Unexpected error HTTP ' + status + ' accessing to server. Contact with the administrator.'
39
+ }
40
+ $('#user').focus();
41
+ });
42
+ return false;
43
+ }
44
+ }]);
45
+
46
+})();
securis/src/main/resources/static/js/main.js
....@@ -0,0 +1,4 @@
1
+(function() {
2
+
3
+
4
+})();
securis/src/main/resources/static/login.html
....@@ -1,108 +1,117 @@
11 <!DOCTYPE html>
2
-<html class="no-js" lang="en">
3
- <head>
4
- <base href="/base">
5
- <meta charset="utf-8">
6
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
7
- <title></title>
8
- <meta name="description" content="">
9
- <meta name="viewport" content="width=device-width">
2
+<html class="no-js" lang="en" ng-app="app" xmlns:ng="http://angularjs.org">
3
+<head>
4
+<meta charset="utf-8">
5
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
6
+<title></title>
7
+<meta name="description" content="">
8
+<meta name="viewport" content="width=device-width">
109
11
- <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
12
- <style>
13
- body {
14
- padding-top: 50px;
15
- padding-bottom: 20px;
16
- }
17
- </style>
18
- <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.3/css/bootstrap-theme.min.css">
19
- <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css">
20
- <link rel="stylesheet" href="css/main.css">
21
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
22
- <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
10
+<link rel="stylesheet"
11
+ href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
12
+<style>
13
+body {
14
+ padding-top: 50px;
15
+ padding-bottom: 20px;
16
+}
17
+</style>
18
+<link rel="stylesheet"
19
+ href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.3/css/bootstrap-theme.min.css">
20
+<link rel="stylesheet"
21
+ href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css">
22
+<!-- <link rel="stylesheet" href="css/main.css"> -->
23
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
24
+<!-- <link href="assets/css/bootstrap-responsive.css" rel="stylesheet"> -->
2325
24
- <script src="js/vendor/modernizr-2.6.2.min.js"></script>
25
- </head>
26
- <body>
27
- <div class="navbar navbar-inverse navbar-fixed-top">
28
- <div class="container">
29
- <div class="navbar-header">
30
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
31
- <span class="icon-bar"></span>
32
- <span class="icon-bar"></span>
33
- <span class="icon-bar"></span>
34
- </button>
35
- <a class="navbar-brand" href="#">SeCuris</a>
36
- </div>
37
- <div class="navbar-collapse collapse">
38
- <ul class="nav navbar-nav">
39
- <li><a href="#about">About</a></li>
40
- <li><a href="#contact">Contact</a></li>
41
- </ul>
42
- <form class="navbar-form navbar-right">
43
- <div class="form-group">
44
- <input type="text" placeholder="Email" class="form-control">
45
- </div>
46
- <div class="form-group">
47
- <input type="password" placeholder="Password" class="form-control">
48
- </div>
49
- <button type="submit" class="btn btn-success">Sign in</button>
50
- </form>
51
- </div><!--/.navbar-collapse -->
52
- </div>
53
- </div>
54
-
55
- <!-- Main jumbotron for a primary marketing message or call to action -->
56
- <div class="jumbotron">
57
- <div class="container">
58
- <h2>SeCuris</h2>
59
- <p>Server License for CurisTEC products.</p>
60
- </div>
61
- </div>
62
-
63
-<div class="container">
64
-<div class="col-md-8 col-md-offset-2">
65
- <form role="form" class="form-horizontal" action='/login' method="POST">
66
- <fieldset>
67
- <div id="legend">
68
- <legend class="">Login</legend>
69
- </div>
70
- <div class="form-group">
71
- <!-- Username -->
72
- <label class="col-sm-3 control-label" for="username">Username</label>
73
- <div class="col-sm-5">
74
- <input type="text" id="user" name="user" placeholder="" class="form-control">
75
- </div>
76
- </div>
77
- <div class="form-group">
78
- <!-- Password-->
79
- <label class="col-sm-3 control-label" for="password">Password</label>
80
- <div class="col-sm-5">
81
- <input type="password" id="password" name="password" placeholder="" class="form-control">
82
- </div>
83
- </div>
84
- <div class="checkbox">
85
- <label>
86
- <input type="checkbox"> Remember credentials
87
- </label>
88
- </div>
89
- <button type="submit" class="btn btn-primary">Login</button>
90
- </fieldset>
91
- </form>
26
+<!-- <script src="js/vendor/modernizr-2.6.2.min.js"></script> -->
27
+</head>
28
+<body>
29
+ <div class="navbar navbar-inverse navbar-fixed-top">
30
+ <div class="container">
31
+ <div class="navbar-header">
32
+ <button type="button" class="navbar-toggle" data-toggle="collapse"
33
+ data-target=".navbar-collapse">
34
+ <span class="icon-bar"></span> <span class="icon-bar"></span> <span
35
+ class="icon-bar"></span>
36
+ </button>
37
+ <a class="navbar-brand" href="#">SeCuris</a>
9238 </div>
93
-</div>
39
+ <div class="navbar-collapse collapse">
40
+ <ul class="nav navbar-nav navbar-right">
41
+ <li><a href="#about">About</a></li>
42
+ <li><a href="#contact">Contact</a></li>
43
+ </ul>
44
+ </div>
45
+ </div>
46
+ </div>
47
+
48
+ <!-- Main jumbotron for a primary marketing message or call to action -->
49
+ <div class="jumbotron">
50
+ <div class="container">
51
+ <h2>SeCuris</h2>
52
+ <p>Server License for CurisTEC products.</p>
53
+ </div>
54
+ </div>
55
+
56
+ <div class="container">
57
+ <div class="col-md-8 col-md-offset-2">
58
+ <form role="form" class="form-horizontal" ng-controller="LoginCtrl"
59
+ ng-submit="submit()" name="loginForm">
60
+ <p class="lead">Sign in application</p>
61
+ <fieldset>
62
+ <div class="form-group">
63
+ <label class="col-md-3 control-label" for="username">Username</label>
64
+ <div class="col-md-5">
65
+ <input type="text" id="username" name="username" placeholder=""
66
+ class="form-control" ng-model="username" required>
67
+ </div>
68
+ </div>
69
+ <div class="form-group">
70
+ <!-- Password-->
71
+ <label class="col-md-3 control-label" for="password">Password</label>
72
+ <div class="col-md-5">
73
+ <input type="password" id="password" name="password"
74
+ placeholder="" class="form-control" ng-model="password" required>
75
+ </div>
76
+ </div>
77
+ <div ng-show="$loginerror" class="alert alert-danger col-md-8 hide" id="loginError">
78
+ <button type="button" class="close" aria-hidden="true" ng-click="hideAlert()">&times;</button>
79
+ <span>{{$errormsg}}</span>
80
+ </div>
81
+ </fieldset>
82
+ <button type="submit" class="btn btn-primary">Login</button>
83
+ </form>
84
+ </div>
85
+ </div>
9486
9587
96
- <hr>
97
-<div>
98
- <footer>
99
- <small style="margin: auto; display:block;" class="text-center">&copy; CurisTEC 2014</small>
100
- </footer>
101
- </div> <!-- /container -->
102
- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
103
-
104
- <script type="text/javascript" src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
88
+ <hr>
89
+ <div>
90
+ <footer>
91
+ <small style="margin: auto; display: block;" class="text-center">&copy;
92
+ CurisTEC 2014</small>
93
+ </footer>
94
+ </div>
95
+ <!-- /container -->
96
+ <script
97
+ src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
10598
106
-<!-- <script src="js/main.js"></script> -->
107
- </body>
99
+ <script type="text/javascript"
100
+ src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
101
+ <script type="text/javascript"
102
+ src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js"></script>
103
+ <script type="text/javascript"
104
+ src="//code.angularjs.org/1.2.6/angular-route.js"></script>
105
+ <script type="text/javascript"
106
+ src="//code.angularjs.org/1.2.6/angular-resource.js"></script>
107
+ <script type="text/javascript" src="js/login.js"></script>
108
+
109
+ <!-- <script src="js/main.js"></script> -->
110
+ <script type="text/javascript">
111
+ $(function() {
112
+ $('#user').focus();
113
+ });
114
+
115
+ </script>
116
+</body>
108117 </html>
securis/src/main/resources/static/main.html
....@@ -1,5 +1,142 @@
1
-<html>
2
- <body>
3
- <h1>Main page</h1>
4
- </body>
1
+<!DOCTYPE html>
2
+<html class="no-js" lang="en" ng-app="app" xmlns:ng="http://angularjs.org">
3
+<head>
4
+<meta charset="utf-8">
5
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
6
+<title></title>
7
+<meta name="description" content="">
8
+<meta name="viewport" content="width=device-width">
9
+
10
+<link rel="stylesheet"
11
+ href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
12
+<style>
13
+body {
14
+ padding-top: 50px;
15
+ padding-bottom: 20px;
16
+}
17
+</style>
18
+<link rel="stylesheet"
19
+ href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.3/css/bootstrap-theme.min.css">
20
+<link rel="stylesheet"
21
+ href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css">
22
+<!-- <link rel="stylesheet" href="css/main.css"> -->
23
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
24
+<!-- <link href="assets/css/bootstrap-responsive.css" rel="stylesheet"> -->
25
+
26
+<!-- <script src="js/vendor/modernizr-2.6.2.min.js"></script> -->
27
+</head>
28
+<body>
29
+ <div class="navbar navbar-inverse navbar-fixed-top">
30
+ <div class="container">
31
+ <div class="navbar-header">
32
+ <button type="button" class="navbar-toggle" data-toggle="collapse"
33
+ data-target=".navbar-collapse">
34
+ <span class="icon-bar"></span> <span class="icon-bar"></span> <span
35
+ class="icon-bar"></span>
36
+ </button>
37
+ <ul class="nav navbar-nav navbar-left">
38
+ <li>SeCuris<li>
39
+ <li><a href="#licenses">Licenses</a></li>
40
+ <li><a href="#admin">Admin</a></li>
41
+ </ul>
42
+ </div>
43
+ <div class="navbar-collapse collapse">
44
+ <ul class="nav navbar-nav navbar-right">
45
+ <li><a href="#about">About</a></li>
46
+ <li><a href="#contact">Contact</a></li>
47
+ </ul>
48
+ </div>
49
+ </div>
50
+ </div>
51
+
52
+ <!-- Main jumbotron for a primary marketing message or call to action -->
53
+ <div class="container">
54
+ <div class="col-md-4">
55
+ <div class="panel panel-default">
56
+ <div class="panel-heading">Packs</div>
57
+
58
+ <table class="table table-striped table-hover">
59
+ <thead>
60
+ <tr>
61
+ <th>Org.</th>
62
+ <th>Pack</th>
63
+ </tr>
64
+ </thead>
65
+ <tbody>
66
+ <tr><td>BP UK</td><td>BP-CICS-001</td></tr>
67
+ <tr><td>BP UK</td><td>BP-CISA-001</td></tr>
68
+ <tr><td>BP Texas</td><td>BP-CICS-002</td></tr>
69
+ <tr><td>BP Texas</td><td>BP-CISA-002</td></tr>
70
+ </tbody>
71
+ <tfoot>
72
+ </tfoot>
73
+ </table>
74
+ </div>
75
+ </div>
76
+ <div class="col-md-8">
77
+ <div class="panel panel-default">
78
+ <div class="panel-heading">Licenses</div>
79
+
80
+ <table class="table table-hover">
81
+ <thead>
82
+ <tr>
83
+ <th>License</th>
84
+ <th>Email</th>
85
+ <th>Status</th>
86
+ </tr>
87
+ </thead>
88
+ <tbody>
89
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user1@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
90
+ <tr><td>BP-CICS-0029HAHAHA UK</td><td>user2@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
91
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user3@bp.com</td><td class="danger"><span class="glyphicon glyphicon-warning-sign"></span></td></tr>
92
+ <tr><td>BP-CICS-0128HAHAHA UK</td><td>user4@bp.com</td><td class="danger"><span class="glyphicon glyphicon-warning-sign"></span></td></tr>
93
+ <tr><td>BP-CICS-00qqasddHA UK</td><td>user5@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
94
+ <tr><td>BP-CICS-0028HAaaHA UK</td><td>user6@bp.com</td><td class="warning"><span class="glyphicon glyphicon-question-sign"></span></td></tr>
95
+ <tr><td>BP-CICS-0028aaaaHA UK</td><td>user7@bp.com</td><td class="warning"><span class="glyphicon glyphicon-question-sign"></span></td></tr>
96
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user8@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
97
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user9@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
98
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user0@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
99
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user11@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
100
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user12@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
101
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user13@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
102
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user14@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
103
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user15@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
104
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user16@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
105
+ </tbody>
106
+ <tfoot>
107
+ </tfoot>
108
+ </table>
109
+ </div>
110
+ </div>
111
+ </div>
112
+
113
+ <hr>
114
+ <div>
115
+ <footer>
116
+ <small style="margin: auto; display: block;" class="text-center">&copy;
117
+ CurisTEC 2014</small>
118
+ </footer>
119
+ </div>
120
+ <!-- /container -->
121
+ <script
122
+ src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
123
+
124
+ <script type="text/javascript"
125
+ src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
126
+ <script type="text/javascript"
127
+ src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js"></script>
128
+ <script type="text/javascript"
129
+ src="//code.angularjs.org/1.2.6/angular-route.js"></script>
130
+ <script type="text/javascript"
131
+ src="//code.angularjs.org/1.2.6/angular-resource.js"></script>
132
+ <script type="text/javascript" src="js/login.js"></script>
133
+
134
+ <!-- <script src="js/main.js"></script> -->
135
+ <script type="text/javascript">
136
+ $(function() {
137
+
138
+ });
139
+
140
+ </script>
141
+</body>
5142 </html>