| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | /* global WIKI */const Promise = require('bluebird')const express = require('express')const router = express.Router()const ExpressBrute = require('express-brute')const ExpressBruteRedisStore = require('express-brute-redis')const moment = require('moment')const _ = require('lodash')/** * Setup Express-Brute */const EBstore = new ExpressBruteRedisStore({  client: WIKI.redis})const bruteforce = new ExpressBrute(EBstore, {  freeRetries: 5,  minWait: 60 * 1000,  maxWait: 5 * 60 * 1000,  refreshTimeoutOnRequest: false,  failCallback (req, res, next, nextValidRequestDate) {    req.flash('alert', {      class: 'error',      title: WIKI.lang.t('auth:errors.toomanyattempts'),      message: WIKI.lang.t('auth:errors.toomanyattemptsmsg', { time: moment(nextValidRequestDate).fromNow() }),      iconClass: 'fa-times'    })    res.redirect('/login')  }})/** * Login form */router.get('/login', function (req, res, next) {  res.render('main/login')})router.post('/login', bruteforce.prevent, function (req, res, next) {  new Promise((resolve, reject) => {    // [1] LOCAL AUTHENTICATION    WIKI.auth.passport.authenticate('local', function (err, user, info) {      if (err) { return reject(err) }      if (!user) { return reject(new Error('INVALID_LOGIN')) }      resolve(user)    })(req, res, next)  }).catch({ message: 'INVALID_LOGIN' }, err => {    if (_.has(WIKI.config.auth.strategy, 'ldap')) {      // [2] LDAP AUTHENTICATION      return new Promise((resolve, reject) => {        WIKI.auth.passport.authenticate('ldapauth', function (err, user, info) {          if (err) { return reject(err) }          if (info && info.message) { return reject(new Error(info.message)) }          if (!user) { return reject(new Error('INVALID_LOGIN')) }          resolve(user)        })(req, res, next)      })    } else {      throw err    }  }).then((user) => {    // LOGIN SUCCESS    return req.logIn(user, function (err) {      if (err) { return next(err) }      req.brute.reset(function () {        return res.redirect('/')      })    }) || true  }).catch(err => {    // LOGIN FAIL    if (err.message === 'INVALID_LOGIN') {      req.flash('alert', {        title: WIKI.lang.t('auth:errors.invalidlogin'),        message: WIKI.lang.t('auth:errors.invalidloginmsg')      })      return res.redirect('/login')    } else {      req.flash('alert', {        title: WIKI.lang.t('auth:errors.loginerror'),        message: err.message      })      return res.redirect('/login')    }  })})/** * Social Login */router.get('/login/ms', WIKI.auth.passport.authenticate('windowslive', { scope: ['wl.signin', 'wl.basic', 'wl.emails'] }))router.get('/login/google', WIKI.auth.passport.authenticate('google', { scope: ['profile', 'email'] }))router.get('/login/facebook', WIKI.auth.passport.authenticate('facebook', { scope: ['public_profile', 'email'] }))router.get('/login/github', WIKI.auth.passport.authenticate('github', { scope: ['user:email'] }))router.get('/login/slack', WIKI.auth.passport.authenticate('slack', { scope: ['identity.basic', 'identity.email'] }))router.get('/login/azure', WIKI.auth.passport.authenticate('azure_ad_oauth2'))router.get('/login/ms/callback', WIKI.auth.passport.authenticate('windowslive', { failureRedirect: '/login', successRedirect: '/' }))router.get('/login/google/callback', WIKI.auth.passport.authenticate('google', { failureRedirect: '/login', successRedirect: '/' }))router.get('/login/facebook/callback', WIKI.auth.passport.authenticate('facebook', { failureRedirect: '/login', successRedirect: '/' }))router.get('/login/github/callback', WIKI.auth.passport.authenticate('github', { failureRedirect: '/login', successRedirect: '/' }))router.get('/login/slack/callback', WIKI.auth.passport.authenticate('slack', { failureRedirect: '/login', successRedirect: '/' }))router.get('/login/azure/callback', WIKI.auth.passport.authenticate('azure_ad_oauth2', { failureRedirect: '/login', successRedirect: '/' }))/** * Logout */router.get('/logout', function (req, res) {  req.logout()  res.redirect('/')})module.exports = router
 |