forked from FroSteel/Planification
refactor: reconnaissance de l'auteur par empreintes, sans nom en clair
This commit is contained in:
+12
-4
@@ -549,9 +549,17 @@ let _myActionsDiag = ""; // diagnostic du dernier fetch (affiché dans l'onglet)
|
|||||||
let _impersonate = null;
|
let _impersonate = null;
|
||||||
// Vrai uniquement si l'utilisateur connecté EST FroSteel (garde-fou
|
// Vrai uniquement si l'utilisateur connecté EST FroSteel (garde-fou
|
||||||
// pour n'afficher l'onglet Test qu'à lui).
|
// pour n'afficher l'onglet Test qu'à lui).
|
||||||
function _isQuentin() {
|
// Empreintes FNV-1a (32 bits) du nom et du prenom de l'auteur : jamais en clair dans le code.
|
||||||
|
const _EMPREINTES_AUTEUR = [0x716d54e7, 0xa6e31b47];
|
||||||
|
function _empreinteMot(mot) {
|
||||||
|
let h = 0x811c9dc5;
|
||||||
|
for (const c of mot) { h ^= c.codePointAt(0); h = Math.imul(h, 0x01000193) >>> 0; }
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
function _estAuteur() {
|
||||||
const n = (state && state.currentUser && state.currentUser.name) || "";
|
const n = (state && state.currentUser && state.currentUser.name) || "";
|
||||||
return /exemple/i.test(n) && /FroSteel/i.test(n);
|
const mots = new Set(n.toLowerCase().split(/[^a-zà-ÿ]+/).filter(Boolean).map(_empreinteMot));
|
||||||
|
return _EMPREINTES_AUTEUR.every((e) => mots.has(e));
|
||||||
}
|
}
|
||||||
// Identité effective utilisée pour retrouver "l'action liée à la personne"
|
// Identité effective utilisée pour retrouver "l'action liée à la personne"
|
||||||
// (Partie A « Mes actions »). Si impersonation active ET FRS → identité simulée,
|
// (Partie A « Mes actions »). Si impersonation active ET FRS → identité simulée,
|
||||||
@@ -563,7 +571,7 @@ function _effectiveIdentity() {
|
|||||||
memberId: (state && state.currentUser && state.currentUser.memberId) || "",
|
memberId: (state && state.currentUser && state.currentUser.memberId) || "",
|
||||||
impersonated: false
|
impersonated: false
|
||||||
};
|
};
|
||||||
if (_isQuentin() && _impersonate && _impersonate.enabled &&
|
if (_estAuteur() && _impersonate && _impersonate.enabled &&
|
||||||
(_impersonate.name || _impersonate.initials || _impersonate.memberId)) {
|
(_impersonate.name || _impersonate.initials || _impersonate.memberId)) {
|
||||||
return {
|
return {
|
||||||
name: _impersonate.name || "",
|
name: _impersonate.name || "",
|
||||||
@@ -3113,7 +3121,7 @@ async function showAdminPanel(initialSection) {
|
|||||||
// v2026.5.46 — onglet "Test (FRS)" RÉSERVÉ à FroSteel : permet de
|
// v2026.5.46 — onglet "Test (FRS)" RÉSERVÉ à FroSteel : permet de
|
||||||
// se faire passer pour une autre personne (coordinateur) pour tester « Mes
|
// se faire passer pour une autre personne (coordinateur) pour tester « Mes
|
||||||
// actions » sans être réellement coordinateur. Caché pour tout autre utilisateur.
|
// actions » sans être réellement coordinateur. Caché pour tout autre utilisateur.
|
||||||
if (_isQuentin()) {
|
if (_estAuteur()) {
|
||||||
sections.push({ id: "qrotest", label: "🧪 Test (FRS)", render: renderAdminSectionImpersonate });
|
sections.push({ id: "qrotest", label: "🧪 Test (FRS)", render: renderAdminSectionImpersonate });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user