| @@ -1,12 +1,13 @@ | ||
| Manifest-Version: 1.0 | ||
| Class-Path: mysql-connector-java-5.1.6.jar jersey-container-servlet-co | ||
| re-2.12.jar javax.inject-2.3.0-b10.jar jersey-common-2.12.jar javax.w | ||
| s.rs-api-2.0.1.jar javax.annotation-api-1.2.jar jersey-guava-2.12.jar | ||
| hk2-api-2.3.0-b10.jar hk2-utils-2.3.0-b10.jar aopalliance-repackaged | ||
| -2.3.0-b10.jar hk2-locator-2.3.0-b10.jar javassist-3.18.1-GA.jar osgi | ||
| -resource-locator-1.0.1.jar jersey-server-2.12.jar jersey-client-2.12 | ||
| .jar validation-api-1.1.0.Final.jar jersey-media-moxy-2.12.jar jersey | ||
| -entity-filtering-2.12.jar org.eclipse.persistence.moxy-2.5.0.jar org | ||
| .eclipse.persistence.core-2.5.0.jar org.eclipse.persistence.asm-2.5.0 | ||
| .jar org.eclipse.persistence.antlr-2.5.0.jar junit-4.11.jar hamcrest- | ||
| core-1.3.jar gson-2.3.jar | ||
|
|
| @@ -1,12 +1,13 @@ | ||
| Manifest-Version: 1.0 | ||
| Class-Path: mysql-connector-java-5.1.6.jar jersey-container-servlet-co | ||
| re-2.12.jar javax.inject-2.3.0-b10.jar jersey-common-2.12.jar javax.w | ||
| s.rs-api-2.0.1.jar javax.annotation-api-1.2.jar jersey-guava-2.12.jar | ||
| hk2-api-2.3.0-b10.jar hk2-utils-2.3.0-b10.jar aopalliance-repackaged | ||
| -2.3.0-b10.jar hk2-locator-2.3.0-b10.jar javassist-3.18.1-GA.jar osgi | ||
| -resource-locator-1.0.1.jar jersey-server-2.12.jar jersey-client-2.12 | ||
| .jar validation-api-1.1.0.Final.jar jersey-media-moxy-2.12.jar jersey | ||
| -entity-filtering-2.12.jar org.eclipse.persistence.moxy-2.5.0.jar org | ||
| .eclipse.persistence.core-2.5.0.jar org.eclipse.persistence.asm-2.5.0 | ||
| .jar org.eclipse.persistence.antlr-2.5.0.jar junit-4.11.jar hamcrest- | ||
| core-1.3.jar gson-2.3.jar | ||
|
|
| @@ -0,0 +1,87 @@ | ||
| html, body, .content { | ||
| margin: 0; | ||
| padding: 0; | ||
| height: 100%; | ||
| position: relative; | ||
| } | ||
|
|
||
| html, body { | ||
| background-color: #ddd; | ||
| } | ||
|
|
||
| .content { | ||
| width: 90%; | ||
| max-width: 900px; | ||
| margin: 0 auto; | ||
| position: relative; | ||
| } | ||
| .content .login { | ||
| max-width: 400px; | ||
| margin: 0 auto; | ||
| position: relative; | ||
| top: 40%; | ||
| transform: translateY(-60%); | ||
| } | ||
|
|
||
|
|
||
| .content .login .login-fail-message { | ||
| display: none; | ||
| } | ||
|
|
||
| .content .quotes { | ||
| width: 100%; | ||
| } | ||
|
|
||
| .content .quotes #quotes-list { | ||
| width: 100%; | ||
| max-width: 600px; | ||
| display: block; | ||
| margin: 0 auto; | ||
| padding: 0; | ||
| position: relative; | ||
|
|
||
| } | ||
|
|
||
| .quote-creator { | ||
| width: 100%; | ||
| max-width: 600px; | ||
| display: block; | ||
| margin: 0 auto; | ||
| position: relative; | ||
| } | ||
|
|
||
| .card-header { | ||
| font-size: 1.2em; | ||
| font-weight: bold; | ||
| color: #6d6d6d; | ||
|
|
||
| } | ||
|
|
||
| .login { | ||
| /* display: none;*/ | ||
| } | ||
| .quotes { | ||
| display: none; | ||
| } | ||
|
|
||
| .content .quotes #quotes-list .quote-text { | ||
| font-style: italic; | ||
| } | ||
|
|
||
| .content .quotes #quotes-list .quote-created-by { | ||
| color: cornflowerblue; | ||
| } | ||
| .content .quotes #quotes-list { | ||
| } | ||
| .content .quotes #quotes-list { | ||
| } | ||
| .card { | ||
| list-style: none; | ||
| background: white; | ||
| display: inline-block; | ||
| margin: 10px auto; | ||
| width: 100%; | ||
| padding: 30px; | ||
| box-shadow: 0 5px 5px 0px rgba(0, 0, 0, 0.2); | ||
|
|
||
| } |
| @@ -0,0 +1,86 @@ | ||
| <!DOCTYPE html> | ||
| <html> | ||
|
|
||
| <head> | ||
| <link rel="stylesheet" href="/web_secure/public/libs/bootstrap/css/bootstrap.min.css"> | ||
| <link rel="stylesheet" href="/web_secure/public/css/main.css"> | ||
| <script src="/libs/jquery/jquery-1.11.2.min.js"></script> | ||
| <script src="/libs/bootstrap/css/bootstrap.min.css"></script> | ||
| <script src="/js/setup.js"></script> | ||
| <script src="/services.js"></script> | ||
| <script src="/js/view.js"></script> | ||
| <!-- <script src="/web_secure/public/js/all.min.js"></script>--> | ||
|
|
||
| </head> | ||
|
|
||
| <body> | ||
| <div class="content"> | ||
|
|
||
| <div class="login panel panel-default"> | ||
| <div class="panel-heading"> | ||
| <h3 class="panel-title">Login</h3> | ||
| </div> | ||
| <div class="panel-body"> | ||
|
|
||
|
|
||
| <!-- | ||
| <div class="alert alert-danger" role="alert"> | ||
| <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> | ||
| <span class="sr-only">Error:</span> Authentication failed, please login. | ||
| </div> | ||
| --> | ||
| <div class="alert alert-danger login-fail-message" role="alert"> | ||
| <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> | ||
| <span class="sr-only">Error:</span> Login failed, check username and password | ||
| </div> | ||
|
|
||
|
|
||
|
|
||
| <form id="login-form"> | ||
| <div class="form-group"> | ||
| <input type="text" pattern=".{3,}" placeholder="Username" required="required" class="form-control" id="usr" name="username"> | ||
| </div> | ||
| <div class="form-group"> | ||
| <input type="password" pattern=".{8,}" placeholder="Password" required="required" class="form-control" id="psw" name="password"> | ||
| </div> | ||
| <div class="checkbox"> | ||
| <label> | ||
| <input id="new" name="new" type="checkbox" value="">Create new account</label> | ||
| </div> | ||
| <div class="form-group"> | ||
| <button class="btn btn-primary pull-right" type="submit">Login</button> | ||
| </div> | ||
| </form> | ||
| </div> | ||
| </div> | ||
|
|
||
| <div class="quotes"> | ||
| <div class="quote-creator"> | ||
| <div class="card"> | ||
| <p class="card-header">Add new quote</p> | ||
| <form id="quote-form"> | ||
| <div class="form-group"> | ||
| <input type="text" pattern=".{2,}" placeholder="Quote" required="required" class="form-control" id="usr" name="username"> | ||
| </div> | ||
| <div class="row"> | ||
| <div class="form-group col-xs-8"> | ||
| <input type="text" pattern=".{1,}" placeholder="Author" required="required" class="form-control" id="usr" name="username"> | ||
| </div> | ||
| <div class="form-group col-xs-4"> | ||
| <input type="number" pattern=".{2}|.{4}" placeholder="Year" required="required" class="form-control" id="usr" name="username"> | ||
| </div> | ||
| </div> | ||
| <div class="form-group"> | ||
| <button class="btn btn-primary pull-right" type="submit">Add</button> | ||
| </div> | ||
| </form> | ||
| </div> | ||
| </div> | ||
| <ul id="quotes-list"> | ||
|
|
||
| </ul> | ||
| </div> | ||
| </div> | ||
| </body> | ||
|
|
||
| </html> |
| @@ -0,0 +1,169 @@ | ||
| (function () { | ||
| var CrazyQuotes = { | ||
| services: {}, | ||
| view: {} | ||
| } | ||
| CrazyQuotes.services = (function () { | ||
|
|
||
| var HEADER_TOKEN_NAME = 'X-Auth-Token'; | ||
| var HEADER_USERNAME_NAME = 'X-Username'; | ||
| var token, username; | ||
|
|
||
| var requestSuccess = function (data, textStatus, requst) { | ||
| token = request.getResponseHeader(HEADER_TOKEN_NAME); | ||
| } | ||
|
|
||
| var requestFail = function (request, textStatus, errorThrown) { | ||
| token = undefined; | ||
| username = undefined; | ||
| } | ||
|
|
||
| var request = function (options) { | ||
| return $.ajax(options).done(requestSuccess).fail(requestFail); | ||
| } | ||
|
|
||
| return { | ||
| createAccount: function (data) { | ||
| return request({ | ||
| url: '/user', | ||
| type: 'post', | ||
| data: { | ||
| username: data.username, | ||
| password: data.password | ||
| }, | ||
| dataType: 'json', | ||
| contentType: 'application/json' | ||
| }).done(function () { | ||
| username = data.username; | ||
| }); | ||
| }, | ||
| login: function (data) { | ||
| return request({ | ||
| url: '/login', | ||
| type: 'post', | ||
| data: { | ||
| username: data.username, | ||
| password: data.password | ||
| }, | ||
| dataType: 'json', | ||
| contentType: 'application/json' | ||
| }).done(function () { | ||
| username = data.username; | ||
| }); | ||
| }, | ||
| addQuote: function (quote) { | ||
| var headers = {}; | ||
| headers[HEADER_TOKEN_NAME] = token; | ||
| headers[HEADER_USERNAME_NAME] = username; | ||
| return $.ajax({ | ||
| url: '/quotes', | ||
| type: 'post', | ||
| data: quote, | ||
| headers: headers, | ||
| dataType: 'json', | ||
| contentType: 'application/json' | ||
| }); | ||
| }, | ||
| getAllQuotes: function () { | ||
| var headers = {}; | ||
| headers[HEADER_TOKEN_NAME] = token; | ||
| headers[HEADER_USERNAME_NAME] = username; | ||
| return request({ | ||
| url: '/quotes', | ||
| type: 'get', | ||
| headers: headers, | ||
| dataType: 'json' | ||
| }) | ||
| } | ||
| } | ||
| }()); | ||
| CrazyQuotes.view = (function () { | ||
|
|
||
| var showLogin = function () { | ||
| $('.quotes').hide(); | ||
| $('#quotes-list').empty(); | ||
| $('.login').show(); | ||
| } | ||
|
|
||
| var showQuotes = function () { | ||
| $('.login').hide(); | ||
| $('#psw').val(''); | ||
| $('.quotes').fadeIn(); | ||
| } | ||
|
|
||
| var showLoginError = function () { | ||
| $('#login-form').addClass('login-fail'); | ||
| $('.login-fail-message').show(); | ||
| $('#psw').val(''); | ||
| } | ||
|
|
||
| var buildQuotes = function (data) { | ||
| $('#quotes-list').empty(); | ||
| var quote, author, year, createdBy, i, li, currentData; | ||
| var span = $('<span>'); | ||
| for (i = 0; i < data.length; i = i + 1) { | ||
| currentData = data[i]; | ||
| quote = span.text(currentData.quote)[0].innerHTML; | ||
| author = span.text(currentData.author)[0].innerHTML; | ||
| year = span.text(currentData.year)[0].innerHTML; | ||
| createdBy = span.text(currentData.createdBy)[0].innerHTML; | ||
|
|
||
| li = $('<li class="card"><span class="quote-text card-header">"' + quote + '"</span> <br> <span class="quote-author pull-right">- ' + author + ', ' + year + '</span><br><span class="quote-created-by pull-right">' + createdBy + '</span></li>'); | ||
| $('#quotes-list').append(li); | ||
| } | ||
| showQuotes(); | ||
| } | ||
|
|
||
| var loadQuotes = function () { | ||
| CrazyQuotes.services.getAllQuotes().done(function (data) { | ||
| buildQuotes(data); | ||
| }).fail(function () { | ||
| showLogin(); | ||
| }); | ||
| } | ||
|
|
||
| var getFormAsObject = function (valuesArray) { | ||
| var valuesArray = $(this).serializeArray(); | ||
| var object = {}; | ||
| var i; | ||
| for (i = 0; i < valuesArray.length; i = i + 1) { | ||
| object[valuesArray[i].name] = valuesArray[i].value; | ||
| } | ||
| return object; | ||
| } | ||
|
|
||
| var login = function (event) { | ||
| event.preventDefault(); | ||
| var object = getFormAsObject($(this).serializeArray()); | ||
| if ($('#new', this).checked) { | ||
| CrazyQuotes.services.createAccount(object).done(function () { | ||
| $('.login-fail-message').hide(); | ||
| loadQuotes(); | ||
| }).fail(function () { | ||
| showLoginError(); | ||
| }); | ||
| } else { | ||
| CrazyQuotes.services.login(object).done(function () { | ||
| $('.login-fail-message').hide(); | ||
| loadQuotes(); | ||
| }).fail(function () { | ||
| showLoginError(); | ||
| }); | ||
| } | ||
| } | ||
|
|
||
| var addQuote = function (event) { | ||
| event.preventDefault(); | ||
| var object = getFormAsObject($(this).serializeArray()); | ||
| CrazyQuotes.services.addQuote(object).done(function () { | ||
| loadQuotes(); | ||
| }).fail(function () { | ||
| showLogin(); | ||
| }); | ||
| } | ||
|
|
||
| $(function () { | ||
| $('#login-form').submit(login); | ||
| $('#quote-form').submit(addQuote); | ||
| }); | ||
| }());}()); |
| @@ -0,0 +1,74 @@ | ||
| CrazyQuotes.services = (function () { | ||
|
|
||
| var HEADER_TOKEN_NAME = 'X-Auth-Token'; | ||
| var HEADER_USERNAME_NAME = 'X-Username'; | ||
| var token, username; | ||
|
|
||
| var requestSuccess = function (data, textStatus, requst) { | ||
| token = request.getResponseHeader(HEADER_TOKEN_NAME); | ||
| } | ||
|
|
||
| var requestFail = function (request, textStatus, errorThrown) { | ||
| token = undefined; | ||
| username = undefined; | ||
| } | ||
|
|
||
| var request = function (options) { | ||
| return $.ajax(options).done(requestSuccess).fail(requestFail); | ||
| } | ||
|
|
||
| return { | ||
| createAccount: function (data) { | ||
| return request({ | ||
| url: '/user', | ||
| type: 'post', | ||
| data: { | ||
| username: data.username, | ||
| password: data.password | ||
| }, | ||
| dataType: 'json', | ||
| contentType: 'application/json' | ||
| }).done(function () { | ||
| username = data.username; | ||
| }); | ||
| }, | ||
| login: function (data) { | ||
| return request({ | ||
| url: '/login', | ||
| type: 'post', | ||
| data: { | ||
| username: data.username, | ||
| password: data.password | ||
| }, | ||
| dataType: 'json', | ||
| contentType: 'application/json' | ||
| }).done(function () { | ||
| username = data.username; | ||
| }); | ||
| }, | ||
| addQuote: function (quote) { | ||
| var headers = {}; | ||
| headers[HEADER_TOKEN_NAME] = token; | ||
| headers[HEADER_USERNAME_NAME] = username; | ||
| return $.ajax({ | ||
| url: '/quotes', | ||
| type: 'post', | ||
| data: quote, | ||
| headers: headers, | ||
| dataType: 'json', | ||
| contentType: 'application/json' | ||
| }); | ||
| }, | ||
| getAllQuotes: function () { | ||
| var headers = {}; | ||
| headers[HEADER_TOKEN_NAME] = token; | ||
| headers[HEADER_USERNAME_NAME] = username; | ||
| return request({ | ||
| url: '/quotes', | ||
| type: 'get', | ||
| headers: headers, | ||
| dataType: 'json' | ||
| }) | ||
| } | ||
| } | ||
| }()); |
| @@ -0,0 +1,4 @@ | ||
| var CrazyQuotes = { | ||
| services: {}, | ||
| view: {} | ||
| } |
| @@ -0,0 +1,90 @@ | ||
| CrazyQuotes.view = (function () { | ||
|
|
||
| var showLogin = function () { | ||
| $('.quotes').hide(); | ||
| $('#quotes-list').empty(); | ||
| $('.login').show(); | ||
| } | ||
|
|
||
| var showQuotes = function () { | ||
| $('.login').hide(); | ||
| $('#psw').val(''); | ||
| $('.quotes').fadeIn(); | ||
| } | ||
|
|
||
| var showLoginError = function () { | ||
| $('#login-form').addClass('login-fail'); | ||
| $('.login-fail-message').show(); | ||
| $('#psw').val(''); | ||
| } | ||
|
|
||
| var buildQuotes = function (data) { | ||
| $('#quotes-list').empty(); | ||
| var quote, author, year, createdBy, i, li, currentData; | ||
| var span = $('<span>'); | ||
| for (i = 0; i < data.length; i = i + 1) { | ||
| currentData = data[i]; | ||
| quote = span.text(currentData.quote)[0].innerHTML; | ||
| author = span.text(currentData.author)[0].innerHTML; | ||
| year = span.text(currentData.year)[0].innerHTML; | ||
| createdBy = span.text(currentData.createdBy)[0].innerHTML; | ||
|
|
||
| li = $('<li class="card"><span class="quote-text card-header">"' + quote + '"</span> <br> <span class="quote-author pull-right">- ' + author + ', ' + year + '</span><br><span class="quote-created-by pull-right">' + createdBy + '</span></li>'); | ||
| $('#quotes-list').append(li); | ||
| } | ||
| showQuotes(); | ||
| } | ||
|
|
||
| var loadQuotes = function () { | ||
| CrazyQuotes.services.getAllQuotes().done(function (data) { | ||
| buildQuotes(data); | ||
| }).fail(function () { | ||
| showLogin(); | ||
| }); | ||
| } | ||
|
|
||
| var getFormAsObject = function (valuesArray) { | ||
| var valuesArray = $(this).serializeArray(); | ||
| var object = {}; | ||
| var i; | ||
| for (i = 0; i < valuesArray.length; i = i + 1) { | ||
| object[valuesArray[i].name] = valuesArray[i].value; | ||
| } | ||
| return object; | ||
| } | ||
|
|
||
| var login = function (event) { | ||
| event.preventDefault(); | ||
| var object = getFormAsObject($(this).serializeArray()); | ||
| if ($('#new', this).checked) { | ||
| CrazyQuotes.services.createAccount(object).done(function () { | ||
| $('.login-fail-message').hide(); | ||
| loadQuotes(); | ||
| }).fail(function () { | ||
| showLoginError(); | ||
| }); | ||
| } else { | ||
| CrazyQuotes.services.login(object).done(function () { | ||
| $('.login-fail-message').hide(); | ||
| loadQuotes(); | ||
| }).fail(function () { | ||
| showLoginError(); | ||
| }); | ||
| } | ||
| } | ||
|
|
||
| var addQuote = function (event) { | ||
| event.preventDefault(); | ||
| var object = getFormAsObject($(this).serializeArray()); | ||
| CrazyQuotes.services.addQuote(object).done(function () { | ||
| loadQuotes(); | ||
| }).fail(function () { | ||
| showLogin(); | ||
| }); | ||
| } | ||
|
|
||
| $(function () { | ||
| $('#login-form').submit(login); | ||
| $('#quote-form').submit(addQuote); | ||
| }); | ||
| }()); |
| @@ -1,5 +1,5 @@ | ||
| Manifest-Version: 1.0 | ||
| Built-By: andreaberglund | ||
| Build-Jdk: 1.8.0_31 | ||
| Created-By: Maven Integration for Eclipse | ||
|
|
| @@ -1,7 +1,7 @@ | ||
| #Generated by Maven Integration for Eclipse | ||
| #Thu Apr 16 17:40:59 CEST 2015 | ||
| version=1.0-SNAPSHOT | ||
| groupId=se.awesome | ||
| m2e.projectName=awesome-crazy-quotes | ||
| m2e.projectLocation=/Users/andreaberglund/Documents/Development/C3L-securitylab/CrazyQuotes | ||
| artifactId=awesome-crazy-quotes |