[ Index ]
 

Code source de SPIP 1.8.3

Accédez au Source d'autres logiciels libres | Soutenez Angelica Josefina !

title

Body

[fermer]

/ecrire/ -> inc_version.php3 (source)

   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('&amp;(#[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('&amp;(#[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 & -> &amp;
 859  function quote_amp ($url) {
 860      $url = str_replace("&amp;", "&", $url);
 861      $url = str_replace("&", "&amp;", $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  ?>


Généré le : Thu Feb 22 22:27:47 2007 par Balluche grâce à PHPXref 0.7