* Added auth

* Added sql rebuild
* Moved dist to be under server
This commit is contained in:
Martin Donnelly 2020-05-26 12:57:11 +01:00
parent bd5bc94894
commit 93137e1ee5
13 changed files with 158 additions and 4 deletions

View File

@ -630,10 +630,20 @@ CREATE TABLE IF NOT EXISTS "applied" (
);
INSERT INTO applied VALUES(1,285,1590414811054);
INSERT INTO applied VALUES(2,311,1590484655666);
DROP TABLE IF EXISTS "accounts";
CREATE TABLE IF NOT EXISTS "accounts" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
"username" TEXT NOT NULL,
"password" TEXT NOT NULL,
"email" TEXT NOT NULL
);
INSERT INTO accounts VALUES(1,'bob','plop','bob@plop.com');
INSERT INTO accounts VALUES(2,'martin','MPReoa43','martind2000@gmail.com');
DELETE FROM sqlite_sequence;
INSERT INTO sqlite_sequence VALUES('jobs',326);
INSERT INTO sqlite_sequence VALUES('read',294);
INSERT INTO sqlite_sequence VALUES('applied',2);
INSERT INTO sqlite_sequence VALUES('accounts',2);
CREATE VIEW jobsList as
select jobs._id, jobs.title, jobs.site, jobs.company, jobs.timestamp, read.d, applied.a from jobs
left join read on read.rid = jobs._id

14
lib/loginmanager.js Normal file
View File

@ -0,0 +1,14 @@
const db = require('../lib/connect');
exports.getOne = (username, password) => {
const sql = 'SELECT * FROM accounts WHERE username = ? and password = ?';
return new Promise((resolve, reject) => {
db.get(sql, [username, password], (err, row) => {
if (err)
reject(err);
if (!err) resolve(row);
});
});
};

View File

