[SPIP] ~spip v3.2.0-->v3.2.1
[lhc/web/www.git] / www / ecrire / inc_version.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2017 *
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 * Initialisation de SPIP
15 *
16 * @package SPIP\Core\Chargement
17 **/
18
19 if (defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23 /**
24 * Indique que SPIP est chargé
25 *
26 * Cela permet des tests de sécurités pour les fichiers PHP
27 * de SPIP et des plugins qui peuvent vérifier que SPIP est chargé
28 * et donc que les fichiers ne sont pas appelés en dehors de l'usage de SPIP
29 */
30 define('_ECRIRE_INC_VERSION', "1");
31
32 # masquer les eventuelles erreurs sur les premiers define
33 error_reporting(E_ALL ^ E_NOTICE);
34
35 /** version PHP minimum exigee (cf. inc/utils) */
36 define('_PHP_MIN', '5.4.0');
37
38 if (!defined('_DIR_RESTREINT_ABS')) {
39 /** le nom du repertoire ecrire/ */
40 define('_DIR_RESTREINT_ABS', 'ecrire/');
41 }
42
43 /** Chemin relatif pour aller dans ecrire
44 * vide si on est dans ecrire, 'ecrire/' sinon */
45 define('_DIR_RESTREINT',
46 (!is_dir(_DIR_RESTREINT_ABS) ? "" : _DIR_RESTREINT_ABS));
47
48 /** Chemin relatif pour aller à la racine */
49 define('_DIR_RACINE', _DIR_RESTREINT ? '' : '../');
50
51 /** chemin absolu vers la racine */
52 define('_ROOT_RACINE', dirname(dirname(__FILE__)) . '/');
53 /** chemin absolu vers le repertoire de travail */
54 define('_ROOT_CWD', getcwd() . '/');
55 /** chemin absolu vers ecrire */
56 define('_ROOT_RESTREINT', _ROOT_CWD . _DIR_RESTREINT);
57
58 // Icones
59 if (!defined('_NOM_IMG_PACK')) {
60 /** Nom du dossier images */
61 define('_NOM_IMG_PACK', 'images/');
62 }
63 /** le chemin http (relatif) vers les images standard */
64 define('_DIR_IMG_PACK', (_DIR_RACINE . 'prive/' . _NOM_IMG_PACK));
65
66 /** le chemin php (absolu) vers les images standard (pour hebergement centralise) */
67 define('_ROOT_IMG_PACK', dirname(dirname(__FILE__)) . '/prive/' . _NOM_IMG_PACK);
68
69 if (!defined('_JAVASCRIPT')) {
70 /** Nom du repertoire des bibliotheques JavaScript */
71 define('_JAVASCRIPT', 'javascript/');
72 } // utilisable avec #CHEMIN et find_in_path
73 /** le nom du repertoire des bibliotheques JavaScript du prive */
74 define('_DIR_JAVASCRIPT', (_DIR_RACINE . 'prive/' . _JAVASCRIPT));
75
76 # Le nom des 4 repertoires modifiables par les scripts lances par httpd
77 # Par defaut ces 4 noms seront suffixes par _DIR_RACINE (cf plus bas)
78 # mais on peut les mettre ailleurs et changer completement les noms
79
80 if (!defined('_NOM_TEMPORAIRES_INACCESSIBLES')) {
81 /** Nom du repertoire des fichiers Temporaires Inaccessibles par http:// */
82 define('_NOM_TEMPORAIRES_INACCESSIBLES', "tmp/");
83 }
84 if (!defined('_NOM_TEMPORAIRES_ACCESSIBLES')) {
85 /** Nom du repertoire des fichiers Temporaires Accessibles par http:// */
86 define('_NOM_TEMPORAIRES_ACCESSIBLES', "local/");
87 }
88 if (!defined('_NOM_PERMANENTS_INACCESSIBLES')) {
89 /** Nom du repertoire des fichiers Permanents Inaccessibles par http:// */
90 define('_NOM_PERMANENTS_INACCESSIBLES', "config/");
91 }
92 if (!defined('_NOM_PERMANENTS_ACCESSIBLES')) {
93 /** Nom du repertoire des fichiers Permanents Accessibles par http:// */
94 define('_NOM_PERMANENTS_ACCESSIBLES', "IMG/");
95 }
96
97
98 /** Le nom du fichier de personnalisation */
99 if (!defined('_NOM_CONFIG')) {
100 define('_NOM_CONFIG', 'mes_options');
101 }
102
103 // Son emplacement absolu si on le trouve
104 if (@file_exists($f = _ROOT_RACINE . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php')
105 or (@file_exists($f = _ROOT_RESTREINT . _NOM_CONFIG . '.php'))
106 ) {
107 /** Emplacement absolu du fichier d'option */
108 define('_FILE_OPTIONS', $f);
109 } else {
110 define('_FILE_OPTIONS', '');
111 }
112
113 if (!defined('MODULES_IDIOMES')) {
114 /**
115 * Modules par défaut pour la traduction.
116 *
117 * Constante utilisée par le compilateur et le décompilateur
118 * sa valeur etant traitée par inc_traduire_dist
119 */
120 define('MODULES_IDIOMES', 'public|spip|ecrire');
121 }
122
123 // *** Fin des define *** //
124
125
126 // Inclure l'ecran de securite
127 if (!defined('_ECRAN_SECURITE')
128 and @file_exists($f = _ROOT_RACINE . _NOM_PERMANENTS_INACCESSIBLES . 'ecran_securite.php')
129 ) {
130 include $f;
131 }
132
133
134 /*
135 * Détecteur de robot d'indexation
136 */
137 if (!defined('_IS_BOT')) {
138 define('_IS_BOT',
139 isset($_SERVER['HTTP_USER_AGENT'])
140 and preg_match(
141 // mots generiques
142 ',bot|slurp|crawler|spider|webvac|yandex|'
143 // MSIE 6.0 est un botnet 99,9% du temps, on traite donc ce USER_AGENT comme un bot
144 . 'MSIE 6\.0|'
145 // UA plus cibles
146 . '80legs|accoona|AltaVista|ASPSeek|Baidu|Charlotte|EC2LinkFinder|eStyle|facebook|flipboard|hootsuite|FunWebProducts|Google|Genieo|INA dlweb|InfegyAtlas|Java VM|LiteFinder|Lycos|MetaURI|Moreover|Rambler|Scooter|ScrubbyBloglines|Yahoo|Yeti'
147 . ',i', (string)$_SERVER['HTTP_USER_AGENT'])
148 );
149 }
150
151 //
152 // *** Parametrage par defaut de SPIP ***
153 //
154 // Les globales qui suivent peuvent etre modifiees
155 // dans le fichier de personnalisation indique ci-dessus.
156 // Il suffit de copier les lignes ci-dessous, et ajouter le marquage de debut
157 // et fin de fichier PHP ("< ?php" et "? >", sans les espaces)
158 // Ne pas les rendre indefinies.
159
160 # comment on logge, defaut 4 tmp/spip.log de 100k, 0 ou 0 suppriment le log
161 $nombre_de_logs = 4;
162 $taille_des_logs = 100;
163
164 // Definir les niveaux de log
165 defined('_LOG_HS') || define('_LOG_HS', 0);
166 defined('_LOG_ALERTE_ROUGE') || define('_LOG_ALERTE_ROUGE', 1);
167 defined('_LOG_CRITIQUE') || define('_LOG_CRITIQUE', 2);
168 defined('_LOG_ERREUR') || define('_LOG_ERREUR', 3);
169 defined('_LOG_AVERTISSEMENT') || define('_LOG_AVERTISSEMENT', 4);
170 defined('_LOG_INFO_IMPORTANTE') || define('_LOG_INFO_IMPORTANTE', 5);
171 defined('_LOG_INFO') || define('_LOG_INFO', 6);
172 defined('_LOG_DEBUG') || define('_LOG_DEBUG', 7);
173
174 // on peut definir _LOG_FILTRE_GRAVITE dans mes_options.php
175
176 // Prefixe des tables dans la base de donnees
177 // (a modifier pour avoir plusieurs sites SPIP dans une seule base)
178 $table_prefix = "spip";
179
180 // Prefixe des cookies
181 // (a modifier pour installer des sites SPIP dans des sous-repertoires)
182 $cookie_prefix = "spip";
183
184 // Dossier des squelettes
185 // (a modifier si l'on veut passer rapidement d'un jeu de squelettes a un autre)
186 $dossier_squelettes = "";
187
188 // Pour le javascript, trois modes : parano (-1), prive (0), ok (1)
189 // parano le refuse partout, ok l'accepte partout
190 // le mode par defaut le signale en rouge dans l'espace prive
191 // Si < 1, les fichiers SVG sont traites s'ils emanent d'un redacteur
192 $filtrer_javascript = 0;
193 // PS: dans les forums, petitions, flux syndiques... c'est *toujours* securise
194
195 // Type d'URLs
196 // inc/utils.php sélectionne le type 'page' (spip.php?article123) en l'absence
197 // d'autre configuration stockée en $GLOBALS['meta']['type_urls]
198 // Pour les autres types: voir urls_etendues
199 // $type_urls n'a plus de valeur par défaut en 3.1 mais permet de forcer une
200 // configuration d'urls dans les fichiers d'options.
201
202 #la premiere date dans le menu deroulant de date de publication
203 # null: automatiquement (affiche les 8 dernieres annees)
204 # 0: affiche un input libre
205 # 1997: le menu commence a 1997 jusqu'a annee en cours
206 $debut_date_publication = null;
207
208
209 //
210 // Prendre en compte les entetes HTTP_X_FORWARDED_XX
211 //
212 if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) and $_SERVER['HTTP_X_FORWARDED_PROTO']==='https'){
213 if (empty($_SERVER['HTTP_X_FORWARDED_HOST'])) {
214 $_SERVER['HTTP_X_FORWARDED_HOST'] = $_SERVER['HTTP_HOST'];
215 }
216 if (empty($_SERVER['HTTP_X_FORWARDED_PORT'])) {
217 $_SERVER['HTTP_X_FORWARDED_PORT'] = 443;
218 }
219 }
220 if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])){
221 if (isset($_SERVER['HTTP_X_FORWARDED_PORT']) and is_numeric($_SERVER['HTTP_X_FORWARDED_PORT'])){
222 $_SERVER['SERVER_PORT'] = $_SERVER['HTTP_X_FORWARDED_PORT'];
223 if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) and $_SERVER['HTTP_X_FORWARDED_PROTO']==='https'){
224 $_SERVER['HTTPS'] = 'on';
225 if (isset($_SERVER['REQUEST_SCHEME'])) {
226 $_SERVER['REQUEST_SCHEME'] = 'https';
227 }
228 }
229 }
230 $host = $_SERVER['HTTP_X_FORWARDED_HOST'];
231 if (strpos($host,',')!==false){
232 $h = explode(',',$host);
233 $host = trim(reset($h));
234 }
235 // securite sur le contenu de l'entete
236 $host = strtr($host, "<>?\"\{\}\$'` \r\n", '____________');
237 $_SERVER['HTTP_HOST'] = $host;
238 }
239 //
240 // On note le numero IP du client dans la variable $ip
241 //
242 if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
243 $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
244 if (strpos($ip,',')!==false){
245 $ip = explode(',',$ip);
246 $ip = reset($ip);
247 }
248 // ecraser $_SERVER['REMOTE_ADDR'] si elle est en localhost
249 if (isset($_SERVER['REMOTE_ADDR']) AND $_SERVER['REMOTE_ADDR']==='127.0.0.1'){
250 $_SERVER['REMOTE_ADDR'] = $ip;
251 }
252 }
253 if (isset($_SERVER['REMOTE_ADDR'])) {
254 $ip = $_SERVER['REMOTE_ADDR'];
255 }
256
257 // Pour renforcer la privacy, decommentez la ligne ci-dessous (ou recopiez-la
258 // dans le fichier config/mes_options) : SPIP ne pourra alors conserver aucun
259 // numero IP, ni temporairement lors des visites (pour gerer les statistiques
260 // ou dans spip.log), ni dans les forums (responsabilite)
261 # $ip = substr(md5($ip),0,16);
262
263
264 // faut-il faire des connexions Mysql rappelant le nom de la base MySQL ?
265 // (utile si vos squelettes appellent d'autres bases MySQL)
266 // (A desactiver en cas de soucis de connexion chez certains hebergeurs)
267 // Note: un test a l'installation peut aussi avoir desactive
268 // $mysql_rappel_nom_base directement dans le fichier inc_connect
269 $mysql_rappel_nom_base = true;
270
271 // faut-il afficher en rouge les chaines non traduites ?
272 $test_i18n = false;
273
274 // faut-il ignorer l'authentification par auth http/remote_user ?
275 $ignore_auth_http = false;
276 $ignore_remote_user = true; # methode obsolete et risquee
277
278 // Invalider les caches a chaque modification du contenu ?
279 // Si votre site a des problemes de performance face a une charge tres elevee,
280 // vous pouvez mettre cette globale a false (dans mes_options).
281 $derniere_modif_invalide = true;
282
283 // Quota : la variable $quota_cache, si elle est > 0, indique la taille
284 // totale maximale desiree des fichiers contenus dans le cache ; ce quota n'est
285 // pas "dur" : si le site necessite un espace plus important, il le prend
286 $quota_cache = 10;
287
288 //
289 // Serveurs externes
290 //
291 # Serveur de documentation officielle
292 $home_server = 'https://www.spip.net';
293 # glossaire pour raccourci [?X]. Aussi: [?X#G] et definir glossaire_G
294 $url_glossaire_externe = "https://@lang@.wikipedia.org/wiki/%s";
295
296 # TeX
297 $tex_server = 'http://math.spip.org/tex.php';
298 # MathML (pas pour l'instant: manque un bon convertisseur)
299 // $mathml_server = 'http://arno.rezo.net/tex2mathml/latex.php';
300
301 // Produire du TeX ou du MathML ?
302 $traiter_math = 'tex';
303
304 // Appliquer un indenteur XHTML aux espaces public et/ou prive ?
305 $xhtml = false;
306 $xml_indent = false;
307
308 $formats_logos = array('gif', 'jpg', 'png');
309
310 // Controler les dates des item dans les flux RSS ?
311 $controler_dates_rss = true;
312
313
314 //
315 // Pipelines & plugins
316 //
317 # les pipeline standards (traitements derivables aka points d'entree)
318 # ils seront compiles par la suite
319 # note: un pipeline non reference se compile aussi, mais uniquement
320 # lorsqu'il est rencontre
321 // http://programmer.spip.net/-Les-pipelines-
322 $spip_pipeline = array();
323
324 # la matrice standard (fichiers definissant les fonctions a inclure)
325 $spip_matrice = array();
326 # les plugins a activer
327 $plugins = array(); // voir le contenu du repertoire /plugins/
328 # les surcharges de include_spip()
329 $surcharges = array(); // format 'inc_truc' => '/plugins/chose/inc_truc2.php'
330
331 // Variables du compilateur de squelettes
332
333 $exceptions_des_tables = array();
334 $tables_principales = array();
335 $table_des_tables = array();
336 $tables_auxiliaires = array();
337 $table_primary = array();
338 $table_date = array();
339 $table_titre = array();
340 $tables_jointures = array();
341
342 // Liste des statuts.
343 $liste_des_statuts = array(
344 "info_administrateurs" => '0minirezo',
345 "info_redacteurs" => '1comite',
346 "info_visiteurs" => '6forum',
347 "texte_statut_poubelle" => '5poubelle'
348 );
349
350 $liste_des_etats = array(
351 'texte_statut_en_cours_redaction' => 'prepa',
352 'texte_statut_propose_evaluation' => 'prop',
353 'texte_statut_publie' => 'publie',
354 'texte_statut_poubelle' => 'poubelle',
355 'texte_statut_refuse' => 'refuse'
356 );
357
358 // liste des methodes d'authentifications
359 $liste_des_authentifications = array(
360 'spip' => 'spip',
361 'ldap' => 'ldap'
362 );
363
364 // Experimental : pour supprimer systematiquement l'affichage des numeros
365 // de classement des titres, recopier la ligne suivante dans mes_options :
366 # $table_des_traitements['TITRE'][]= 'typo(supprimer_numero(%s), "TYPO", $connect)';
367
368 // Droits d'acces maximum par defaut
369 @umask(0);
370
371 // numero de branche, utilise par les plugins
372 // pour specifier les versions de SPIP necessaires
373 // il faut s'en tenir a un nombre de decimales fixe
374 // ex : 2.0.0, 2.0.0-dev, 2.0.0-beta, 2.0.0-beta2
375 $spip_version_branche = "3.2.1";
376 // cette version dev accepte tous les plugins compatible avec la version ci-dessous
377 // a supprimer en phase beta/rc/release
378 #define('_DEV_VERSION_SPIP_COMPAT',"3.1.3");
379 // version des signatures de fonctions PHP
380 // (= numero SVN de leur derniere modif cassant la compatibilite et/ou necessitant un recalcul des squelettes)
381 $spip_version_code = 22653;
382 // version de la base SQL (= numero SVN de sa derniere modif)
383 $spip_version_base = 23375;
384
385 // version de l'interface a la base
386 $spip_sql_version = 1;
387
388 // version de spip en chaine
389 // 1.xxyy : xx00 versions stables publiees, xxyy versions de dev
390 // (ce qui marche pour yy ne marchera pas forcement sur une version plus ancienne)
391 $spip_version_affichee = "$spip_version_branche";
392
393 // ** Securite **
394 $visiteur_session = $auteur_session = $connect_statut = $connect_toutes_rubriques = $hash_recherche = $hash_recherche_strict = $ldap_present = '';
395 $meta = $connect_id_rubrique = array();
396
397 // *** Fin des globales *** //
398
399 //
400 // Charger les fonctions liees aux serveurs Http et Sql.
401 //
402 require_once _ROOT_RESTREINT . 'inc/utils.php';
403 require_once _ROOT_RESTREINT . 'base/connect_sql.php';
404
405 // Definition personnelles eventuelles
406
407 if (_FILE_OPTIONS) {
408 include_once _FILE_OPTIONS;
409 }
410
411 if (!defined('E_DEPRECATED')) {
412 /** Compatibilite PHP 5.3 */
413 define('E_DEPRECATED', 8192);
414 }
415 if (!defined('SPIP_ERREUR_REPORT')) {
416 /** Masquer les warning */
417 define('SPIP_ERREUR_REPORT', E_ALL ^ E_NOTICE ^ E_DEPRECATED);
418 }
419 error_reporting(SPIP_ERREUR_REPORT);
420
421 // Initialisations critiques non surchargeables par les plugins
422 // INITIALISER LES REPERTOIRES NON PARTAGEABLES ET LES CONSTANTES
423 // (charge aussi inc/flock)
424 //
425 // mais l'inclusion precedente a peut-etre deja appele cette fonction
426 // ou a defini certaines des constantes que cette fonction doit definir
427 // ===> on execute en neutralisant les messages d'erreur
428
429 spip_initialisation_core(
430 (_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES),
431 (_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES),
432 (_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES),
433 (_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
434 );
435
436
437 // chargement des plugins : doit arriver en dernier
438 // car dans les plugins on peut inclure inc-version
439 // qui ne sera pas execute car _ECRIRE_INC_VERSION est defini
440 // donc il faut avoir tout fini ici avant de charger les plugins
441
442 if (@is_readable(_CACHE_PLUGINS_OPT) and @is_readable(_CACHE_PLUGINS_PATH)) {
443 // chargement optimise precompile
444 include_once(_CACHE_PLUGINS_OPT);
445 } else {
446 spip_initialisation_suite();
447 include_spip('inc/plugin');
448 // generer les fichiers php precompiles
449 // de chargement des plugins et des pipelines
450 actualise_plugins_actifs();
451 }
452
453 // Initialisations non critiques surchargeables par les plugins
454 spip_initialisation_suite();
455
456 if (!defined('_LOG_FILTRE_GRAVITE')) {
457 /** niveau maxi d'enregistrement des logs */
458 define('_LOG_FILTRE_GRAVITE', _LOG_INFO_IMPORTANTE);
459 }
460
461 if (!defined('_OUTILS_DEVELOPPEURS')) {
462 /** Activer des outils pour développeurs ? */
463 define('_OUTILS_DEVELOPPEURS', false);
464 }
465
466 // charger systematiquement inc/autoriser dans l'espace restreint
467 if (test_espace_prive()) {
468 include_spip('inc/autoriser');
469 }
470 //
471 // Installer Spip si pas installe... sauf si justement on est en train
472 //
473 if (!(_FILE_CONNECT
474 or autoriser_sans_cookie(_request('exec'))
475 or _request('action') == 'cookie'
476 or _request('action') == 'converser'
477 or _request('action') == 'test_dirs')
478 ) {
479
480 // Si on peut installer, on lance illico
481 if (test_espace_prive()) {
482 include_spip('inc/headers');
483 redirige_url_ecrire("install");
484 } else {
485 // Si on est dans le site public, dire que qq s'en occupe
486 include_spip('inc/minipres');
487 utiliser_langue_visiteur();
488 echo minipres(_T('info_travaux_titre'), "<p style='text-align: center;'>" . _T('info_travaux_texte') . "</p>");
489 exit;
490 }
491 // autrement c'est une install ad hoc (spikini...), on sait pas faire
492 }
493
494 // memoriser un tri sessionne eventuel
495 if (isset($_REQUEST['var_memotri'])
496 and $t = $_REQUEST['var_memotri']
497 and (strncmp($t, 'trisession', 10) == 0 or strncmp($t, 'senssession', 11) == 0)
498 ) {
499 if (!function_exists('session_set')) {
500 include_spip('inc/session');
501 }
502 session_set($t, _request($t));
503 }
504
505 /**
506 * Header "Composed-By"
507 *
508 * Vanter notre art de la composition typographique
509 * La globale $spip_header_silencieux permet de rendre le header minimal pour raisons de securite
510 */
511 if (!defined('_HEADER_COMPOSED_BY')) {
512 define('_HEADER_COMPOSED_BY', "Composed-By: SPIP");
513 }
514 if (!headers_sent()) {
515 header("Vary: Cookie, Accept-Encoding");
516 if (!isset($GLOBALS['spip_header_silencieux']) or !$GLOBALS['spip_header_silencieux']) {
517 include_spip('inc/filtres_mini');
518 header(_HEADER_COMPOSED_BY . " $spip_version_affichee @ www.spip.net + " . url_absolue(_DIR_VAR . "config.txt"));
519 } else {
520 // header minimal
521 header(_HEADER_COMPOSED_BY . " @ www.spip.net");
522 }
523 }
524
525 $methode = (isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : ((php_sapi_name() == 'cli') ? 'cli' : ''));
526 spip_log($methode . ' ' . self() . ' - ' . _FILE_CONNECT, _LOG_DEBUG);