From b441bb2b67f10ae1b83363d158a0ac1591f63e51 Mon Sep 17 00:00:00 2001 From: Sam Wilkins Date: Sun, 24 Feb 2019 15:47:07 -0500 Subject: rough ui finished --- views/signup.pug | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) (limited to 'views/signup.pug') diff --git a/views/signup.pug b/views/signup.pug index a23f334af..8b5358137 100644 --- a/views/signup.pug +++ b/views/signup.pug @@ -2,24 +2,25 @@ extends ./layout block content - .page-header - h3 Sign up - form.form-horizontal(id='signup-form', method='POST') - input(type='hidden', name='_csrf', value=_csrf) - .form-group - label.col-sm-3.control-label(for='email') Email - .col-sm-7 - input.form-control(type='email', name='email', id='email', placeholder='Email', autofocus, required) - .form-group - label.col-sm-3.control-label(for='password') Password - .col-sm-7 - input.form-control(type='password', name='password', id='password', placeholder='Password', required) - .form-group - label.col-sm-3.control-label(for='confirmPassword') Confirm Password - .col-sm-7 - input.form-control(type='password', name='confirmPassword', id='confirmPassword', placeholder='Confirm Password', required) - .form-group - .col-sm-offset-3.col-sm-7 - button.btn.btn-success(type='submit') - i.fa.fa-user-plus - | Signup \ No newline at end of file + style + include ./stylesheets/authentication.css + .page-header + form.form-horizontal(id='signup-form', method='POST') + input(type='hidden', name='_csrf', value=_csrf) + .overlay(id='overlay_signup') + .inner.signup + h3.auth_header Create An Account + .form-group + .col-sm-7 + input.form-control(type='email', name='email', id='email', placeholder='Email', autofocus, required) + .form-group + .col-sm-7 + input.form-control(type='password', name='password', id='password', placeholder='Password', required) + .form-group + .col-sm-7 + input.form-control(type='password', name='confirmPassword', id='confirmPassword', placeholder='Confirm Password', required) + .form-group + .col-sm-offset-3.col-sm-7 + button.btn.btn-success(type='submit') + i.fa.fa-user-plus + | Signup \ No newline at end of file -- cgit v1.2.3-70-g09d2 From cbbeafb8a0c53ddea92684021ead9bc08fa75d37 Mon Sep 17 00:00:00 2001 From: Sam Wilkins Date: Sun, 24 Feb 2019 16:03:38 -0500 Subject: ui tweaks --- src/server/authentication/controllers/user.ts | 9 ++++++--- views/signup.pug | 2 ++ views/stylesheets/authentication.css | 6 ++++-- 3 files changed, 12 insertions(+), 5 deletions(-) (limited to 'views/signup.pug') diff --git a/src/server/authentication/controllers/user.ts b/src/server/authentication/controllers/user.ts index 554781409..5ff44bda1 100644 --- a/src/server/authentication/controllers/user.ts +++ b/src/server/authentication/controllers/user.ts @@ -29,7 +29,8 @@ export let getSignup = (req: Request, res: Response) => { return res.redirect("/home"); } res.render("signup.pug", { - title: "Sign Up" + title: "Sign Up", + errors: req.flash("Unable to facilitate sign up. Please try again.") }); }; @@ -48,8 +49,10 @@ export let postSignup = (req: Request, res: Response, next: NextFunction) => { const errors = req.validationErrors(); if (errors) { - req.flash("errors", "Unable to facilitate sign up. Please try again."); - console.log(errors.toString()); + res.render("signup.pug", { + title: "Sign Up", + errors: req.flash("Unable to facilitate sign up. Please try again.") + }); return res.redirect("/signup"); } diff --git a/views/signup.pug b/views/signup.pug index 8b5358137..9863b453e 100644 --- a/views/signup.pug +++ b/views/signup.pug @@ -8,6 +8,8 @@ block content form.form-horizontal(id='signup-form', method='POST') input(type='hidden', name='_csrf', value=_csrf) .overlay(id='overlay_signup') + a(href="/login") + img(id='to_login', src="https://bit.ly/2U6ouZk", alt="") .inner.signup h3.auth_header Create An Account .form-group diff --git a/views/stylesheets/authentication.css b/views/stylesheets/authentication.css index 4f4c02c03..30a99563e 100644 --- a/views/stylesheets/authentication.css +++ b/views/stylesheets/authentication.css @@ -9,7 +9,8 @@ label { } body { - background-color: #ccbbcc; + /* background-color: #ccbbcc; */ + background-color: #bf0000; } #logo { @@ -46,7 +47,8 @@ body { height: 300px; } -#new_user { +#new_user, +#to_login { width: 20px; height: 20px; position: absolute; -- cgit v1.2.3-70-g09d2 From a160304a54ee0219f48faee8a7402503f2160902 Mon Sep 17 00:00:00 2001 From: Sam Wilkins Date: Sun, 24 Feb 2019 23:45:43 -0500 Subject: lost password email implementation beginning --- package-lock.json | 36 ++++++++++++++++++++++--- package.json | 4 +++ src/server/authentication/controllers/user.ts | 8 +++++- src/server/authentication/models/User.ts | 4 +-- src/server/index.ts | 38 +++++++++++++++++++++++++++ views/layout.pug | 4 +-- views/signup.pug | 1 - 7 files changed, 83 insertions(+), 12 deletions(-) (limited to 'views/signup.pug') diff --git a/package-lock.json b/package-lock.json index 94e478e1b..357728555 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,11 @@ "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.0.tgz", "integrity": "sha512-7WcbyctkE8GTzogDb0ulRAEw7v8oIS54ft9mQTU7PfM0hp5e+8kpa+HeQ7IQrFbKtJXBKcZ4bh+Em9dTw5L6AQ==" }, + "@types/async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/async/-/async-2.4.1.tgz", + "integrity": "sha512-C09BK/wXzbW+/JK9zckhe+FeSbg7NmvVjUWwApnw7ksRpUq3ecGLiq2Aw1LlY4Z/VmtdhSaIs7jO5/MWRYMcOA==" + }, "@types/babel-types": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.5.tgz", @@ -207,6 +212,14 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.24.tgz", "integrity": "sha512-GWWbvt+z9G5otRBW8rssOFgRY87J9N/qbhqfjMZ+gUuL6zoL+Hm6gP/8qQBG4jjimqdaNLCehcVapZ/Fs2WjCQ==" }, + "@types/nodemailer": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-4.6.6.tgz", + "integrity": "sha512-N2czhXs7fbQhvoquEGzmHAWttnxLfrM3+cWMRFX4hTQq4GE3VyaSE3MOOse4VoNgvtti/H5ow/Hq9KXu/UMWqA==", + "requires": { + "@types/node": "*" + } + }, "@types/orderedmap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/orderedmap/-/orderedmap-1.0.0.tgz", @@ -950,10 +963,12 @@ "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=" }, "async": { - "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "requires": { + "lodash": "^4.17.11" + } }, "async-each": { "version": "1.0.1", @@ -5792,6 +5807,11 @@ "true-case-path": "^1.0.2" } }, + "nodemailer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-5.1.1.tgz", + "integrity": "sha512-hKGCoeNdFL2W7S76J/Oucbw0/qRlfG815tENdhzcqTpSjKgAN91mFOqU2lQUflRRxFM7iZvCyaFcAR9noc/CqQ==" + }, "nodemon": { "version": "1.18.10", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.18.10.tgz", @@ -9807,6 +9827,14 @@ "async": "^1.5.2", "debug": "^2.2.0", "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } } }, "posix-character-classes": { diff --git a/package.json b/package.json index fbf20230d..4371df90d 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ }, "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.14", + "@types/async": "^2.4.1", "@types/bcrypt-nodejs": "0.0.30", "@types/bluebird": "^3.5.25", "@types/body-parser": "^1.17.0", @@ -48,6 +49,7 @@ "@types/mongodb": "^3.1.19", "@types/mongoose": "^5.3.16", "@types/node": "^10.12.24", + "@types/nodemailer": "^4.6.6", "@types/passport": "^1.0.0", "@types/passport-local": "^1.0.33", "@types/prosemirror-commands": "^1.0.1", @@ -65,6 +67,7 @@ "@types/typescript": "^2.0.0", "@types/uuid": "^3.4.4", "@types/webpack": "^4.4.24", + "async": "^2.6.2", "bcrypt-nodejs": "0.0.3", "bluebird": "^3.5.3", "body-parser": "^1.18.3", @@ -87,6 +90,7 @@ "mongodb": "^3.1.13", "mongoose": "^5.4.12", "node-sass": "^4.11.0", + "nodemailer": "^5.1.1", "nodemon": "^1.18.10", "normalize.css": "^8.0.1", "npm": "^6.7.0", diff --git a/src/server/authentication/controllers/user.ts b/src/server/authentication/controllers/user.ts index 93986adf8..a496959d1 100644 --- a/src/server/authentication/controllers/user.ts +++ b/src/server/authentication/controllers/user.ts @@ -12,6 +12,8 @@ import * as pug from 'pug'; * GET / * Whenever a user navigates to the root of Dash * (doesn't specify a sub-route), redirect to login. + * If the user is already signed in, it will effectively + * automatically redirect them to /home instead */ export let getEntry = (req: Request, res: Response) => { res.redirect("/login"); @@ -29,6 +31,7 @@ export let getSignup = (req: Request, res: Response) => { } res.render("signup.pug", { title: "Sign Up", + user: req.user, errors: req.flash("Unable to facilitate sign up. Please try again.") }); }; @@ -61,7 +64,9 @@ export let postSignup = (req: Request, res: Response, next: NextFunction) => { const user = new User({ email, password, + userDoc: "document here" }); + User.findOne({ email }, (err, existingUser) => { if (err) { return next(err); } if (existingUser) { @@ -94,7 +99,8 @@ export let getLogin = (req: Request, res: Response) => { return res.redirect("/home"); } res.render("login.pug", { - title: "Log In" + title: "Log In", + user: req.user }); }; diff --git a/src/server/authentication/models/User.ts b/src/server/authentication/models/User.ts index ed2952e48..9e6c525c3 100644 --- a/src/server/authentication/models/User.ts +++ b/src/server/authentication/models/User.ts @@ -1,6 +1,5 @@ //@ts-ignore import * as bcrypt from "bcrypt-nodejs"; -import * as crypto from "crypto"; //@ts-ignore import * as mongoose from "mongoose"; var url = 'mongodb://localhost:27017/Dash' @@ -46,8 +45,7 @@ const userSchema = new mongoose.Schema({ password: String, passwordResetToken: String, passwordResetExpires: Date, - - workspaces: Array, + userDoc: String, facebook: String, twitter: String, diff --git a/src/server/index.ts b/src/server/index.ts index 7189b32a0..039d7f56a 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -13,6 +13,7 @@ import { FIELD_ID, Field } from '../fields/Field'; import { Database } from './database'; import { ServerUtils } from './ServerUtil'; import { ObjectID } from 'mongodb'; +import * as bcrypt from "bcrypt-nodejs"; import { Document } from '../fields/Document'; import * as io from 'socket.io' import * as passportConfig from './authentication/config/passport'; @@ -27,12 +28,15 @@ import flash = require('express-flash'); import * as bodyParser from 'body-parser'; import * as session from 'express-session'; import * as cookieParser from 'cookie-parser'; +import * as nodemailer from 'nodemailer'; import c = require("crypto"); const MongoStore = require('connect-mongo')(session); const mongoose = require('mongoose'); +import * as async from 'async'; const bluebird = require('bluebird'); import { performance } from 'perf_hooks' import * as path from 'path' +import User from './authentication/models/User'; const mongoUrl = 'mongodb://localhost:27017/Dash'; // mongoose.Promise = bluebird; @@ -106,6 +110,40 @@ app.get('/logout', getLogout); // *** +// FORGOT PASSWORD EMAIL HANDLING +app.post('/forgot', function (req, res, next) { + const email = req.body.email; + async.waterfall([ + function (done: any) { + const seed = new Uint16Array(); + seed.set([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + let token = crypto.getRandomValues(seed); + done(token); + }, + function (token: Uint16Array, done: any) { + User.findOne({ email }, function (err, user: User) { + if (!user) { + // NO ACCOUNT WITH SUBMITTED EMAIL + return res.redirect('/forgot'); + } + user.resetPasswordToken = token; + user.resetPasswordExpires = Date.now() + 3600000; // 1 HOUR + user.save(function (err: any) { + done(err, token, user); + }); + }); + }, + function (token: Uint16Array, user: User, done: any) { + const transport = nodemailer.createTransport('SMTP', { + auth: { + user: 'test.nodemailer@gmail.com', + pass: 'placeholder' + } + }); + } + ]) +}) + let FieldStore: ObservableMap = new ObservableMap(); app.get("/hello", (req, res) => { diff --git a/views/layout.pug b/views/layout.pug index fb22ae770..95a5a391f 100644 --- a/views/layout.pug +++ b/views/layout.pug @@ -12,6 +12,4 @@ html(lang='') link(rel='stylesheet', href='/css/main.css') body - - .container - block content \ No newline at end of file + block content \ No newline at end of file diff --git a/views/signup.pug b/views/signup.pug index 9863b453e..374710e6f 100644 --- a/views/signup.pug +++ b/views/signup.pug @@ -4,7 +4,6 @@ extends ./layout block content style include ./stylesheets/authentication.css - .page-header form.form-horizontal(id='signup-form', method='POST') input(type='hidden', name='_csrf', value=_csrf) .overlay(id='overlay_signup') -- cgit v1.2.3-70-g09d2 From 0d36924c90682c57e96c1e7bfd95a3cc10e6c662 Mon Sep 17 00:00:00 2001 From: Sam Wilkins Date: Mon, 25 Feb 2019 03:38:02 -0500 Subject: after pop, hard reset --- src/client/views/Main.tsx | 6 ++ src/server/authentication/controllers/user.ts | 135 +++++++++++++++++++++++++- src/server/authentication/models/User.ts | 4 +- src/server/index.ts | 68 ++----------- views/reset.pug | 22 +++++ views/signup.pug | 2 +- views/stylesheets/authentication.css | 6 +- 7 files changed, 176 insertions(+), 67 deletions(-) create mode 100644 views/reset.pug (limited to 'views/signup.pug') diff --git a/src/client/views/Main.tsx b/src/client/views/Main.tsx index cbc19d7fe..567f17752 100644 --- a/src/client/views/Main.tsx +++ b/src/client/views/Main.tsx @@ -171,6 +171,12 @@ function init() { right: '0px', width: '150px' }} onClick={() => UndoManager.Redo()}>Redo + ), document.getElementById('root')); }) diff --git a/src/server/authentication/controllers/user.ts b/src/server/authentication/controllers/user.ts index a496959d1..19cd09676 100644 --- a/src/server/authentication/controllers/user.ts +++ b/src/server/authentication/controllers/user.ts @@ -7,6 +7,10 @@ import * as request from "express-validator"; const flash = require("express-flash"); import * as session from "express-session"; import * as pug from 'pug'; +import * as async from 'async'; +import * as nodemailer from 'nodemailer'; +import c = require("crypto"); + /** * GET / @@ -46,8 +50,6 @@ export let postSignup = (req: Request, res: Response, next: NextFunction) => { req.assert("confirmPassword", "Passwords do not match").equals(req.body.password); req.sanitize("email").normalizeEmail({ gmail_remove_dots: false }); - req.flash("Working on something!!!"); - const errors = req.validationErrors(); if (errors) { @@ -146,4 +148,133 @@ export let getLogout = (req: Request, res: Response) => { sess.destroy((err) => { if (err) { console.log(err); } }); } res.redirect('/login'); +} + +export let getForgot = function (req: Request, res: Response) { + res.render("forgot.pug", { + title: "Recover Password", + user: req.user, + }); +} + +export let postForgot = function (req: Request, res: Response, next: NextFunction) { + const email = req.body.email; + async.waterfall([ + function (done: any) { + let token: string; + c.randomBytes(20, function (err: any, buffer: Buffer) { + if (err) { + done(null); + return; + } + done(null, buffer.toString('hex')); + }) + }, + function (token: Buffer, done: any) { + User.findOne({ email }, function (err, user: UserModel) { + if (!user) { + // NO ACCOUNT WITH SUBMITTED EMAIL + return res.redirect('/forgot'); + } + user.passwordResetToken = token.toString('utf8'); + console.log(user.passwordResetToken); + user.passwordResetExpires = new Date(Date.now() + 3600000); // 1 HOUR + user.save(function (err: any) { + done(null, token, user); + }); + }); + }, + function (token: Uint16Array, user: UserModel, done: any) { + const smtpTransport = nodemailer.createTransport({ + service: 'Gmail', + auth: { + user: 'brownptcdash@gmail.com', + pass: 'browngfx1' + } + }); + const mailOptions = { + to: user.email, + from: 'brownptcdash@gmail.com', + subject: 'Dash Password Reset', + text: 'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' + + 'Please click on the following link, or paste this into your browser to complete the process:\n\n' + + 'http://' + req.headers.host + '/reset/' + token + '\n\n' + + 'If you did not request this, please ignore this email and your password will remain unchanged.\n' + }; + smtpTransport.sendMail(mailOptions, function (err) { + // req.flash('info', 'An e-mail has been sent to ' + user.email + ' with further instructions.'); + done(null, err, 'done'); + }); + } + ], function (err) { + if (err) return next(err); + res.redirect('/forgot'); + }) +} + +export let getReset = function (req: Request, res: Response) { + User.findOne({ passwordResetToken: req.params.token, passwordResetExpires: { $gt: Date.now() } }, function (err, user: UserModel) { + if (!user || err) { + return res.redirect('/forgot'); + } + res.render("reset.pug", { + title: "Reset Password", + user: req.user, + }); + }); +} + +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, user: UserModel) { + if (!user || err) { + 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); + + if (req.validationErrors()) { + return res.redirect('back'); + } + + user.password = req.body.password; + user.passwordResetToken = undefined; + user.passwordResetExpires = undefined; + + user.save(function (err) { + req.logIn(user, function (err) { + if (err) { + console.log(err); + return; + } + }); + done(user, err); + }); + }); + }, + function (user: UserModel, done: any) { + console.log(`SENDING EMAIL TO ${user.email}`); + const smtpTransport = nodemailer.createTransport({ + service: 'Gmail', + auth: { + user: 'brownptcdash@gmail.com', + pass: 'browngfx1' + } + }); + const mailOptions = { + to: user.email, + from: 'brownptcdash@gmail.com', + 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' + }; + smtpTransport.sendMail(mailOptions, function (err) { + done(null, err); + }); + } + ], function (err) { + res.redirect('/login'); + }); } \ No newline at end of file diff --git a/src/server/authentication/models/User.ts b/src/server/authentication/models/User.ts index 30fcecd81..433e2f6c3 100644 --- a/src/server/authentication/models/User.ts +++ b/src/server/authentication/models/User.ts @@ -18,8 +18,8 @@ mongoose.connection.on('disconnected', function () { export type UserModel = mongoose.Document & { email: string, password: string, - passwordResetToken: string, - passwordResetExpires: Date, + passwordResetToken: string | undefined, + passwordResetExpires: Date | undefined, tokens: AuthToken[], profile: { diff --git a/src/server/index.ts b/src/server/index.ts index baf360ffa..f2b26afec 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -17,7 +17,7 @@ import * as bcrypt from "bcrypt-nodejs"; import { Document } from '../fields/Document'; import * as io from 'socket.io' import * as passportConfig from './authentication/config/passport'; -import { getLogin, postLogin, getSignup, postSignup, getLogout, getEntry } from './authentication/controllers/user'; +import { getLogin, postLogin, getSignup, postSignup, getLogout, getEntry, postReset, getForgot, postForgot, getReset } from './authentication/controllers/user'; const config = require('../../webpack.config'); const compiler = webpack(config); const port = 1050; // default port to listen @@ -28,11 +28,9 @@ import flash = require('express-flash'); import * as bodyParser from 'body-parser'; import * as session from 'express-session'; import * as cookieParser from 'cookie-parser'; -import * as nodemailer from 'nodemailer'; import c = require("crypto"); const MongoStore = require('connect-mongo')(session); const mongoose = require('mongoose'); -import * as async from 'async'; const bluebird = require('bluebird'); import { performance } from 'perf_hooks' import * as path from 'path' @@ -88,7 +86,6 @@ app.get("/home", (req, res) => { }); app.get("/getUserDocId", (req, res) => { - console.log(req.user) if (!req.user) { return; } @@ -119,64 +116,15 @@ app.get('/logout', getLogout); // *** -app.get('/forgot', function (req, res) { - res.render("forgot.pug", { - title: "Recover Password", - user: req.user, - }); -}) - // FORGOT PASSWORD EMAIL HANDLING -app.post('/forgot', function (req, res, next) { - const email = req.body.email; - async.waterfall([ - function (done: any) { - const seed = new Uint32Array(20); - let token = seed; - done(null, token); - }, - function (token: Uint32Array, done: any) { - User.findOne({ email }, function (err, user: UserModel) { - if (!user) { - // NO ACCOUNT WITH SUBMITTED EMAIL - return res.redirect('/forgot'); - } - user.passwordResetToken = token.toString(); - user.passwordResetExpires = new Date(Date.now() + 3600000); // 1 HOUR - user.save(function (err: any) { - done(null, token, user); - }); - }); - }, - function (token: Uint16Array, user: UserModel, done: any) { - const smptTransport = nodemailer.createTransport({ - service: 'Gmail', - auth: { - user: 'brownptcdash@gmail.com', - pass: 'browngfx1' - } - }); - const mailOptions = { - to: user.email, - from: 'brownptcdash@gmail.com', - subject: 'Dash Password Reset', - text: 'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' + - 'Please click on the following link, or paste this into your browser to complete the process:\n\n' + - 'http://' + req.headers.host + '/reset/' + token + '\n\n' + - 'If you did not request this, please ignore this email and your password will remain unchanged.\n' - }; - smptTransport.sendMail(mailOptions, function (err) { - // req.flash('info', 'An e-mail has been sent to ' + user.email + ' with further instructions.'); - done(null, err, 'done'); - }); - } - ], function (err) { - if (err) return next(err); - res.redirect('/forgot'); - }) -}) -let FieldStore: ObservableMap = new ObservableMap(); +app.get('/forgot', getForgot) +app.post('/forgot', postForgot) +// RESET PASSWORD EMAIL HANDLING +app.get('/reset/:token', getReset); +app.post('/reset/:token', postReset); + +let FieldStore: ObservableMap = new ObservableMap(); app.get("/hello", (req, res) => { res.send("

Hello

"); }) diff --git a/views/reset.pug b/views/reset.pug new file mode 100644 index 000000000..8b6fa952b --- /dev/null +++ b/views/reset.pug @@ -0,0 +1,22 @@ + +extends ./layout + +block content + style + include ./stylesheets/authentication.css + form.form-horizontal(id='reset-form', method='POST') + input(type='hidden', name='_csrf', value=_csrf) + .overlay(id='overlay_reset') + .inner.reset + h3.auth_header Reset Password + .form-group + .col-sm-7 + input.form-control(type='password', name='password', id='password', placeholder='Password', required) + .form-group + .col-sm-7 + input.form-control(type='password', name='confirmPassword', id='confirmPassword', placeholder='Confirm Password', required) + .form-group + .col-sm-offset-3.col-sm-7 + button.btn.btn-success(type='submit') + i.fa.fa-user-plus + | Reset \ No newline at end of file diff --git a/views/signup.pug b/views/signup.pug index 374710e6f..11b02a5eb 100644 --- a/views/signup.pug +++ b/views/signup.pug @@ -24,4 +24,4 @@ block content .col-sm-offset-3.col-sm-7 button.btn.btn-success(type='submit') i.fa.fa-user-plus - | Signup \ No newline at end of file + | Sign Up \ No newline at end of file diff --git a/views/stylesheets/authentication.css b/views/stylesheets/authentication.css index 0922ad730..bce8223ec 100644 --- a/views/stylesheets/authentication.css +++ b/views/stylesheets/authentication.css @@ -26,7 +26,8 @@ body { text-align: left; } -.login { +.login, +.reset { height: 220px; } @@ -46,7 +47,8 @@ body { font-style: oblique; } -#overlay_signup { +#overlay_signup, +#overlay_reset { height: 345px; } -- cgit v1.2.3-70-g09d2