From 0a678f808f6a13b6031f5cf13dd00a8cf14a0fed Mon Sep 17 00:00:00 2001 From: Yannick Bungers Date: Mon, 13 Apr 2020 13:11:13 +0200 Subject: [PATCH] Refactored Auth/Email to typescript Signed-off-by: Yannick Bungers Signed-off-by: David Mehren --- lib/web/auth/email/index.js | 78 ------------------------------- lib/web/auth/email/index.ts | 91 +++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 78 deletions(-) delete mode 100644 lib/web/auth/email/index.js create mode 100644 lib/web/auth/email/index.ts diff --git a/lib/web/auth/email/index.js b/lib/web/auth/email/index.js deleted file mode 100644 index 78ca933b9..000000000 --- a/lib/web/auth/email/index.js +++ /dev/null @@ -1,78 +0,0 @@ -'use strict' - -const Router = require('express').Router -const passport = require('passport') -const validator = require('validator') -const LocalStrategy = require('passport-local').Strategy -const config = require('../../../config') -const models = require('../../../models') -const logger = require('../../../logger') -const { urlencodedParser } = require('../../utils') -const errors = require('../../../errors') - -let emailAuth = module.exports = Router() - -passport.use(new LocalStrategy({ - usernameField: 'email' -}, function (email, password, done) { - if (!validator.isEmail(email)) return done(null, false) - models.User.findOne({ - where: { - email: email - } - }).then(function (user) { - if (!user) return done(null, false) - user.verifyPassword(password).then(verified => { - if (verified) { - return done(null, user) - } else { - logger.warn('invalid password given for %s', user.email) - return done(null, false) - } - }) - }).catch(function (err) { - logger.error(err) - return done(err) - }) -})) - -if (config.allowEmailRegister) { - emailAuth.post('/register', urlencodedParser, function (req, res, next) { - if (!req.body.email || !req.body.password) return errors.errorBadRequest(res) - if (!validator.isEmail(req.body.email)) return errors.errorBadRequest(res) - models.User.findOrCreate({ - where: { - email: req.body.email - }, - defaults: { - password: req.body.password - } - }).spread(function (user, created) { - if (user) { - if (created) { - logger.debug('user registered: ' + user.id) - req.flash('info', "You've successfully registered, please signin.") - } else { - logger.debug('user found: ' + user.id) - req.flash('error', 'This email has been used, please try another one.') - } - return res.redirect(config.serverURL + '/') - } - req.flash('error', 'Failed to register your account, please try again.') - return res.redirect(config.serverURL + '/') - }).catch(function (err) { - logger.error('auth callback failed: ' + err) - return errors.errorInternalError(res) - }) - }) -} - -emailAuth.post('/login', urlencodedParser, function (req, res, next) { - if (!req.body.email || !req.body.password) return errors.errorBadRequest(res) - if (!validator.isEmail(req.body.email)) return errors.errorBadRequest(res) - passport.authenticate('local', { - successReturnToOrRedirect: config.serverURL + '/', - failureRedirect: config.serverURL + '/', - failureFlash: 'Invalid email or password.' - })(req, res, next) -}) diff --git a/lib/web/auth/email/index.ts b/lib/web/auth/email/index.ts new file mode 100644 index 000000000..ae8bf3119 --- /dev/null +++ b/lib/web/auth/email/index.ts @@ -0,0 +1,91 @@ +import { Router, Request, Response, NextFunction } from 'express' +import passport from 'passport' +import validator from 'validator' +import * as LocalStrategy from 'passport-local' +import { config } from '../../../config' +import { User } from '../../../models' +import { logger } from '../../../logger' +import { urlencodedParser } from '../../utils' +import { errors } from '../../../errors' +import { AuthMiddleware } from '../interface' + +const emailAuth = Router() + +export const EmailMiddleware: AuthMiddleware = { + getMiddleware (): Router { + passport.use(new LocalStrategy({ + usernameField: 'email' + }, function (email: string, password: string, done) { + if (!validator.isEmail(email)) return done(null, false) + User.findOne({ + where: { + email: email + } + }).then(function (user: User) { + if (!user) return done(null, false) + user.verifyPassword(password).then(verified => { + if (verified) { + return done(null, user) + } else { + logger.warn('invalid password given for %s', user.email) + return done(null, false) + } + }) + }).catch(function (err: Error) { + logger.error(err) + return done(err) + }) + })) + + if (config.allowEmailRegister) { + emailAuth.post('/register', urlencodedParser, function (req: Request, res: Response, _: NextFunction) { + if (!req.body.email || !req.body.password) { + errors.errorBadRequest(res) + return + } + if (!validator.isEmail(req.body.email)) { + errors.errorBadRequest(res) + return + } + User.findOrCreate({ + where: { + email: req.body.email + }, + defaults: { + password: req.body.password + } + }).then(function ([user, created]: [User, boolean]) { + if (created) { + logger.debug('user registered: ' + user.id) + req.flash('info', "You've successfully registered, please signin.") + } else { + logger.debug('user found: ' + user.id) + req.flash('error', 'This email has been used, please try another one.') + } + req.flash('error', 'Failed to register your account, please try again.') + return res.redirect(config.serverURL + '/') + }).catch(function (err) { + logger.error('auth callback failed: ' + err) + errors.errorInternalError(res) + }) + }) + } + + emailAuth.post('/login', urlencodedParser, function (req: Request, res: Response, next: NextFunction) { + if (!req.body.email || !req.body.password) { + errors.errorBadRequest(res) + return + } + if (!validator.isEmail(req.body.email)) { + errors.errorBadRequest(res) + return + } + passport.authenticate('local', { + successReturnToOrRedirect: config.serverURL + '/', + failureRedirect: config.serverURL + '/', + failureFlash: 'Invalid email or password.' + })(req, res, next) + }) + return emailAuth + } +}