[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / inc / filtres.php
index ae61ab2..96df45b 100644 (file)
@@ -3,7 +3,7 @@
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2014                                                *
+ *  Copyright (c) 2001-2016                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
@@ -419,6 +419,19 @@ function filtrer_entites($texte) {
        return $texte;
 }
 
+/**
+ * Version securisee de filtrer_entites
+ * @param string $t
+ * @return string
+ */
+if (!function_exists('filtre_filtrer_entites_dist')) {
+       function filtre_filtrer_entites_dist($t) {
+               include_spip('inc/texte');
+               return interdire_scripts(filtrer_entites($t));
+       }
+}
+
+
 // caracteres de controle - http://www.w3.org/TR/REC-xml/#charsets
 // http://doc.spip.org/@supprimer_caracteres_illegaux
 function supprimer_caracteres_illegaux($texte) {
@@ -426,7 +439,7 @@ function supprimer_caracteres_illegaux($texte) {
        static $to = null;
        
        if (is_array($texte)) {
-               return array_map('corriger_caracteres_windows', $texte);
+               return array_map('supprimer_caracteres_illegaux', $texte);
        }
        
        if (!$to) $to = str_repeat('-', strlen($from));
@@ -1322,8 +1335,8 @@ function filtrer_ical($texte) {
 function date_ical($date, $addminutes = 0) {
        list($heures, $minutes, $secondes) = recup_heure($date);
        list($annee, $mois, $jour) = recup_date($date);
-       return date("Ymd\THis", 
-                   mktime($heures, $minutes+$addminutes,$secondes,$mois,$jour,$annee));
+
+       return gmdate("Ymd\THis\Z", mktime($heures, $minutes + $addminutes, $secondes, $mois, $jour, $annee));
 }
 
 // date_iso retourne la date au format "RFC 3339" / "ISO 8601"
@@ -2201,21 +2214,31 @@ function url_absolue_css ($css) {
  * @param mixed $defaut
  *             Valeur par defaut retournee si la cle demandee n'existe pas
  * 
+ * @param bool  $conserver_null
+ *     Permet de forcer la fonction à renvoyer la valeur null d'un index
+ *     et non pas $defaut comme cela est fait naturellement par la fonction
+ *     isset. On utilise alors array_key_exists() à la place de isset().
+ *
  * @return mixed Valeur trouvee ou valeur par defaut.
 **/
-function table_valeur($table, $cle, $defaut='') {
+function table_valeur($table, $cle, $defaut = '', $conserver_null = false) {
        foreach (explode('/', $cle) as $k) {
 
                $table = is_string($table) ? @unserialize($table) : $table;
 
                if (is_object($table)) {
-                       $table =  (($k !== "") and isset($table->$k)) ? $table->$k : $defaut;
+                       $table = (($k !== "") and isset($table->$k)) ? $table->$k : $defaut;
                } elseif (is_array($table)) {
-                       $table = isset($table[$k]) ? $table[$k] : $defaut;
+                       if ($conserver_null) {
+                               $table = array_key_exists($k, $table) ? $table[$k] : $defaut;
+                       } else {
+                               $table = isset($table[$k]) ? $table[$k] : $defaut;
+                       }
                } else {
                        $table = $defaut;
                }
        }
+
        return $table;
 }
 
@@ -2507,8 +2530,10 @@ function encoder_contexte_ajax($c,$form='', $emboite=NULL, $ajaxid='') {
        
        if (!function_exists('calculer_cle_action'))
                include_spip("inc/securiser_action");
-       $cle = calculer_cle_action($form.(is_array($c)?serialize($c):$c));
-       $c = serialize(array($c,$cle));
+
+       $c = serialize($c);
+       $cle = calculer_cle_action($form . $c);
+       $c = "$cle:$c";
 
        // on ne stocke pas les contextes dans des fichiers caches
        // par defaut, sauf si cette configuration a ete forcee
@@ -2554,8 +2579,10 @@ function encoder_contexte_ajax($c,$form='', $emboite=NULL, $ajaxid='') {
        $r = self();
        $r = ' data-origin="'.$r.'"';
        $class = 'ajaxbloc';
-       if ($ajaxid AND is_string($ajaxid)){
-               $class .= ' ajax-id-'.$ajaxid;
+       if ($ajaxid and is_string($ajaxid)) {
+               // ajaxid est normalement conforme a un nom de classe css
+               // on ne verifie pas la conformite, mais on passe entites_html par dessus par precaution
+               $class .= ' ajax-id-' . entites_html($ajaxid);
        }
        return "<div class='$class' "."data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n";
 }
@@ -2575,10 +2602,20 @@ function decoder_contexte_ajax($c,$form='') {
                if (function_exists('gzdeflate') && function_exists('gzinflate'))
                        $c = @gzinflate($c);
        }
-       list($env, $cle) = @unserialize($c);
 
-       if ($cle == calculer_cle_action($form.(is_array($env)?serialize($env):$env)))
-               return $env;
+       // extraire la signature en debut de contexte
+       // et la verifier avant de deserializer
+       // format : signature:donneesserializees
+       if ($p = strpos($c,":")){
+               $cle = substr($c,0,$p);
+               $c = substr($c,$p+1);
+
+               if ($cle == calculer_cle_action($form . $c)) {
+                       $env = @unserialize($c);
+                       return $env;
+               }
+       }
+
        return false;
 }