reset password complete

This commit is contained in:
Alessandro Ferro 2024-03-26 17:05:17 +01:00
parent 9561b874a2
commit 68dafe32d1
3 changed files with 113 additions and 11 deletions

View File

@ -48,7 +48,7 @@ async function resetPassword(password, secret) {
// Delete all the requests associated with that e-mail // Delete all the requests associated with that e-mail
await tr('RequestResetPassword').where({ await tr('RequestResetPassword').where({
email email: request.email
}).del(); }).del();
}); });
} }

View File

@ -44,8 +44,8 @@ async function reset(req, res) {
const diffMilliseconds = Date.now() - requester.time_of_request.getTime(); const diffMilliseconds = Date.now() - requester.time_of_request.getTime();
// Check whether the request was not performed more than 30 minutes ago // Check whether the request was not performed more than 30 minutes ago
if (diffMilliseconds / (1000 * 60) <= 30) { if (diffMilliseconds / (1000 * 60) <= 30) {
const newPassword = await bcrypt.hash(req.body.password, 10); const newPassword = await bcrypt.hash(req.body.password.trim(), 10);
ResetPassword.resetPassword(newPassword, req.body.secret); await ResetPassword.resetPassword(newPassword, req.body.secret);
return res.status(204).send(); return res.status(204).send();
} }
} }

View File

@ -8,12 +8,11 @@
</script> </script>
</head> </head>
<body> <body style="display: none;">
<div class="alert alert-success" role="alert" style="display: none;"> <div class="alert alert-success" role="alert" id="successAlert" style="display: none;">
An e-mail has been sent to reset your password
</div> </div>
<div class="alert alert-danger" role="alert" style="display: none;">
This is a danger alert—check it out! <div class="alert alert-danger" role="alert" id="errorAlert" style="display: none;">
</div> </div>
<div class="container d-flex flex-column"> <div class="container d-flex flex-column">
<div class="row align-items-center justify-content-center <div class="row align-items-center justify-content-center
@ -27,14 +26,18 @@
<form> <form>
<div class="mb-3"> <div class="mb-3">
<input type="password" id="password" class="form-control" name="password" <input type="password" id="password" class="form-control" name="password"
placeholder="Your new password"> placeholder="Your new password" onblur="passwordLosesFocus();">
<div class="invalid-feedback" id="password-invalid-feedback">
</div>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<input type="password" id="confirmPassword" class="form-control" name="confirmPassword" <input type="password" id="confirmPassword" class="form-control" name="confirmPassword"
placeholder="Confirm password"> placeholder="Confirm password" onblur="confirmPasswordLosesFocus();">
<div class="invalid-feedback" id="confirmpassword-invalid-feedback">
</div>
</div> </div>
<div class="mb-3 d-grid"> <div class="mb-3 d-grid">
<button type="submit" class="btn btn-primary"> <button type="button" class="btn btn-primary" onclick="resetPassword();">
Reset Reset
</button> </button>
</div> </div>
@ -45,6 +48,105 @@
</div> </div>
</div> </div>
<script src="../js/constants.js"></script>
<script src="../js/utils.js"></script>
<script>
window.addEventListener("load", function () {
const secret = new URLSearchParams(window.location.search).get('secret');
if(!secret){
alert('Invalid URL');
}
else{
document.body.style.display = "block"; // Show page
}
});
async function resetPassword() {
if (!validateFields()) {
return;
}
const password = document.getElementById("password").value;
const secret = new URLSearchParams(window.location.search).get('secret');
const response = await fetch(`${API_URL}/resetpassword/reset`, {
method: "POST",
body: JSON.stringify({
password,
secret
}),
headers: createHeaders(null)
});
if (response.ok) {
showSuccessAlert('Your password has been changed. You can now <a href="/login.html">log in</a>');
} else {
showErrorAlert('URL either not valid or the link has expired. Please require another <a href="forgot-password.html">password reset</a>');
}
}
function passwordLosesFocus() {
}
function confirmPasswordLosesFocus() {
}
function validateFields() {
const passwordField = document.getElementById("password");
const confirmPasswordField = document.getElementById("confirmPassword");
var isFormValid = true;
if (!passwordField.value) {
passwordField.classList.add("is-invalid");
document.getElementById('password-invalid-feedback').innerHTML = 'Please fill out this field';
isFormValid = false;
} else if (passwordField.value.length < 5) {
passwordField.classList.add("is-invalid");
document.getElementById('password-invalid-feedback').innerHTML =
'Password must be at least 5 characters';
isFormValid = false;
} else if (passwordField.value != confirmPasswordField.value) {
passwordField.classList.add("is-invalid");
document.getElementById('password-invalid-feedback').innerHTML = 'Passwords do not match';
isFormValid = false;
}
if (!confirmPasswordField.value) {
confirmPasswordField.classList.add("is-invalid");
document.getElementById('confirmpassword-invalid-feedback').innerHTML = 'Please fill out this field';
isFormValid = false;
} else if (confirmPasswordField.value.length < 5) {
confirmPasswordField.classList.add("is-invalid");
document.getElementById('confirmpassword-invalid-feedback').innerHTML =
'Password must be at least 5 characters';
isFormValid = false;
} else if (passwordField.value != confirmPasswordField.value) {
confirmPasswordField.classList.add("is-invalid");
document.getElementById('confirmpassword-invalid-feedback').innerHTML = 'Passwords do not match';
isFormValid = false;
}
if (isFormValid) {
confirmPasswordField.classList.remove("is-invalid");
passwordField.classList.remove("is-invalid");
}
return isFormValid;
}
function showSuccessAlert(message) {
const successAlert = document.getElementById('successAlert');
successAlert.innerHTML = message;
successAlert.style.display = 'block';
}
function showErrorAlert(message) {
const errorAlert = document.getElementById('errorAlert');
errorAlert.innerHTML = message;
errorAlert.style.display = 'block';
}
</script>
</body> </body>
</html> </html>