-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
109 lines (99 loc) · 3.05 KB
/
Copy pathapp.js
File metadata and controls
109 lines (99 loc) · 3.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
var express = require('express');
var path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var bcrypt = require('bcrypt-nodejs');
var njwt = require('njwt');
var fs = require('fs');
var db = require('./db.js');
var app = express();
//Non Synchronous call is on purpose. Config must be parse before we continue.
var SIGNING_KEY = process.env.SIGNING_KEY;
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
//Login post function goes here.
app.post('/',function(req,res,next){
var email = req.body.email;
var password = req.body.password;
var query = "SELECT * FROM users WHERE email = $1";
db.query({ text : query, values : [email]},function(err,results){
if(err){
console.error("error connecting to database");
next(new Error('DB error'));
} else{
if(!(results.rows[0] && results.rows[0].email)){
var err = new Error("Invalid email or password");
err.status = 403;
next(err);
return;
}
bcrypt.compare(password,results.rows[0].password,function(err,success){
if(err){
console.error("bcrypt error");
console.error(err);
next(err);
} else{
if(success){
if(!results.rows[0].validated){
var err = new Error("User is not validated");
err.status = 401;
next(err);
return;
} else{
var query = "SELECT * FROM admin WHERE uid = $1";
db.query({text:query, values: [results.rows[0].uid]}, function(err,admin){
var claims = {
iss: "Molecular Playground URL",
sub: results.rows[0].uid,
username: results.rows[0].username,
email: email,
admin: admin.rows.length > 0
};
var jwt = njwt.create(claims,SIGNING_KEY);
var token = jwt.compact();
res.send({
token: token,
username: results.rows[0].username,
admin: admin.rows.length > 0
});
});
}
} else{
var err = new Error("Invalid email or password");
err.status = 403;
next(err);
return;
}
}
});
}
});
});
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.send({
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.send({ message: err.message });
});
module.exports = app;