1st commit
This commit is contained in:
		
							
								
								
									
										698
									
								
								wco/apxauth/apxauth.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										698
									
								
								wco/apxauth/apxauth.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,698 @@ | ||||
| var apx = apx || {}; | ||||
| apx.apxauth = {}; | ||||
| apx.apxauth.loadwco = async (id, ctx) => { | ||||
|   // check if not authenticate, do nothing cause by default screensignin and wait authentification | ||||
|   //       if     authenticate, if url xhash then redirect if no url then change wco-link=screenmytribes | ||||
|   // if (dayjs(apx.data.headers.xdays).diff(dayjs(), "hours") >= 24) apx.apxauth.checkisauth(); | ||||
|   //load main.mustache of the component | ||||
|   //when wco-xxx change it run this function | ||||
|   console.log(`Load wconame:apxauth apx.apxauth.loadwco with id:${id} and ctx: ${JSON.stringify(ctx)}`); | ||||
|   const tpldataname = `${apx.data.pagename}_${id}_apxauth`; | ||||
|   const apxauthid = document.getElementById(id) | ||||
|   const data = apx.apxauth.getdata(id, ctx); | ||||
|   if (apxauthid.innerHTML.trim() === "") { | ||||
|     apxauthid.innerHTML = Mustache.render( | ||||
|       apx.data.tpl.apxauthmain, | ||||
|       data | ||||
|     ); | ||||
|   } | ||||
|   apxauthid.querySelector(`.screenaction`).innerHTML = Mustache.render( | ||||
|     apx.data.tpl[`apxauthscreen${ctx.link}`], | ||||
|     data | ||||
|   ); | ||||
|   apxauthid.querySelector(`.msginfo`).innerHTML = ""; | ||||
| }; | ||||
|  | ||||
| apx.apxauth.getdata = (id, ctx) => { | ||||
|   const tpldataname = `${apx.data.pagename}_${id}_apxauth`; | ||||
|   const data = JSON.parse(JSON.stringify(apx.data.tpldata[tpldataname])); | ||||
|   data.id = id; | ||||
|   data.xalias = apx.data.headers.xalias; | ||||
|   data.xtribe = apx.data.headers.xtribe; | ||||
|   data.emailssuport = apx.data.appdata.emailsupport; | ||||
|   switch (ctx.link) { | ||||
|     case "logout": | ||||
|       if (!data.profils) data.profils = []; | ||||
|       apx.data.headers.xprofils.forEach((p) => { | ||||
|         if (!["anonymous", "pagans", "persons"].includes(p)) { | ||||
|           data.profils.push(apx.data.options.profil.itms[p].title); | ||||
|         } | ||||
|       }); | ||||
|       data.noprofils = data.profils.length == 0; | ||||
|       data.member = apx.data.headers.xprofils.includes("persons"); | ||||
|       data.websites = apx.data.appdata.websites; | ||||
|       // get tribes activities | ||||
|       /*["", "https://wall-ants.ndda.fr"]; | ||||
|       axios | ||||
|         .get(`/api/apxtri/tribes/activities`, { | ||||
|           headers: apx.data.headers, | ||||
|         }) | ||||
|         .then((rep) => {}) | ||||
|         .catch((err) => {}); | ||||
|       */ | ||||
|       break; | ||||
|     default: | ||||
|       break; | ||||
|   } | ||||
|   console.log("data for tpl:", data); | ||||
|   return data | ||||
| }; | ||||
|  | ||||
| apx.apxauth.redirecturlwithauth = (url, tribe, webapp, newwindow, windowname = '_blank') => { | ||||
|   url = url.replace(/_[a-zA-Z0-9]{2}\.html/, `_${apx.data.headers.xlang}.html`) | ||||
|   url += `?xtribe=${tribe}&xapp=${webapp}&xalias=${apx.data.headers.xalias}` | ||||
|   url += `&xdays=${apx.data.headers.xdays}&xhash=${apx.data.headers.xhash}` | ||||
|   url += `&xprofils=${apx.data.headers.xprofils.join(',')}` | ||||
|   url += `&xtrkversion=${apx.data.headers.xtrkversion}&xuuid=${apx.data.headers.xuuid}` | ||||
|   if (newwindow) { | ||||
|     try { | ||||
|       const newwin = window.open(url, windowname) | ||||
|       if (newwin === null || typeof newwin === 'undefined') { | ||||
|         console.warn("L'ouverture de la fenêtre a été bloquée par un bloqueur de pop-up."); | ||||
|         // Vous pouvez informer l'utilisateur ici qu'il doit désactiver son bloqueur de pop-up | ||||
|         alert("Votre navigateur a bloqué l'ouverture d'un nouvel onglet. Veuillez autoriser les pop-ups pour ce site."); | ||||
|       } else { | ||||
|         // Optionnel: Mettre le focus sur la nouvelle fenêtre/onglet | ||||
|         newwin.focus(); | ||||
|       } | ||||
|       return newwin; | ||||
|     } catch (error) { | ||||
|       console.error("Une erreur est survenue lors de l'ouverture de l'onglet :", error); | ||||
|       return null; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * logout | ||||
|  * Clean any private key into memory of this app and in the backend | ||||
|  */ | ||||
| apx.apxauth.logout = () => { | ||||
|   axios | ||||
|     .get(`/api/apxtri/pagans/logout`, { | ||||
|       headers: apx.data.headers, | ||||
|     }) | ||||
|     .then((rep) => { | ||||
|       console.log("logout", rep); | ||||
|     }) | ||||
|     .catch((err) => { | ||||
|       console.log("Erreur logout check:", err); | ||||
|     }); | ||||
|   apx.data = apxtri; | ||||
|   apx.save(); | ||||
|   if (apx.pagecontext.hash.url) { | ||||
|     window.location.href = apx.pagecontext.hash.url; | ||||
|   } else { | ||||
|     location.reload(); | ||||
|   } | ||||
| }; | ||||
|  | ||||
| apx.apxauth.setheadersauth = async ( | ||||
|   alias, | ||||
|   passphrase, | ||||
|   publickey, | ||||
|   privatekey, | ||||
|   rememberme | ||||
| ) => { | ||||
|   /** | ||||
|    * Set header with relevant authentification data | ||||
|    * @return {status=200 if apx.data.headers and apx.data.auth properly set} | ||||
|    *         {status: 406 or 500 in case issue} | ||||
|    */ | ||||
|   //console.log(alias, passphrase, publickey, privatekey); | ||||
|   if ( | ||||
|     alias.length < 3 || | ||||
|     publickey.length < 200 || | ||||
|     (privatekey && privatekey.lengtht < 200) | ||||
|   ) { | ||||
|     return { | ||||
|       status: 406, | ||||
|       ref: "Pagans", | ||||
|       msg: "aliasorprivkeytooshort", | ||||
|       data: {}, | ||||
|     }; | ||||
|   } | ||||
|   if (!passphrase) passphrase = ""; | ||||
|   if (rememberme) { | ||||
|     apx.data.auth = { | ||||
|       alias: alias, | ||||
|       publickey: publickey, | ||||
|       privatekey: privatekey, | ||||
|       passphrase: passphrase, | ||||
|     }; | ||||
|   } else if (apx.data.auth) { | ||||
|     delete apx.data.auth; | ||||
|     apx.save(); | ||||
|   } | ||||
|   apx.data.headers.xalias = alias; | ||||
|   apx.data.headers.xdays = dayjs().valueOf(); | ||||
|   const msg = `${alias}_${apx.data.headers.xdays}`; | ||||
|   //console.log("pvk", privatekey); | ||||
|   try { | ||||
|     apx.data.headers.xhash = await apx.apxauth.clearmsgSignature( | ||||
|       publickey, | ||||
|       privatekey, | ||||
|       passphrase, | ||||
|       msg | ||||
|     ); | ||||
|   } catch (err) { | ||||
|     return { | ||||
|       status: 500, | ||||
|       ref: "Middlewares", | ||||
|       msg: "unconsistentpgp", | ||||
|       data: { err: err }, | ||||
|     }; | ||||
|   } | ||||
|   apx.save(); | ||||
|   console.log("xhash set with:", apx.data.headers.xhash); | ||||
|   return { status: 200 }; | ||||
| }; | ||||
| apx.apxauth.authentifyme = async ( | ||||
|   id, | ||||
|   alias, | ||||
|   passphrase, | ||||
|   privatekey, | ||||
|   rememberme | ||||
| ) => { | ||||
|   /** | ||||
|    * Set apx.data.auth with pub, priv, passphrase alias that allow authentification | ||||
|    * set headers with xdays (timestamp) and xhash of message: {alias}_{timestamp} generate with pub & priv key | ||||
|    * | ||||
|    * @Param {key} publickeycreate  optional when alias does not exist | ||||
|    */ | ||||
|   //console.log(alias, passphrase); | ||||
|   //console.log(privatekey); | ||||
|   //clean previous answer if exist | ||||
|    | ||||
|   const idparent=document.getElementById(id).parentElement?.closest('[wco-name]').getAttribute('id') | ||||
|   document.querySelector(`#${id} .msginfo`).innerHTML = ""; | ||||
|   if (alias.length < 3 || privatekey.length < 200) { | ||||
|     apx.notification(`#${id} .msginfo`, { | ||||
|       status: 500, | ||||
|       ref: "Pagans", | ||||
|       msg: "aliasorprivkeytooshort", | ||||
|       data: {}, | ||||
|     }); | ||||
|     return false; | ||||
|   } | ||||
|   console.log(`get /api/apxtri/pagans/alias/${alias}`); | ||||
|   axios | ||||
|     .get(`/api/apxtri/pagans/alias/${alias}`, { | ||||
|       headers: apx.data.headers, | ||||
|     }) | ||||
|     .then(async (rep) => { | ||||
|       //console.log(rep.data); | ||||
|       const setheaders = await apx.apxauth.setheadersauth( | ||||
|         alias, | ||||
|         passphrase, | ||||
|         rep.data.data.publickey, | ||||
|         privatekey, | ||||
|         rememberme | ||||
|       ); | ||||
|       if (setheaders.status != 200) { | ||||
|         apx.notification(`#${id} .msginfo`, setheaders); | ||||
|       } else { | ||||
|         console.log("SetheadersOK"); | ||||
|         console.log(`/api/apxtri/pagans/isauth`); | ||||
|         axios | ||||
|           .get(`/api/apxtri/pagans/isauth`, { | ||||
|             headers: apx.data.headers, | ||||
|           }) | ||||
|           .then((rep) => { | ||||
|             // Authenticate then store profils in header | ||||
|             apx.data.headers.xprofils = rep.data.data.xprofils; | ||||
|             apx.save(); | ||||
|             // if this page is call with apxid_fr.html?url=httpsxxx then it redirect to this page. | ||||
|             //alert(`${window.location.href.includes("/src/")?"/src/":""}${apx.pagecontext.hash.url}`) | ||||
|             if (apx.pagecontext.hash.url) { | ||||
|               window.location.href = `${apx.pagecontext.hash.url}`; | ||||
|             } else { | ||||
|               //location.reload(); | ||||
|               document.getElementById(idparent).setAttribute('wco-link','mytribes'); | ||||
|             } | ||||
|           }) | ||||
|           .catch((err) => { | ||||
|             console.log("Not authentify:", err); | ||||
|             delete apx.data.auth; | ||||
|             apx.save(); | ||||
|             document.getElementById(idparent).setAttribute("wco-link", "signin") | ||||
|             if (err.response) { | ||||
|               apx.notification(`#${id} .msginfo`, err.response.data); | ||||
|             } else if (err.request) { | ||||
|               apx.notification(`#${id} .msginfo`, { | ||||
|                 status: 500, | ||||
|                 ref: "Middlewares", | ||||
|                 msg: "errrequest", | ||||
|                 data: { err: err.request.response }, | ||||
|               }); | ||||
|             } | ||||
|           }); | ||||
|       } | ||||
|     }) | ||||
|     .catch((err) => { | ||||
|       //console.log(err.response); | ||||
|       //console.log(err.request); | ||||
|       console.log("checkalias:", err); | ||||
|       if (err.response && err.response.data.msg) { | ||||
|         //remove auth if not well created previously | ||||
|         //console.log(err.response.data.msg); | ||||
|         if (err.response.data.msg == "aliasdoesnotexist") { | ||||
|           delete apx.data.auth; | ||||
|           apx.save(); | ||||
|           apx.notification(`#${id} .msginfo`, { | ||||
|             status: 404, | ||||
|             ref: "Pagans", | ||||
|             msg: "aliasdoesnotexist", | ||||
|             data: { alias }, | ||||
|           }); | ||||
|           //document.getElementById("inputaliasauth").value=""; | ||||
|           //document.getElementById("inputpassphraseauth").value=""; | ||||
|           //document.getElementById("privatekeyauth").value="" | ||||
|           //window.location.reload(); | ||||
|         } | ||||
|         apx.notification(`#${id} .msginfo`, err.response.data); | ||||
|       } else { | ||||
|         apx.notification(`#${id} .msginfo`, { | ||||
|           status: 500, | ||||
|           ref: "Middlewares", | ||||
|           msg: "errrequest", | ||||
|           data: { err }, | ||||
|         }); | ||||
|       } | ||||
|     }); | ||||
| }; | ||||
| apx.apxauth.recoverykey = (id, aliasoremail) => { | ||||
|   if (aliasoremail.length < 3) { | ||||
|     apx.notification(`#${id} .msginfo`, { | ||||
|       status: 406, | ||||
|       ref: "Pagans", | ||||
|       msg: "recoveryemailnotfound", | ||||
|       data: { tribe: apx.data.headers.xtribe, search: aliasoremail }, | ||||
|     }); | ||||
|     return false; | ||||
|   } | ||||
|   const recodata = { tribe: apx.data.headers.xtribe, search: aliasoremail }; | ||||
|   recodata.emailalias = Checkjson.testformat(aliasoremail, "email") | ||||
|     ? "email" | ||||
|     : "alias"; | ||||
|   document.querySelector(`#${id} .msginfo`).innerHTML = ""; | ||||
|   axios | ||||
|     .post(`/api/apxtri/pagans/keyrecovery`, recodata, { | ||||
|       headers: apx.data.headers, | ||||
|     }) | ||||
|     .then((rep) => { | ||||
|       rep.data.data.search = aliasoremail; | ||||
|       apx.notification(`#${id} .msginfo`, rep.data, true); | ||||
|     }) | ||||
|     .catch((err) => { | ||||
|       //console.log("error:", err); | ||||
|       const dataerr = | ||||
|         err.response && err.response.data | ||||
|           ? err.response.data | ||||
|           : { status: 500, ref: "Pagans", msg: "checkconsole", data: {} }; | ||||
|       dataerr.data.search = aliasoremail; | ||||
|       apx.notification(`#${id} .msginfo`, dataerr, true); | ||||
|     }); | ||||
| }; | ||||
| apx.apxauth.generateKey = async (alias, passphrase) => { | ||||
|   /** | ||||
|    * @param {string} alias a unique alias that identify an identity | ||||
|    * @param {string} passphrase a string to cipher the publickey (can be empty, less secure but simpler) | ||||
|    * @return {publickey,privatekey} with userIds = [{alias}] | ||||
|    */ | ||||
|   const pgpparam = { | ||||
|     type: "ecc", // Type of the key, defaults to ECC | ||||
|     curve: "curve25519", // ECC curve name, defaults to curve25519 | ||||
|     userIDs: [{ alias: alias }], // you can pass multiple user IDs | ||||
|     passphrase: passphrase, // protects the private key | ||||
|     format: "armored", // output key format, defaults to 'armored' (options: 'armored', 'binary' or 'object') | ||||
|   }; | ||||
|   const { privateKey, publicKey } = await openpgp.generateKey(pgpparam); | ||||
|   // key start by '-----BEGIN PGP PRIVATE KEY BLOCK ... ' | ||||
|   // get liste  of alias:pubklickey await axios.get('api/v0/pagans') | ||||
|   // check alias does not exist | ||||
|   return { alias, privatekey: privateKey, publickey: publicKey }; | ||||
| }; | ||||
|  | ||||
| apx.apxauth.verifyKeys = async ( | ||||
|   publicKeyArmored, | ||||
|   privateKeyArmored, | ||||
|   passphrase | ||||
| ) => { | ||||
|   try { | ||||
|     // Charger la clé publique | ||||
|     const publicKey = await openpgp.readKey({ armoredKey: publicKeyArmored }); | ||||
|  | ||||
|     // Charger la clé privée | ||||
|     const privateKey = await openpgp.decryptKey({ | ||||
|       privateKey: await openpgp.readPrivateKey({ | ||||
|         armoredKey: privateKeyArmored, | ||||
|       }), | ||||
|       passphrase: passphrase, // Passphrase de la clé privée (si nécessaire) | ||||
|     }); | ||||
|  | ||||
|     // Créer un message simple à signer | ||||
|     const message = await openpgp.createMessage({ text: "Test message" }); | ||||
|  | ||||
|     // Signer le message avec la clé privée | ||||
|     const signedMessage = await openpgp.sign({ | ||||
|       message: message, // Message à signer | ||||
|       signingKeys: privateKey, // Clé privée pour signer | ||||
|     }); | ||||
|  | ||||
|     // Vérifier la signature avec la clé publique | ||||
|     const verificationResult = await openpgp.verify({ | ||||
|       message: await openpgp.readCleartextMessage({ | ||||
|         cleartextMessage: signedMessage, | ||||
|       }), | ||||
|       verificationKeys: publicKey, // Clé publique pour vérifier | ||||
|     }); | ||||
|  | ||||
|     // Vérifier si la signature est valide | ||||
|     const { verified } = verificationResult.signatures[0]; | ||||
|     await verified; // Resolve la promesse | ||||
|  | ||||
|     console.log("Les clés correspondent et sont valides !"); | ||||
|     return true; | ||||
|   } catch (error) { | ||||
|     console.error("Erreur lors de la vérification des clés : ", error); | ||||
|     return false; | ||||
|   } | ||||
| }; | ||||
| apx.apxauth.testcreatekey = async (alias, passphrase) => { | ||||
|   const pgpparam = { | ||||
|     type: "ecc", // Type of the key, defaults to ECC | ||||
|     curve: "curve25519", // ECC curve name, defaults to curve25519 | ||||
|     userIDs: [{ alias: alias }], // you can pass multiple user IDs | ||||
|     passphrase: passphrase, // protects the private key | ||||
|     format: "armored", // output key format, defaults to 'armored' (options: 'armored', 'binary' or 'object') | ||||
|   }; | ||||
|   const { privateKey, publicKey } = await openpgp.generateKey(pgpparam); | ||||
|  | ||||
|   console.log(verifyKeys(publicKey, privateKey, passphrase)); | ||||
| }; | ||||
| apx.apxauth.detachedSignature = async (privK, passphrase, message) => { | ||||
|   /** | ||||
|    * @privK {string} a test priv key | ||||
|    * @passphrase {string} used to read privK | ||||
|    * @message {string} message to sign | ||||
|    * @Return a detached Signature of the message | ||||
|    */ | ||||
|   let privatekey; | ||||
|   if (passphrase == "" || passphrase == undefined) { | ||||
|     privatekey = await openpgp.readKey({ armoredKey: privK }); | ||||
|   } else { | ||||
|     privatekey = await openpgp.decryptKey({ | ||||
|       privateKey: await openpgp.readPrivateKey({ armoredKey: privK }), | ||||
|       passphrase, | ||||
|     }); | ||||
|   } | ||||
|   //console.log(message); | ||||
|   const msg = await openpgp.createMessage({ text: message }); | ||||
|   //console.log(msg); | ||||
|   const sig = await openpgp.sign({ | ||||
|     message: msg, | ||||
|     signingKeys: privatekey, | ||||
|     detached: true, | ||||
|   }); | ||||
|   return btoa(sig); | ||||
| }; | ||||
| apx.apxauth.clearmsgSignature = async (pubK, privK, passphrase, message) => { | ||||
|   /** | ||||
|    * @privK {string} a test priv key | ||||
|    * @passphrase {string} used to read privK | ||||
|    * @message {string} message to sign | ||||
|    * @Return an base64 Signature of the message or error | ||||
|    */ | ||||
|   const publickey = await openpgp.readKey({ armoredKey: pubK }); | ||||
|   let privatekey; | ||||
|   if (passphrase == "" || passphrase == undefined) { | ||||
|     privatekey = await openpgp.readKey({ armoredKey: privK }); | ||||
|   } else { | ||||
|     privatekey = await openpgp.decryptKey({ | ||||
|       privateKey: await openpgp.readPrivateKey({ armoredKey: privK }), | ||||
|       passphrase, | ||||
|     }); | ||||
|   } | ||||
|   const cleartextMessage = await openpgp.sign({ | ||||
|     message: await openpgp.createCleartextMessage({ text: message }), | ||||
|     signingKeys: privatekey, | ||||
|   }); | ||||
|   console.log(cleartextMessage); | ||||
|   const verificationResult = await openpgp.verify({ | ||||
|     message: await openpgp.readCleartextMessage({ cleartextMessage }), | ||||
|     verificationKeys: publickey, | ||||
|   }); | ||||
|  | ||||
|   const verified = verificationResult.signatures[0]; | ||||
|   const validity = await verified.verified; | ||||
|   if (!validity) throw new Error("invalidsignature"); | ||||
|  | ||||
|   return btoa(cleartextMessage); | ||||
| }; | ||||
| apx.apxauth.authenticatedetachedSignature = async ( | ||||
|   alias, | ||||
|   pubK, | ||||
|   detachedSignature, | ||||
|   message | ||||
| ) => { | ||||
|   /** | ||||
|    *  Check that alias (pubkey) signe a message | ||||
|    *  @alias {string} alias link to the publickey | ||||
|    *  @pubK {string} publiKey text format | ||||
|    *  @detachedSignature  {string} a detachedsignatured get from apx.apxauth.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: atob(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; | ||||
|   } | ||||
| }; | ||||
| apx.apxauth.createIdentity = async ( | ||||
|   id, | ||||
|   alias, | ||||
|   recoemail, | ||||
|   passphrase = "" | ||||
| ) => { | ||||
|   document.querySelector(`#${id} .msginfo`).innerHTML = "" | ||||
|   const aliasregex = /^[a-z0-9]*$/; | ||||
|   //console.log(aliasregex.test(alias)); | ||||
|   if (!(alias && alias.length > 3 && aliasregex.test(alias))) { | ||||
|     apx.notification( | ||||
|       `#${id} .msginfo`, | ||||
|       { | ||||
|         status: "406", | ||||
|         ref: "Pagans", | ||||
|         msg: "invalidalias", | ||||
|         data: {}, | ||||
|       }, | ||||
|       true | ||||
|     ); | ||||
|     return false; | ||||
|   } | ||||
|   if (recoemail.length > 0 && !Checkjson.testformat(recoemail, "email")) { | ||||
|     apx.notification(`#${id} .msginfo`, { | ||||
|       status: 406, | ||||
|       ref: "Pagans", | ||||
|       msg: "invalidemail", | ||||
|       data: {}, | ||||
|     }); | ||||
|     return false; | ||||
|   } | ||||
|   axios | ||||
|     .get(`/api/apxtri/pagans/alias/${alias}`, { | ||||
|       headers: apx.data.headers, | ||||
|     }) | ||||
|     .then((rep) => { | ||||
|       console.log(rep); | ||||
|       apx.notification( | ||||
|         `#${id} .msginfo`, | ||||
|         { | ||||
|           ref: "Pagans", | ||||
|           msg: "aliasexist", | ||||
|           data: { alias }, | ||||
|         }, | ||||
|         true | ||||
|       ); | ||||
|     }) | ||||
|     .catch(async (err) => { | ||||
|       console.log("checkalias:", err); | ||||
|       if (err.response && err.response.status == 404) { | ||||
|         // alias does not exist create it is possible | ||||
|         const keys = await apx.apxauth.generateKey(alias, passphrase); | ||||
|         apx.data.tmpauth = { keys, recoemail, passphrase }; | ||||
|         //console.log(apx.data.tmpauth); | ||||
|         ["publickey", "privatekey"].forEach((k) => { | ||||
|           console.log(`${id} button.signup${k}`); | ||||
|           const btn = document.querySelector( | ||||
|             `#${id} button.signup${k}` | ||||
|           ); | ||||
|           btn.addEventListener("click", () => { | ||||
|             const blob = new Blob([keys[k]], { type: "text/plain" }); | ||||
|             const url = URL.createObjectURL(blob); | ||||
|             const a = document.createElement("a"); | ||||
|             a.href = url; | ||||
|             a.download = `${alias}_${k}.txt`; | ||||
|             document.body.appendChild(a); | ||||
|             a.click(); | ||||
|             document.body.removeChild(a); | ||||
|           }); | ||||
|         }); | ||||
|         document | ||||
|           .querySelectorAll( | ||||
|             `#${id} .signupalias, #${id} .signupemailrecovery, #${id} .signuppassphrase` | ||||
|           ) | ||||
|           .forEach((e) => e.setAttribute("disabled", "disabled")); | ||||
|         document | ||||
|           .querySelector(`#${id} .getmykeys`) | ||||
|           .classList.remove("hidden"); | ||||
|         document | ||||
|           .querySelector(`#${id} .btncreatekey`) | ||||
|           .classList.add("hidden"); | ||||
|       } else { | ||||
|         apx.notification( | ||||
|           `#${id} .msginfo`, | ||||
|           { | ||||
|             ref: "Middlewares", | ||||
|             msg: "errrequest", | ||||
|             data: {}, | ||||
|           }, | ||||
|           true | ||||
|         ); | ||||
|       } | ||||
|     }); | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @param {string} alias to create | ||||
|  * @param {string} publickey | ||||
|  * @param {string} trustedtribe if none => means no passphrase, no privatekey, no trustedtribe | ||||
|  * @param {string} passphrase | ||||
|  * @param {string} privatekey | ||||
|  * @param {string} email  if none => means no passphrase, no privatekey, no trustedtribe | ||||
|  * | ||||
|  * if email!=none and trustedtribe!= none create a person with parson profil in trustedtribe | ||||
|  * if email!=none and trustedtribe==none then send an email at registration with all element but doi not store in backend for futur recovery | ||||
|  * | ||||
|  */ | ||||
| apx.apxauth.test = () => { | ||||
|   //"apx.apxauth.registerIdentity(document.getElementById('inputalias').value,document.getElementById('publickey').document.getElementById('inputpassphrase').value)" | ||||
|   console.log(apx.data.tmpauth); | ||||
| }; | ||||
| apx.apxauth.registerIdentity = async (id, trustedtribe) => { | ||||
|   const authid = document.getElementById(id); | ||||
|   // trustedtribe boolean | ||||
|   //previously store in apx.data.tmpauth={keys:{alias,privatekey,publickey},recoemail,passphrase} | ||||
|   const setheaders = await apx.apxauth.setheadersauth( | ||||
|     apx.data.tmpauth.keys.alias, | ||||
|     apx.data.tmpauth.passphrase, | ||||
|     apx.data.tmpauth.keys.publickey, | ||||
|     apx.data.tmpauth.keys.privatekey, | ||||
|     false | ||||
|   ); | ||||
|   if (setheaders.status != 200) { | ||||
|     apx.notification(`#${id} .msginfo`, setheaders); | ||||
|   } else { | ||||
|     // add withpublickeyforcreate to check isAuthenticated alias does not already exist | ||||
|  | ||||
|     const data = {}; | ||||
|     data.alias = apx.data.tmpauth.keys.alias; | ||||
|     data.publickey = apx.data.tmpauth.keys.publickey; | ||||
|     console.log(apx.data.tmpauth.recoemail, Checkjson.testformat(apx.data.tmpauth.recoemail, "email")) | ||||
|     if (apx.data.tmpauth.recoemail && Checkjson.testformat(apx.data.tmpauth.recoemail, "email")) { | ||||
|       data.passphrase = apx.data.tmpauth.keyspassphrase; | ||||
|       data.privatekey = apx.data.tmpauth.keysprivatekey; | ||||
|       data.email = apx.data.tmpauth.recoemail; | ||||
|     } | ||||
|     data.trustedtribe = trustedtribe; | ||||
|     axios | ||||
|       .post(`/api/apxtri/pagans`, data, { headers: apx.data.headers }) | ||||
|       .then((reppagan) => { | ||||
|         //console.log(reppagan.data); | ||||
|         apx.notification(`#${id} .msginfo`, reppagan.data); | ||||
|         authid.querySelector(`.btncreateidentity`) | ||||
|           .classList.add("hidden"); | ||||
|         authid.querySelector(`.signupbtnreload`) | ||||
|           .classList.remove("hidden"); | ||||
|         //remove tmp cause create phc change to keep tplauth in memory and avoid asking again the pasword | ||||
|         //delete apx.data.tmpauth; | ||||
|         //apx.save(); | ||||
|       }) | ||||
|       .catch((err) => { | ||||
|         console.log("error:", err); | ||||
|         const dataerr = | ||||
|           err.response && err.response.data | ||||
|             ? err.response.data | ||||
|             : { status: 500, ref: "Pagans", msg: "", data: {} }; | ||||
|         apx.notification(`#${id} .msginfo`, dataerr); | ||||
|       }); | ||||
|   } | ||||
| }; | ||||
| apx.apxauth.jointribe = (id) => { | ||||
|   /** | ||||
|    * Allow a pagan to register as a person into a tribe | ||||
|    * header must be authenticated with alias into an app belonging to xtribe AND schema person must have apxaccessright with role "pagan": {"C": []} | ||||
|    */ | ||||
|   //console.log(apx.data); | ||||
|   if (!apx.data.headers.xprofils.includes("persons")) { | ||||
|     apx.data.headers.xprofils.push("persons"); | ||||
|   } | ||||
|   const data = { | ||||
|     alias: apx.data.headers.xalias, | ||||
|     profils: apx.data.headers.xprofils, | ||||
|   }; | ||||
|   axios | ||||
|     .put(`/api/apxtri/pagans/person/${apx.data.headers.xtribe}`, data, { | ||||
|       headers: apx.data.headers, | ||||
|     }) | ||||
|     .then((rep) => { | ||||
|       apx.notification(`#${id} .msginfo`, rep.data); | ||||
|       axios | ||||
|         .get(`/api/apxtri/pagans/logout`, { | ||||
|           headers: apx.data.headers, | ||||
|         }) | ||||
|         .then((rep) => { | ||||
|           console.log("logout", rep); | ||||
|           apx.apxauth.authentifyme( | ||||
|             id, | ||||
|             apx.data.auth.alias, | ||||
|             apx.data.auth.passphrase, | ||||
|             apx.data.auth.privatekey | ||||
|           ); | ||||
|         }) | ||||
|         .catch((err) => { | ||||
|           console.log("Erreur logout check:", err); | ||||
|         }); | ||||
|     }) | ||||
|     .catch((err) => { | ||||
|       console.log("sorry", err); | ||||
|       if (err.response && err.response.data) | ||||
|         apx.notification("#msginfo", err.response.data); | ||||
|       else | ||||
|         apx.notification("#msginfo", { | ||||
|           status: 500, | ||||
|           ref: "Pagans", | ||||
|           msg: "errcreate", | ||||
|           data: {}, | ||||
|         }); | ||||
|     }); | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user