Password changing functionality.
Signed-off-by: Armored Dragon <publicmail@armoreddragon.com>account-personalization
parent
0dd6a7fa00
commit
5b0f0121ac
|
@ -5,6 +5,7 @@ const { S3Client, PutObjectCommand, GetObjectCommand, DeleteObjectCommand, ListO
|
||||||
const { getSignedUrl } = require("@aws-sdk/s3-request-presigner");
|
const { getSignedUrl } = require("@aws-sdk/s3-request-presigner");
|
||||||
let s3;
|
let s3;
|
||||||
const crypto = require("crypto");
|
const crypto = require("crypto");
|
||||||
|
const bcrypt = require("bcrypt");
|
||||||
const validate = require("../form_validation");
|
const validate = require("../form_validation");
|
||||||
const permissions = require("../permissions");
|
const permissions = require("../permissions");
|
||||||
const md = require("markdown-it")()
|
const md = require("markdown-it")()
|
||||||
|
@ -98,7 +99,6 @@ async function getUser({ user_id, username, include_password = false }) {
|
||||||
|
|
||||||
return { success: true, data: user };
|
return { success: true, data: user };
|
||||||
}
|
}
|
||||||
// TODO: Rename patchUser
|
|
||||||
async function editUser({ requester_id, user_id, user_content }) {
|
async function editUser({ requester_id, user_id, user_content }) {
|
||||||
let user = await getUser({ user_id: user_id });
|
let user = await getUser({ user_id: user_id });
|
||||||
if (!user.success) return _r(false, "User not found");
|
if (!user.success) return _r(false, "User not found");
|
||||||
|
@ -116,6 +116,11 @@ async function editUser({ requester_id, user_id, user_content }) {
|
||||||
let formatted = {};
|
let formatted = {};
|
||||||
formatted[user_content.setting_name] = user_content.value;
|
formatted[user_content.setting_name] = user_content.value;
|
||||||
|
|
||||||
|
if (formatted.password) {
|
||||||
|
// TODO: Validate password
|
||||||
|
formatted.password = await bcrypt.hash(formatted.password, 10);
|
||||||
|
}
|
||||||
|
|
||||||
await prisma.user.update({ where: { id: user.id }, data: formatted });
|
await prisma.user.update({ where: { id: user.id }, data: formatted });
|
||||||
return _r(true);
|
return _r(true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,3 +121,41 @@ input:checked + .slider:before {
|
||||||
.slider.round:before {
|
.slider.round:before {
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dialog {
|
||||||
|
border-radius: 5px;
|
||||||
|
border: 0;
|
||||||
|
min-width: 300px;
|
||||||
|
}
|
||||||
|
dialog .title {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
dialog .entry {
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
dialog .entry input {
|
||||||
|
width: 100%;
|
||||||
|
margin: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
dialog .status {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
color: red;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
dialog .horizontal-button-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
dialog .horizontal-button-container * {
|
||||||
|
flex-grow: 1;
|
||||||
|
margin: 0 0.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
dialog::backdrop {
|
||||||
|
background-color: rgba(0, 0, 0, 0.5);
|
||||||
|
}
|
|
@ -125,3 +125,44 @@ input:checked + .slider:before {
|
||||||
.slider.round:before {
|
.slider.round:before {
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dialog {
|
||||||
|
border-radius: 5px;
|
||||||
|
border: 0;
|
||||||
|
min-width: 300px;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry {
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
input {
|
||||||
|
width: 100%;
|
||||||
|
margin: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.status {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
color: red;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.horizontal-button-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
* {
|
||||||
|
flex-grow: 1;
|
||||||
|
margin: 0 0.1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dialog::backdrop {
|
||||||
|
background-color: rgba(0, 0, 0, 0.5);
|
||||||
|
}
|
||||||
|
|
|
@ -8,6 +8,30 @@
|
||||||
<title>Yet-Another-Blog</title>
|
<title>Yet-Another-Blog</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<dialog id="change-password-dialog">
|
||||||
|
<div class="title">
|
||||||
|
<span>Change Password</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="entry">
|
||||||
|
<div>Current password</div>
|
||||||
|
<input id="cp-current" type="password" oninput="changePasswordInputUpdate()" />
|
||||||
|
</div>
|
||||||
|
<div class="entry">
|
||||||
|
<div>New password</div>
|
||||||
|
<input id="cp-new-1" type="password" oninput="changePasswordInputUpdate()" />
|
||||||
|
</div>
|
||||||
|
<div class="entry">
|
||||||
|
<div>Confirm password</div>
|
||||||
|
<input id="cp-new-2" type="password" oninput="changePasswordInputUpdate()" />
|
||||||
|
</div>
|
||||||
|
<div class="status">Please enter your current password.</div>
|
||||||
|
<div class="horizontal-button-container">
|
||||||
|
<button class="button good" onclick="sendPasswordUpdate()">Accept</button>
|
||||||
|
<button id="cp-cancel" class="button bad">Cancel</button>
|
||||||
|
</div>
|
||||||
|
</dialog>
|
||||||
|
|
||||||
<%- include("partials/header.ejs") %>
|
<%- include("partials/header.ejs") %>
|
||||||
<div class="page">
|
<div class="page">
|
||||||
<div class="page-center">
|
<div class="page-center">
|
||||||
|
@ -21,7 +45,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="setting">
|
<div class="setting">
|
||||||
<div class="title">Change Password</div>
|
<div class="title">Change Password</div>
|
||||||
<button class="button bad"><span>Open Dialog</span></button>
|
<button id="change-password-button" class="button bad"><span>Open Dialog</span></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting">
|
<div class="setting">
|
||||||
<div class="title">Change Profile Picture</div>
|
<div class="title">Change Profile Picture</div>
|
||||||
|
|
|
@ -8,5 +8,30 @@ async function changeValue(setting_name, element) {
|
||||||
|
|
||||||
// TODO: On failure, notify the user
|
// TODO: On failure, notify the user
|
||||||
if (response.body.success) {
|
if (response.body.success) {
|
||||||
|
alert("Successfully changed password");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const change_password_dialog = qs("#change-password-dialog");
|
||||||
|
|
||||||
|
qs("#change-password-button").addEventListener("click", () => change_password_dialog.showModal());
|
||||||
|
qs("#cp-cancel").addEventListener("click", () => change_password_dialog.close());
|
||||||
|
|
||||||
|
function changePasswordInputUpdate() {
|
||||||
|
const status = qs("#change-password-dialog .status");
|
||||||
|
const current_password = qs("#cp-current");
|
||||||
|
const new_password_1 = qs("#cp-new-1");
|
||||||
|
const new_password_2 = qs("#cp-new-2");
|
||||||
|
|
||||||
|
if (current_password.value === "") return (status.innerText = "Please enter your current password.");
|
||||||
|
|
||||||
|
if (new_password_1.value !== new_password_2.value) return (status.innerText = "New password does not match.");
|
||||||
|
|
||||||
|
return (status.innerHTML = " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendPasswordUpdate() {
|
||||||
|
const new_password_1 = qs("#cp-new-1");
|
||||||
|
// Check fields match
|
||||||
|
// Send post update
|
||||||
|
changeValue("password", new_password_1);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue