From fea986a841f83b6518334e680ef109e445f07d2b Mon Sep 17 00:00:00 2001
From: newtbot
Date: Wed, 31 Jan 2024 03:17:24 +0800
Subject: [PATCH] Fix file paths and add password reset functionality
---
consumerWebsite/functions/api.js | 33 ++++++++++++++++---
consumerWebsite/functions/isValid.js | 14 ++++++++-
consumerWebsite/functions/nodeMail.js | 2 +-
consumerWebsite/functions/user.js | 21 ++++++++++++-
consumerWebsite/routes/auth.js | 39 ++++++++++++++++++-----
consumerWebsite/routes/render.js | 30 +++++++++++++++++-
consumerWebsite/views/bot.ejs | 2 +-
consumerWebsite/views/checkemail.ejs | 2 ++
consumerWebsite/views/logintop.ejs | 8 ++---
consumerWebsite/views/resetpassword.ejs | 42 ++++++++++++++++++-------
consumerWebsite/views/signuplogin.ejs | 3 +-
consumerWebsite/views/top.ejs | 12 +++----
12 files changed, 169 insertions(+), 39 deletions(-)
diff --git a/consumerWebsite/functions/api.js b/consumerWebsite/functions/api.js
index 4a7a3f5..1103582 100644
--- a/consumerWebsite/functions/api.js
+++ b/consumerWebsite/functions/api.js
@@ -2,7 +2,7 @@ const { tokenModel } = require("../database/model/tokenModel.js");
const { userModel } = require("../database/model/userModel");
const { hash, compareHash } = require("./bcrypt.js");
const { generateUUID } = require("./generateUUID.js");
-const { isValid } = require("./isValid");
+const { isValid , resetIsValid } = require("./isValid");
async function getTokenByToken(token) {
const splitAuthToken = token.split("-");
@@ -53,7 +53,7 @@ async function addToken(userId, permission, isKey ,expiry) {
async function addPasswordResetToken(data , token){
let hashtoken = await hash(token);
let currentDate = new Date();
- let tokenToLive = new Date(currentDate.getTime() + 15 * 60000);
+ let tokenToLive = new Date(currentDate.getTime() + 5 * 60000);
let tokenRes = await tokenModel.create({
userid: data.id,
@@ -62,7 +62,7 @@ async function addPasswordResetToken(data , token){
isKey: "isNotKey",
expiration: tokenToLive,
});
- return true;
+ return tokenRes.id
}
async function checkToken(id) {
@@ -77,6 +77,31 @@ async function checkToken(id) {
return tokenRes;
}
+async function checkTokenByrowID(token) {
+ if (!token) return false;
+ //split
+ const splitAuthToken = token.split("-");
+ const rowid = splitAuthToken[0];
+ const suppliedToken = splitAuthToken.slice(1).join("-");
+
+ let tokenRes = await tokenModel.findByPk(rowid);
+ //console.log(tokenRes);
+
+ if (!tokenRes) return false;
+
+ if (!compareHash(suppliedToken, tokenRes.token)) return false;
-module.exports = { addToken, getTokenByToken , checkToken , addPasswordResetToken};
+ //pass tokemRes.expiration to isValid
+ if (!isValid(tokenRes.expiration)) {
+ //add boolean to token table
+ tokenRes.destroy();
+ return false;
+ }
+
+ return tokenRes;
+
+}
+
+
+module.exports = { addToken, getTokenByToken , checkToken , addPasswordResetToken , checkTokenByrowID};
diff --git a/consumerWebsite/functions/isValid.js b/consumerWebsite/functions/isValid.js
index ae39ce1..394cf16 100644
--- a/consumerWebsite/functions/isValid.js
+++ b/consumerWebsite/functions/isValid.js
@@ -11,4 +11,16 @@ function isValid(time) {
}
-module.exports = { isValid };
+//5 minutes
+function resetIsValid(time) {
+ if (
+ Math.floor(new Date(time).getTime() / 1000) <
+ Math.floor(new Date().getTime() / 1000)
+ ) {
+ return false;
+ }
+ return true;
+}
+
+
+module.exports = { isValid , resetIsValid };
diff --git a/consumerWebsite/functions/nodeMail.js b/consumerWebsite/functions/nodeMail.js
index a94bde8..bde09b3 100644
--- a/consumerWebsite/functions/nodeMail.js
+++ b/consumerWebsite/functions/nodeMail.js
@@ -84,7 +84,7 @@ async function sendResetPasswordEmail(email, resetToken) {
subject: "Reset Password",
html: `
Reset Password
- Reset Password Link: Reset Password Link
+ Reset Password Link: Reset Password Link
From: Eco Saver
Kindly click on the link to reset your password!
Regards,
diff --git a/consumerWebsite/functions/user.js b/consumerWebsite/functions/user.js
index 90d05d2..42ac76f 100644
--- a/consumerWebsite/functions/user.js
+++ b/consumerWebsite/functions/user.js
@@ -163,6 +163,23 @@ async function checkEmailDetails(email) {
}
+async function resetPass(userid , data ){
+ let hashed = await hash(data.password);
+ let updateUser = await userModel.update(
+ {
+ password: hashed,
+ },
+ {
+ where: {
+ id: userid,
+ },
+ }
+ );
+ if (!updateUser) return false;
+ return true;
+
+}
+
module.exports = {
getUserByID,
@@ -171,5 +188,7 @@ module.exports = {
loginUser,
updateProfile,
checkEmail,
- checkEmailDetails
+ checkEmailDetails,
+ resetPass,
+
};
\ No newline at end of file
diff --git a/consumerWebsite/routes/auth.js b/consumerWebsite/routes/auth.js
index 14116b7..32f2657 100644
--- a/consumerWebsite/routes/auth.js
+++ b/consumerWebsite/routes/auth.js
@@ -3,13 +3,17 @@ const {
loginUser,
checkEmail,
checkEmailDetails,
+ resetPass,
} = require("../functions/user");
const { sendContactEmail } = require("../functions/nodeMail");
const { generateUUID } = require("../functions/generateUUID");
const { addPasswordResetToken } = require("../functions/api");
const { sendResetPasswordEmail } = require("../functions/nodeMail");
+const { checkTokenByrowID } = require("../functions/api");
+
const express = require("express");
+const { render } = require("ejs");
const router = express.Router();
// /user/register
@@ -91,13 +95,16 @@ router.post("/checkemail", async (req, res, next) => {
let data = await checkEmailDetails(req.body.email);
//console.log(data);
//token generation and insert into token table
- const token = await generateUUID();
+ let token = await generateUUID();
let tokenRes = await addPasswordResetToken(data, token);
//email user with temp token link
if (!tokenRes) return false;
+ //apend table id to token
+ token = tokenRes + "-" + token;
+
//email logic to send reset password link
sendResetPasswordEmail(req.body.email, token);
@@ -111,15 +118,33 @@ router.post("/checkemail", async (req, res, next) => {
}
});
-router.get("/resetpassword/:token", async (req, res, next) => {
- //pass token to reset password page
-
-});
//reset password
-router.post("/resetpassword", async (req, res, next) => {
+router.post("/resetpassword/:token", async (req, res, next) => {
+ console.log(req.body);
+ console.log(req.params.token);
+
+ //if token is valid
+ let tokenRes = await checkTokenByrowID(req.params.token);
+
+ if (!tokenRes) {
+ let error = new Error("Token not found");
+ error.status = 400;
+ return next(error);
+ }
+ //token is valid and reset password
+ else{
+ let Res = await resetPass(tokenRes.userid, req.body);
+ if (!Res) return false;
+ else{
+ res.json({
+ message: "Password reset successfully",
+ });
+ tokenRes.destroy();
+ }
+ }
+
});
module.exports = router;
-
diff --git a/consumerWebsite/routes/render.js b/consumerWebsite/routes/render.js
index a892814..9b0bac0 100644
--- a/consumerWebsite/routes/render.js
+++ b/consumerWebsite/routes/render.js
@@ -1,4 +1,5 @@
"use strict";
+const { checkTokenByrowID } = require("../functions/api");
var router = require("express").Router();
@@ -33,7 +34,7 @@ router.get("/forgotpassword", function (req, res, next) {
res.render("forgotpassword");
});
-//resetted password page
+//resetting password page
router.get("/resetpassword", function (req, res, next) {
res.render("resetpassword");
});
@@ -63,4 +64,31 @@ router.get("/sensor-data", function (req, res, next) {
res.render("sensor-data");
});
+//reset password page
+router.get("/resetpassword/:token", async (req, res, next) => {
+ try{
+ //pass token to reset password page
+ //console.log(req.params.token);
+
+ //check if token is valid
+ let tokenRes = await checkTokenByrowID(req.params.token);
+
+ if (!tokenRes) {
+ let error = new Error("Token not found");
+ error.status = 400;
+ return next(error);
+ }
+ else {
+ let token = req.params.token;
+ console.log(token);
+ res.render("resetpassword", { token: token });
+ }
+
+ }catch(error){
+ console.error(error);
+ next(error);
+ }
+});
+
+
module.exports = router;
\ No newline at end of file
diff --git a/consumerWebsite/views/bot.ejs b/consumerWebsite/views/bot.ejs
index 4bb9f93..ac8308c 100644
--- a/consumerWebsite/views/bot.ejs
+++ b/consumerWebsite/views/bot.ejs
@@ -81,7 +81,7 @@
-
+