aboutsummaryrefslogtreecommitdiff
path: root/src/server/authentication
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/authentication')
-rw-r--r--src/server/authentication/AuthenticationManager.ts146
-rw-r--r--src/server/authentication/DashUserModel.ts7
-rw-r--r--src/server/authentication/Passport.ts35
3 files changed, 87 insertions, 101 deletions
diff --git a/src/server/authentication/AuthenticationManager.ts b/src/server/authentication/AuthenticationManager.ts
index 52d876e95..b1b84c300 100644
--- a/src/server/authentication/AuthenticationManager.ts
+++ b/src/server/authentication/AuthenticationManager.ts
@@ -3,12 +3,12 @@ import { Request, Response, NextFunction } from 'express';
import * as passport from 'passport';
import { IVerifyOptions } from 'passport-local';
import './Passport';
-import flash = require('express-flash');
import * as async from 'async';
import * as nodemailer from 'nodemailer';
-import c = require('crypto');
+import * as c from 'crypto';
import { emptyFunction, Utils } from '../../Utils';
import { MailOptions } from 'nodemailer/lib/stream-transport';
+import { check, validationResult } from 'express-validator';
/**
* GET /signup
@@ -31,14 +31,14 @@ export let getSignup = (req: Request, res: Response) => {
*/
export let postSignup = (req: Request, res: Response, next: NextFunction) => {
const email = req.body.email as String;
- req.assert('email', 'Email is not valid').isEmail();
- req.assert('password', 'Password must be at least 4 characters long').len({ min: 4 });
- req.assert('confirmPassword', 'Passwords do not match').equals(req.body.password);
- req.sanitize('email').normalizeEmail({ gmail_remove_dots: false });
+ check('email', 'Email is not valid').isEmail().run(req);
+ check('password', 'Password must be at least 4 characters long').isLength({ min: 4 }).run(req);
+ check('confirmPassword', 'Passwords do not match').equals(req.body.password).run(req);
+ check('email').normalizeEmail({ gmail_remove_dots: false }).run(req);
- const errors = req.validationErrors();
+ const errors = validationResult(req).array();
- if (errors) {
+ if (errors.length) {
return res.redirect('/signup');
}
@@ -47,7 +47,7 @@ export let postSignup = (req: Request, res: Response, next: NextFunction) => {
const model = {
email,
password,
- userDocumentId: email === 'guest' ? '__guest__' : Utils.GenerateGuid(),
+ userDocumentId: email === 'guest' ? Utils.GuestID() : Utils.GenerateGuid(),
sharingDocumentId: email === 'guest' ? 2 : Utils.GenerateGuid(),
linkDatabaseId: email === 'guest' ? 3 : Utils.GenerateGuid(),
cacheDocumentIds: '',
@@ -55,25 +55,21 @@ export let postSignup = (req: Request, res: Response, next: NextFunction) => {
const user = new User(model);
- User.findOne({ email }, (err: any, existingUser: any) => {
- if (err) {
- return next(err);
- }
- if (existingUser) {
- return res.redirect('/login');
- }
- user.save((err: any) => {
- if (err) {
- return next(err);
+ User.findOne({ email })
+ .then(existingUser => {
+ if (existingUser) {
+ return res.redirect('/login');
}
- req.logIn(user, err => {
- if (err) {
- return next(err);
- }
- tryRedirectToTarget(req, res);
- });
- });
- });
+ user.save()
+ .then(() => {
+ req.logIn(user, err => {
+ if (err) return next(err);
+ tryRedirectToTarget(req, res);
+ });
+ })
+ .catch(err => next(err));
+ })
+ .catch(err => next(err));
};
const tryRedirectToTarget = (req: Request, res: Response) => {
@@ -107,16 +103,18 @@ export let getLogin = (req: Request, res: Response) => {
*/
export let postLogin = (req: Request, res: Response, next: NextFunction) => {
if (req.body.email === '') {
- User.findOne({ email: 'guest' }, (err: any, user: DashUserModel) => !user && initializeGuest());
+ User.findOne({ email: 'guest' })
+ .then(user => !user && initializeGuest())
+ .catch(err => err);
req.body.email = 'guest';
req.body.password = 'guest';
} else {
- req.assert('email', 'Email is not valid').isEmail();
- req.assert('password', 'Password cannot be blank').notEmpty();
- req.sanitize('email').normalizeEmail({ gmail_remove_dots: false });
+ check('email', 'Email is not valid').isEmail().run(req);
+ check('password', 'Password cannot be blank').notEmpty().run(req);
+ check('email').normalizeEmail({ gmail_remove_dots: false }).run(req);
}
- if (req.validationErrors()) {
+ if (validationResult(req).array().length) {
req.flash('errors', 'Unable to login at this time. Please try again.');
return res.redirect('/signup');
}
@@ -146,16 +144,10 @@ export let postLogin = (req: Request, res: Response, next: NextFunction) => {
* and destroys the user's current session.
*/
export let getLogout = (req: Request, res: Response) => {
- req.logout(emptyFunction);
- const sess = req.session;
- if (sess) {
- sess.destroy(err => {
- if (err) {
- console.log(err);
- }
- });
- }
- res.redirect('/login');
+ req.logout(err => {
+ if (err) console.log(err);
+ else res.redirect('/login');
+ });
};
export let getForgot = function (req: Request, res: Response) {
@@ -179,7 +171,7 @@ export let postForgot = function (req: Request, res: Response, next: NextFunctio
});
},
function (token: string, done: any) {
- User.findOne({ email }, function (err: any, user: DashUserModel) {
+ User.findOne({ email }).then(user => {
if (!user) {
// NO ACCOUNT WITH SUBMITTED EMAIL
res.redirect('/forgotPassword');
@@ -187,9 +179,7 @@ export let postForgot = function (req: Request, res: Response, next: NextFunctio
}
user.passwordResetToken = token;
user.passwordResetExpires = new Date(Date.now() + 3600000); // 1 HOUR
- user.save(function (err: any) {
- done(null, token, user);
- });
+ user.save().then(() => done(null, token, user));
});
},
function (token: Uint16Array, user: DashUserModel, done: any) {
@@ -228,50 +218,43 @@ export let postForgot = function (req: Request, res: Response, next: NextFunctio
};
export let getReset = function (req: Request, res: Response) {
- User.findOne({ passwordResetToken: req.params.token, passwordResetExpires: { $gt: Date.now() } }, function (err: any, user: DashUserModel) {
- if (!user || err) {
- return res.redirect('/forgotPassword');
- }
- res.render('reset.pug', {
- title: 'Reset Password',
- user: req.user,
- });
- });
+ User.findOne({ passwordResetToken: req.params.token, passwordResetExpires: { $gt: Date.now() } })
+ .then(user => {
+ if (!user) return res.redirect('/forgotPassword');
+ res.render('reset.pug', {
+ title: 'Reset Password',
+ user: req.user,
+ });
+ })
+ .catch(err => res.redirect('/forgotPassword'));
};
export let postReset = function (req: Request, res: Response) {
async.waterfall(
[
function (done: any) {
- User.findOne({ passwordResetToken: req.params.token, passwordResetExpires: { $gt: Date.now() } }, function (err: any, user: DashUserModel) {
- if (!user || err) {
- return res.redirect('back');
- }
+ User.findOne({ passwordResetToken: req.params.token, passwordResetExpires: { $gt: Date.now() } })
+ .then(user => {
+ if (!user) return res.redirect('back');
- req.assert('password', 'Password must be at least 4 characters long').len({ min: 4 });
- req.assert('confirmPassword', 'Passwords do not match').equals(req.body.password);
+ check('password', 'Password must be at least 4 characters long').isLength({ min: 4 }).run(req);
+ check('confirmPassword', 'Passwords do not match').equals(req.body.password).run(req);
- if (req.validationErrors()) {
- return res.redirect('back');
- }
+ if (validationResult(req).array().length) return res.redirect('back');
- user.password = req.body.password;
- user.passwordResetToken = undefined;
- user.passwordResetExpires = undefined;
+ user.password = req.body.password;
+ user.passwordResetToken = undefined;
+ user.passwordResetExpires = undefined;
- user.save(function (err) {
- if (err) {
- res.redirect('/login');
- return;
- }
- req.logIn(user, function (err) {
- if (err) {
- return;
- }
- });
+ user.save()
+ .then(
+ () => (req as any).logIn(user),
+ (err: any) => err
+ )
+ .catch(err => res.redirect('/login'));
done(null, user);
- });
- });
+ })
+ .catch(err => res.redirect('back'));
},
function (user: DashUserModel, done: any) {
const smtpTransport = nodemailer.createTransport({
@@ -287,9 +270,8 @@ export let postReset = function (req: Request, res: Response) {
subject: 'Your password has been changed',
text: 'Hello,\n\n' + 'This is a confirmation that the password for your account ' + user.email + ' has just been changed.\n',
} as MailOptions;
- smtpTransport.sendMail(mailOptions, function (err) {
- done(null, err);
- });
+
+ smtpTransport.sendMail(mailOptions, err => done(null, err));
},
],
function (err) {
diff --git a/src/server/authentication/DashUserModel.ts b/src/server/authentication/DashUserModel.ts
index a1883beab..dbb7a79ed 100644
--- a/src/server/authentication/DashUserModel.ts
+++ b/src/server/authentication/DashUserModel.ts
@@ -2,6 +2,7 @@
import * as bcrypt from 'bcrypt-nodejs';
//@ts-ignore
import * as mongoose from 'mongoose';
+import { Utils } from '../../Utils';
export type DashUserModel = mongoose.Document & {
email: String;
@@ -25,7 +26,7 @@ export type DashUserModel = mongoose.Document & {
comparePassword: comparePasswordFunction;
};
-type comparePasswordFunction = (candidatePassword: string, cb: (err: any, isMatch: any) => {}) => void;
+type comparePasswordFunction = (candidatePassword: string, cb: (err: any, isMatch: any) => void) => void;
export type AuthToken = {
accessToken: string;
@@ -63,7 +64,7 @@ const userSchema = new mongoose.Schema(
* Password hash middleware.
*/
userSchema.pre('save', function save(next) {
- const user = this as DashUserModel;
+ const user = this as any as DashUserModel;
if (!user.isModified('password')) {
return next();
}
@@ -101,7 +102,7 @@ export function initializeGuest() {
new User({
email: 'guest',
password: 'guest',
- userDocumentId: '__guest__',
+ userDocumentId: Utils.GuestID(),
sharingDocumentId: '2',
linkDatabaseId: '3',
cacheDocumentIds: '',
diff --git a/src/server/authentication/Passport.ts b/src/server/authentication/Passport.ts
index d7f891c34..a9cf6698b 100644
--- a/src/server/authentication/Passport.ts
+++ b/src/server/authentication/Passport.ts
@@ -1,6 +1,6 @@
import * as passport from 'passport';
import * as passportLocal from 'passport-local';
-import { default as User } from './DashUserModel';
+import { DashUserModel, default as User } from './DashUserModel';
const LocalStrategy = passportLocal.Strategy;
@@ -9,21 +9,24 @@ passport.serializeUser<any, any>((req, user, done) => {
});
passport.deserializeUser<any, any>((id, done) => {
- User.findById(id, (err: any, user: any) => {
- done(err, user);
- });
+ User.findById(id)
+ .exec()
+ .then(user => done(undefined, user));
});
// AUTHENTICATE JUST WITH EMAIL AND PASSWORD
-passport.use(new LocalStrategy({ usernameField: 'email', passReqToCallback: true }, (req, email, password, done) => {
- User.findOne({ email: email.toLowerCase() }, (error: any, user: any) => {
- if (error) return done(error);
- if (!user) return done(undefined, false, { message: "Invalid email or password" }); // invalid email
- user.comparePassword(password, (error: Error, isMatch: boolean) => {
- if (error) return done(error);
- if (!isMatch) return done(undefined, false, { message: "Invalid email or password" }); // invalid password
- // valid authentication HERE
- return done(undefined, user);
- });
- });
-})); \ No newline at end of file
+passport.use(
+ new LocalStrategy({ usernameField: 'email', passReqToCallback: true }, (req, email, password, done) => {
+ User.findOne({ email: email.toLowerCase() })
+ .then(user => {
+ if (!user) return done(undefined, false, { message: 'Invalid email or password' }); // invalid email
+ (user as any as DashUserModel).comparePassword(password, (error: Error, isMatch: boolean) => {
+ if (error) return done(error);
+ if (!isMatch) return done(undefined, false, { message: 'Invalid email or password' }); // invalid password
+ // valid authentication HERE
+ return done(undefined, user);
+ });
+ })
+ .catch(error => done(error));
+ })
+);