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()">&times;</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">&copy; 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">&copy;
+				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">&copy;
+				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