From 088f9ea55ae60fada9cffeb1a5a0546897b431c8 Mon Sep 17 00:00:00 2001 From: knighthawk4227 Date: Wed, 7 May 2025 13:03:26 -0700 Subject: [PATCH] reset pass logic --- app.js | 52 ++++++++++++++++++++++++++++++++++++---- package-lock.json | 11 ++++++++- package.json | 3 ++- src/auth/forgotPass.js | 8 +++++-- src/views/forgotPass.ejs | 3 ++- src/views/login.ejs | 4 ++-- src/views/resetPass.ejs | 36 ++++++++++++++++++++++++++++ 7 files changed, 106 insertions(+), 11 deletions(-) create mode 100644 src/views/resetPass.ejs diff --git a/app.js b/app.js index a4f0263..9da8e44 100644 --- a/app.js +++ b/app.js @@ -72,10 +72,15 @@ app.get('/aboutUs', (req, res) => { }); app.get('/forgotPassword', (req, res) => { - res.render('forgotPass'); + res.render('forgotPass', { error: req.session.error, reset: req.session.reset }); return res.status(status.Ok); }); +app.get('reset', (req, res) => { + return res.render('resetPass'); +}) + +// Reset with token given to user via email app.get('/reset/:token', async (req, res) => { const token = req.params.token; @@ -88,13 +93,52 @@ app.get('/reset/:token', async (req, res) => { req.session.error = 'reset link not valid or has expired'; return res.redirect('/forgotPassword'); } + const error = req.session.error; + req.session.error = ''; + res.render('resetPassword', { token: token, - errMessage: req.session.error || '', + errMessage: error, }); }); -app.post('reset') +app.post('/resetLink', async (req, res) => { + const { token, password, confirmPassword, } = req.body; + + if (!token || !password || !confirmPassword) { + req.session.error = 'field may be missing'; + return res.redirect(`/reset/${token}`); + } + if (password !== confirmPassword) { + req.session.error = 'passwords do not match'; + return res.redirect(`/reset/${token}`); + } + const user = await users.findOne({ + resetToken: token, + resetTokenExpires: { $gt: Date.now() }, + }); + + if (!user) { + req.session.error = 'Reset link is invalid.'; + return res.redirect('/forgotPassword'); + } + const hashPassword = await bcrypt.hash(password, 12); + + await users.updateOne( + { + email: user.email + }, + { + $set: { + password: hashPassword, + resetToken: '', + resetTokenExpires: 0, + }, + } + ); + req.session.success = 'Password has been reset'; + res.redirect('/login'); +}); app.post('/api/location', async (req, res) => { const { latitude, longitude } = req.body; @@ -112,11 +156,11 @@ initDatabase().then(() => { // Import authentication handler app.use(require("./src/auth/authentication")(users)); + app.use(require('./src/auth/forgotPass')(users)); // Import middleware & apply to user routes const middleware = require("./src/auth/middleware")(users, plans); app.use(require('./src/router/user')(middleware, users, plans)); - app.use(require('./src/auth/forgetPass')(users)); // 404 handler app.get('/*splat', (req, res) => { diff --git a/package-lock.json b/package-lock.json index a416b45..fe45a7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,8 @@ "express": "^5.1.0", "express-session": "^1.18.1", "joi": "^17.13.3", - "mongodb": "^6.16.0" + "mongodb": "^6.16.0", + "nodemailer": "^7.0.2" }, "devDependencies": { "nodemon": "^3.1.10" @@ -1437,6 +1438,14 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/nodemailer": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.2.tgz", + "integrity": "sha512-SYsisPeLFYli5Q+BCGSyHT5CVvezPmQjHgINV9KVvVLV1aktuoD4E0Np9Q3ND9I481qIHzUQzVT+Tl/Tw7Ivdg==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/nodemon": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", diff --git a/package.json b/package.json index 08ad27d..8f0f856 100755 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "express": "^5.1.0", "express-session": "^1.18.1", "joi": "^17.13.3", - "mongodb": "^6.16.0" + "mongodb": "^6.16.0", + "nodemailer": "^7.0.2" }, "devDependencies": { "nodemon": "^3.1.10" diff --git a/src/auth/forgotPass.js b/src/auth/forgotPass.js index f83b392..8e4880c 100644 --- a/src/auth/forgotPass.js +++ b/src/auth/forgotPass.js @@ -14,9 +14,12 @@ const transporter = nodeMail.createTransport({ module.exports = (users) => { const router = express.Router(); - router.post('/resetPass', async (req, res) => { + router.post('/auth/resetPass', async (req, res) => { + console.log("we are inside of the post"); const { email } = req.body; const user = await users.findOne({ email }); + req.session.error = ''; + req.session.reset = ''; if (!user) { req.session.error = 'No user found' @@ -43,7 +46,7 @@ module.exports = (users) => { try { await transporter.sendMail(mailSend); req.session.reset = 'Reset link sent Check your email'; - res.redirect('/login'); + res.redirect('/forgotPassword'); } catch (err) { console.log('there was an error', err); res.status(500).send('email failed to send try again'); @@ -51,3 +54,4 @@ module.exports = (users) => { }); return router; } + diff --git a/src/views/forgotPass.ejs b/src/views/forgotPass.ejs index cd3a15f..8412d3a 100644 --- a/src/views/forgotPass.ejs +++ b/src/views/forgotPass.ejs @@ -2,7 +2,7 @@
-
+

Reset Password


@@ -12,6 +12,7 @@ class="border focus:border-gray-600 w-full rounded-md text-base px-2 py-1 focus:outline-none focus:ring-0 " placeholder="Enter Email" />
+
<%= error%>
- Forgot Password? + Forgot Password?
@@ -41,4 +41,4 @@
-<%- include("./partials/footer") %> \ No newline at end of file +<%- include("./partials/footer") %> diff --git a/src/views/resetPass.ejs b/src/views/resetPass.ejs new file mode 100644 index 0000000..d923d50 --- /dev/null +++ b/src/views/resetPass.ejs @@ -0,0 +1,36 @@ +<%- include("./partials/fileHeader") %> + +
+
+ +
+

Reset Password

+
+ +
+ + +
+
+ + +
+ <% if (typeof errMessage !== 'undefined') { %> +
+ <%= errMessage %> +
+ <% } %> +
+ +
+
+ +
+
+<%- include("./partials/footer") %>