~maj v3.0.19-->v3.0.21
[ptitvelo/web/www.git] / www / ecrire / inc / texte_mini.php
index d1193a0..bd141cc 100644 (file)
@@ -3,7 +3,7 @@
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2012                                                *
+ *  Copyright (c) 2001-2014                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
@@ -75,12 +75,8 @@ function code_echappement($rempl, $source='', $no_transform=false, $mode=NULL) {
                $return .= "<$mode class=\"base64$source\" title=\"$base64\"></$mode>";
        }
 
-       return $return
-               . ((!$no_transform AND $mode == 'div')
-                       ? "\n\n"
-                       : ''
-               );
-;
+       return $return;
+
 }
 
 
@@ -94,7 +90,7 @@ function traiter_echap_html_dist($regs) {
 // http://doc.spip.org/@traiter_echap_code_dist
 function traiter_echap_code_dist($regs) {
        list(,,$att,$corps) = $regs;
-       $echap = htmlspecialchars($corps); // il ne faut pas passer dans entites_html, ne pas transformer les &#xxx; du code !
+       $echap = spip_htmlspecialchars($corps); // il ne faut pas passer dans entites_html, ne pas transformer les &#xxx; du code !
 
        // ne pas mettre le <div...> s'il n'y a qu'une ligne
        if (is_int(strpos($echap,"\n"))) {
@@ -142,6 +138,20 @@ function traiter_echap_script_dist($regs) {
        return $regs[0];
 }
 
+/**
+ * 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)(\s[^>]*)?>(.*)</\1>,UimsS');
 
 // - pour $source voir commentaire infra (echappe_retour)
@@ -163,7 +173,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) {
@@ -179,23 +189,34 @@ $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
-       if (strpos($letexte, "<math>") !== false) {
-               include_spip('inc/math');
-               $letexte = traiter_math($letexte, $source);
+       // 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)
-       if (strpos($letexte,"<"."?")!==false AND preg_match_all(',<[?].*($|[?]>),UisS',
-       $letexte, $matches, PREG_SET_ORDER))
-       foreach ($matches as $regs) {
-               $letexte = str_replace($regs[0],
-                       code_echappement(highlight_string($regs[0],true), $source),
-                       $letexte);
+       // 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) {
+                       $letexte = str_replace($regs[0],
+                               code_echappement(highlight_string($regs[0],true), $source),
+                               $letexte);
+               }
        }
 
        return $letexte;
@@ -208,10 +229,13 @@ $preg='') {
 // http://doc.spip.org/@echappe_retour
 function echappe_retour($letexte, $source='', $filtre = "") {
        if (strpos($letexte,"base64$source")) {
-               # spip_log(htmlspecialchars($letexte));  ## pour les curieux
-               if (strpos($letexte,"<")!==false AND
+               # spip_log(spip_htmlspecialchars($letexte));  ## pour les curieux
+               $max_prof = 5;
+               while (strpos($letexte,"<")!==false
+                       AND
                  preg_match_all(',<(span|div)\sclass=[\'"]base64'.$source.'[\'"]\s(.*)>\s*</\1>,UmsS',
-               $letexte, $regs, PREG_SET_ORDER)) {
+               $letexte, $regs, PREG_SET_ORDER)
+                 AND $max_prof--) {
                        foreach ($regs as $reg) {
                                $rempl = base64_decode(extraire_attribut($reg[0], 'title'));
                                // recherche d'attributs supplementaires
@@ -357,15 +381,52 @@ function echapper_faux_tags($letexte){
   $letexte = "";
   while (count($textMatches)) {
        // un texte a echapper
-       $letexte .= str_replace(array("<"),array('&lt;'),array_shift($textMatches));
+       $letexte .= str_replace("<",'&lt;',array_shift($textMatches));
        // un tag html qui a servit a faite le split
                $letexte .= array_shift($textMatches);
   }
   return $letexte;
 }
 
-// Securite : utiliser SafeHTML s'il est present dans ecrire/safehtml/
-// http://doc.spip.org/@safehtml
+/**
+ * Si le html contenu dans un texte ne passe pas sans transformation a travers safehtml
+ * on l'echappe
+ * si safehtml ne renvoie pas la meme chose on echappe les < en &lt; pour montrer le contenu brut
+ *
+ * @param string $texte
+ * @return string
+ */
+function echapper_html_suspect($texte){
+       if (strpos($texte,'<')===false OR strpos($texte,'=')===false)
+               return $texte;
+
+       // on teste sur strlen car safehtml supprime le contenu dangereux
+       // mais il peut aussi changer des ' en " sur les attributs html,
+       // donc un test d'egalite est trop strict
+       if (strlen(safehtml($texte))!==strlen($texte)){
+               $texte = str_replace("<","&lt;",$texte);
+       }
+
+       return $texte;
+}
+
+
+/**
+ * Sécurise un texte HTML 
+ *
+ * Échappe le code PHP et JS.
+ * Applique en plus safehtml si un plugin le définit dans inc/safehtml.php
+ *
+ * Permet de protéger les textes issus d'une origine douteuse (forums, syndications...)
+ *
+ * @filtre
+ * @link http://www.spip.net/4310
+ * 
+ * @param string $t
+ *      Texte à sécuriser
+ * @return string
+ *      Texte sécurisé
+**/
 function safehtml($t) {
        static $safehtml;