Valider 5bcb67cf rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Report de r21272 : Bugfix : quand on appelle echappe_html avec autre chose que...

Report de r21272 : Bugfix : quand on appelle echappe_html avec autre chose que la preg par defaut definie par la constante _PROTEGE_BLOCS, il ne faut pas echapper automatiquement les <math> et <?...?> car ce peut-être tout à fait hasardeux.

1/On refactor le traitement de <math> en l'integrant à _PROTEGE_BLOCS pour eviter le derogatoire
mais on conserve en 3.0 le vieil appel derogatoire (pour ne pas risquer de rupture fonctionnelle si jamais _PROTEGE_BLOCS était personalisée) en le conditionnant  à la presence de "code" dans _PROTEGE_BLOCS
Cet appel est a supprimer en branche 3.1
2/Concernant l'echappement des <? .. ?>, on le conditionne a la presence de "script" dans _PROTEGE_BLOCS car c'en est une extension qui ne peut pas passer dans la regexp
parent 0c0566c8
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+36 −11
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -159,7 +159,21 @@ function traiter_echap_script_dist($regs) {
	return $regs[0];
}

define('_PROTEGE_BLOCS', ',<(html|code|cadre|frame|script)(\s[^>]*)?>(.*)</\1>,UimsS');
/**
 * Traiter les blocs <math></math> echappes par echappe_html
 * @param $regs
 * @return string
 */
function traiter_echap_math_dist($regs) {
	// Gestion du TeX
	if (!function_exists('traiter_math'))
		include_spip('inc/math');

	$t = traiter_math($regs[0], '');
	return $t;
}

define('_PROTEGE_BLOCS', ',<(html|code|cadre|frame|script|math)(\s[^>]*)?>(.*)</\1>,UimsS');

// - pour $source voir commentaire infra (echappe_retour)
// - pour $no_transform voir le filtre post_autobr dans inc/filtres
@@ -180,7 +194,7 @@ $preg='') {
	}

	if (($preg OR strpos($letexte,"<")!==false)
	  AND preg_match_all($preg ? $preg : _PROTEGE_BLOCS, $letexte, $matches, PREG_SET_ORDER))
	  AND preg_match_all($preg ? $preg : _PROTEGE_BLOCS, $letexte, $matches, PREG_SET_ORDER)) {
		foreach ($matches as $regs) {
			// echappements tels quels ?
			if ($no_transform) {
@@ -196,17 +210,27 @@ $preg='') {
			$p = strpos($letexte,$regs[0]);
			$letexte = substr_replace($letexte,code_echappement($echap, $source, $no_transform),$p,strlen($regs[0]));
		}
	}

	if ($no_transform)
		return $letexte;

	// Gestion du TeX
	// code mort sauf si on a personalise _PROTEGE_BLOCS sans y mettre <math>
	// eviter la rupture de compat en branche 3.0
	// a supprimer en branche 3.1
	if (strpos($preg ? $preg : _PROTEGE_BLOCS,'code')!==false){
		if (strpos($letexte, "<math>") !== false) {
			include_spip('inc/math');
			$letexte = traiter_math($letexte, $source);
		}
	}

	// Echapper le php pour faire joli (ici, c'est pas pour la securite)
	// seulement si on a echappe les <script>
	// (derogatoire car on ne peut pas faire passer < ? ... ? >
	// dans une callback autonommee
	if (strpos($preg ? $preg : _PROTEGE_BLOCS,'script')!==false){
		if (strpos($letexte,"<"."?")!==false AND preg_match_all(',<[?].*($|[?]>),UisS',
		$letexte, $matches, PREG_SET_ORDER))
		foreach ($matches as $regs) {
@@ -214,6 +238,7 @@ $preg='') {
				code_echappement(highlight_string($regs[0],true), $source),
				$letexte);
		}
	}

	return $letexte;
}