You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
1.6 KiB

  1. var express = require('express');
  2. var router = express.Router();
  3. var passport = require('passport');
  4. var ExpressBrute = require('express-brute');
  5. var ExpressBruteMongooseStore = require('express-brute-mongoose');
  6. var moment = require('moment');
  7. /**
  8. * Setup Express-Brute
  9. */
  10. var EBstore = new ExpressBruteMongooseStore(db.Bruteforce);
  11. var bruteforce = new ExpressBrute(EBstore, {
  12. freeRetries: 5,
  13. minWait: 60 * 1000,
  14. maxWait: 5 * 60 * 1000,
  15. refreshTimeoutOnRequest: false,
  16. failCallback(req, res, next, nextValidRequestDate) {
  17. req.flash('alert', {
  18. class: 'error',
  19. title: 'Too many attempts!',
  20. message: "You've made too many failed attempts in a short period of time, please try again " + moment(nextValidRequestDate).fromNow() + '.',
  21. iconClass: 'fa-times'
  22. });
  23. res.redirect('/login');
  24. }
  25. });
  26. /**
  27. * Login form
  28. */
  29. router.get('/login', function(req, res, next) {
  30. res.render('auth/login', {
  31. usr: res.locals.usr
  32. });
  33. });
  34. router.post('/login', bruteforce.prevent, function(req, res, next) {
  35. passport.authenticate('local', function(err, user, info) {
  36. if (err) { return next(err); }
  37. if (!user) {
  38. req.flash('alert', {
  39. class: 'error',
  40. title: 'Invalid login',
  41. message: "The email or password is invalid.",
  42. iconClass: 'fa-times'
  43. });
  44. return res.redirect('/login');
  45. }
  46. req.logIn(user, function(err) {
  47. if (err) { return next(err); }
  48. req.brute.reset(function () {
  49. return res.redirect('/');
  50. });
  51. });
  52. })(req, res, next);
  53. });
  54. /**
  55. * Logout
  56. */
  57. router.get('/logout', function(req, res) {
  58. req.logout();
  59. res.redirect('/');
  60. });
  61. module.exports = router;