fix big in pgp key unconsistent

This commit is contained in:
philc 2023-06-02 10:21:01 +02:00
parent c84a8c5aef
commit 9294ff7dba
17 changed files with 154 additions and 154 deletions

View File

@ -11,7 +11,7 @@
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.1.1/css/all.css">
<script>
const apxlocal = {
headers: { xalias: "anonymous", xhash: "anonymous", xdays: 0, xtribe: "devenv", xapp: "adminapx", xlang: "en" },
headers: { xalias: "anonymous", xhash: "anonymous", xdays: 0, xtribe: "town", xapp: "adminapx", xlang: "en" },
firsttimeload: true,
forcereload: true,
tpl: {

View File

@ -1,4 +1,5 @@
{
"schema":"nationchains/schema/schemas.json",
"lastupdate":0
"schema":"schema/",
"objects":[{"name":"nations","lastversion":0},{"name":"paganss","lastversion":0},{"name":"towns","lastversion":0},{"name":"tribes","lastversion":0}],
"comment":"schema are in english to get translate part a /lg/schemaname_lg.json allow to replace by lg language the relevant key. Each time a modification is done in schema lastupdate take a timestamp"
}

View File

@ -1,19 +0,0 @@
{
"title":"Nation definition",
"description":"A nation from apXtrib social world",
"$comment":"",
"properties":{
"nationId":{
"title":"Unique nation name",
"description":"A unique string that define a nation a-z and 0-9 onlyin a social world"
},
"dtcreate":{
"title":"Creation date",
"description":"Nation date of creation"
},
"contracts":{
"title":"Social contract of the nation",
"description":"A uri of the signed js contract that rules this nation"
}
}
}

View File

@ -1,7 +1,19 @@
{
"nationnamedesc":"Nom unique d'une nation dans un monde social",
"nationnamedesclong":"Nom unique identifiant une nation dans le monde social créer par un maire d'une nouvelle ville avec un contrat sociale specifique",
"nationnameinfo":"<p> Une nation posséde un nom unique, un contrat sociale (contracts/name.js) signé et validé par tous les maires des villes associées à cette nation </p>",
"statusdesc":"Statut de la nation",
"statusactive":"Nation active"
"title": "Description d'une nation",
"description":"Nation schema in the apxtrib world",
"$comment":"",
"properties":{
"nationId":{
"title":"Nom de nation",
"description":"Nom unique idenbtifiant une nation composé de a-z et de 0-9 permet de fereder des règles de fonctionnement"
},
"dtcreate":{
"title":"Date de creation",
"description":"Creation de la nation"
},
"contracts":{
"title":"Le contrat social",
"description":"Indique l'emplacement du contrat qu'accepte toutes les villes"
}
}
}

View File

@ -1,42 +0,0 @@
{
"ERRcritical": "Critical Error",
"loginAlreadyExist": "Login already exists",
"emailAlreadyExist":"Email already exists",
"failtoWritefs":"Fail to write on system",
"successfullCreate": "Successfully created",
"successfullDelete": "Successfully deleted",
"serverNeedAuthentification":"This server needs authentification",
"forbiddenAccess":"Forbidden Access",
"userNotAllowtoCreate":"User is not allow to create",
"userNotAllowtoUpdate":"User is not allow to update",
"userNotAllowtoDelet":"User is not allow to delete",
"uuidNotFound":"Paggans {{uuid}} not found for {{tribeName}}",
"useremailNotfound":"Email not found",
"loginDoesNotExist":" Login does not exist",
"checkCredentials":" Check yopur credentials"
"wrongPassword":"Check your password",
"invalidData":"Check your data",
"pswToosimple":"Password too simple, need to contain at least 8 caracters lower and uppercase, number and @! ...",
"ERRemail":"Check your email",
"ERRnewnewbisdiff":"Both password are not the same",
"paganiddesc":"unique id",
"paganiddesclong":"Unique Identification based on UUID.v4()",
"paganidinfo":"<p> UUID v4 allow a client to generate a unique code without centralisation, base on a timestamp and a salt it looks like 7d8291c0-e137-11e8-9f7b-1dc8e57bed33</p>",
"logindesc":"login",
"logininfo":"<p>Login have to be unique into a town (composed of letter: a to z and 0 to 9)</p><p> To exchange outside of a town, we use PublicKey / uuid or login@tribeId.townId.nationId.dns</p>",
"pswdesc":"A strong password minimum 8char uper lower number specialm char",
"biographydesc":"Few words about you",
"publickeyinfo":"<p>This key was generated by your browser, keep the private key related to this public key.</p><p>We garanty your total control by this way</p>.",
"imgavatardesc":"Upload an avatar",
"imgavatarinfo":"For best results, use an image at least 128px by 128px in .jpg format",
"emaildesc":"Email de recuperation de mot de passe",
"telephonedesc":"Phone",
"familyNamedesc":"Last name",
"givenNamedesc":"First name",
"additionalNamedesc":"Nickname",
"additionalNamesinfo":"<p>Carrefull a pseudo is unique into an instance of apxtrib to be sure to contact the right person check pseudo@ domain</p>.<p> Pseudo can be changed that is not the case of login.</p>",
"dtcreatedesc":"Creation date",
"dtupdatedesc":"last update",
"dtlastlogindesc":"Last login access",
"accessrightsdesc":"Your accessrigts"
}

View File

@ -1,41 +1,14 @@
{
"ERRcritical": "Erreur critique",
"loginAlreadyExist": "Ce login exist déjà",
"emailAlreadyExist":"Cet email exist déjà",
"failtoWritefs":"Impossible d'ecrire sur le serveur",
"successfullCreate": "Création réussit",
"successfullDelete": "Mise à jour effectuée",
"serverNeedAuthentification":"Ce serveur a besoin d'une authentification",
"forbiddenAccess":"Accès interdit",
"userNotAllowtoCreate":"Pas d'autorisation de creation",
"userNotAllowtoUpdate":"Pas d'autorisatiuon de mise à jour",
"userNotAllowtoDelet":"Pas d'autorisation de suppression",
"uuidNotFound":"Le paîen {{uuid}} n'existe pas dans la tribu {{tribeName}}",
"useremailNotfound":"Email introuvable",
"loginDoesNotExist":" Login introuvable",
"checkCredentials":" Vérifier vos parametres d'accès"
"wrongPassword":"Vérifier votre mot de passe",
"invalidData":"Vérifier vos données",
"pswToosimple":"Votre mot de passe est trop simple, doit contenir au moins 8 caractères avec des lettres majusculmes, minuscules des nombres et au moins un caractere special @! ...",
"ERRemail":"Vérifier votre email",
"ERRnewnewbisdiff":"Les 2 mots de passe ne sont pas identique",
"uuiddesc":"Identifiant",
"uuiddesclong":"Identifiant unique au format UUID.v4()",
"uuidinfo":"<p> L'usage d'UUID v4 permet de générer un code unique sans centralisation, car il est basé sur un timestamp et une clé crypto ce qui donne un code du type 7d8291c0-e137-11e8-9f7b-1dc8e57bed33 </p>",
"logindesc":"login",
"logininfo":"<p>Le login doit être unique sur une instance d'apxtrib.</p><p> Pour échanger en dehors d'une instance apxtrib on utilise la clé public du user ou pour un humain login@trib.town§.nation.xx avec le nom du domaine qui heberge l'instance</p><p> Ou encore login@domain.xx tout domain.xx utilisé pour heberger un espace web client /tribeid/www/</p>",
"biographydesc":"Vous en quelques mots",
"publickeyinfo":"<p>Cette clé est générée par votre navigateur, garder précisuesement votre clé privée que seule vous connaissez. En cas de perte de cette clé tous vos actifs seront perdus.</p><p>Cette méthode nous permet de vous garantir un contrôle total décentralisé.</p>",
"imgavatardesc":"Changer votren avatar",
"imgavatarinfo":"Pour un meilleur rendu, une mage carré de 128pc en foat jpg",
"emaildesc":"Email",
"telephonedesc":"Tel",
"familyNamedesc":"Nom",
"givenNamedesc":"Prénom",
"additionalNamedesc":"Pseudo",
"additionalNamesinfo":"<p>Nom avec lequel vous souhaitez qu'on vous reconnaisse sur l'instance de l'apxtrib </p><p>Attention ce nom n'est unique que sur une instance d'apxtrib. Un même speudo peut-être utilisé sur un autre serveur pour garantir l'identité vérifié pseudo@ domaine de rattachement.</p>",
"dtcreatedesc":"Date de creation",
"dtupdatedesc":"Dernière mise à jour",
"dtlastlogindesc":"Dernier accès au login",
"accessrightsdesc":"Vos droits d'accès"
}
"title": "L'identité d'un pagan",
"description": "Decrit les informations de l'identité numérique public",
"properties": {
"publickey": {
"title": "Clé public associés à l'alias",
"description": "Cle public généré par openpgp.js lors de la creation d'un compte"
},
"alias": {
"title": "Alias",
"description": "Chaine de texte memnotechnique qui se retiens plus facilement qu'une clé public"
}
}
}

View File

@ -1,8 +0,0 @@
{
"townnamedesc":"A unique town name in a nation for a social world",
"townnamedesclong":"Unique town name in the social world created by a mayor.",
"townnameinfo":"<p> A town is defined by this unique name and a contratcs/townname.js signed by each druid that create a tribe inside this town</p>",
"antsnationdesc":"ants nation",
"statusdesc":"Town's status",
"statusactive":"Active Town"
}

View File

@ -1,8 +0,0 @@
{
"townnamedesc":"Nom unique d'une ville dans une nation",
"townnamedesclong":"Nom unique identifiant une ville dans une nation d'un monde social, créer par un maire d'une nouvelle ville avec un contrat sociale specifique",
"townnameinfo":"<p> Une ville posséde un nom unique, un contrat sociale (contracts/name.js) signé et validé par tous les maires des villes associées à cette nation </p>",
"antsnationdesc":"nation des ants",
"statusdesc":"Statut de la ville",
"statusactive":"Ville active"
}

View File

@ -7,14 +7,20 @@
"type": "object",
"properties": {
"nationId": {
"title":"Unique nation name",
"description":"A unique string that define a nation a-z and 0-9 onlyin a social world",
"type": "string",
"pattern":"^[a-z0-9]*$"
},
"dtcreate": {
"title":"Creation date",
"description":"Nation date of creation",
"type": "string",
"format":"datetime"
},
"contracts":{
"title":"Social contract of the nation",
"description":"A uri of the signed js contract that rules this nation",
"type": "string",
"format":"uri"
}

View File

@ -1,13 +1,29 @@
{
"$id":"https://smatchit.io/schema/pagan",
"$comment":"To create account bin apxtrib",
"type":"object",
"properties":{
"publickey": {"type":"string", "format":"pgpAE256"},
"alias": {"type":"string", "minLength":5, "pattern":"^[a-z0-9]*$" }
}
"required":["publickey","alias"]
"apxprimarykey":[alias],
"apxsecondarykey":[publickey],
"apxsearchindex":[{"key":"alias","val":publickey},{"key":"publickey","val":"alias"}]
}
"$id": "https://smatchit.io/schema/pagan",
"$comment": "To create account bin apxtrib",
"title": "Pagans identity",
"description": "A numeric id in the nationchains world",
"type": "object",
"properties": {
"publickey": {
"title": "Alias's publickey",
"description": "Public key generate with openpgp.js",
"type": "string",
"format": "pgpAE256"
},
"alias": {
"title": "Alias",
"description": "text to remember easiky a public key",
"type": "string",
"minLength": 5,
"pattern": "^[a-z0-9]*$"
}
},
"required": ["publickey", "alias"],
"apxprimarykey": ["alias"],
"apxsecondarykey": ["publickey"],
"apxsearchindex": [
{ "key": "alias", "val": "publickey" },
{ "key": "publickey", "val": "alias" }
]
}

View File

@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "nationchains/schema/person",
"title": "Person minimum definition to link a person to a pagan identity",
"description": "A person is a human with a apxtrib identity (Public Private Key. Information stored (not cipher) for a person are only visible from the town's Mayor and the tribe's Druid. You need at least trus the druid that trust the mayor (for sensitive data Mayor and Druid can be the same apx Identity.) Only a pagan that have the privateKey can read cipher data.",
"description": "A person is a human with a apxtrib identity (Public Private Key. Information stored (not cipher) for a person are only visible from the town's Mayor and the tribe's Druid. You need at least trus the druid that trust the mayor (for sensitive data Mayor and Druid can be the same apx Identity.) Only a pagan that have the privateKey can read cipher data. The purpose of this sschema is to link a person to a tribe and manage basic activities, profil will be a tribe object if need more personnal information",
"type": "objects",
"properties": {
"alias": {

View File

@ -231,3 +231,11 @@ pagans.authentifyme = async (
);
apx.save();
};
pagans.logout=()=>{
delete apx.data.auth;
delete apx.data.headers;
apx.data.headers = apxlocal.headers;
apx.save();
alert('delete apx.data.auth and reinit apx.data.header');
}

View File

@ -74,7 +74,7 @@
<hr>
<h3>Logout</h3>
<button type="button" class="btn btn-outline-success btn-sm"
onclick="delete apx.data.auth;apx.data.headers=apxlocal.headers;apx.save();alert('delete apx.data.auth and reinit apx.data.header')">
onclick="pagans.logout();">
Remove headers</button>
<hr>
<h3>I prove that i own this alias</h3>
@ -89,8 +89,7 @@
</div>
<textarea rows="5" id="privatekeyauth"></textarea>
<button class="btn btn-primary"
onclick="pagans.authentifyme(document.getElementById('inputaliasauth').value,document.getElementById('inputpassphraseauth').value,document.getElementById('privatekeyauth').value);document.getElementById('btntestauth').click()">I
am alias</button>
onclick="pagans.authentifyme(document.getElementById('inputaliasauth').value,document.getElementById('inputpassphraseauth').value,document.getElementById('privatekeyauth').value);alert('Click on Test it to check')">Sign my header</button>
<hr>
<h3>Create a decentralized Identity</h3>
<p>apXtrib allow you to create keys to identify yourself with a universal alias</p>

View File

@ -6,6 +6,7 @@ const openpgp = require("openpgp");
const conf = require(`${process.env.dirtown}/conf.json`);
const isAuthenticated = async (req, res, next) => {
// tokens if valid are store in /dirtown/tmp/tokens/xalias_xdays_xhash(20,200)
// once a day rm oldest tokens than 24hours tag job by adding tmp/tokensmenagedone{day}
const currentday = dayjs().date();
console.log(
@ -34,8 +35,8 @@ const isAuthenticated = async (req, res, next) => {
xaliasexists: true,
},
};
console.log(req.session.header);
if (req.session.header.xalias == "anonymous") {
//console.log(req.session.header);
if (req.session.header.xalias == "anonymous" || req.session.header.xhash == "anonymous") {
console.log("alias anonymous means not auth");
return res.status(401).json(resnotauth);
}
@ -43,7 +44,7 @@ const isAuthenticated = async (req, res, next) => {
const tmpfs = `${process.env.dirtown}/tmp/tokens/${req.session.header.xalias}_${
req.session.header.xdays
}_${req.session.header.xhash.substring(20, 200)}`;
console.log(tmpfs);
//console.log(tmpfs);
if (!fs.existsSync(tmpfs)) {
// need to check detached sign
let publickey;
@ -53,7 +54,7 @@ const isAuthenticated = async (req, res, next) => {
)
) {
const pagan = fs.readJsonSync(
`${conf.dirapi}nationchains/pagans/itm/${req.session.header.xalias}.json`
`${conf.dirapi}/nationchains/pagans/itm/${req.session.header.xalias}.json`
);
publickey = pagan.publicKey;
} else {
@ -65,10 +66,21 @@ const isAuthenticated = async (req, res, next) => {
return res.status(404).send(resnotauth);
}
}
console.log(publickey);
console.log(Buffer.from(req.session.header.xhash, "base64").toString());
const publicKey = await openpgp.readKey({ armoredKey: publickey });
const msg = await openpgp.createMessage({
if (publickey.substring(0,10)!=="-----BEGIN"){
console.log("Publickey is not valid as armored key:", publickey)
return res.status(404).send(resnotauth);
}
if (Buffer.from(req.session.header.xhash, "base64").toString().substring(0,10)!=="-----BEGIN"){
console.log("xhash conv is not valid as armored key:", Buffer.from(req.session.header.xhash, "base64").toString())
return res.status(404).send(resnotauth);
}
let publicKey;
try {
publicKey = await openpgp.readKey({ armoredKey: publickey });
}catch(err){
console.log(erreur)
}
const msg = await openpgp.createMessage({
text: `${req.session.header.xalias}_${req.session.header.xdays}`,
});
const signature = await openpgp.readSignature({
@ -77,16 +89,16 @@ const isAuthenticated = async (req, res, next) => {
"base64"
).toString(),
});
console.log(msg);
console.log(signature);
console.log(publicKey);
//console.log(msg);
//console.log(signature);
//console.log(publicKey);
const checkauth = await openpgp.verify({
message: msg,
signature: signature,
verificationKeys: publicKey,
});
console.log(checkauth);
console.log(checkauth.signatures[0].keyID);
//console.log(checkauth);
//console.log(checkauth.signatures[0].keyID);
//console.log(await checkauth.signatures[0].signature);
//console.log(await checkauth.signatures[0].verified);

View File

@ -0,0 +1,7 @@
{
"nationnamedesc":"Nom unique d'une nation dans un monde social",
"nationnamedesclong":"Nom unique identifiant une nation dans le monde social créer par un maire d'une nouvelle ville avec un contrat sociale specifique",
"nationnameinfo":"<p> Une nation posséde un nom unique, un contrat sociale (contracts/name.js) signé et validé par tous les maires des villes associées à cette nation </p>",
"statusdesc":"Statut de la nation",
"statusactive":"Nation active"
}

View File

@ -0,0 +1,41 @@
{
"ERRcritical": "Erreur critique",
"loginAlreadyExist": "Ce login exist déjà",
"emailAlreadyExist":"Cet email exist déjà",
"failtoWritefs":"Impossible d'ecrire sur le serveur",
"successfullCreate": "Création réussit",
"successfullDelete": "Mise à jour effectuée",
"serverNeedAuthentification":"Ce serveur a besoin d'une authentification",
"forbiddenAccess":"Accès interdit",
"userNotAllowtoCreate":"Pas d'autorisation de creation",
"userNotAllowtoUpdate":"Pas d'autorisatiuon de mise à jour",
"userNotAllowtoDelet":"Pas d'autorisation de suppression",
"uuidNotFound":"Le paîen {{uuid}} n'existe pas dans la tribu {{tribeName}}",
"useremailNotfound":"Email introuvable",
"loginDoesNotExist":" Login introuvable",
"checkCredentials":" Vérifier vos parametres d'accès"
"wrongPassword":"Vérifier votre mot de passe",
"invalidData":"Vérifier vos données",
"pswToosimple":"Votre mot de passe est trop simple, doit contenir au moins 8 caractères avec des lettres majusculmes, minuscules des nombres et au moins un caractere special @! ...",
"ERRemail":"Vérifier votre email",
"ERRnewnewbisdiff":"Les 2 mots de passe ne sont pas identique",
"uuiddesc":"Identifiant",
"uuiddesclong":"Identifiant unique au format UUID.v4()",
"uuidinfo":"<p> L'usage d'UUID v4 permet de générer un code unique sans centralisation, car il est basé sur un timestamp et une clé crypto ce qui donne un code du type 7d8291c0-e137-11e8-9f7b-1dc8e57bed33 </p>",
"logindesc":"login",
"logininfo":"<p>Le login doit être unique sur une instance d'apxtrib.</p><p> Pour échanger en dehors d'une instance apxtrib on utilise la clé public du user ou pour un humain login@trib.town§.nation.xx avec le nom du domaine qui heberge l'instance</p><p> Ou encore login@domain.xx tout domain.xx utilisé pour heberger un espace web client /tribeid/www/</p>",
"biographydesc":"Vous en quelques mots",
"publickeyinfo":"<p>Cette clé est générée par votre navigateur, garder précisuesement votre clé privée que seule vous connaissez. En cas de perte de cette clé tous vos actifs seront perdus.</p><p>Cette méthode nous permet de vous garantir un contrôle total décentralisé.</p>",
"imgavatardesc":"Changer votren avatar",
"imgavatarinfo":"Pour un meilleur rendu, une mage carré de 128pc en foat jpg",
"emaildesc":"Email",
"telephonedesc":"Tel",
"familyNamedesc":"Nom",
"givenNamedesc":"Prénom",
"additionalNamedesc":"Pseudo",
"additionalNamesinfo":"<p>Nom avec lequel vous souhaitez qu'on vous reconnaisse sur l'instance de l'apxtrib </p><p>Attention ce nom n'est unique que sur une instance d'apxtrib. Un même speudo peut-être utilisé sur un autre serveur pour garantir l'identité vérifié pseudo@ domaine de rattachement.</p>",
"dtcreatedesc":"Date de creation",
"dtupdatedesc":"Dernière mise à jour",
"dtlastlogindesc":"Dernier accès au login",
"accessrightsdesc":"Vos droits d'accès"
}

View File

@ -110,6 +110,8 @@ const setconf = (param) => {
{ space: 2 }
);
fs.ensureDirSync(`../${param.townId}-${param.nationId}/logs/nginx`);
fs.ensureDirSync(`../${param.townId}-${param.nationId}/tmp/tokens`);
const nginxconf = fs.readFileSync(
"./adminapi/www/adminapx/conf/nginx.conf.mustache",
"utf8"