diff --git a/Framework/Csrf_original.php b/Framework/Csrf_original.php
new file mode 100755
index 00000000..e3850456
--- /dev/null
+++ b/Framework/Csrf_original.php
@@ -0,0 +1,57 @@
+ bin2hex(random_bytes(32)),
+ 'created_at' => time(),
+ ];
+ }
+ return $_SESSION['csrf_tokens'][$formName]['token'];
+ }
+
+ /**
+ * Valide le token soumis
+ */
+ public static function validateToken(string $submittedToken, string $formName = 'default'): bool {
+ $session = $_SESSION['csrf_tokens'][$formName] ?? null;
+
+ if (!$session) return false;
+
+ // Expiration après 1 heure
+ if (time() - $session['created_at'] > 3600) {
+ self::destroyToken($formName);
+ return false;
+ }
+
+ $valid = hash_equals($session['token'], $submittedToken);
+
+ // Token à usage unique : on le supprime après validation
+ if ($valid) {
+ self::destroyToken($formName);
+ }
+
+ return $valid;
+ }
+
+ /**
+ * Supprime un token
+ */
+ public static function destroyToken(string $formName = 'default'): void {
+ unset($_SESSION['csrf_tokens'][$formName]);
+ }
+
+ /**
+ * Retourne le champ HTML caché à insérer dans les formulaires
+ */
+ public static function field(string $formName = 'default'): string {
+ $token = self::generateToken($formName);
+ return ''
+ . '';
+ }
+}
\ No newline at end of file
diff --git a/Framework/Vue.php b/Framework/Vue.php
index 86e4febf..f9b8f88d 100755
--- a/Framework/Vue.php
+++ b/Framework/Vue.php
@@ -1,200 +1,156 @@
-ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199);
-?>
-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
-uG===
-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
\ No newline at end of file
+fichier = $fichier . $action . ".php";
+ if (substr($controleur, 0, 2) == "Tb")
+ {
+ $this->nomvue = substr($controleur, 0, 7);
+ } else
+ if (substr($controleur, 0, 2) == "Rq")
+ {
+ $this->nomvue = "Execution";
+ } else
+ {
+ $this->nomvue = $controleur;
+ }
+ $this->datejour = date("Y-m-d");
+ $this->datejourfr = date("d/m/Y");
+ $this->heuresysteme = date("Y-m-d H:i:s");
+ $this->heuresystemefr = date("d/m/Y H:i:s");
+
+ // Ajout du 06/04/2019
+ require_once 'Localisation.php';
+ }
+ public function generer($donnees)
+ {
+ $_SESSION['derniere_action'] = time();
+
+ $contenu = $this->genererFichier($this->fichier, $donnees);
+ $racineWeb = Configuration::get("racineWeb", "/");
+ $_SESSION['racineWeb'] = $racineWeb;
+ if (!isset($_SESSION['menu']))
+ {
+ $vue = $this->genererFichier('Vue/portail.php', array('titre' => $this->titre, 'contenu' => $contenu, 'racineWeb' => $racineWeb));
+ } else
+ {
+ $menus = $_SESSION['menu'];
+ $menusvue = $_SESSION['menu'.$this->nomvue];
+
+ $vue = $this->genererFichier('Vue/gabarit.php', array('titre' => $this->titre, 'contenu' => $contenu,
+ 'racineWeb' => $racineWeb, 'menus' => $menus, 'nomvue' => $this->nomvue, 'menusvue' => $menusvue,
+ 'datejour' => $this->datejour, 'heuresysteme' => $this->heuresysteme));
+ }
+ echo $vue;
+ }
+
+ public function genererAjaxgabarit($donnees)
+ {
+ $contenu = $this->genererFichier($this->fichier, $donnees);
+ $racineWeb = Configuration::get("racineWeb", "/");
+ $_SESSION['racineWeb'] = $racineWeb;
+ if (!isset($_SESSION['menu']))
+ {
+ $vue = $this->genererFichier('Vue/portail.php', array('titre' => $this->titre, 'contenu' => $contenu, 'racineWeb' => $racineWeb));
+ } else
+ {
+ $menus = $_SESSION['menu'];
+ $menusvue = $_SESSION['menu'.$this->nomvue];
+
+ $vue = $this->genererFichier('Vue/gabarit.php', array('titre' => $this->titre, 'contenu' => $contenu,
+ 'racineWeb' => $racineWeb, 'menus' => $menus, 'nomvue' => $this->nomvue, 'menusvue' => $menusvue,
+ 'datejour' => $this->datejour, 'heuresysteme' => $this->heuresysteme));
+ }
+ echo $vue;
+ }
+
+ public function genererAjax($donnees)
+ {
+ $vue = $this->genererFichier($this->fichier, $donnees);
+ echo $vue;
+ }
+
+ private function genererFichier($fichier, $donnees)
+ {
+ if (file_exists($fichier)) {
+ extract($donnees);
+ ob_start();
+ // 18/04/2026 => genérer
+ Csrf::field('Vue');
+ require $fichier;
+ return ob_get_clean();
+ }
+ else {
+ throw new Exception("Fichier '$fichier' introuvable");
+ }
+ }
+ private function nettoyer($valeur)
+ {
+ if (!isset($valeur))
+ {
+ $valeur = '';
+ }
+ return htmlspecialchars($valeur, ENT_QUOTES, 'UTF-8', false);
+ }
+
+ private function nettoyertrue($valeur)
+ {
+ if (!isset($valeur))
+ {
+ $valeur = '';
+ }
+ return htmlspecialchars($valeur, ENT_QUOTES, 'UTF-8', true);
+ }
+
+ private function echapper($valeur)
+ {
+ if (!isset($valeur))
+ {
+ $valeur = '';
+ }
+
+ return addslashes($valeur);
+ }
+
+ private function dechapper($valeur)
+ {
+ if (!isset($valeur))
+ {
+ $valeur = '';
+ }
+
+ return stripslashes($valeur);
+ }
+
+/**
+ * Fonction de fin de session et deconnexion automatique
+ * @param $duree
+*/
+ private function dureesession($duree, $racine){
+ // Le delais est est atteint
+ if(isset($_SESSION['derniere_action']) && (time() - $_SESSION['derniere_action']) > $duree){ //subtract new timestamp from the old one
+ unset($_SESSION['derniere_action']);
+ header('Location: '.$racine.'Connexion/deconnecter');
+ } else {
+ $_SESSION['derniere_action'] = time(); //set new timestamp
+ }
+ }
+
+}
\ No newline at end of file