Roberto Sánchez
2013-12-26 6e28963da25edf94a84468423f74acc381699542
#333 feature - Added token helper
1 files added
3 files modified
changed files
securis/src/main/java/net/curisit/securis/utils/TokenHelper.java 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/utils/TokenHelper.java
....@@ -0,0 +1,91 @@
1
+package net.curisit.securis.utils;
2
+
3
+import java.io.IOException;
4
+import java.io.UnsupportedEncodingException;
5
+import java.math.BigInteger;
6
+import java.security.MessageDigest;
7
+import java.security.NoSuchAlgorithmException;
8
+import java.util.Date;
9
+
10
+import javax.inject.Inject;
11
+import javax.inject.Singleton;
12
+
13
+import net.curisit.integrity.commons.Utils;
14
+
15
+import org.apache.commons.lang3.StringUtils;
16
+import org.jboss.resteasy.util.Base64;
17
+import org.slf4j.Logger;
18
+import org.slf4j.LoggerFactory;
19
+
20
+@Singleton
21
+public class TokenHelper {
22
+
23
+ private static final Logger log = LoggerFactory.getLogger(TokenHelper.class);
24
+
25
+ private static int VALID_TOKEN_PERIOD = 24;
26
+
27
+ @Inject
28
+ public TokenHelper() {
29
+ }
30
+
31
+ private static byte[] seed = "S3Cur15S33dForT0k3nG3n3r@tion".getBytes();
32
+
33
+ public String generateToken(String user) {
34
+ try {
35
+ Date date = new Date();
36
+ String secret = generateSecret(user, date);
37
+ StringBuffer sb = new StringBuffer();
38
+ sb.append(secret);
39
+ sb.append(' ');
40
+ sb.append(user);
41
+ sb.append(' ');
42
+ sb.append(Utils.toIsoFormat(date));
43
+ return Base64.encodeBytes(sb.toString().getBytes("utf-8"));
44
+ } catch (NoSuchAlgorithmException e) {
45
+ log.error("Error generating SHA-256 hash", e);
46
+ } catch (UnsupportedEncodingException e) {
47
+ log.error("Error generating SHA-256 hash", e);
48
+ }
49
+ return null;
50
+
51
+ }
52
+
53
+ public String generateSecret(String user, Date date) throws UnsupportedEncodingException, NoSuchAlgorithmException {
54
+ MessageDigest mDigest = MessageDigest.getInstance("SHA-256");
55
+ mDigest.update(seed, 0, seed.length);
56
+ byte[] userbytes = user.getBytes("utf-8");
57
+ mDigest.update(userbytes, 0, userbytes.length);
58
+ byte[] isodate = Utils.toIsoFormat(date).getBytes();
59
+ mDigest.update(isodate, 0, isodate.length);
60
+ BigInteger i = new BigInteger(1, mDigest.digest());
61
+ String secret = String.format("%1$064x", i);
62
+ return secret;
63
+ }
64
+
65
+ public boolean validateToken(String token) {
66
+ try {
67
+ String tokenDecoded = new String(Base64.decode(token));
68
+ String[] parts = StringUtils.split(tokenDecoded, ' ');
69
+ String secret = parts[0];
70
+ String user = parts[1];
71
+ Date date = Utils.toDateFromIso(parts[2]);
72
+ if (new Date(new Date().getTime() + 25 * 60 * 60 * 1000).after(new Date(date.getTime() + VALID_TOKEN_PERIOD * 60 * 60 * 1000)))
73
+ return false;
74
+ String newSecret = generateSecret(user, date);
75
+ return newSecret.equals(secret);
76
+ } catch (IOException e) {
77
+ log.error("Error decoding Bse64 token", e);
78
+ } catch (NoSuchAlgorithmException e) {
79
+ log.error("Error generation secret to compare with", e);
80
+ }
81
+ return false;
82
+ }
83
+
84
+ public static void main(String[] args) throws IOException {
85
+ TokenHelper th = new TokenHelper();
86
+ String token = th.generateToken("pepe");
87
+ System.out.println("Token: " + token);
88
+ System.out.println("Token: " + new String(Base64.decode(token)));
89
+ System.out.println("Valid Token: " + th.validateToken(token));
90
+ }
91
+}
securis/src/main/resources/static/js/main.js
....@@ -1,4 +1,22 @@
11 (function() {
2
+ 'use strict';
3
+
4
+ var app = angular.module('app', ['ngRoute']);
25
6
+ app.controller('PacksCtrl', ['$scope', '$http',
7
+ function($scope, $http) {
8
+
9
+ }]);
10
+
11
+ app.controller('LicensesListCtrl', ['$scope', '$http',
12
+ function($scope, $http) {
13
+
14
+ }]);
15
+
16
+ app.controller('LicenseCtrl', ['$scope', '$http',
17
+ function($scope, $http) {
18
+
19
+ }]);
20
+
321
422 })();
securis/src/main/resources/static/login.html
....@@ -57,7 +57,7 @@
5757 <div class="col-md-8 col-md-offset-2">
5858 <form role="form" class="form-horizontal" ng-controller="LoginCtrl"
5959 ng-submit="submit()" name="loginForm">
60
- <p class="lead">Sign in application</p>
60
+ <p class="lead">Sign in SeCuris</p>
6161 <fieldset>
6262 <div class="form-group">
6363 <label class="col-md-3 control-label" for="username">Username</label>
....@@ -78,8 +78,13 @@
7878 <button type="button" class="close" aria-hidden="true" ng-click="hideAlert()">&times;</button>
7979 <span>{{$errormsg}}</span>
8080 </div>
81
+ <div class="form-group">
82
+ <div class="col-md-offset-3 col-md-10">
83
+ <button type="submit" class="btn btn-primary">Sign in</button>
84
+ </div>
85
+ </div>
8186 </fieldset>
82
- <button type="submit" class="btn btn-primary">Login</button>
87
+
8388 </form>
8489 </div>
8590 </div>
securis/src/main/resources/static/main.html
....@@ -29,13 +29,8 @@
2929 <div class="navbar navbar-inverse navbar-fixed-top">
3030 <div class="container">
3131 <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>
3732 <ul class="nav navbar-nav navbar-left">
38
- <li>SeCuris<li>
33
+ <li style="color:white;padding-top:15px;">SeCuris</li>
3934 <li><a href="#licenses">Licenses</a></li>
4035 <li><a href="#admin">Admin</a></li>
4136 </ul>
....@@ -49,13 +44,16 @@
4944 </div>
5045 </div>
5146
52
- <!-- Main jumbotron for a primary marketing message or call to action -->
5347 <div class="container">
48
+ <div class="col-md-12">
49
+ &nbsp;
50
+ </div>
5451 <div class="col-md-4">
5552 <div class="panel panel-default">
56
- <div class="panel-heading">Packs</div>
53
+ <div class="panel-heading">Packs
54
+ <span class="badge pull-right">4</span></div>
5755
58
- <table class="table table-striped table-hover">
56
+ <table class="table table-hover">
5957 <thead>
6058 <tr>
6159 <th>Org.</th>
....@@ -72,42 +70,73 @@
7270 </tfoot>
7371 </table>
7472 </div>
73
+ <div class="panel panel-default">
74
+ <form role="form" class="form-horizontal " name="licenseForm">
75
+ <div class="form-group">
76
+ <label class="col-md-3 control-label" for="username">Date</label>
77
+ <div class="col-md-5">
78
+ <input type="text" id="username" name="username" placeholder=""
79
+ class="form-control" ng-model="username" required>
80
+ </div>
81
+ </div>
82
+ <div class="form-group">
83
+ <!-- Password-->
84
+ <label class="col-md-3 control-label" for="password">License</label>
85
+ <div class="col-md-5">
86
+ <input type="password" id="password" name="password"
87
+ placeholder="" class="form-control" ng-model="password" required>
88
+ </div>
89
+ </div>
90
+ <div class="form-group">
91
+ <div class="col-md-offset-3 col-md-10">
92
+ <button type="submit" class="btn btn-primary">Save</button>
93
+ </div>
94
+ </div>
95
+ </form>
96
+ </div>
97
+
7598 </div>
7699 <div class="col-md-8">
77100 <div class="panel panel-default">
78
- <div class="panel-heading">Licenses</div>
101
+ <div class="panel-heading">Licenses for pack <strong>BP-CICS-002</strong>
102
+ <span class="badge pull-right" style="color:#ccffcc;">4</span>
103
+ <span class="badge pull-right">15</span>
104
+ </div>
79105
80
- <table class="table table-hover">
106
+ <table class="table table-hover table-condensed">
81107 <thead>
82108 <tr>
83109 <th>License</th>
84110 <th>Email</th>
85111 <th>Status</th>
112
+ <th></th>
86113 </tr>
87114 </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>
115
+ <tbody>
116
+
117
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user1@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td><td><span ng-click="editRow()" class="glyphicon glyphicon-pencil"></span></td></tr>
118
+ <tr><td>BP-CICS-0029HAHAHA UK</td><td>user2@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
119
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user3@bp.com</td><td class="danger"><span class="glyphicon glyphicon-warning-sign"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
120
+ <tr><td>BP-CICS-0128HAHAHA UK</td><td>user4@bp.com</td><td class="danger"><span class="glyphicon glyphicon-warning-sign"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
121
+ <tr><td>BP-CICS-00qqasddHA UK</td><td>user5@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
122
+ <tr><td>BP-CICS-0028HAaaHA UK</td><td>user6@bp.com</td><td class="warning"><span class="glyphicon glyphicon-question-sign"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
123
+ <tr><td>BP-CICS-0028aaaaHA UK</td><td>user7@bp.com</td><td class="warning"><span class="glyphicon glyphicon-question-sign"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
124
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user8@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
125
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user9@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
126
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user0@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
127
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user11@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
128
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user12@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
129
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user13@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
130
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user14@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
131
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user15@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
132
+ <tr><td>BP-CICS-0028HAHAHA UK</td><td>user16@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
105133 </tbody>
106134 <tfoot>
107135 </tfoot>
108136 </table>
109137 </div>
110138 </div>
139
+
111140 </div>
112141
113142 <hr>