Newer
Older
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
//
// Gestion des inclusions et infos repertoires
//
function include_ecrire($file, $silence=false) {
# Hack pour etre compatible avec les mes_options qui appellent cette fonction
define('_DIR_INCLUDE', _DIR_RESTREINT);
preg_match('/^((inc_)?([^.]*))(\.php[3]?)?$/', $file, $r);
// Version new style, surchargeable
# cas speciaux inc/index => indexation ; inc_db_mysql => base/db_mysql
if ($r[3] == 'index') return include_spip('inc/indexation');
if ($r[3] == 'db_mysql') return include_spip('base/db_mysql');
if ($f=include_spip('inc/'.$r[3]))
return $f;
if (file_exists($f = _DIR_INCLUDE . $r[1] . '.php'))
return include_once($f);
// charge un fichier perso ou, a defaut, standard
// et retourne si elle existe le nom de la fonction homonyme (exec_$nom),
// ou de suffixe _dist
function include_fonction($nom, $dossier='exec') {
// Securite de base
if (!preg_match(',^[a-z0-9_-]+$,', $nom))
redirige_par_entete('./');
// Si la fonction existe deja (definie par mes_options, par exemple)
esj
a validé
if (function_exists($f = $dossier.'_'.$nom)
OR function_exists($f = $dossier.'_'.$nom.'_dist'))
return $f;
// Sinon charger le fichier de declaration
$inc = include_spip($dossier.'/'.$nom);
if (function_exists($f = $dossier.'_'.$nom) # definition perso ?
OR function_exists($f = $dossier.'_'.$nom.'_dist')) # definition standard
// Echec : message d'erreur
spip_log("fonction $nom indisponible" .
($inc ? "" : "(fichier $dossier/$nom absent)"));
install_debut_html(_T('forum_titre_erreur'));
echo '<p>' . _T('fichier_introuvable',
array('fichier'=> '<b>'.htmlentities("$dossier/$nom").'</b>'));
install_fin_html();
exit;
//
// une fonction remplacant include_ecrire, et autorisant les surcharges
//
function include_spip($f, $include = true) {
// deja charge (nom) ?
if ($included_files[$f])
return $included_files[$f];
// Hack pour pouvoir appeler cette fonction depuis mes_options.
define('_DIR_INCLUDE', _DIR_RESTREINT);
// une surcharge existe ?
esj
a validé
if (!$s = find_in_path($f . '.php')
AND !$s = find_in_path($f . '.php3')
// sinon, le fichier existe dans le repertoire ecrire ?
AND !is_readable($s = _DIR_INCLUDE . $f . '.php')
AND !is_readable($s = _DIR_INCLUDE . $f . '.php3'))
// deja charge (chemin complet) ?
if (isset($included_files[$s]))
return $included_files[$f] = $included_files[$s];
$included_files[$f] = $included_files[$s] = $s;
// alors on le charge (sauf si on ne voulait que son chemin)
if ($include) {
}
// un pipeline est lie a une action et une valeur
// chaque element du pipeline est autorise a modifier la valeur
//
// le pipeline execute les elements disponibles pour cette action,
// les uns apres les autres, et retourne la valeur finale
//
// Cf. compose_filtres dans inc-compilo-index.php3, qui est le
// pendant "compilŽ" de cette fonctionnalite
Fil
a validé
// appel unitaire d'une fonction du pipeline
// utilisee dans le script pipeline precompile
function minipipe($fonc,$val){
// fonction
if (function_exists($fonc))
$val = call_user_func($fonc, $val);
// Class::Methode
else if (preg_match("/^(\w*)::(\w*)$/", $fonc, $regs)
AND $methode = array($regs[1], $regs[2])
AND is_callable($methode))
$val = call_user_func($methode, $val);
else
spip_log("Erreur - '$fonc' non definie !");
Fil
a validé
// chargement du pipeline sous la forme d'un fichier php prepare
function pipeline($action,$val){
$ok = @is_readable($f = _DIR_SESSIONS."charger_pipelines.php");
Fil
a validé
if (!$ok){
include_spip('inc/plugin');
Fil
a validé
// generer les fichiers php precompiles
// de chargement des plugins et des pipelines
verif_plugin();
$ok = @is_readable($f = _DIR_SESSIONS."charger_pipelines.php");
Fil
a validé
if (!$ok)
spip_log("generation de $f impossible; tous les pipeline desactives");
Fil
a validé
}
if ($ok){
require_once($f);
$f = "execute_pipeline_$action";
$ok = function_exists($f);
if ($ok){
$val = $f($val);
// si le flux est une table qui encapsule donnees et autres
// on ne ressort du pipe que les donnees
if (is_array($val)&&isset($val['data']))
$val = $val['data'];
}
else{
include_spip('inc/plugin');
//on passe $action en arg pour creer la fonction meme si le pipe n'est defini nul part
// vu qu'on est la c'est qu'il existe !
verif_plugin($action);
spip_log("fonction $f absente : pipeline desactive");
}
Fil
a validé
}
return $val;
}
//
// Enregistrement des evenements
//
function spip_log($message, $logname='spip') {
static $compteur;
if ($compteur++ > 100) return;
$pid = '(pid '.@getmypid().')';
$message = date("M d H:i:s").' '.$GLOBALS['ip'].' '.$pid.' '
.preg_replace("/\n*$/", "\n", $message);
$logfile = _DIR_SESSIONS . $logname . '.log';
if (@file_exists($logfile)
AND (!$s = @filesize($logfile) OR $s > 10*1024)) {
$rotate = true;
$message .= "[-- rotate --]\n";
}
$f = @fopen($logfile, "ab");
if ($f) {
fputs($f, htmlspecialchars($message));
fclose($f);
}
if ($rotate) {
@unlink($logfile.'.3');
@rename($logfile.'.2',$logfile.'.3');
@rename($logfile.'.1',$logfile.'.2');
@rename($logfile,$logfile.'.1');
}
// recopier les spip_log mysql (ce sont uniquement des erreurs)
// dans le spip_log general
if ($logname == 'mysql')
spip_log($message);
}
// API d'appel a la base de donnees
function spip_connect() {
static $t;
if ($t++) return;
include_once(_FILE_CONNECT);
}
function spip_query($query) {
// Remarque : si on est appele par l'install,
// la connexion initiale a ete faite avant
if (!$GLOBALS['db_ok']) {
// Essaie de se connecter
if (_FILE_CONNECT)
spip_connect();
# else ????
}
// Erreur de connexion
if (!$GLOBALS['db_ok'])
return;
// Vieux format de fichier connexion
// Note: la version 0.1 est compatible avec la 0.2 (mais elle gere
// moins bien les erreurs timeout sur SQL), on ne force donc pas l'upgrade
if ($GLOBALS['spip_connect_version'] < 0.1) {
if (!_DIR_RESTREINT) {$GLOBALS['db_ok'] = false; return;}
redirige_par_entete(
generer_url_ecrire('upgrade', 'reinstall=oui', true));
}
// Faire la requete
return spip_query_db($query);
}
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
// Renvoie le _GET ou le _POST emis par l'utilisateur
function _request($var) {
global $_GET, $_POST;
if (isset($_GET[$var])) return $_GET[$var];
if (isset($_POST[$var])) return $_POST[$var];
return NULL;
}
//
// Prend une URL et lui ajoute/retire un parametre.
// Exemples : [(#SELF|parametre_url{suite,18})] (ajout)
// [(#SELF|parametre_url{suite,''})] (supprime)
// [(#SELF|parametre_url{suite})] (prend $suite dans la _request)
// http://www.spip.net/@parametre_url
//
function parametre_url($url, $c, $v=NULL, $sep='&') {
// lever l'#ancre
if (preg_match(',^([^#]*)(#.*)$,', $url, $r)) {
$url = $r[1];
$ancre = $r[2];
} else
$ancre = '';
// eclater
$url = preg_split(',[?]|&|&,', $url);
// recuperer la base
$a = array_shift($url);
// ajout de la globale ?
if ($v === NULL)
$v = _request($c);
// lire les variables et agir
foreach ($url as $n => $val) {
if (preg_match(',^'.$c.'(=.*)?$,', $val)) {
// suppression
if (!$v) {
unset($url[$n]);
} else {
$url[$n] = $c.'='.urlencode($v);
$v = '';
}
}
}
// ajouter notre parametre si on ne l'a pas encore trouve
if ($v)
$url[] = $c.'='.urlencode($v);
// eliminer les vides
$url = array_filter($url);
// recomposer l'adresse
if ($url)
$a .= '?' . join($sep, $url);
return $a . $ancre;
}
//
// pour calcul du nom du fichier cache et autres
//
function nettoyer_uri() {
return preg_replace
(',[?&](PHPSESSID|(var_[^=&]*))=[^&]*,i',
'',
$GLOBALS['REQUEST_URI']);
}
//
// donner l'URL de base d'un lien vers "soi-meme", modulo
// les trucs inutiles
//
function self($root = false) {
$url = nettoyer_uri();
if (!$root)
$url = preg_replace(',^[^?]*/,', '', $url);
// ajouter le cas echeant les variables _POST['id_...']
foreach ($_POST as $v => $c)
if (substr($v,0,3) == 'id_')
$url = parametre_url($url, $v, $c, '&');
// supprimer les variables sans interet
if (!_DIR_RESTREINT) {
$url = preg_replace (',([?&])('
.'lang|set_options|set_couleur|set_disp|set_ecran|show_docs|'
.'changer_lang|var_lang|action)=[^&]*,i', '\1', $url);
$url = preg_replace(',([?&])[&]+,', '\1', $url);
$url = preg_replace(',[&]$,', '\1', $url);
}
// eviter les hacks
$url = htmlspecialchars($url);
return $url;
}
var $uri;
//
// Contructeur : a appeler soit avec l'URL du lien a creer,
// soit sans parametres, auquel cas l'URL est l'URL courante
//
// parametre $root = demander un lien a partir de la racine du serveur /
function Link($url = '', $root = false) {
if (!$url)
$url = self($root);
$this->uri = $url;
}
//
// Effacer une variable
//
function delVar($name) {
$this->uri = parametre_url($this->uri, $name, '', '&');
}
//
// Ajouter une variable
// (si aucune valeur n'est specifiee, prend la valeur globale actuelle)
//
function addVar($name, $value = NULL) {
$this->uri = parametre_url($this->uri, $name, $value, '&');
}
//
// Recuperer l'URL correspondant au lien
//
function getUrl($anchor = '') {
return $this->uri . ($anchor ? '#'.$anchor : '');
}
//
// Recuperer le debut de formulaire correspondant au lien
// (tag ouvrant + entrees cachees representant les variables)
//
function getForm($method = 'get', $query = '', $enctype = '') {
if (preg_match(',^[a-z],i', $query))
$action = $query;
else
$action = preg_replace(',[?].*,', '', $this->uri).$query;
$form = "<form method='$method' action='"
.quote_amp($action)."'";
if ($enctype) $form .= " enctype='$enctype'";
$form .= " style='border: 0px; margin: 0px;'>\n";
$form .= form_hidden($this->uri);
return $form;
}
}
//
// Gerer les valeurs meta
//
// Fonction lire_meta abandonnee, remplacee par son contenu. Ne plus utiliser
function lire_meta($nom) {
global $meta;
return $meta[$nom];
}
//
// Traduction des textes de SPIP
//
function _T($texte, $args = '') {
$text = traduire_chaine($texte, $args);
if (!empty($GLOBALS['xhtml'])) {
$text = html2unicode($text, true /* secure */);
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
}
return $text ? $text :
// pour les chaines non traduites
(($n = strpos($texte,':')) === false ? $texte :
substr($texte, $n+1));
}
// chaines en cours de traduction
function _L($text) {
if ($GLOBALS['test_i18n'])
return "<span style='color:red;'>$text</span>";
else
return $text;
}
// Nommage bizarre des tables d'objets
function table_objet($type) {
if ($type == 'site' OR $type == 'syndic')
return 'syndic';
else if ($type == 'forum')
return 'forum';
else
return $type.'s';
}
function id_table_objet($type) {
if ($type == 'site' OR $type == 'syndic')
return 'id_syndic';
else if ($type == 'forum')
return 'id_forum';
else
return 'id_'.$type;
}
//
// spip_timer : on l'appelle deux fois et on a la difference, affichable
//
function spip_timer($t='rien') {
static $time;
$a=time(); $b=microtime();
if (isset($time[$t])) {
$p = $a + $b - $time[$t];
unset($time[$t]);
return sprintf("%.2fs", $p);
} else
$time[$t] = $a + $b;
}
// spip_touch : verifie si un fichier existe et n'est pas vieux (duree en s)
// et le cas echeant le touch() ; renvoie true si la condition est verifiee
// et fait touch() sauf si ca n'est pas souhaite
// (regle aussi le probleme des droits sur les fichiers touch())
function spip_touch($fichier, $duree=0, $touch=true) {
if (!($exists = @file_exists($fichier))
|| ($duree == 0)
|| (@filemtime($fichier) < time() - $duree)) {
if ($touch) {
if (!@touch($fichier)) { @unlink($fichier); @touch($fichier); };
if (!$exists) @chmod($fichier, 0666);
}
return true;
}
return false;
}
// Pour executer des taches de fond discretement, on utilise background-image
// car contrairement a un iframe vide, les navigateurs ne diront pas qu'ils
// n'ont pas fini de charger, c'est plus rassurant.
// C'est aussi plus discret qu'un <img> sous un navigateur non graphique.
// Cette fonction est utilisee pour l'espace prive (cf inc_presentation)
// et pour l'espace public (cf #SPIP_CRON dans inc_balise)
function generer_spip_cron() {
return '<div style="background-image: url(\'' . generer_url_action('cron') .
}
// envoi de l'image demandee dans le code ci-dessus
function envoie_image_vide() {
$image = pack("H*", "47494638396118001800800000ffffff00000021f90401000000002c0000000018001800000216848fa9cbed0fa39cb4da8bb3debcfb0f86e248965301003b");
header("Content-Type: image/gif");
header("Content-Length: ".strlen($image));
header("Cache-Control: no-cache,no-store");
header("Pragma: no-cache");
header("Connection: close");
echo $image;
flush();
function action_cron() {
envoie_image_vide();
cron (1);
}
//
// cron() : execution des taches de fond
// quand il est appele par public.php il n'est pas gourmand;
// quand il est appele par ?action=cron, il est gourmand
function cron ($gourmand=false) {
// Si on est gourmand, ou si le fichier gourmand n'existe pas
// (ou est trop vieux -> 60 sec), on va voir si un cron est necessaire.
// Au passage si on est gourmand on le dit aux autres
if (spip_touch(_FILE_CRON_LOCK.'-gourmand', 60, $gourmand)
OR $gourmand) {
// Faut-il travailler ? Pas tous en meme temps svp
// Au passage si on travaille on bloque les autres
if (spip_touch(_FILE_CRON_LOCK, 2)) {
spip_cron();
}
}
}
//
// Entetes les plus courants (voir inc_headers.php pour les autres)
//
function http_gmoddate($lastmodified) {
return gmdate("D, d M Y H:i:s", $lastmodified);
}
function http_last_modified($lastmodified, $expire = 0) {
$gmoddate = http_gmoddate($lastmodified);
if ($GLOBALS['HTTP_IF_MODIFIED_SINCE']
AND !preg_match(',IIS/,', $_SERVER['SERVER_SOFTWARE'])) # MSoft IIS is dumb
{
$if_modified_since = preg_replace('/;.*/', '',
$GLOBALS['HTTP_IF_MODIFIED_SINCE']);
$if_modified_since = trim(str_replace('GMT', '', $if_modified_since));
if ($if_modified_since == $gmoddate) {
include_spip('inc/headers');
http_status(304);
$headers_only = true;
}
}
@Header ("Last-Modified: ".$gmoddate." GMT");
if ($expire)
@Header ("Expires: ".http_gmoddate($expire)." GMT");
return $headers_only;
}
// envoyer le navigateur sur une nouvelle adresse
// en evitant les attaques par la redirection (souvent indique par 1 $_GET)
esj
a validé
function redirige_par_entete($url, $fin="") {
# en theorie on devrait faire ca tout le temps, mais quand la chaine
# commence par ? c'est imperatif, sinon l'url finale n'est pas la bonne
if ($url[0]=='?')
$url = url_de_base().$url;
header("Location: " . strtr("$url$fin", "\n\r", " "));
echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head>
<body>
<h1>302 Found</h1>
<a href="'
.quote_amp("$url$fin")
.'">Click here</a>.
</body></html>';
exit;
}
// transformation XML des "&" en "&"
function quote_amp($u) {
return preg_replace(
"/&(?![a-z]{0,4}\w{2,3};|#x?[0-9a-f]{2,5};)/i",
"&",$u);
}
// Transforme n'importe quel champ en une chaine utilisable
// en PHP ou Javascript en toute securite
// < ? php $x = '[(#TEXTE|texte_script)]'; ? >
function texte_script($texte) {
return str_replace('\'', '\\\'', str_replace('\\', '\\\\', $texte));
}
//
// find_in_path() : chercher un fichier nomme x selon le chemin rep1:rep2:rep3
//
function find_in_path ($filename, $sinon = NULL, $path='AUTO') {
// Chemin standard depuis l'espace public
if ($path == 'AUTO') {
$path = defined('_SPIP_PATH') ? explode(':', _SPIP_PATH) :
array(
_DIR_RACINE,
_DIR_RACINE.'dist/',
_DIR_RACINE.'formulaires/',
_DIR_RESTREINT
);
// Ajouter les repertoires des plugins
foreach ($GLOBALS['plugins'] as $plug)
array_unshift($path, _DIR_PLUGINS.$plug.'/');
// Ajouter squelettes/
array_unshift($path, _DIR_RACINE.'squelettes/');
// Et le dossier des squelettes nomme
Fil
a validé
if ($GLOBALS['dossier_squelettes'])
array_unshift($path,
_DIR_RACINE.$GLOBALS['dossier_squelettes'].'/');
}
// Parcourir le chemin
# Attention, dans l'espace prive on a parfois sinon='' pour _DIR_INCLUDE
if ($sinon !== NULL)
array_push($path, $sinon);
foreach ($path as $dir) {
// ajouter un / eventuellement manquant a la fin
if (strlen($dir) AND substr($dir,-1) != '/') $dir .= "/";
# spip_log("find_in_path n'a pas vu '$filename' dans $path");
// predicat sur les scripts de ecrire qui n'authentifient pas par cookie
function autoriser_sans_cookie($nom)
{
static $autsanscookie = array('aide_index', 'install', 'admin_repair', 'spip_cookie');
$nom = preg_replace('/.php[3]?$/', '', basename($nom));
return in_array($nom, $autsanscookie);
}
// Cette fonction charge le bon inc-urls selon qu'on est dans l'espace
// public ou prive, la presence d'un (old style) inc-urls.php3, etc.
function charger_generer_url() {
static $ok;
if ($ok++) return; # fichier deja charge
if (!_DIR_RESTREINT)
// espace public
else {
// fichier inc-urls ? (old style)
if (@file_exists($f = _DIR_RACINE.'inc-urls.php3')
OR @file_exists($f = _DIR_RACINE.'inc-urls.php')
OR $f = find_in_path('inc-urls-'.$GLOBALS['type_urls'].'.php3')
OR $f = include_spip('urls/'.$GLOBALS['type_urls'], false)
)
include_once($f);
//
// 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)
function url_de_base() {
global $REQUEST_URI;
static $url;
if ($url)
return $url;
$http = (
substr($_SERVER["SCRIPT_URI"],0,5) == 'https'
OR $_SERVER['HTTPS']
) ? 'https' : 'http';
# note : HTTP_HOST contient le :port si necessaire
$myself = $http.'://'.$_SERVER['HTTP_HOST'].$REQUEST_URI;
# supprimer (ecrire/)?xxxxx
$url = preg_replace(',/('._DIR_RESTREINT_ABS.')?[^/]*$,', '/', $myself);
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é
function generer_url_ecrire($script, $args="", $no_entities=false, $rel=false) {
if (!$rel)
$ecrire = url_de_base() . _DIR_RESTREINT_ABS;
else
$ecrire = _DIR_RESTREINT ? _DIR_RESTREINT : './';
esj
a validé
if ($script AND $script<>'accueil')
$exec = "exec=$script";
if ($args AND $exec)
$args = "?$exec&$args";
else if ($args)
$args = "?$args";
else if ($exec)
$args = "?$exec";
esj
a validé
if (!$no_entities) $args = str_replace('&', '&', $args);
//
// 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)
function get_spip_script($default='') {
# cas define('_SPIP_SCRIPT', '');
return $default;
}
function generer_url_public($script, $args="", $no_entities=false) {
// si le script est une action (spip_pass, spip_inscription),
// utiliser generer_url_action [hack temporaire pour faire
// fonctionner #URL_PAGE{spip_pass} ]
if (preg_match(',^spip_(.*),', $script, $regs))
return generer_url_action($regs[1],$args,true); # attention a la recursivite !!
$action = get_spip_script();
if ($script)
$action = parametre_url($action, 'page', $script, '&');
Fil
a validé
if ($args)
$action .=
(strpos($action, '?') !== false ? '&' : '?') . $args;
if (!$no_entities)
$action = quote_amp($action);
function generer_url_action($script, $args="", $no_entities=false) {
"action=$script" .($args ? "&$args" : ''),
$no_entities);
// Dirty hack contre le register_globals a 'Off' (PHP 4.1.x)
// A remplacer (bientot ?) par une gestion propre des variables admissibles ;-)
// Attention pour compatibilite max $_GET n'est pas superglobale
// NB: c'est une fonction de maniere a ne pas pourrir $GLOBALS
function spip_register_globals() {
// Liste des variables dont on refuse qu'elles puissent provenir du client
$refuse_gpc = array (
# inc-public
'fond', 'delais',
# ecrire/inc_auth
'REMOTE_USER',
'PHP_AUTH_USER', 'PHP_AUTH_PW'
);
// Liste des variables (contexte) dont on refuse qu'elles soient cookie
// (histoire que personne ne vienne fausser le cache)
$refuse_c = array (
# inc-calcul
'id_parent', 'id_rubrique', 'id_article',
'id_auteur', 'id_breve', 'id_forum', 'id_secteur',
'id_syndic', 'id_syndic_article', 'id_mot', 'id_groupe',
'id_document', 'date', 'lang'
);
// Si les variables sont passees en global par le serveur, il faut
// faire quelques verifications de base
if (@ini_get('register_globals')) {
foreach ($refuse_gpc as $var) {
if (isset($GLOBALS[$var])) {
if (
// demande par le client
$_REQUEST[$var] !== NULL
// et pas modifie par les fichiers d'appel
AND $GLOBALS[$var] == $_REQUEST[$var]
) // Alors on ne sait pas si c'est un hack
}
}
foreach ($refuse_c as $var) {
if (isset($GLOBALS[$var])) {
if (
isset ($_COOKIE[$var])
AND $_COOKIE[$var] == $GLOBALS[$var]
)
define ('spip_interdire_cache', true);
}
}
}
// sinon il faut les passer nous-memes, a l'exception des interdites.
// (A changer en une liste des variables admissibles...)
else {
foreach (array('_SERVER', '_COOKIE', '_POST', '_GET') as $_table) {
foreach ($GLOBALS[$_table] as $var => $val) {
if (!isset($GLOBALS[$var]) # indispensable securite
AND isset($GLOBALS[$_table][$var])
AND ($_table == '_SERVER' OR !in_array($var, $refuse_gpc))
AND ($_table <> '_COOKIE' OR !in_array($var, $refuse_c)))
$GLOBALS[$var] = $val;
}
}
}
}
function spip_initialisation() {
// la taille maxi des logos (0 : pas de limite)
define('_LOGO_MAX_SIZE', 0); # poids en ko
define('_LOGO_MAX_WIDTH', 0); # largeur en pixels
define('_LOGO_MAX_HEIGHT', 0); # hauteur en pixels
// Le fichier de connexion a la base de donnees
define('_FILE_CONNECT_INS', (_DIR_RESTREINT . "inc_connect"));
define('_FILE_CONNECT',
(@is_readable($f = _FILE_CONNECT_INS . '.php') ? $f
: (@is_readable($f = _FILE_CONNECT_INS . '.php3') ? $f
: false)));
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
// les repertoires annexes
define('_DIR_IMG', _DIR_RACINE ."IMG/");
define('_DIR_DOC', _DIR_RACINE ."IMG/");
define('_DIR_CACHE', _DIR_RACINE ."CACHE/");
define('_DIR_SESSIONS', _DIR_RESTREINT . "data/");
define('_DIR_TRANSFERT', _DIR_RESTREINT . "upload/");
define('_DIR_PLUGINS', _DIR_RACINE . "plugins/");
define('_DIR_LOGOS', _DIR_RACINE ."IMG/");
// les fichiers qu'on y met, entre autres
define('_FILE_CRON_LOCK', _DIR_SESSIONS . 'cron.lock');
define('_FILE_MYSQL_OUT', _DIR_SESSIONS . 'mysql_out');
define('_FILE_GARBAGE', _DIR_SESSIONS . '.poubelle');
define('_FILE_META', _DIR_SESSIONS . 'meta_cache.txt');
// sous-repertoires d'images
define('_DIR_TeX', _DIR_IMG . "cache-TeX/");
// Icones
# le chemin http (relatif) vers les images standard
define('_DIR_IMG_PACK', (_DIR_RESTREINT . 'img_pack/'));
# vers les logos de type de document, standard & perso
define('_DIR_IMG_ICONES_DIST', _DIR_IMG_PACK . "icones/");
define('_DIR_IMG_ICONES', _DIR_IMG . "icones/");
# les icones de la barre d'edition des formulaires
define('_DIR_IMG_ICONES_BARRE', _DIR_IMG_PACK . "icones_barre/");
# le chemin php (absolu) vers les images standard (pour hebergement centralise)
define('_ROOT_IMG_PACK', (dirname(dirname(__FILE__)) . '/img_pack/'));
define('_ROOT_IMG_ICONES_DIST', (dirname(dirname(__FILE__)) . '/img_pack/icones/'));
// Le charset par defaut lors de l'installation
define('_DEFAULT_CHARSET', 'utf-8');
// les repertoires devant etre TOUJOURS accessibles en ecriture
$GLOBALS['test_dirs'] = array(_DIR_CACHE, _DIR_IMG, _DIR_SESSIONS);
// qq chaines standard
define('_ACCESS_FILE_NAME', '.htaccess');
define('_AUTH_USER_FILE', '.htpasswd');
define('_DOCTYPE_ECRIRE', "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n");
// L'adresse de base du site ; on peut mettre '' si la racine est geree par
// le script index.php
define('_SPIP_SCRIPT', 'spip.php');
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
// *********** traiter les variables ************
// Recuperer les superglobales $_GET si non definies
// (en theorie c'est impossible depuis PHP 4.0.3, cf. track_vars)
// et les identifier aux $HTTP_XX_VARS
foreach (array('_GET', '_POST', '_COOKIE', '_SERVER') as $_table) {
$http_table_vars = 'HTTP'.$_table.'_VARS';
if (!is_array($GLOBALS[$_table])) {
$GLOBALS[$_table] = array();
if (is_array($GLOBALS[$http_table_vars]))
$GLOBALS[$_table] = & $GLOBALS[$http_table_vars];
}
$GLOBALS[$http_table_vars] = & $GLOBALS[$_table];
}
//
// 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);
spip_desinfecte($GLOBALS);
// Par ailleurs on ne veut pas de magic_quotes au cours de l'execution
@set_magic_quotes_runtime(0);
// Remplir $GLOBALS avec $_GET et $_POST (methode a revoir pour fonctionner
// completement en respectant register_globals = off)
spip_register_globals();
// appliquer le cookie_prefix
if ($GLOBALS['cookie_prefix'] != 'spip') {
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
recuperer_cookies_spip($GLOBALS['cookie_prefix']);
}
//
// Capacites php (en fonction de la version)
//
$GLOBALS['flag_gz'] = function_exists("gzencode"); #php 4.0.4
$GLOBALS['flag_ob'] = (function_exists("ob_start")
&& function_exists("ini_get")
&& (@ini_get('max_execution_time') > 0)
&& !strstr(ini_get('disable_functions'), 'ob_'));
$GLOBALS['flag_sapi_name'] = function_exists("php_sapi_name");
$GLOBALS['flag_revisions'] = function_exists("gzcompress");
$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));
//
// Sommes-nous dans l'empire du Mal ?
// (ou sous le signe du Pingouin, ascendant GNU ?)
//
if (strpos($_SERVER['SERVER_SOFTWARE'], '(Win') !== false)
define ('os_serveur', 'windows');
//
// Infos sur le fichier courant
//
// Compatibilite avec serveurs ne fournissant pas $REQUEST_URI
if (!$GLOBALS['REQUEST_URI']) {
$GLOBALS['REQUEST_URI'] = $PHP_SELF;
if ($_SERVER['QUERY_STRING'] AND !strpos($_SERVER['REQUEST_URI'], '?'))
$GLOBALS['REQUEST_URI'] .= '?'.$_SERVER['QUERY_STRING'];
}
// tidy en ligne de commande (si on ne l'a pas en module php,
// ou si le module php ne marche pas)
// '/bin/tidy' ou '/usr/local/bin/tidy' ou tout simplement 'tidy'
#define('_TIDY_COMMAND', 'tidy');
//
// Module de lecture/ecriture/suppression de fichiers utilisant flock()
//