fix creation/auth process

This commit is contained in:
2025-09-01 07:20:17 +02:00
parent d218c3b1d0
commit 2ac5e9ce07
6 changed files with 214 additions and 215 deletions

View File

@@ -227,9 +227,9 @@ apx.listendatawco = (newpropertie) => {
elements.forEach((e) => actionprop(newv, e));
},
});
if (_val !== undefined) {
apx.data.wco[p] = _val;
}
if (_val !== undefined) {
apx.data.wco[p] = _val;
}
}
});
};
@@ -336,64 +336,7 @@ apx.wcoobserver = () => {
e.setAttribute("wco-name", wconame);
});
};
// State management
apx.save = () => {
localStorage.setItem(apx.data.headers.xapp, JSON.stringify(apx.data));
};
apx.update = async () => {
if (!apxtri) {
console.log(
'Please add to the html page header, this line const apxtri = { headers: { xtrkversion: 1, xtribe: "smatchit", xapp: "pwa", xlang: "fr", xalias: "anonymous", xhash: "anonymous", xdays: 0} ,pagename:"apxid"} '
);
return;
}
//if (apxtri.forcereload){localStorage.setItem("forcereload",true)};
if (document.querySelector("html").getAttribute("lang")) {
apxtri.headers.xlang = document.querySelector("html").getAttribute("lang");
}
//alert(localStorage.getItem(apxtri.headers.xapp))
if (localStorage.getItem(apxtri.headers.xapp)) {
apx.data = JSON.parse(localStorage.getItem(apxtri.headers.xapp));
//update with current pagename and eventualy pageauth
apx.data.pagename = apxtri.pagename;
if (apxtri.pageauth) apx.data.pageauth = apxtri.pageauth;
// check localstorage in line with current webpage
if (
apx.data.headers.xtribe != apxtri.headers.xtribe ||
apx.data.headers.xlang != apxtri.headers.xlang ||
apx.data.headers.xtrkversion != apxtri.headers.xtrkversion
) {
// if an app change of tribe
localStorage.removeItem(apxtri.headers.xapp);
delete apx.data;
}
}
if (!apx.data) {
console.log("init or reinit apx.data");
apx.data = apxtri;
}
apx.pagecontext = { search: {}, hash: {} };
if (window.location.hash != "") {
window.location.hash
.slice(1)
.split("&")
.forEach((kv) => {
const keyval = kv.split("=");
apx.pagecontext.hash[keyval[0]] = keyval[1];
});
}
if (window.location.search != "") {
window.location.search
.slice(1)
.split("&")
.forEach((kv) => {
const keyval = kv.split("=");
apx.pagecontext.hash[keyval[0]] = keyval[1];
});
}
console.log("apx.pagecontext:", apx.pagecontext);
apx.managecontext = () => {
// Set authenticate parameter if in pagecontext and redirect to the requested url
console.log(
apx.pagecontext.hash.xdays,
@@ -413,17 +356,12 @@ apx.update = async () => {
) {
//Means this page is called from an external auth app
let headervalid = true;
const headerkey = [
"xalias",
"xhash",
"xdays",
"xprofils",
"xtribe",
"xlang",
];
headerkey.forEach((h) => {
if (apx.pagecontext.hash[h]) {
apx.data.headers[h] = (h==="xprofils")? apx.pagecontext.hash[h].split(","):apx.pagecontext.hash[h];
apx.data.headers[h] =
h === "xprofils"
? apx.pagecontext.hash[h].split(",")
: apx.pagecontext.hash[h];
} else {
headervalid = false;
}
@@ -438,6 +376,85 @@ apx.update = async () => {
console.log("Your try to access a page failled with ", apx.pagecontext);
}
}
};
// State management
apx.save = () => {
localStorage.setItem(apx.data.headers.xapp, JSON.stringify(apx.data));
};
apx.update = async () => {
if (!apxtri || !apxtri.headers || !apxtri.headers.xapp) {
console.log(
'Please add to the html page header, this line const apxtri = { headers: { xtrkversion: 1, xtribe: "smatchit", xapp: "pwa", xlang: "fr", xalias: "anonymous", xhash: "anonymous", xdays: 0} ,pagename:"apxid"} '
);
return;
}
const headerkey = ["xalias", "xhash", "xdays", "xprofils", "xtribe", "xlang"];
if (document.querySelector("html").getAttribute("lang")) {
apxtri.headers.xlang = document.querySelector("html").getAttribute("lang");
}
apxtri.headers.xlang = apxtri.headers?.xlang || "en";
//Get if exist in localstorage a key apxtri.headers.xapp
if (apxtri.headers.xapp && localStorage.getItem(apxtri.headers.xapp)) {
apx.data = JSON.parse(localStorage.getItem(apxtri.headers.xapp));
//update with current pagename and eventualy pageauth
apx.data.pagename = apxtri.pagename;
if (apxtri.pageauth) apx.data.pageauth = apxtri.pageauth;
const isauth = await axios.get('/api/apxtri/pagans/isauth', { headers: apx.data.headers, withCredentials:true,validateStatus: (status) => true});
if (
(isauth.status!==200 && apx.data.headers.alias!=="anonymous") ||
apx.data.headers.xtribe != apxtri.headers.xtribe ||
apx.data.headers.xlang != apxtri.headers.xlang ||
apx.data.headers.xtrkversion != apxtri.headers.xtrkversion
) {
// if no more authenticated or change of tribe...
localStorage.removeItem(apxtri.headers.xapp);
delete apx.data;
}
}
//reinit if apx.data does not exist
apx.data = apx?.data || apxtri;
// get context from url search ?q=x&s=z or hash #q=x&s=z
// search comme from a reloading page instead of hash is just a passive link
apx.pagecontext = { search: {}, hash: {} };
["hash", "search"].forEach((type) => {
const paramString = window.location[type];
if (paramString) {
paramString
.slice(1)
.split("&")
.forEach((kv) => {
const [key, value] = kv.split("=");
apx.pagecontext.hash[key] = value;
});
}
});
console.log("apx.pagecontext:", apx.pagecontext);
// check is authenticated
if (
apx.data.headers.xalias === "anonymous" ||
(apx.pagecontext.hash.xdays &&
dayjs(apx.pagecontext.hash.xdays).diff(dayjs(), "hours") < 25)
) {
// reset authentification data
apx.data.headers.xalias = "anonymous";
apx.data.headers.xdays = 0;
apx.data.headers.xprofils = ["anonymous"];
delete apx.data.headers.xhash;
}
//apx.managecontext(); (todo when all work target is to use context to redirect if key word used in contexte url, ....)
if (
apx.data.headers.xalias === "anonymous" &&
(apx.data.auth || !apx.data.allowedprofils.includes("anonymous"))
) {
// Means user is not authenticat and has a rememberMe previously selected (auth) OR this page is not accessible to an anonymous.
// Redirect to apxid page if auth is ok then redirect to this page
// notauth then expected to have alias privatekey
//document.location.href = `/apxtriadmin/${apx.data.pageauth}_${apx.data.headers.xlang}.html#url=${apx.data.
document.location.href = `/apxtriadmin/apxid_${apx.data.headers.xlang}.html#url=${apx.data.pagename}_${apx.data.headers.xlang}.html`;
}
// check accessright to the page
if (
apx.data.allowedprofils &&
!apx.data.allowedprofils.includes("anonymous") &&
@@ -449,13 +466,9 @@ apx.update = async () => {
console.log("profils authorized:", profilintersect);
if (profilintersect.length == 0) {
alert(apx.data.ref.Middlewares.notallowtoaccess);
document.location.href = `/apxtriadmin/apxid_${apx.data.headers.xlang}.html`
return false;
}
if (dayjs().valueOf() - apx.data.headers.xdays > 86400000) {
// need to refresh authentification if possible by opening the pageauth with url context
// the pageauth redirect to this current page after authentification, if not then wait credential
document.location.href = `/${apx.data.pageauth}_${apx.data.headers.xlang}.html#url=${apx.data.pagename}_${apx.data.headers.xlang}.html`;
}
}
console.log("authorized to access");
/* à voir si utile redirect to authentification page pageauth with a redirection if authentify to the pagename (check if /src/ then add it)
@@ -465,6 +478,11 @@ apx.update = async () => {
apxtri.pagename
}_${apxtri.headers.xlang}.html`;
*/
/// axios setting //
axios.defaults.withCredentials = true; // force to send cookie http only for authentification
axios.defaults.headers.common=apx.data.headers;
////////////////////
////////////////////////////////////////////
apx.data.version = 0; //this force an update to be removed in production
///////////////////////////////////////////
@@ -473,8 +491,7 @@ apx.update = async () => {
let initset = {};
try {
initset = await axios.get(initdb, {
headers: apx.data.headers,
timeout: 2000,
timeout: 2000
});
} catch (err) {
console.log(err);
@@ -491,21 +508,11 @@ apx.update = async () => {
setTimeout(apx.update, 30000);
}
if (initset.data.msg == "data_model_update") {
// mise à jour local
/*if (initset.data.data.wco) {
console.log("WARNING!!, local apxtri.wco was erase by updatelocaldb.wco");
}*/
Object.keys(initset.data.data).forEach((k) => {
if (k !== "headers") {
apx.data[k] = initset.data.data[k];
}
});
/* if (apx.data.confpage.wco && !apx.data.wco){
console.log("update apx.data.wco with localdb cause does not exist")
apx.data.wco=apx.data.confpage.wco;
}
*/
console.log("local update done");
apx.save();
}
@@ -521,84 +528,84 @@ apx.ready(apx.update); //2nd param optional=> true mean does not wait same if ap
apx.indexedDB = apx.indexedDB || {};
apx.indexedDB.set = async (db, storeName, value) => {
return new Promise((resolve, reject) => {
const request = indexedDB.open(db, 1);
return new Promise((resolve, reject) => {
const request = indexedDB.open(db, 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
request.onupgradeneeded = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains("threads")) {
db.createObjectStore("threads", { keyPath: "uuid" });
};
if (!db.objectStoreNames.contains("threads")) {
db.createObjectStore("threads", { keyPath: "uuid" });
}
if (!db.objectStoreNames.contains("messages")) {
db.createObjectStore("messages", { keyPath: "privatriid" });
};
};
if (!db.objectStoreNames.contains("messages")) {
db.createObjectStore("messages", { keyPath: "privatriid" });
}
};
request.onsuccess = (event) => {
const db = event.target.result;
request.onsuccess = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains(storeName)) {
return resolve();
};
if (!db.objectStoreNames.contains(storeName)) {
return resolve();
}
const transaction = db.transaction(storeName, "readwrite");
const store = transaction.objectStore(storeName);
const transaction = db.transaction(storeName, "readwrite");
const store = transaction.objectStore(storeName);
const putRequest = store.put(value);
putRequest.onsuccess = () => resolve();
putRequest.onerror = (error) => reject(error);
};
const putRequest = store.put(value);
putRequest.onsuccess = () => resolve();
putRequest.onerror = (error) => reject(error);
};
request.onerror = (error) => reject(error);
});
request.onerror = (error) => reject(error);
});
};
apx.indexedDB.get = async (db, storeName, key) => {
return new Promise((resolve, reject) => {
const request = indexedDB.open(db, 1);
apx.indexedDB.get = async (db, storeName, key) => {
return new Promise((resolve, reject) => {
const request = indexedDB.open(db, 1);
request.onsuccess = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains(storeName)) {
return resolve(null);
}
const transaction = db.transaction(storeName, "readonly");
const store = transaction.objectStore(storeName);
const getRequest = store.get(key);
getRequest.onsuccess = () => {
resolve(getRequest.result || null);
};
request.onsuccess = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains(storeName)) {
return resolve(null);
}
const transaction = db.transaction(storeName, "readonly");
const store = transaction.objectStore(storeName);
getRequest.onerror = () => resolve(null);
};
const getRequest = store.get(key);
request.onerror = (error) => reject(error);
});
getRequest.onsuccess = () => {
resolve(getRequest.result || null);
};
getRequest.onerror = () => resolve(null);
};
request.onerror = (error) => reject(error);
});
};
apx.indexedDB.del = async (db, storeName, key) => {
return new Promise((resolve, reject) => {
const request = indexedDB.open(db, 1);
return new Promise((resolve, reject) => {
const request = indexedDB.open(db, 1);
request.onsuccess = (event) => {
const db = event.target.result;
request.onsuccess = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains(storeName)) {
return resolve();
};
if (!db.objectStoreNames.contains(storeName)) {
return resolve();
}
const transaction = db.transaction(storeName, "readwrite");
const store = transaction.objectStore(storeName);
const transaction = db.transaction(storeName, "readwrite");
const store = transaction.objectStore(storeName);
const deleteRequest = store.delete(key);
deleteRequest.onsuccess = () => resolve();
deleteRequest.onerror = (error) => reject(error);
};
const deleteRequest = store.delete(key);
deleteRequest.onsuccess = () => resolve();
deleteRequest.onerror = (error) => reject(error);
};
request.onerror = (error) => reject(error);
});
};
request.onerror = (error) => reject(error);
});
};