forked from Ailur/burgernotes-server
Merge branch 'main' of hectabit.org:HectaBit/Burgernotes
This commit is contained in:
commit
9d0dbafdba
|
@ -1,2 +1,3 @@
|
||||||
database.db
|
database.db
|
||||||
config.ini
|
config.ini
|
||||||
|
config.ini.example
|
||||||
|
|
12
README.md
12
README.md
|
@ -1,6 +1,18 @@
|
||||||
## Burgernotes
|
## Burgernotes
|
||||||
Burgernotes is a simple note-taking app with end-to-end encryption.
|
Burgernotes is a simple note-taking app with end-to-end encryption.
|
||||||
|
|
||||||
|
### Setup
|
||||||
|
To set up Burgernotes, simply run these commands:
|
||||||
|
```
|
||||||
|
cp config.ini.example config.ini
|
||||||
|
python3 init_db
|
||||||
|
```
|
||||||
|
|
||||||
|
Edit config.ini to your liking, then to start the server run:
|
||||||
|
```
|
||||||
|
python3 main
|
||||||
|
```
|
||||||
|
|
||||||
### Links
|
### Links
|
||||||
[Go to the Burgernotes website](https://notes.hectabit.org)
|
[Go to the Burgernotes website](https://notes.hectabit.org)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[config]
|
|
||||||
HOST = 0.0.0.0
|
|
||||||
PORT = 8070
|
|
||||||
SECRET_KEY = iadguhaoghioahegOLEHGELHIGOAHLhoewhgoiwh
|
|
||||||
MAX_STORAGE = 25000000
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
[config]
|
||||||
|
HOST = 0.0.0.0
|
||||||
|
PORT = 8080
|
||||||
|
SECRET_KEY = supersecretkey
|
||||||
|
MAX_STORAGE = 25000000
|
|
@ -56,7 +56,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.newNote img {
|
.newNote img {
|
||||||
filter: invert(100%)
|
filter: invert(100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
#errorDiv p {
|
#errorDiv p {
|
||||||
|
@ -68,7 +68,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.burgerSession img {
|
.burgerSession img {
|
||||||
filter: invert(100%) !important
|
filter: invert(100%) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.links a {
|
.links a {
|
||||||
|
@ -85,16 +85,16 @@
|
||||||
|
|
||||||
.inoutdiv input {
|
.inoutdiv input {
|
||||||
color: white;
|
color: white;
|
||||||
background-color: #202124;
|
background-color: var(--editor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.flathubLogo {
|
.flathubLogo {
|
||||||
filter: invert(100%)
|
filter: invert(100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.feature {
|
.feature {
|
||||||
background-color: rgba(0, 0, 0, 0) !important;
|
background-color: rgba(0, 0, 0, 0) !important;
|
||||||
color: var(--text-color)
|
color: var(--text-color);
|
||||||
}
|
}
|
||||||
.mainDiv .yellow {
|
.mainDiv .yellow {
|
||||||
border-color: #e9e98d !important;
|
border-color: #e9e98d !important;
|
||||||
|
@ -363,13 +363,12 @@ body {
|
||||||
left: 50%;
|
left: 50%;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
transform: translate(-50%, -50%);
|
transform: translate(-50%, -50%);
|
||||||
width: 300px;
|
|
||||||
position: fixed;
|
position: fixed;
|
||||||
background-color: var(--option-background);
|
background-color: var(--option-background);
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
color: var(--text-color);
|
color: var(--text-color);
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
min-width: 338.5px;
|
min-width: 300px;
|
||||||
z-index: 3;
|
z-index: 3;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -403,7 +402,7 @@ body {
|
||||||
.optionsDiv input {
|
.optionsDiv input {
|
||||||
width: calc(100% - 12px);
|
width: calc(100% - 12px);
|
||||||
height: 25px;
|
height: 25px;
|
||||||
background-color: ffffff;
|
background-color: #ffffff;
|
||||||
padding-left: 5px;
|
padding-left: 5px;
|
||||||
padding-right: 5px;
|
padding-right: 5px;
|
||||||
margin-bottom: 7px;
|
margin-bottom: 7px;
|
||||||
|
@ -520,6 +519,7 @@ body {
|
||||||
padding: 30px;
|
padding: 30px;
|
||||||
border-radius: 25px;
|
border-radius: 25px;
|
||||||
border: solid 1px var(--border-color);
|
border: solid 1px var(--border-color);
|
||||||
|
background-color: var(--bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
.inoutdiv input {
|
.inoutdiv input {
|
||||||
|
|
|
@ -111,7 +111,7 @@ signupButton.addEventListener("click", (event) => {
|
||||||
return key
|
return key
|
||||||
};
|
};
|
||||||
|
|
||||||
fetch(remote + "/api/login", {
|
fetch(remote + "https://notes.hectabit.org/api/login", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
username: username,
|
username: username,
|
||||||
|
@ -135,7 +135,7 @@ signupButton.addEventListener("click", (event) => {
|
||||||
}
|
}
|
||||||
else if (response.status == 401) {
|
else if (response.status == 401) {
|
||||||
console.log("Trying oldhash")
|
console.log("Trying oldhash")
|
||||||
fetch(remote + "/api/login", {
|
fetch(remote + "https://notes.hectabit.org/api/login", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
username: username,
|
username: username,
|
||||||
|
|
|
@ -208,7 +208,7 @@ function truncateString(str, num) {
|
||||||
|
|
||||||
|
|
||||||
function updateUserInfo() {
|
function updateUserInfo() {
|
||||||
fetch(remote + "/api/userinfo", {
|
fetch(remote + "https://notes.hectabit.org/api/userinfo", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
secretKey: secretkey
|
secretKey: secretkey
|
||||||
|
@ -259,7 +259,7 @@ exitThing.addEventListener("click", (event) => {
|
||||||
});
|
});
|
||||||
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(remote + "/api/deleteaccount", {
|
fetch(remote + "https://notes.hectabit.org/api/deleteaccount", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
secretKey: secretkey
|
secretKey: secretkey
|
||||||
|
@ -281,7 +281,7 @@ sessionManagerButton.addEventListener("click", (event) => {
|
||||||
optionsDiv.classList.add("hidden")
|
optionsDiv.classList.add("hidden")
|
||||||
sessionManagerDiv.classList.remove("hidden")
|
sessionManagerDiv.classList.remove("hidden")
|
||||||
|
|
||||||
fetch(remote + "/api/sessions/list", {
|
fetch(remote + "https://notes.hectabit.org/api/sessions/list", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
secretKey: secretkey
|
secretKey: secretkey
|
||||||
|
@ -320,7 +320,7 @@ sessionManagerButton.addEventListener("click", (event) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
sessionRemoveButton.addEventListener("click", (event) => {
|
sessionRemoveButton.addEventListener("click", (event) => {
|
||||||
fetch(remote + "/api/sessions/remove", {
|
fetch(remote + "https://notes.hectabit.org/api/sessions/remove", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
secretKey: secretkey,
|
secretKey: secretkey,
|
||||||
|
@ -370,7 +370,7 @@ function selectNote(nameithink) {
|
||||||
let thingArray = Array.from(document.querySelectorAll(".noteButton")).find(el => el.id == nameithink);
|
let thingArray = Array.from(document.querySelectorAll(".noteButton")).find(el => el.id == nameithink);
|
||||||
thingArray.classList.add("selected")
|
thingArray.classList.add("selected")
|
||||||
|
|
||||||
fetch(remote + "/api/readnote", {
|
fetch(remote + "https://notes.hectabit.org/api/readnote", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
secretKey: secretkey,
|
secretKey: secretkey,
|
||||||
|
@ -404,9 +404,9 @@ function selectNote(nameithink) {
|
||||||
updateWordCount()
|
updateWordCount()
|
||||||
clearTimeout(timer);
|
clearTimeout(timer);
|
||||||
timer = setTimeout(() => {
|
timer = setTimeout(() => {
|
||||||
let encryptedTitle = "empty note"
|
let encryptedTitle = "New note"
|
||||||
if (noteBox.value != "") {
|
if (noteBox.value.substring(0, noteBox.value.indexOf("\n")) != "") {
|
||||||
let firstTitle = truncateString(noteBox.value.slice(0, noteBox.value.indexOf("\n")), 16)
|
let firstTitle = noteBox.value.substring(0, noteBox.value.indexOf("\n"));
|
||||||
|
|
||||||
document.getElementById(nameithink).innerText = firstTitle
|
document.getElementById(nameithink).innerText = firstTitle
|
||||||
encryptedTitle = CryptoJS.AES.encrypt(firstTitle, password).toString();
|
encryptedTitle = CryptoJS.AES.encrypt(firstTitle, password).toString();
|
||||||
|
@ -414,7 +414,7 @@ function selectNote(nameithink) {
|
||||||
let encryptedText = CryptoJS.AES.encrypt(noteBox.value, password).toString();
|
let encryptedText = CryptoJS.AES.encrypt(noteBox.value, password).toString();
|
||||||
|
|
||||||
if (selectedNote == nameithink) {
|
if (selectedNote == nameithink) {
|
||||||
fetch(remote + "/api/editnote", {
|
fetch(remote + "https://notes.hectabit.org/api/editnote", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
secretKey: secretkey,
|
secretKey: secretkey,
|
||||||
|
@ -443,7 +443,7 @@ function selectNote(nameithink) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateNotes() {
|
function updateNotes() {
|
||||||
fetch(remote + "/api/listnotes", {
|
fetch(remote + "https://notes.hectabit.org/api/listnotes", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
secretKey: secretkey
|
secretKey: secretkey
|
||||||
|
@ -476,7 +476,7 @@ function updateNotes() {
|
||||||
|
|
||||||
noteButton.addEventListener("click", (event) => {
|
noteButton.addEventListener("click", (event) => {
|
||||||
if (event.ctrlKey) {
|
if (event.ctrlKey) {
|
||||||
fetch(remote + "/api/removenote", {
|
fetch(remote + "https://notes.hectabit.org/api/removenote", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
secretKey: secretkey,
|
secretKey: secretkey,
|
||||||
|
@ -506,9 +506,9 @@ function updateNotes() {
|
||||||
updateNotes()
|
updateNotes()
|
||||||
|
|
||||||
newNote.addEventListener("click", (event) => {
|
newNote.addEventListener("click", (event) => {
|
||||||
let noteName = "empty note"
|
let noteName = "New note"
|
||||||
let encryptedName = CryptoJS.AES.encrypt(noteName, password).toString();
|
let encryptedName = CryptoJS.AES.encrypt(noteName, password).toString();
|
||||||
fetch(remote + "/api/newnote", {
|
fetch(remote + "https://notes.hectabit.org/api/newnote", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
secretKey: secretkey,
|
secretKey: secretkey,
|
||||||
|
@ -542,7 +542,7 @@ function downloadObjectAsJson(exportObj, exportName) {
|
||||||
|
|
||||||
function exportNotes() {
|
function exportNotes() {
|
||||||
let noteExport = []
|
let noteExport = []
|
||||||
fetch(remote + "/api/exportnotes", {
|
fetch(remote + "https://notes.hectabit.org/api/exportnotes", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
secretKey: secretkey
|
secretKey: secretkey
|
||||||
|
@ -590,6 +590,16 @@ function isFirstTimeVisitor() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function firstNewVersion() {
|
||||||
|
if (document.cookie.indexOf("version=1.1") !== -1) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
var expirationDate = new Date();
|
||||||
|
expirationDate.setFullYear(expirationDate.getFullYear() + 1);
|
||||||
|
document.cookie = "version=1.1; expires=" + expirationDate.toUTCString() + "; path=/; SameSite=strict";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
exportNotesButton.addEventListener("click", (event) => {
|
exportNotesButton.addEventListener("click", (event) => {
|
||||||
exportNotesButton.innerText = "Downloading..."
|
exportNotesButton.innerText = "Downloading..."
|
||||||
|
@ -600,7 +610,7 @@ 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(remote + "/api/removenote", {
|
fetch(remote + "https://notes.hectabit.org/api/removenote", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
secretKey: secretkey,
|
secretKey: secretkey,
|
||||||
|
@ -622,3 +632,7 @@ removeBox.addEventListener("click", (event) => {
|
||||||
if (isFirstTimeVisitor() && /Android|iPhone|iPod/i.test(navigator.userAgent)) {
|
if (isFirstTimeVisitor() && /Android|iPhone|iPod/i.test(navigator.userAgent)) {
|
||||||
displayError("To use Burgernotes:\n Swipe Right on a note to open it\n Swipe left in the text boxes to return to notes\n Click on a note to highlight it")
|
displayError("To use Burgernotes:\n Swipe Right on a note to open it\n Swipe left in the text boxes to return to notes\n Click on a note to highlight it")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (firstNewVersion()) {
|
||||||
|
displayError("What's new in Burgernotes 1.1?\n\nNote titles are now the first line of a note \(will not break compatibility with older notes\)\nIntroduced improved login screen\nNote titles now scroll correctly")
|
||||||
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ signupButton.addEventListener("click", (event) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
fetch(remote + "/api/signup", {
|
fetch(remote + "https://notes.hectabit.org/api/signup", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
username: username,
|
username: username,
|
||||||
|
|
|
@ -15,11 +15,13 @@
|
||||||
<div class="inoutdiv">
|
<div class="inoutdiv">
|
||||||
<h2 class="w300">Login</h2>
|
<h2 class="w300">Login</h2>
|
||||||
<p id="statusBox"></p>
|
<p id="statusBox"></p>
|
||||||
<span id="inputNameBox" style="margin-right: 10px;color: var(--text-color);"></span><input id="usernameBox"
|
<span id="inputNameBox" style="margin-right: 10px;color: var(--text-color);"></span>
|
||||||
class="hidden" type="text" placeholder="Enter your username">
|
<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/index.html">Create one here!</a></p>
|
<p>Don't have an account? If so, <a href="../signup/index.html">Create one here!</a></p>
|
||||||
<a href="../privacy/index.html">Privacy & Terms</a>
|
<a href="../privacy/index.html">Privacy & Terms</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -30,10 +32,9 @@
|
||||||
background-color: #d9d9d9;
|
background-color: #d9d9d9;
|
||||||
background-image: url("/static/svg/grid.svg");
|
background-image: url("/static/svg/grid.svg");
|
||||||
background-repeat: repeat;
|
background-repeat: repeat;
|
||||||
background-size: 312px
|
background-size: 312px;
|
||||||
}
|
}
|
||||||
.inoutdiv {
|
.inoutdiv {
|
||||||
background-color: #fff;
|
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -20,9 +20,20 @@
|
||||||
<input id="passwordBox" type="password" placeholder="Password"><br>
|
<input id="passwordBox" type="password" placeholder="Password"><br>
|
||||||
<button id="signupButton">Signup</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>
|
||||||
By signing up, you agree to our <a href="../privacy/index.html">Privacy & Terms</a>.<br><br>
|
<p>By signing up, you agree to our <a href="../privacy/index.html">Privacy & Terms</a>.</p>
|
||||||
|
<br><br>
|
||||||
<p>Already have an account? If so, <a href="../login/index.html">Login</a> instead!</p><br>
|
<p>Already have an account? If so, <a href="../login/index.html">Login</a> instead!</p><br>
|
||||||
</div>
|
</div>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background-color: #d9d9d9;
|
||||||
|
background-image: url("/static/svg/grid.svg");
|
||||||
|
background-repeat: repeat;
|
||||||
|
background-size: 312px;
|
||||||
|
}
|
||||||
|
.inoutdiv {
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<script type="text/javascript" src="../static/js/signup.js"></script>
|
<script type="text/javascript" src="../static/js/signup.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
Loading…
Reference in New Issue