Advertisement
Guest User

Untitled

a guest
Oct 30th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.01 KB | None | 0 0
  1. const express = require('express');
  2. const hbs = require('hbs');
  3. const session = require('express-session');
  4. const http = require('http');
  5. const path = require('path');
  6. const fs = require('fs');
  7. const db = require('./db');
  8.  
  9. const cookieParser = require('cookie-parser');
  10.  
  11. const PORT = process.env.PORT || 8080;
  12.  
  13. const app = express(http);
  14.  
  15. hbs.registerPartials(path.resolve(__dirname, 'views', 'partials'));
  16. app.set('view engine', 'hbs');
  17. app.set('views', path.resolve(__dirname, 'views'));
  18.  
  19. app.use('/', express.static(path.resolve(__dirname, 'public')));
  20. const jsonParser = express.json();
  21. const urlEncodedParser = express.urlencoded({extended: true});
  22. app.use(cookieParser());
  23.  
  24. app.use(session({
  25. secret: String(fs.readFileSync(path.resolve(__dirname, 'secret'))),
  26. resave: false,
  27. saveUninitialized: true
  28. }));
  29.  
  30. app.get('/', (req, res) => {
  31. if (req.session.userID) {
  32. res.render('index.hbs', {
  33. isOfficer: req.session.profile.isOfficer,
  34. error: req.session.error
  35. });
  36. } else {
  37. res.render('login.hbs', {
  38. error: req.session.error
  39. });
  40. }
  41. req.session.info = null;
  42. req.session.error = null;
  43. });
  44.  
  45. app.get('/profile', (req, res) => {
  46. if (!req.session.userID) {
  47. req.session.error = 'You must be logged in to view this page';
  48. res.redirect('/');
  49.  
  50. } else {
  51. res.render('profile.hbs', {
  52. firstName: req.session.profile.firstName,
  53. lastName: req.session.profile.lastName,
  54. isOfficer: req.session.profile.isOfficer,
  55. error: req.session.error,
  56. info: req.session.info
  57. });
  58. req.session.info = null;
  59. req.session.error = null;
  60. }
  61. });
  62.  
  63. app.get('/logout', (req, res) => {
  64. req.session.destroy();
  65. res.redirect('/');
  66. });
  67.  
  68. app.get('*', (req, res) => {
  69. res.redirect('/');
  70. });
  71.  
  72. app.post('/register', urlEncodedParser, async (req, res) => {
  73. if (!req.body || !req.body.username || !req.body.password || !req.body.password_confirm) {
  74. req.session.error = 'Missing required fields';
  75. res.redirect('/');
  76. return;
  77. }
  78. if (req.body.password !== req.body.password_confirm) {
  79. req.session.error = 'Passwords do not match';
  80. res.redirect('/');
  81. return;
  82. }
  83. try {
  84. let users = await db.all('SELECT * FROM users WHERE username = ?', [req.body.username]);
  85. if (users && users[0]) {
  86. req.session.error = 'User already exists';
  87. res.redirect('/');
  88. return;
  89. }
  90. let id = await db.run('INSERT INTO users (username, password, firstName, lastName) VALUES (?, ?, ?, ?)',
  91. [req.body.username, req.body.password, '', '']);
  92. req.session.userID = id;
  93. req.session.profile = {
  94. firstName: '',
  95. lastName: '',
  96. };
  97. res.redirect('/profile');
  98. } catch (err) {
  99. console.error(err);
  100. req.session.error = 'Internal server error';
  101. res.redirect('/');
  102. }
  103. });
  104.  
  105. app.post('/login', urlEncodedParser, async (req, res) => {
  106. if (!req.body || !req.body.username || !req.body.password) {
  107. req.session.error = 'Missing required fields';
  108. res.redirect('/');
  109. return;
  110. }
  111. try {
  112. let users = await db.all('SELECT * FROM users WHERE username = ? AND password = ?',
  113. [req.body.username, req.body.password]);
  114. if (!users || !users.length) {
  115. req.session.error = 'Invalid username or password';
  116. res.redirect('/');
  117. return;
  118. }
  119.  
  120. // Check if user is a police officer
  121. let officers = await db.all('SELECT * FROM officers WHERE userid = ?', [users[0].id]);
  122. req.session.userID = users[0].id;
  123. req.session.profile = {
  124. firstName: users[0].firstName,
  125. lastName: users[0].lastName,
  126. };
  127. if (officers && officers[0]) {
  128. req.session.profile.isOfficer = true;
  129. }
  130. res.redirect('/');
  131. } catch (err) {
  132. console.error(err);
  133. req.session.error = 'Internal server error';
  134. res.redirect('/');
  135. }
  136.  
  137. });
  138.  
  139. app.post('/profile', jsonParser, async (req, res) => {
  140. if (!req.session.userID) {
  141. req.session.error = 'You must be logged in to perform this action';
  142. res.status(403);
  143. res.send(req.session.error);
  144. return;
  145. }
  146. if (!req.body || Object.keys(req.body).length === 0) {
  147. req.session.error = 'Missing required fields';
  148. res.status(400);
  149. res.send(req.session.error);
  150. return;
  151. }
  152. let profile = Object.assign({}, req.session.profile);
  153. let requested = req.body;
  154.  
  155. // Make sure we only update existing properties
  156. for (let key of Object.keys(requested)) {
  157.  
  158. if (typeof(requested[key]) === 'string')
  159. requested[key] = requested[key].substring(0, 32);
  160.  
  161. if (profile[key] !== undefined && typeof(profile[key]) === typeof(requested[key]))
  162. profile[key] = requested[key];
  163. }
  164.  
  165. if (Object.keys(profile).length === 0) {
  166. req.session.error = 'Missing required fields';
  167. res.status(400);
  168. res.send(req.session.error);
  169. return;
  170. }
  171.  
  172. try {
  173. await db.run('UPDATE users SET firstName = ?, lastName = ? WHERE id = ?',
  174. [profile.firstName, profile.lastName, req.session.userID]);
  175. req.session.profile.firstName = profile.firstName;
  176. req.session.profile.lastName = profile.lastName;
  177. if (profile.isOfficer)
  178. req.session.profile.isOfficer = true;
  179. req.session.info = 'Changes saved successfully';
  180. res.send('OK');
  181. } catch (err) {
  182. console.error(err);
  183. req.session.error = 'Internal server error';
  184. res.status(500);
  185. res.send(req.session.error);
  186. }
  187.  
  188. });
  189.  
  190. db.connect().then(() => {
  191.  
  192. app.listen(PORT, () => {
  193. console.log(`We are live on port ${PORT}`);
  194. });
  195.  
  196. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement