From f4ee800c2ab7e54928abe81f7e994363bcd58f3d Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Tue, 11 Mar 2008 16:03:17 +0000
Subject: [PATCH] - desactiver la double occurence de interdire_script dans
 l'espace prive (appel general + appel dans les parties squeletisee) en
 inhibant les appels depuis squelette dans l'espace prive -> corrige un bug
 d'echappement du js des modeles dans l'espace prive - autoriser les modeles a
 produire du php, en l'echappant sur le meme modele que le js

- application a un modele generique formulaire qui permet d'inserer les formulaires dynamiques implementes par la nouvelle API :
<formulaire|ecrire_auteur>

+ deux test de typage sur les echappements pour eviter des warnings
---
 .gitattributes               |  1 +
 dist/modeles/formulaire.html |  4 ++
 ecrire/inc/filtres.php       |  2 +-
 ecrire/inc/texte.php         | 93 +++++++++++++++++++++---------------
 ecrire/public/assembler.php  |  5 +-
 5 files changed, 64 insertions(+), 41 deletions(-)
 create mode 100644 dist/modeles/formulaire.html

diff --git a/.gitattributes b/.gitattributes
index d2bc1a4797..28658b1b89 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -261,6 +261,7 @@ dist/modeles/audio.html -text
 dist/modeles/doc.html -text
 dist/modeles/emb.html -text
 dist/modeles/foreach.html -text
+dist/modeles/formulaire.html -text
 dist/modeles/image.html -text
 dist/modeles/img.html -text
 dist/modeles/lesauteurs.html -text
