From d7ee99d10fc17ca29511b2f1e551fcd1dd1c2c8e Mon Sep 17 00:00:00 2001
From: Roberto Sánchez <roberto.sanchez@curisit.net>
Date: Mon, 23 Dec 2013 17:38:25 +0000
Subject: [PATCH] #333 feature - Added login and first main page design
---
securis/src/main/resources/static/images/securis_40.png | 0
securis/src/main/resources/static/favicon.ico | 0
securis/src/main/java/net/curisit/securis/services/UserResource.java | 123 ++++++++++
securis/src/main/resources/static/main.html | 145 +++++++++++
securis/src/main/java/net/curisit/securis/MainApp.java | 49 ++-
securis/src/main/java/net/curisit/securis/ioc/RequestsModule.java | 2
securis/src/main/java/net/curisit/securis/services/BasicServices.java | 118 --------
securis/src/main/resources/static/js/login.js | 46 +++
securis/src/main/resources/static/images/securis_100.png | 0
securis/src/main/resources/static/js/main.js | 4
securis/src/main/resources/static/login.html | 209 +++++++++--------
11 files changed, 467 insertions(+), 229 deletions(-)
diff --git a/securis/src/main/java/net/curisit/securis/MainApp.java b/securis/src/main/java/net/curisit/securis/MainApp.java
index b8ae3b1..2d81bbb 100644
--- a/securis/src/main/java/net/curisit/securis/MainApp.java
+++ b/securis/src/main/java/net/curisit/securis/MainApp.java
@@ -12,14 +12,16 @@
import net.curisit.securis.ioc.RequestsModule;
import net.curisit.securis.ioc.SecurisModule;
+import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
+import org.eclipse.jetty.server.handler.ContextHandlerCollection;
+import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.util.resource.Resource;
import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener;
import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;
-import org.jboss.resteasy.util.HttpResponseCodes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -52,8 +54,7 @@
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("/");
@@ -64,25 +65,35 @@
context.addFilter(new FilterHolder(injector.getInstance(AuthFilter.class)), "/*", null);
ServletHolder sh = new ServletHolder(HttpServletDispatcher.class);
- // context.addServlet(DefaultServlet.class, "/*");
- context.addServlet(sh, "/");
- ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
- context.setErrorHandler(errorHandler);
- errorHandler.addErrorPage(HttpResponseCodes.SC_FORBIDDEN, "/login");
- errorHandler.addErrorPage(HttpResponseCodes.SC_NOT_FOUND, "/");
- errorHandler.addErrorPage(javax.ws.rs.NotFoundException.class, "/");
- errorHandler.addErrorPage(javax.ws.rs.ForbiddenException.class, "/");
- errorHandler.addErrorPage(javax.ws.rs.ForbiddenException.class.getCanonicalName(), "/");
- errorHandler.addErrorPage(ErrorPageErrorHandler.GLOBAL_ERROR_PAGE, "/");
+ sh.setName("resteasy");
+ context.addServlet(sh, "/*");
+ ResourceHandler staticResources = new ResourceHandler();
+ staticResources.setBaseResource(Resource.newResource(MainApp.class.getResource("/static").toURI()));
+ staticResources.setWelcomeFiles(new String[]
+ { "/login.html" });
+ context.setHandler(staticResources);
+
+ // ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
+ // context.setErrorHandler(errorHandler);
+ // errorHandler.addErrorPage(HttpResponseCodes.SC_FORBIDDEN, "/login");
+ // errorHandler.addErrorPage(HttpResponseCodes.SC_NOT_FOUND, "/");
+ // errorHandler.addErrorPage(javax.ws.rs.NotFoundException.class, "/");
+ // errorHandler.addErrorPage(javax.ws.rs.ForbiddenException.class, "/");
+ // errorHandler.addErrorPage(javax.ws.rs.ForbiddenException.class.getCanonicalName(), "/");
+ // errorHandler.addErrorPage(ErrorPageErrorHandler.GLOBAL_ERROR_PAGE, "/");
+ context.setWelcomeFiles(new String[]
+ { "/index" });
log.info("Error Handlers: " + context.getErrorHandler());
- server.setHandler(context);
+ ContextHandlerCollection contexts = new ContextHandlerCollection();
+ contexts.setHandlers(new Handler[]
+ { staticResources, context });
+ // server.setHandler(contexts);
+
+ 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")
}
@@ -98,6 +109,8 @@
@Override
public Response toResponse(Exception e) {
+ // log.info("Creating DefaultExceptionHandler ");
+ e.printStackTrace();
// For simplicity I am preparing error xml by hand.
// Ideally we should create an ErrorResponse class to hold the error info.
StringBuilder response = new StringBuilder("<response>");
diff --git a/securis/src/main/java/net/curisit/securis/ioc/RequestsModule.java b/securis/src/main/java/net/curisit/securis/ioc/RequestsModule.java
index fe876c2..34b9401 100644
--- a/securis/src/main/java/net/curisit/securis/ioc/RequestsModule.java
+++ b/securis/src/main/java/net/curisit/securis/ioc/RequestsModule.java
@@ -2,6 +2,7 @@
import net.curisit.securis.services.BasicServices;
import net.curisit.securis.services.LicenseServices;
+import net.curisit.securis.services.UserResource;
import org.eclipse.jetty.server.Authentication.User;
import org.jboss.resteasy.plugins.guice.RequestScoped;
@@ -17,6 +18,7 @@
super.configure();
bind(BasicServices.class);
bind(LicenseServices.class);
+ bind(UserResource.class);
}
@Provides
diff --git a/securis/src/main/java/net/curisit/securis/services/BasicServices.java b/securis/src/main/java/net/curisit/securis/services/BasicServices.java
index 52df174..8fe0f5b 100644
--- a/securis/src/main/java/net/curisit/securis/services/BasicServices.java
+++ b/securis/src/main/java/net/curisit/securis/services/BasicServices.java
@@ -1,34 +1,29 @@
package net.curisit.securis.services;
-import java.io.IOException;
import java.net.URI;
+import java.util.Date;
-import javax.annotation.security.RolesAllowed;
import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.FormParam;
+import javax.servlet.http.HttpSession;
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
+ * Basic services for login and 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() {
@@ -39,115 +34,24 @@
* @return the server version in format majorVersion.minorVersion
*/
@GET
+ @Path("/index")
@Produces(
{ MediaType.TEXT_HTML })
public Response index(@Context HttpServletRequest request) {
log.info("index session: " + request.getSession());
- URI uri = UriBuilder.fromUri("/login").build();
+ HttpSession session = request.getSession(false);
+ String page = session != null && session.getAttribute("user") != null ? "/main.html" : "/login.html";
+ URI uri = UriBuilder.fromUri(page).build();
return Response.seeOther(uri).build();
// return Response.ok().entity("License server").build();
}
@GET
- @Path("/login")
+ @Path("/info")
@Produces(
- { MediaType.TEXT_HTML })
- public Response login(@Context HttpServletRequest request) {
- log.info("index login: " + request.getSession());
- 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();
+ { MediaType.TEXT_PLAIN })
+ public Response info(@Context HttpServletRequest request) {
+ return Response.ok().entity("License server running OK. Date: " + new Date()).build();
}
-
- @POST
- @Path("/login")
- @Produces(
- { MediaType.TEXT_HTML })
- public Response login(@FormParam("user") String user, @FormParam("password") String password, @Context HttpServletRequest request) {
- log.info("index session: " + request.getSession());
- log.info("Request: " + request.getParameter("user"));
- log.info("is user in role: {} == {} ? ", "advance", request.isUserInRole("advance"));
- // log.info("user: {} == {} ? " + request.getParameter("user"), user);
- request.getSession().setAttribute("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 })
- @RolesAllowed("advance")
- public Response main(@Context HttpServletRequest request) {
- try {
- log.info("Is user in role advance: {}", request.isUserInRole("advance"));
- 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();
-
- }
-
- @GET
- @Path("/logout")
- @Produces(
- { MediaType.TEXT_HTML })
- public Response logout(@Context HttpServletRequest request) {
- request.getSession().setAttribute("user", null);
- URI uri = UriBuilder.fromUri("/login").build();
- return Response.seeOther(uri).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/UserResource.java b/securis/src/main/java/net/curisit/securis/services/UserResource.java
new file mode 100644
index 0000000..603dd16
--- /dev/null
+++ b/securis/src/main/java/net/curisit/securis/services/UserResource.java
@@ -0,0 +1,123 @@
+package net.curisit.securis.services;
+
+import javax.annotation.security.RolesAllowed;
+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.PathParam;
+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 net.curisit.integrity.commons.Utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * User resource
+ *
+ * @author roberto <roberto.sanchez@curisit.net>
+ */
+@Path("/user")
+public class UserResource {
+
+ // private LicenseHelper licenseHelper = InjectorFactory.getInjector().getInstance(LicenseHelper.class);
+ private static final Logger log = LoggerFactory.getLogger(UserResource.class);
+
+ public UserResource() {
+ }
+
+ /**
+ *
+ * @return the server version in format majorVersion.minorVersion
+ */
+ @GET
+ @Path("/")
+ @Produces(
+ { MediaType.TEXT_PLAIN })
+ public Response index(@Context HttpServletRequest request) {
+ return Response.ok("User resource").build();
+ }
+
+ @POST
+ @Path("/login")
+ @Produces(
+ { MediaType.APPLICATION_JSON })
+ public Response login(@FormParam("username") String user, @FormParam("password") String password, @Context HttpServletRequest request) {
+ log.info("index session: " + request.getSession());
+ log.info("user: {}, pass: {}", user, password);
+ log.info("is user in role: {} == {} ? ", "advance", request.isUserInRole("advance"));
+
+ request.getSession().setAttribute("username", user);
+ if ("no".equals(password))
+ return Response.status(Status.FORBIDDEN).build();
+ return Response.ok(Utils.createMap("name", "Pepito", "username", user)).build();
+ }
+
+ /**
+ * @return the version of the three entities that can be synchronized (Users, DataSet and Settings)
+ */
+ @GET
+ @Path("/{username}")
+ @Produces(
+ { MediaType.APPLICATION_JSON })
+ @RolesAllowed("advance")
+ public Response main(@PathParam("username") String username) {
+ return Response.ok().entity(Utils.createMap("name", "Pepito", "username", username)).build();
+ }
+
+ @GET
+ @Path("/logout")
+ @Produces(
+ { MediaType.APPLICATION_JSON })
+ public Response logout(@Context HttpServletRequest request) {
+ request.getSession().invalidate();
+ return Response.ok().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/resources/static/favicon.ico b/securis/src/main/resources/static/favicon.ico
new file mode 100644
index 0000000..c1d9026
--- /dev/null
+++ b/securis/src/main/resources/static/favicon.ico
Binary files differ
diff --git a/securis/src/main/resources/static/images/securis_100.png b/securis/src/main/resources/static/images/securis_100.png
new file mode 100644
index 0000000..4a68558
--- /dev/null
+++ b/securis/src/main/resources/static/images/securis_100.png
Binary files differ
diff --git a/securis/src/main/resources/static/images/securis_40.png b/securis/src/main/resources/static/images/securis_40.png
new file mode 100644
index 0000000..b735a65
--- /dev/null
+++ b/securis/src/main/resources/static/images/securis_40.png
Binary files differ
diff --git a/securis/src/main/resources/static/js/login.js b/securis/src/main/resources/static/js/login.js
new file mode 100644
index 0000000..1d0f307
--- /dev/null
+++ b/securis/src/main/resources/static/js/login.js
@@ -0,0 +1,46 @@
+(function() {
+ 'use strict';
+
+ var app = angular.module('app', ['ngRoute']);
+
+ app.controller('LoginCtrl', ['$scope', '$http', '$window',
+ function($scope, $http, $window) {
+
+ $scope.$loginerror = false;
+ $('#loginError').removeClass('hide');
+
+ $scope.hideAlert = function() {
+ $scope.$loginerror = false;
+ $('#user').focus();
+ }
+ $scope.submit = function() {
+ console.log('Sending user: ' + $scope.username + ' pass: ' + $scope.password);
+ $scope.hideAlert();
+ $http({ method: 'POST',
+ url: '/user/login',
+ headers: {
+ "Content-Type": "application/x-www-form-urlencoded"
+ },
+ data: $.param({
+ username: $scope.username,
+ password: $scope.password
+ })
+ }).
+ success(function(data, status, headers, config) {
+ $window.location.href = "/main.html";
+ }).
+ error(function(data, status, headers, config) {
+ console.error(data + " status: "+ status);
+ $scope.$loginerror = true;
+ if (status === 403 /* forbidden */) {
+ $scope.$errormsg = 'Invalid credentials'
+ } else {
+ $scope.$errormsg = 'Unexpected error HTTP ' + status + ' accessing to server. Contact with the administrator.'
+ }
+ $('#user').focus();
+ });
+ return false;
+ }
+ }]);
+
+})();
\ No newline at end of file
diff --git a/securis/src/main/resources/static/js/main.js b/securis/src/main/resources/static/js/main.js
new file mode 100644
index 0000000..ab5f5ab
--- /dev/null
+++ b/securis/src/main/resources/static/js/main.js
@@ -0,0 +1,4 @@
+(function() {
+
+
+})();
\ No newline at end of file
diff --git a/securis/src/main/resources/static/login.html b/securis/src/main/resources/static/login.html
index 094ac7d..5570b9e 100644
--- a/securis/src/main/resources/static/login.html
+++ b/securis/src/main/resources/static/login.html
@@ -1,108 +1,117 @@
<!DOCTYPE html>
-<html class="no-js" lang="en">
- <head>
- <base href="/base">
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
- <title></title>
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width">
+<html class="no-js" lang="en" ng-app="app" xmlns:ng="http://angularjs.org">
+<head>
+<meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<title></title>
+<meta name="description" content="">
+<meta name="viewport" content="width=device-width">
- <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
- <style>
- body {
- padding-top: 50px;
- padding-bottom: 20px;
- }
- </style>
- <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.3/css/bootstrap-theme.min.css">
- <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css">
- <link rel="stylesheet" href="css/main.css">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
+<link rel="stylesheet"
+ href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
+<style>
+body {
+ padding-top: 50px;
+ padding-bottom: 20px;
+}
+</style>
+<link rel="stylesheet"
+ href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.3/css/bootstrap-theme.min.css">
+<link rel="stylesheet"
+ href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css">
+<!-- <link rel="stylesheet" href="css/main.css"> -->
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<!-- <link href="assets/css/bootstrap-responsive.css" rel="stylesheet"> -->
- <script src="js/vendor/modernizr-2.6.2.min.js"></script>
- </head>
- <body>
- <div class="navbar navbar-inverse navbar-fixed-top">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- <a class="navbar-brand" href="#">SeCuris</a>
- </div>
- <div class="navbar-collapse collapse">
- <ul class="nav navbar-nav">
- <li><a href="#about">About</a></li>
- <li><a href="#contact">Contact</a></li>
- </ul>
- <form class="navbar-form navbar-right">
- <div class="form-group">
- <input type="text" placeholder="Email" class="form-control">
- </div>
- <div class="form-group">
- <input type="password" placeholder="Password" class="form-control">
- </div>
- <button type="submit" class="btn btn-success">Sign in</button>
- </form>
- </div><!--/.navbar-collapse -->
- </div>
- </div>
-
- <!-- Main jumbotron for a primary marketing message or call to action -->
- <div class="jumbotron">
- <div class="container">
- <h2>SeCuris</h2>
- <p>Server License for CurisTEC products.</p>
- </div>
- </div>
-
-<div class="container">
-<div class="col-md-8 col-md-offset-2">
- <form role="form" class="form-horizontal" action='/login' method="POST">
- <fieldset>
- <div id="legend">
- <legend class="">Login</legend>
- </div>
- <div class="form-group">
- <!-- Username -->
- <label class="col-sm-3 control-label" for="username">Username</label>
- <div class="col-sm-5">
- <input type="text" id="user" name="user" placeholder="" class="form-control">
- </div>
- </div>
- <div class="form-group">
- <!-- Password-->
- <label class="col-sm-3 control-label" for="password">Password</label>
- <div class="col-sm-5">
- <input type="password" id="password" name="password" placeholder="" class="form-control">
- </div>
- </div>
- <div class="checkbox">
- <label>
- <input type="checkbox"> Remember credentials
- </label>
- </div>
- <button type="submit" class="btn btn-primary">Login</button>
- </fieldset>
- </form>
+<!-- <script src="js/vendor/modernizr-2.6.2.min.js"></script> -->
+</head>
+<body>
+ <div class="navbar navbar-inverse navbar-fixed-top">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse"
+ data-target=".navbar-collapse">
+ <span class="icon-bar"></span> <span class="icon-bar"></span> <span
+ class="icon-bar"></span>
+ </button>
+ <a class="navbar-brand" href="#">SeCuris</a>
</div>
-</div>
+ <div class="navbar-collapse collapse">
+ <ul class="nav navbar-nav navbar-right">
+ <li><a href="#about">About</a></li>
+ <li><a href="#contact">Contact</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+ <!-- Main jumbotron for a primary marketing message or call to action -->
+ <div class="jumbotron">
+ <div class="container">
+ <h2>SeCuris</h2>
+ <p>Server License for CurisTEC products.</p>
+ </div>
+ </div>
+
+ <div class="container">
+ <div class="col-md-8 col-md-offset-2">
+ <form role="form" class="form-horizontal" ng-controller="LoginCtrl"
+ ng-submit="submit()" name="loginForm">
+ <p class="lead">Sign in application</p>
+ <fieldset>
+ <div class="form-group">
+ <label class="col-md-3 control-label" for="username">Username</label>
+ <div class="col-md-5">
+ <input type="text" id="username" name="username" placeholder=""
+ class="form-control" ng-model="username" required>
+ </div>
+ </div>
+ <div class="form-group">
+ <!-- Password-->
+ <label class="col-md-3 control-label" for="password">Password</label>
+ <div class="col-md-5">
+ <input type="password" id="password" name="password"
+ placeholder="" class="form-control" ng-model="password" required>
+ </div>
+ </div>
+ <div ng-show="$loginerror" class="alert alert-danger col-md-8 hide" id="loginError">
+ <button type="button" class="close" aria-hidden="true" ng-click="hideAlert()">×</button>
+ <span>{{$errormsg}}</span>
+ </div>
+ </fieldset>
+ <button type="submit" class="btn btn-primary">Login</button>
+ </form>
+ </div>
+ </div>
- <hr>
-<div>
- <footer>
- <small style="margin: auto; display:block;" class="text-center">© CurisTEC 2014</small>
- </footer>
- </div> <!-- /container -->
- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
-
- <script type="text/javascript" src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
+ <hr>
+ <div>
+ <footer>
+ <small style="margin: auto; display: block;" class="text-center">©
+ CurisTEC 2014</small>
+ </footer>
+ </div>
+ <!-- /container -->
+ <script
+ src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
-<!-- <script src="js/main.js"></script> -->
- </body>
+ <script type="text/javascript"
+ src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
+ <script type="text/javascript"
+ src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js"></script>
+ <script type="text/javascript"
+ src="//code.angularjs.org/1.2.6/angular-route.js"></script>
+ <script type="text/javascript"
+ src="//code.angularjs.org/1.2.6/angular-resource.js"></script>
+ <script type="text/javascript" src="js/login.js"></script>
+
+ <!-- <script src="js/main.js"></script> -->
+ <script type="text/javascript">
+ $(function() {
+ $('#user').focus();
+ });
+
+ </script>
+</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
index b02ea24..645690a 100644
--- a/securis/src/main/resources/static/main.html
+++ b/securis/src/main/resources/static/main.html
@@ -1,5 +1,142 @@
-<html>
- <body>
- <h1>Main page</h1>
- </body>
+<!DOCTYPE html>
+<html class="no-js" lang="en" ng-app="app" xmlns:ng="http://angularjs.org">
+<head>
+<meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<title></title>
+<meta name="description" content="">
+<meta name="viewport" content="width=device-width">
+
+<link rel="stylesheet"
+ href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
+<style>
+body {
+ padding-top: 50px;
+ padding-bottom: 20px;
+}
+</style>
+<link rel="stylesheet"
+ href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.3/css/bootstrap-theme.min.css">
+<link rel="stylesheet"
+ href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css">
+<!-- <link rel="stylesheet" href="css/main.css"> -->
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<!-- <link href="assets/css/bootstrap-responsive.css" rel="stylesheet"> -->
+
+<!-- <script src="js/vendor/modernizr-2.6.2.min.js"></script> -->
+</head>
+<body>
+ <div class="navbar navbar-inverse navbar-fixed-top">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse"
+ data-target=".navbar-collapse">
+ <span class="icon-bar"></span> <span class="icon-bar"></span> <span
+ class="icon-bar"></span>
+ </button>
+ <ul class="nav navbar-nav navbar-left">
+ <li>SeCuris<li>
+ <li><a href="#licenses">Licenses</a></li>
+ <li><a href="#admin">Admin</a></li>
+ </ul>
+ </div>
+ <div class="navbar-collapse collapse">
+ <ul class="nav navbar-nav navbar-right">
+ <li><a href="#about">About</a></li>
+ <li><a href="#contact">Contact</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+ <!-- Main jumbotron for a primary marketing message or call to action -->
+ <div class="container">
+ <div class="col-md-4">
+ <div class="panel panel-default">
+ <div class="panel-heading">Packs</div>
+
+ <table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th>Org.</th>
+ <th>Pack</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr><td>BP UK</td><td>BP-CICS-001</td></tr>
+ <tr><td>BP UK</td><td>BP-CISA-001</td></tr>
+ <tr><td>BP Texas</td><td>BP-CICS-002</td></tr>
+ <tr><td>BP Texas</td><td>BP-CISA-002</td></tr>
+ </tbody>
+ <tfoot>
+ </tfoot>
+ </table>
+ </div>
+ </div>
+ <div class="col-md-8">
+ <div class="panel panel-default">
+ <div class="panel-heading">Licenses</div>
+
+ <table class="table table-hover">
+ <thead>
+ <tr>
+ <th>License</th>
+ <th>Email</th>
+ <th>Status</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user1@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
+ <tr><td>BP-CICS-0029HAHAHA UK</td><td>user2@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user3@bp.com</td><td class="danger"><span class="glyphicon glyphicon-warning-sign"></span></td></tr>
+ <tr><td>BP-CICS-0128HAHAHA UK</td><td>user4@bp.com</td><td class="danger"><span class="glyphicon glyphicon-warning-sign"></span></td></tr>
+ <tr><td>BP-CICS-00qqasddHA UK</td><td>user5@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
+ <tr><td>BP-CICS-0028HAaaHA UK</td><td>user6@bp.com</td><td class="warning"><span class="glyphicon glyphicon-question-sign"></span></td></tr>
+ <tr><td>BP-CICS-0028aaaaHA UK</td><td>user7@bp.com</td><td class="warning"><span class="glyphicon glyphicon-question-sign"></span></td></tr>
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user8@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user9@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user0@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user11@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user12@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user13@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user14@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user15@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user16@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td></tr>
+ </tbody>
+ <tfoot>
+ </tfoot>
+ </table>
+ </div>
+ </div>
+ </div>
+
+ <hr>
+ <div>
+ <footer>
+ <small style="margin: auto; display: block;" class="text-center">©
+ CurisTEC 2014</small>
+ </footer>
+ </div>
+ <!-- /container -->
+ <script
+ src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
+
+ <script type="text/javascript"
+ src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
+ <script type="text/javascript"
+ src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js"></script>
+ <script type="text/javascript"
+ src="//code.angularjs.org/1.2.6/angular-route.js"></script>
+ <script type="text/javascript"
+ src="//code.angularjs.org/1.2.6/angular-resource.js"></script>
+ <script type="text/javascript" src="js/login.js"></script>
+
+ <!-- <script src="js/main.js"></script> -->
+ <script type="text/javascript">
+ $(function() {
+
+ });
+
+ </script>
+</body>
</html>
\ No newline at end of file
--
Gitblit v1.3.2