reset pass logic

This commit is contained in:
knighthawk4227 committed 2025-05-07 13:03:26 -07:00
1 parent 617fc8d877
commit 088f9ea55a
7 files changed
+106 -11

No files matched your search

+48 -4
View File
@@ -72,10 +72,15 @@ app.get('/aboutUs', (req, res) => {
}); });
app.get('/forgotPassword', (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); 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) => { app.get('/reset/:token', async (req, res) => {
const token = req.params.token; 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'; req.session.error = 'reset link not valid or has expired';
return res.redirect('/forgotPassword'); return res.redirect('/forgotPassword');
} }
const error = req.session.error;
req.session.error = '';
res.render('resetPassword', { res.render('resetPassword', {
token: token, 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) => { app.post('/api/location', async (req, res) => {
const { latitude, longitude } = req.body; const { latitude, longitude } = req.body;
@@ -112,11 +156,11 @@ initDatabase().then(() => {
// Import authentication handler // Import authentication handler
app.use(require("./src/auth/authentication")(users)); app.use(require("./src/auth/authentication")(users));
app.use(require('./src/auth/forgotPass')(users));
// Import middleware & apply to user routes // Import middleware & apply to user routes
const middleware = require("./src/auth/middleware")(users, plans); const middleware = require("./src/auth/middleware")(users, plans);
app.use(require('./src/router/user')(middleware, users, plans)); app.use(require('./src/router/user')(middleware, users, plans));
app.use(require('./src/auth/forgetPass')(users));
// 404 handler // 404 handler
app.get('/*splat', (req, res) => { app.get('/*splat', (req, res) => {
+10 -1
View File
@@ -17,7 +17,8 @@
"express": "^5.1.0", "express": "^5.1.0",
"express-session": "^1.18.1", "express-session": "^1.18.1",
"joi": "^17.13.3", "joi": "^17.13.3",
"mongodb": "^6.16.0" "mongodb": "^6.16.0",
"nodemailer": "^7.0.2"
}, },
"devDependencies": { "devDependencies": {
"nodemon": "^3.1.10" "nodemon": "^3.1.10"
@@ -1437,6 +1438,14 @@
"webidl-conversions": "^3.0.0" "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": { "node_modules/nodemon": {
"version": "3.1.10", "version": "3.1.10",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz",
+2 -1
View File
@@ -26,7 +26,8 @@
"express": "^5.1.0", "express": "^5.1.0",
"express-session": "^1.18.1", "express-session": "^1.18.1",
"joi": "^17.13.3", "joi": "^17.13.3",
"mongodb": "^6.16.0" "mongodb": "^6.16.0",
"nodemailer": "^7.0.2"
}, },
"devDependencies": { "devDependencies": {
"nodemon": "^3.1.10" "nodemon": "^3.1.10"
+6 -2
View File
@@ -14,9 +14,12 @@ const transporter = nodeMail.createTransport({
module.exports = (users) => { module.exports = (users) => {
const router = express.Router(); 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 { email } = req.body;
const user = await users.findOne({ email }); const user = await users.findOne({ email });
req.session.error = '';
req.session.reset = '';
if (!user) { if (!user) {
req.session.error = 'No user found' req.session.error = 'No user found'
@@ -43,7 +46,7 @@ module.exports = (users) => {
try { try {
await transporter.sendMail(mailSend); await transporter.sendMail(mailSend);
req.session.reset = 'Reset link sent Check your email'; req.session.reset = 'Reset link sent Check your email';
res.redirect('/login'); res.redirect('/forgotPassword');
} catch (err) { } catch (err) {
console.log('there was an error', err); console.log('there was an error', err);
res.status(500).send('email failed to send try again'); res.status(500).send('email failed to send try again');
@@ -51,3 +54,4 @@ module.exports = (users) => {
}); });
return router; return router;
} }
+2 -1
View File
@@ -2,7 +2,7 @@
<main> <main>
<div class="flex justify-center items-center h-screen"> <div class="flex justify-center items-center h-screen">
<form action="/resetPass" method="POST"> <form action="/auth/resetPass" method="POST">
<div class="w-96 p-6 shadow-1g bg-white rounded-md"> <div class="w-96 p-6 shadow-1g bg-white rounded-md">
<h1 class="text-3xl block text-center font-semibold">Reset Password</h1> <h1 class="text-3xl block text-center font-semibold">Reset Password</h1>
<hr class="mt-3"> <hr class="mt-3">
@@ -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 " 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" /> placeholder="Enter Email" />
</div> </div>
<div class="text-red-800 font-bold" id="forgor"> <%= error%></div>
<div class="mt-5"> <div class="mt-5">
<button type="submit" <button type="submit"
class="cursor-pointer border-2 border-gray-600 bg-blue-600 text-white py-1 w-full rounded-md hover:bg-transparent hover:text-indigo-700 font-semibold">Send class="cursor-pointer border-2 border-gray-600 bg-blue-600 text-white py-1 w-full rounded-md hover:bg-transparent hover:text-indigo-700 font-semibold">Send
+2 -2
View File
@@ -25,7 +25,7 @@
<label>Remember me</label> <label>Remember me</label>
</div> </div>
<div> <div>
<a href="#" class="text-indigo-600 font-semibold">Forgot Password? </a> <a href="/forgotPassword" class="text-indigo-600 font-semibold">Forgot Password? </a>
</div> </div>
</div> </div>
<div class="mt-5"> <div class="mt-5">
@@ -41,4 +41,4 @@
</div> </div>
</main> </main>
<%- include("./partials/footer") %> <%- include("./partials/footer") %>
+36
View File
@@ -0,0 +1,36 @@
<%- include("./partials/fileHeader") %>
<main>
<div class="flex justify-center items-center h-screen">
<form action="/resetLink" method="POST">
<div class="w-96 p-6 shadow-1g bg-white rounded-md">
<h1 class="text-3xl block text-center font-semibold">Reset Password</h1>
<hr class="mt-3">
<input type="hidden" name="token" value="<%=token %>" >
<div class="mt-3">
<label for="password" class="block text-base mb-2">New Password:</label>
<input type="text" id="password" name="password"
class="border focus:border-gray-600 w-full rounded-md text-base px-2 py-1 focus:outline-none focus:ring-0 "
placeholder="Enter Password" />
</div>
<div class="mt-3">
<label for="password" class="block text-base mb-2">Confirm Password:</label>
<input type="text" id="Repassword" name="confirmPassword"
class="border focus:border-gray-600 w-full rounded-md text-base px-2 py-1 focus:outline-none focus:ring-0 "
placeholder="ReType Password" />
</div>
<% if (typeof errMessage !== 'undefined') { %>
<div class="text-red-800 font-bold" id="forgor">
<%= errMessage %>
</div>
<% } %>
<div class="mt-5">
<button type="submit"
class="cursor-pointer border-2 border-gray-600 bg-blue-600 text-white py-1 w-full rounded-md hover:bg-transparent hover:text-indigo-700 font-semibold">Send
reset Link</button>
</div>
</div>
</form>
</div>
</main>
<%- include("./partials/footer") %>