notes/tools/nodeclient/app.js

178 lines
3.7 KiB
JavaScript
Raw Normal View History

2023-07-11 14:48:03 +02:00
const axios = require("axios");
const readline = require("readline");
const fs = require("fs");
2023-08-24 17:19:03 +02:00
const openpgp = require("openpgp");
2023-07-11 14:48:03 +02:00
var cp = require("child_process");
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
var settings = JSON.parse(fs.readFileSync("settings.json", { encoding: "utf8", flag: "r" }));
2023-08-24 17:19:03 +02:00
var pgpkey = fs.readFileSync("key.acs", { encoding: "utf8", flag: "r" });
var filter = "";
2023-07-12 18:07:32 +02:00
var intervalid = null;
var notes = null;
var currentnote = null;
function timestamp()
{
var utc = new Date();
var loc = new Date(utc - utc.getTimezoneOffset() * 60 * 1000);
return loc.toISOString().replace("T", " ").replace(/\..*/, "").replace(/:/g, ".");
}
2023-07-12 18:07:32 +02:00
2023-08-25 17:44:24 +02:00
function simplifystring(str)
{
return str.toLowerCase().normalize('NFD').replace(/\p{Diacritic}/gu, "");
}
2023-08-24 17:19:03 +02:00
async function decrypt(str)
{
var key = pgpkey.split("-----END PGP PUBLIC KEY BLOCK-----")[1];
var privateKey = await openpgp.readKey({ armoredKey: key });
var decrypted = await openpgp.decrypt({
message: await openpgp.readMessage({ armoredMessage: str }),
decryptionKeys: privateKey });
const chunks = [];
for await (const chunk of decrypted.data) {
chunks.push(chunk);
}
return chunks.join('');
}
async function encrypt(str)
{
var key = pgpkey.split("-----BEGIN PGP PRIVATE KEY BLOCK-----")[0];
var publicKey = await openpgp.readKey({ armoredKey: key });
return await openpgp.encrypt({
message: await openpgp.createMessage({ text: str }),
encryptionKeys: publicKey });
}
2023-07-12 18:07:32 +02:00
function filteredlist()
{
return notes
2023-08-25 17:44:24 +02:00
.filter(n => simplifystring(n.title).includes(simplifystring(filter)));
2023-07-12 18:07:32 +02:00
}
2023-07-11 14:48:03 +02:00
async function saveifneeded()
{
var newcontent = fs.readFileSync("note.md", { encoding: "utf8", flag: "r" });
if (currentnote.content != newcontent)
{
currentnote.content = newcontent;
notes.splice(notes.indexOf(currentnote), 1);
notes.unshift(currentnote);
console.log("sending data file to server...");
var encrypted = await encrypt(JSON.stringify(notes));
axios.post(`${settings.url}/handler.php`,
{
action: "push",
password: settings.password,
data: encrypted
},
{
headers:
{
"Content-type": "application/x-www-form-urlencoded"
}
}).then(res => {
console.log("...done.");
});
}
else
{
console.log("no change.");
}
}
function editnote(index)
{
currentnote = filteredlist()[index];
if (currentnote)
{
// todo: use title instead? To put in data folder?
fs.writeFileSync("note.md", currentnote.content);
cp.exec(`${settings.command} note.md`, async function (err, stdout, stderr)
{
clearInterval(intervalid);
saveifneeded();
});
intervalid = setInterval(saveifneeded, 10000);
}
else
{
console.log("No note found.");
}
}
// Run part
2023-07-11 14:48:03 +02:00
axios.post(`${settings.url}/handler.php`,
{
action: "fetch",
password: settings.password
},
{
headers:
{
"Content-type": "application/x-www-form-urlencoded"
}
})
2023-08-24 17:19:03 +02:00
.then(async function(res)
2023-07-11 14:48:03 +02:00
{
2023-08-24 17:19:03 +02:00
notes = JSON.parse(await decrypt(res.data));
if (process.argv.length > 2 && process.argv[2] === "new")
2023-07-11 14:48:03 +02:00
{
var title = timestamp();
currentnote = {
title: title,
content: ""
}
notes.unshift(currentnote);
console.log("Creating new note: " + title);
editnote(0);
}
else
2023-07-11 14:48:03 +02:00
{
if (process.argv.length > 2)
2023-07-11 14:48:03 +02:00
{
filter = process.argv[2];
}
var matchcount = filteredlist().length;
if (matchcount == 1)
{
editnote(0);
}
else if (matchcount > 1)
{
console.log("Select a note or type 'q' to quit:");
filteredlist()
.every( (note, i) =>
2023-07-11 18:16:51 +02:00
{
console.log(`[${i}] ${note.title}`)
return Boolean(filter) || i < settings.maxcountifnofilter;
});
rl.prompt();
rl.on("line", async function (line)
2023-07-12 18:07:32 +02:00
{
if (line == "q")
2023-07-12 18:07:32 +02:00
{
rl.close();
2023-07-12 18:07:32 +02:00
}
else
{
editnote(line);
}
});
}
}
2023-07-11 14:48:03 +02:00
});