function pipeline_precompile($prepend_code = array()) { $content = ""; foreach ($GLOBALS['spip_pipeline'] as $action => $pipeline) { $s_inc = ""; $s_call = ""; $pipe = array_filter(explode('|', $pipeline)); // Eclater le pipeline en filtres et appliquer chaque filtre foreach ($pipe as $fonc) { $fonc = trim($fonc); $s_call .= '$val = minipipe(\'' . $fonc . '\', $val);' . "\n"; if (isset($GLOBALS['spip_matrice'][$fonc])) { $file = $GLOBALS['spip_matrice'][$fonc]; $file = "'{$file}'"; // si un _DIR_XXX: est dans la chaine, on extrait la constante if (preg_match(",(_(DIR|ROOT)_[A-Z_]+):,Ums", $file, $regs)) { $dir = $regs[1]; $root_dir = str_replace('_DIR_', '_ROOT_', $dir); if (defined($root_dir)) { $dir = $root_dir; } $file = str_replace($regs[0], "'." . $dir . ".'", $file); $file = str_replace("''.", "", $file); $file = str_replace(constant($dir), '', $file); } $s_inc .= "include_once_check({$file});\n"; } } if (strlen($s_inc)) { $s_inc = "static \$inc=null;\nif (!\$inc){\n{$s_inc}\$inc=true;\n}\n"; } $content .= "// Pipeline {$action} \n" . "function execute_pipeline_{$action}(&\$val){\n" . $s_inc . ((isset($prepend_code[$action]) and strlen($prepend_code[$action])) ? trim($prepend_code[$action]) . "\n" : '') . $s_call . "return \$val;\n}\n"; } ecrire_fichier_php(_CACHE_PIPELINES, $content); clear_path_cache(); }
/** * Fonction d'initialisation, appellée dans inc_version ou mes_options * * Elle définit les répertoires et fichiers non partageables * et indique dans $test_dirs ceux devant être accessibles en écriture * mais ne touche pas à cette variable si elle est déjà définie * afin que mes_options.php puisse en spécifier d'autres. * * Elle définit ensuite les noms des fichiers et les droits. * Puis simule un register_global=on sécurisé. * * @param string $pi Répertoire permanent inaccessible * @param string $pa Répertoire permanent accessible * @param string $ti Répertoire temporaire inaccessible * @param string $ta Répertoire temporaire accessible */ function spip_initialisation_core($pi = NULL, $pa = NULL, $ti = NULL, $ta = NULL) { static $too_late = 0; if ($too_late++) { return; } // Declaration des repertoires // le nom du repertoire plugins/ activables/desactivables if (!defined('_DIR_PLUGINS')) { define('_DIR_PLUGINS', _DIR_RACINE . "plugins/"); } // le nom du repertoire des extensions/ permanentes du core, toujours actives if (!defined('_DIR_PLUGINS_DIST')) { define('_DIR_PLUGINS_DIST', _DIR_RACINE . "plugins-dist/"); } // le nom du repertoire des librairies if (!defined('_DIR_LIB')) { define('_DIR_LIB', _DIR_RACINE . "lib/"); } if (!defined('_DIR_IMG')) { define('_DIR_IMG', $pa); } if (!defined('_DIR_LOGOS')) { define('_DIR_LOGOS', $pa); } if (!defined('_DIR_IMG_ICONES')) { define('_DIR_IMG_ICONES', _DIR_LOGOS . "icones/"); } if (!defined('_DIR_DUMP')) { define('_DIR_DUMP', $ti . "dump/"); } if (!defined('_DIR_SESSIONS')) { define('_DIR_SESSIONS', $ti . "sessions/"); } if (!defined('_DIR_TRANSFERT')) { define('_DIR_TRANSFERT', $ti . "upload/"); } if (!defined('_DIR_CACHE')) { define('_DIR_CACHE', $ti . "cache/"); } if (!defined('_DIR_CACHE_XML')) { define('_DIR_CACHE_XML', _DIR_CACHE . "xml/"); } if (!defined('_DIR_SKELS')) { define('_DIR_SKELS', _DIR_CACHE . "skel/"); } if (!defined('_DIR_AIDE')) { define('_DIR_AIDE', _DIR_CACHE . "aide/"); } if (!defined('_DIR_TMP')) { define('_DIR_TMP', $ti); } if (!defined('_DIR_VAR')) { define('_DIR_VAR', $ta); } if (!defined('_DIR_ETC')) { define('_DIR_ETC', $pi); } if (!defined('_DIR_CONNECT')) { define('_DIR_CONNECT', $pi); } if (!defined('_DIR_CHMOD')) { define('_DIR_CHMOD', $pi); } if (!isset($GLOBALS['test_dirs'])) { // Pas $pi car il est bon de le mettre hors ecriture apres intstall // il sera rajoute automatiquement si besoin a l'etape 2 de l'install $GLOBALS['test_dirs'] = array($pa, $ti, $ta); } // Declaration des fichiers if (!defined('_CACHE_PLUGINS_PATH')) { define('_CACHE_PLUGINS_PATH', _DIR_CACHE . "charger_plugins_chemins.php"); } if (!defined('_CACHE_PLUGINS_OPT')) { define('_CACHE_PLUGINS_OPT', _DIR_CACHE . "charger_plugins_options.php"); } if (!defined('_CACHE_PLUGINS_FCT')) { define('_CACHE_PLUGINS_FCT', _DIR_CACHE . "charger_plugins_fonctions.php"); } if (!defined('_CACHE_PIPELINES')) { define('_CACHE_PIPELINES', _DIR_CACHE . "charger_pipelines.php"); } if (!defined('_CACHE_CHEMIN')) { define('_CACHE_CHEMIN', _DIR_CACHE . "chemin.txt"); } # attention .php obligatoire pour ecrire_fichier_securise if (!defined('_FILE_META')) { define('_FILE_META', $ti . 'meta_cache.php'); } if (!defined('_DIR_LOG')) { define('_DIR_LOG', _DIR_TMP . 'log/'); } if (!defined('_FILE_LOG')) { define('_FILE_LOG', 'spip'); } if (!defined('_FILE_LOG_SUFFIX')) { define('_FILE_LOG_SUFFIX', '.log'); } // Le fichier de connexion a la base de donnees // tient compte des anciennes versions (inc_connect...) if (!defined('_FILE_CONNECT_INS')) { define('_FILE_CONNECT_INS', 'connect'); } if (!defined('_FILE_CONNECT')) { define('_FILE_CONNECT', @is_readable($f = _DIR_CONNECT . _FILE_CONNECT_INS . '.php') ? $f : (@is_readable($f = _DIR_RESTREINT . 'inc_connect.php') ? $f : false)); } // Le fichier de reglages des droits if (!defined('_FILE_CHMOD_INS')) { define('_FILE_CHMOD_INS', 'chmod'); } if (!defined('_FILE_CHMOD')) { define('_FILE_CHMOD', @is_readable($f = _DIR_CHMOD . _FILE_CHMOD_INS . '.php') ? $f : false); } if (!defined('_FILE_LDAP')) { define('_FILE_LDAP', 'ldap.php'); } if (!defined('_FILE_TMP_SUFFIX')) { define('_FILE_TMP_SUFFIX', '.tmp.php'); } if (!defined('_FILE_CONNECT_TMP')) { define('_FILE_CONNECT_TMP', _DIR_CONNECT . _FILE_CONNECT_INS . _FILE_TMP_SUFFIX); } if (!defined('_FILE_CHMOD_TMP')) { define('_FILE_CHMOD_TMP', _DIR_CHMOD . _FILE_CHMOD_INS . _FILE_TMP_SUFFIX); } // Definition des droits d'acces en ecriture if (!defined('_SPIP_CHMOD') and _FILE_CHMOD) { include_once _FILE_CHMOD; } // Se mefier des fichiers mal remplis! if (!defined('_SPIP_CHMOD')) { define('_SPIP_CHMOD', 0777); } if (!defined('_DEFAULT_CHARSET')) { /** Le charset par défaut lors de l'installation */ define('_DEFAULT_CHARSET', 'utf-8'); } if (!defined('_ROOT_PLUGINS')) { define('_ROOT_PLUGINS', _ROOT_RACINE . "plugins/"); } if (!defined('_ROOT_PLUGINS_DIST')) { define('_ROOT_PLUGINS_DIST', _ROOT_RACINE . "plugins-dist/"); } if (!defined('_ROOT_PLUGINS_SUPPL') && defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) { define('_ROOT_PLUGINS_SUPPL', _ROOT_RACINE . str_replace(_DIR_RACINE, '', _DIR_PLUGINS_SUPPL)); } // La taille des Log if (!defined('_MAX_LOG')) { define('_MAX_LOG', 100); } // Sommes-nous dans l'empire du Mal ? // (ou sous le signe du Pingouin, ascendant GNU ?) if (isset($_SERVER['SERVER_SOFTWARE']) and strpos($_SERVER['SERVER_SOFTWARE'], '(Win') !== false) { if (!defined('_OS_SERVEUR')) { define('_OS_SERVEUR', 'windows'); } if (!defined('_SPIP_LOCK_MODE')) { define('_SPIP_LOCK_MODE', 1); } // utiliser le flock php } else { if (!defined('_OS_SERVEUR')) { define('_OS_SERVEUR', ''); } if (!defined('_SPIP_LOCK_MODE')) { define('_SPIP_LOCK_MODE', 1); } // utiliser le flock php #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'); } // // Module de lecture/ecriture/suppression de fichiers utilisant flock() // (non surchargeable en l'etat ; attention si on utilise include_spip() // pour le rendre surchargeable, on va provoquer un reecriture // systematique du noyau ou une baisse de perfs => a etudier) include_once _ROOT_RESTREINT . 'inc/flock.php'; // charger tout de suite le path et son cache load_path_cache(); // *********** traiter les variables ************ // // Securite // // Ne pas se faire manger par un bug php qui accepte ?GLOBALS[truc]=toto if (isset($_REQUEST['GLOBALS'])) { die; } // nettoyer les magic quotes \' et les caracteres nuls %00 spip_desinfecte($_GET); spip_desinfecte($_POST); spip_desinfecte($_COOKIE); spip_desinfecte($_REQUEST); // Par ailleurs on ne veut pas de magic_quotes au cours de l'execution @set_magic_quotes_runtime(0); // Si les variables sont passees en global par le serveur, // il faut faire quelques verifications de base $avertir_register_globals = false; if (test_valeur_serveur(@ini_get('register_globals'))) { // ne pas desinfecter les globales en profondeur car elle contient aussi les // precedentes, qui seraient desinfectees 2 fois. spip_desinfecte($GLOBALS, false); if (include_spip('inc/php3')) { spip_register_globals(true); } $avertir_register_globals = true; } // appliquer le cookie_prefix if ($GLOBALS['cookie_prefix'] != 'spip') { include_spip('inc/cookie'); recuperer_cookies_spip($GLOBALS['cookie_prefix']); } // // Capacites php (en fonction de la version) // $GLOBALS['flag_ob'] = function_exists("ob_start") && function_exists("ini_get") && !strstr(@ini_get('disable_functions'), 'ob_'); $GLOBALS['flag_sapi_name'] = function_exists("php_sapi_name"); $GLOBALS['flag_get_cfg_var'] = @get_cfg_var('error_reporting') != ""; $GLOBALS['flag_upload'] = !$GLOBALS['flag_get_cfg_var'] || get_cfg_var('upload_max_filesize') > 0; // Compatibilite avec serveurs ne fournissant pas $REQUEST_URI if (isset($_SERVER['REQUEST_URI'])) { $GLOBALS['REQUEST_URI'] = $_SERVER['REQUEST_URI']; } else { $GLOBALS['REQUEST_URI'] = $_SERVER['PHP_SELF']; if (!empty($_SERVER['QUERY_STRING']) and !strpos($_SERVER['REQUEST_URI'], '?')) { $GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING']; } } // Duree de validite de l'alea pour les cookies et ce qui s'ensuit. if (!defined('_RENOUVELLE_ALEA')) { define('_RENOUVELLE_ALEA', 12 * 3600); } // charger les meta si possible et renouveller l'alea au besoin // charge aussi effacer_meta et ecrire_meta $inc_meta = charger_fonction('meta', 'inc'); $inc_meta(); // on a pas pu le faire plus tot if ($avertir_register_globals) { avertir_auteurs("register_globals", _L("Problème de sécurité : register_globals=on; dans php.ini à corriger.")); } // nombre de repertoires depuis la racine // on compare a l'adresse de spip.php : $_SERVER["SCRIPT_NAME"] // ou a defaut celle donnee en meta ; (mais si celle-ci est fausse // le calcul est faux) if (!_DIR_RESTREINT) { $GLOBALS['profondeur_url'] = 1; } else { $uri = isset($_SERVER['REQUEST_URI']) ? explode('?', $_SERVER['REQUEST_URI']) : ''; $uri_ref = $_SERVER["SCRIPT_NAME"]; if (!$uri_ref or $ti !== _NOM_TEMPORAIRES_INACCESSIBLES) { if (isset($GLOBALS['meta']['adresse_site'])) { $uri_ref = parse_url($GLOBALS['meta']['adresse_site']); $uri_ref = $uri_ref['path'] . '/'; } else { $uri_ref = ""; } } if (!$uri or !$uri_ref) { $GLOBALS['profondeur_url'] = 0; } else { $GLOBALS['profondeur_url'] = max(0, substr_count($uri[0], '/') - substr_count($uri_ref, '/')); } } // s'il y a un cookie ou PHP_AUTH, initialiser visiteur_session if (_FILE_CONNECT) { if (verifier_visiteur() == '0minirezo' and !isset($_COOKIE['spip_admin'])) { clear_path_cache(); } } }
function ecrire_plugin_actifs($plugin,$pipe_recherche=false,$operation='raz') { static $liste_pipe_manquants=array(); // creer le repertoire cache/ si necessaire ! (installation notamment) sous_repertoire(_DIR_CACHE, '', false,true); $liste_fichier_verif = array(); if (($pipe_recherche)&&(!in_array($pipe_recherche,$liste_pipe_manquants))) $liste_pipe_manquants[]=$pipe_recherche; if ($operation!='raz'){ $plugin_actifs = liste_chemin_plugin_actifs(); $plugin_liste = liste_plugin_files(); $plugin_valides = array_intersect($plugin_actifs,$plugin_liste); if ($operation=='ajoute') $plugin = array_merge($plugin_valides,$plugin); if ($operation=='enleve') $plugin = array_diff($plugin_valides,$plugin); } // recharger le xml des plugins a activer list($plugin_valides,$ordre,$infos) = liste_plugin_valides($plugin,true); ecrire_meta('plugin',serialize($plugin_valides)); effacer_meta('message_crash_plugins'); // baisser ce flag ! $plugin_header_info = array(); foreach($plugin_valides as $p=>$resume){ $plugin_header_info[]= $p.($resume['version']?"(".$resume['version'].")":""); } ecrire_meta('plugin_header',substr(strtolower(implode(",",$plugin_header_info)),0,900)); $start_file = "<"."?php\nif (defined('_ECRIRE_INC_VERSION')) {\n"; $end_file = "}\n?".">"; if (is_array($infos)){ // construire tableaux de boutons et onglets $liste_boutons = array(); $liste_onglets = array(); foreach($ordre as $p){ $dir_type = $plugin_valides[$p]['dir_type']; $plug = $plugin_valides[$p]['dir']; $info = $infos[$dir_type][$plug]; if (isset($info['bouton'])){ $liste_boutons = array_merge($liste_boutons,$info['bouton']); } if (isset($info['onglet'])){ $liste_onglets = array_merge($liste_onglets,$info['onglet']); } } } // generer les fichier // charger_plugins_options.php // charger_plugins_fonctions.php if (defined('_DIR_PLUGINS_SUPPL')) $dir_plugins_suppl = implode(array_filter(explode(':',_DIR_PLUGINS_SUPPL)),'|'); foreach(array('chemins'=>_CACHE_PLUGINS_PATH,'options'=>_CACHE_PLUGINS_OPT,'fonctions'=>_CACHE_PLUGINS_FCT) as $charge=>$fileconf){ $s = ""; $splugs = ""; $chemins = array(); if (is_array($infos)){ foreach($ordre as $p){ $dir_type = $plugin_valides[$p]['dir_type']; $plug = $plugin_valides[$p]['dir']; $info = $infos[$dir_type][$plug]; if($dir_plugins_suppl && preg_match(',('.$dir_plugins_suppl.'),',$plugin_valides[$p]['dir'])){ //$plugin_valides[$p]['dir_type'] = '_DIR_RACINE'; $dir_type = '_DIR_RACINE'; //if(!test_espace_prive()) $plug = str_replace('../','',$plug); } $root_dir_type = str_replace('_DIR_','_ROOT_',$dir_type); $dir = $dir_type.".'" . $plug ."/'"; // definir le plugin, donc le path avant l'include du fichier options // permet de faire des include_spip pour attraper un inc_ du plugin if ($charge=='chemins'){ $prefix = strtoupper(preg_replace(',\W,','_',$info['prefix'])); $splugs .= "define('_DIR_PLUGIN_$prefix',$dir);\n"; foreach($info['path'] as $chemin){ if (!isset($chemin['version']) OR plugin_version_compatible($chemin['version'],$GLOBALS['spip_version_branche'])){ $dir = $chemin['dir']; if (strlen($dir) AND $dir{0}=="/") $dir = substr($dir,1); if (!isset($chemin['type']) OR $chemin['type']=='public') $chemins['public'][]="_DIR_PLUGIN_$prefix".(strlen($dir)?".'$dir'":""); if (!isset($chemin['type']) OR $chemin['type']=='prive') $chemins['prive'][]="_DIR_PLUGIN_$prefix".(strlen($dir)?".'$dir'":""); #$splugs .= "if (".(($chemin['type']=='public')?"":"!")."_DIR_RESTREINT) "; #$splugs .= "_chemin(_DIR_PLUGIN_$prefix".(strlen($dir)?".'$dir'":"").");\n"; } } } // concerne uniquement options et fonctions if (isset($info[$charge])){ foreach($info[$charge] as $file){ // on genere un if file_exists devant chaque include pour pouvoir garder le meme niveau d'erreur general $file = trim($file); if (strlen(constant($dir_type)) && (strpos($plug, constant($dir_type)) === 0)) { $dir = str_replace("'".constant($dir_type), $root_dir_type.".'", "'$plug/'"); } if($root_dir_type == '_ROOT_RACINE'){ $plug = str_replace('../','',$plug); } else $dir = $root_dir_type.".'$plug/'"; $s .= "if (file_exists(\$f=$dir.'".trim($file)."')){ include_once \$f;}\n"; $liste_fichier_verif[] = "$root_dir_type:$plug/".trim($file); } } } } if ($charge=='chemins'){ if (count($chemins)){ $splugs .= "if (_DIR_RESTREINT) _chemin(implode(':',array(".implode(',',array_reverse($chemins['public'])).")));\n"; $splugs .= "else _chemin(implode(':',array(".implode(',',array_reverse($chemins['prive'])).")));\n"; } } if ($charge=='options'){ $s .= "if (!function_exists('boutons_plugins')){function boutons_plugins(){return unserialize('".str_replace("'","\'",serialize($liste_boutons))."');}}\n"; $s .= "if (!function_exists('onglets_plugins')){function onglets_plugins(){return unserialize('".str_replace("'","\'",serialize($liste_onglets))."');}}\n"; } ecrire_fichier($fileconf, $start_file . $splugs . $s . $end_file); } if (is_array($infos)){ // construire tableaux de pipelines et matrices et boutons // $GLOBALS['spip_pipeline'] // $GLOBALS['spip_matrice'] $liste_boutons = array(); foreach($ordre as $p){ $dir_type = $plugin_valides[$p]['dir_type']; $root_dir_type = str_replace('_DIR_','_ROOT_',$dir_type); $plug = $plugin_valides[$p]['dir']; $info = $infos[$dir_type][$plug]; $prefix = ""; $prefix = $info['prefix']."_"; if (isset($info['pipeline']) AND is_array($info['pipeline'])){ foreach($info['pipeline'] as $pipe){ $nom = $pipe['nom']; if (isset($pipe['action'])) $action = $pipe['action']; else $action = $nom; $nomlower = strtolower($nom); if ($nomlower!=$nom AND isset($GLOBALS['spip_pipeline'][$nom]) AND !isset($GLOBALS['spip_pipeline'][$nomlower])){ $GLOBALS['spip_pipeline'][$nomlower] = $GLOBALS['spip_pipeline'][$nom]; unset($GLOBALS['spip_pipeline'][$nom]); } $nom = $nomlower; if (!isset($GLOBALS['spip_pipeline'][$nom])) // creer le pipeline eventuel $GLOBALS['spip_pipeline'][$nom]=""; if (strpos($GLOBALS['spip_pipeline'][$nom],"|$prefix$action")===FALSE) $GLOBALS['spip_pipeline'][$nom] = preg_replace(",(\|\||$),","|$prefix$action\\1",$GLOBALS['spip_pipeline'][$nom],1); if (isset($pipe['inclure'])){ $GLOBALS['spip_matrice']["$prefix$action"] = "$root_dir_type:$plug/".$pipe['inclure']; } } } } } // on charge les fichiers d'options qui peuvent completer // la globale spip_pipeline egalement if (@is_readable(_CACHE_PLUGINS_PATH)) include_once(_CACHE_PLUGINS_PATH); // securite : a priori n'a pu etre fait plus tot if (@is_readable(_CACHE_PLUGINS_OPT)) { include_once(_CACHE_PLUGINS_OPT); } else { spip_log("pipelines desactives: impossible de produire " . _CACHE_PLUGINS_OPT); } // on ajoute les pipe qui ont ete recenses manquants foreach($liste_pipe_manquants as $add_pipe) if (!isset($GLOBALS['spip_pipeline'][$add_pipe])) $GLOBALS['spip_pipeline'][$add_pipe]= ''; $liste_fichier_verif2 = pipeline_precompile(); $liste_fichier_verif = array_merge($liste_fichier_verif,$liste_fichier_verif2); // on note dans tmp la liste des fichiers qui doivent etre presents, // pour les verifier "souvent" // ils ne sont verifies que depuis l'espace prive, mais peuvent etre reconstruit depuis l'espace public // dans le cas d'un plugin non declare, spip etant mis devant le fait accompli // hackons donc avec un "../" en dur dans ce cas, qui ne manquera pas de nous embeter un jour... foreach ($liste_fichier_verif as $k => $f){ // si un _DIR_XXX: est dans la chaine, on extrait la constante if (preg_match(",(_(DIR|ROOT)_[A-Z_]+):,Ums",$f,$regs)) $f = str_replace($regs[0],$regs[2]=="ROOT"?constant($regs[1]):(_DIR_RACINE?"":"../").constant($regs[1]),$f); $liste_fichier_verif[$k] = $f; } ecrire_fichier(_CACHE_PLUGINS_VERIF, serialize($liste_fichier_verif)); clear_path_cache(); }