This repository has been archived on 2024-09-28. You can view files and clone it, but cannot push or open issues or pull requests.
burgerauth/static/js/signup.js

160 lines
5.6 KiB
JavaScript

if (localStorage.getItem("DONOTSHARE-secretkey") !== null || localStorage.getItem("DONOTSHARE-password") !== null) {
window.location.replace("/app" + window.location.search)
document.body.innerHTML = "Redirecting..."
throw new Error();
}
let usernameBox = document.getElementById("usernameBox")
let passwordBox = document.getElementById("passwordBox")
let statusBox = document.getElementById("statusBox")
let signupButton = document.getElementById("signupButton")
let loginButton = document.getElementById("loginButton")
let inputContainer = document.getElementById("inputContainer")
function showElements(yesorno) {
if (!yesorno) {
inputContainer.classList.add("hidden")
signupButton.classList.add("hidden")
loginButton.classList.add("hidden")
}
else {
inputContainer.classList.remove("hidden")
signupButton.classList.remove("hidden")
loginButton.classList.remove("hidden")
}
}
complete = new Event("completed");
window.returnCode = undefined;
window.returnVar = undefined;
// This is for the WASM code to call when it's done. Do not remove it, even if it looks like it's never called.
function WASMComplete() {
window.dispatchEvent(complete);
}
signupButton.addEventListener("click", () => {
let username = usernameBox.value
let password = passwordBox.value
if (username === "") {
statusBox.innerText = "A username is required!"
return
}
if ((username).length > 20) {
statusBox.innerText = "Username cannot be more than 20 characters!"
return
}
if (password === "") {
statusBox.innerText = "A password is required!"
return
}
if ((password).length < 8) {
statusBox.innerText = "8 or more characters are required!"
return
}
async function hashpass(pass) {
return await hashwasm.argon2id({
password: pass,
salt: new TextEncoder().encode("I munch Burgers!!"),
parallelism: 1,
iterations: 32,
memorySize: 19264,
hashLength: 32,
outputType: "hex"
})
}
showElements(false)
statusBox.innerText = "Computing PoW Challenge... (this may take up to 5 minutes at worst, 3 seconds at best)"
/*
* Compiled version of:
* hashcat-wasm (https://concord.hectabit.org/hectabit/hashcat-wasm)
* (c) Arzumify
* @license AGPL-3.0
* Since this is my software, if you use it with proprietary servers, I will make sure you will walk across hot coals (just kidding, probably).
* I'm not kidding about the license though.
* I should stop including comments into JS and possibly minify this code. Oh, well.
*/
window.resourceExtra = "I love Burgerauth!!"
const go = new Go();
WebAssembly.instantiateStreaming(fetch("/static/wasm/hashcat.wasm"), go.importObject).then((result) => {
go.run(result.instance);
})
window.addEventListener("completed", async () => {
if (window.returnCode === 1) {
statusBox.innerText = "Please do not expose your computer to cosmic rays (an impossible logical event has occurred)."
showElements(true)
return
} else if (window.returnCode === 2) {
statusBox.innerText = "The PoW Challenge has failed. Please try again."
showElements(true)
return
}
statusBox.innerText = "Hashing password..."
let hashedPass = await hashpass(password)
statusBox.innerText = "Contacting server..."
fetch("/api/signup", {
method: "POST",
body: JSON.stringify({
username: username,
password: hashedPass,
stamp: window.returnVar
}),
headers: {
"Content-Type": "application/json; charset=UTF-8"
}
})
.then((response) => response)
.then(async (response) => {
let responseData = await response.json()
console.log(responseData)
if (response.status === 200) {
statusBox.innerText = "Setting up encryption keys..."
localStorage.setItem("DONOTSHARE-secretkey", responseData["key"])
localStorage.setItem("DONOTSHARE-password", await hashwasm.argon2id({
password: password,
salt: new TextEncoder().encode("I love Burgerauth!!"),
parallelism: 1,
iterations: 32,
memorySize: 19264,
hashLength: 32,
outputType: "hex"
}))
statusBox.innerText = "Welcome!"
await new Promise(r => setTimeout(r, 200))
window.location.href = "/app" + window.location.search
} else if (response.status === 409) {
statusBox.innerText = "Username already taken!"
showElements(true)
} else if (response.status === 500) {
statusBox.innerText = responseData["error"]
showElements(true)
} else {
statusBox.innerText = "Something went wrong! (error code: " + responseData["error"] + ")"
showElements(true)
}
})
})
})
document.getElementById("privacyButton").addEventListener("click", function(event) {
event.preventDefault();
const queryString = window.location.search;
window.location.href = "/privacy" + queryString;
});
function toLogin() {
window.location.href = "/login" + window.location.search;
}