diff --git a/dist/modeles/formulaire.html b/dist/modeles/formulaire.html
new file mode 100644
index 0000000000..7536a4695c
--- /dev/null
+++ b/dist/modeles/formulaire.html
@@ -0,0 +1,4 @@
+<?php
+/* une fonction qui produit du php qui ne sera execute qu'au service final de la page */
+echo executer_balise_dynamique('FORMULAIRE_',array_merge(array('[(#ENV{class}|texte_script)]'),[(#ENV{args}|var_export{true})]),array(),'#ENV{lang}',0);
+?>
\ No newline at end of file
diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 24e6bdb0f4..ee39446df4 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -341,7 +341,7 @@ function proteger_amp($texte){
 }
 // http://doc.spip.org/@entites_html
 function entites_html($texte, $tout=false) {
-	if (!$texte) return $texte;
+	if (!is_string($texte) OR !$texte) return $texte;
 	include_spip('inc/texte');
 	$texte = htmlspecialchars(echappe_retour(echappe_html($texte,'',true),'','proteger_amp'));
 	if ($tout)
diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php
index e36ff5ef16..08eff917ae 100644
--- a/ecrire/inc/texte.php
+++ b/ecrire/inc/texte.php
@@ -222,7 +222,8 @@ function traiter_echap_script_dist($regs) {
 // http://doc.spip.org/@echappe_html
 function echappe_html($letexte, $source='', $no_transform=false,
 $preg='') {
-	if (!strlen($letexte)) return '';
+	if (!is_string($letexte) or !strlen($letexte))
+		return $letexte;
 
 	if (!$preg) $preg = ',<(html|code|cadre|frame|script)'
 			.'(\s[^>]*)?'
@@ -302,11 +303,6 @@ function echappe_retour_modeles($letexte)
 	if (!_DIR_RESTREINT)
 		$letexte = interdire_scripts($letexte);
 
-	// Reinserer les echappements des modeles 
-
-	if (defined('_PROTEGE_JS_MODELES'))
-		$letexte = echappe_retour($letexte,"javascript"._PROTEGE_JS_MODELES);
-
 	return trim($letexte);
 }
 
@@ -429,46 +425,65 @@ function echappe_js($t,$class='') {
 // http://doc.spip.org/@protege_js_modeles
 function protege_js_modeles($t) {
 	if (isset($GLOBALS['visiteur_session'])){
-		if (!defined('_PROTEGE_JS_MODELES')){
-			include_spip('inc/acces');
-			define('_PROTEGE_JS_MODELES',creer_uniqid());
-		}
-		if (preg_match_all(',<script.*?($|</script.),isS', $t, $r, PREG_SET_ORDER))
+		if (preg_match_all(',<script.*?($|</script.),isS', $t, $r, PREG_SET_ORDER)){
+			if (!defined('_PROTEGE_JS_MODELES')){
+				include_spip('inc/acces');
+				define('_PROTEGE_JS_MODELES',creer_uniqid());
+			}
 			foreach ($r as $regs)
 				$t = str_replace($regs[0],code_echappement($regs[0],'javascript'._PROTEGE_JS_MODELES),$t);
+		}
+		if (preg_match_all(',<\?php.*?($|\?'.'>),isS', $t, $r, PREG_SET_ORDER)){
+			if (!defined('_PROTEGE_PHP_MODELES')){
+				include_spip('inc/acces');
+				define('_PROTEGE_PHP_MODELES',creer_uniqid());
+			}
+			foreach ($r as $regs)
+				$t = str_replace($regs[0],code_echappement($regs[0],'php'._PROTEGE_PHP_MODELES),$t);
+		}
 	}
 	return $t;
 }
 
 // Securite : empecher l'execution de code PHP, en le transformant en joli code
+// l'espace prive est securise globalement par un appel explicite un interdire_script
+// on desactive l'appel des squelettes tant que la protection globale est la
+// a terme (tout l'espace prive en skel) il faudra mettre $protege_espace_prive = true
 // http://doc.spip.org/@interdire_scripts
-function interdire_scripts($t) {
-
-	// rien ?
-	if (!$t OR !strstr($t, '<')) return $t;
-
-	// echapper les tags asp/php
-	$t = str_replace('<'.'%', '&lt;%', $t);
-
-	// echapper le php
-	$t = str_replace('<'.'?', '&lt;?', $t);
-
-	// echapper le < script language=php >
-	$t = preg_replace(',<(script\b[^>]+\blanguage\b[^\w>]+php\b),UimsS', '&lt;\1', $t);
-
-	// Pour le js, trois modes : parano (-1), prive (0), ok (1)
-	switch($GLOBALS['filtrer_javascript']) {
-		case 0:
-			if (!_DIR_RESTREINT)
-				$t = echappe_js($t,' style="color:red"');
-			break;
-		case -1:
-			$t = echappe_js($t);
-			break;
+function interdire_scripts($t, $protege_espace_prive = false) {
+	if (_DIR_RESTREINT || $protege_espace_prive) {
+	
+		// rien ?
+		if (!$t OR !strstr($t, '<')) return $t;
+	
+		// echapper les tags asp/php
+		$t = str_replace('<'.'%', '&lt;%', $t);
+	
+		// echapper le php
+		$t = str_replace('<'.'?', '&lt;?', $t);
+	
+		// echapper le < script language=php >
+		$t = preg_replace(',<(script\b[^>]+\blanguage\b[^\w>]+php\b),UimsS', '&lt;\1', $t);
+	
+		// Pour le js, trois modes : parano (-1), prive (0), ok (1)
+		switch($GLOBALS['filtrer_javascript']) {
+			case 0:
+				if (!_DIR_RESTREINT)
+					$t = echappe_js($t,' style="color:red"');
+				break;
+			case -1:
+				$t = echappe_js($t);
+				break;
+		}
+	
+		// pas de <base href /> svp !
+		$t = preg_replace(',<(base\s),iS', '&lt;\1', $t);
 	}
-
-	// pas de <base href /> svp !
-	$t = preg_replace(',<(base\s),iS', '&lt;\1', $t);
+	// Reinserer les echappements des modeles 
+	if (defined('_PROTEGE_JS_MODELES'))
+		$t = echappe_retour($t,"javascript"._PROTEGE_JS_MODELES);
+	if (defined('_PROTEGE_PHP_MODELES'))
+		$t = echappe_retour($t,"php"._PROTEGE_PHP_MODELES);
 
 	return $t;
 }
@@ -523,8 +538,10 @@ function typo($letexte, $echapper=true, $connect='') {
 		$letexte = echappe_retour($letexte, 'TYPO');
 
 	// Dans l'espace prive, securiser ici
+	// quand tout l'espace prive sera en skel, supprimer cette ligne et retablir
+	// $protege_espace_prive = true dans interdire_script
 	if (!_DIR_RESTREINT)
-		$letexte = interdire_scripts($letexte);
+		$letexte = interdire_scripts($letexte,true);
 
 	return $letexte;
 }
diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index 31aadffc22..1578885787 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -715,8 +715,9 @@ function inclure_modele($type, $id, $params, $lien, $connect='') {
 
 	// Traiter les parametres
 	// par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
-	$contexte = array_merge($contexte,
-		creer_contexte_de_modele($params));
+	$arg_list = creer_contexte_de_modele($params);
+	$contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
+	$contexte = array_merge($contexte,$arg_list);
 
 	// On cree un marqueur de notes unique lie a ce modele
 	// et on enregistre l'etat courant des globales de notes...
-- 
GitLab