[ Index ] |
|
Code source de SPIP 1.8.3 |
1 <?php 2 3 /***************************************************************************\ 4 * SPIP, Systeme de publication pour l'internet * 5 * * 6 * Copyright (c) 2001-2005 * 7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * 8 * * 9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * 10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * 11 \***************************************************************************/ 12 13 14 // 15 // Ce fichier ne sera execute qu'une fois 16 if (defined("_ECRIRE_INC_VERSION")) return; 17 define("_ECRIRE_INC_VERSION", "1"); 18 19 function define_once ($constant, $valeur) { 20 if (!defined($constant)) define($constant, $valeur); 21 } 22 23 // 6 constantes incontournables et prioritaires 24 25 define('_EXTENSION_PHP', '.php3'); # a etendre 26 define('_DIR_RESTREINT_ABS', 'ecrire/'); 27 define('_DIR_RESTREINT', (!@is_dir(_DIR_RESTREINT_ABS) ? "" : _DIR_RESTREINT_ABS)); 28 define('_FILE_OPTIONS', _DIR_RESTREINT . 'mes_options.php3'); 29 define('_FILE_CONNECT_INS', (_DIR_RESTREINT . "inc_connect")); 30 define('_FILE_CONNECT', 31 (@file_exists(_FILE_CONNECT_INS . _EXTENSION_PHP) ? 32 (_FILE_CONNECT_INS . _EXTENSION_PHP) 33 : false)); 34 35 // 36 // Gestion des inclusions et infos repertoires 37 // 38 39 $included_files = array(); 40 41 function include_local($file) { 42 if (@$GLOBALS['included_files'][$file]++) return; 43 include($file); 44 } 45 46 function include_ecrire($file) { 47 # Hack pour etre compatible avec les mes_options qui appellent cette fonction 48 define_once('_DIR_INCLUDE', _DIR_RESTREINT); 49 $file = _DIR_INCLUDE . $file; 50 if (@$GLOBALS['included_files'][$file]++) return; 51 include($file); 52 } 53 54 function include_lang($file) { 55 $file = _DIR_LANG . $file; 56 if (@$GLOBALS['included_files'][$file]++) return; 57 include($file); 58 } 59 60 function include_plug($file) { 61 $file = _DIR_RESTREINT . $file; 62 if (@$GLOBALS['included_files'][$file]++) return; 63 if (file_exists($file)) include($file); 64 } 65 66 67 // Masquer les warning 68 error_reporting(E_ALL ^ E_NOTICE); 69 70 // *********** traiter les variables ************ 71 72 // Recuperer les superglobales $_GET si non definies 73 // (en theorie c'est impossible depuis PHP 4.0.3, cf. track_vars) 74 // et les identifier aux $HTTP_XX_VARS 75 foreach (array('_GET', '_POST', '_COOKIE', '_SERVER') as $_table) { 76 $http_table_vars = 'HTTP'.$_table.'_VARS'; 77 if (!is_array($GLOBALS[$_table])) { 78 $GLOBALS[$_table] = array(); 79 if (is_array($GLOBALS[$http_table_vars])) 80 $GLOBALS[$_table] = & $GLOBALS[$http_table_vars]; 81 } 82 $GLOBALS[$http_table_vars] = & $GLOBALS[$_table]; 83 } 84 85 // 86 // Securite 87 // 88 89 // Ne pas se faire manger par un bug php qui laisse passer ?GLOBALS[truc]=toto 90 if (isset($_REQUEST['GLOBALS'])) die(); 91 // Annuler les magic quotes \' sur GET POST COOKIE et GLOBALS ; 92 // supprimer aussi les eventuels caracteres nuls %00, qui peuvent tromper 93 // la commande file_exists('chemin/vers/fichier/interdit%00truc_normal') 94 function spip_desinfecte(&$t) { 95 static $magic_quotes; 96 if (!isset($magic_quotes)) 97 $magic_quotes = @get_magic_quotes_gpc(); 98 99 if (is_array($t)) { 100 foreach ($t as $key => $val) { 101 if (!is_array($val) 102 OR !isset($t['spip_recursions'])) { # interdire les recursions 103 $t['spip_recursions'] = true; 104 spip_desinfecte($t[$key]); 105 } 106 } 107 } else { 108 $t = str_replace(chr(0), '', $t); 109 if ($magic_quotes) 110 $t = stripslashes($t); 111 } 112 } 113 spip_desinfecte($_GET); 114 spip_desinfecte($_POST); 115 spip_desinfecte($_COOKIE); 116 # if (@ini_get('register_globals')) // pas fiable 117 spip_desinfecte($GLOBALS); 118 # a la fin supprimer la variable anti-recursion devenue inutile 119 # (et meme nuisible, notamment si on teste $_POST) 120 unset($_GET['spip_recursions']); 121 unset($_POST['spip_recursions']); 122 unset($_COOKIE['spip_recursions']); 123 unset($GLOBALS['spip_recursions']); 124 // Par ailleurs on ne veut pas de magic_quotes au cours de l'execution 125 @set_magic_quotes_runtime(0); 126 127 // Dirty hack contre le register_globals a 'Off' (PHP 4.1.x) 128 // A remplacer (un jour!) par une gestion propre des variables admissibles ;-) 129 // Attention pour compatibilite max $_GET n'est pas superglobale 130 // NB: c'est une fonction de maniere a ne pas pourrir $GLOBALS 131 function spip_register_globals() { 132 133 // Liste des variables dont on refuse qu'elles puissent provenir du client 134 $refuse_gpc = array ( 135 # inc-public.php3 136 'fond', 'delais', 137 138 # ecrire/inc_auth.php3 139 'REMOTE_USER', 140 'PHP_AUTH_USER', 'PHP_AUTH_PW', 141 142 # ecrire/inc_texte.php3 143 'debut_intertitre', 'fin_intertitre', 'ligne_horizontale', 144 'ouvre_ref', 'ferme_ref', 'ouvre_note', 'ferme_note', 145 'les_notes', 'compt_note', 'nombre_surligne', 146 'url_glossaire_externe', 'puce', 'puce_rtl' 147 ); 148 149 // Liste des variables (contexte) dont on refuse qu'elles soient cookie 150 // (histoire que personne ne vienne fausser le cache) 151 $refuse_c = array ( 152 # inc-calcul.php3 153 'id_parent', 'id_rubrique', 'id_article', 154 'id_auteur', 'id_breve', 'id_forum', 'id_secteur', 155 'id_syndic', 'id_syndic_article', 'id_mot', 'id_groupe', 156 'id_document', 'date', 'lang' 157 ); 158 159 160 // Si les variables sont passees en global par le serveur, il faut 161 // faire quelques verifications de base 162 if (@ini_get('register_globals')) { 163 foreach ($refuse_gpc as $var) { 164 if (isset($GLOBALS[$var])) { 165 foreach (array('_GET', '_POST', '_COOKIE') as $_table) { 166 if ( 167 // demande par le client 168 isset ($GLOBALS[$_table][$var]) 169 // et pas modifie par les fichiers d'appel 170 AND $GLOBALS[$_table][$var] == $GLOBALS[$var] 171 ) // On ne sait pas si c'est un hack 172 { 173 # REMOTE_USER ou fond, c'est grave ; 174 # pour le reste (cookie 'lang', par exemple), simplement 175 # interdire la mise en cache de la page produite 176 switch ($var) { 177 case 'REMOTE_USER': 178 die ("$var interdite"); 179 break; 180 case 'fond': 181 if (!defined('_SPIP_PAGE')) 182 die ("$var interdite"); 183 break; 184 default: 185 define ('spip_interdire_cache', true); 186 } 187 } 188 } 189 } 190 } 191 foreach ($refuse_c as $var) { 192 if (isset($GLOBALS[$var])) { 193 foreach (array('_COOKIE') as $_table) { 194 if ( 195 // demande par le client 196 isset ($GLOBALS[$_table][$var]) 197 // et pas modifie par les fichiers d'appel 198 AND $GLOBALS[$_table][$var] == $GLOBALS[$var] 199 ) 200 define ('spip_interdire_cache', true); 201 } 202 } 203 } 204 } 205 206 // sinon il faut les passer nous-memes, a l'exception des interdites. 207 // (A changer en une liste des variables admissibles...) 208 else { 209 foreach (array('_SERVER', '_COOKIE', '_POST', '_GET') as $_table) { 210 foreach ($GLOBALS[$_table] as $var => $val) { 211 if (!isset($GLOBALS[$var]) 212 AND isset($GLOBALS[$_table][$var]) 213 AND ($_table == '_SERVER' OR !in_array($var, $refuse_gpc)) 214 AND ($_table <> '_COOKIE' OR !in_array($var, $refuse_c))) 215 $GLOBALS[$var] = $val; 216 } 217 } 218 } 219 } 220 spip_register_globals(); 221 222 223 224 225 226 // 227 // *** Parametrage par defaut de SPIP *** 228 // 229 // Ces parametres d'ordre technique peuvent etre modifies 230 // dans ecrire/mes_options.php3 (_FILE_OPTIONS) Les valeurs 231 // specifiees dans ce dernier fichier remplaceront automatiquement 232 // les valeurs ci-dessous. 233 // 234 // Pour creer ecrire/mes_options.php3 : recopier simplement 235 // les lignes ci-dessous, et ajouter le marquage de debut et 236 // de fin de fichier PHP ("< ?php" et "? >", sans les espaces) 237 // 238 239 // Prefixe des tables dans la base de donnees 240 // (a modifier pour avoir plusieurs sites SPIP dans une seule base) 241 $table_prefix = "spip"; 242 243 // Prefixe et chemin des cookies 244 // (a modifier pour installer des sites SPIP dans des sous-repertoires) 245 $cookie_prefix = "spip"; 246 $cookie_path = ""; 247 248 // Dossier des squelettes 249 // (a modifier si l'on veut passer rapidement d'un jeu de squelettes a un autre) 250 $dossier_squelettes = ""; 251 252 // faut-il autoriser SPIP a compresser les pages a la volee quand le 253 // navigateur l'accepte (valable pour apache >= 1.3 seulement) ? 254 $auto_compress = true; 255 256 // Type d'URLs 257 // 'standard': article.php3?id_article=123 258 // 'html': article123.html 259 // 'propres': Titre-de-l-article <http://lab.spip.net/spikini/UrlsPropres> 260 // 'propres2' : Titre-de-l-article.html (base sur 'propres') 261 $type_urls = 'standard'; 262 263 // creation des vignettes avec image magick en ligne de commande : mettre 264 // le chemin complet '/bin/convert' (Linux) ou '/sw/bin/convert' (fink/Mac OS X) 265 // Note : preferer GD2 ou le module php imagick s'ils sont disponibles 266 $convert_command = 'convert'; 267 268 // creation des vignettes avec pnmscale 269 // Note: plus facile a installer par FTP, 270 // voir http://gallery.menalto.com/modules.php?op=modload&name=GalleryFAQ&file=index&myfaq=yes&id_cat=2#43 271 $pnmscale_command = 'pnmscale'; 272 273 // faut-il passer les connexions MySQL en mode debug ? 274 $mysql_debug = false; 275 276 // faut-il chronometrer les requetes MySQL ? 277 $mysql_profile = false; 278 279 // faut-il faire des connexions completes rappelant le nom du serveur et/ou de 280 // la base MySQL ? (utile si vos squelettes appellent d'autres bases MySQL) 281 // (A desactiver en cas de soucis de connexion chez certains hebergeurs) 282 // Note: un test a l'installation peut aussi avoir desactive 283 // $mysql_rappel_nom_base directement dans le fichier inc_connect.php3 284 $mysql_rappel_connexion = true; 285 $mysql_rappel_nom_base = true; 286 287 // faut-il afficher en rouge les chaines non traduites ? 288 $test_i18n = false; 289 290 // faut-il souligner en gris, dans articles.php3, les espaces insecables ? 291 $activer_revision_nbsp = false; 292 293 // gestion des extras (voir inc_extra.php3 pour plus d'informations) 294 $champs_extra = false; 295 $champs_extra_proposes = false; 296 297 // faut-il ignorer l'authentification par auth http/remote_user ? 298 $ignore_auth_http = false; 299 $ignore_remote_user = true; # methode obsolete et risquee 300 301 // Faut-il "invalider" les caches quand on depublie ou modifie un article ? 302 // (experimental) 303 # NB: cette option ne concerne que articles,breves,rubriques et site 304 # car les forums et petitions sont toujours invalidants. 305 $invalider_caches = false; 306 307 // Quota : la variable $quota_cache, si elle est > 0, indique la taille 308 // totale maximale desiree des fichiers contenus dans le CACHE/ ; 309 // ce quota n'est pas "dur", il ne s'applique qu'une fois par heure et 310 // fait redescendre le cache a la taille voulue ; valeur en Mo 311 // Si la variable vaut 0 aucun quota ne s'applique 312 $quota_cache = 10; 313 314 // code a fournir pour obtenir le debuggueur (urls &var_mode=debug) 315 // par defaut seuls les admins : $code_activation_debug=''; 316 // pour mettre un mot de passe : $code_activation_debug='x5g8jk9'; 317 $code_activation_debug = ''; 318 319 // 320 // Serveurs externes 321 // 322 # aide en ligne 323 $help_server = 'http://www.spip.net/aide'; 324 # TeX 325 $tex_server = 'http://math.spip.org/tex.php'; 326 # MathML (pas pour l'instant: manque un bon convertisseur) 327 // $mathml_server = 'http://arno.rezo.net/tex2mathml/latex.php'; 328 # Orthographe (serveurs multiples) [pas utilise pour l'instant] 329 $ortho_servers = array ('http://ortho.spip.net/ortho_serveur.php'); 330 331 // Produire du TeX ou du MathML ? 332 $traiter_math = 'tex'; 333 334 // Variables du compilateur de squelettes 335 336 $exceptions_des_tables = array(); 337 $tables_principales = array(); 338 $table_des_tables = array(); 339 $tables_relations = array(); 340 $tables_relations_keys = array(); 341 $table_primary = array(); 342 $table_date = array(); 343 $tables_des_serveurs_sql['localhost'] = &$tables_principales; 344 345 /* ATTENTION CETTE VARIABLE NE FONCTIONNE PAS ENCORE */ 346 // Extension du fichier du squelette 347 $extension_squelette = 'html'; 348 /* / MERCI DE VOTRE ATTENTION */ 349 350 // Droits d'acces maximum par defaut 351 @umask(0); 352 353 // 354 // Definition des repertoires standards, _FILE_OPTIONS ayant priorite 355 // 356 357 if (@file_exists(_FILE_OPTIONS)) { 358 include(_FILE_OPTIONS); 359 } 360 361 // la taille maxi des logos (0 : pas de limite) 362 define_once('_LOGO_MAX_SIZE', 0); # poids en ko 363 define_once('_LOGO_MAX_WIDTH', 0); # largeur en pixels 364 define_once('_LOGO_MAX_HEIGHT', 0); # hauteur en pixels 365 366 367 define_once('_DIR_INCLUDE', _DIR_RESTREINT); 368 define_once('_DIR_PREFIX1', (_DIR_RESTREINT ? "" : "../")); 369 define_once('_DIR_PREFIX2', _DIR_RESTREINT); 370 371 // les repertoires des logos, des documents joints, du CACHE et des sessions 372 define_once('_DIR_IMG', _DIR_PREFIX1 ."IMG/"); 373 define_once('_DIR_DOC', _DIR_PREFIX1 ."IMG/"); 374 define_once('_DIR_CACHE', _DIR_PREFIX1 ."CACHE/"); 375 376 define_once('_DIR_SESSIONS', _DIR_PREFIX2 . "data/"); 377 define_once('_DIR_TRANSFERT', _DIR_PREFIX2 . "upload/"); 378 379 380 // exemples de redefinition possible, 381 // SOUS RESERVE QUE php.ini N'AIT PAS pas openbasedir=. !!!!!! 382 // il est recommande de mettre les deux premiers en dehors de l'arbo http 383 // pour _DIR_DOC, on ne peut le faire qu'en configuration securisee 384 // pour _DIR_IMG, NE PAS LE METTRE en dehors de l'arborescence http 385 386 //define('_DIR_CACHE', "/tmp/c/"); 387 //define('_DIR_SESSIONS', "/tmp/s/"); 388 389 //define('_DIR_DOC', "/tmp/d/"); 390 //define('_DIR_INCLUDE', _DIR_RESTREINT ? 'Include/' : '../Include/'); 391 // globale des repertoires devant etre accessibles en ecriture 392 // (inutile de mettre leurs sous-repertoires) 393 394 $test_dirs = array(_DIR_CACHE, _DIR_IMG, _DIR_SESSIONS); 395 396 // les fichiers qu'on y met, entre autres, 397 398 define_once('_FILE_CRON_LOCK', _DIR_SESSIONS . 'cron.lock'); 399 define_once('_FILE_MYSQL_OUT', _DIR_SESSIONS . 'mysql_out'); 400 define_once('_FILE_GARBAGE', _DIR_SESSIONS . '.poubelle'); 401 402 403 // sous-repertoires d'images accessible en ecriture 404 405 define_once('_DIR_IMG_ICONES', _DIR_IMG . "icones/"); 406 define_once('_DIR_IMG_ICONES_BARRE', _DIR_IMG . "icones_barre/"); 407 define_once('_DIR_TeX', _DIR_IMG . "cache-TeX/"); 408 409 // pour ceux qui n'aiment pas nos icones et notre vocabulaire, tout est prevu 410 411 define_once('_DIR_IMG_PACK', (_DIR_RESTREINT . 'img_pack/')); 412 define_once('_DIR_LANG', (_DIR_RESTREINT . 'lang/')); 413 414 // qq chaines standard 415 416 define_once('_ACCESS_FILE_NAME', '.htaccess'); 417 define_once('_AUTH_USER_FILE', '.htpasswd'); 418 419 420 // tidy en ligne de commande (si on ne l'a pas en module php, 421 // ou si le module php ne marche pas) 422 // '/bin/tidy' ou '/usr/local/bin/tidy' ou tout simplement 'tidy' 423 #define_once('_TIDY_COMMAND', 'tidy'); 424 425 // Version courante de SPIP 426 // Stockee sous forme de nombre decimal afin de faciliter les comparaisons 427 // (utilise pour les modifs de la base de donnees) 428 429 // version de la base 430 $spip_version = 1.830; 431 432 // version de spip 433 $spip_version_affichee = "1.8.3"; 434 435 436 // ** Securite ** 437 $auteur_session = ''; 438 $connect_statut = ''; 439 $hash_recherche = ''; 440 $hash_recherche_strict = ''; 441 442 443 444 // 445 // Capacites php (en fonction de la version) 446 // 447 448 $flag_get_cfg_var = (@get_cfg_var('error_reporting') != ""); 449 $flag_ini_get = (function_exists("ini_get") 450 && (@ini_get('max_execution_time') > 0)); // verifier pas desactivee 451 $flag_gz = function_exists("gzencode"); #php 4.0.4 452 $flag_ob = ($flag_ini_get 453 && !ereg("ob_", ini_get('disable_functions')) 454 && function_exists("ob_start")); 455 $flag_crypt = function_exists("crypt"); 456 $flag_wordwrap = function_exists("wordwrap"); 457 $flag_apc = function_exists("apc_rm"); 458 $flag_sapi_name = function_exists("php_sapi_name"); 459 $flag_utf8_decode = function_exists("utf8_decode"); 460 $flag_ldap = function_exists("ldap_connect"); 461 $flag_flock = function_exists("flock"); 462 $flag_ImageCreateTrueColor = function_exists("ImageCreateTrueColor"); 463 $flag_ImageCopyResampled = function_exists("ImageCopyResampled"); 464 $flag_ImageGif = function_exists("ImageGif"); 465 $flag_ImageJpeg = function_exists("ImageJpeg"); 466 $flag_ImagePng = function_exists("ImagePng"); 467 $flag_imagick = function_exists("imagick_readimage"); // http://pear.sourceforge.net/en/packages.imagick.php 468 469 $flag_gd = $flag_ImageGif || $flag_ImageJpeg || $flag_ImagePng; 470 $flag_revisions = function_exists("gzcompress"); 471 472 // 473 // Appliquer le prefixe cookie 474 // 475 function spip_setcookie ($name='', $value='', $expire=0, $path='AUTO', $domain='', $secure='') { 476 $name = ereg_replace ('^spip_', $GLOBALS['cookie_prefix'].'_', $name); 477 if ($path == 'AUTO') $path=$GLOBALS['cookie_path']; 478 479 if ($secure) 480 @setcookie ($name, $value, $expire, $path, $domain, $secure); 481 else if ($domain) 482 @setcookie ($name, $value, $expire, $path, $domain); 483 else if ($path) 484 @setcookie ($name, $value, $expire, $path); 485 else if ($expire) 486 @setcookie ($name, $value, $expire); 487 else 488 @setcookie ($name, $value); 489 } 490 491 if ($cookie_prefix != 'spip') { 492 foreach ($_COOKIE as $name => $value) { 493 if (ereg('^spip_', $name)) { 494 unset($_COOKIE[$name]); 495 unset($$name); 496 } 497 } 498 foreach ($_COOKIE as $name => $value) { 499 if (ereg('^'.$cookie_prefix.'_', $name)) { 500 $spipname = ereg_replace ('^'.$cookie_prefix.'_', 'spip_', $name); 501 $_COOKIE[$spipname] = $INSECURE[$spipname] = $value; 502 $$spipname = $value; 503 } 504 } 505 } 506 507 508 // 509 // Sommes-nous dans l'empire du Mal ? 510 // 511 if (strpos($_SERVER['SERVER_SOFTWARE'], '(Win') !== false) 512 define ('os_serveur', 'windows'); 513 514 515 // 516 // Non ! Car le GNU veille... (Entete HTTP de frimeur) 517 // 518 if (!headers_sent()) 519 @header("Composed-By: SPIP $spip_version_affichee @ www.spip.net"); 520 521 522 // 523 // Enregistrement des evenements 524 // 525 function spip_log($message, $logname='spip') { 526 527 $pid = '(pid '.@getmypid().')'; 528 if (!$ip = $GLOBALS['REMOTE_ADDR']) $ip = '-'; 529 530 $message = date("M d H:i:s")." $ip $pid " 531 .ereg_replace("\n*$", "\n", $message); 532 533 $logfile = _DIR_SESSIONS . $logname . '.log'; 534 if (@file_exists($logfile) && (@filesize($logfile) > 10*1024)) { 535 $rotate = true; 536 $message .= "[-- rotate --]\n"; 537 } 538 $f = @fopen($logfile, "ab"); 539 if ($f) { 540 fputs($f, htmlspecialchars($message)); 541 fclose($f); 542 } 543 if ($rotate) { 544 @unlink($logfile.'.3'); 545 @rename($logfile.'.2',$logfile.'.3'); 546 @rename($logfile.'.1',$logfile.'.2'); 547 @rename($logfile,$logfile.'.1'); 548 } 549 550 // recopier les spip_log mysql (ce sont uniquement des erreurs) 551 // dans le spip_log general 552 if ($logname == 'mysql') 553 spip_log($message); 554 } 555 556 557 // 558 // Infos sur le fichier courant 559 // 560 561 // Compatibilite avec serveurs ne fournissant pas $REQUEST_URI 562 if (!$REQUEST_URI) { 563 $REQUEST_URI = $PHP_SELF; 564 if ($QUERY_STRING AND !strpos($REQUEST_URI, '?')) 565 $REQUEST_URI .= '?'.$QUERY_STRING; 566 } 567 568 if (!$PATH_TRANSLATED) { 569 if ($SCRIPT_FILENAME) $PATH_TRANSLATED = $SCRIPT_FILENAME; 570 else if ($DOCUMENT_ROOT && $SCRIPT_URL) $PATH_TRANSLATED = $DOCUMENT_ROOT.$SCRIPT_URL; 571 } 572 573 # obsoletes: utiliser les constantes ci-dessus. 574 # Conserver pour compatibilite vieilles contrib uniquement 575 $flag_ecrire = !@file_exists(_DIR_RESTREINT_ABS . 'inc_version.php3'); 576 $dir_ecrire = (ereg("/ecrire/", $GLOBALS['REQUEST_URI'])) ? '' : 'ecrire/'; 577 578 // API d'appel a la base de donnees 579 function spip_query($query) { 580 581 // Remarque : si on est appele par l'install, 582 // la connexion initiale a ete faite avant 583 if (!$GLOBALS['db_ok']) { 584 // Essaie de se connecter 585 if (_FILE_CONNECT) 586 include_local(_FILE_CONNECT); 587 } 588 589 // Erreur de connexion 590 if (!$GLOBALS['db_ok']) 591 return; 592 593 // Vieux format de fichier connexion 594 // Note: la version 0.1 est compatible avec la 0.2 (mais elle gere 595 // moins bien les erreurs timeout sur SQL), on ne force donc pas l'upgrade 596 if ($GLOBALS['spip_connect_version'] < 0.1) { 597 if (!_DIR_RESTREINT) {$GLOBALS['db_ok'] = false; return;} 598 redirige_par_entete("upgrade.php3?reinstall=oui"); 599 exit; 600 } 601 602 // Faire la requete 603 return spip_query_db($query); 604 } 605 606 607 // 608 // Infos de config PHP 609 // 610 611 // cf. liste des sapi_name - http://fr.php.net/php_sapi_name 612 $php_module = (($flag_sapi_name AND eregi("apache", @php_sapi_name())) OR 613 ereg("^Apache.* PHP", $SERVER_SOFTWARE)); 614 $php_cgi = ($flag_sapi_name AND eregi("cgi", @php_sapi_name())); 615 616 function http_status($status) { 617 global $php_cgi, $REDIRECT_STATUS; 618 619 if ($REDIRECT_STATUS && $REDIRECT_STATUS == $status) return; 620 $status_string = array( 621 200 => '200 OK', 622 301 => '301 Moved Permanently', 623 304 => '304 Not Modified', 624 401 => '401 Unauthorized', 625 403 => '403 Forbidden', 626 404 => '404 Not Found' 627 ); 628 629 if ($php_cgi) Header("Status: $status"); 630 else Header("HTTP/1.0 ".$status_string[$status]); 631 } 632 633 function http_gmoddate($lastmodified) { 634 return gmdate("D, d M Y H:i:s", $lastmodified); 635 } 636 function http_last_modified($lastmodified, $expire = 0) { 637 $gmoddate = http_gmoddate($lastmodified); 638 if ($GLOBALS['HTTP_IF_MODIFIED_SINCE'] 639 AND !preg_match(',IIS/,', $_SERVER['SERVER_SOFTWARE'])) # MSoft IIS is dumb 640 { 641 $if_modified_since = ereg_replace(';.*$', '', $GLOBALS['HTTP_IF_MODIFIED_SINCE']); 642 $if_modified_since = trim(str_replace('GMT', '', $if_modified_since)); 643 if ($if_modified_since == $gmoddate) { 644 http_status(304); 645 $headers_only = true; 646 } 647 } 648 @Header ("Last-Modified: ".$gmoddate." GMT"); 649 if ($expire) 650 @Header ("Expires: ".http_gmoddate($expire)." GMT"); 651 return $headers_only; 652 } 653 654 $flag_upload = (!$flag_get_cfg_var || (get_cfg_var('upload_max_filesize') > 0)); 655 656 function tester_upload() { 657 return $GLOBALS['flag_upload']; 658 } 659 660 661 // 662 // Reglage de l'output buffering : si possible, generer une sortie 663 // compressee pour economiser de la bande passante 664 // 665 function test_obgz () { 666 return 667 $GLOBALS['auto_compress'] 668 && $GLOBALS['flag_ob'] 669 && (phpversion()<>'4.0.4') 670 && function_exists("ob_gzhandler") 671 // special bug de proxy 672 && !eregi("NetCache|Hasd_proxy", $GLOBALS['HTTP_VIA']) 673 // special bug Netscape Win 4.0x 674 && !eregi("Mozilla/4\.0[^ ].*Win", $GLOBALS['HTTP_USER_AGENT']) 675 // special bug Apache2x 676 && !eregi("Apache(-[^ ]+)?/2", $GLOBALS['SERVER_SOFTWARE']) 677 && !($GLOBALS['flag_sapi_name'] AND ereg("^apache2", @php_sapi_name())) 678 // si la compression est deja commencee, stop 679 && !@ini_get("zlib.output_compression") 680 && !@ini_get("output_handler") 681 && !$GLOBALS['var_mode'] # bug avec le debugueur qui appelle ob_end_clean() 682 ; 683 } 684 685 // si un buffer est deja ouvert, stop 686 if ($flag_ob AND strlen(ob_get_contents())==0 AND !headers_sent()) { 687 @header("Vary: Cookie, Accept-Encoding"); 688 if (test_obgz()) { 689 ob_start('ob_gzhandler'); 690 } 691 } 692 693 694 class Link { 695 var $file; 696 var $vars; 697 var $arrays; 698 699 // 700 // Contructeur : a appeler soit avec l'URL du lien a creer, 701 // soit sans parametres, auquel cas l'URL est l'URL courante 702 // 703 // parametre $root = demander un lien a partir de la racine du serveur / 704 function Link($url = '', $root = false) { 705 global $_POST; 706 static $link = ''; 707 708 $this->vars = array(); 709 $this->arrays = array(); 710 711 // Normal case 712 if ($link) { 713 if ($url) { 714 $v = split('[\?\&]', $url); 715 list(, $this->file) = each($v); 716 while (list(, $var) = each($v)) { 717 list($name, $value) = split('=', $var, 2); 718 $name = urldecode($name); 719 $value = urldecode($value); 720 if (ereg('^(.*)\[\]$', $name, $regs)) { 721 $this->arrays[$regs[1]][] = $value; 722 } 723 else { 724 $this->vars[$name] = $value; 725 } 726 } 727 } 728 else { 729 $this->file = $link->file; 730 $this->vars = $link->vars; 731 $this->arrays = $link->arrays; 732 } 733 return; 734 } 735 736 // Si aucun URL n'est specifie, creer le lien "propre" 737 // ou l'on supprime de l'URL courant les bidules inutiles 738 if (!$url) { 739 // GET variables are read from the original URL 740 // (_GET may contain additional variables 741 // introduced by rewrite-rules) 742 $url = $GLOBALS['REQUEST_URI']; 743 // Warning !!!! 744 // since non encoded arguments may be present 745 // (especially those coming from Rewrite Rule) 746 // find the begining of the query string 747 // to compute the script-name 748 if ($v = strpos($url,'?')) 749 $v = strrpos(substr($url, 0, $v), '/'); 750 else $v = strrpos($url, '/'); 751 if (!$root) $url = substr($url, $v + 1); 752 if (!$url) $url = "./"; 753 if (count($_POST)) { 754 $vars = array(); 755 foreach ($_POST as $var => $val) 756 if (preg_match('/^id_/', $var)) 757 $vars[$var] = $val; 758 } 759 } 760 $v = split('[\?\&]', $url); 761 list(, $this->file) = each($v); 762 if (!$vars) { 763 while (list(,$var) = each($v)) { 764 list($name, $value) = split('=', $var, 2); 765 $name = urldecode($name); 766 $value = urldecode($value); 767 if (ereg('^(.*)\[\]$', $name, $regs)) 768 $vars[$regs[1]][] = $value; 769 else 770 $vars[$name] = $value; 771 } 772 } 773 774 if (is_array($vars)) { 775 foreach ($vars as $name => $value) { 776 // items supprimes 777 if (!preg_match('/^('. 778 (!_DIR_RESTREINT ? 779 '|lang|set_options|set_couleur|set_disp|set_ecran': 780 'var_mode|show_docs') 781 . ')$/i', $name)) { 782 if (is_array($value)) 783 $this->arrays[$name] = $value; 784 else 785 $this->vars[$name] = $value; 786 } 787 } 788 } 789 } 790 791 // 792 // Effacer une variable 793 // 794 function delVar($name) { 795 if($this->vars[$name]) unset($this->vars[$name]); 796 if($this->arrays[$name]) unset($this->arrays[$name]); 797 } 798 799 // 800 // Ajouter une variable 801 // (si aucune valeur n'est specifiee, prend la valeur globale actuelle) 802 // 803 function addVar($name, $value = '__global__') { 804 if ($value == '__global__') $value = $GLOBALS[$name]; 805 if (is_array($value)) 806 $this->arrays[$name] = $value; 807 else 808 $this->vars[$name] = $value; 809 } 810 811 // 812 // Recuperer l'URL correspondant au lien 813 // 814 function getUrl($anchor = '') { 815 $url = $this->file; 816 if (!$url) $url = './'; 817 $query = ''; 818 foreach($this->vars as $name => $value) 819 $query .= '&'.$name.'='.urlencode($value); 820 821 foreach ($this->arrays as $name => $table) 822 foreach ($table as $value) 823 $query .= '&'.$name.'[]='.urlencode($value); 824 825 if ($query) $query = '?'. substr($query, 1); 826 if ($anchor) $anchor = '#'.$anchor; 827 return "$url$query$anchor"; 828 } 829 830 // 831 // Recuperer le debut de formulaire correspondant au lien 832 // (tag ouvrant + entrees cachees representant les variables) 833 // 834 835 function getForm($method = 'get', $query = '', $enctype = '') { 836 $form = "<form method='$method' action='".$this->file.$query."'"; 837 if ($enctype) $form .= " enctype='$enctype'"; 838 $form .= " style='border: 0px; margin: 0px;'>\n"; 839 foreach ($this->vars as $name => $value) { 840 $value = ereg_replace('&(#[0-9]+;)', '&\1', htmlspecialchars($value)); 841 $form .= "<input type=\"hidden\" name=\"$name\" value=\"$value\" />\n"; 842 } 843 foreach ($this->arrays as $name => $table) 844 foreach ($table as $value) { 845 $value = ereg_replace('&(#[0-9]+;)', '&\1', htmlspecialchars($value)); 846 $form .= "<input type=\"hidden\" name=\"".$name."[]\" value=\"".$value."\" />\n"; 847 } 848 849 return $form; 850 } 851 } 852 853 854 // Lien vers la page demandee et lien nettoye ne contenant que des id_objet 855 $clean_link = new Link(); 856 857 858 // URLs avec passage & -> & 859 function quote_amp ($url) { 860 $url = str_replace("&", "&", $url); 861 $url = str_replace("&", "&", $url); 862 return $url; 863 } 864 865 866 // 867 // Module de lecture/ecriture/suppression de fichiers utilisant flock() 868 // 869 include_ecrire ('inc_flock.php3'); 870 871 872 // 873 // Gerer les valeurs meta 874 // 875 function lire_meta($nom) { 876 global $meta; 877 return $meta[$nom]; 878 } 879 function lire_meta_maj($nom) { 880 global $meta_maj; 881 return $meta_maj[$nom]; 882 } 883 884 // Lire les meta cachees 885 if (!defined('_DATA_META_CACHE') AND !defined('_ECRIRE_INC_META')) { 886 unset($meta); # parano 887 888 if (file_exists(_DIR_SESSIONS . 'meta_cache.php3')) 889 include(_DIR_SESSIONS . 'meta_cache.php3'); 890 // en cas d'echec refaire le fichier 891 if (!is_array($meta) AND _FILE_CONNECT) { 892 893 include_ecrire ('inc_meta.php3'); 894 ecrire_metas(); 895 } 896 } 897 898 // Verifier la conformite d'une ou plusieurs adresses email 899 // retourne false ou la normalisation de la derniere adresse donnee 900 function email_valide($adresses) { 901 foreach (explode(',', $adresses) as $v) { 902 // nettoyer certains formats 903 // "Marie Toto <Marie@toto.com>" 904 $adresse = trim(eregi_replace("^[^<>\"]*<([^<>\"]+)>$", "\\1", $v)); 905 // RFC 822 906 if (!eregi('^[^()<>@,;:\\"/[:space:]]+(@([-_0-9a-z]+\.)*[-_0-9a-z]+)$', $adresse)) 907 return false; 908 } 909 return $adresse; 910 } 911 912 // 913 // Traduction des textes de SPIP 914 // 915 function _T($texte, $args = '') { 916 include_ecrire ('inc_lang.php3'); 917 $text = traduire_chaine($texte, $args); 918 if (!empty($GLOBALS['xhtml'])) { 919 include_ecrire ("inc_charsets.php3"); 920 $text = html2unicode($text); 921 } 922 923 return $text ? $text : 924 // pour les chaines non traduites 925 (($n = strpos($texte,':')) === false ? $texte : 926 substr($texte, $n+1)); 927 } 928 929 // chaines en cours de traduction 930 function _L($text) { 931 if ($GLOBALS['test_i18n']) 932 return "<span style='color:red;'>$text</span>"; 933 else 934 return $text; 935 } 936 937 // Langue principale du site 938 $langue_site = lire_meta('langue_site'); 939 if (!$langue_site) include_ecrire ('inc_lang.php3'); 940 $spip_lang = $langue_site; 941 942 943 // Nommage bizarre des tables d'objets 944 function table_objet($type) { 945 if ($type == 'site' OR $type == 'syndic') 946 return 'syndic'; 947 else if ($type == 'forum') 948 return 'forum'; 949 else 950 return $type.'s'; 951 } 952 function id_table_objet($type) { 953 if ($type == 'site' OR $type == 'syndic') 954 return 'id_syndic'; 955 else if ($type == 'forum') 956 return 'id_forum'; 957 else 958 return 'id_'.$type; 959 } 960 961 962 // 963 // spip_timer : on l'appelle deux fois et on a la difference, affichable 964 // 965 function spip_timer($t='rien') { 966 static $time; 967 $a=time(); $b=microtime(); 968 969 if (isset($time[$t])) { 970 $p = $a + $b - $time[$t]; 971 unset($time[$t]); 972 return sprintf("%.2fs", $p); 973 } else 974 $time[$t] = $a + $b; 975 } 976 977 978 // spip_touch : verifie si un fichier existe et n'est pas vieux (duree en s) 979 // et le cas echeant le touch() ; renvoie true si la condition est verifiee 980 // et fait touch() sauf si ca n'est pas souhaite 981 // (regle aussi le probleme des droits sur les fichiers touch()) 982 function spip_touch($fichier, $duree=0, $touch=true) { 983 if (!($exists = @file_exists($fichier)) 984 || ($duree == 0) 985 || (@filemtime($fichier) < time() - $duree)) { 986 if ($touch) { 987 if (!@touch($fichier)) { @unlink($fichier); @touch($fichier); }; 988 if (!$exists) @chmod($fichier, 0666); 989 } 990 return true; 991 } 992 return false; 993 } 994 995 // 996 // cron() : execution des taches de fond 997 // quand il est appele par spip_background.php3, il est gourmand ; 998 // quand il est appele par inc-public il n'est pas gourmand 999 // 1000 function cron($gourmand = false) { 1001 $touch = _DIR_SESSIONS.'.background'; 1002 $touch_gourmand = $touch.'-gourmand'; 1003 1004 // Si on est gourmand, ou si le fichier gourmand n'existe pas 1005 // (ou est trop vieux), on va voir si un cron est necessaire. 1006 // Au passage si on est gourmand on le dit aux autres 1007 if (spip_touch($touch_gourmand, 60, $gourmand) 1008 OR $gourmand) { 1009 1010 // Faut-il travailler ? Pas tous en meme temps svp 1011 // Au passage si on travaille on bloque les autres 1012 if (spip_touch($touch, 1)) { 1013 include_ecrire ('inc_cron.php3'); 1014 spip_cron(); 1015 } 1016 } 1017 } 1018 1019 1020 // 1021 // qq fonctions service pour les 2 niveaux 1022 // 1023 function calculer_hierarchie($id_rubrique, $exclure_feuille = false) { 1024 if (!$id_rubrique = intval($id_rubrique)) 1025 return '0'; 1026 if (!$exclure_feuille) 1027 $hierarchie = ",$id_rubrique"; 1028 1029 do { 1030 $q = spip_query("SELECT id_parent FROM spip_rubriques WHERE id_rubrique=$id_rubrique"); 1031 list($id_rubrique) = spip_fetch_array($q); 1032 $hierarchie = ",$id_rubrique".$hierarchie; 1033 } while ($id_rubrique); 1034 1035 return substr($hierarchie, 1); // Attention ca demarre toujours par '0' 1036 } 1037 1038 1039 // 1040 // Retourne $subdir/ si le sous-repertoire peut etre cree, '' sinon 1041 // 1042 1043 function creer_repertoire($base, $subdir) { 1044 if (@file_exists("$base/.plat")) return ''; 1045 $path = $base.'/'.$subdir; 1046 if (@file_exists($path)) return "$subdir/"; 1047 1048 @mkdir($path, 0777); 1049 @chmod($path, 0777); 1050 $ok = false; 1051 if ($f = @fopen("$path/.test", "w")) { 1052 @fputs($f, '<'.'?php $ok = true; ?'.'>'); 1053 @fclose($f); 1054 include("$path/.test"); 1055 } 1056 if (!$ok) { 1057 $f = @fopen("$base/.plat", "w"); 1058 if ($f) 1059 fclose($f); 1060 else { 1061 redirige_par_entete("spip_test_dirs.php3"); 1062 } 1063 } 1064 return ($ok? "$subdir/" : ''); 1065 } 1066 1067 1068 // 1069 // Entetes 1070 // 1071 1072 // Interdire les attaques par manipulation des headers 1073 function spip_header($h) { 1074 @header(strtr($h, "\n\r", " ")); 1075 } 1076 1077 // envoyer le navigateur sur une nouvelle adresse 1078 function redirige_par_entete($url) { 1079 header("Location: $url"); 1080 spip_log("redirige $url"); 1081 http_status(302); 1082 spip_header("Location: $url"); 1083 exit; 1084 } 1085 1086 function debut_entete($title, $entete='') { 1087 global $flag_preserver; 1088 1089 if (!$charset = lire_meta('charset')) 1090 $charset = 'utf-8'; 1091 if (!$entete) 1092 $entete = array("Content-Type: text/html; charset=$charset", 1093 "Expires: 0", 1094 "Last-Modified: " .gmdate("D, d M Y H:i:s"). " GMT", 1095 "Cache-Control: no-store, no-cache, must-revalidate", 1096 "Pragma: no-cache"); 1097 if (!$flag_preserver) array_map('header', $entete); 1098 // selon http://developer.apple.com/internet/safari/faq.html#anchor5 1099 // il faudrait aussi pour Safari 1100 // header("Cache-Control: post-check=0, pre-check=0", false) 1101 // mais ca ne respecte pas 1102 // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9 1103 return "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n" . 1104 "<html lang='".$GLOBALS['spip_lang']."' dir='".($GLOBALS['spip_lang_rtl'] ? 'rtl' : 'ltr')."'>\n" . 1105 "<head>\n" . 1106 # "<base href='$base' />\n" . 1107 "<title>$title</title>\n"; 1108 } 1109 1110 1111 // Transforme n'importe quel champ en une chaine utilisable 1112 // en PHP ou Javascript en toute securite 1113 // < ? php $x = '[(#TEXTE|texte_script)]'; ? > 1114 function texte_script($texte) { 1115 return str_replace('\'', '\\\'', str_replace('\\', '\\\\', $texte)); 1116 } 1117 1118 // 1119 // find_in_path() : chercher un fichier nomme x selon le chemin rep1:rep2:rep3 1120 // 1121 define_once('_SPIP_PATH', './:squelettes/:dist/:formulaires/'); 1122 function find_in_path ($filename, $path='AUTO') { 1123 // Chemin standard depuis l'espace public 1124 1125 if ($path == 'AUTO') { 1126 $path = _SPIP_PATH; 1127 if ($GLOBALS['dossier_squelettes']) 1128 $path = $GLOBALS['dossier_squelettes'].'/:'.$path; 1129 } 1130 1131 // Depuis l'espace prive, remonter d'un cran 1132 $racine = (_DIR_RESTREINT ? '' : '../'); 1133 1134 // Parcourir le chemin 1135 foreach (split(':', $path) as $dir) { 1136 if (substr($dir, 0,1)<>'/') $dir = "$racine$dir"; 1137 if (substr($dir, -1,1)<>'/') $dir .= "/"; 1138 $f = "$dir$filename"; 1139 # spip_log("find_in_path: essai $f"); 1140 if (@is_readable($f)) { 1141 return $f; 1142 } 1143 } 1144 1145 } 1146 1147 1148 // 1149 // Que faire si Spip n'est pas installe... sauf si justement on l'installe! 1150 // 1151 if (!(_FILE_CONNECT 1152 OR defined('_ECRIRE_INSTALL') 1153 OR defined('_TEST_DIRS') 1154 OR defined('_ECRIRE_AIDE'))) { 1155 // Soit on est dans ecrire/ et on envoie sur l'installation 1156 if (@file_exists("inc_version.php3")) { 1157 header("Location: " . _DIR_RESTREINT . "install.php3"); 1158 exit; 1159 } 1160 // Soit on est dans le site public 1161 else if (defined("_INC_PUBLIC")) { 1162 # on ne peut pas deviner ces repertoires avant l'installation ! 1163 define('_DIR_INCLUDE', _DIR_RESTREINT); 1164 define('_DIR_IMG_PACK', (_DIR_RESTREINT . 'img_pack/')); 1165 define('_DIR_LANG', (_DIR_RESTREINT . 'lang/')); 1166 $db_ok = false; 1167 include_ecrire ("inc_presentation.php3"); 1168 install_debut_html(_T('info_travaux_titre')); 1169 echo "<p>"._T('info_travaux_texte')."</p>"; 1170 install_fin_html(); 1171 exit; 1172 } 1173 // Soit on est appele de l'exterieur (spikini, etc) 1174 } 1175 1176 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Thu Feb 22 22:27:47 2007 | par Balluche grâce à PHPXref 0.7 |