@ -3,4 +3,4 @@
.lister.svelte-bblkbk{height:50vh;max-height:50vh;overflow-y:scroll}.dataRow.svelte-bblkbk{font-weight:bold;color:darkslategrey}.read.svelte-bblkbk{font-weight:normal !important;color:dimgrey}.applied.svelte-bblkbk{box-shadow:inset 0 0 5px 5px #f7de2f69}.dataRow.svelte-bblkbk:hover{background-color:rgba(245, 238, 100, 0.54)}
.menu.svelte-s6mfqx{border-right:2px solid #e1e1e1;background-color:#f4f4f4;height:100vh}
/*# sourceMappingURL=bundle.css.map */
/*# sourceMappingURL=bundle.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

38
server/security/auth.js Normal file
View File

@ -0,0 +1,38 @@
/**
* Created by WebStorm.
* User: martin
* Date: 26/05/2020
* Time: 12:24
*/
const db = require('../../lib/loginmanager');
exports.auth = (request, response) => {
const username = request.body.u;
const password = request.body.p;
if (username && password)
db.getOne(username, password)
.then((data) => {
if (!data)
// response.send('Incorrect Username and/or Password!');
response.redirect('/');
else {
request.session.username = username;
request.session.auth = 'jhgkjgkjhgkjhgjkhgjkhgfhghfjgfjhgf';
response.redirect('/');
}
})
.catch((err) => {
console.log(err);
response.status(500).send({
'message': err.message || 'Some error occurred while querying the database.'
});
});
else {
response.send('Please enter Username and Password!');
response.end();
}
};

View File

@ -0,0 +1,81 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv=X-UA-Compatible content="IE=edge">
<meta name=viewport content="width=device-width,initial-scale=1">
<title>Login</title>
<style>
@import url(https://fonts.googleapis.com/css?family=Open+Sans);
.btn { display: inline-block; *display: inline; *zoom: 1; padding: 4px 10px 4px; margin-bottom: 0; font-size: 13px; line-height: 18px; color: #333333; text-align: center;text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); vertical-align: middle; background-color: #f5f5f5; background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); background-image: linear-gradient(top, #ffffff, #e6e6e6); background-repeat: repeat-x; filter: progid:dximagetransform.microsoft.gradient(startColorstr=#ffffff, endColorstr=#e6e6e6, GradientType=0); border-color: #e6e6e6 #e6e6e6 #e6e6e6; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); border: 1px solid #e6e6e6; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); cursor: pointer; *margin-left: .3em; }
.btn:hover, .btn:active, .btn.active, .btn.disabled, .btn[disabled] { background-color: #e6e6e6; }
.btn-large { padding: 9px 14px; font-size: 15px; line-height: normal; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; }
.btn:hover { color: #333333; text-decoration: none; background-color: #e6e6e6; background-position: 0 -15px; -webkit-transition: background-position 0.1s linear; -moz-transition: background-position 0.1s linear; -ms-transition: background-position 0.1s linear; -o-transition: background-position 0.1s linear; transition: background-position 0.1s linear; }
.btn-primary, .btn-primary:hover { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); color: #ffffff; }
.btn-primary.active { color: rgba(255, 255, 255, 0.75); }
.btn-primary { background-color: #4a77d4; background-image: -moz-linear-gradient(top, #6eb6de, #4a77d4); background-image: -ms-linear-gradient(top, #6eb6de, #4a77d4); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6eb6de), to(#4a77d4)); background-image: -webkit-linear-gradient(top, #6eb6de, #4a77d4); background-image: -o-linear-gradient(top, #6eb6de, #4a77d4); background-image: linear-gradient(top, #6eb6de, #4a77d4); background-repeat: repeat-x; filter: progid:dximagetransform.microsoft.gradient(startColorstr=#6eb6de, endColorstr=#4a77d4, GradientType=0); border: 1px solid #3762bc; text-shadow: 1px 1px 1px rgba(0,0,0,0.4); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.5); }
.btn-primary:hover, .btn-primary:active, .btn-primary.active, .btn-primary.disabled, .btn-primary[disabled] { filter: none; background-color: #4a77d4; }
.btn-block { width: 100%; display:block; }
* { -webkit-box-sizing:border-box; -moz-box-sizing:border-box; -ms-box-sizing:border-box; -o-box-sizing:border-box; box-sizing:border-box; }
html { width: 100%; height:100%; overflow:hidden; }
body {
width: 100%;
height:100%;
font-family: 'Open Sans', sans-serif;
background: #092756;
background: -moz-radial-gradient(0% 100%, ellipse cover, #4C4C9D66 10%,rgba(138,114,76,0) 40%), linear-gradient(to bottom, #976391 0%,#712F7966 100%), linear-gradient(135deg, #48639C 0%,#F7996E 100%);
background: -webkit-radial-gradient(0% 100%, ellipse cover, #4C4C9D66 10%,rgba(138,114,76,0) 40%), linear-gradient(to bottom, #976391 0%,#712F7966 100%), linear-gradient(135deg, #48639C 0%,#F7996E 100%);
background: -o-radial-gradient(0% 100%, ellipse cover, #4C4C9D66 10%,rgba(138,114,76,0) 40%), linear-gradient(to bottom, #976391 0%,#712F7966 100%), linear-gradient(135deg, #48639C 0%,#F7996E 100%);
background: -ms-radial-gradient(0% 100%, ellipse cover, #4C4C9D66 10%,rgba(138,114,76,0) 40%), linear-gradient(to bottom, #976391 0%,#712F7966 100%), linear-gradient(135deg, #48639C 0%,#F7996E 100%);
background: -webkit-radial-gradient(0% 100%, ellipse cover, #4C4C9D66 10%,rgba(138,114,76,0) 40%), linear-gradient(to bottom, #976391 0%,#712F7966 100%), linear-gradient(135deg, #48639C 0%,#F7996E 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3E1D6D', endColorstr='#092756',GradientType=1 );
}
.login {
position: absolute;
top: 50%;
left: 50%;
margin: -150px 0 0 -150px;
min-width: 300px;
width:300px;
height:300px;
}
.login h1 { color: #fff; text-shadow: 0 0 10px rgba(0,0,0,0.3); letter-spacing:1px; text-align:center; }
input {
width: 100%;
margin-bottom: 10px;
background: rgba(0,0,0,0.3);
border: none;
outline: none;
padding: 10px;
font-size: 13px;
color: #fff;
text-shadow: 1px 1px 1px rgba(0,0,0,0.3);
border: 1px solid rgba(0,0,0,0.3);
border-radius: 4px;
box-shadow: inset 0 -5px 45px rgba(100,100,100,0.2), 0 1px 1px rgba(255,255,255,0.2);
-webkit-transition: box-shadow .5s ease;
-moz-transition: box-shadow .5s ease;
-o-transition: box-shadow .5s ease;
-ms-transition: box-shadow .5s ease;
transition: box-shadow .5s ease;
}
input:focus { box-shadow: inset 0 -5px 45px rgba(100,100,100,0.4), 0 1px 1px rgba(255,255,255,0.2); }
</style>
</head>
<body>
<div class="login">
<h1>Login</h1>
<form action="auth" method="post">
<input type="text" name="u" placeholder="Username" required="required" />
<input type="password" name="p" placeholder="Password" required="required" />
<button type="submit" class="btn btn-primary btn-block btn-large">Let me in.</button>
</form>
</div>
</body>
</html>

View File

@ -13,12 +13,14 @@ const path = require('path');
const helmet = require('helmet');
const cors = require('cors');
const auth = require('./security/auth');
const app = express();
require('dotenv').config();
const serverPort = process.env.PORT || 3000;
const sitePath = '../dist';
const sitePath = 'dist';
app.use(cors());
app.use(helmet());
@ -29,6 +31,13 @@ app.use(session({
'saveUninitialized': true
}));
app.get('/', (request, response) => {
if (request.session.auth)
response.sendFile(path.join(`${__dirname}/dist/index.html`));
else
response.sendFile(path.join(`${__dirname}/security/login.html`));
});
app.use(express.static(path.join(__dirname, sitePath)));
// parse requests of content-type - application/x-www-form-urlencoded
@ -37,6 +46,8 @@ app.use(bodyParser.urlencoded({ 'extended': true }));
// parse requests of content-type - application/json
app.use(bodyParser.json());
app.post('/auth', auth.auth);
require('./routes/jobs.route')(app);
require('./routes/apply.route')(app);