We are soo back!

This commit is contained in:
Tracker-Friendly 2023-11-03 20:24:40 +00:00
parent c727216c02
commit a8a15cae64
15 changed files with 134 additions and 171 deletions

View File

@ -1,7 +1,9 @@
## burgernotes ## PageBurger
burgernotes is a simple note-taking app with end-to-end encryption PageBurger is a simple note-taking app with end-to-end encryption.
PageBurger is a community fork of the discontinued [BurgerNotes](https://codeberg.org/burger-software/burgernotes). Most of the credits go to BurgerSoftware.
### links ### links
[go to the burgernotes website](https://notes.ctaposter.xyz/) [Go to the PageBurger website](https://notes.hectabit.org)
[API documentation](APIDOCS.md) [API documentation](APIDOCS.md)

View File

@ -1,5 +1,5 @@
[config] [config]
HOST = 0.0.0.0 HOST = 0.0.0.0
PORT = 8080 PORT = 8070
SECRET_KEY = placeholder SECRET_KEY = oligogoaihegokjdugielaguilUGLAGULUGELGouegalfgusl
MAX_STORAGE = 25000000 MAX_STORAGE = 25000000

4
main
View File

@ -118,10 +118,6 @@ def login():
def privacy(): def privacy():
return render_template("privacy.html") return render_template("privacy.html")
@app.route("/shutdownfaq")
def shutdown():
return send_from_directory("templates", "shutdown.html")
# API # API
@app.route("/api/signup", methods=("GET", "POST")) @app.route("/api/signup", methods=("GET", "POST"))
def apisignup(): def apisignup():

View File

@ -1,6 +1,7 @@
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap"); @import url("https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap");
:root { :root {
--invertdm: 0%;
--bar: #f4f4f4; --bar: #f4f4f4;
--editor: #ffffff; --editor: #ffffff;
--text-color: #000000; --text-color: #000000;
@ -21,6 +22,7 @@
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
:root { :root {
--invertdm: 100%;
--bar: #2d2f31; --bar: #2d2f31;
--editor: #202124; --editor: #202124;
--text-color: #ffffff; --text-color: #ffffff;
@ -65,11 +67,6 @@
filter: invert(100%) !important filter: invert(100%) !important
} }
.feature h3,
p {
color: black !important;
}
.links a { .links a {
color: white !important; color: white !important;
} }
@ -89,6 +86,7 @@
} }
p, p,
li,
h1, h1,
h2, h2,
h3, h3,
@ -98,6 +96,15 @@ h6 {
color: var(--text-color); color: var(--text-color);
} }
h7 {
display: block;
font-size: 20px;
margin-top: 0.67em;
margin-bottom: 0.67em;
margin-left: 0;
margin-right: 0;
}
body { body {
margin: 0; margin: 0;
background-color: var(--editor); background-color: var(--editor);
@ -143,6 +150,7 @@ body {
} }
.bottomBar .removeButton { .bottomBar .removeButton {
filter: invert(var(--invertdm));
padding-left: 17.5px; padding-left: 17.5px;
padding-right: 17.5px; padding-right: 17.5px;
transform: translateY(-5px); transform: translateY(-5px);
@ -343,6 +351,7 @@ body {
.optionsDiv button { .optionsDiv button {
width: 100%; width: 100%;
padding: 10px; padding: 10px;
padding-bottom: 13px;
margin-right: 5px; margin-right: 5px;
margin-bottom: 7px; margin-bottom: 7px;
padding-left: 15px; padding-left: 15px;
@ -429,7 +438,8 @@ body {
.optionsDiv img { .optionsDiv img {
height: 18px; height: 18px;
padding-right: 5px; padding-right: 5px;
filter: invert(var(--invert)) filter: invert(var(--invert));
transform: translateY(3.25px);
} }
.optionsDiv .section { .optionsDiv .section {
@ -604,6 +614,7 @@ body {
padding-top: 15px; padding-top: 15px;
padding-bottom: 15px; padding-bottom: 15px;
font-size: 17px; font-size: 17px;
padding-bottom: 30px;
} }
.mainDiv .green { .mainDiv .green {

View File

@ -1,11 +1,11 @@
if (localStorage.getItem("DONOTSHARE-secretkey") !== null) { if (localStorage.getItem("DONOTSHARE-secretkey") !== null) {
window.location.replace("/app") window.location.replace("/app")
document.body.innerHTML = "Redirecting.." document.body.innerHTML = "Redirecting..."
throw new Error(); throw new Error();
} }
if (localStorage.getItem("DONOTSHARE-password") !== null) { if (localStorage.getItem("DONOTSHARE-password") !== null) {
window.location.replace("/app") window.location.replace("/app")
document.body.innerHTML = "Redirecting.." document.body.innerHTML = "Redirecting..."
throw new Error(); throw new Error();
} }
@ -17,7 +17,7 @@ let inputNameBox = document.getElementById("inputNameBox")
let backButton = document.getElementById("backButton") let backButton = document.getElementById("backButton")
usernameBox.classList.remove("hidden") usernameBox.classList.remove("hidden")
inputNameBox.innerText = "username:" inputNameBox.innerText = "Username:"
let currentInputType = 0 let currentInputType = 0
@ -26,14 +26,14 @@ function showInput(inputType) {
usernameBox.classList.remove("hidden") usernameBox.classList.remove("hidden")
passwordBox.classList.add("hidden") passwordBox.classList.add("hidden")
backButton.classList.add("hidden") backButton.classList.add("hidden")
inputNameBox.innerText = "username:" inputNameBox.innerText = "Username:"
statusBox.innerText = "log in to your burgernotes account!" statusBox.innerText = "Login to your PageBurger account!"
currentInputType = 0 currentInputType = 0
} else if (inputType == 1) { } else if (inputType == 1) {
usernameBox.classList.add("hidden") usernameBox.classList.add("hidden")
passwordBox.classList.remove("hidden") passwordBox.classList.remove("hidden")
backButton.classList.remove("hidden") backButton.classList.remove("hidden")
inputNameBox.innerText = "password:" inputNameBox.innerText = "Password:"
currentInputType = 1 currentInputType = 1
} else if (inputType == 2) { } else if (inputType == 2) {
usernameBox.classList.add("hidden") usernameBox.classList.add("hidden")
@ -41,7 +41,7 @@ function showInput(inputType) {
signupButton.classList.add("hidden") signupButton.classList.add("hidden")
backButton.classList.add("hidden") backButton.classList.add("hidden")
inputNameBox.classList.add("hidden") inputNameBox.classList.add("hidden")
inputNameBox.innerText = "password:" inputNameBox.innerText = "Password:"
currentInputType = 2 currentInputType = 2
} }
} }
@ -68,10 +68,10 @@ function showElements(yesorno) {
signupButton.addEventListener("click", (event) => { signupButton.addEventListener("click", (event) => {
if (passwordBox.classList.contains("hidden")) { if (passwordBox.classList.contains("hidden")) {
if (usernameBox.value == "") { if (usernameBox.value == "") {
statusBox.innerText = "username required" statusBox.innerText = "A username is required!"
return return
} else { } else {
statusBox.innerText = "welcome back, " + usernameBox.value + "!" statusBox.innerText = "Welcome back, " + usernameBox.value + "!"
} }
showInput(1) showInput(1)
} else { } else {
@ -80,13 +80,13 @@ signupButton.addEventListener("click", (event) => {
let password = passwordBox.value let password = passwordBox.value
if (password == "") { if (password == "") {
statusBox.innerText = "password required" statusBox.innerText = "A password is required!"
return return
} }
showInput(2) showInput(2)
showElements(true) showElements(true)
statusBox.innerText = "signing in.." statusBox.innerText = "Signing in..."
async function hashpass(pass) { async function hashpass(pass) {
const key = await hashwasm.argon2id({ const key = await hashwasm.argon2id({
@ -122,12 +122,12 @@ signupButton.addEventListener("click", (event) => {
window.location.href = "/app" window.location.href = "/app"
} }
else if (response.status == 401) { else if (response.status == 401) {
statusBox.innerText = "wrong username or password :(" statusBox.innerText = "Wrong username or password..."
showInput(1) showInput(1)
showElements(true) showElements(true)
} }
else { else {
statusBox.innerText = "something went wrong! (error code: " + response.status + ")" statusBox.innerText = "Something went wrong! (error code: " + response.status + ")"
showInput(1) showInput(1)
showElements(true) showElements(true)
} }

View File

@ -1,11 +1,11 @@
if (localStorage.getItem("DONOTSHARE-secretkey") === null) { if (localStorage.getItem("DONOTSHARE-secretkey") === null) {
window.location.replace("/login") window.location.replace("/login")
document.body.innerHTML = "Redirecting.." document.body.innerHTML = "Redirecting..."
throw new Error(); throw new Error();
} }
if (localStorage.getItem("DONOTSHARE-password") === null) { if (localStorage.getItem("DONOTSHARE-password") === null) {
window.location.replace("/login") window.location.replace("/login")
document.body.innerHTML = "Redirecting.." document.body.innerHTML = "Redirecting..."
throw new Error(); throw new Error();
} }
@ -36,17 +36,14 @@ let cancelErrorButton = document.getElementById("cancelErrorButton")
let errorInput = document.getElementById("errorInput") let errorInput = document.getElementById("errorInput")
let exitThing = document.getElementById("exitThing") let exitThing = document.getElementById("exitThing")
let exitSessionsThing = document.getElementById("exitSessionsThing") let exitSessionsThing = document.getElementById("exitSessionsThing")
let exitMfaThing = document.getElementById("exitMfaThing")
let sessionManagerButton = document.getElementById("sessionManagerButton") let sessionManagerButton = document.getElementById("sessionManagerButton")
let sessionManagerDiv = document.getElementById("sessionManagerDiv") let sessionManagerDiv = document.getElementById("sessionManagerDiv")
let sessionDiv = document.getElementById("sessionDiv") let sessionDiv = document.getElementById("sessionDiv")
let mfaDiv = document.getElementById("mfaDiv") let mfaDiv = document.getElementById("mfaDiv")
let mfaCheckbox = document.getElementById("mfaCheckbox")
let deleteMyAccountButton = document.getElementById("deleteMyAccountButton") let deleteMyAccountButton = document.getElementById("deleteMyAccountButton")
let storageThing = document.getElementById("storageThing") let storageThing = document.getElementById("storageThing")
let storageProgressThing = document.getElementById("storageProgressThing") let storageProgressThing = document.getElementById("storageProgressThing")
let usernameThing = document.getElementById("usernameThing") let usernameThing = document.getElementById("usernameThing")
let passwordThing = document.getElementById("passwordThing")
let logOutButton = document.getElementById("logOutButton") let logOutButton = document.getElementById("logOutButton")
let notesBar = document.getElementById("notesBar") let notesBar = document.getElementById("notesBar")
let notesDiv = document.getElementById("notesDiv") let notesDiv = document.getElementById("notesDiv")
@ -213,7 +210,7 @@ function updateUserInfo() {
.then((response) => { .then((response) => {
async function doStuff() { async function doStuff() {
if (response.status == 500) { if (response.status == 500) {
displayError("Something went wrong. Signing you out..") displayError("Something went wrong! Signing you out..")
closeErrorButton.classList.add("hidden") closeErrorButton.classList.add("hidden")
usernameBox.innerText = "" usernameBox.innerText = ""
setTimeout(function () { setTimeout(function () {
@ -222,9 +219,8 @@ function updateUserInfo() {
} else { } else {
let responseData = await response.json() let responseData = await response.json()
usernameBox.innerText = responseData["username"] usernameBox.innerText = responseData["username"]
usernameThing.innerText = "username: " + responseData["username"] usernameThing.innerText = "Username: " + responseData["username"]
passwordThing.innerText = "password: *************" storageThing.innerText = "You've used " + formatBytes(responseData["storageused"]) + " out of " + formatBytes(responseData["storagemax"])
storageThing.innerText = "you've used " + formatBytes(responseData["storageused"]) + " out of " + formatBytes(responseData["storagemax"])
storageProgressThing.value = responseData["storageused"] storageProgressThing.value = responseData["storageused"]
storageProgressThing.max = responseData["storagemax"] storageProgressThing.max = responseData["storagemax"]
noteCount = responseData["notecount"] noteCount = responseData["notecount"]
@ -247,7 +243,7 @@ exitThing.addEventListener("click", (event) => {
optionsCoverDiv.classList.add("hidden") optionsCoverDiv.classList.add("hidden")
}); });
deleteMyAccountButton.addEventListener("click", (event) => { deleteMyAccountButton.addEventListener("click", (event) => {
if (confirm("are you REALLY sure that you want to delete your account? there's no going back.") == true) { if (confirm("Are you REALLY sure that you want to delete your account? There's no going back!") == true) {
fetch("/api/deleteaccount", { fetch("/api/deleteaccount", {
method: "POST", method: "POST",
body: JSON.stringify({ body: JSON.stringify({
@ -262,7 +258,7 @@ deleteMyAccountButton.addEventListener("click", (event) => {
if (response.status == 200) { if (response.status == 200) {
window.location.href = "/api/logout" window.location.href = "/api/logout"
} else { } else {
displayError("failed to delete account (HTTP error code " + response.status + ")") displayError("Failed to delete account (HTTP error code " + response.status + ")")
} }
}) })
} }
@ -346,17 +342,6 @@ exitSessionsThing.addEventListener("click", (event) => {
optionsDiv.classList.remove("hidden") optionsDiv.classList.remove("hidden")
sessionManagerDiv.classList.add("hidden") sessionManagerDiv.classList.add("hidden")
}); });
mfaCheckbox.addEventListener("change", (event) => {
if (mfaCheckbox.checked === true) {
mfaCheckbox.checked = false
optionsDiv.classList.add("hidden")
mfaDiv.classList.remove("hidden")
}
})
exitMfaThing.addEventListener("click", (event) => {
optionsDiv.classList.remove("hidden")
mfaDiv.classList.add("hidden")
});
updateUserInfo() updateUserInfo()
@ -387,13 +372,13 @@ function selectNote(nameithink) {
noteBox.readOnly = true noteBox.readOnly = true
noteBox.value = "" noteBox.value = ""
noteBox.placeholder = "" noteBox.placeholder = ""
displayError("something went wrong, please try again later") displayError("Something went wrong... Please try again later!")
}) })
.then((response) => response) .then((response) => response)
.then((response) => { .then((response) => {
selectedNote = nameithink selectedNote = nameithink
noteBox.readOnly = false noteBox.readOnly = false
noteBox.placeholder = "type something.." noteBox.placeholder = "Type something!"
async function doStuff() { async function doStuff() {
let responseData = await response.json() let responseData = await response.json()
@ -425,11 +410,11 @@ function selectNote(nameithink) {
.then((response) => response) .then((response) => response)
.then((response) => { .then((response) => {
if (response.status == 418) { if (response.status == 418) {
displayError("you've ran out of storage :3 changes will not be saved until you free up storage!!! owo") displayError("You've ran out of storage... Changes will not be saved until you free up storage!")
} }
}) })
.catch((error) => { .catch((error) => {
displayError("failed to save changes, please try again later") displayError("Failed to save changes, please try again later...")
}) })
} }
}, waitTime); }, waitTime);
@ -489,7 +474,7 @@ function updateNotes() {
updateNotes() updateNotes()
}) })
.catch((error) => { .catch((error) => {
displayError("something went wrong! please try again later") displayError("Something went wrong! Please try again later...")
}) })
} else { } else {
selectNote(responseData[i]["id"]) selectNote(responseData[i]["id"])
@ -505,7 +490,7 @@ function updateNotes() {
updateNotes() updateNotes()
newNote.addEventListener("click", (event) => { newNote.addEventListener("click", (event) => {
let noteName = displayPrompt("note name? :3", "e.g. shopping list", burgerFunction) let noteName = displayPrompt("Note name?", "E.G Shopping list", burgerFunction)
function burgerFunction(noteName) { function burgerFunction(noteName) {
if (noteName != null) { if (noteName != null) {
let encryptedName = CryptoJS.AES.encrypt(noteName, password).toString(); let encryptedName = CryptoJS.AES.encrypt(noteName, password).toString();
@ -520,12 +505,12 @@ newNote.addEventListener("click", (event) => {
} }
}) })
.catch((error) => { .catch((error) => {
displayError("failed to create new note, please try again later") displayError("Failed to create new note, please try again later...")
}) })
.then((response) => { .then((response) => {
if (response.status !== 200) { if (response.status !== 200) {
updateNotes() updateNotes()
displayError("failed to create new note (HTTP error code " + response.status + ")") displayError("Failed to create new note (HTTP error code " + response.status + ")")
} else { } else {
updateNotes() updateNotes()
} }
@ -559,7 +544,7 @@ function exportNotes() {
async function doStuff() { async function doStuff() {
let responseData = await response.json() let responseData = await response.json()
for (let i in responseData) { for (let i in responseData) {
exportNotes.innerText = "decrypting " + i + "/" + noteCount exportNotes.innerText = "Decrypting " + i + "/" + noteCount
let bytes = CryptoJS.AES.decrypt(responseData[i]["title"], password); let bytes = CryptoJS.AES.decrypt(responseData[i]["title"], password);
let originalTitle = bytes.toString(CryptoJS.enc.Utf8); let originalTitle = bytes.toString(CryptoJS.enc.Utf8);
@ -573,10 +558,10 @@ function exportNotes() {
} }
let jsonString = JSON.parse(JSON.stringify(responseData)) let jsonString = JSON.parse(JSON.stringify(responseData))
exportNotesButton.innerText = "export notes" exportNotesButton.innerText = "Export notes"
downloadObjectAsJson(jsonString, "data") downloadObjectAsJson(jsonString, "data")
optionsDiv.classList.add("hidden") optionsDiv.classList.add("hidden")
displayError("exported notes!") displayError("Exported notes!")
} }
doStuff() doStuff()
@ -584,13 +569,13 @@ function exportNotes() {
} }
exportNotesButton.addEventListener("click", (event) => { exportNotesButton.addEventListener("click", (event) => {
exportNotesButton.innerText = "downloading.." exportNotesButton.innerText = "Downloading..."
exportNotes() exportNotes()
}); });
removeBox.addEventListener("click", (event) => { removeBox.addEventListener("click", (event) => {
if (selectedNote == 0) { if (selectedNote == 0) {
displayError("you need to select a note first!") displayError("You need to select a note first!")
} else { } else {
fetch("/api/removenote", { fetch("/api/removenote", {
method: "POST", method: "POST",
@ -607,9 +592,7 @@ removeBox.addEventListener("click", (event) => {
updateNotes() updateNotes()
}) })
.catch((error) => { .catch((error) => {
displayError("something went wrong! please try again later") displayError("Something went wrong! Please try again later...")
}) })
} }
}); });
displayError("Burgernotes is shutting down on November 12th, please refer to <a href='/shutdownfaq'>this FAQ</a> for more info.")

View File

@ -1,11 +1,11 @@
if (localStorage.getItem("DONOTSHARE-secretkey") !== null) { if (localStorage.getItem("DONOTSHARE-secretkey") !== null) {
window.location.replace("/app") window.location.replace("/app")
document.body.innerHTML = "Redirecting.." document.body.innerHTML = "Redirecting..."
throw new Error(); throw new Error();
} }
if (localStorage.getItem("DONOTSHARE-password") !== null) { if (localStorage.getItem("DONOTSHARE-password") !== null) {
window.location.replace("/app") window.location.replace("/app")
document.body.innerHTML = "Redirecting.." document.body.innerHTML = "Redirecting..."
throw new Error(); throw new Error();
} }
@ -33,24 +33,24 @@ signupButton.addEventListener("click", (event) => {
let password = passwordBox.value let password = passwordBox.value
if (username == "") { if (username == "") {
statusBox.innerText = "username required" statusBox.innerText = "A username is required!"
return return
} }
if ((username).length > 20) { if ((username).length > 20) {
statusBox.innerText = "username cannot be more than 20 characters" statusBox.innerText = "Username cannot be more than 20 characters!"
return return
} }
if (password == "") { if (password == "") {
statusBox.innerText = "password required" statusBox.innerText = "A password is required!"
return return
} }
if ((password).length < 14) { if ((password).length < 8) {
statusBox.innerText = "14 characters required" statusBox.innerText = "8 or more characters are required!"
return return
} }
showElements(false) showElements(false)
statusBox.innerText = "creating account, please hold on.." statusBox.innerText = "Creating account, please hold on..."
async function hashpass(pass) { async function hashpass(pass) {
const key = await hashwasm.argon2id({ const key = await hashwasm.argon2id({
@ -88,11 +88,11 @@ signupButton.addEventListener("click", (event) => {
window.location.href = "/app" window.location.href = "/app"
} }
else if (response.status == 409) { else if (response.status == 409) {
statusBox.innerText = "username already taken!" statusBox.innerText = "Username already taken!"
showElements(true) showElements(true)
} }
else { else {
statusBox.innerText = "something went wrong! (error code: " + respStatus + ")" statusBox.innerText = "Something went wrong! (error code: " + respStatus + ")"
showElements(true) showElements(true)
} }
} }

View File

@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<title>burgernotes</title> <title>PageBurger</title>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
@ -14,7 +14,7 @@
<body> <body>
<div class="topBar"> <div class="topBar">
<p tabindex="0" class="logo" id="burgerButton">burgernotes</p> <p tabindex="0" class="logo" id="burgerButton">PageBurger</p>
<p tabindex="0" id="usernameBox" class="usernameBox"></p> <p tabindex="0" id="usernameBox" class="usernameBox"></p>
</div> </div>
@ -28,7 +28,7 @@
<div id="notesBar" class="notesBar"> <div id="notesBar" class="notesBar">
<button id="newNote" class="newNote"><img id="newNoteImage" draggable="false" alt="" <button id="newNote" class="newNote"><img id="newNoteImage" draggable="false" alt=""
src="/static/svg/add.svg">new note</button> src="/static/svg/add.svg">New note</button>
<div id="notesDiv" class="notesDiv"> <div id="notesDiv" class="notesDiv">
<button class="loadingStuff" id="loadingStuff"></button> <button class="loadingStuff" id="loadingStuff"></button>
</div> </div>
@ -37,49 +37,33 @@
<div id="optionsCoverDiv" class="optionsCoverDiv hidden"> <div id="optionsCoverDiv" class="optionsCoverDiv hidden">
<div id="optionsDiv" class="optionsDiv hidden"> <div id="optionsDiv" class="optionsDiv hidden">
<button class="exit" id="exitThing">X</button> <button class="exit" id="exitThing">X</button>
<h3 class="w300">your account</h3> <h3 class="w300">Your account</h3>
<p id="usernameThing"></p> <p id="usernameThing"></p>
<p id="passwordThing"></p> <p id="passwordThing"></p>
<p style="display: inline">enable two-factor authentication: </p>
<input type="checkbox" id="mfaCheckbox" class="mfacheckbox">
<div class="section"></div> <div class="section"></div>
<p>storage</p> <p>Storage</p>
<progress id="storageProgressThing" value="0" max="100"></progress><br> <progress id="storageProgressThing" value="0" max="100"></progress><br>
<p id="storageThing"></p> <p id="storageThing"></p>
<div class="section"></div> <div class="section"></div>
<p>account managment</p> <p>Account managment</p>
<button id="deleteMyAccountButton"><img src="/static/svg/delete_forever.svg">delete my account</button> <button id="deleteMyAccountButton"><img src="/static/svg/delete_forever.svg">Delete my account</button>
<button id="exportNotesButton"><img src="/static/svg/download.svg">export notes</button> <button id="exportNotesButton"><img src="/static/svg/download.svg">Export notes</button>
<button id="sessionManagerButton"><img src="/static/svg/list.svg">session manager</button> <button id="sessionManagerButton"><img src="/static/svg/list.svg">Session manager</button>
<button class="lastButton" id="logOutButton"><img src="/static/svg/logout.svg">log out</button> <button class="lastButton" id="logOutButton"><img src="/static/svg/logout.svg">Log out</button>
</div> </div>
<div id="sessionManagerDiv" class="optionsDiv hidden"> <div id="sessionManagerDiv" class="optionsDiv hidden">
<button class="exit" id="exitSessionsThing">X</button> <button class="exit" id="exitSessionsThing">X</button>
<h3 class="w300">session manager</h3> <h3 class="w300">Session manager</h3>
<p>manage your sessions</p> <p>Manage your sessions</p>
<div class="section"></div> <div class="section"></div>
<div class="sessionDiv" id="sessionDiv"> <div class="sessionDiv" id="sessionDiv">
</div> </div>
</div> </div>
<div id="mfaDiv" class="optionsDiv hidden">
<button class="exit" id="exitMfaThing">X</button>
<h3 class="w300">enable 2FA</h3>
<img style="filter: none; width: 100%; height: 60px;" src="/static/svg/phonelink_lock.svg">
<br><br>
Two-factor authentication is coming soon!
<div class="hidden">
<p>Two-factor authentication adds an extra layer of security to your account.</p>
<p>Enter in this token in your authenticator app:</p>
<code></code>
<p>Enter in the 6 digit code from your authenticator app:</p>
<input style="margin-bottom: 0;" inputmode="numeric" id="codeInput" type="text"
placeholder="6-digit code"><br></input>
</div>
</div> </div>
<div id="errorDiv" class="optionsDiv hidden"> <div id="errorDiv" class="optionsDiv hidden">
<p id="errorMessageThing"></p> <p id="errorMessageThing"></p>
<input class="hidden" id="errorInput" type="text" placeholder=""><br></input> <input class="hidden" id="errorInput" type="text" placeholder=""><br></input>
<button class="normalButton" id="closeErrorButton">OK</button> <button class="normalButton" id="closeErrorButton">Ok</button>
<button class="normalButton hidden" id="cancelErrorButton">Cancel</button> <button class="normalButton hidden" id="cancelErrorButton">Cancel</button>
</div> </div>
</div> </div>

View File

@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<title>burgernotes</title> <title>PageBurger</title>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
@ -10,8 +10,8 @@
<body> <body>
<div class="mainDiv"> <div class="mainDiv">
<h1>burgernotes is down</h1> <h1>PageBurger is down</h1>
<p>we're down for maintenance, please try again later!</p> <p>We're down for maintenance, please try again later!</p>
<!-- please don't mind the spaghetti code :3 --> <!-- please don't mind the spaghetti code :3 -->
<img class="grid" src="/grid.svg"> <img class="grid" src="/grid.svg">

View File

@ -2,15 +2,13 @@
<html> <html>
<head> <head>
<title>burgernotes</title> <title>PageBurger</title>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" type="text/css" href="/static/css/style.css" /> <link rel="stylesheet" type="text/css" href="/static/css/style.css" />
</head> </head>
<p class="alertDiv">Burgernotes is shutting down on November 12th, read <a href="/shutdownfaq">this FAQ</a> for more info</p>
<body> <body>
<h2 class="w300">{{ errorMessage }}</h2> <h2 class="w300">{{ errorMessage }}</h2>
{{ errorCode }} | {{ errorMessage }} {{ errorCode }} | {{ errorMessage }}

View File

@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<title>log in - burgernotes</title> <title>Login - PageBurger</title>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
@ -11,17 +11,15 @@
</head> </head>
<p class="alertDiv">Burgernotes is shutting down on November 12th, read <a href="/shutdownfaq">this FAQ</a> for more info</p>
<body> <body>
<div class="inoutdiv"> <div class="inoutdiv">
<h2 class="w300">log in</h2> <h2 class="w300">Login</h2>
<p id="statusBox"></p> <p id="statusBox"></p>
<span id="inputNameBox" style="margin-right: 10px;"></span><input id="usernameBox" class="hidden" type="text" placeholder="Enter your username"> <span id="inputNameBox" style="margin-right: 10px;color: var(--text-color);"></span><input id="usernameBox" class="hidden" type="text" placeholder="Enter your username">
<input id="passwordBox" class="hidden" type="password" placeholder="Enter your password"> <input id="passwordBox" class="hidden" type="password" placeholder="Enter your password">
<button id="signupButton">next</button> <button id="signupButton">Next</button>
<button id="backButton" class="hidden">back</button><br><br> <button id="backButton" class="hidden">Back</button><br><br>
<p>don't have an account? if so, <a href="/signup">create one here!</a></p> <p>Don't have an account? If so, <a href="/signup">Create one here!</a></p>
</div> </div>
<script type="text/javascript" src="/static/js/login.js"></script> <script type="text/javascript" src="/static/js/login.js"></script>

View File

@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<title>burgernotes</title> <title>PageBurger</title>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<head> <head>

View File

@ -2,39 +2,37 @@
<html> <html>
<head> <head>
<title>burgernotes</title> <title>PageBurger</title>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" type="text/css" href="/static/css/style.css" /> <link rel="stylesheet" type="text/css" href="/static/css/style.css" />
<meta content="burgernotes" property="og:title" /> <meta content="Burgernotes" property="og:title" />
<meta content="simple note-taking app :3" property="og:description" /> <meta content="A simple note-taking app!" property="og:description" />
</head> </head>
<p class="alertDiv">Burgernotes is shutting down on November 12th, read <a href="/shutdownfaq">this FAQ</a> for more info</p>
<body> <body>
<div class="mainDiv"> <div class="mainDiv">
<div class="startDiv"> <div class="startDiv">
<h1 class="w300">burgernotes</h1> <h1 class="w300">PageBurger</h1>
<p>simple note-taking app</p> <p>A simple note-taking app!</p>
<br> <br>
<a href="/app">open in your browser</a> <a href="/app">Open in your browser</a>
<!--<a href="/download">download app</a>--> <!--<a href="/download">download app</a>-->
</div> </div>
<br><br><br> <br><br><br>
<div class="feature green"> <div class="feature green">
<h3 class="w300">secure</h4> <h7 class="w300">Secure</h7>
<p>all your notes are fully end-to-end encrypted. only you can read your notes, not anyone else.</p> <p2>All your notes are fully end-to-end encrypted. Only you can read your notes, not anyone else.</p2>
</div> </div>
<div class="feature yellow"> <div class="feature yellow">
<h3 class="w300">always up-to-date</h4> <h7 class="w300">Always up-to-date</h7>
<p>your notes seamlessly sync across your devices.</p> <p2>Your notes seamlessly sync across your devices.</p2>
</div> </div>
</div> </div>
<div class="links"> <div class="links">
<a href="https://codeberg.org/burger-software/burgernotes">source code</a> <a href="https://centrifuge.hectabit.org/hectabit/pageburger">Source code</a>
<a href="/privacy">privacy policy</a> <a href="/privacy">Privacy policy</a>
</div> </div>
</body> </body>

View File

@ -2,21 +2,19 @@
<html> <html>
<head> <head>
<title>burgernotes</title> <title>PageBurger</title>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" type="text/css" href="/static/css/style.css" /> <link rel="stylesheet" type="text/css" href="/static/css/style.css" />
</head> </head>
<p class="alertDiv">Burgernotes is shutting down on November 12th, read <a href="/shutdownfaq">this FAQ</a> for more info</p>
<body> <body>
<h1 class="w300">burgernotes privacy policy</h1> <h1 class="w300">PageBurger Privacy Policy</h1>
<h2 class="w300">Preamble</h2> <h2 class="w300">Preamble</h2>
<p><i>please note that i am not a lawyer, please don't expect too much of this policy :3</i></p> <p><i>Please note that I am not a lawyer, please don't expect too much of this policy <3</i></p>
<p>Welcome to the Burgernotes privacy policy! burgernotes is <a <p>Welcome to the PageBurger privacy policy! PageBurger is <a
href="https://codeberg.org/burger-software/burgernotes">free & open source</a> software licensed under <a href="https://centrifuge.hectabit.org/hectabit/pageburger">free & open source</a> software licensed under <a
href="https://www.gnu.org/licenses/agpl-3.0.en.html">GNU AGPL-3.0</a>.</p> href="https://www.gnu.org/licenses/agpl-3.0.en.html">GNU AGPL-3.0</a>.</p>
<h2 class="w300">Information collected when signing up</h2> <h2 class="w300">Information collected when signing up</h2>
<p>When signing up for an account, we collect and store the following information:</p> <p>When signing up for an account, we collect and store the following information:</p>
@ -54,14 +52,14 @@
<li>Note last edited date</li> <li>Note last edited date</li>
<li>Note creator</li> <li>Note creator</li>
</ul> </ul>
not note content or title. <p>Not note content or title.</p>
<h2 class="w300">We don't sell your data</h2> <h2 class="w300">We don't sell your data</h2>
<p>We don't sell or share your data to advertisers or third-parties.</p> <p>We don't sell or share your data to advertisers or third-parties.</p>
<h2 class="w300">Liability</h2> <h2 class="w300">Liability</h2>
<p>We take no responsibility for the use of burgernotes, or any external instances provided by third-parties. We <p>We take no responsibility for the use of PageBurger, or any external instances provided by third-parties. We
refuse liability for any inappropriate or illegal use of burgernotes.</p> refuse liability for any inappropriate or illegal use of PageBurger.</p>
<p>You may view the AGPL-3.0 license which this software is provided to you with. A copy of the section is below.</p> <p>You may view the AGPL-3.0 license which this software is provided to you with. A copy of the section is below.</p>
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING <p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
@ -69,7 +67,7 @@
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES. SUCH DAMAGES.</p>
<br><br> <br><br>
</body> </body>

View File

@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<title>sign up - burgernotes</title> <title>Signup - PageBurger</title>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
@ -11,21 +11,16 @@
</head> </head>
<p class="alertDiv">Burgernotes is shutting down on November 12th, read <a href="/shutdownfaq">this FAQ</a> for more info</p>
<body> <body>
<div class="inoutdiv"> <div class="inoutdiv">
<h2 class="w300">sign up</h2> <h2 class="w300">Signup</h2>
<p>You may no longer sign up, read <a href="/shutdownfaq">this FAQ</a>.</p> <p>Signup for a PageBurger account</p>
<p>If you have an existing account, please <a href="/login">sign in</a>.</p>
<!--<p>sign up for a burgernotes account</p>
<p id="statusBox"></p> <p id="statusBox"></p>
<input id="usernameBox" type="text" placeholder="Username"> <input id="usernameBox" type="text" placeholder="Username">
<input id="passwordBox" type="password" placeholder="Password"> <input id="passwordBox" type="password" placeholder="Password">
<button id="signupButton">sign up</button><br><br> <button id="signupButton">Signup</button><br><br>
<p>please note that it's impossible to reset your password, do not forget it!</p> <p>Please note that it's impossible to reset your password, do not forget it!</p>
<p>already have an account? if so, <a href="/login">log in</a> instead</p> <p>Already have an account? If so, <a href="/login">Login</a> instead!</p>
-->
</div> </div>
<script type="text/javascript" src="/static/js/signup.js"></script> <script type="text/javascript" src="/static/js/signup.js"></script>