Files
PasswordManager/public/home.js

197 lines
5.4 KiB
JavaScript
Raw Normal View History

2025-11-26 21:10:22 -05:00
import { postData, verifyLogin } from "./client.js";
const token = window.localStorage.getItem("token");
2026-03-09 16:31:40 -04:00
const infoForm = document.getElementById("infoForm");
const error = document.querySelector(".error");
const errorMessage = document.querySelector(".error p");
const success = document.querySelector(".success");
const successMessage = document.querySelector(".success p");
2025-11-28 19:40:43 -05:00
2026-03-09 22:15:47 +00:00
const logoutLink = document.querySelector("#logout");
//logoutLink.onclick = logout;
2026-03-09 16:31:40 -04:00
openKeyDB();
const encryptionKey = await getEncryptionKey()
2025-11-26 21:10:22 -05:00
2026-03-09 16:31:40 -04:00
//console.log(`Encryption Key:`);
//console.log(encryptionKey);
2026-03-09 21:34:55 +00:00
//
await verifyLogin();
2025-11-28 11:10:09 -05:00
2026-03-09 16:31:40 -04:00
async function handlePasswordSubmission(e) {
console.log(await verifyLogin());
e.preventDefault();
const formData = {
name: document.getElementById("name").value,
password: document.getElementById("password").value,
2025-11-28 11:15:58 -05:00
}
2026-03-09 16:31:40 -04:00
const set = document.getElementById("set").checked;
2025-11-28 11:15:58 -05:00
2026-03-09 16:31:40 -04:00
console.log(set);
2025-11-28 11:10:09 -05:00
2026-03-09 16:31:40 -04:00
if (set) {
//console.log("formdata SET so SETTING");
setPassword(formData.name, formData.password);
} else {
//console.log("formdata GET so GETTING");
getPassword(formData.name);
}
}
2025-11-28 11:10:09 -05:00
2026-03-09 16:31:40 -04:00
infoForm.onsubmit = handlePasswordSubmission;
2025-11-28 11:10:09 -05:00
2026-03-09 16:31:40 -04:00
async function setPassword(name, password) {
const encoder = new TextEncoder();
const encodedData = encoder.encode(password);
2025-11-28 11:10:09 -05:00
2026-03-09 16:31:40 -04:00
const iv = window.crypto.getRandomValues(new Uint8Array(12));
2025-11-28 11:10:09 -05:00
2026-03-09 16:31:40 -04:00
const cyphertextBuffer = await window.crypto.subtle.encrypt(
{
name: "AES-GCM",
iv: iv
},
encryptionKey,
encodedData
);
2025-11-28 11:10:09 -05:00
2026-03-09 16:31:40 -04:00
const data = {
name: name,
iv: bufferToBase64(iv),
password: bufferToBase64(cyphertextBuffer)
}
2025-11-28 11:10:09 -05:00
2026-03-09 16:31:40 -04:00
var resultObject = await postData("/setPassword", data, token);
2025-11-28 11:10:09 -05:00
2026-03-09 16:31:40 -04:00
if (resultObject.message.includes("UNIQUE")) {
resultObject = await postData("/updatePassword", data, token);
}
2025-11-28 11:10:09 -05:00
2026-03-09 16:31:40 -04:00
if (resultObject.success) {
error.style.display = "none";
success.style.display = "flex";
successMessage.innerHTML = `Password for "${name}" successfully set to "${password}"`
} else {
errorMessage.innerHTML = resultObject.message;
success.style.display = "none";
error.style.display = "flex";
}
}
2025-11-28 11:10:09 -05:00
2026-03-09 16:31:40 -04:00
async function getPassword(name) {
const data = {
name: name
}
const resultObject = await postData("/getPassword", data, token);
if (resultObject.success) {
error.style.display = "none";
success.style.display = "flex";
} else {
errorMessage.innerHTML = resultObject.message;
success.style.display = "none";
error.style.display = "flex";
return;
2025-11-28 11:10:09 -05:00
}
2026-03-09 16:31:40 -04:00
const ivBuffer = base64ToBuffer(resultObject.iv);
const cyphertextBuffer = base64ToBuffer(resultObject.password);
const decryptedBuffer = await window.crypto.subtle.decrypt(
{
name: "AES-GCM",
iv: ivBuffer
},
encryptionKey,
cyphertextBuffer
);
const decoder = new TextDecoder();
const pw = decoder.decode(decryptedBuffer);
document.getElementById("password").value = pw;
//console.log("Password: " + pw);
2025-11-26 21:10:22 -05:00
2026-03-09 16:31:40 -04:00
//console.log(resultObject);
2025-11-26 21:10:22 -05:00
2026-03-09 16:31:40 -04:00
successMessage.innerHTML = `Password for "${name}" is "${pw}"`
}
2025-11-26 21:10:22 -05:00
2026-03-09 16:31:40 -04:00
function openKeyDB() {
return new Promise((resolve, reject) => {
const request = indexedDB.open("PasswordManagerVault", 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains("cryptoKeys")) {
db.createObjectStore("cryptoKeys");
}
};
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
2025-11-26 21:10:22 -05:00
});
2026-03-09 16:31:40 -04:00
}
async function saveEncryptionKey(cryptoKeyObject) {
const db = await openKeyDB();
return new Promise((resolve, reject) => {
const transaction = db.transaction(["cryptoKeys"], "readwrite");
const store = transaction.objectStore("cryptoKeys");
// We store the object under the label "masterEncryptionKey"
const request = store.put(cryptoKeyObject, "masterEncryptionKey");
request.onsuccess = () => resolve(true);
request.onerror = () => reject(request.error);
});
}
2025-11-28 19:25:31 -05:00
2026-03-09 16:31:40 -04:00
async function getEncryptionKey() {
const db = await openKeyDB();
return new Promise((resolve, reject) => {
const transaction = db.transaction(["cryptoKeys"], "readonly");
const store = transaction.objectStore("cryptoKeys");
const request = store.get("masterEncryptionKey");
request.onsuccess = () => {
if (request.result) {
resolve(request.result);
} else {
resolve(null);
}
};
request.onerror = () => reject(request.error);
2025-11-28 19:25:31 -05:00
});
2026-03-09 16:31:40 -04:00
}
function bufferToBase64(buffer) {
const bytes = new Uint8Array(buffer);
let binary = '';
for (let i = 0; i < bytes.byteLength; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
function base64ToBuffer(base64) {
const binaryString = window.atob(base64);
const bytes = new Uint8Array(binaryString.length);
for (let i = 0; i < binaryString.length; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
return bytes;
}
2026-03-09 22:15:47 +00:00
function logout() {
localStorage.removeItem("token");
window.location.href = "/login"
}