changed: drop js client tools
This commit is contained in:
parent
a017206120
commit
3803a5e27d
217
cli/node/app.js
217
cli/node/app.js
|
@ -1,217 +0,0 @@
|
||||||
const axios = require("axios");
|
|
||||||
const fs = require("fs");
|
|
||||||
const openpgp = require("openpgp");
|
|
||||||
var cp = require("child_process");
|
|
||||||
|
|
||||||
var settings = JSON.parse(fs.readFileSync("settings.json", { encoding: "utf8", flag: "r" }));
|
|
||||||
var pgpkey = fs.readFileSync("key.acs", { encoding: "utf8", flag: "r" });
|
|
||||||
var intervalid = null;
|
|
||||||
var notes = null;
|
|
||||||
var currentnote = null;
|
|
||||||
var command = null;
|
|
||||||
|
|
||||||
function timestamp()
|
|
||||||
{
|
|
||||||
var utc = new Date();
|
|
||||||
var loc = new Date(utc - utc.getTimezoneOffset() * 60 * 1000);
|
|
||||||
|
|
||||||
return loc.toISOString().replace("T", " ").replace(/\..*/, "").replace(/:/g, ".");
|
|
||||||
}
|
|
||||||
|
|
||||||
function simplifystring(str)
|
|
||||||
{
|
|
||||||
return str.toLowerCase().normalize('NFD').replace(/\p{Diacritic}/gu, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
function decrypt(str)
|
|
||||||
{
|
|
||||||
var keystring = pgpkey.split("-----END PGP PUBLIC KEY BLOCK-----")[1];
|
|
||||||
var key = null;
|
|
||||||
|
|
||||||
return openpgp.readKey({ armoredKey: keystring })
|
|
||||||
.then(privateKey =>
|
|
||||||
{
|
|
||||||
key = privateKey;
|
|
||||||
return openpgp.readMessage({ armoredMessage: str });
|
|
||||||
})
|
|
||||||
.then(message =>
|
|
||||||
{
|
|
||||||
return openpgp.decrypt({
|
|
||||||
message: message,
|
|
||||||
decryptionKeys: key })
|
|
||||||
})
|
|
||||||
.then(decrypted =>
|
|
||||||
{
|
|
||||||
var chunks = [];
|
|
||||||
for (const chunk of decrypted.data) {
|
|
||||||
chunks.push(chunk);
|
|
||||||
}
|
|
||||||
return chunks.join('');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function encrypt(str)
|
|
||||||
{
|
|
||||||
var keystring = pgpkey.split("-----BEGIN PGP PRIVATE KEY BLOCK-----")[0];
|
|
||||||
var key = null;
|
|
||||||
return openpgp.readKey({ armoredKey: keystring })
|
|
||||||
.then(publicKey =>
|
|
||||||
{
|
|
||||||
key = publicKey;
|
|
||||||
return openpgp.createMessage({ text: str });
|
|
||||||
})
|
|
||||||
.then(message =>
|
|
||||||
{
|
|
||||||
return openpgp.encrypt({
|
|
||||||
message: message,
|
|
||||||
encryptionKeys: key });
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
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...");
|
|
||||||
encrypt(JSON.stringify(notes))
|
|
||||||
.then(encrypted =>
|
|
||||||
{
|
|
||||||
return 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 if (!intervalid)
|
|
||||||
{
|
|
||||||
console.log("no change.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function editnote()
|
|
||||||
{
|
|
||||||
fs.writeFileSync("note.md", currentnote.content);
|
|
||||||
cp.exec(`${settings.command} note.md`,
|
|
||||||
function (err, stdout, stderr)
|
|
||||||
{
|
|
||||||
clearInterval(intervalid);
|
|
||||||
intervalid = null;
|
|
||||||
saveifneeded();
|
|
||||||
});
|
|
||||||
intervalid = setInterval(saveifneeded, 10000);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run part
|
|
||||||
if (process.argv.length <= 2)
|
|
||||||
{
|
|
||||||
command = "list";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
command = process.argv[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
axios.post(`${settings.url}/handler.php`,
|
|
||||||
{
|
|
||||||
action: "fetch",
|
|
||||||
password: settings.password
|
|
||||||
},
|
|
||||||
{
|
|
||||||
headers:
|
|
||||||
{
|
|
||||||
"Content-type": "application/x-www-form-urlencoded"
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.then(function(res)
|
|
||||||
{
|
|
||||||
return decrypt(res.data);
|
|
||||||
})
|
|
||||||
.then(json =>
|
|
||||||
{
|
|
||||||
notes = JSON.parse(json);
|
|
||||||
switch (command)
|
|
||||||
{
|
|
||||||
case "help":
|
|
||||||
case "-h":
|
|
||||||
case "--help":
|
|
||||||
var appcmd = "notes";
|
|
||||||
console.log(`list notes: ${appcmd} [list]`);
|
|
||||||
console.log(`edit a note: ${appcmd} [open|edit] <title|index>`);
|
|
||||||
console.log(`create a note: ${appcmd} new|create|add [<title>]`);
|
|
||||||
console.log(`display help: ${appcmd} help|-h|--help`);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "new":
|
|
||||||
case "create":
|
|
||||||
case "add":
|
|
||||||
var title = timestamp();
|
|
||||||
if (process.argv.length > 3)
|
|
||||||
{
|
|
||||||
title = process.argv[3];
|
|
||||||
}
|
|
||||||
if (notes.find(n => n.title == title))
|
|
||||||
{
|
|
||||||
console.log(`${title}: already exists`);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
currentnote = {
|
|
||||||
title: title,
|
|
||||||
content: ""
|
|
||||||
}
|
|
||||||
notes.unshift(currentnote);
|
|
||||||
console.log(`Creating new note: ${title}`);
|
|
||||||
editnote();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "list":
|
|
||||||
for (var i = notes.length - 1; i >= 0; i--)
|
|
||||||
{
|
|
||||||
console.log(`[${i}] ${notes[i].title}`);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
var arg = command;
|
|
||||||
if (arg === "open" || arg === "edit")
|
|
||||||
{
|
|
||||||
arg = process.argv[3];
|
|
||||||
}
|
|
||||||
if (isNaN(parseInt(arg)))
|
|
||||||
{
|
|
||||||
currentnote = notes.find(n => n.title == arg);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
currentnote = notes[parseInt(arg)];
|
|
||||||
}
|
|
||||||
if (currentnote)
|
|
||||||
{
|
|
||||||
console.log(`Editing ${currentnote.title}`);
|
|
||||||
editnote();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
console.log(`Note ${arg} not found`);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"password": "",
|
|
||||||
"url": "http://localhost:8000",
|
|
||||||
"command": "sublime_text.exe -w"
|
|
||||||
}
|
|
129
cli/quick/app.js
129
cli/quick/app.js
|
@ -1,129 +0,0 @@
|
||||||
function timestamp()
|
|
||||||
{
|
|
||||||
var utc = new Date();
|
|
||||||
var loc = new Date(utc - utc.getTimezoneOffset() * 60 * 1000);
|
|
||||||
|
|
||||||
return loc.toISOString().replace("T", " ").replace(/\..*/, "").replace(/:/g, ".");
|
|
||||||
}
|
|
||||||
|
|
||||||
function editnote()
|
|
||||||
{
|
|
||||||
var file = std.open("data/note.md", "w");
|
|
||||||
file.puts(currentnote.content);
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
os.exec(["cp", "data/note.md", "data/backup.md"]);
|
|
||||||
os.exec(settings.editor.concat("data/note.md"));
|
|
||||||
|
|
||||||
var newcontent = std.loadFile("data/note.md");
|
|
||||||
if (currentnote.content != newcontent)
|
|
||||||
{
|
|
||||||
print("diff:");
|
|
||||||
os.exec(["diff", "--color", "data/backup.md", "data/note.md"]);
|
|
||||||
currentnote.content = newcontent;
|
|
||||||
|
|
||||||
notes.splice(notes.indexOf(currentnote), 1);
|
|
||||||
notes.unshift(currentnote);
|
|
||||||
|
|
||||||
file = std.open("data/data2.json", "w");
|
|
||||||
file.puts(JSON.stringify(notes));
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
os.exec([settings.gpg, "-q", "--encrypt", "--yes", "--trust-model", "always", "--output", "data/data2.acs", "--armor", "-r", settings.gpguser, "data/data2.json"]);
|
|
||||||
var newdata = std.loadFile("data/data2.acs");
|
|
||||||
console.log("sending data file to server.");
|
|
||||||
|
|
||||||
var postdata = "action=push&password=" + settings.password + "&data=" + encodeURIComponent(newdata);
|
|
||||||
file = std.open("data/postdata", "w");
|
|
||||||
file.puts(postdata);
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
os.exec(["curl", "-s", "-X", "POST",
|
|
||||||
"-d", "@data/postdata",
|
|
||||||
settings.url]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
console.log("no change.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Init
|
|
||||||
var settings = JSON.parse(std.loadFile("settings.json"));
|
|
||||||
var command = scriptArgs.length <= 1 ? "list" : scriptArgs[1];
|
|
||||||
var currentnote = null;
|
|
||||||
|
|
||||||
// Run part
|
|
||||||
if (command == "help" || command == "-h" || command == "--help")
|
|
||||||
{
|
|
||||||
var appcmd = "./qjs q.js";
|
|
||||||
print(`list notes: ${appcmd} [list]`);
|
|
||||||
print(`edit a note: ${appcmd} [open|edit] <title|index>`);
|
|
||||||
print(`create a note: ${appcmd} new|create|add [<title>]`);
|
|
||||||
print(`display help: ${appcmd} help|-h|--help`);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
os.exec(["curl", "-s", "-X", "POST", "-F", "action=fetch", "-F", "password=" + settings.password, "-o", "data/data.acs", settings.url]);
|
|
||||||
os.exec([settings.gpg, "-q", "--yes", "--output", "data/data.json", "--decrypt", "data/data.acs"]);
|
|
||||||
var notes = JSON.parse(std.loadFile("data/data.json"));
|
|
||||||
|
|
||||||
switch (command)
|
|
||||||
{
|
|
||||||
case "new":
|
|
||||||
case "create":
|
|
||||||
case "add":
|
|
||||||
var title = timestamp();
|
|
||||||
if (scriptArgs.length > 2)
|
|
||||||
{
|
|
||||||
title = scriptArgs[2];
|
|
||||||
}
|
|
||||||
if (notes.find(n => n.title == title))
|
|
||||||
{
|
|
||||||
console.log(`${title}: already exists`);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
currentnote = {
|
|
||||||
title: title,
|
|
||||||
content: ""
|
|
||||||
}
|
|
||||||
notes.unshift(currentnote);
|
|
||||||
console.log(`Creating new note: ${title}`);
|
|
||||||
editnote();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "list":
|
|
||||||
for (var i = notes.length - 1; i >= 0; i--)
|
|
||||||
{
|
|
||||||
console.log(`[${i}] ${notes[i].title}`);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
var arg = command;
|
|
||||||
if (arg === "open" || arg === "edit")
|
|
||||||
{
|
|
||||||
arg = scriptArgs[2];
|
|
||||||
}
|
|
||||||
if (isNaN(parseInt(arg)))
|
|
||||||
{
|
|
||||||
currentnote = notes.find(n => n.title == arg);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
currentnote = notes[parseInt(arg)];
|
|
||||||
}
|
|
||||||
if (currentnote)
|
|
||||||
{
|
|
||||||
console.log(`Editing ${currentnote.title}`);
|
|
||||||
editnote();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
console.log(`Note ${arg} not found`);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
{
|
|
||||||
"password": "",
|
|
||||||
"url": "http://localhost:8000/handler.php",
|
|
||||||
"editor": ["vim"],
|
|
||||||
"gpg": "gpg",
|
|
||||||
"gpguser": ""
|
|
||||||
}
|
|
Loading…
Reference in New Issue