apxtrib/api/models/Pagans.js

203 lines
5.8 KiB
JavaScript
Raw Normal View History

2023-04-27 04:17:20 +00:00
const glob = require("glob");
const path = require("path");
2023-05-12 05:59:32 +00:00
const dayjs = require("dayjs");
2023-04-27 04:17:20 +00:00
const fs = require("fs-extra");
2023-05-12 05:59:32 +00:00
const axios = require("axios");
2023-12-05 06:42:35 +00:00
const Mustache = require('mustache');
2023-05-12 05:59:32 +00:00
const openpgp = require("openpgp");
2023-11-05 11:03:25 +00:00
const Notifications = require("../models/Notifications.js");
const Odmdb = require("../models/Odmdb.js");
2023-05-16 08:31:27 +00:00
const conf = require(`${process.env.dirtown}/conf.json`);
2023-05-31 13:19:21 +00:00
2023-04-27 04:17:20 +00:00
/**
2023-05-12 05:59:32 +00:00
* Pagan Management numeric Identity and Person (Person = Pagan Id + tribe)
*
*
*
2023-04-27 04:17:20 +00:00
*/
2023-05-12 05:59:32 +00:00
const Pagans = {};
2023-04-27 04:17:20 +00:00
2023-11-05 11:03:25 +00:00
/**
* Remove authentification token after a logout
* @param {string} alias
* @param {string} tribe
* @param {integer} xdays
* @param {string} xhash
* @returns {status:200, ref:"Pagans",msg:"logout"}
* tmpfs name file has to be on line with the tmpfs create by isAuthenticated
* tmpfs contain profils name for a tribe/
*/
Pagans.logout = (alias, tribe, xdays, xhash) => {
//console.log(alias, tribe, xdays, xhash);
// inline with middleware isAuthenticated.js
let tmpfs = `${process.env.dirtown}/tmp/tokens/${alias}_${tribe}_${xdays}`;
//max filename in ext4: 255 characters
tmpfs += `_${xhash.substring(150, 150 + tmpfs.length - 249)}.json`;
fs.remove(tmpfs);
2023-12-05 06:42:35 +00:00
console.log('logout token',tmpfs)
2023-11-05 11:03:25 +00:00
return { status: 200, ref: "Pagans", msg: "logout" };
};
/**
* @param {string} alias a alias that exist or not
* @return {object} { status: 200, ref:"pagans",msg:"aliasexist",data: { alias, publicKey } }
* { status: 404, ref:"pagans",msg:"aliasdoesnotexist",data: { alias} }
*
**/
2023-06-07 05:32:23 +00:00
Pagans.getalias = (alias) => {
2023-12-05 06:42:35 +00:00
//bypass Odmdb cause all is public save ressources
2023-06-07 05:32:23 +00:00
if (fs.existsSync(`${conf.dirapi}/nationchains/pagans/itm/${alias}.json`)) {
return {
status: 200,
ref: "Pagans",
msg: "aliasexist",
2023-11-05 11:03:25 +00:00
data: fs.readJSONSync(
2023-06-07 05:32:23 +00:00
`${conf.dirapi}/nationchains/pagans/itm/${alias}.json`
),
};
} else {
return {
status: 404,
ref: "Pagans",
msg: "aliasdoesnotexist",
data: { alias },
};
}
};
2023-04-27 04:17:20 +00:00
2023-11-05 11:03:25 +00:00
/**
* Send email with alias's keys to email or person alias person.recovery.email
*
* If email or pubkey is undefined then get data from tribe/person(alias)
* Send email with keys
*
* @param {string} alias
* @param {pgpPrivate} privkey
* @param {string} passphrase
* @param {string} tribe
* @param {pgpPublic} pubkey
* @param {string} email
*/
Pagans.sendmailkey = (
alias,
privatekey,
2023-12-05 06:42:35 +00:00
tribe,
2023-11-05 11:03:25 +00:00
passphrase,
publickey,
2023-12-05 06:42:35 +00:00
email,
lg
2023-11-05 11:03:25 +00:00
) => {
2023-12-05 06:42:35 +00:00
const person = { alias, privatekey, tribe };
2023-11-05 11:03:25 +00:00
console.log(
alias,
"-",
2023-12-05 06:42:35 +00:00
privatekey.substring(0,10),
2023-11-05 11:03:25 +00:00
"-",
2023-12-05 06:42:35 +00:00
tribe,
2023-11-05 11:03:25 +00:00
"-",
passphrase,
"-",
2023-12-05 06:42:35 +00:00
publickey.substring(0,10),
2023-11-05 11:03:25 +00:00
"-",
email
);
2023-12-05 06:42:35 +00:00
if (!publickey || !email || !privatekey) {
const personfile = `${process.env.dirtown}/tribes/${tribe}/objects/persons/itm/${alias}.json`;
if (!fs.existsSync(personfile)) {
2023-11-05 11:03:25 +00:00
return {
status: 404,
ref: "Pagans",
msg: "persondoesnotexist",
2023-12-05 06:42:35 +00:00
data: { alias, tribe },
2023-11-05 11:03:25 +00:00
};
}
2023-12-05 06:42:35 +00:00
const persondata= fs.readJsonSync(personfile);
2023-11-05 11:03:25 +00:00
person.email = persondata.recoveryauth.email;
person.publickey = persondata.recoveryauth.publickey;
person.privatekey = persondata.recoveryauth.privatekey;
person.passphrase = persondata.recoveryauth.passphrase;
} else {
person.email = email;
person.passphrase = passphrase;
person.publickey = publickey;
}
2023-12-05 06:42:35 +00:00
person.avecpassphrase=(person.passphrase!="")
2023-11-05 11:03:25 +00:00
console.log("person:", person);
2023-12-05 06:42:35 +00:00
const tplemail = require(`${conf.dirapi}/adminapi/template/createidentity_${lg}.js`)
2023-11-05 11:03:25 +00:00
2023-12-05 06:42:35 +00:00
person.message
2023-11-05 11:03:25 +00:00
const maildata = {
2023-12-05 06:42:35 +00:00
to: person.email,
subject: Mustache.render(tplemail.subject, person),
html: Mustache.render(tplemail.html, person),
text: Mustache.render(tplemail.text, person),
attachments: [
{
filename:`${person.alias}_publickey.txt`,
content: person.publickey,
contentType:"text/plain"
},
{
filename:`${person.alias}_privatekey.txt`,
content: person.privatekey,
contentType:"text/plain"
}
]
2023-04-27 04:17:20 +00:00
};
2023-12-05 06:42:35 +00:00
return Notifications.sendmail(maildata, tribe);
2023-05-12 05:59:32 +00:00
};
Pagans.authenticatedetachedSignature = async (
alias,
pubK,
detachedSignature,
message
) => {
/**
* Check that a message was signed with a privateKey from a publicKey
* This is not necessary if isAuthenticated, but can be usefull to double check
* @TODO finish it and implement it also in /apxpagan.js for browser
* @alias {string} alias link to the publicKey
* @pubK {string} publiKey text format
* @detachedSignature {string} a detachedsignatured get from apx.detachedSignature
* @message {string} the message signed
* @return {boolean} true the message was signed by alias
* false the message was not signed by alias
*/
const publicKey = await openpgp.readKey({ armoredKey: pubK });
const msg = await openpgp.createMessage({ text: message });
const signature = await openpgp.readSignature({
armoredSignature: detachedSignature, // parse detached signature
});
const verificationResult = await openpgp.verify({
msg, // Message object
signature,
verificationKeys: publicKey,
});
const { verified, keyID } = verificationResult.signatures[0];
try {
await verified; // throws on invalid signature
console.log("Signed by key id " + keyID.toHex());
return KeyId.toHex().alias == alias;
} catch (e) {
console.log("Signature could not be verified: " + e.message);
return false;
}
};
2023-06-12 05:27:34 +00:00
Pagans.keyrecovery = (tribeid, email) => {
glob
.GlobSync(`${conf.dirtown}/tribes/${tribeId}/Person/*.json`)
.forEach((f) => {
const person = fs.readJsonSync(f);
if (person.recoveryauth && person.recoveryauth.email) {
// send email (alias publickey privatekey )
}
});
return { status: 200, ref: "Pagans", msg: "todo" };
};
2023-05-12 05:59:32 +00:00
module.exports = Pagans;