@@ -1,12 +1,13 @@
Manifest-Version: 1.0
Class-Path: jersey-container-servlet-core-2.12.jar javax.inject-2.3.0-
b10.jar jersey-common-2.12.jar javax.ws.rs-api-2.0.1.jar javax.annota
tion-api-1.2.jar jersey-guava-2.12.jar hk2-api-2.3.0-b10.jar hk2-util
s-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 jer
sey-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.an
tlr-2.5.0.jar junit-4.11.jar hamcrest-core-1.3.jar gson-2.3.jar
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: jersey-container-servlet-core-2.12.jar javax.inject-2.3.0-
b10.jar jersey-common-2.12.jar javax.ws.rs-api-2.0.1.jar javax.annota
tion-api-1.2.jar jersey-guava-2.12.jar hk2-api-2.3.0-b10.jar hk2-util
s-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 jer
sey-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.an
tlr-2.5.0.jar junit-4.11.jar hamcrest-core-1.3.jar gson-2.3.jar
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);
});
}());

Large diffs are not rendered by default.

Binary file not shown.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Large diffs are not rendered by default.

@@ -23,4 +23,7 @@
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
@@ -1,5 +1,5 @@
Manifest-Version: 1.0
Build-Jdk: 1.7.0_45
Built-By: isabellarodriguez
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
#Wed Apr 15 18:02:50 CEST 2015
#Thu Apr 16 17:40:59 CEST 2015
version=1.0-SNAPSHOT
groupId=se.awesome
m2e.projectName=awesome-crazy-quotes
m2e.projectLocation=/Users/isabellarodriguez/Dropbox/secure/crazy-quotes
m2e.projectLocation=/Users/andreaberglund/Documents/Development/C3L-securitylab/CrazyQuotes
artifactId=awesome-crazy-quotes