Newer
Older
//
// 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)
// 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
// la racine 0. Sur url/perso/ elle vaut 2
// http://doc.spip.org/@url_de_base
function url_de_base() {
if (isset($url[$GLOBALS['profondeur_url']]))
return $url[$GLOBALS['profondeur_url']];
(isset($_SERVER["SCRIPT_URI"]) AND
substr($_SERVER["SCRIPT_URI"],0,5) == 'https')
OR (isset($_SERVER['HTTPS']) AND
test_valeur_serveur($_SERVER['HTTPS']))
# note : HTTP_HOST contient le :port si necessaire
if (!$GLOBALS['REQUEST_URI']){
if (isset($_SERVER['REQUEST_URI'])) {
$GLOBALS['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
} else {
$GLOBALS['REQUEST_URI'] = $_SERVER['PHP_SELF'];
if ($_SERVER['QUERY_STRING']
AND !strpos($_SERVER['REQUEST_URI'], '?'))
$GLOBALS['REQUEST_URI'] .= '?'.$_SERVER['QUERY_STRING'];
}
$url[$GLOBALS['profondeur_url']] = url_de_($http,$_SERVER['HTTP_HOST'],$GLOBALS['REQUEST_URI'],$GLOBALS['profondeur_url']);
return $url[$GLOBALS['profondeur_url']];
}
/**
* fonction testable de construction d'une url appelee par url_de_base()
* @param string $http
* @param string $host
* @param string $request
* @param int $prof
* @return string
*/
function url_de_($http,$host,$request,$prof=0){
$prof = max($prof,0);
$myself = ltrim($request,'/');
list($myself) = explode('?', $myself);
$url = join('/', array_slice(explode('/', $myself), 0, -1-$prof)).'/';
$url = $http.'://'.rtrim($host,'/').'/'.ltrim($url,'/');
return $url;
}
// Pour une redirection, la liste des arguments doit etre separee par "&"
// Pour du code XHTML, ca doit etre &
// Bravo au W3C qui n'a pas ete capable de nous eviter ca
// faute de separer proprement langage et meta-langage
// Attention, X?y=z et "X/?y=z" sont completement differents!
// http://httpd.apache.org/docs/2.0/mod/mod_dir.html
esj
a validé
// http://doc.spip.org/@generer_url_ecrire
function generer_url_ecrire($script='', $args="", $no_entities=false, $rel=false) {
if (!$rel)
$rel = url_de_base() . _DIR_RESTREINT_ABS . _SPIP_ECRIRE_SCRIPT;
else if (!is_string($rel))
$rel = _DIR_RESTREINT ? _DIR_RESTREINT :
('./' . _SPIP_ECRIRE_SCRIPT);
@list($script, $ancre) = explode('#', $script);
if ($script AND ($script<>'accueil' OR $rel))
$args = "?exec=$script" . (!$args ? '' : "&$args");
elseif ($args)
$args ="?$args";
if ($ancre) $args .= "#$ancre";
return $rel . ($no_entities ? $args : str_replace('&', '&', $args));
}
// http://doc.spip.org/@generer_url_retour
function generer_url_retour($script, $args="")
{
return rawurlencode(generer_url_ecrire($script, $args, true, true));
}
//
// Adresse des scripts publics (a passer dans inc-urls...)
//
// Detecter le fichier de base, a la racine, comme etant spip.php ou ''
// dans le cas de '', un $default = './' peut servir (comme dans urls/page.php)
// http://doc.spip.org/@get_spip_script
# cas define('_SPIP_SCRIPT', '');
// http://doc.spip.org/@generer_url_public
function generer_url_public($script='', $args="", $no_entities=false, $rel=true, $action='') {
// si le script est une action (spip_pass, spip_inscription),
if (!$action) $action = get_spip_script();
cerdic
a validé
$action = parametre_url($action, _SPIP_PAGE, $script, '&');
Fil
a validé
if ($args) {
if (is_array($args)) {
$r = '';
foreach($args as $k => $v) $r .= '&' . $k . '=' . $v;
$args = substr($r,1);
}
$action .=
(strpos($action, '?') !== false ? '&' : '?') . $args;
// ne pas generer une url avec /./?page= en cas d'url absolue et de _SPIP_SCRIPT vide
return ($rel ? _DIR_RACINE . $action : rtrim(url_de_base(),'/') . preg_replace(",^/[.]/,","/","/$action"));
// http://doc.spip.org/@generer_url_prive
function generer_url_prive($script, $args="", $no_entities=false) {
return generer_url_public($script, $args, $no_entities, false, _DIR_RESTREINT_ABS . 'prive.php');
// Pour les formulaires en methode POST,
// mettre le nom du script a la fois en input-hidden et dans le champ action:
// 1) on peut ainsi memoriser le signet comme si c'etait un GET
// 2) ca suit http://en.wikipedia.org/wiki/Representational_State_Transfer
// http://doc.spip.org/@generer_form_ecrire
function generer_form_ecrire($script, $corps, $atts='', $submit='') {
global $spip_lang_right;
return "<form action='"
. ($script ? generer_url_ecrire($script) : '')
. "' "
. ($atts ? $atts : " method='post'")
. "><div>\n"
. "<input type='hidden' name='exec' value='$script' />"
. $corps
. (!$submit ? '' :
("<div style='text-align: $spip_lang_right'><input class='fondo' type='submit' value='$submit' /></div>"))
. "</div></form>\n";
}
// Attention, JS/Ajax n'aime pas le melange de param GET/POST
// On n'applique pas la recommandation ci-dessus pour les scripts publics
// qui ne sont pas destines a etre mis en signets
function generer_form_action($script, $corps, $atts='', $public=false) {
// si l'on est dans l'espace prive, on garde dans l'url
// l'exec a l'origine de l'action, qui permet de savoir si il est necessaire
// ou non de proceder a l'authentification (cas typique de l'install par exemple)
? generer_url_ecrire(_request('exec'))
: generer_url_public();
return "\n<form action='" .
$h .
"'" .
$atts .
">\n" .
"<div>" .
"\n<input type='hidden' name='action' value='$script' />" .
$corps .
"</div></form>";
}
// http://doc.spip.org/@generer_url_action
function generer_url_action($script, $args="", $no_entities=false , $public = false) {
// si l'on est dans l'espace prive, on garde dans l'url
// l'exec a l'origine de l'action, qui permet de savoir si il est necessaire
// ou non de proceder a l'authentification (cas typique de l'install par exemple)
$url = (_DIR_RACINE AND !$public)
? generer_url_ecrire(_request('exec'))
: generer_url_public('','',false,false);
$url = parametre_url($url,'action',$script);
if ($args) $url .= quote_amp('&'.$args);
if ($no_entities) $url = str_replace('&','&',$url);
return $url;
}
/**
* Fonction d'initialisation groupee pour compatibilite ascendante
*
* @param string $pi
* @param string $pa
* @param string $ti
* @param string $ta
*/
function spip_initialisation($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
spip_initialisation_core($pi,$pa,$ti,$ta);
spip_initialisation_suite();
}
/**
* Fonction d'initialisation, appellee dans inc_version ou mes_options
* Elle definit les repertoires et fichiers non partageables
* et indique dans $test_dirs ceux devant etre accessibles en ecriture
* mais ne touche pas a cette variable si elle est deja definie
* afin que mes_options.php puisse en specifier d'autres.
* Elle definit ensuite les noms des fichiers et les droits.
* Puis simule un register_global=on securise.
*
* @param string $pi
* @param string $pa
* @param string $ti
* @param string $ta
*/
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_EXTENSIONS')) define('_DIR_EXTENSIONS', _DIR_RACINE . "extensions/");
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_PLUGINS_VERIF')) define('_CACHE_PLUGINS_VERIF', _DIR_CACHE . "verifier_plugins.txt");
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);
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
: (_EXTENSION_PHP AND @is_readable($f = _DIR_RESTREINT . 'inc_connect'._EXTENSION_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
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);
// Le charset par defaut lors de l'installation
if (!defined('_DEFAULT_CHARSET')) define('_DEFAULT_CHARSET', 'utf-8');
if (!defined('_ROOT_PLUGINS')) define('_ROOT_PLUGINS', _ROOT_RACINE . "plugins/");
if (!defined('_ROOT_EXTENSIONS')) define('_ROOT_EXTENSIONS', _ROOT_RACINE . "extensions/");
// La taille des Log
if (!defined('_MAX_LOG')) define('_MAX_LOG', 100);
// niveau maxi d'enregistrement des logs
if (!defined('_LOG_FILTRE_GRAVITE')) define('_LOG_FILTRE_GRAVITE', 5);
// Sommes-nous dans l'empire du Mal ?
// (ou sous le signe du Pingouin, ascendant GNU ?)
if (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
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
//
// 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
// *********** 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,
// ou si on veut la compatibilite php3
// il faut faire quelques verifications de base
if ($x = test_valeur_serveur(@ini_get('register_globals'))
OR _FEED_GLOBALS) {
cerdic
a validé
// 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($x);
}
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
// 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 ($_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();
// 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']) : '';
cerdic
a validé
$uri_ref = $_SERVER["SCRIPT_NAME"];
if (!$uri_ref
// si on est appele avec un autre ti, on est sans doute en mutu
// si jamais c'est de la mutu avec sous rep, on est perdu si on se fie
// a spip.php qui est a la racine du spip, et vue qu'on sait pas se reperer
// s'en remettre a l'adresse du site. alea jacta est.
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 = "";
}
cerdic
a validé
if (!$uri OR !$uri_ref)
}
}
// s'il y a un cookie ou PHP_AUTH, initialiser visiteur_session
if (_FILE_CONNECT) {
if (verifier_visiteur()=='0minirezo'
// si c'est un admin sans cookie admin, il faut ignorer le cache chemin !
AND !isset($_COOKIE['spip_admin']))
}
/**
* Complements d'initialisation non critiques pouvant etre realises
* par les plugins
*
*/
if (!defined('_LOGIN_TROP_COURT')) define('_LOGIN_TROP_COURT', 4);
// la taille maxi des logos (0 : pas de limite)
if (!defined('_LOGO_MAX_SIZE')) define('_LOGO_MAX_SIZE', 0); # poids en ko
if (!defined('_LOGO_MAX_WIDTH')) define('_LOGO_MAX_WIDTH', 0); # largeur en pixels
if (!defined('_LOGO_MAX_HEIGHT')) define('_LOGO_MAX_HEIGHT', 0); # hauteur en pixels
if (!defined('_DOC_MAX_SIZE')) define('_DOC_MAX_SIZE', 0); # poids en ko
cerdic
a validé
if (!defined('_IMG_MAX_SIZE')) define('_IMG_MAX_SIZE', 0); # poids en ko
if (!defined('_IMG_MAX_WIDTH')) define('_IMG_MAX_WIDTH', 0); # largeur en pixels
if (!defined('_IMG_MAX_HEIGHT')) define('_IMG_MAX_HEIGHT', 0); # hauteur en pixels
// Qualite des images calculees automatiquement. C'est un nombre entre 0 et 100, meme pour imagick (on ramene a 0..1 par la suite)
if (!defined('_IMG_QUALITE')) define('_IMG_QUALITE', 85); # valeur par defaut
if (!defined('_IMG_GD_QUALITE')) define('_IMG_GD_QUALITE', _IMG_QUALITE); # surcharge pour la lib GD
if (!defined('_IMG_CONVERT_QUALITE')) define('_IMG_CONVERT_QUALITE', _IMG_QUALITE); # surcharge pour imagick en ligne de commande
// Historiquement la valeur pour imagick semble differente. Si ca n'est pas necessaire, il serait preferable de garder _IMG_QUALITE
if (!defined('_IMG_IMAGICK_QUALITE')) define('_IMG_IMAGICK_QUALITE', 75); # surcharge pour imagick en PHP
if (!defined('_COPIE_LOCALE_MAX_SIZE')) define('_COPIE_LOCALE_MAX_SIZE',16777216); // poids en octet
// qq chaines standard
if (!defined('_ACCESS_FILE_NAME')) define('_ACCESS_FILE_NAME', '.htaccess');
if (!defined('_AUTH_USER_FILE')) define('_AUTH_USER_FILE', '.htpasswd');
if (!defined('_SPIP_DUMP')) define('_SPIP_DUMP', 'dump@nom_site@@stamp@.xml');
if (!defined('_CACHE_RUBRIQUES')) define('_CACHE_RUBRIQUES', _DIR_TMP.'menu-rubriques-cache.txt');
if (!defined('_CACHE_RUBRIQUES_MAX')) define('_CACHE_RUBRIQUES_MAX', 500);
if (!defined('_EXTENSION_SQUELETTES')) define('_EXTENSION_SQUELETTES', 'html');
if (!defined('_DOCTYPE_ECRIRE')) define('_DOCTYPE_ECRIRE',
// "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n");
//"<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>\n");
//"<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>\n");
// "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1 //EN' 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'>\n");
if (!defined('_DOCTYPE_AIDE')) define('_DOCTYPE_AIDE',
"<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Frameset//EN' 'http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd'>");
// L'adresse de base du site ; on peut mettre '' si la racine est geree par
// le script de l'espace public, alias index.php
if (!defined('_SPIP_SCRIPT')) define('_SPIP_SCRIPT', 'spip.php');
cerdic
a validé
// argument page, personalisable en cas de conflit avec un autre script
if (!defined('_SPIP_PAGE')) define('_SPIP_PAGE', 'page');
// le script de l'espace prive
// Mettre a "index.php" si DirectoryIndex ne le fait pas ou pb connexes:
// les anciens IIS n'acceptent pas les POST sur ecrire/ (#419)
// meme pb sur thttpd cf. http://forum.spip.org/fr_184153.html
if (!defined('_SPIP_ECRIRE_SCRIPT')) define('_SPIP_ECRIRE_SCRIPT', // true ? #decommenter ici et commenter la
preg_match(',IIS|thttpd,',$_SERVER['SERVER_SOFTWARE']) ?
'index.php' : '');
if (!defined('_SPIP_AJAX'))
define('_SPIP_AJAX', ((!isset($_COOKIE['spip_accepte_ajax']))
? 1
: (($_COOKIE['spip_accepte_ajax'] != -1) ? 1 : 0)));
// La requete est-elle en ajax ?
if (!defined('_AJAX')) define('_AJAX',
OR @$_REQUEST['var_ajax_redir'] # redirection 302 apres ajax jQuery
OR @$_REQUEST['var_ajaxcharset'] # compat ascendante pour plugins
)
AND !@$_REQUEST['var_noajax'] # horrible exception, car c'est pas parce que la requete est ajax jquery qu'il faut tuer tous les formulaires ajax qu'elle contient
# nombre de pixels maxi pour calcul de la vignette avec gd
# au dela de 5500000 on considere que php n'est pas limite en memoire pour cette operation
# les configurations limitees en memoire ont un seuil plutot vers 1MPixel
if (!defined('_IMG_GD_MAX_PIXELS')) define('_IMG_GD_MAX_PIXELS',
(isset($GLOBALS['meta']['max_taille_vignettes'])&&$GLOBALS['meta']['max_taille_vignettes']<5500000)
? $GLOBALS['meta']['max_taille_vignettes']
: 0);
if (!defined('_MEMORY_LIMIT_MIN')) define('_MEMORY_LIMIT_MIN',10); // en Mo
// si on est dans l'espace prive et si le besoin est superieur a 8Mo (qui est vraiment le standard)
// 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'))){
$unit = strtolower(substr($memory,strlen($memory/1),1));
switch($unit) {
// Le modifieur 'G' est disponible depuis PHP 5.1.0
case 'g': $memory *= 1024;
case 'm': $memory *= 1024;
case 'k': $memory *= 1024;
}
if ($memory<_MEMORY_LIMIT_MIN*1024*1024){
ini_set('memory_limit',$m=_MEMORY_LIMIT_MIN.'M');
if (trim(ini_get('memory_limit'))!=$m){
if (!defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE')) define('_INTERDIRE_COMPACTE_HEAD_ECRIRE',true); // evite une page blanche car on ne saura pas calculer la css dans ce hit
if (!defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE')) define('_INTERDIRE_COMPACTE_HEAD_ECRIRE',true); // evite une page blanche car on ne saura pas calculer la css dans ce hit
cerdic
a validé
init_var_mode();
}
// Reperer les variables d'URL qui conditionnent la perennite du cache, des urls
// ou d'autres petit caches (trouver_table, css et js compactes ...)
// http://doc.spip.org/@init_var_mode
function init_var_mode(){
static $done = false;
if (!$done) {
cerdic
a validé
if (isset($_GET['var_mode'])) {
// tout le monde peut calcul/recalcul
if ($_GET['var_mode'] == 'calcul'
OR $_GET['var_mode'] == 'recalcul') {
if (!defined('_VAR_MODE')) define('_VAR_MODE',$_GET['var_mode']);
}
cerdic
a validé
// preview, debug, blocs, urls et images necessitent une autorisation
else if (in_array($_GET['var_mode'],array('preview','debug','inclure','urls','images'))) {
cerdic
a validé
include_spip('inc/autoriser');
if (autoriser(
($_GET['var_mode'] == 'preview')
? 'previsualiser'
: 'debug'
)) {
switch($_GET['var_mode']){
case 'preview':
// basculer sur les criteres de preview dans les boucles
cerdic
a validé
if (!defined('_VAR_PREVIEW')) define('_VAR_PREVIEW',true);
// forcer le calcul
if (!defined('_VAR_MODE')) define('_VAR_MODE','recalcul');
if (!defined('_VAR_NOCACHE')) define('_VAR_NOCACHE',true);
cerdic
a validé
break;
cerdic
a validé
// forcer le compilo et ignorer les caches existants
if (!defined('_VAR_MODE')) define('_VAR_MODE','calcul');
if (!defined('_VAR_INCLURE')) define('_VAR_INCLURE',true);
if (!defined('_VAR_NOCACHE')) define('_VAR_NOCACHE',true);
cerdic
a validé
break;
case 'urls':
// forcer le compilo et ignorer les caches existants
if (!defined('_VAR_MODE')) define('_VAR_MODE','calcul');
if (!defined('_VAR_URLS')) define('_VAR_URLS',true);
cerdic
a validé
break;
case 'images':
// forcer le compilo et ignorer les caches existants
if (!defined('_VAR_MODE')) define('_VAR_MODE','calcul');
cerdic
a validé
// indiquer qu'on doit recalculer les images
if (!defined('_VAR_IMAGES')) define('_VAR_IMAGES',true);
cerdic
a validé
break;
case 'debug':
if (!defined('_VAR_MODE')) define('_VAR_MODE','debug');
// et ne pas enregistrer de cache
if (!defined('_VAR_NOCACHE')) define('_VAR_NOCACHE',true);
cerdic
a validé
default :
if (!defined('_VAR_MODE')) define('_VAR_MODE',$_GET['var_mode']);
cerdic
a validé
break;
}
spip_log($GLOBALS['visiteur_session']['nom']
. " "._VAR_MODE);
cerdic
a validé
}
// pas autorise ?
else {
// si on n'est pas connecte on se redirige
if (!$GLOBALS['visiteur_session']) {
include_spip('inc/headers');
redirige_par_entete(generer_url_public('login',
'url='.rawurlencode(
parametre_url(self(), 'var_mode', $_GET['var_mode'], '&')
), true));
}
// sinon tant pis
}
}
if (!defined('_VAR_MODE')) define('_VAR_MODE',false);
cerdic
a validé
}
$done = true;
}
}
// Annuler les magic quotes \' sur GET POST COOKIE et GLOBALS ;
// supprimer aussi les eventuels caracteres nuls %00, qui peuvent tromper
// la commande is_readable('chemin/vers/fichier/interdit%00truc_normal')
// http://doc.spip.org/@spip_desinfecte
function spip_desinfecte(&$t,$deep = true) {
static $magic_quotes;
if (!isset($magic_quotes))
$magic_quotes = @get_magic_quotes_gpc();
foreach ($t as $key => $val) {
if (is_string($t[$key])) {
if ($magic_quotes)
$t[$key] = stripslashes($t[$key]);
$t[$key] = str_replace(chr(0), '-', $t[$key]);
// traiter aussi les "texte_plus" de articles_edit
else if ($deep AND is_array($t[$key]) AND $key!=='GLOBALS')
spip_desinfecte($t[$key],$deep);
// retourne le statut du visiteur s'il s'annonce
// http://doc.spip.org/@verifier_visiteur
function verifier_visiteur() {
// Demarrer une session NON AUTHENTIFIEE si on donne son nom
// dans un formulaire sans login (ex: #FORMULAIRE_FORUM)
// Attention on separe bien session_nom et nom, pour eviter
// les melanges entre donnees SQL et variables plus aleatoires
$variables_session = array('session_nom', 'session_email');
foreach($variables_session as $var) {
if (_request($var) !== null) {
$init = true;
break;
}
}
if (isset($init)) {
@spip_initialisation_core(
(_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES),
(_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES),
(_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES),
(_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
);
$session = charger_fonction('session', 'inc');
$session();
include_spip('inc/texte');
foreach($variables_session as $var)
if (($a = _request($var)) !== null)
$GLOBALS['visiteur_session'][$var] = safehtml($a);
if (!isset($GLOBALS['visiteur_session']['id_auteur']))
$GLOBALS['visiteur_session']['id_auteur'] = 0;
$session($GLOBALS['visiteur_session']);
return 0;
}
$h = (isset($_SERVER['PHP_AUTH_USER']) AND !$GLOBALS['ignore_auth_http']);
if ($h OR isset($_COOKIE['spip_session']) OR isset($_COOKIE[$GLOBALS['cookie_prefix'].'_session'])) {
// Rq: pour que cette fonction marche depuis mes_options
// mais on risque de perturber des plugins en initialisant trop tot
// certaines constantes
@spip_initialisation_core(
(_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES),
(_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES),
(_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES),
(_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
);
$session = charger_fonction('session', 'inc');
if ($session()) {
return $GLOBALS['visiteur_session']['statut'];
if ($h AND isset($_SERVER['PHP_AUTH_PW'])) {
include_spip('inc/auth');
$h = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']);
}
if ($h) {
$GLOBALS['visiteur_session'] = $h;
return $GLOBALS['visiteur_session']['statut'];
}
}
// au moins son navigateur nous dit la langue preferee de cet inconnu
include_spip('inc/lang');
utiliser_langue_visiteur();
return false;
}
// selectionne la langue donnee en argument et memorise la courante
// ou restaure l'ancienne si appel sans argument
// On pourrait economiser l'empilement en cas de non changemnt
// Le noyau de Spip sait le faire, mais pour assurer la compatibilite
// cette fonction retourne toujours non False
// http://doc.spip.org/@lang_select
function lang_select ($lang=NULL) {
static $pile_langues = array();
if ($lang === NULL)
$lang = array_pop($pile_langues);
else {
array_push($pile_langues, $GLOBALS['spip_lang']);
if ($lang == $GLOBALS['spip_lang'])
return $lang;
changer_langue($lang);
return $lang;
// Renvoie une chaine qui decrit la session courante pour savoir si on peut
// utiliser un cache enregistre pour cette session.
// Par convention cette chaine ne doit pas contenir de caracteres [^0-9A-Za-z]
// Attention on ne peut *pas* inferer id_auteur a partir de la session, qui
// est une chaine arbitraire
// Cette chaine est courte (8 cars) pour pouvoir etre utilisee dans un nom
// de fichier cache
if ($force OR !isset($session)) {
$s = pipeline('definir_session',
$GLOBALS['visiteur_session']
? serialize($GLOBALS['visiteur_session'])
. '_' . @$_COOKIE['spip_session']
: ''
);
$session = $s ? substr(md5($s), 0, 8) : '';
}
#spip_log('session: '.$session);
return $session;
}
//
// Aide, aussi depuis l'espace prive a present.
// Surchargeable mais pas d'ereur fatale si indisponible.
//
// http://doc.spip.org/@aide
function aide($aide='') {
$aider = charger_fonction('aider', 'inc', true);
return $aider ? $aider($aide) : '';
}
// normalement il faudrait creer exec/info.php, mais pour mettre juste ca:
// http://doc.spip.org/@exec_info_dist
function exec_info_dist() {
global $connect_statut;
if ($connect_statut == '0minirezo')
phpinfo();
else
echo "pas admin";
function erreur_squelette($message='', $lieu='') {
$debusquer = charger_fonction('debusquer', 'public');
if (is_array($lieu)) {
include_spip('public/compiler');
$lieu = reconstruire_contexte_compil($lieu);
}
return $debusquer($message, $lieu);
cerdic
a validé
/**
* La fonction de base de SPIP : un squelette + un contexte => une page.
* $fond peut etre un nom de squelette, ou une liste de squelette au format array.
* Dans ce dernier cas, les squelettes sont tous evalues et mis bout a bout
* $options permet de selectionner les options suivantes :
* trim => true (valeur par defaut) permet de ne rien renvoyer si le fond ne produit que des espaces ;
* raw => true permet de recuperer la strucure $page complete avec entetes et invalideurs pour chaque $fond fourni.
*
* @param string/array $fond
* @param array $contexte
* @param array $options
* @param string $connect
* @return string/array
*/
// http://doc.spip.org/@recuperer_fond
cerdic
a validé
function recuperer_fond($fond, $contexte=array(), $options = array(), $connect='') {
include_spip('public/assembler');
// assurer la compat avec l'ancienne syntaxe
// (trim etait le 3eme argument, par defaut a true)
cerdic
a validé
if (!is_array($options)) $options = array('trim'=>$options);
if (!isset($options['trim'])) $options['trim']=true;
if (isset($contexte['connect'])){
$connect = ($connect ? $connect : $contexte['connect']);
unset($contexte['connect']);
}
$texte = "";
cerdic
a validé
$pages = array();
esj
a validé
$lang_select = '';
if (!isset($options['etoile']) OR !$options['etoile']){
// Si on a inclus sans fixer le critere de lang, on prend la langue courante
if (!isset($contexte['lang']))
$contexte['lang'] = $GLOBALS['spip_lang'];
esj
a validé
if ($contexte['lang'] != $GLOBALS['meta']['langue_site']) {
$lang_select = lang_select($contexte['lang']);
}
}
@$GLOBALS['_INC_PUBLIC']++;
foreach(is_array($fond) ? $fond : array($fond) as $f){
$page = evaluer_fond($f, $contexte, $connect);
if ($page === '') {
$c = isset($options['compil']) ? $options['compil'] :'';
erreur_squelette(_T('info_erreur_squelette2', $a), $c);
$page = pipeline('recuperer_fond',array(
'args'=>array('fond'=>$fond,'contexte'=>$contexte,'options'=>$options,'connect'=>$connect),
'data'=>$page
));
if (isset($options['ajax']) AND $options['ajax']){
$page['texte'] = encoder_contexte_ajax(array_merge($contexte,array('fond'=>$f)),'',$page['texte'], $options['ajax']);
cerdic
a validé
if (isset($options['raw']) AND $options['raw'])
$pages[] = $page;
else
$texte .= $options['trim'] ? rtrim($page['texte']) : $page['texte'];
$GLOBALS['_INC_PUBLIC']--;
cerdic
a validé
if (isset($options['raw']) AND $options['raw'])
return is_array($fond)?$pages:reset($pages);
else
return $options['trim'] ? ltrim($texte) : $texte;
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
/**
* Trouve un squelette dans le repertoire modeles/
*
* @param $nom
* @return string
*/
function trouve_modele($nom) {
return trouver_fond($nom,'modeles/');
}
/**
* Trouver un squelette dans le chemin
* on peut specifier un sous-dossier dans $dir
* si $pathinfo est a true, retourne un tableau avec
* les composantes du fichier trouve
* + le chemin complet sans son extension dans fond
*
* @param string $nom
* @param string $dir
* @param bool $pathinfo
* @return array|string
*/
function trouver_fond($nom, $dir='', $pathinfo = false) {
$f = find_in_path($nom.'.'. _EXTENSION_SQUELETTES, $dir?rtrim($dir,'/').'/':'');
if (!$pathinfo) return $f;
// renvoyer un tableau detaille si $pathinfo==true
$p = pathinfo($f);
if (!$p['extension'])
$p['extension'] = _EXTENSION_SQUELETTES;
if (!$p['filename'])
$p['filename'] = ($p['basename']?substr($p['basename'],0,-strlen($p['extension'])-1):'');
$p['fond'] = ($f?substr($f,0,-strlen($p['extension'])-1):'');
return $p;
}
function tester_url_ecrire($nom){
// tester si c'est une page en squelette
if (trouver_fond($nom, 'prive/squelettes/contenu/'))
return 'fond';
// compat skels orthogonaux version precedente
elseif (trouver_fond($nom, 'prive/exec/'))
// attention, il ne faut pas inclure l'exec ici
// car sinon #URL_ECRIRE provoque des inclusions
// et des define intrusifs potentiels
return (find_in_path("{$nom}.php",'exec/') OR charger_fonction($nom,'exec',true))?$nom:'';
}
marcimat
a validé
function charger_php_extension($module) {
if (extension_loaded($module)) {
return true;
} else {
$charger_php_extension = charger_fonction('charger_php_extension','inc');
return $charger_php_extension($module);
marcimat
a validé
}
// Renvoie TRUE si et seulement si la configuration autorise
// le code HTML5 sur le site public
function html5_permis() {
return (isset($GLOBALS['meta']['version_html_max'])
AND ('html5' == $GLOBALS['meta']['version_html_max']));
}
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
/*
* Bloc de compatibilite : quasiment tous les plugins utilisent ces fonctions
* desormais depreciees ; plutot que d'obliger tout le monde a charger
* vieilles_defs, on va assumer l'histoire de ces 3 fonctions ubiquitaires
*/
// Fonction depreciee
// http://doc.spip.org/@lire_meta
function lire_meta($nom) {
return $GLOBALS['meta'][$nom];
}
// Fonction depreciee
// http://doc.spip.org/@ecrire_metas
function ecrire_metas() {}
// Fonction depreciee, cf. http://doc.spip.org/@sql_fetch
// http://doc.spip.org/@spip_fetch_array
function spip_fetch_array($r, $t=NULL) {
if (!isset($t)) {
if ($r) return sql_fetch($r);
} else {
if ($t=='SPIP_NUM') $t = MYSQL_NUM;
if ($t=='SPIP_BOTH') $t = MYSQL_BOTH;
if ($t=='SPIP_ASSOC') $t = MYSQL_ASSOC;
spip_log("appel deprecie de spip_fetch_array(..., $t)", 'vieilles_defs');
if ($r) return mysql_fetch_array($r, $t);
}
}