-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
158 lines (116 loc) · 3.73 KB
/
index.js
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const passport = require('passport');
const session = require('express-session');
const path = require('path');
const flash = require('flash');
const helmet = require('helmet');
const csrf = require('csurf');
const uuid = require('uuid');
const dotenv = require('dotenv');
dotenv.config();
//console.log(process.env.MONGODB_URL);
//const User = require("./models/user.js").User;
const conStr = process.env.MONGODB_URL;
const app = express();
mongoose.connect(conStr);
//Registering callbacks for passport configuration
require('./config/passport.js')(passport);
//Template Engine
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
//Static files
app.use(express.static('public'));
//Session
sessionSecret = process.env.SECRET;
app.use(session({
secret: sessionSecret,
resave: true,
saveUninitialized:true,
})); //TODO: CHANGE SECRET
//TODO: PERSIST SESSIONS ON MONGODB
//Passport
app.use(passport.initialize());
app.use(passport.session());
//Auth guard
const ensureAuthenticated = require('./config/auth.js').ensureAuthenticated;
//BP
app.use(bodyParser.urlencoded({ extended: false }));
//CSRF
let csrfProtection = csrf({cookie: false});
//Nonce for inline scripts //TODO: MAYBE CHANGE TO SOMETHING MORE FORMAL IF ANY
app.use((req, res, next) => {
res.locals.nonce = uuid.v4();
next();
});
//Helmet
/*app.use(helmet({
contentSecurityPolicy: false, //DONETODO: ENABLE AGAIN
}));*/
app.use(helmet.contentSecurityPolicy({
directives:{
"default-src": ["'self'"],
"script-src": ["'self'", "https://unpkg.com/", (req, res) => `'nonce-${res.locals.nonce}'` ], //UNPKG domain for the map addon //NONCE ADDED FOR INLINE SCRIPTS (USING BACKTICKS IS MANDATORY FOR CSP, APPARENTLY)
"block-all-mixed-content":[],
"frame-ancestors": ["'self'"],
"object-src": ["'none'"],
"style-src": ["'self'", "https: 'unsafe-inline'"],
"font-src": ["'self'", "https:", "data:"],
"img-src": ["'self'", "data:", "*.openstreetmap.org"],
"upgrade-insecure-requests": [],
},
}));
//Flash messages
app.use(flash());
//Common routes
app.get('/', (req, res) => {
//res.send('Hello!');
res.render("index.ejs"); //IF CHANGED TO POST, WILL NEED CSRF
});
app.get('/dashboard', ensureAuthenticated, (req, res) => {
res.send('This is the /authenticated/ dashboard!');
});
/*app.get('/createtest', (req, res) => {
const user = new User({
name: 'Test user',
email: '[email protected]',
password: 'nopass',
});
user.save().then((result) => {
res.send(result);
}).catch((err) => {
console.log(err);
});
});*/
//TODO: FIX TEMPORARY
app.get('/map', (req, res, next) => {
return res.render("map.ejs");
});
app.get('/testloc', (req, res, next) => {
return res.render("testloc.ejs");
});
const userRoutes = require('./routes/users.js').router;
app.use('/users', csrfProtection, userRoutes);
const locationRoutes = require('./routes/locations.js').router;
app.use('/locations', csrfProtection, locationRoutes);
const vaccinationRoutes = require('./routes/vaccinations.js').router;
app.use('/vaccinations', csrfProtection, vaccinationRoutes);
//Error routes
//TODO: UNCOMMENT TO ENABLE ERROR HANDLERS
app.get('/404', (req, res, next) => { //TEST ONLY
let err = new Error('not allowed');
err.status = 404;
next(err);
});
app.use((err, req, res, next) => {
//console.log(err.status);
if(err.status == 404){
res.status(404);
return res.render('errors/404');
}else{
res.status(500);
return res.render('errors/500');
}
});
module.exports = app;