From b2c74dbcc92dac3c6261c14ac450e90ca50671e6 Mon Sep 17 00:00:00 2001 From: syoul Date: Tue, 2 Dec 2025 19:38:46 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20d'une=20protection=20par=20mot=20de=20p?= =?UTF-8?q?asse=20c=C3=B4t=C3=A9=20client?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/strategie-script.js | 76 +++++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/public/strategie-script.js b/public/strategie-script.js index ea069e4..d6c925c 100644 --- a/public/strategie-script.js +++ b/public/strategie-script.js @@ -1,5 +1,70 @@ // Script pour la gestion des pages de stratégie (function() { + // --- DÉBUT PROTECTION MOT DE PASSE --- + function checkAuth() { + const SESSION_KEY = 'radar_auth_session'; + // Mot de passe simple + const PASSWORD = 'laplank-radar'; + + if (localStorage.getItem(SESSION_KEY) === 'valid') { + return; // Déjà connecté + } + + // Créer l'écran de blocage + const overlay = document.createElement('div'); + overlay.id = 'auth-overlay'; + overlay.style.cssText = 'position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: #1a4d3a; z-index: 10000; display: flex; justify-content: center; align-items: center; flex-direction: column; font-family: sans-serif;'; + + overlay.innerHTML = ` +
+

Accès Restreint

+

Veuillez entrer le mot de passe pour accéder au Radar Stratégique.

+ + + +
+ `; + + document.body.appendChild(overlay); + // Cacher le contenu principal pour éviter le flash + document.body.style.overflow = 'hidden'; + + const btn = document.getElementById('auth-btn'); + const input = document.getElementById('auth-pass'); + const errorMsg = document.getElementById('auth-error'); + + function validate() { + if (input.value === PASSWORD) { + localStorage.setItem(SESSION_KEY, 'valid'); + overlay.remove(); + document.body.style.overflow = 'auto'; + } else { + errorMsg.style.display = 'block'; + input.style.border = '1px solid #e74c3c'; + } + } + + btn.addEventListener('click', validate); + input.addEventListener('keypress', (e) => { + if (e.key === 'Enter') validate(); + }); + } + + // Appeler la sécurité immédiatement + if (document.readyState === 'loading') { + // Bloquer le rendu visuel immédiat si possible + document.documentElement.style.display = 'none'; + document.addEventListener('DOMContentLoaded', () => { + document.documentElement.style.display = ''; + checkAuth(); + initStrategyLinks(); // Initialiser le reste après le chargement + }); + } else { + checkAuth(); + initStrategyLinks(); + } + // --- FIN PROTECTION MOT DE PASSE --- + // Contenu des pages Markdown const pagesContent = { 'strategie': `# Stratégie d'Évolution Technique - Laplank @@ -316,11 +381,11 @@ Le marché de la visualisation de données est en pleine expansion, porté par l * **Besoin** : Comprendre les mouvements de fonds, la création monétaire, les graphes de transactions. * **Cible** : DAOs, projets Blockchain, ONG, Auditeurs financiers. * **Offre** : Dashboards interactifs de transparence, explorateurs de blockchain visuels (au-delà des simples listes de transactions). + * **Lien avec Duniter** : Utilisation possible de la blockchain pour certifier les étapes, visualisées ensuite pour le consommateur final. 2. **Transparence de la Supply Chain (Flux de Marchandises)** * **Besoin** : Tracer l'origine et le parcours des produits (traçabilité). * **Cible** : Coopératives, circuits courts, commerce équitable, industrie agroalimentaire. - * **Lien avec Duniter** : Utilisation possible de la blockchain pour certifier les étapes, visualisées ensuite pour le consommateur final. 3. **Visualisation de Réseaux et Communautés (Web of Trust)** * **Besoin** : Cartographier les relations humaines, la confiance, la gouvernance décentralisée. @@ -822,8 +887,15 @@ Interface de pilotage pour les responsables sécurité des PME. }); if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initStrategyLinks); + // Bloquer le rendu visuel immédiat si possible + document.documentElement.style.display = 'none'; + document.addEventListener('DOMContentLoaded', () => { + document.documentElement.style.display = ''; + checkAuth(); + initStrategyLinks(); + }); } else { + checkAuth(); initStrategyLinks(); } })();