[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / inc / utils.php
index 1650013..d0653b7 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.     *
@@ -45,7 +45,9 @@ function charger_fonction($nom, $dossier='exec', $continue=false) {
 
        if (!preg_match(',^\w+$,', $f)){
                if ($continue) return false; //appel interne, on passe
-               die(spip_htmlspecialchars($nom)." pas autorise");
+               include_spip('inc/minipres');
+               echo minipres();
+               exit;
        }
 
        // passer en minuscules (cf les balises de formulaires)
@@ -66,7 +68,8 @@ function charger_fonction($nom, $dossier='exec', $continue=false) {
 
        include_spip('inc/minipres');
        echo minipres(_T('forum_titre_erreur'),
-                _T('fichier_introuvable', array('fichier'=> '<b>'.spip_htmlentities($d).'</b>')));
+                _T('fichier_introuvable', array('fichier'=> '<b>'.spip_htmlentities($d).'</b>')),
+               array('all_inline'=>true,'status'=>404));
        exit;
 }
 
@@ -77,7 +80,7 @@ function charger_fonction($nom, $dossier='exec', $continue=false) {
  */
 function include_once_check($file){
        if (file_exists($file)) {include_once $file;return true;}
-       $crash = (isset($GLOBALS['message_crash_plugins'])?unserialize($GLOBALS['message_crash_plugins']):'');
+       $crash = (isset($GLOBALS['meta']['message_crash_plugins'])?unserialize($GLOBALS['meta']['message_crash_plugins']):'');
        $crash = ($crash?$crash:array());
        $crash[$file] = true;
        ecrire_meta('message_crash_plugins',serialize($crash));
@@ -271,12 +274,27 @@ function set_request($var, $val = NULL, $c=false) {
 
 
 /**
- * Tester si une url est absolue
- * @param  $url
+ * Tester si une URL est absolue
+ * 
+ * On est sur le web, on exclut certains protocoles, 
+ * notamment 'file://', 'php://' et d'autres…
+
+ * @param string $url
  * @return bool
  */
-function tester_url_absolue($url){
-       return preg_match(";^([a-z]+:)?//;Uims",trim($url))?true:false;
+function tester_url_absolue($url) {
+       $url = trim($url);
+       if (preg_match(";^([a-z]{3,7}:)?//;Uims", $url, $m)) {
+               if (
+                       isset($m[1])
+                       and $p = strtolower(rtrim($m[1], ':'))
+                       and in_array($p, array('file', 'php', 'zlib', 'glob', 'phar', 'ssh2', 'rar', 'ogg', 'expect', 'zip'))
+                 ) {
+                       return false;
+               }
+               return true;
+       }
+       return false;
 }
 
 /**
@@ -872,7 +890,7 @@ function lister_themes_prives(){
                $themes = array(_SPIP_THEME_PRIVE);
                // lors d'une installation neuve, prefs n'est pas definie.
                if (isset($GLOBALS['visiteur_session']['prefs'])) {
-                       $prefs = isset($GLOBALS['visiteur_session']['prefs']);
+                       $prefs = $GLOBALS['visiteur_session']['prefs'];
                } else {
                        $prefs = array();
                }
@@ -969,8 +987,11 @@ function find_in_path ($file, $dirname='', $include=false) {
                                        include_once _ROOT_CWD . $a;
                                        $inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
                                }
-                               if (!defined('_SAUVER_CHEMIN'))
-                                       define('_SAUVER_CHEMIN',true);
+                               if (!defined('_SAUVER_CHEMIN')){
+                                       // si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
+                                       if (is_null($GLOBALS['path_files'])) return $a;
+                                       define('_SAUVER_CHEMIN', true);
+                               }
                                return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = $a;
                        }
                }
@@ -988,8 +1009,11 @@ function find_in_path ($file, $dirname='', $include=false) {
                }
        }
 
-       if (!defined('_SAUVER_CHEMIN'))
-               define('_SAUVER_CHEMIN',true);
+       if (!defined('_SAUVER_CHEMIN')){
+               // si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
+               if (is_null($GLOBALS['path_files'])) return false;
+               define('_SAUVER_CHEMIN', true);
+       }
        return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = false;
 }
 
@@ -1214,8 +1238,9 @@ function test_valeur_serveur($truc) {
 // Fonctions de fabrication des URL des scripts de Spip
 //
 /**
- * l'URL de base du site, sans se fier a meta(adresse_site) qui
- * peut etre fausse (sites a plusieurs noms d'hotes, deplacements, erreurs)
+ * L'URL de base du site, en priorité sans se fier a meta(adresse_site) qui
+ * peut etre fausse (sites a plusieurs noms d'hotes, deplacements, erreurs).
+ * En dernier recours, lorsqu'on ne trouve rien, on utilise adresse_site comme fallback.
  * Note : la globale $profondeur_url doit etre initialisee de maniere a
  * indiquer le nombre de sous-repertoires de l'url courante par rapport a la
  * racine de SPIP : par exemple, sur ecrire/ elle vaut 1, sur sedna/ 1, et a
@@ -1246,8 +1271,16 @@ function url_de_base($profondeur=null) {
                OR (isset($_SERVER['HTTPS']) AND
                    test_valeur_serveur($_SERVER['HTTPS']))
        ) ? 'https' : 'http';
-       # note : HTTP_HOST contient le :port si necessaire
+       // note : HTTP_HOST contient le :port si necessaire
        $host = $_SERVER['HTTP_HOST'];
+       // si on n'a pas trouvé d'hôte du tout, en dernier recours on utilise adresse_site comme fallback
+       if (is_null($host) and isset($GLOBALS['meta']['adresse_site'])) {
+               $host = $GLOBALS['meta']['adresse_site'];
+               if ($scheme = parse_url($host, PHP_URL_SCHEME)) {
+                       $http = $scheme;
+                       $host = str_replace("{$scheme}://", '', $host);
+               }
+       }
        if (isset($_SERVER['SERVER_PORT'])
                AND $port=$_SERVER['SERVER_PORT']
                AND strpos($host,":")==false){
@@ -1281,6 +1314,16 @@ function url_de_($http,$host,$request,$prof=0){
        $prof = max($prof,0);
 
        $myself = ltrim($request,'/');
+       // vieux mode HTTP qui envoie après le nom de la methode l'URL compléte
+       // protocole, "://", nom du serveur avant le path dans _SERVER["REQUEST_URI"]
+       if (strpos($myself,'://') !== false) {
+               $myself = explode('://',$myself);
+               array_shift($myself);
+               $myself = implode('://',$myself);
+               $myself = explode('/',$myself);
+               array_shift($myself);
+               $myself = implode('/',$myself);
+       }
        # supprimer la chaine de GET
        list($myself) = explode('?', $myself);
        $url = join('/', array_slice(explode('/', $myself), 0, -1-$prof)).'/';
@@ -1568,6 +1611,15 @@ function spip_initialisation_core($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
                #if (!defined('_SPIP_LOCK_MODE')) define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip mais link() est tres souvent interdite
        }
 
+       // Langue par defaut
+       if (!defined('_LANGUE_PAR_DEFAUT')) define('_LANGUE_PAR_DEFAUT','fr');
+
+       // PHP_VERSION_ID dispo depuis PHP 5.2.7
+       if (!defined('PHP_VERSION_ID')) {
+          $version = explode('.',PHP_VERSION);
+          define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
+       }
+
        //
        // Module de lecture/ecriture/suppression de fichiers utilisant flock()
        // (non surchargeable en l'etat ; attention si on utilise include_spip()
@@ -1593,7 +1645,9 @@ function spip_initialisation_core($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
        spip_desinfecte($_REQUEST);
 
        // Par ailleurs on ne veut pas de magic_quotes au cours de l'execution
-       @set_magic_quotes_runtime(0);
+       if (PHP_VERSION_ID<50300) {
+               @set_magic_quotes_runtime(0);
+       }
 
        // Si les variables sont passees en global par le serveur,
        // il faut faire quelques verifications de base
@@ -1785,7 +1839,7 @@ function spip_initialisation_suite() {
        // on verifie que la memoire est suffisante pour le compactage css+js pour eviter la page blanche
        // il y aura d'autres problemes et l'utilisateur n'ira pas tres loin, mais ce sera plus comprehensible qu'une page blanche
        if (test_espace_prive() AND _MEMORY_LIMIT_MIN>8){
-               if ($memory = trim(ini_get('memory_limit'))){
+               if ($memory = trim(ini_get('memory_limit')) and $memory != -1) {
                        $unit = strtolower(substr($memory,strlen($memory/1),1));
                        switch($unit) {
                                // Le modifieur 'G' est disponible depuis PHP 5.1.0