Completed
Push — master ( 51d948...b949bb )
by cam
01:03
created
ecrire/inc/utils.php 1 patch
Indentation   +2242 added lines, -2243 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 
@@ -48,71 +48,71 @@  discard block
 block discarded – undo
48 48
  *     Nom de la fonction, ou false.
49 49
  */
50 50
 function charger_fonction($nom, $dossier = 'exec', $continue = false) {
51
-	static $echecs = [];
52
-
53
-	if (strlen($dossier) and substr($dossier, -1) != '/') {
54
-		$dossier .= '/';
55
-	}
56
-	$f = str_replace('/', '_', $dossier) . $nom;
57
-
58
-	if (function_exists($f)) {
59
-		return $f;
60
-	}
61
-	if (function_exists($g = $f . '_dist')) {
62
-		return $g;
63
-	}
64
-
65
-	if (isset($echecs[$f])) {
66
-		return $echecs[$f];
67
-	}
68
-	// Sinon charger le fichier de declaration si plausible
69
-
70
-	if (!preg_match(',^\w+$,', $f)) {
71
-		if ($continue) {
72
-			return false;
73
-		} //appel interne, on passe
74
-		include_spip('inc/minipres');
75
-		echo minipres();
76
-		exit;
77
-	}
78
-
79
-	// passer en minuscules (cf les balises de formulaires)
80
-	// et inclure le fichier
81
-	if (
82
-		!$inc = include_spip($dossier . ($d = strtolower($nom)))
83
-		// si le fichier truc/machin/nom.php n'existe pas,
84
-		// la fonction peut etre definie dans truc/machin.php qui regroupe plusieurs petites fonctions
85
-		and strlen(dirname($dossier)) and dirname($dossier) != '.'
86
-	) {
87
-		include_spip(substr($dossier, 0, -1));
88
-	}
89
-	if (function_exists($f)) {
90
-		return $f;
91
-	}
92
-	if (function_exists($g)) {
93
-		return $g;
94
-	}
95
-
96
-	if ($continue) {
97
-		return $echecs[$f] = false;
98
-	}
99
-
100
-	// Echec : message d'erreur
101
-	spip_log("fonction $nom ($f ou $g) indisponible" .
102
-		($inc ? '' : " (fichier $d absent de $dossier)"));
103
-
104
-	include_spip('inc/minipres');
105
-	echo minipres(
106
-		_T('forum_titre_erreur'),
107
-		$inc ?
108
-			_T('fonction_introuvable', ['fonction' => '<code>' . spip_htmlentities($f) . '</code>'])
109
-			. '<br />'
110
-			. _T('fonction_introuvable', ['fonction' => '<code>' . spip_htmlentities($g) . '</code>'])
111
-			:
112
-			_T('fichier_introuvable', ['fichier' => '<code>' . spip_htmlentities($d) . '</code>']),
113
-		['all_inline' => true,'status' => 404]
114
-	);
115
-	exit;
51
+    static $echecs = [];
52
+
53
+    if (strlen($dossier) and substr($dossier, -1) != '/') {
54
+        $dossier .= '/';
55
+    }
56
+    $f = str_replace('/', '_', $dossier) . $nom;
57
+
58
+    if (function_exists($f)) {
59
+        return $f;
60
+    }
61
+    if (function_exists($g = $f . '_dist')) {
62
+        return $g;
63
+    }
64
+
65
+    if (isset($echecs[$f])) {
66
+        return $echecs[$f];
67
+    }
68
+    // Sinon charger le fichier de declaration si plausible
69
+
70
+    if (!preg_match(',^\w+$,', $f)) {
71
+        if ($continue) {
72
+            return false;
73
+        } //appel interne, on passe
74
+        include_spip('inc/minipres');
75
+        echo minipres();
76
+        exit;
77
+    }
78
+
79
+    // passer en minuscules (cf les balises de formulaires)
80
+    // et inclure le fichier
81
+    if (
82
+        !$inc = include_spip($dossier . ($d = strtolower($nom)))
83
+        // si le fichier truc/machin/nom.php n'existe pas,
84
+        // la fonction peut etre definie dans truc/machin.php qui regroupe plusieurs petites fonctions
85
+        and strlen(dirname($dossier)) and dirname($dossier) != '.'
86
+    ) {
87
+        include_spip(substr($dossier, 0, -1));
88
+    }
89
+    if (function_exists($f)) {
90
+        return $f;
91
+    }
92
+    if (function_exists($g)) {
93
+        return $g;
94
+    }
95
+
96
+    if ($continue) {
97
+        return $echecs[$f] = false;
98
+    }
99
+
100
+    // Echec : message d'erreur
101
+    spip_log("fonction $nom ($f ou $g) indisponible" .
102
+        ($inc ? '' : " (fichier $d absent de $dossier)"));
103
+
104
+    include_spip('inc/minipres');
105
+    echo minipres(
106
+        _T('forum_titre_erreur'),
107
+        $inc ?
108
+            _T('fonction_introuvable', ['fonction' => '<code>' . spip_htmlentities($f) . '</code>'])
109
+            . '<br />'
110
+            . _T('fonction_introuvable', ['fonction' => '<code>' . spip_htmlentities($g) . '</code>'])
111
+            :
112
+            _T('fichier_introuvable', ['fichier' => '<code>' . spip_htmlentities($d) . '</code>']),
113
+        ['all_inline' => true,'status' => 404]
114
+    );
115
+    exit;
116 116
 }
117 117
 
118 118
 /**
@@ -122,17 +122,17 @@  discard block
 block discarded – undo
122 122
  * @return bool
123 123
  */
124 124
 function include_once_check($file) {
125
-	if (file_exists($file)) {
126
-		include_once $file;
125
+    if (file_exists($file)) {
126
+        include_once $file;
127 127
 
128
-		return true;
129
-	}
130
-	$crash = (isset($GLOBALS['meta']['message_crash_plugins']) ? unserialize($GLOBALS['meta']['message_crash_plugins']) : '');
131
-	$crash = ($crash ?: []);
132
-	$crash[$file] = true;
133
-	ecrire_meta('message_crash_plugins', serialize($crash));
128
+        return true;
129
+    }
130
+    $crash = (isset($GLOBALS['meta']['message_crash_plugins']) ? unserialize($GLOBALS['meta']['message_crash_plugins']) : '');
131
+    $crash = ($crash ?: []);
132
+    $crash[$file] = true;
133
+    ecrire_meta('message_crash_plugins', serialize($crash));
134 134
 
135
-	return false;
135
+    return false;
136 136
 }
137 137
 
138 138
 
@@ -156,7 +156,7 @@  discard block
 block discarded – undo
156 156
  *     - string : chemin du fichier trouvé
157 157
  **/
158 158
 function include_spip($f, $include = true) {
159
-	return find_in_path($f . '.php', '', $include);
159
+    return find_in_path($f . '.php', '', $include);
160 160
 }
161 161
 
162 162
 /**
@@ -176,7 +176,7 @@  discard block
 block discarded – undo
176 176
  *     - string : chemin du fichier trouvé
177 177
  **/
178 178
 function require_spip($f) {
179
-	return find_in_path($f . '.php', '', 'required');
179
+    return find_in_path($f . '.php', '', 'required');
180 180
 }
181 181
 
182 182
 
@@ -185,27 +185,27 @@  discard block
 block discarded – undo
185 185
  * quand on a besoin dans le PHP de filtres/fonctions qui y sont definis
186 186
  */
187 187
 function include_fichiers_fonctions() {
188
-	static $done = false;
189
-	if (!$done) {
190
-		include_spip('inc/lang');
191
-
192
-		// NB: mes_fonctions peut initialiser $dossier_squelettes (old-style)
193
-		// donc il faut l'inclure "en globals"
194
-		if ($f = find_in_path('mes_fonctions.php')) {
195
-			global $dossier_squelettes;
196
-			include_once(_ROOT_CWD . $f);
197
-		}
198
-
199
-		if (@is_readable(_CACHE_PLUGINS_FCT)) {
200
-			// chargement optimise precompile
201
-			include_once(_CACHE_PLUGINS_FCT);
202
-		}
203
-		if (test_espace_prive()) {
204
-			include_spip('inc/filtres_ecrire');
205
-		}
206
-		include_spip('public/fonctions'); // charger les fichiers fonctions associes aux criteres, balises..
207
-		$done = true;
208
-	}
188
+    static $done = false;
189
+    if (!$done) {
190
+        include_spip('inc/lang');
191
+
192
+        // NB: mes_fonctions peut initialiser $dossier_squelettes (old-style)
193
+        // donc il faut l'inclure "en globals"
194
+        if ($f = find_in_path('mes_fonctions.php')) {
195
+            global $dossier_squelettes;
196
+            include_once(_ROOT_CWD . $f);
197
+        }
198
+
199
+        if (@is_readable(_CACHE_PLUGINS_FCT)) {
200
+            // chargement optimise precompile
201
+            include_once(_CACHE_PLUGINS_FCT);
202
+        }
203
+        if (test_espace_prive()) {
204
+            include_spip('inc/filtres_ecrire');
205
+        }
206
+        include_spip('public/fonctions'); // charger les fichiers fonctions associes aux criteres, balises..
207
+        $done = true;
208
+    }
209 209
 }
210 210
 
211 211
 /**
@@ -231,23 +231,23 @@  discard block
 block discarded – undo
231 231
  *     Les paramètres du pipeline modifiés
232 232
  **/
233 233
 function minipipe($fonc, &$val) {
234
-	// fonction
235
-	if (function_exists($fonc)) {
236
-		$val = $fonc($val);
237
-	} // Class::Methode
238
-	else {
239
-		if (
240
-			preg_match('/^(\w*)::(\w*)$/S', $fonc, $regs)
241
-			and $methode = [$regs[1], $regs[2]]
242
-			and is_callable($methode)
243
-		) {
244
-			$val = $methode($val);
245
-		} else {
246
-			spip_log("Erreur - '$fonc' non definie !");
247
-		}
248
-	}
249
-
250
-	return $val;
234
+    // fonction
235
+    if (function_exists($fonc)) {
236
+        $val = $fonc($val);
237
+    } // Class::Methode
238
+    else {
239
+        if (
240
+            preg_match('/^(\w*)::(\w*)$/S', $fonc, $regs)
241
+            and $methode = [$regs[1], $regs[2]]
242
+            and is_callable($methode)
243
+        ) {
244
+            $val = $methode($val);
245
+        } else {
246
+            spip_log("Erreur - '$fonc' non definie !");
247
+        }
248
+    }
249
+
250
+    return $val;
251 251
 }
252 252
 
253 253
 /**
@@ -278,46 +278,46 @@  discard block
 block discarded – undo
278 278
  *     Résultat
279 279
  */
280 280
 function pipeline($action, $val = null) {
281
-	static $charger;
282
-
283
-	// chargement initial des fonctions mises en cache, ou generation du cache
284
-	if (!$charger) {
285
-		if (!($ok = @is_readable($charger = _CACHE_PIPELINES))) {
286
-			include_spip('inc/plugin');
287
-			// generer les fichiers php precompiles
288
-			// de chargement des plugins et des pipelines
289
-			actualise_plugins_actifs();
290
-			if (!($ok = @is_readable($charger))) {
291
-				spip_log("fichier $charger pas cree");
292
-			}
293
-		}
294
-
295
-		if ($ok) {
296
-			include_once $charger;
297
-		}
298
-	}
299
-
300
-	// appliquer notre fonction si elle existe
301
-	$fonc = 'execute_pipeline_' . strtolower($action);
302
-	if (function_exists($fonc)) {
303
-		$val = $fonc($val);
304
-	} // plantage ?
305
-	else {
306
-		spip_log("fonction $fonc absente : pipeline desactive", _LOG_ERREUR);
307
-	}
308
-
309
-	// si le flux est une table avec 2 cle args&data
310
-	// on ne ressort du pipe que les donnees dans 'data'
311
-	// array_key_exists pour php 4.1.0
312
-	if (
313
-		is_array($val)
314
-		and count($val) == 2
315
-		and (array_key_exists('data', $val))
316
-	) {
317
-		$val = $val['data'];
318
-	}
319
-
320
-	return $val;
281
+    static $charger;
282
+
283
+    // chargement initial des fonctions mises en cache, ou generation du cache
284
+    if (!$charger) {
285
+        if (!($ok = @is_readable($charger = _CACHE_PIPELINES))) {
286
+            include_spip('inc/plugin');
287
+            // generer les fichiers php precompiles
288
+            // de chargement des plugins et des pipelines
289
+            actualise_plugins_actifs();
290
+            if (!($ok = @is_readable($charger))) {
291
+                spip_log("fichier $charger pas cree");
292
+            }
293
+        }
294
+
295
+        if ($ok) {
296
+            include_once $charger;
297
+        }
298
+    }
299
+
300
+    // appliquer notre fonction si elle existe
301
+    $fonc = 'execute_pipeline_' . strtolower($action);
302
+    if (function_exists($fonc)) {
303
+        $val = $fonc($val);
304
+    } // plantage ?
305
+    else {
306
+        spip_log("fonction $fonc absente : pipeline desactive", _LOG_ERREUR);
307
+    }
308
+
309
+    // si le flux est une table avec 2 cle args&data
310
+    // on ne ressort du pipe que les donnees dans 'data'
311
+    // array_key_exists pour php 4.1.0
312
+    if (
313
+        is_array($val)
314
+        and count($val) == 2
315
+        and (array_key_exists('data', $val))
316
+    ) {
317
+        $val = $val['data'];
318
+    }
319
+
320
+    return $val;
321 321
 }
322 322
 
323 323
 /**
@@ -361,38 +361,38 @@  discard block
 block discarded – undo
361 361
  *     paramètre est planté pour cause de compatibilité ascendante.
362 362
  */
363 363
 function spip_log($message = null, $name = null) {
364
-	static $pre = [];
365
-	static $log;
366
-	preg_match('/^([a-z_]*)\.?(\d)?$/iS', (string)$name, $regs);
367
-	if (!isset($regs[1]) or !$logname = $regs[1]) {
368
-		$logname = null;
369
-	}
370
-	if (!isset($regs[2])) {
371
-		$niveau = _LOG_INFO;
372
-	}
373
-	else {
374
-		$niveau = intval($regs[2]);
375
-	}
376
-
377
-	if ($niveau <= (defined('_LOG_FILTRE_GRAVITE') ? _LOG_FILTRE_GRAVITE : _LOG_INFO_IMPORTANTE)) {
378
-		if (!$pre) {
379
-			$pre = [
380
-				_LOG_HS => 'HS:',
381
-				_LOG_ALERTE_ROUGE => 'ALERTE:',
382
-				_LOG_CRITIQUE => 'CRITIQUE:',
383
-				_LOG_ERREUR => 'ERREUR:',
384
-				_LOG_AVERTISSEMENT => 'WARNING:',
385
-				_LOG_INFO_IMPORTANTE => '!INFO:',
386
-				_LOG_INFO => 'info:',
387
-				_LOG_DEBUG => 'debug:'
388
-			];
389
-			$log = charger_fonction('log', 'inc');
390
-		}
391
-		if (!is_string($message)) {
392
-			$message = print_r($message, true);
393
-		}
394
-		$log($pre[$niveau] . ' ' . $message, $logname);
395
-	}
364
+    static $pre = [];
365
+    static $log;
366
+    preg_match('/^([a-z_]*)\.?(\d)?$/iS', (string)$name, $regs);
367
+    if (!isset($regs[1]) or !$logname = $regs[1]) {
368
+        $logname = null;
369
+    }
370
+    if (!isset($regs[2])) {
371
+        $niveau = _LOG_INFO;
372
+    }
373
+    else {
374
+        $niveau = intval($regs[2]);
375
+    }
376
+
377
+    if ($niveau <= (defined('_LOG_FILTRE_GRAVITE') ? _LOG_FILTRE_GRAVITE : _LOG_INFO_IMPORTANTE)) {
378
+        if (!$pre) {
379
+            $pre = [
380
+                _LOG_HS => 'HS:',
381
+                _LOG_ALERTE_ROUGE => 'ALERTE:',
382
+                _LOG_CRITIQUE => 'CRITIQUE:',
383
+                _LOG_ERREUR => 'ERREUR:',
384
+                _LOG_AVERTISSEMENT => 'WARNING:',
385
+                _LOG_INFO_IMPORTANTE => '!INFO:',
386
+                _LOG_INFO => 'info:',
387
+                _LOG_DEBUG => 'debug:'
388
+            ];
389
+            $log = charger_fonction('log', 'inc');
390
+        }
391
+        if (!is_string($message)) {
392
+            $message = print_r($message, true);
393
+        }
394
+        $log($pre[$niveau] . ' ' . $message, $logname);
395
+    }
396 396
 }
397 397
 
398 398
 /**
@@ -403,8 +403,8 @@  discard block
 block discarded – undo
403 403
  * @param array $opt Tableau d'options
404 404
  **/
405 405
 function journal($phrase, $opt = []) {
406
-	$journal = charger_fonction('journal', 'inc');
407
-	$journal($phrase, $opt);
406
+    $journal = charger_fonction('journal', 'inc');
407
+    $journal($phrase, $opt);
408 408
 }
409 409
 
410 410
 
@@ -423,37 +423,37 @@  discard block
 block discarded – undo
423 423
  **/
424 424
 function _request($var, $c = false) {
425 425
 
426
-	if (is_array($c)) {
427
-		return $c[$var] ?? null;
428
-	}
429
-
430
-	if (isset($_GET[$var])) {
431
-		$a = $_GET[$var];
432
-	} elseif (isset($_POST[$var])) {
433
-		$a = $_POST[$var];
434
-	} else {
435
-		return null;
436
-	}
437
-
438
-	// Si on est en ajax et en POST tout a ete encode
439
-	// via encodeURIComponent, il faut donc repasser
440
-	// dans le charset local...
441
-	if (
442
-		defined('_AJAX')
443
-		and _AJAX
444
-		and isset($GLOBALS['meta']['charset'])
445
-		and $GLOBALS['meta']['charset'] != 'utf-8'
446
-		and is_string($a)
447
-		// check rapide mais pas fiable
448
-		and preg_match(',[\x80-\xFF],', $a)
449
-		// check fiable
450
-		and include_spip('inc/charsets')
451
-		and is_utf8($a)
452
-	) {
453
-		return importer_charset($a, 'utf-8');
454
-	}
455
-
456
-	return $a;
426
+    if (is_array($c)) {
427
+        return $c[$var] ?? null;
428
+    }
429
+
430
+    if (isset($_GET[$var])) {
431
+        $a = $_GET[$var];
432
+    } elseif (isset($_POST[$var])) {
433
+        $a = $_POST[$var];
434
+    } else {
435
+        return null;
436
+    }
437
+
438
+    // Si on est en ajax et en POST tout a ete encode
439
+    // via encodeURIComponent, il faut donc repasser
440
+    // dans le charset local...
441
+    if (
442
+        defined('_AJAX')
443
+        and _AJAX
444
+        and isset($GLOBALS['meta']['charset'])
445
+        and $GLOBALS['meta']['charset'] != 'utf-8'
446
+        and is_string($a)
447
+        // check rapide mais pas fiable
448
+        and preg_match(',[\x80-\xFF],', $a)
449
+        // check fiable
450
+        and include_spip('inc/charsets')
451
+        and is_utf8($a)
452
+    ) {
453
+        return importer_charset($a, 'utf-8');
454
+    }
455
+
456
+    return $a;
457 457
 }
458 458
 
459 459
 
@@ -471,22 +471,22 @@  discard block
 block discarded – undo
471 471
  *     - false sinon
472 472
  **/
473 473
 function set_request($var, $val = null, $c = false) {
474
-	if (is_array($c)) {
475
-		unset($c[$var]);
476
-		if ($val !== null) {
477
-			$c[$var] = $val;
478
-		}
474
+    if (is_array($c)) {
475
+        unset($c[$var]);
476
+        if ($val !== null) {
477
+            $c[$var] = $val;
478
+        }
479 479
 
480
-		return $c;
481
-	}
480
+        return $c;
481
+    }
482 482
 
483
-	unset($_GET[$var]);
484
-	unset($_POST[$var]);
485
-	if ($val !== null) {
486
-		$_GET[$var] = $val;
487
-	}
483
+    unset($_GET[$var]);
484
+    unset($_POST[$var]);
485
+    if ($val !== null) {
486
+        $_GET[$var] = $val;
487
+    }
488 488
 
489
-	return false; # n'affecte pas $c
489
+    return false; # n'affecte pas $c
490 490
 }
491 491
 
492 492
 /**
@@ -506,25 +506,25 @@  discard block
 block discarded – undo
506 506
  * @return array|mixed|string
507 507
  */
508 508
 function spip_sanitize_from_request($value, $key, $sanitize_function = 'entites_html') {
509
-	if (is_array($value)) {
510
-		if ($key == '*') {
511
-			$key = array_keys($value);
512
-		}
513
-		if (!is_array($key)) {
514
-			$key = [$key];
515
-		}
516
-		foreach ($key as $k) {
517
-			if (!empty($value[$k])) {
518
-				$value[$k] = spip_sanitize_from_request($value[$k], $k, $sanitize_function);
519
-			}
520
-		}
521
-		return $value;
522
-	}
523
-	// si la valeur vient des GET ou POST on la sanitize
524
-	if (!empty($value) and $value == _request($key)) {
525
-		$value = $sanitize_function($value);
526
-	}
527
-	return $value;
509
+    if (is_array($value)) {
510
+        if ($key == '*') {
511
+            $key = array_keys($value);
512
+        }
513
+        if (!is_array($key)) {
514
+            $key = [$key];
515
+        }
516
+        foreach ($key as $k) {
517
+            if (!empty($value[$k])) {
518
+                $value[$k] = spip_sanitize_from_request($value[$k], $k, $sanitize_function);
519
+            }
520
+        }
521
+        return $value;
522
+    }
523
+    // si la valeur vient des GET ou POST on la sanitize
524
+    if (!empty($value) and $value == _request($key)) {
525
+        $value = $sanitize_function($value);
526
+    }
527
+    return $value;
528 528
 }
529 529
 
530 530
 /**
@@ -532,23 +532,22 @@  discard block
 block discarded – undo
532 532
  *
533 533
  * On est sur le web, on exclut certains protocoles,
534 534
  * notamment 'file://', 'php://' et d'autres…
535
-
536 535
  * @param string $url
537 536
  * @return bool
538 537
  */
539 538
 function tester_url_absolue($url) {
540
-	$url = trim($url ?? '');
541
-	if ($url && preg_match(';^([a-z]{3,7}:)?//;Uims', $url, $m)) {
542
-		if (
543
-			isset($m[1])
544
-			and $p = strtolower(rtrim($m[1], ':'))
545
-			and in_array($p, ['file', 'php', 'zlib', 'glob', 'phar', 'ssh2', 'rar', 'ogg', 'expect', 'zip'])
546
-		) {
547
-			return false;
548
-		}
549
-		return true;
550
-	}
551
-	return false;
539
+    $url = trim($url ?? '');
540
+    if ($url && preg_match(';^([a-z]{3,7}:)?//;Uims', $url, $m)) {
541
+        if (
542
+            isset($m[1])
543
+            and $p = strtolower(rtrim($m[1], ':'))
544
+            and in_array($p, ['file', 'php', 'zlib', 'glob', 'phar', 'ssh2', 'rar', 'ogg', 'expect', 'zip'])
545
+        ) {
546
+            return false;
547
+        }
548
+        return true;
549
+    }
550
+    return false;
552 551
 }
553 552
 
554 553
 /**
@@ -570,95 +569,95 @@  discard block
 block discarded – undo
570 569
  * @return string URL
571 570
  */
572 571
 function parametre_url($url, $c, $v = null, $sep = '&amp;') {
573
-	// requete erronnee : plusieurs variable dans $c et aucun $v
574
-	if (strpos($c, '|') !== false and is_null($v)) {
575
-		return null;
576
-	}
577
-
578
-	// lever l'#ancre
579
-	if (preg_match(',^([^#]*)(#.*)$,', $url, $r)) {
580
-		$url = $r[1];
581
-		$ancre = $r[2];
582
-	} else {
583
-		$ancre = '';
584
-	}
585
-
586
-	// eclater
587
-	$url = preg_split(',[?]|&amp;|&,', $url);
588
-
589
-	// recuperer la base
590
-	$a = array_shift($url);
591
-	if (!$a) {
592
-		$a = './';
593
-	}
594
-
595
-	$regexp = ',^(' . str_replace('[]', '\[\]', $c) . '[[]?[]]?)(=.*)?$,';
596
-	$ajouts = array_flip(explode('|', $c));
597
-	$u = is_array($v) ? $v : rawurlencode((string) $v);
598
-	$testv = (is_array($v) ? count($v) : strlen((string) $v));
599
-	$v_read = null;
600
-	// lire les variables et agir
601
-	foreach ($url as $n => $val) {
602
-		if (preg_match($regexp, urldecode($val), $r)) {
603
-			$r = array_pad($r, 3, null);
604
-			if ($v === null) {
605
-				// c'est un tableau, on memorise les valeurs
606
-				if (substr($r[1], -2) == '[]') {
607
-					if (!$v_read) {
608
-						$v_read = [];
609
-					}
610
-					$v_read[] = $r[2] ? substr($r[2], 1) : '';
611
-				} // c'est un scalaire, on retourne direct
612
-				else {
613
-					return $r[2] ? substr($r[2], 1) : '';
614
-				}
615
-			} // suppression
616
-			elseif (!$testv) {
617
-				unset($url[$n]);
618
-			}
619
-			// Ajout. Pour une variable, remplacer au meme endroit,
620
-			// pour un tableau ce sera fait dans la prochaine boucle
621
-			elseif (substr($r[1], -2) != '[]') {
622
-				$url[$n] = $r[1] . '=' . $u;
623
-				unset($ajouts[$r[1]]);
624
-			}
625
-			// Pour les tableaux on laisse tomber les valeurs de
626
-			// départ, on remplira à l'étape suivante
627
-			else {
628
-				unset($url[$n]);
629
-			}
630
-		}
631
-	}
632
-
633
-	// traiter les parametres pas encore trouves
634
-	if (
635
-		$v === null
636
-		and $args = func_get_args()
637
-		and count($args) == 2
638
-	) {
639
-		return $v_read; // rien trouve ou un tableau
640
-	} elseif ($testv) {
641
-		foreach ($ajouts as $k => $n) {
642
-			if (!is_array($v)) {
643
-				$url[] = $k . '=' . $u;
644
-			} else {
645
-				$id = (substr($k, -2) == '[]') ? $k : ($k . '[]');
646
-				foreach ($v as $w) {
647
-					$url[] = $id . '=' . (is_array($w) ? 'Array' : rawurlencode($w));
648
-				}
649
-			}
650
-		}
651
-	}
652
-
653
-	// eliminer les vides
654
-	$url = array_filter($url);
655
-
656
-	// recomposer l'adresse
657
-	if ($url) {
658
-		$a .= '?' . join($sep, $url);
659
-	}
660
-
661
-	return $a . $ancre;
572
+    // requete erronnee : plusieurs variable dans $c et aucun $v
573
+    if (strpos($c, '|') !== false and is_null($v)) {
574
+        return null;
575
+    }
576
+
577
+    // lever l'#ancre
578
+    if (preg_match(',^([^#]*)(#.*)$,', $url, $r)) {
579
+        $url = $r[1];
580
+        $ancre = $r[2];
581
+    } else {
582
+        $ancre = '';
583
+    }
584
+
585
+    // eclater
586
+    $url = preg_split(',[?]|&amp;|&,', $url);
587
+
588
+    // recuperer la base
589
+    $a = array_shift($url);
590
+    if (!$a) {
591
+        $a = './';
592
+    }
593
+
594
+    $regexp = ',^(' . str_replace('[]', '\[\]', $c) . '[[]?[]]?)(=.*)?$,';
595
+    $ajouts = array_flip(explode('|', $c));
596
+    $u = is_array($v) ? $v : rawurlencode((string) $v);
597
+    $testv = (is_array($v) ? count($v) : strlen((string) $v));
598
+    $v_read = null;
599
+    // lire les variables et agir
600
+    foreach ($url as $n => $val) {
601
+        if (preg_match($regexp, urldecode($val), $r)) {
602
+            $r = array_pad($r, 3, null);
603
+            if ($v === null) {
604
+                // c'est un tableau, on memorise les valeurs
605
+                if (substr($r[1], -2) == '[]') {
606
+                    if (!$v_read) {
607
+                        $v_read = [];
608
+                    }
609
+                    $v_read[] = $r[2] ? substr($r[2], 1) : '';
610
+                } // c'est un scalaire, on retourne direct
611
+                else {
612
+                    return $r[2] ? substr($r[2], 1) : '';
613
+                }
614
+            } // suppression
615
+            elseif (!$testv) {
616
+                unset($url[$n]);
617
+            }
618
+            // Ajout. Pour une variable, remplacer au meme endroit,
619
+            // pour un tableau ce sera fait dans la prochaine boucle
620
+            elseif (substr($r[1], -2) != '[]') {
621
+                $url[$n] = $r[1] . '=' . $u;
622
+                unset($ajouts[$r[1]]);
623
+            }
624
+            // Pour les tableaux on laisse tomber les valeurs de
625
+            // départ, on remplira à l'étape suivante
626
+            else {
627
+                unset($url[$n]);
628
+            }
629
+        }
630
+    }
631
+
632
+    // traiter les parametres pas encore trouves
633
+    if (
634
+        $v === null
635
+        and $args = func_get_args()
636
+        and count($args) == 2
637
+    ) {
638
+        return $v_read; // rien trouve ou un tableau
639
+    } elseif ($testv) {
640
+        foreach ($ajouts as $k => $n) {
641
+            if (!is_array($v)) {
642
+                $url[] = $k . '=' . $u;
643
+            } else {
644
+                $id = (substr($k, -2) == '[]') ? $k : ($k . '[]');
645
+                foreach ($v as $w) {
646
+                    $url[] = $id . '=' . (is_array($w) ? 'Array' : rawurlencode($w));
647
+                }
648
+            }
649
+        }
650
+    }
651
+
652
+    // eliminer les vides
653
+    $url = array_filter($url);
654
+
655
+    // recomposer l'adresse
656
+    if ($url) {
657
+        $a .= '?' . join($sep, $url);
658
+    }
659
+
660
+    return $a . $ancre;
662 661
 }
663 662
 
664 663
 /**
@@ -676,21 +675,21 @@  discard block
 block discarded – undo
676 675
  * @return string
677 676
  */
678 677
 function ancre_url($url, $ancre) {
679
-	// lever l'#ancre
680
-	if (preg_match(',^([^#]*)(#.*)$,', $url, $r)) {
681
-		$url = $r[1];
682
-	}
683
-	if (preg_match('/[^-_a-zA-Z0-9]+/S', $ancre)) {
684
-		if (!function_exists('translitteration')) {
685
-			include_spip('inc/charsets');
686
-		}
687
-		$ancre = preg_replace(
688
-			['/^[^-_a-zA-Z0-9]+/', '/[^-_a-zA-Z0-9]/'],
689
-			['', '-'],
690
-			translitteration($ancre)
691
-		);
692
-	}
693
-	return $url . (strlen($ancre) ? '#' . $ancre : '');
678
+    // lever l'#ancre
679
+    if (preg_match(',^([^#]*)(#.*)$,', $url, $r)) {
680
+        $url = $r[1];
681
+    }
682
+    if (preg_match('/[^-_a-zA-Z0-9]+/S', $ancre)) {
683
+        if (!function_exists('translitteration')) {
684
+            include_spip('inc/charsets');
685
+        }
686
+        $ancre = preg_replace(
687
+            ['/^[^-_a-zA-Z0-9]+/', '/[^-_a-zA-Z0-9]/'],
688
+            ['', '-'],
689
+            translitteration($ancre)
690
+        );
691
+    }
692
+    return $url . (strlen($ancre) ? '#' . $ancre : '');
694 693
 }
695 694
 
696 695
 /**
@@ -700,16 +699,16 @@  discard block
 block discarded – undo
700 699
  * @return string
701 700
  */
702 701
 function nettoyer_uri($reset = null) {
703
-	static $done = false;
704
-	static $propre = '';
705
-	if (!is_null($reset)) {
706
-		return $propre = $reset;
707
-	}
708
-	if ($done) {
709
-		return $propre;
710
-	}
711
-	$done = true;
712
-	return $propre = nettoyer_uri_var($GLOBALS['REQUEST_URI']);
702
+    static $done = false;
703
+    static $propre = '';
704
+    if (!is_null($reset)) {
705
+        return $propre = $reset;
706
+    }
707
+    if ($done) {
708
+        return $propre;
709
+    }
710
+    $done = true;
711
+    return $propre = nettoyer_uri_var($GLOBALS['REQUEST_URI']);
713 712
 }
714 713
 
715 714
 /**
@@ -721,16 +720,16 @@  discard block
 block discarded – undo
721 720
  * @return string
722 721
  */
723 722
 function nettoyer_uri_var($request_uri) {
724
-	$uri1 = $request_uri;
725
-	do {
726
-		$uri = $uri1;
727
-		$uri1 = preg_replace(
728
-			',([?&])(var_[^=&]*|PHPSESSID|fbclid|utm_[^=&]*)=[^&]*(&|$),i',
729
-			'\1',
730
-			$uri
731
-		);
732
-	} while ($uri <> $uri1);
733
-	return preg_replace(',[?&]$,', '', $uri1);
723
+    $uri1 = $request_uri;
724
+    do {
725
+        $uri = $uri1;
726
+        $uri1 = preg_replace(
727
+            ',([?&])(var_[^=&]*|PHPSESSID|fbclid|utm_[^=&]*)=[^&]*(&|$),i',
728
+            '\1',
729
+            $uri
730
+        );
731
+    } while ($uri <> $uri1);
732
+    return preg_replace(',[?&]$,', '', $uri1);
734 733
 }
735 734
 
736 735
 
@@ -744,48 +743,48 @@  discard block
 block discarded – undo
744 743
  *    URL vers soi-même
745 744
  **/
746 745
 function self($amp = '&amp;', $root = false) {
747
-	$url = nettoyer_uri();
748
-	if (
749
-		!$root
750
-		and (
751
-			// si pas de profondeur on peut tronquer
752
-			$GLOBALS['profondeur_url'] < (_DIR_RESTREINT ? 1 : 2)
753
-			// sinon c'est OK si _SET_HTML_BASE a ete force a false
754
-			or (defined('_SET_HTML_BASE') and !_SET_HTML_BASE))
755
-	) {
756
-		$url = preg_replace(',^[^?]*/,', '', $url);
757
-	}
758
-	// ajouter le cas echeant les variables _POST['id_...']
759
-	foreach ($_POST as $v => $c) {
760
-		if (substr($v, 0, 3) == 'id_') {
761
-			$url = parametre_url($url, $v, $c, '&');
762
-		}
763
-	}
764
-
765
-	// supprimer les variables sans interet
766
-	if (test_espace_prive()) {
767
-		$url = preg_replace(',([?&])('
768
-			. 'lang|show_docs|'
769
-			. 'changer_lang|var_lang|action)=[^&]*,i', '\1', $url);
770
-		$url = preg_replace(',([?&])[&]+,', '\1', $url);
771
-		$url = preg_replace(',[&]$,', '\1', $url);
772
-	}
773
-
774
-	// eviter les hacks
775
-	include_spip('inc/filtres_mini');
776
-	$url = spip_htmlspecialchars($url);
777
-
778
-	$url = str_replace(["'", '"', '<', '[', ']', ':'], ['%27', '%22', '%3C', '%5B', '%5D', '%3A'], $url);
779
-
780
-	// &amp; ?
781
-	if ($amp != '&amp;') {
782
-		$url = str_replace('&amp;', $amp, $url);
783
-	}
784
-
785
-	// Si ca demarre par ? ou vide, donner './'
786
-	$url = preg_replace(',^([?].*)?$,', './\1', $url);
787
-
788
-	return $url;
746
+    $url = nettoyer_uri();
747
+    if (
748
+        !$root
749
+        and (
750
+            // si pas de profondeur on peut tronquer
751
+            $GLOBALS['profondeur_url'] < (_DIR_RESTREINT ? 1 : 2)
752
+            // sinon c'est OK si _SET_HTML_BASE a ete force a false
753
+            or (defined('_SET_HTML_BASE') and !_SET_HTML_BASE))
754
+    ) {
755
+        $url = preg_replace(',^[^?]*/,', '', $url);
756
+    }
757
+    // ajouter le cas echeant les variables _POST['id_...']
758
+    foreach ($_POST as $v => $c) {
759
+        if (substr($v, 0, 3) == 'id_') {
760
+            $url = parametre_url($url, $v, $c, '&');
761
+        }
762
+    }
763
+
764
+    // supprimer les variables sans interet
765
+    if (test_espace_prive()) {
766
+        $url = preg_replace(',([?&])('
767
+            . 'lang|show_docs|'
768
+            . 'changer_lang|var_lang|action)=[^&]*,i', '\1', $url);
769
+        $url = preg_replace(',([?&])[&]+,', '\1', $url);
770
+        $url = preg_replace(',[&]$,', '\1', $url);
771
+    }
772
+
773
+    // eviter les hacks
774
+    include_spip('inc/filtres_mini');
775
+    $url = spip_htmlspecialchars($url);
776
+
777
+    $url = str_replace(["'", '"', '<', '[', ']', ':'], ['%27', '%22', '%3C', '%5B', '%5D', '%3A'], $url);
778
+
779
+    // &amp; ?
780
+    if ($amp != '&amp;') {
781
+        $url = str_replace('&amp;', $amp, $url);
782
+    }
783
+
784
+    // Si ca demarre par ? ou vide, donner './'
785
+    $url = preg_replace(',^([?].*)?$,', './\1', $url);
786
+
787
+    return $url;
789 788
 }
790 789
 
791 790
 
@@ -796,7 +795,7 @@  discard block
 block discarded – undo
796 795
  *     true si c'est le cas, false sinon.
797 796
  */
798 797
 function test_espace_prive() {
799
-	return defined('_ESPACE_PRIVE') ? _ESPACE_PRIVE : false;
798
+    return defined('_ESPACE_PRIVE') ? _ESPACE_PRIVE : false;
800 799
 }
801 800
 
802 801
 /**
@@ -806,7 +805,7 @@  discard block
 block discarded – undo
806 805
  * @return bool
807 806
  */
808 807
 function test_plugin_actif($plugin) {
809
-	return ($plugin and defined('_DIR_PLUGIN_' . strtoupper($plugin))) ? true : false;
808
+    return ($plugin and defined('_DIR_PLUGIN_' . strtoupper($plugin))) ? true : false;
810 809
 }
811 810
 
812 811
 /**
@@ -837,52 +836,52 @@  discard block
 block discarded – undo
837 836
  *     Texte
838 837
  */
839 838
 function _T($texte, $args = [], $options = []) {
840
-	static $traduire = false;
841
-	$o = ['class' => '', 'force' => true, 'sanitize' => true];
842
-	if ($options) {
843
-		// support de l'ancien argument $class
844
-		if (is_string($options)) {
845
-			$options = ['class' => $options];
846
-		}
847
-		$o = array_merge($o, $options);
848
-	}
849
-
850
-	if (!$traduire) {
851
-		$traduire = charger_fonction('traduire', 'inc');
852
-		include_spip('inc/lang');
853
-	}
854
-
855
-	// On peut passer explicitement la langue dans le tableau
856
-	// On utilise le même nom de variable que la globale
857
-	if (isset($args['spip_lang'])) {
858
-		$lang = $args['spip_lang'];
859
-		// On l'enleve pour ne pas le passer au remplacement
860
-		unset($args['spip_lang']);
861
-	} // Sinon on prend la langue du contexte
862
-	else {
863
-		$lang = $GLOBALS['spip_lang'];
864
-	}
865
-	$text = $traduire($texte, $lang);
866
-
867
-	if ($text === null || !strlen($text)) {
868
-		if (!$o['force']) {
869
-			return '';
870
-		}
871
-
872
-		$text = $texte;
873
-
874
-		// pour les chaines non traduites, assurer un service minimum
875
-		if (!$GLOBALS['test_i18n'] and (_request('var_mode') != 'traduction')) {
876
-			$n = strpos($text, ':');
877
-			if ($n !== false) {
878
-				$text = substr($text, $n + 1);
879
-			}
880
-			$text = str_replace('_', ' ', $text);
881
-		}
882
-		$o['class'] = null;
883
-	}
884
-
885
-	return _L($text, $args, $o);
839
+    static $traduire = false;
840
+    $o = ['class' => '', 'force' => true, 'sanitize' => true];
841
+    if ($options) {
842
+        // support de l'ancien argument $class
843
+        if (is_string($options)) {
844
+            $options = ['class' => $options];
845
+        }
846
+        $o = array_merge($o, $options);
847
+    }
848
+
849
+    if (!$traduire) {
850
+        $traduire = charger_fonction('traduire', 'inc');
851
+        include_spip('inc/lang');
852
+    }
853
+
854
+    // On peut passer explicitement la langue dans le tableau
855
+    // On utilise le même nom de variable que la globale
856
+    if (isset($args['spip_lang'])) {
857
+        $lang = $args['spip_lang'];
858
+        // On l'enleve pour ne pas le passer au remplacement
859
+        unset($args['spip_lang']);
860
+    } // Sinon on prend la langue du contexte
861
+    else {
862
+        $lang = $GLOBALS['spip_lang'];
863
+    }
864
+    $text = $traduire($texte, $lang);
865
+
866
+    if ($text === null || !strlen($text)) {
867
+        if (!$o['force']) {
868
+            return '';
869
+        }
870
+
871
+        $text = $texte;
872
+
873
+        // pour les chaines non traduites, assurer un service minimum
874
+        if (!$GLOBALS['test_i18n'] and (_request('var_mode') != 'traduction')) {
875
+            $n = strpos($text, ':');
876
+            if ($n !== false) {
877
+                $text = substr($text, $n + 1);
878
+            }
879
+            $text = str_replace('_', ' ', $text);
880
+        }
881
+        $o['class'] = null;
882
+    }
883
+
884
+    return _L($text, $args, $o);
886 885
 }
887 886
 
888 887
 
@@ -909,53 +908,53 @@  discard block
 block discarded – undo
909 908
  *     Texte
910 909
  */
911 910
 function _L($text, $args = [], $options = []) {
912
-	$f = $text;
913
-	$defaut_options = [
914
-		'class' => null,
915
-		'sanitize' => true,
916
-	];
917
-	// support de l'ancien argument $class
918
-	if ($options and is_string($options)) {
919
-		$options = ['class' => $options];
920
-	}
921
-	if (is_array($options)) {
922
-		$options += $defaut_options;
923
-	} else {
924
-		$options = $defaut_options;
925
-	}
926
-
927
-	if (is_array($args) and count($args)) {
928
-		if (!function_exists('interdire_scripts')) {
929
-			include_spip('inc/texte');
930
-		}
931
-		if (!function_exists('echapper_html_suspect')) {
932
-			include_spip('inc/texte_mini');
933
-		}
934
-		foreach ($args as $name => $value) {
935
-			if (strpos($text, (string) "@$name@") !== false) {
936
-				if ($options['sanitize']) {
937
-					$value = echapper_html_suspect($value);
938
-					$value = interdire_scripts($value, -1);
939
-				}
940
-				if (!empty($options['class'])) {
941
-					$value = "<span class='" . $options['class'] . "'>$value</span>";
942
-				}
943
-				$text = str_replace("@$name@", $value, $text);
944
-				unset($args[$name]);
945
-			}
946
-		}
947
-		// Si des variables n'ont pas ete inserees, le signaler
948
-		// (chaines de langues pas a jour)
949
-		if ($args) {
950
-			spip_log("$f:  variables inutilisees " . join(', ', array_keys($args)), _LOG_DEBUG);
951
-		}
952
-	}
953
-
954
-	if (($GLOBALS['test_i18n'] or (_request('var_mode') == 'traduction')) and is_null($options['class'])) {
955
-		return "<span class='debug-traduction-erreur'>$text</span>";
956
-	} else {
957
-		return $text;
958
-	}
911
+    $f = $text;
912
+    $defaut_options = [
913
+        'class' => null,
914
+        'sanitize' => true,
915
+    ];
916
+    // support de l'ancien argument $class
917
+    if ($options and is_string($options)) {
918
+        $options = ['class' => $options];
919
+    }
920
+    if (is_array($options)) {
921
+        $options += $defaut_options;
922
+    } else {
923
+        $options = $defaut_options;
924
+    }
925
+
926
+    if (is_array($args) and count($args)) {
927
+        if (!function_exists('interdire_scripts')) {
928
+            include_spip('inc/texte');
929
+        }
930
+        if (!function_exists('echapper_html_suspect')) {
931
+            include_spip('inc/texte_mini');
932
+        }
933
+        foreach ($args as $name => $value) {
934
+            if (strpos($text, (string) "@$name@") !== false) {
935
+                if ($options['sanitize']) {
936
+                    $value = echapper_html_suspect($value);
937
+                    $value = interdire_scripts($value, -1);
938
+                }
939
+                if (!empty($options['class'])) {
940
+                    $value = "<span class='" . $options['class'] . "'>$value</span>";
941
+                }
942
+                $text = str_replace("@$name@", $value, $text);
943
+                unset($args[$name]);
944
+            }
945
+        }
946
+        // Si des variables n'ont pas ete inserees, le signaler
947
+        // (chaines de langues pas a jour)
948
+        if ($args) {
949
+            spip_log("$f:  variables inutilisees " . join(', ', array_keys($args)), _LOG_DEBUG);
950
+        }
951
+    }
952
+
953
+    if (($GLOBALS['test_i18n'] or (_request('var_mode') == 'traduction')) and is_null($options['class'])) {
954
+        return "<span class='debug-traduction-erreur'>$text</span>";
955
+    } else {
956
+        return $text;
957
+    }
959 958
 }
960 959
 
961 960
 
@@ -969,13 +968,13 @@  discard block
 block discarded – undo
969 968
  * @return string
970 969
  */
971 970
 function joli_repertoire($rep) {
972
-	$a = substr($rep, 0, 1);
973
-	if ($a <> '.' and $a <> '/') {
974
-		$rep = (_DIR_RESTREINT ? '' : _DIR_RESTREINT_ABS) . $rep;
975
-	}
976
-	$rep = preg_replace(',(^\.\.\/),', '', $rep);
971
+    $a = substr($rep, 0, 1);
972
+    if ($a <> '.' and $a <> '/') {
973
+        $rep = (_DIR_RESTREINT ? '' : _DIR_RESTREINT_ABS) . $rep;
974
+    }
975
+    $rep = preg_replace(',(^\.\.\/),', '', $rep);
977 976
 
978
-	return $rep;
977
+    return $rep;
979 978
 }
980 979
 
981 980
 
@@ -1000,54 +999,54 @@  discard block
 block discarded – undo
1000 999
  * @return float|int|string|void
1001 1000
  */
1002 1001
 function spip_timer($t = 'rien', $raw = false) {
1003
-	static $time;
1004
-	$a = time();
1005
-	$b = microtime();
1006
-	// microtime peut contenir les microsecondes et le temps
1007
-	$b = explode(' ', $b);
1008
-	if (count($b) == 2) {
1009
-		$a = end($b);
1010
-	} // plus precis !
1011
-	$b = reset($b);
1012
-	if (!isset($time[$t])) {
1013
-		$time[$t] = $a + $b;
1014
-	} else {
1015
-		$p = ($a + $b - $time[$t]) * 1000;
1016
-		unset($time[$t]);
1002
+    static $time;
1003
+    $a = time();
1004
+    $b = microtime();
1005
+    // microtime peut contenir les microsecondes et le temps
1006
+    $b = explode(' ', $b);
1007
+    if (count($b) == 2) {
1008
+        $a = end($b);
1009
+    } // plus precis !
1010
+    $b = reset($b);
1011
+    if (!isset($time[$t])) {
1012
+        $time[$t] = $a + $b;
1013
+    } else {
1014
+        $p = ($a + $b - $time[$t]) * 1000;
1015
+        unset($time[$t]);
1017 1016
 #			echo "'$p'";exit;
1018
-		if ($raw) {
1019
-			return $p;
1020
-		}
1021
-		if ($p < 1000) {
1022
-			$s = '';
1023
-		} else {
1024
-			$s = sprintf('%d ', $x = floor($p / 1000));
1025
-			$p -= ($x * 1000);
1026
-		}
1017
+        if ($raw) {
1018
+            return $p;
1019
+        }
1020
+        if ($p < 1000) {
1021
+            $s = '';
1022
+        } else {
1023
+            $s = sprintf('%d ', $x = floor($p / 1000));
1024
+            $p -= ($x * 1000);
1025
+        }
1027 1026
 
1028
-		return $s . sprintf($s ? '%07.3f ms' : '%.3f ms', $p);
1029
-	}
1027
+        return $s . sprintf($s ? '%07.3f ms' : '%.3f ms', $p);
1028
+    }
1030 1029
 }
1031 1030
 
1032 1031
 
1033 1032
 // Renvoie False si un fichier n'est pas plus vieux que $duree secondes,
1034 1033
 // sinon renvoie True et le date sauf si ca n'est pas souhaite
1035 1034
 function spip_touch($fichier, $duree = 0, $touch = true) {
1036
-	if ($duree) {
1037
-		clearstatcache();
1038
-		if ((@$f = filemtime($fichier)) and ($f >= time() - $duree)) {
1039
-			return false;
1040
-		}
1041
-	}
1042
-	if ($touch !== false) {
1043
-		if (!@touch($fichier)) {
1044
-			spip_unlink($fichier);
1045
-			@touch($fichier);
1046
-		};
1047
-		@chmod($fichier, _SPIP_CHMOD & ~0111);
1048
-	}
1035
+    if ($duree) {
1036
+        clearstatcache();
1037
+        if ((@$f = filemtime($fichier)) and ($f >= time() - $duree)) {
1038
+            return false;
1039
+        }
1040
+    }
1041
+    if ($touch !== false) {
1042
+        if (!@touch($fichier)) {
1043
+            spip_unlink($fichier);
1044
+            @touch($fichier);
1045
+        };
1046
+        @chmod($fichier, _SPIP_CHMOD & ~0111);
1047
+    }
1049 1048
 
1050
-	return true;
1049
+    return true;
1051 1050
 }
1052 1051
 
1053 1052
 
@@ -1058,11 +1057,11 @@  discard block
 block discarded – undo
1058 1057
  * @uses cron()
1059 1058
  **/
1060 1059
 function action_cron() {
1061
-	include_spip('inc/headers');
1062
-	http_response_code(204); // No Content
1063
-	header('Connection: close');
1064
-	define('_DIRECT_CRON_FORCE', true);
1065
-	cron();
1060
+    include_spip('inc/headers');
1061
+    http_response_code(204); // No Content
1062
+    header('Connection: close');
1063
+    define('_DIRECT_CRON_FORCE', true);
1064
+    cron();
1066 1065
 }
1067 1066
 
1068 1067
 /**
@@ -1078,26 +1077,26 @@  discard block
 block discarded – undo
1078 1077
  *     True si la tache a pu être effectuée
1079 1078
  */
1080 1079
 function cron($taches = [], $taches_old = []) {
1081
-	// si pas en mode cron force, laisser tomber.
1082
-	if (!defined('_DIRECT_CRON_FORCE')) {
1083
-		return false;
1084
-	}
1085
-	if (!is_array($taches)) {
1086
-		$taches = $taches_old;
1087
-	} // compat anciens appels
1088
-	// si taches a inserer en base et base inaccessible, laisser tomber
1089
-	// sinon on ne verifie pas la connexion tout de suite, car si ca se trouve
1090
-	// queue_sleep_time_to_next_job() dira qu'il n'y a rien a faire
1091
-	// et on evite d'ouvrir une connexion pour rien (utilisation de _DIRECT_CRON_FORCE dans mes_options.php)
1092
-	if ($taches and count($taches) and !spip_connect()) {
1093
-		return false;
1094
-	}
1095
-	spip_log('cron !', 'jq' . _LOG_DEBUG);
1096
-	if ($genie = charger_fonction('genie', 'inc', true)) {
1097
-		return $genie($taches);
1098
-	}
1099
-
1100
-	return false;
1080
+    // si pas en mode cron force, laisser tomber.
1081
+    if (!defined('_DIRECT_CRON_FORCE')) {
1082
+        return false;
1083
+    }
1084
+    if (!is_array($taches)) {
1085
+        $taches = $taches_old;
1086
+    } // compat anciens appels
1087
+    // si taches a inserer en base et base inaccessible, laisser tomber
1088
+    // sinon on ne verifie pas la connexion tout de suite, car si ca se trouve
1089
+    // queue_sleep_time_to_next_job() dira qu'il n'y a rien a faire
1090
+    // et on evite d'ouvrir une connexion pour rien (utilisation de _DIRECT_CRON_FORCE dans mes_options.php)
1091
+    if ($taches and count($taches) and !spip_connect()) {
1092
+        return false;
1093
+    }
1094
+    spip_log('cron !', 'jq' . _LOG_DEBUG);
1095
+    if ($genie = charger_fonction('genie', 'inc', true)) {
1096
+        return $genie($taches);
1097
+    }
1098
+
1099
+    return false;
1101 1100
 }
1102 1101
 
1103 1102
 /**
@@ -1129,17 +1128,17 @@  discard block
 block discarded – undo
1129 1128
  *     Le numéro de travail ajouté ou `0` si aucun travail n’a été ajouté.
1130 1129
  */
1131 1130
 function job_queue_add(
1132
-	$function,
1133
-	$description,
1134
-	$arguments = [],
1135
-	$file = '',
1136
-	$no_duplicate = false,
1137
-	$time = 0,
1138
-	$priority = 0
1131
+    $function,
1132
+    $description,
1133
+    $arguments = [],
1134
+    $file = '',
1135
+    $no_duplicate = false,
1136
+    $time = 0,
1137
+    $priority = 0
1139 1138
 ) {
1140
-	include_spip('inc/queue');
1139
+    include_spip('inc/queue');
1141 1140
 
1142
-	return queue_add_job($function, $description, $arguments, $file, $no_duplicate, $time, $priority);
1141
+    return queue_add_job($function, $description, $arguments, $file, $no_duplicate, $time, $priority);
1143 1142
 }
1144 1143
 
1145 1144
 /**
@@ -1150,9 +1149,9 @@  discard block
 block discarded – undo
1150 1149
  * @return bool
1151 1150
  */
1152 1151
 function job_queue_remove($id_job) {
1153
-	include_spip('inc/queue');
1152
+    include_spip('inc/queue');
1154 1153
 
1155
-	return queue_remove_job($id_job);
1154
+    return queue_remove_job($id_job);
1156 1155
 }
1157 1156
 
1158 1157
 /**
@@ -1165,9 +1164,9 @@  discard block
 block discarded – undo
1165 1164
  *     or an array of simple array to link multiples objet in one time
1166 1165
  */
1167 1166
 function job_queue_link($id_job, $objets) {
1168
-	include_spip('inc/queue');
1167
+    include_spip('inc/queue');
1169 1168
 
1170
-	return queue_link_job($id_job, $objets);
1169
+    return queue_link_job($id_job, $objets);
1171 1170
 }
1172 1171
 
1173 1172
 
@@ -1187,36 +1186,36 @@  discard block
 block discarded – undo
1187 1186
  *  - `null` si la queue n'est pas encore initialisée
1188 1187
  */
1189 1188
 function queue_sleep_time_to_next_job($force = null) {
1190
-	static $queue_next_job_time = -1;
1191
-	if ($force === true) {
1192
-		$queue_next_job_time = -1;
1193
-	} elseif ($force) {
1194
-		$queue_next_job_time = $force;
1195
-	}
1196
-
1197
-	if ($queue_next_job_time == -1) {
1198
-		if (!defined('_JQ_NEXT_JOB_TIME_FILENAME')) {
1199
-			define('_JQ_NEXT_JOB_TIME_FILENAME', _DIR_TMP . 'job_queue_next.txt');
1200
-		}
1201
-		// utiliser un cache memoire si dispo
1202
-		if (function_exists('cache_get') and defined('_MEMOIZE_MEMORY') and _MEMOIZE_MEMORY) {
1203
-			$queue_next_job_time = cache_get(_JQ_NEXT_JOB_TIME_FILENAME);
1204
-		} else {
1205
-			$queue_next_job_time = null;
1206
-			if (lire_fichier(_JQ_NEXT_JOB_TIME_FILENAME, $contenu)) {
1207
-				$queue_next_job_time = intval($contenu);
1208
-			}
1209
-		}
1210
-	}
1211
-
1212
-	if (is_null($queue_next_job_time)) {
1213
-		return null;
1214
-	}
1215
-	if (!$_SERVER['REQUEST_TIME']) {
1216
-		$_SERVER['REQUEST_TIME'] = time();
1217
-	}
1218
-
1219
-	return $queue_next_job_time - $_SERVER['REQUEST_TIME'];
1189
+    static $queue_next_job_time = -1;
1190
+    if ($force === true) {
1191
+        $queue_next_job_time = -1;
1192
+    } elseif ($force) {
1193
+        $queue_next_job_time = $force;
1194
+    }
1195
+
1196
+    if ($queue_next_job_time == -1) {
1197
+        if (!defined('_JQ_NEXT_JOB_TIME_FILENAME')) {
1198
+            define('_JQ_NEXT_JOB_TIME_FILENAME', _DIR_TMP . 'job_queue_next.txt');
1199
+        }
1200
+        // utiliser un cache memoire si dispo
1201
+        if (function_exists('cache_get') and defined('_MEMOIZE_MEMORY') and _MEMOIZE_MEMORY) {
1202
+            $queue_next_job_time = cache_get(_JQ_NEXT_JOB_TIME_FILENAME);
1203
+        } else {
1204
+            $queue_next_job_time = null;
1205
+            if (lire_fichier(_JQ_NEXT_JOB_TIME_FILENAME, $contenu)) {
1206
+                $queue_next_job_time = intval($contenu);
1207
+            }
1208
+        }
1209
+    }
1210
+
1211
+    if (is_null($queue_next_job_time)) {
1212
+        return null;
1213
+    }
1214
+    if (!$_SERVER['REQUEST_TIME']) {
1215
+        $_SERVER['REQUEST_TIME'] = time();
1216
+    }
1217
+
1218
+    return $queue_next_job_time - $_SERVER['REQUEST_TIME'];
1220 1219
 }
1221 1220
 
1222 1221
 
@@ -1228,11 +1227,11 @@  discard block
 block discarded – undo
1228 1227
  * @return string
1229 1228
  */
1230 1229
 function quote_amp($u) {
1231
-	return preg_replace(
1232
-		'/&(?![a-z]{0,4}\w{2,3};|#x?[0-9a-f]{2,6};)/i',
1233
-		'&amp;',
1234
-		$u
1235
-	);
1230
+    return preg_replace(
1231
+        '/&(?![a-z]{0,4}\w{2,3};|#x?[0-9a-f]{2,6};)/i',
1232
+        '&amp;',
1233
+        $u
1234
+    );
1236 1235
 }
1237 1236
 
1238 1237
 
@@ -1255,27 +1254,27 @@  discard block
 block discarded – undo
1255 1254
  *     Balise HTML `<script>` et son contenu
1256 1255
  **/
1257 1256
 function http_script($script, $src = '', $noscript = '') {
1258
-	static $done = [];
1257
+    static $done = [];
1259 1258
 
1260
-	if ($src && !isset($done[$src])) {
1261
-		$done[$src] = true;
1262
-		$src = find_in_path($src, _JAVASCRIPT);
1263
-		$src = " src='$src'";
1264
-	} else {
1265
-		$src = '';
1266
-	}
1267
-	if ($script) {
1268
-		$script = ("/*<![CDATA[*/\n" .
1269
-			preg_replace(',</([^>]*)>,', '<\/\1>', $script) .
1270
-			'/*]]>*/');
1271
-	}
1272
-	if ($noscript) {
1273
-		$noscript = "<noscript>\n\t$noscript\n</noscript>\n";
1274
-	}
1259
+    if ($src && !isset($done[$src])) {
1260
+        $done[$src] = true;
1261
+        $src = find_in_path($src, _JAVASCRIPT);
1262
+        $src = " src='$src'";
1263
+    } else {
1264
+        $src = '';
1265
+    }
1266
+    if ($script) {
1267
+        $script = ("/*<![CDATA[*/\n" .
1268
+            preg_replace(',</([^>]*)>,', '<\/\1>', $script) .
1269
+            '/*]]>*/');
1270
+    }
1271
+    if ($noscript) {
1272
+        $noscript = "<noscript>\n\t$noscript\n</noscript>\n";
1273
+    }
1275 1274
 
1276
-	return ($src or $script or $noscript)
1277
-		? "<script type='text/javascript'$src>$script</script>$noscript"
1278
-		: '';
1275
+    return ($src or $script or $noscript)
1276
+        ? "<script type='text/javascript'$src>$script</script>$noscript"
1277
+        : '';
1279 1278
 }
1280 1279
 
1281 1280
 
@@ -1310,7 +1309,7 @@  discard block
 block discarded – undo
1310 1309
  *     Texte échappé
1311 1310
  **/
1312 1311
 function texte_script(string $texte): string {
1313
-	return str_replace('\'', '\\\'', str_replace('\\', '\\\\', $texte));
1312
+    return str_replace('\'', '\\\'', str_replace('\\', '\\\\', $texte));
1314 1313
 }
1315 1314
 
1316 1315
 
@@ -1347,68 +1346,68 @@  discard block
 block discarded – undo
1347 1346
  *     Liste des chemins, par ordre de priorité.
1348 1347
  **/
1349 1348
 function _chemin($dir_path = null) {
1350
-	static $path_base = null;
1351
-	static $path_full = null;
1352
-	if ($path_base == null) {
1353
-		// Chemin standard depuis l'espace public
1354
-		$path = defined('_SPIP_PATH') ? _SPIP_PATH :
1355
-			_DIR_RACINE . ':' .
1356
-			_DIR_RACINE . 'squelettes-dist/:' .
1357
-			_DIR_RACINE . 'prive/:' .
1358
-			_DIR_RESTREINT;
1359
-		// Ajouter squelettes/
1360
-		if (@is_dir(_DIR_RACINE . 'squelettes')) {
1361
-			$path = _DIR_RACINE . 'squelettes/:' . $path;
1362
-		}
1363
-		foreach (explode(':', $path) as $dir) {
1364
-			if (strlen($dir) and substr($dir, -1) != '/') {
1365
-				$dir .= '/';
1366
-			}
1367
-			$path_base[] = $dir;
1368
-		}
1369
-		$path_full = $path_base;
1370
-		// Et le(s) dossier(s) des squelettes nommes
1371
-		if (strlen($GLOBALS['dossier_squelettes'])) {
1372
-			foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) {
1373
-				array_unshift($path_full, ($d[0] == '/' ? '' : _DIR_RACINE) . $d . '/');
1374
-			}
1375
-		}
1376
-		$GLOBALS['path_sig'] = md5(serialize($path_full));
1377
-	}
1378
-	if ($dir_path === null) {
1379
-		return $path_full;
1380
-	}
1381
-
1382
-	if (is_array($dir_path) or strlen($dir_path)) {
1383
-		$tete = '';
1384
-		if (reset($path_base) == _DIR_RACINE . 'squelettes/') {
1385
-			$tete = array_shift($path_base);
1386
-		}
1387
-		$dirs = (is_array($dir_path) ? $dir_path : explode(':', $dir_path));
1388
-		$dirs = array_reverse($dirs);
1389
-		foreach ($dirs as $dir_path) {
1390
-			if (substr($dir_path, -1) != '/') {
1391
-				$dir_path .= '/';
1392
-			}
1393
-			if (!in_array($dir_path, $path_base)) {
1394
-				array_unshift($path_base, $dir_path);
1395
-			}
1396
-		}
1397
-		if (strlen($tete)) {
1398
-			array_unshift($path_base, $tete);
1399
-		}
1400
-	}
1401
-	$path_full = $path_base;
1402
-	// Et le(s) dossier(s) des squelettes nommes
1403
-	if (strlen($GLOBALS['dossier_squelettes'])) {
1404
-		foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) {
1405
-			array_unshift($path_full, ((isset($d[0]) and $d[0] == '/') ? '' : _DIR_RACINE) . $d . '/');
1406
-		}
1407
-	}
1408
-
1409
-	$GLOBALS['path_sig'] = md5(serialize($path_full));
1410
-
1411
-	return $path_full;
1349
+    static $path_base = null;
1350
+    static $path_full = null;
1351
+    if ($path_base == null) {
1352
+        // Chemin standard depuis l'espace public
1353
+        $path = defined('_SPIP_PATH') ? _SPIP_PATH :
1354
+            _DIR_RACINE . ':' .
1355
+            _DIR_RACINE . 'squelettes-dist/:' .
1356
+            _DIR_RACINE . 'prive/:' .
1357
+            _DIR_RESTREINT;
1358
+        // Ajouter squelettes/
1359
+        if (@is_dir(_DIR_RACINE . 'squelettes')) {
1360
+            $path = _DIR_RACINE . 'squelettes/:' . $path;
1361
+        }
1362
+        foreach (explode(':', $path) as $dir) {
1363
+            if (strlen($dir) and substr($dir, -1) != '/') {
1364
+                $dir .= '/';
1365
+            }
1366
+            $path_base[] = $dir;
1367
+        }
1368
+        $path_full = $path_base;
1369
+        // Et le(s) dossier(s) des squelettes nommes
1370
+        if (strlen($GLOBALS['dossier_squelettes'])) {
1371
+            foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) {
1372
+                array_unshift($path_full, ($d[0] == '/' ? '' : _DIR_RACINE) . $d . '/');
1373
+            }
1374
+        }
1375
+        $GLOBALS['path_sig'] = md5(serialize($path_full));
1376
+    }
1377
+    if ($dir_path === null) {
1378
+        return $path_full;
1379
+    }
1380
+
1381
+    if (is_array($dir_path) or strlen($dir_path)) {
1382
+        $tete = '';
1383
+        if (reset($path_base) == _DIR_RACINE . 'squelettes/') {
1384
+            $tete = array_shift($path_base);
1385
+        }
1386
+        $dirs = (is_array($dir_path) ? $dir_path : explode(':', $dir_path));
1387
+        $dirs = array_reverse($dirs);
1388
+        foreach ($dirs as $dir_path) {
1389
+            if (substr($dir_path, -1) != '/') {
1390
+                $dir_path .= '/';
1391
+            }
1392
+            if (!in_array($dir_path, $path_base)) {
1393
+                array_unshift($path_base, $dir_path);
1394
+            }
1395
+        }
1396
+        if (strlen($tete)) {
1397
+            array_unshift($path_base, $tete);
1398
+        }
1399
+    }
1400
+    $path_full = $path_base;
1401
+    // Et le(s) dossier(s) des squelettes nommes
1402
+    if (strlen($GLOBALS['dossier_squelettes'])) {
1403
+        foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) {
1404
+            array_unshift($path_full, ((isset($d[0]) and $d[0] == '/') ? '' : _DIR_RACINE) . $d . '/');
1405
+        }
1406
+    }
1407
+
1408
+    $GLOBALS['path_sig'] = md5(serialize($path_full));
1409
+
1410
+    return $path_full;
1412 1411
 }
1413 1412
 
1414 1413
 /**
@@ -1421,78 +1420,78 @@  discard block
 block discarded – undo
1421 1420
  * @return array Liste de chemins
1422 1421
  **/
1423 1422
 function creer_chemin() {
1424
-	$path_a = _chemin();
1425
-	static $c = '';
1423
+    $path_a = _chemin();
1424
+    static $c = '';
1426 1425
 
1427
-	// on calcule le chemin si le dossier skel a change
1428
-	if ($c != $GLOBALS['dossier_squelettes']) {
1429
-		// assurer le non plantage lors de la montee de version :
1430
-		$c = $GLOBALS['dossier_squelettes'];
1431
-		$path_a = _chemin(''); // forcer un recalcul du chemin
1432
-	}
1426
+    // on calcule le chemin si le dossier skel a change
1427
+    if ($c != $GLOBALS['dossier_squelettes']) {
1428
+        // assurer le non plantage lors de la montee de version :
1429
+        $c = $GLOBALS['dossier_squelettes'];
1430
+        $path_a = _chemin(''); // forcer un recalcul du chemin
1431
+    }
1433 1432
 
1434
-	return $path_a;
1433
+    return $path_a;
1435 1434
 }
1436 1435
 
1437 1436
 
1438 1437
 function lister_themes_prives() {
1439
-	static $themes = null;
1440
-	if (is_null($themes)) {
1441
-		// si pas encore definie
1442
-		if (!defined('_SPIP_THEME_PRIVE')) {
1443
-			define('_SPIP_THEME_PRIVE', 'spip');
1444
-		}
1445
-		$themes = [_SPIP_THEME_PRIVE];
1446
-		// lors d'une installation neuve, prefs n'est pas definie.
1447
-		if (isset($GLOBALS['visiteur_session']['prefs'])) {
1448
-			$prefs = $GLOBALS['visiteur_session']['prefs'];
1449
-		} else {
1450
-			$prefs = [];
1451
-		}
1452
-		if (is_string($prefs)) {
1453
-			$prefs = unserialize($GLOBALS['visiteur_session']['prefs']);
1454
-		}
1455
-		if (
1456
-			((isset($prefs['theme']) and $theme = $prefs['theme'])
1457
-				or (isset($GLOBALS['theme_prive_defaut']) and $theme = $GLOBALS['theme_prive_defaut']))
1458
-			and $theme != _SPIP_THEME_PRIVE
1459
-		) {
1460
-			array_unshift($themes, $theme);
1461
-		} // placer le theme choisi en tete
1462
-	}
1463
-
1464
-	return $themes;
1438
+    static $themes = null;
1439
+    if (is_null($themes)) {
1440
+        // si pas encore definie
1441
+        if (!defined('_SPIP_THEME_PRIVE')) {
1442
+            define('_SPIP_THEME_PRIVE', 'spip');
1443
+        }
1444
+        $themes = [_SPIP_THEME_PRIVE];
1445
+        // lors d'une installation neuve, prefs n'est pas definie.
1446
+        if (isset($GLOBALS['visiteur_session']['prefs'])) {
1447
+            $prefs = $GLOBALS['visiteur_session']['prefs'];
1448
+        } else {
1449
+            $prefs = [];
1450
+        }
1451
+        if (is_string($prefs)) {
1452
+            $prefs = unserialize($GLOBALS['visiteur_session']['prefs']);
1453
+        }
1454
+        if (
1455
+            ((isset($prefs['theme']) and $theme = $prefs['theme'])
1456
+                or (isset($GLOBALS['theme_prive_defaut']) and $theme = $GLOBALS['theme_prive_defaut']))
1457
+            and $theme != _SPIP_THEME_PRIVE
1458
+        ) {
1459
+            array_unshift($themes, $theme);
1460
+        } // placer le theme choisi en tete
1461
+    }
1462
+
1463
+    return $themes;
1465 1464
 }
1466 1465
 
1467 1466
 function find_in_theme($file, $subdir = '', $include = false) {
1468
-	static $themefiles = [];
1469
-	if (isset($themefiles["$subdir$file"])) {
1470
-		return $themefiles["$subdir$file"];
1471
-	}
1472
-	// on peut fournir une icone generique -xx.svg qui fera le job dans toutes les tailles, et qui est prioritaire sur le png
1473
-	// si il y a un .svg a la bonne taille (-16.svg) a cote, on l'utilise en remplacement du -16.png
1474
-	if (
1475
-		preg_match(',-(\d+)[.](png|gif|svg)$,', $file, $m)
1476
-		and $file_svg_generique = substr($file, 0, -strlen($m[0])) . '-xx.svg'
1477
-		and $f = find_in_theme("$file_svg_generique")
1478
-	) {
1479
-		if ($fsize = substr($f, 0, -6) . $m[1] . '.svg' and file_exists($fsize)) {
1480
-			return $themefiles["$subdir$file"] = $fsize;
1481
-		}
1482
-		else {
1483
-			return $themefiles["$subdir$file"] = "$f?" . $m[1] . 'px';
1484
-		}
1485
-	}
1486
-
1487
-	$themes = lister_themes_prives();
1488
-	foreach ($themes as $theme) {
1489
-		if ($f = find_in_path($file, "prive/themes/$theme/$subdir", $include)) {
1490
-			return $themefiles["$subdir$file"] = $f;
1491
-		}
1492
-	}
1493
-	spip_log("$file introuvable dans le theme prive " . reset($themes), 'theme');
1494
-
1495
-	return $themefiles["$subdir$file"] = '';
1467
+    static $themefiles = [];
1468
+    if (isset($themefiles["$subdir$file"])) {
1469
+        return $themefiles["$subdir$file"];
1470
+    }
1471
+    // on peut fournir une icone generique -xx.svg qui fera le job dans toutes les tailles, et qui est prioritaire sur le png
1472
+    // si il y a un .svg a la bonne taille (-16.svg) a cote, on l'utilise en remplacement du -16.png
1473
+    if (
1474
+        preg_match(',-(\d+)[.](png|gif|svg)$,', $file, $m)
1475
+        and $file_svg_generique = substr($file, 0, -strlen($m[0])) . '-xx.svg'
1476
+        and $f = find_in_theme("$file_svg_generique")
1477
+    ) {
1478
+        if ($fsize = substr($f, 0, -6) . $m[1] . '.svg' and file_exists($fsize)) {
1479
+            return $themefiles["$subdir$file"] = $fsize;
1480
+        }
1481
+        else {
1482
+            return $themefiles["$subdir$file"] = "$f?" . $m[1] . 'px';
1483
+        }
1484
+    }
1485
+
1486
+    $themes = lister_themes_prives();
1487
+    foreach ($themes as $theme) {
1488
+        if ($f = find_in_path($file, "prive/themes/$theme/$subdir", $include)) {
1489
+            return $themefiles["$subdir$file"] = $f;
1490
+        }
1491
+    }
1492
+    spip_log("$file introuvable dans le theme prive " . reset($themes), 'theme');
1493
+
1494
+    return $themefiles["$subdir$file"] = '';
1496 1495
 }
1497 1496
 
1498 1497
 
@@ -1516,31 +1515,31 @@  discard block
 block discarded – undo
1516 1515
  *     sinon chaîne vide.
1517 1516
  **/
1518 1517
 function chemin_image($icone) {
1519
-	static $icone_renommer;
1520
-	if ($p = strpos($icone, '?')) {
1521
-		$icone = substr($icone, 0, $p);
1522
-	}
1523
-	// gerer le cas d'un double appel en evitant de refaire le travail inutilement
1524
-	if (strpos($icone, '/') !== false and file_exists($icone)) {
1525
-		return $icone;
1526
-	}
1527
-
1528
-	// si c'est un nom d'image complet (article-24.png) essayer de le renvoyer direct
1529
-	if (preg_match(',[.](png|gif|jpg|webp|svg)$,', $icone) and $f = find_in_theme("images/$icone")) {
1530
-		return $f;
1531
-	}
1532
-	// sinon passer par le module de renommage
1533
-	if (is_null($icone_renommer)) {
1534
-		$icone_renommer = charger_fonction('icone_renommer', 'inc', true);
1535
-	}
1536
-	if ($icone_renommer) {
1537
-		[$icone, $fonction] = $icone_renommer($icone, '');
1538
-		if (file_exists($icone)) {
1539
-			return $icone;
1540
-		}
1541
-	}
1542
-
1543
-	return find_in_path($icone, _NOM_IMG_PACK);
1518
+    static $icone_renommer;
1519
+    if ($p = strpos($icone, '?')) {
1520
+        $icone = substr($icone, 0, $p);
1521
+    }
1522
+    // gerer le cas d'un double appel en evitant de refaire le travail inutilement
1523
+    if (strpos($icone, '/') !== false and file_exists($icone)) {
1524
+        return $icone;
1525
+    }
1526
+
1527
+    // si c'est un nom d'image complet (article-24.png) essayer de le renvoyer direct
1528
+    if (preg_match(',[.](png|gif|jpg|webp|svg)$,', $icone) and $f = find_in_theme("images/$icone")) {
1529
+        return $f;
1530
+    }
1531
+    // sinon passer par le module de renommage
1532
+    if (is_null($icone_renommer)) {
1533
+        $icone_renommer = charger_fonction('icone_renommer', 'inc', true);
1534
+    }
1535
+    if ($icone_renommer) {
1536
+        [$icone, $fonction] = $icone_renommer($icone, '');
1537
+        if (file_exists($icone)) {
1538
+            return $icone;
1539
+        }
1540
+    }
1541
+
1542
+    return find_in_path($icone, _NOM_IMG_PACK);
1544 1543
 }
1545 1544
 
1546 1545
 //
@@ -1578,128 +1577,128 @@  discard block
 block discarded – undo
1578 1577
  *     - false : fichier introuvable
1579 1578
  **/
1580 1579
 function find_in_path($file, $dirname = '', $include = false) {
1581
-	static $dirs = [];
1582
-	static $inc = []; # cf https://git.spip.net/spip/spip/commit/42e4e028e38c839121efaee84308d08aee307eec
1583
-	static $c = '';
1584
-
1585
-	if (!$file and !strlen($file)) {
1586
-		return false;
1587
-	}
1588
-
1589
-	// on calcule le chemin si le dossier skel a change
1590
-	if ($c != $GLOBALS['dossier_squelettes']) {
1591
-		// assurer le non plantage lors de la montee de version :
1592
-		$c = $GLOBALS['dossier_squelettes'];
1593
-		creer_chemin(); // forcer un recalcul du chemin et la mise a jour de path_sig
1594
-	}
1595
-
1596
-	if (isset($GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file])) {
1597
-		if (!$GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file]) {
1598
-			return false;
1599
-		}
1600
-		if ($include and !isset($inc[$dirname][$file])) {
1601
-			include_once _ROOT_CWD . $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file];
1602
-			$inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
1603
-		}
1604
-
1605
-		return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file];
1606
-	}
1607
-
1608
-	$a = strrpos($file, '/');
1609
-	if ($a !== false) {
1610
-		$dirname .= substr($file, 0, ++$a);
1611
-		$file = substr($file, $a);
1612
-	}
1613
-
1614
-	foreach (creer_chemin() as $dir) {
1615
-		if (!isset($dirs[$a = $dir . $dirname])) {
1616
-			$dirs[$a] = (is_dir(_ROOT_CWD . $a) || !$a);
1617
-		}
1618
-		if ($dirs[$a]) {
1619
-			if (file_exists(_ROOT_CWD . ($a .= $file))) {
1620
-				if ($include and !isset($inc[$dirname][$file])) {
1621
-					include_once _ROOT_CWD . $a;
1622
-					$inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
1623
-				}
1624
-				if (!defined('_SAUVER_CHEMIN')) {
1625
-					// si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
1626
-					if (is_null($GLOBALS['path_files'])) {
1627
-						return $a;
1628
-					}
1629
-					define('_SAUVER_CHEMIN', true);
1630
-				}
1631
-
1632
-				return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = $a;
1633
-			}
1634
-		}
1635
-	}
1636
-
1637
-	if ($include) {
1638
-		spip_log("include_spip $dirname$file non trouve");
1639
-		if ($include === 'required') {
1640
-			echo '<pre>',
1641
-			'<strong>Erreur Fatale</strong><br />';
1642
-			if (function_exists('debug_print_backtrace')) {
1643
-				echo debug_print_backtrace();
1644
-			}
1645
-			echo '</pre>';
1646
-			die("Erreur interne: ne peut inclure $dirname$file");
1647
-		}
1648
-	}
1649
-
1650
-	if (!defined('_SAUVER_CHEMIN')) {
1651
-		// si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
1652
-		if (is_null($GLOBALS['path_files'])) {
1653
-			return false;
1654
-		}
1655
-		define('_SAUVER_CHEMIN', true);
1656
-	}
1657
-
1658
-	return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = false;
1580
+    static $dirs = [];
1581
+    static $inc = []; # cf https://git.spip.net/spip/spip/commit/42e4e028e38c839121efaee84308d08aee307eec
1582
+    static $c = '';
1583
+
1584
+    if (!$file and !strlen($file)) {
1585
+        return false;
1586
+    }
1587
+
1588
+    // on calcule le chemin si le dossier skel a change
1589
+    if ($c != $GLOBALS['dossier_squelettes']) {
1590
+        // assurer le non plantage lors de la montee de version :
1591
+        $c = $GLOBALS['dossier_squelettes'];
1592
+        creer_chemin(); // forcer un recalcul du chemin et la mise a jour de path_sig
1593
+    }
1594
+
1595
+    if (isset($GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file])) {
1596
+        if (!$GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file]) {
1597
+            return false;
1598
+        }
1599
+        if ($include and !isset($inc[$dirname][$file])) {
1600
+            include_once _ROOT_CWD . $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file];
1601
+            $inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
1602
+        }
1603
+
1604
+        return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file];
1605
+    }
1606
+
1607
+    $a = strrpos($file, '/');
1608
+    if ($a !== false) {
1609
+        $dirname .= substr($file, 0, ++$a);
1610
+        $file = substr($file, $a);
1611
+    }
1612
+
1613
+    foreach (creer_chemin() as $dir) {
1614
+        if (!isset($dirs[$a = $dir . $dirname])) {
1615
+            $dirs[$a] = (is_dir(_ROOT_CWD . $a) || !$a);
1616
+        }
1617
+        if ($dirs[$a]) {
1618
+            if (file_exists(_ROOT_CWD . ($a .= $file))) {
1619
+                if ($include and !isset($inc[$dirname][$file])) {
1620
+                    include_once _ROOT_CWD . $a;
1621
+                    $inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
1622
+                }
1623
+                if (!defined('_SAUVER_CHEMIN')) {
1624
+                    // si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
1625
+                    if (is_null($GLOBALS['path_files'])) {
1626
+                        return $a;
1627
+                    }
1628
+                    define('_SAUVER_CHEMIN', true);
1629
+                }
1630
+
1631
+                return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = $a;
1632
+            }
1633
+        }
1634
+    }
1635
+
1636
+    if ($include) {
1637
+        spip_log("include_spip $dirname$file non trouve");
1638
+        if ($include === 'required') {
1639
+            echo '<pre>',
1640
+            '<strong>Erreur Fatale</strong><br />';
1641
+            if (function_exists('debug_print_backtrace')) {
1642
+                echo debug_print_backtrace();
1643
+            }
1644
+            echo '</pre>';
1645
+            die("Erreur interne: ne peut inclure $dirname$file");
1646
+        }
1647
+    }
1648
+
1649
+    if (!defined('_SAUVER_CHEMIN')) {
1650
+        // si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
1651
+        if (is_null($GLOBALS['path_files'])) {
1652
+            return false;
1653
+        }
1654
+        define('_SAUVER_CHEMIN', true);
1655
+    }
1656
+
1657
+    return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = false;
1659 1658
 }
1660 1659
 
1661 1660
 function clear_path_cache() {
1662
-	$GLOBALS['path_files'] = [];
1663
-	spip_unlink(_CACHE_CHEMIN);
1661
+    $GLOBALS['path_files'] = [];
1662
+    spip_unlink(_CACHE_CHEMIN);
1664 1663
 }
1665 1664
 
1666 1665
 function load_path_cache() {
1667
-	// charger le path des plugins
1668
-	if (@is_readable(_CACHE_PLUGINS_PATH)) {
1669
-		include_once(_CACHE_PLUGINS_PATH);
1670
-	}
1671
-	$GLOBALS['path_files'] = [];
1672
-	// si le visiteur est admin,
1673
-	// on ne recharge pas le cache pour forcer sa mise a jour
1674
-	if (
1675
-		// la session n'est pas encore chargee a ce moment, on ne peut donc pas s'y fier
1676
-		//AND (!isset($GLOBALS['visiteur_session']['statut']) OR $GLOBALS['visiteur_session']['statut']!='0minirezo')
1677
-		// utiliser le cookie est un pis aller qui marche 'en general'
1678
-		// on blinde par un second test au moment de la lecture de la session
1679
-		// !isset($_COOKIE[$GLOBALS['cookie_prefix'].'_admin'])
1680
-		// et en ignorant ce cache en cas de recalcul explicite
1681
-		!_request('var_mode')
1682
-	) {
1683
-		// on essaye de lire directement sans verrou pour aller plus vite
1684
-		if ($contenu = spip_file_get_contents(_CACHE_CHEMIN)) {
1685
-			// mais si semble corrompu on relit avec un verrou
1686
-			if (!$GLOBALS['path_files'] = unserialize($contenu)) {
1687
-				lire_fichier(_CACHE_CHEMIN, $contenu);
1688
-				if (!$GLOBALS['path_files'] = unserialize($contenu)) {
1689
-					$GLOBALS['path_files'] = [];
1690
-				}
1691
-			}
1692
-		}
1693
-	}
1666
+    // charger le path des plugins
1667
+    if (@is_readable(_CACHE_PLUGINS_PATH)) {
1668
+        include_once(_CACHE_PLUGINS_PATH);
1669
+    }
1670
+    $GLOBALS['path_files'] = [];
1671
+    // si le visiteur est admin,
1672
+    // on ne recharge pas le cache pour forcer sa mise a jour
1673
+    if (
1674
+        // la session n'est pas encore chargee a ce moment, on ne peut donc pas s'y fier
1675
+        //AND (!isset($GLOBALS['visiteur_session']['statut']) OR $GLOBALS['visiteur_session']['statut']!='0minirezo')
1676
+        // utiliser le cookie est un pis aller qui marche 'en general'
1677
+        // on blinde par un second test au moment de la lecture de la session
1678
+        // !isset($_COOKIE[$GLOBALS['cookie_prefix'].'_admin'])
1679
+        // et en ignorant ce cache en cas de recalcul explicite
1680
+        !_request('var_mode')
1681
+    ) {
1682
+        // on essaye de lire directement sans verrou pour aller plus vite
1683
+        if ($contenu = spip_file_get_contents(_CACHE_CHEMIN)) {
1684
+            // mais si semble corrompu on relit avec un verrou
1685
+            if (!$GLOBALS['path_files'] = unserialize($contenu)) {
1686
+                lire_fichier(_CACHE_CHEMIN, $contenu);
1687
+                if (!$GLOBALS['path_files'] = unserialize($contenu)) {
1688
+                    $GLOBALS['path_files'] = [];
1689
+                }
1690
+            }
1691
+        }
1692
+    }
1694 1693
 }
1695 1694
 
1696 1695
 function save_path_cache() {
1697
-	if (
1698
-		defined('_SAUVER_CHEMIN')
1699
-		and _SAUVER_CHEMIN
1700
-	) {
1701
-		ecrire_fichier(_CACHE_CHEMIN, serialize($GLOBALS['path_files']));
1702
-	}
1696
+    if (
1697
+        defined('_SAUVER_CHEMIN')
1698
+        and _SAUVER_CHEMIN
1699
+    ) {
1700
+        ecrire_fichier(_CACHE_CHEMIN, serialize($GLOBALS['path_files']));
1701
+    }
1703 1702
 }
1704 1703
 
1705 1704
 
@@ -1719,33 +1718,33 @@  discard block
 block discarded – undo
1719 1718
  * @return array
1720 1719
  */
1721 1720
 function find_all_in_path($dir, $pattern, $recurs = false) {
1722
-	$liste_fichiers = [];
1723
-	$maxfiles = 10000;
1724
-
1725
-	// cas borderline si dans mes_options on appelle redirige_par_entete qui utilise _T et charge un fichier de langue
1726
-	// on a pas encore inclus flock.php
1727
-	if (!function_exists('preg_files')) {
1728
-		include_once _ROOT_RESTREINT . 'inc/flock.php';
1729
-	}
1730
-
1731
-	// Parcourir le chemin
1732
-	foreach (creer_chemin() as $d) {
1733
-		$f = $d . $dir;
1734
-		if (@is_dir($f)) {
1735
-			$liste = preg_files($f, $pattern, $maxfiles - count($liste_fichiers), $recurs === true ? [] : $recurs);
1736
-			foreach ($liste as $chemin) {
1737
-				$nom = basename($chemin);
1738
-				// ne prendre que les fichiers pas deja trouves
1739
-				// car find_in_path prend le premier qu'il trouve,
1740
-				// les autres sont donc masques
1741
-				if (!isset($liste_fichiers[$nom])) {
1742
-					$liste_fichiers[$nom] = $chemin;
1743
-				}
1744
-			}
1745
-		}
1746
-	}
1747
-
1748
-	return $liste_fichiers;
1721
+    $liste_fichiers = [];
1722
+    $maxfiles = 10000;
1723
+
1724
+    // cas borderline si dans mes_options on appelle redirige_par_entete qui utilise _T et charge un fichier de langue
1725
+    // on a pas encore inclus flock.php
1726
+    if (!function_exists('preg_files')) {
1727
+        include_once _ROOT_RESTREINT . 'inc/flock.php';
1728
+    }
1729
+
1730
+    // Parcourir le chemin
1731
+    foreach (creer_chemin() as $d) {
1732
+        $f = $d . $dir;
1733
+        if (@is_dir($f)) {
1734
+            $liste = preg_files($f, $pattern, $maxfiles - count($liste_fichiers), $recurs === true ? [] : $recurs);
1735
+            foreach ($liste as $chemin) {
1736
+                $nom = basename($chemin);
1737
+                // ne prendre que les fichiers pas deja trouves
1738
+                // car find_in_path prend le premier qu'il trouve,
1739
+                // les autres sont donc masques
1740
+                if (!isset($liste_fichiers[$nom])) {
1741
+                    $liste_fichiers[$nom] = $chemin;
1742
+                }
1743
+            }
1744
+        }
1745
+    }
1746
+
1747
+    return $liste_fichiers;
1749 1748
 }
1750 1749
 
1751 1750
 /**
@@ -1757,17 +1756,17 @@  discard block
 block discarded – undo
1757 1756
  * @return bool
1758 1757
  */
1759 1758
 function autoriser_sans_cookie($nom, $strict = false) {
1760
-	static $autsanscookie = ['install', 'base_repair'];
1759
+    static $autsanscookie = ['install', 'base_repair'];
1761 1760
 
1762
-	if (in_array($nom, $autsanscookie)) {
1763
-		if (test_espace_prive()) {
1764
-			include_spip('base/connect_sql');
1765
-			if (!$strict or !spip_connect()) {
1766
-				return true;
1767
-			}
1768
-		}
1769
-	}
1770
-	return false;
1761
+    if (in_array($nom, $autsanscookie)) {
1762
+        if (test_espace_prive()) {
1763
+            include_spip('base/connect_sql');
1764
+            if (!$strict or !spip_connect()) {
1765
+                return true;
1766
+            }
1767
+        }
1768
+    }
1769
+    return false;
1771 1770
 }
1772 1771
 
1773 1772
 /**
@@ -1777,60 +1776,60 @@  discard block
 block discarded – undo
1777 1776
  * @return string
1778 1777
  */
1779 1778
 function charger_fonction_url(string $quoi, string $type = '') {
1780
-	if ($type === 'defaut') {
1781
-		$objet = objet_type($quoi);
1782
-		if (
1783
-			$f = charger_fonction('generer_' . $objet . '_url', 'urls', true)
1784
-			// deprecated
1785
-			or $f = charger_fonction('generer_url_' . $objet, 'urls', true)
1786
-		) {
1787
-			return $f;
1788
-		}
1789
-		return '';
1790
-	}
1791
-
1792
-	$url_type = $type;
1793
-	if (!$url_type) {
1794
-		$url_type = $GLOBALS['type_urls'] ?? $GLOBALS['meta']['type_urls'] ?? 'page'; // sinon type "page" par défaut
1795
-	}
1796
-
1797
-	// inclure le module d'url
1798
-	include_spip('urls/' . $url_type);
1799
-
1800
-	switch ($quoi) {
1801
-		case 'page':
1802
-			if (
1803
-				 function_exists($f = "urls_{$url_type}_generer_url_page")
1804
-				or function_exists($f .= '_dist')
1805
-				// ou une fonction custom utilisateur independante du type d'url
1806
-				or function_exists($f = 'generer_url_page')
1807
-				or function_exists($f .= '_dist')
1808
-			) {
1809
-				return $f;
1810
-			}
1811
-			// pas de compat ancienne version ici, c'est une nouvelle feature
1812
-			return '';
1813
-		case 'objet':
1814
-		case 'decoder':
1815
-		default:
1816
-			$fquoi = ($quoi === 'objet' ? 'generer_url_objet' : 'decoder_url');
1817
-			if (
1818
-				function_exists($f = "urls_{$url_type}_{$fquoi}")
1819
-				or function_exists($f .= '_dist')
1820
-			) {
1821
-				return $f;
1822
-			}
1823
-			// est-ce qu'on a une ancienne fonction urls_xxx_dist() ?
1824
-			// c'est un ancien module d'url, on appelle l'ancienne fonction qui fait tout
1825
-			if ($f = charger_fonction($url_type, 'urls', true)) {
1826
-				return $f;
1827
-			}
1828
-			// sinon on se rabat sur les urls page si ce n'est pas un type demande explicitement
1829
-			if (!$type and $url_type !== 'page') {
1830
-				return charger_fonction_url($quoi, 'page');
1831
-			}
1832
-			return '';
1833
-	}
1779
+    if ($type === 'defaut') {
1780
+        $objet = objet_type($quoi);
1781
+        if (
1782
+            $f = charger_fonction('generer_' . $objet . '_url', 'urls', true)
1783
+            // deprecated
1784
+            or $f = charger_fonction('generer_url_' . $objet, 'urls', true)
1785
+        ) {
1786
+            return $f;
1787
+        }
1788
+        return '';
1789
+    }
1790
+
1791
+    $url_type = $type;
1792
+    if (!$url_type) {
1793
+        $url_type = $GLOBALS['type_urls'] ?? $GLOBALS['meta']['type_urls'] ?? 'page'; // sinon type "page" par défaut
1794
+    }
1795
+
1796
+    // inclure le module d'url
1797
+    include_spip('urls/' . $url_type);
1798
+
1799
+    switch ($quoi) {
1800
+        case 'page':
1801
+            if (
1802
+                    function_exists($f = "urls_{$url_type}_generer_url_page")
1803
+                or function_exists($f .= '_dist')
1804
+                // ou une fonction custom utilisateur independante du type d'url
1805
+                or function_exists($f = 'generer_url_page')
1806
+                or function_exists($f .= '_dist')
1807
+            ) {
1808
+                return $f;
1809
+            }
1810
+            // pas de compat ancienne version ici, c'est une nouvelle feature
1811
+            return '';
1812
+        case 'objet':
1813
+        case 'decoder':
1814
+        default:
1815
+            $fquoi = ($quoi === 'objet' ? 'generer_url_objet' : 'decoder_url');
1816
+            if (
1817
+                function_exists($f = "urls_{$url_type}_{$fquoi}")
1818
+                or function_exists($f .= '_dist')
1819
+            ) {
1820
+                return $f;
1821
+            }
1822
+            // est-ce qu'on a une ancienne fonction urls_xxx_dist() ?
1823
+            // c'est un ancien module d'url, on appelle l'ancienne fonction qui fait tout
1824
+            if ($f = charger_fonction($url_type, 'urls', true)) {
1825
+                return $f;
1826
+            }
1827
+            // sinon on se rabat sur les urls page si ce n'est pas un type demande explicitement
1828
+            if (!$type and $url_type !== 'page') {
1829
+                return charger_fonction_url($quoi, 'page');
1830
+            }
1831
+            return '';
1832
+    }
1834 1833
 }
1835 1834
 
1836 1835
 
@@ -1859,48 +1858,48 @@  discard block
 block discarded – undo
1859 1858
  *           (cas des raccourcis personalises [->spip20] : il faut implementer une fonction generer_spip_url et une fonction generer_spip_url_ecrire)
1860 1859
  */
1861 1860
 function generer_objet_url($id, string $entite, string $args = '', string $ancre = '', ?bool $public = null, string $type = '', string $connect = ''): string {
1862
-	if ($public === null) {
1863
-		$public = !test_espace_prive();
1864
-	}
1865
-	$id = intval($id);
1866
-	$entite = objet_type($entite); // cas particulier d'appels sur objet/id_objet...
1867
-
1868
-	if (!$public) {
1869
-		if (!$entite) {
1870
-			return '';
1871
-		}
1872
-		if (!function_exists('generer_objet_url_ecrire')) {
1873
-			include_spip('inc/urls');
1874
-		}
1875
-		$res = generer_objet_url_ecrire($id, $entite, $args, $ancre, false, $connect);
1876
-	} else {
1877
-		$f = charger_fonction_url('objet', $type ?? '');
1878
-
1879
-		// @deprecated si $entite='', on veut la fonction de passage URL ==> id
1880
-		// @see charger_fonction_url
1881
-		if (!$entite) {
1882
-			return $f;
1883
-		}
1884
-
1885
-		// mais d'abord il faut tester le cas des urls sur une
1886
-		// base distante
1887
-		if (
1888
-			$connect
1889
-			and $g = charger_fonction('connect', 'urls', true)
1890
-		) {
1891
-			$f = $g;
1892
-		}
1893
-
1894
-		$res = $f(intval($id), $entite, $args ?: '', $ancre ?: '', $connect);
1895
-	}
1896
-	if ($res) {
1897
-		return $res;
1898
-	}
1899
-
1900
-	// On a ete gentil mais la ....
1901
-	spip_log("generer_objet_url: entite $entite ($f) inconnue $type $public $connect", _LOG_ERREUR);
1902
-
1903
-	return '';
1861
+    if ($public === null) {
1862
+        $public = !test_espace_prive();
1863
+    }
1864
+    $id = intval($id);
1865
+    $entite = objet_type($entite); // cas particulier d'appels sur objet/id_objet...
1866
+
1867
+    if (!$public) {
1868
+        if (!$entite) {
1869
+            return '';
1870
+        }
1871
+        if (!function_exists('generer_objet_url_ecrire')) {
1872
+            include_spip('inc/urls');
1873
+        }
1874
+        $res = generer_objet_url_ecrire($id, $entite, $args, $ancre, false, $connect);
1875
+    } else {
1876
+        $f = charger_fonction_url('objet', $type ?? '');
1877
+
1878
+        // @deprecated si $entite='', on veut la fonction de passage URL ==> id
1879
+        // @see charger_fonction_url
1880
+        if (!$entite) {
1881
+            return $f;
1882
+        }
1883
+
1884
+        // mais d'abord il faut tester le cas des urls sur une
1885
+        // base distante
1886
+        if (
1887
+            $connect
1888
+            and $g = charger_fonction('connect', 'urls', true)
1889
+        ) {
1890
+            $f = $g;
1891
+        }
1892
+
1893
+        $res = $f(intval($id), $entite, $args ?: '', $ancre ?: '', $connect);
1894
+    }
1895
+    if ($res) {
1896
+        return $res;
1897
+    }
1898
+
1899
+    // On a ete gentil mais la ....
1900
+    spip_log("generer_objet_url: entite $entite ($f) inconnue $type $public $connect", _LOG_ERREUR);
1901
+
1902
+    return '';
1904 1903
 }
1905 1904
 
1906 1905
 /**
@@ -1908,10 +1907,10 @@  discard block
 block discarded – undo
1908 1907
  * @see generer_objet_url
1909 1908
  */
1910 1909
 function generer_url_entite($id = 0, $entite = '', $args = '', $ancre = '', $public = null, $type = null) {
1911
-	if ($public and is_string($public)) {
1912
-		return generer_objet_url(intval($id), $entite, $args ?: '', $ancre ?: '', true, $type ?? '', $public);
1913
-	}
1914
-	return generer_objet_url(intval($id), $entite, $args ?: '', $ancre ?: '', $public, $type ?? '');
1910
+    if ($public and is_string($public)) {
1911
+        return generer_objet_url(intval($id), $entite, $args ?: '', $ancre ?: '', true, $type ?? '', $public);
1912
+    }
1913
+    return generer_objet_url(intval($id), $entite, $args ?: '', $ancre ?: '', $public, $type ?? '');
1915 1914
 }
1916 1915
 
1917 1916
 /**
@@ -1923,19 +1922,19 @@  discard block
 block discarded – undo
1923 1922
  * @return string
1924 1923
  */
1925 1924
 function generer_objet_url_ecrire_edit($id, string $entite, string $args = '', string $ancre = ''): string {
1926
-	$id = intval($id);
1927
-	$exec = objet_info($entite, 'url_edit');
1928
-	$url = generer_url_ecrire($exec, $args);
1929
-	if (intval($id)) {
1930
-		$url = parametre_url($url, id_table_objet($entite), $id);
1931
-	} else {
1932
-		$url = parametre_url($url, 'new', 'oui');
1933
-	}
1934
-	if ($ancre) {
1935
-		$url = ancre_url($url, $ancre);
1936
-	}
1925
+    $id = intval($id);
1926
+    $exec = objet_info($entite, 'url_edit');
1927
+    $url = generer_url_ecrire($exec, $args);
1928
+    if (intval($id)) {
1929
+        $url = parametre_url($url, id_table_objet($entite), $id);
1930
+    } else {
1931
+        $url = parametre_url($url, 'new', 'oui');
1932
+    }
1933
+    if ($ancre) {
1934
+        $url = ancre_url($url, $ancre);
1935
+    }
1937 1936
 
1938
-	return $url;
1937
+    return $url;
1939 1938
 }
1940 1939
 
1941 1940
 /**
@@ -1943,18 +1942,18 @@  discard block
 block discarded – undo
1943 1942
  * @see generer_objet_url_ecrire_edit
1944 1943
  */
1945 1944
 function generer_url_ecrire_entite_edit($id, $entite, $args = '', $ancre = '') {
1946
-	return generer_objet_url_ecrire_edit(intval($id), $entite, $args, $ancre);
1945
+    return generer_objet_url_ecrire_edit(intval($id), $entite, $args, $ancre);
1947 1946
 }
1948 1947
 
1949 1948
 
1950 1949
 function urls_connect_dist($i, &$entite, $args = '', $ancre = '', $public = null) {
1951
-	include_spip('base/connect_sql');
1952
-	$id_type = id_table_objet($entite, $public);
1950
+    include_spip('base/connect_sql');
1951
+    $id_type = id_table_objet($entite, $public);
1953 1952
 
1954
-	return _DIR_RACINE . get_spip_script('./')
1955
-	. '?' . _SPIP_PAGE . "=$entite&$id_type=$i&connect=$public"
1956
-	. (!$args ? '' : "&$args")
1957
-	. (!$ancre ? '' : "#$ancre");
1953
+    return _DIR_RACINE . get_spip_script('./')
1954
+    . '?' . _SPIP_PAGE . "=$entite&$id_type=$i&connect=$public"
1955
+    . (!$args ? '' : "&$args")
1956
+    . (!$ancre ? '' : "#$ancre");
1958 1957
 }
1959 1958
 
1960 1959
 
@@ -1965,18 +1964,18 @@  discard block
 block discarded – undo
1965 1964
  * @return string
1966 1965
  */
1967 1966
 function urlencode_1738($url) {
1968
-	if (preg_match(',[^\x00-\x7E],sS', $url)) {
1969
-		$uri = '';
1970
-		for ($i = 0; $i < strlen($url); $i++) {
1971
-			if (ord($a = $url[$i]) > 127) {
1972
-				$a = rawurlencode($a);
1973
-			}
1974
-			$uri .= $a;
1975
-		}
1976
-		$url = $uri;
1977
-	}
1967
+    if (preg_match(',[^\x00-\x7E],sS', $url)) {
1968
+        $uri = '';
1969
+        for ($i = 0; $i < strlen($url); $i++) {
1970
+            if (ord($a = $url[$i]) > 127) {
1971
+                $a = rawurlencode($a);
1972
+            }
1973
+            $uri .= $a;
1974
+        }
1975
+        $url = $uri;
1976
+    }
1978 1977
 
1979
-	return quote_amp($url);
1978
+    return quote_amp($url);
1980 1979
 }
1981 1980
 
1982 1981
 /**
@@ -1992,14 +1991,14 @@  discard block
 block discarded – undo
1992 1991
  * @return string
1993 1992
  */
1994 1993
 function generer_objet_url_absolue($id = 0, string $entite = '', string $args = '', string $ancre = '', ?bool $public = null, string $type = '', string $connect = ''): string {
1995
-	$id = intval($id);
1996
-	$h = generer_objet_url($id, $entite, $args, $ancre, $public, $type, $connect);
1997
-	if (!preg_match(',^\w+:,', $h)) {
1998
-		include_spip('inc/filtres_mini');
1999
-		$h = url_absolue($h);
2000
-	}
1994
+    $id = intval($id);
1995
+    $h = generer_objet_url($id, $entite, $args, $ancre, $public, $type, $connect);
1996
+    if (!preg_match(',^\w+:,', $h)) {
1997
+        include_spip('inc/filtres_mini');
1998
+        $h = url_absolue($h);
1999
+    }
2001 2000
 
2002
-	return $h;
2001
+    return $h;
2003 2002
 }
2004 2003
 
2005 2004
 /**
@@ -2007,7 +2006,7 @@  discard block
 block discarded – undo
2007 2006
  * @see  generer_objet_url_absolue
2008 2007
  */
2009 2008
 function generer_url_entite_absolue($id = 0, $entite = '', $args = '', $ancre = '', $connect = null) {
2010
-	return generer_objet_url_absolue(intval($id), $entite, $args, $ancre, true, '', $connect);
2009
+    return generer_objet_url_absolue(intval($id), $entite, $args, $ancre, true, '', $connect);
2011 2010
 }
2012 2011
 
2013 2012
 
@@ -2023,11 +2022,11 @@  discard block
 block discarded – undo
2023 2022
  *     true si la valeur est considérée active ; false sinon.
2024 2023
  **/
2025 2024
 function test_valeur_serveur($truc) {
2026
-	if (!$truc) {
2027
-		return false;
2028
-	}
2025
+    if (!$truc) {
2026
+        return false;
2027
+    }
2029 2028
 
2030
-	return (strtolower($truc) !== 'off');
2029
+    return (strtolower($truc) !== 'off');
2031 2030
 }
2032 2031
 
2033 2032
 //
@@ -2055,82 +2054,82 @@  discard block
 block discarded – undo
2055 2054
  */
2056 2055
 function url_de_base($profondeur = null) {
2057 2056
 
2058
-	static $url = [];
2059
-	if (is_array($profondeur)) {
2060
-		return $url = $profondeur;
2061
-	}
2062
-	if ($profondeur === false) {
2063
-		return $url;
2064
-	}
2065
-
2066
-	if (is_null($profondeur)) {
2067
-		$profondeur = $GLOBALS['profondeur_url'] ?? (_DIR_RESTREINT ? 0 : 1);
2068
-	}
2069
-
2070
-	if (isset($url[$profondeur])) {
2071
-		return $url[$profondeur];
2072
-	}
2073
-
2074
-	$http = 'http';
2075
-
2076
-	if (
2077
-		isset($_SERVER['SCRIPT_URI'])
2078
-		and substr($_SERVER['SCRIPT_URI'], 0, 5) == 'https'
2079
-	) {
2080
-		$http = 'https';
2081
-	} elseif (
2082
-		isset($_SERVER['HTTPS'])
2083
-		and test_valeur_serveur($_SERVER['HTTPS'])
2084
-	) {
2085
-		$http = 'https';
2086
-	}
2087
-
2088
-	// note : HTTP_HOST contient le :port si necessaire
2089
-	$host = $_SERVER['HTTP_HOST'] ?? null;
2090
-	// si on n'a pas trouvé d'hôte du tout, en dernier recours on utilise adresse_site comme fallback
2091
-	if (is_null($host) and isset($GLOBALS['meta']['adresse_site'])) {
2092
-		$host = $GLOBALS['meta']['adresse_site'];
2093
-		if ($scheme = parse_url($host, PHP_URL_SCHEME)) {
2094
-			$http = $scheme;
2095
-			$host = str_replace("{$scheme}://", '', $host);
2096
-		}
2097
-	}
2098
-	if (
2099
-		isset($_SERVER['SERVER_PORT'])
2100
-		and $port = $_SERVER['SERVER_PORT']
2101
-		and strpos($host, ':') == false
2102
-	) {
2103
-		if (!defined('_PORT_HTTP_STANDARD')) {
2104
-			define('_PORT_HTTP_STANDARD', '80');
2105
-		}
2106
-		if (!defined('_PORT_HTTPS_STANDARD')) {
2107
-			define('_PORT_HTTPS_STANDARD', '443');
2108
-		}
2109
-		if ($http == 'http' and !in_array($port, explode(',', _PORT_HTTP_STANDARD))) {
2110
-			$host .= ":$port";
2111
-		}
2112
-		if ($http == 'https' and !in_array($port, explode(',', _PORT_HTTPS_STANDARD))) {
2113
-			$host .= ":$port";
2114
-		}
2115
-	}
2116
-
2117
-	if (!$GLOBALS['REQUEST_URI']) {
2118
-		if (isset($_SERVER['REQUEST_URI'])) {
2119
-			$GLOBALS['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
2120
-		} else {
2121
-			$GLOBALS['REQUEST_URI'] = (php_sapi_name() !== 'cli') ? $_SERVER['PHP_SELF'] : '';
2122
-			if (
2123
-				!empty($_SERVER['QUERY_STRING'])
2124
-				and !strpos($_SERVER['REQUEST_URI'], '?')
2125
-			) {
2126
-				$GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
2127
-			}
2128
-		}
2129
-	}
2130
-
2131
-	$url[$profondeur] = url_de_($http, $host, $GLOBALS['REQUEST_URI'], $profondeur);
2132
-
2133
-	return $url[$profondeur];
2057
+    static $url = [];
2058
+    if (is_array($profondeur)) {
2059
+        return $url = $profondeur;
2060
+    }
2061
+    if ($profondeur === false) {
2062
+        return $url;
2063
+    }
2064
+
2065
+    if (is_null($profondeur)) {
2066
+        $profondeur = $GLOBALS['profondeur_url'] ?? (_DIR_RESTREINT ? 0 : 1);
2067
+    }
2068
+
2069
+    if (isset($url[$profondeur])) {
2070
+        return $url[$profondeur];
2071
+    }
2072
+
2073
+    $http = 'http';
2074
+
2075
+    if (
2076
+        isset($_SERVER['SCRIPT_URI'])
2077
+        and substr($_SERVER['SCRIPT_URI'], 0, 5) == 'https'
2078
+    ) {
2079
+        $http = 'https';
2080
+    } elseif (
2081
+        isset($_SERVER['HTTPS'])
2082
+        and test_valeur_serveur($_SERVER['HTTPS'])
2083
+    ) {
2084
+        $http = 'https';
2085
+    }
2086
+
2087
+    // note : HTTP_HOST contient le :port si necessaire
2088
+    $host = $_SERVER['HTTP_HOST'] ?? null;
2089
+    // si on n'a pas trouvé d'hôte du tout, en dernier recours on utilise adresse_site comme fallback
2090
+    if (is_null($host) and isset($GLOBALS['meta']['adresse_site'])) {
2091
+        $host = $GLOBALS['meta']['adresse_site'];
2092
+        if ($scheme = parse_url($host, PHP_URL_SCHEME)) {
2093
+            $http = $scheme;
2094
+            $host = str_replace("{$scheme}://", '', $host);
2095
+        }
2096
+    }
2097
+    if (
2098
+        isset($_SERVER['SERVER_PORT'])
2099
+        and $port = $_SERVER['SERVER_PORT']
2100
+        and strpos($host, ':') == false
2101
+    ) {
2102
+        if (!defined('_PORT_HTTP_STANDARD')) {
2103
+            define('_PORT_HTTP_STANDARD', '80');
2104
+        }
2105
+        if (!defined('_PORT_HTTPS_STANDARD')) {
2106
+            define('_PORT_HTTPS_STANDARD', '443');
2107
+        }
2108
+        if ($http == 'http' and !in_array($port, explode(',', _PORT_HTTP_STANDARD))) {
2109
+            $host .= ":$port";
2110
+        }
2111
+        if ($http == 'https' and !in_array($port, explode(',', _PORT_HTTPS_STANDARD))) {
2112
+            $host .= ":$port";
2113
+        }
2114
+    }
2115
+
2116
+    if (!$GLOBALS['REQUEST_URI']) {
2117
+        if (isset($_SERVER['REQUEST_URI'])) {
2118
+            $GLOBALS['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
2119
+        } else {
2120
+            $GLOBALS['REQUEST_URI'] = (php_sapi_name() !== 'cli') ? $_SERVER['PHP_SELF'] : '';
2121
+            if (
2122
+                !empty($_SERVER['QUERY_STRING'])
2123
+                and !strpos($_SERVER['REQUEST_URI'], '?')
2124
+            ) {
2125
+                $GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
2126
+            }
2127
+        }
2128
+    }
2129
+
2130
+    $url[$profondeur] = url_de_($http, $host, $GLOBALS['REQUEST_URI'], $profondeur);
2131
+
2132
+    return $url[$profondeur];
2134 2133
 }
2135 2134
 
2136 2135
 /**
@@ -2143,26 +2142,26 @@  discard block
 block discarded – undo
2143 2142
  * @return string
2144 2143
  */
2145 2144
 function url_de_($http, $host, $request, $prof = 0) {
2146
-	$prof = max($prof, 0);
2145
+    $prof = max($prof, 0);
2147 2146
 
2148
-	$myself = ltrim($request, '/');
2149
-	# supprimer la chaine de GET
2150
-	[$myself] = explode('?', $myself);
2151
-	// vieux mode HTTP qui envoie après le nom de la methode l'URL compléte
2152
-	// protocole, "://", nom du serveur avant le path dans _SERVER["REQUEST_URI"]
2153
-	if (strpos($myself, '://') !== false) {
2154
-		$myself = explode('://', $myself);
2155
-		array_shift($myself);
2156
-		$myself = implode('://', $myself);
2157
-		$myself = explode('/', $myself);
2158
-		array_shift($myself);
2159
-		$myself = implode('/', $myself);
2160
-	}
2161
-	$url = join('/', array_slice(explode('/', $myself), 0, -1 - $prof)) . '/';
2147
+    $myself = ltrim($request, '/');
2148
+    # supprimer la chaine de GET
2149
+    [$myself] = explode('?', $myself);
2150
+    // vieux mode HTTP qui envoie après le nom de la methode l'URL compléte
2151
+    // protocole, "://", nom du serveur avant le path dans _SERVER["REQUEST_URI"]
2152
+    if (strpos($myself, '://') !== false) {
2153
+        $myself = explode('://', $myself);
2154
+        array_shift($myself);
2155
+        $myself = implode('://', $myself);
2156
+        $myself = explode('/', $myself);
2157
+        array_shift($myself);
2158
+        $myself = implode('/', $myself);
2159
+    }
2160
+    $url = join('/', array_slice(explode('/', $myself), 0, -1 - $prof)) . '/';
2162 2161
 
2163
-	$url = $http . '://' . rtrim($host, '/') . '/' . ltrim($url, '/');
2162
+    $url = $http . '://' . rtrim($host, '/') . '/' . ltrim($url, '/');
2164 2163
 
2165
-	return $url;
2164
+    return $url;
2166 2165
 }
2167 2166
 
2168 2167
 
@@ -2197,26 +2196,26 @@  discard block
 block discarded – undo
2197 2196
  * @return string URL
2198 2197
  **/
2199 2198
 function generer_url_ecrire(?string $script = '', $args = '', $no_entities = false, $rel = false) {
2200
-	$script ??= '';
2201
-	if (!$rel) {
2202
-		$rel = url_de_base() . _DIR_RESTREINT_ABS . _SPIP_ECRIRE_SCRIPT;
2203
-	} else {
2204
-		if (!is_string($rel)) {
2205
-			$rel = _DIR_RESTREINT ?: './' . _SPIP_ECRIRE_SCRIPT;
2206
-		}
2207
-	}
2208
-
2209
-	[$script, $ancre] = array_pad(explode('#', $script), 2, null);
2210
-	if ($script and ($script <> 'accueil' or $rel)) {
2211
-		$args = "?exec=$script" . (!$args ? '' : "&$args");
2212
-	} elseif ($args) {
2213
-		$args = "?$args";
2214
-	}
2215
-	if ($ancre) {
2216
-		$args .= "#$ancre";
2217
-	}
2218
-
2219
-	return $rel . ($no_entities ? $args : str_replace('&', '&amp;', $args));
2199
+    $script ??= '';
2200
+    if (!$rel) {
2201
+        $rel = url_de_base() . _DIR_RESTREINT_ABS . _SPIP_ECRIRE_SCRIPT;
2202
+    } else {
2203
+        if (!is_string($rel)) {
2204
+            $rel = _DIR_RESTREINT ?: './' . _SPIP_ECRIRE_SCRIPT;
2205
+        }
2206
+    }
2207
+
2208
+    [$script, $ancre] = array_pad(explode('#', $script), 2, null);
2209
+    if ($script and ($script <> 'accueil' or $rel)) {
2210
+        $args = "?exec=$script" . (!$args ? '' : "&$args");
2211
+    } elseif ($args) {
2212
+        $args = "?$args";
2213
+    }
2214
+    if ($ancre) {
2215
+        $args .= "#$ancre";
2216
+    }
2217
+
2218
+    return $rel . ($no_entities ? $args : str_replace('&', '&amp;', $args));
2220 2219
 }
2221 2220
 
2222 2221
 //
@@ -2238,15 +2237,15 @@  discard block
 block discarded – undo
2238 2237
  *     Nom du fichier (constante _SPIP_SCRIPT), sinon nom par défaut
2239 2238
  **/
2240 2239
 function get_spip_script($default = '') {
2241
-	if (!defined('_SPIP_SCRIPT')) {
2242
-		return 'spip.php';
2243
-	}
2244
-	# cas define('_SPIP_SCRIPT', '');
2245
-	if (_SPIP_SCRIPT) {
2246
-		return _SPIP_SCRIPT;
2247
-	} else {
2248
-		return $default;
2249
-	}
2240
+    if (!defined('_SPIP_SCRIPT')) {
2241
+        return 'spip.php';
2242
+    }
2243
+    # cas define('_SPIP_SCRIPT', '');
2244
+    if (_SPIP_SCRIPT) {
2245
+        return _SPIP_SCRIPT;
2246
+    } else {
2247
+        return $default;
2248
+    }
2250 2249
 }
2251 2250
 
2252 2251
 /**
@@ -2275,45 +2274,45 @@  discard block
 block discarded – undo
2275 2274
  * @return string URL
2276 2275
  **/
2277 2276
 function generer_url_public($script = '', $args = '', $no_entities = false, $rel = true, $action = '') {
2278
-	// si le script est une action (spip_pass, spip_inscription),
2279
-	// standardiser vers la nouvelle API
2280
-
2281
-	if (is_array($args)) {
2282
-		$args = http_build_query($args);
2283
-	}
2284
-
2285
-	$url = '';
2286
-	if ($f = charger_fonction_url('page')) {
2287
-		$url = $f($script, $args);
2288
-		if ($url and !$rel) {
2289
-			include_spip('inc/filtres_mini');
2290
-			$url = url_absolue($url);
2291
-		}
2292
-	}
2293
-	if (!$url) {
2294
-		if (!$action) {
2295
-			$action = get_spip_script();
2296
-		}
2297
-		if ($script) {
2298
-			$action = parametre_url($action, _SPIP_PAGE, $script, '&');
2299
-		}
2300
-		if ($args) {
2301
-			$action .= (strpos($action, '?') !== false ? '&' : '?') . $args;
2302
-		}
2303
-		// ne pas generer une url avec /./?page= en cas d'url absolue et de _SPIP_SCRIPT vide
2304
-		$url = ($rel ? _DIR_RACINE . $action : rtrim(url_de_base(), '/') . preg_replace(',^/[.]/,', '/', "/$action"));
2305
-	}
2306
-
2307
-	if (!$no_entities) {
2308
-		$url = quote_amp($url);
2309
-	}
2310
-
2311
-	return $url;
2277
+    // si le script est une action (spip_pass, spip_inscription),
2278
+    // standardiser vers la nouvelle API
2279
+
2280
+    if (is_array($args)) {
2281
+        $args = http_build_query($args);
2282
+    }
2283
+
2284
+    $url = '';
2285
+    if ($f = charger_fonction_url('page')) {
2286
+        $url = $f($script, $args);
2287
+        if ($url and !$rel) {
2288
+            include_spip('inc/filtres_mini');
2289
+            $url = url_absolue($url);
2290
+        }
2291
+    }
2292
+    if (!$url) {
2293
+        if (!$action) {
2294
+            $action = get_spip_script();
2295
+        }
2296
+        if ($script) {
2297
+            $action = parametre_url($action, _SPIP_PAGE, $script, '&');
2298
+        }
2299
+        if ($args) {
2300
+            $action .= (strpos($action, '?') !== false ? '&' : '?') . $args;
2301
+        }
2302
+        // ne pas generer une url avec /./?page= en cas d'url absolue et de _SPIP_SCRIPT vide
2303
+        $url = ($rel ? _DIR_RACINE . $action : rtrim(url_de_base(), '/') . preg_replace(',^/[.]/,', '/', "/$action"));
2304
+    }
2305
+
2306
+    if (!$no_entities) {
2307
+        $url = quote_amp($url);
2308
+    }
2309
+
2310
+    return $url;
2312 2311
 }
2313 2312
 
2314 2313
 function generer_url_prive($script, $args = '', $no_entities = false) {
2315 2314
 
2316
-	return generer_url_public($script, $args, $no_entities, false, _DIR_RESTREINT_ABS . 'prive.php');
2315
+    return generer_url_public($script, $args, $no_entities, false, _DIR_RESTREINT_ABS . 'prive.php');
2317 2316
 }
2318 2317
 
2319 2318
 // Pour les formulaires en methode POST,
@@ -2338,19 +2337,19 @@  discard block
 block discarded – undo
2338 2337
  **/
2339 2338
 function generer_form_ecrire($script, $corps, $atts = '', $submit = '') {
2340 2339
 
2341
-	$script1 = explode('&', $script);
2342
-	$script1 = reset($script1);
2340
+    $script1 = explode('&', $script);
2341
+    $script1 = reset($script1);
2343 2342
 
2344
-	return "<form action='"
2345
-	. ($script ? generer_url_ecrire($script) : '')
2346
-	. "' "
2347
-	. ($atts ?: " method='post'")
2348
-	. "><div>\n"
2349
-	. "<input type='hidden' name='exec' value='$script1' />"
2350
-	. $corps
2351
-	. (!$submit ? '' :
2352
-		("<div style='text-align: " . $GLOBALS['spip_lang_right'] . "'><input class='fondo submit btn' type='submit' value=\"" . entites_html($submit) . '" /></div>'))
2353
-	. "</div></form>\n";
2343
+    return "<form action='"
2344
+    . ($script ? generer_url_ecrire($script) : '')
2345
+    . "' "
2346
+    . ($atts ?: " method='post'")
2347
+    . "><div>\n"
2348
+    . "<input type='hidden' name='exec' value='$script1' />"
2349
+    . $corps
2350
+    . (!$submit ? '' :
2351
+        ("<div style='text-align: " . $GLOBALS['spip_lang_right'] . "'><input class='fondo submit btn' type='submit' value=\"" . entites_html($submit) . '" /></div>'))
2352
+    . "</div></form>\n";
2354 2353
 }
2355 2354
 
2356 2355
 /**
@@ -2367,22 +2366,22 @@  discard block
 block discarded – undo
2367 2366
  * @return string
2368 2367
  */
2369 2368
 function generer_form_action($script, $corps, $atts = '', $public = false) {
2370
-	// si l'on est dans l'espace prive, on garde dans l'url
2371
-	// l'exec a l'origine de l'action, qui permet de savoir si il est necessaire
2372
-	// ou non de proceder a l'authentification (cas typique de l'install par exemple)
2373
-	$h = (_DIR_RACINE and !$public)
2374
-		? generer_url_ecrire(_request('exec'))
2375
-		: generer_url_public();
2369
+    // si l'on est dans l'espace prive, on garde dans l'url
2370
+    // l'exec a l'origine de l'action, qui permet de savoir si il est necessaire
2371
+    // ou non de proceder a l'authentification (cas typique de l'install par exemple)
2372
+    $h = (_DIR_RACINE and !$public)
2373
+        ? generer_url_ecrire(_request('exec'))
2374
+        : generer_url_public();
2376 2375
 
2377
-	return "\n<form action='" .
2378
-	$h .
2379
-	"'" .
2380
-	$atts .
2381
-	">\n" .
2382
-	'<div>' .
2383
-	"\n<input type='hidden' name='action' value='$script' />" .
2384
-	$corps .
2385
-	'</div></form>';
2376
+    return "\n<form action='" .
2377
+    $h .
2378
+    "'" .
2379
+    $atts .
2380
+    ">\n" .
2381
+    '<div>' .
2382
+    "\n<input type='hidden' name='action' value='$script' />" .
2383
+    $corps .
2384
+    '</div></form>';
2386 2385
 }
2387 2386
 
2388 2387
 /**
@@ -2401,22 +2400,22 @@  discard block
 block discarded – undo
2401 2400
  *     URL
2402 2401
  */
2403 2402
 function generer_url_action($script, $args = '', $no_entities = false, $public = false) {
2404
-	// si l'on est dans l'espace prive, on garde dans l'url
2405
-	// l'exec a l'origine de l'action, qui permet de savoir si il est necessaire
2406
-	// ou non de proceder a l'authentification (cas typique de l'install par exemple)
2407
-	$url = (_DIR_RACINE and !$public)
2408
-		? generer_url_ecrire(_request('exec'))
2409
-		: generer_url_public('', '', false, false);
2410
-	$url = parametre_url($url, 'action', $script);
2411
-	if ($args) {
2412
-		$url .= quote_amp('&' . $args);
2413
-	}
2403
+    // si l'on est dans l'espace prive, on garde dans l'url
2404
+    // l'exec a l'origine de l'action, qui permet de savoir si il est necessaire
2405
+    // ou non de proceder a l'authentification (cas typique de l'install par exemple)
2406
+    $url = (_DIR_RACINE and !$public)
2407
+        ? generer_url_ecrire(_request('exec'))
2408
+        : generer_url_public('', '', false, false);
2409
+    $url = parametre_url($url, 'action', $script);
2410
+    if ($args) {
2411
+        $url .= quote_amp('&' . $args);
2412
+    }
2414 2413
 
2415
-	if ($no_entities) {
2416
-		$url = str_replace('&amp;', '&', $url);
2417
-	}
2414
+    if ($no_entities) {
2415
+        $url = str_replace('&amp;', '&', $url);
2416
+    }
2418 2417
 
2419
-	return $url;
2418
+    return $url;
2420 2419
 }
2421 2420
 
2422 2421
 
@@ -2435,23 +2434,23 @@  discard block
 block discarded – undo
2435 2434
  *     URL
2436 2435
  */
2437 2436
 function generer_url_api(string $script, string $path, string $args, bool $no_entities = false, ?bool $public = null) {
2438
-	if (is_null($public)) {
2439
-		$public = (_DIR_RACINE ? false : '');
2440
-	}
2441
-	if (substr($script, -4) !== '.api') {
2442
-		$script .= '.api';
2443
-	}
2444
-	$url =
2445
-		(($public ? _DIR_RACINE : _DIR_RESTREINT) ?: './')
2446
-	. $script . '/'
2447
-	. ($path ? trim($path, '/') : '')
2448
-	. ($args ? '?' . quote_amp($args) : '');
2437
+    if (is_null($public)) {
2438
+        $public = (_DIR_RACINE ? false : '');
2439
+    }
2440
+    if (substr($script, -4) !== '.api') {
2441
+        $script .= '.api';
2442
+    }
2443
+    $url =
2444
+        (($public ? _DIR_RACINE : _DIR_RESTREINT) ?: './')
2445
+    . $script . '/'
2446
+    . ($path ? trim($path, '/') : '')
2447
+    . ($args ? '?' . quote_amp($args) : '');
2449 2448
 
2450
-	if ($no_entities) {
2451
-		$url = str_replace('&amp;', '&', $url);
2452
-	}
2449
+    if ($no_entities) {
2450
+        $url = str_replace('&amp;', '&', $url);
2451
+    }
2453 2452
 
2454
-	return $url;
2453
+    return $url;
2455 2454
 }
2456 2455
 
2457 2456
 
@@ -2464,8 +2463,8 @@  discard block
 block discarded – undo
2464 2463
  * @param string $ta Répertoire temporaire accessible
2465 2464
  */
2466 2465
 function spip_initialisation($pi = null, $pa = null, $ti = null, $ta = null) {
2467
-	spip_initialisation_core($pi, $pa, $ti, $ta);
2468
-	spip_initialisation_suite();
2466
+    spip_initialisation_core($pi, $pa, $ti, $ta);
2467
+    spip_initialisation_suite();
2469 2468
 }
2470 2469
 
2471 2470
 /**
@@ -2485,310 +2484,310 @@  discard block
 block discarded – undo
2485 2484
  * @param string $ta Répertoire temporaire accessible
2486 2485
  */
2487 2486
 function spip_initialisation_core($pi = null, $pa = null, $ti = null, $ta = null) {
2488
-	static $too_late = 0;
2489
-	if ($too_late++) {
2490
-		return;
2491
-	}
2492
-
2493
-	// Declaration des repertoires
2494
-
2495
-	// le nom du repertoire plugins/ activables/desactivables
2496
-	if (!defined('_DIR_PLUGINS')) {
2497
-		define('_DIR_PLUGINS', _DIR_RACINE . 'plugins/');
2498
-	}
2499
-
2500
-	// le nom du repertoire des extensions/ permanentes du core, toujours actives
2501
-	if (!defined('_DIR_PLUGINS_DIST')) {
2502
-		define('_DIR_PLUGINS_DIST', _DIR_RACINE . 'plugins-dist/');
2503
-	}
2504
-
2505
-	// le nom du repertoire des librairies
2506
-	if (!defined('_DIR_LIB')) {
2507
-		define('_DIR_LIB', _DIR_RACINE . 'lib/');
2508
-	}
2509
-
2510
-	if (!defined('_DIR_IMG')) {
2511
-		define('_DIR_IMG', $pa);
2512
-	}
2513
-	if (!defined('_DIR_LOGOS')) {
2514
-		define('_DIR_LOGOS', $pa);
2515
-	}
2516
-	if (!defined('_DIR_IMG_ICONES')) {
2517
-		define('_DIR_IMG_ICONES', _DIR_LOGOS . 'icones/');
2518
-	}
2519
-
2520
-	if (!defined('_DIR_DUMP')) {
2521
-		define('_DIR_DUMP', $ti . 'dump/');
2522
-	}
2523
-	if (!defined('_DIR_SESSIONS')) {
2524
-		define('_DIR_SESSIONS', $ti . 'sessions/');
2525
-	}
2526
-	if (!defined('_DIR_TRANSFERT')) {
2527
-		define('_DIR_TRANSFERT', $ti . 'upload/');
2528
-	}
2529
-	if (!defined('_DIR_CACHE')) {
2530
-		define('_DIR_CACHE', $ti . 'cache/');
2531
-	}
2532
-	if (!defined('_DIR_CACHE_XML')) {
2533
-		define('_DIR_CACHE_XML', _DIR_CACHE . 'xml/');
2534
-	}
2535
-	if (!defined('_DIR_SKELS')) {
2536
-		define('_DIR_SKELS', _DIR_CACHE . 'skel/');
2537
-	}
2538
-	if (!defined('_DIR_AIDE')) {
2539
-		define('_DIR_AIDE', _DIR_CACHE . 'aide/');
2540
-	}
2541
-	if (!defined('_DIR_TMP')) {
2542
-		define('_DIR_TMP', $ti);
2543
-	}
2544
-
2545
-	if (!defined('_DIR_VAR')) {
2546
-		define('_DIR_VAR', $ta);
2547
-	}
2548
-
2549
-	if (!defined('_DIR_ETC')) {
2550
-		define('_DIR_ETC', $pi);
2551
-	}
2552
-	if (!defined('_DIR_CONNECT')) {
2553
-		define('_DIR_CONNECT', $pi);
2554
-	}
2555
-	if (!defined('_DIR_CHMOD')) {
2556
-		define('_DIR_CHMOD', $pi);
2557
-	}
2558
-
2559
-	if (!isset($GLOBALS['test_dirs'])) {
2560
-		// Pas $pi car il est bon de le mettre hors ecriture apres intstall
2561
-		// il sera rajoute automatiquement si besoin a l'etape 2 de l'install
2562
-	$GLOBALS['test_dirs'] = [$pa, $ti, $ta];
2563
-	}
2564
-
2565
-	// Declaration des fichiers
2566
-
2567
-	if (!defined('_CACHE_PLUGINS_PATH')) {
2568
-		define('_CACHE_PLUGINS_PATH', _DIR_CACHE . 'charger_plugins_chemins.php');
2569
-	}
2570
-	if (!defined('_CACHE_PLUGINS_OPT')) {
2571
-		define('_CACHE_PLUGINS_OPT', _DIR_CACHE . 'charger_plugins_options.php');
2572
-	}
2573
-	if (!defined('_CACHE_PLUGINS_FCT')) {
2574
-		define('_CACHE_PLUGINS_FCT', _DIR_CACHE . 'charger_plugins_fonctions.php');
2575
-	}
2576
-	if (!defined('_CACHE_PIPELINES')) {
2577
-		define('_CACHE_PIPELINES', _DIR_CACHE . 'charger_pipelines.php');
2578
-	}
2579
-	if (!defined('_CACHE_CHEMIN')) {
2580
-		define('_CACHE_CHEMIN', _DIR_CACHE . 'chemin.txt');
2581
-	}
2582
-
2583
-	# attention .php obligatoire pour ecrire_fichier_securise
2584
-	if (!defined('_FILE_META')) {
2585
-		define('_FILE_META', $ti . 'meta_cache.php');
2586
-	}
2587
-	if (!defined('_DIR_LOG')) {
2588
-		define('_DIR_LOG', _DIR_TMP . 'log/');
2589
-	}
2590
-	if (!defined('_FILE_LOG')) {
2591
-		define('_FILE_LOG', 'spip');
2592
-	}
2593
-	if (!defined('_FILE_LOG_SUFFIX')) {
2594
-		define('_FILE_LOG_SUFFIX', '.log');
2595
-	}
2596
-
2597
-	// Le fichier de connexion a la base de donnees
2598
-	// tient compte des anciennes versions (inc_connect...)
2599
-	if (!defined('_FILE_CONNECT_INS')) {
2600
-		define('_FILE_CONNECT_INS', 'connect');
2601
-	}
2602
-	if (!defined('_FILE_CONNECT')) {
2603
-		define(
2604
-			'_FILE_CONNECT',
2605
-			(@is_readable($f = _DIR_CONNECT . _FILE_CONNECT_INS . '.php') ? $f
2606
-			: (@is_readable($f = _DIR_RESTREINT . 'inc_connect.php') ? $f
2607
-			: false))
2608
-		);
2609
-	}
2610
-
2611
-	// Le fichier de reglages des droits
2612
-	if (!defined('_FILE_CHMOD_INS')) {
2613
-		define('_FILE_CHMOD_INS', 'chmod');
2614
-	}
2615
-	if (!defined('_FILE_CHMOD')) {
2616
-		define(
2617
-			'_FILE_CHMOD',
2618
-			(@is_readable($f = _DIR_CHMOD . _FILE_CHMOD_INS . '.php') ? $f
2619
-			: false)
2620
-		);
2621
-	}
2622
-
2623
-	if (!defined('_FILE_LDAP')) {
2624
-		define('_FILE_LDAP', 'ldap.php');
2625
-	}
2626
-
2627
-	if (!defined('_FILE_TMP_SUFFIX')) {
2628
-		define('_FILE_TMP_SUFFIX', '.tmp.php');
2629
-	}
2630
-	if (!defined('_FILE_CONNECT_TMP')) {
2631
-		define('_FILE_CONNECT_TMP', _DIR_CONNECT . _FILE_CONNECT_INS . _FILE_TMP_SUFFIX);
2632
-	}
2633
-	if (!defined('_FILE_CHMOD_TMP')) {
2634
-		define('_FILE_CHMOD_TMP', _DIR_CHMOD . _FILE_CHMOD_INS . _FILE_TMP_SUFFIX);
2635
-	}
2636
-
2637
-	// Definition des droits d'acces en ecriture
2638
-	if (!defined('_SPIP_CHMOD') and _FILE_CHMOD) {
2639
-		include_once _FILE_CHMOD;
2640
-	}
2641
-
2642
-	// Se mefier des fichiers mal remplis!
2643
-	if (!defined('_SPIP_CHMOD')) {
2644
-		define('_SPIP_CHMOD', 0777);
2645
-	}
2646
-
2647
-	if (!defined('_DEFAULT_CHARSET')) {
2648
-		/** Le charset par défaut lors de l'installation */
2649
-		define('_DEFAULT_CHARSET', 'utf-8');
2650
-	}
2651
-	if (!defined('_ROOT_PLUGINS')) {
2652
-		define('_ROOT_PLUGINS', _ROOT_RACINE . 'plugins/');
2653
-	}
2654
-	if (!defined('_ROOT_PLUGINS_DIST')) {
2655
-		define('_ROOT_PLUGINS_DIST', _ROOT_RACINE . 'plugins-dist/');
2656
-	}
2657
-	if (!defined('_ROOT_PLUGINS_SUPPL') && defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) {
2658
-		define('_ROOT_PLUGINS_SUPPL', _ROOT_RACINE . str_replace(_DIR_RACINE, '', _DIR_PLUGINS_SUPPL));
2659
-	}
2660
-
2661
-	// La taille des Log
2662
-	if (!defined('_MAX_LOG')) {
2663
-		define('_MAX_LOG', 100);
2664
-	}
2665
-
2666
-	// Sommes-nous dans l'empire du Mal ?
2667
-	// (ou sous le signe du Pingouin, ascendant GNU ?)
2668
-	if (isset($_SERVER['SERVER_SOFTWARE']) and strpos($_SERVER['SERVER_SOFTWARE'], '(Win') !== false) {
2669
-		if (!defined('_OS_SERVEUR')) {
2670
-			define('_OS_SERVEUR', 'windows');
2671
-		}
2672
-		if (!defined('_SPIP_LOCK_MODE')) {
2673
-			define('_SPIP_LOCK_MODE', 1);
2674
-		} // utiliser le flock php
2675
-	} else {
2676
-		if (!defined('_OS_SERVEUR')) {
2677
-			define('_OS_SERVEUR', '');
2678
-		}
2679
-		if (!defined('_SPIP_LOCK_MODE')) {
2680
-			define('_SPIP_LOCK_MODE', 1);
2681
-		} // utiliser le flock php
2682
-		#if (!defined('_SPIP_LOCK_MODE')) define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip mais link() est tres souvent interdite
2683
-	}
2684
-
2685
-	// Langue par defaut
2686
-	if (!defined('_LANGUE_PAR_DEFAUT')) {
2687
-		define('_LANGUE_PAR_DEFAUT', 'fr');
2688
-	}
2689
-
2690
-	//
2691
-	// Module de lecture/ecriture/suppression de fichiers utilisant flock()
2692
-	// (non surchargeable en l'etat ; attention si on utilise include_spip()
2693
-	// pour le rendre surchargeable, on va provoquer un reecriture
2694
-	// systematique du noyau ou une baisse de perfs => a etudier)
2695
-	include_once _ROOT_RESTREINT . 'inc/flock.php';
2696
-
2697
-	// charger tout de suite le path et son cache
2698
-	load_path_cache();
2699
-
2700
-	// *********** traiter les variables ************
2701
-
2702
-	//
2703
-	// Securite
2704
-	//
2705
-
2706
-	// Ne pas se faire manger par un bug php qui accepte ?GLOBALS[truc]=toto
2707
-	if (isset($_REQUEST['GLOBALS'])) {
2708
-		die();
2709
-	}
2710
-	// nettoyer les magic quotes \' et les caracteres nuls %00
2711
-	spip_desinfecte($_GET);
2712
-	spip_desinfecte($_POST);
2713
-	spip_desinfecte($_COOKIE);
2714
-	spip_desinfecte($_REQUEST);
2715
-
2716
-	// appliquer le cookie_prefix
2717
-	if ($GLOBALS['cookie_prefix'] != 'spip') {
2718
-		include_spip('inc/cookie');
2719
-		recuperer_cookies_spip($GLOBALS['cookie_prefix']);
2720
-	}
2721
-
2722
-	// Compatibilite avec serveurs ne fournissant pas $REQUEST_URI
2723
-	if (isset($_SERVER['REQUEST_URI'])) {
2724
-		$GLOBALS['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
2725
-	} else {
2726
-		$GLOBALS['REQUEST_URI'] = (php_sapi_name() !== 'cli') ? $_SERVER['PHP_SELF'] : '';
2727
-		if (
2728
-			!empty($_SERVER['QUERY_STRING'])
2729
-			and !strpos($_SERVER['REQUEST_URI'], '?')
2730
-		) {
2731
-			$GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
2732
-		}
2733
-	}
2734
-
2735
-	// Duree de validite de l'alea pour les cookies et ce qui s'ensuit.
2736
-	if (!defined('_RENOUVELLE_ALEA')) {
2737
-		define('_RENOUVELLE_ALEA', 12 * 3600);
2738
-	}
2739
-	if (!defined('_DUREE_COOKIE_ADMIN')) {
2740
-		define('_DUREE_COOKIE_ADMIN', 14 * 24 * 3600);
2741
-	}
2742
-
2743
-	// charger les meta si possible et renouveller l'alea au besoin
2744
-	// charge aussi effacer_meta et ecrire_meta
2745
-	$inc_meta = charger_fonction('meta', 'inc');
2746
-	$inc_meta();
2747
-
2748
-	// nombre de repertoires depuis la racine
2749
-	// on compare a l'adresse de spip.php : $_SERVER["SCRIPT_NAME"]
2750
-	// ou a defaut celle donnee en meta ; (mais si celle-ci est fausse
2751
-	// le calcul est faux)
2752
-	if (!_DIR_RESTREINT) {
2753
-		$GLOBALS['profondeur_url'] = 1;
2754
-	} else {
2755
-		$uri = isset($_SERVER['REQUEST_URI']) ? explode('?', $_SERVER['REQUEST_URI']) : '';
2756
-		$uri_ref = $_SERVER['SCRIPT_NAME'];
2757
-		if (
2758
-			!$uri_ref
2759
-			// si on est appele avec un autre ti, on est sans doute en mutu
2760
-			// si jamais c'est de la mutu avec sous rep, on est perdu si on se fie
2761
-			// a spip.php qui est a la racine du spip, et vue qu'on sait pas se reperer
2762
-			// s'en remettre a l'adresse du site. alea jacta est.
2763
-			or $ti !== _NOM_TEMPORAIRES_INACCESSIBLES
2764
-		) {
2765
-			if (isset($GLOBALS['meta']['adresse_site'])) {
2766
-				$uri_ref = parse_url($GLOBALS['meta']['adresse_site']);
2767
-				$uri_ref = ($uri_ref['path'] ?? '') . '/';
2768
-			} else {
2769
-				$uri_ref = '';
2770
-			}
2771
-		}
2772
-		if (!$uri or !$uri_ref) {
2773
-			$GLOBALS['profondeur_url'] = 0;
2774
-		} else {
2775
-			$GLOBALS['profondeur_url'] = max(
2776
-				0,
2777
-				substr_count($uri[0], '/')
2778
-				- substr_count($uri_ref, '/')
2779
-			);
2780
-		}
2781
-	}
2782
-	// s'il y a un cookie ou PHP_AUTH, initialiser visiteur_session
2783
-	if (_FILE_CONNECT) {
2784
-		if (
2785
-			verifier_visiteur() == '0minirezo'
2786
-			// si c'est un admin sans cookie admin, il faut ignorer le cache chemin !
2787
-			and !isset($_COOKIE['spip_admin'])
2788
-		) {
2789
-			clear_path_cache();
2790
-		}
2791
-	}
2487
+    static $too_late = 0;
2488
+    if ($too_late++) {
2489
+        return;
2490
+    }
2491
+
2492
+    // Declaration des repertoires
2493
+
2494
+    // le nom du repertoire plugins/ activables/desactivables
2495
+    if (!defined('_DIR_PLUGINS')) {
2496
+        define('_DIR_PLUGINS', _DIR_RACINE . 'plugins/');
2497
+    }
2498
+
2499
+    // le nom du repertoire des extensions/ permanentes du core, toujours actives
2500
+    if (!defined('_DIR_PLUGINS_DIST')) {
2501
+        define('_DIR_PLUGINS_DIST', _DIR_RACINE . 'plugins-dist/');
2502
+    }
2503
+
2504
+    // le nom du repertoire des librairies
2505
+    if (!defined('_DIR_LIB')) {
2506
+        define('_DIR_LIB', _DIR_RACINE . 'lib/');
2507
+    }
2508
+
2509
+    if (!defined('_DIR_IMG')) {
2510
+        define('_DIR_IMG', $pa);
2511
+    }
2512
+    if (!defined('_DIR_LOGOS')) {
2513
+        define('_DIR_LOGOS', $pa);
2514
+    }
2515
+    if (!defined('_DIR_IMG_ICONES')) {
2516
+        define('_DIR_IMG_ICONES', _DIR_LOGOS . 'icones/');
2517
+    }
2518
+
2519
+    if (!defined('_DIR_DUMP')) {
2520
+        define('_DIR_DUMP', $ti . 'dump/');
2521
+    }
2522
+    if (!defined('_DIR_SESSIONS')) {
2523
+        define('_DIR_SESSIONS', $ti . 'sessions/');
2524
+    }
2525
+    if (!defined('_DIR_TRANSFERT')) {
2526
+        define('_DIR_TRANSFERT', $ti . 'upload/');
2527
+    }
2528
+    if (!defined('_DIR_CACHE')) {
2529
+        define('_DIR_CACHE', $ti . 'cache/');
2530
+    }
2531
+    if (!defined('_DIR_CACHE_XML')) {
2532
+        define('_DIR_CACHE_XML', _DIR_CACHE . 'xml/');
2533
+    }
2534
+    if (!defined('_DIR_SKELS')) {
2535
+        define('_DIR_SKELS', _DIR_CACHE . 'skel/');
2536
+    }
2537
+    if (!defined('_DIR_AIDE')) {
2538
+        define('_DIR_AIDE', _DIR_CACHE . 'aide/');
2539
+    }
2540
+    if (!defined('_DIR_TMP')) {
2541
+        define('_DIR_TMP', $ti);
2542
+    }
2543
+
2544
+    if (!defined('_DIR_VAR')) {
2545
+        define('_DIR_VAR', $ta);
2546
+    }
2547
+
2548
+    if (!defined('_DIR_ETC')) {
2549
+        define('_DIR_ETC', $pi);
2550
+    }
2551
+    if (!defined('_DIR_CONNECT')) {
2552
+        define('_DIR_CONNECT', $pi);
2553
+    }
2554
+    if (!defined('_DIR_CHMOD')) {
2555
+        define('_DIR_CHMOD', $pi);
2556
+    }
2557
+
2558
+    if (!isset($GLOBALS['test_dirs'])) {
2559
+        // Pas $pi car il est bon de le mettre hors ecriture apres intstall
2560
+        // il sera rajoute automatiquement si besoin a l'etape 2 de l'install
2561
+    $GLOBALS['test_dirs'] = [$pa, $ti, $ta];
2562
+    }
2563
+
2564
+    // Declaration des fichiers
2565
+
2566
+    if (!defined('_CACHE_PLUGINS_PATH')) {
2567
+        define('_CACHE_PLUGINS_PATH', _DIR_CACHE . 'charger_plugins_chemins.php');
2568
+    }
2569
+    if (!defined('_CACHE_PLUGINS_OPT')) {
2570
+        define('_CACHE_PLUGINS_OPT', _DIR_CACHE . 'charger_plugins_options.php');
2571
+    }
2572
+    if (!defined('_CACHE_PLUGINS_FCT')) {
2573
+        define('_CACHE_PLUGINS_FCT', _DIR_CACHE . 'charger_plugins_fonctions.php');
2574
+    }
2575
+    if (!defined('_CACHE_PIPELINES')) {
2576
+        define('_CACHE_PIPELINES', _DIR_CACHE . 'charger_pipelines.php');
2577
+    }
2578
+    if (!defined('_CACHE_CHEMIN')) {
2579
+        define('_CACHE_CHEMIN', _DIR_CACHE . 'chemin.txt');
2580
+    }
2581
+
2582
+    # attention .php obligatoire pour ecrire_fichier_securise
2583
+    if (!defined('_FILE_META')) {
2584
+        define('_FILE_META', $ti . 'meta_cache.php');
2585
+    }
2586
+    if (!defined('_DIR_LOG')) {
2587
+        define('_DIR_LOG', _DIR_TMP . 'log/');
2588
+    }
2589
+    if (!defined('_FILE_LOG')) {
2590
+        define('_FILE_LOG', 'spip');
2591
+    }
2592
+    if (!defined('_FILE_LOG_SUFFIX')) {
2593
+        define('_FILE_LOG_SUFFIX', '.log');
2594
+    }
2595
+
2596
+    // Le fichier de connexion a la base de donnees
2597
+    // tient compte des anciennes versions (inc_connect...)
2598
+    if (!defined('_FILE_CONNECT_INS')) {
2599
+        define('_FILE_CONNECT_INS', 'connect');
2600
+    }
2601
+    if (!defined('_FILE_CONNECT')) {
2602
+        define(
2603
+            '_FILE_CONNECT',
2604
+            (@is_readable($f = _DIR_CONNECT . _FILE_CONNECT_INS . '.php') ? $f
2605
+            : (@is_readable($f = _DIR_RESTREINT . 'inc_connect.php') ? $f
2606
+            : false))
2607
+        );
2608
+    }
2609
+
2610
+    // Le fichier de reglages des droits
2611
+    if (!defined('_FILE_CHMOD_INS')) {
2612
+        define('_FILE_CHMOD_INS', 'chmod');
2613
+    }
2614
+    if (!defined('_FILE_CHMOD')) {
2615
+        define(
2616
+            '_FILE_CHMOD',
2617
+            (@is_readable($f = _DIR_CHMOD . _FILE_CHMOD_INS . '.php') ? $f
2618
+            : false)
2619
+        );
2620
+    }
2621
+
2622
+    if (!defined('_FILE_LDAP')) {
2623
+        define('_FILE_LDAP', 'ldap.php');
2624
+    }
2625
+
2626
+    if (!defined('_FILE_TMP_SUFFIX')) {
2627
+        define('_FILE_TMP_SUFFIX', '.tmp.php');
2628
+    }
2629
+    if (!defined('_FILE_CONNECT_TMP')) {
2630
+        define('_FILE_CONNECT_TMP', _DIR_CONNECT . _FILE_CONNECT_INS . _FILE_TMP_SUFFIX);
2631
+    }
2632
+    if (!defined('_FILE_CHMOD_TMP')) {
2633
+        define('_FILE_CHMOD_TMP', _DIR_CHMOD . _FILE_CHMOD_INS . _FILE_TMP_SUFFIX);
2634
+    }
2635
+
2636
+    // Definition des droits d'acces en ecriture
2637
+    if (!defined('_SPIP_CHMOD') and _FILE_CHMOD) {
2638
+        include_once _FILE_CHMOD;
2639
+    }
2640
+
2641
+    // Se mefier des fichiers mal remplis!
2642
+    if (!defined('_SPIP_CHMOD')) {
2643
+        define('_SPIP_CHMOD', 0777);
2644
+    }
2645
+
2646
+    if (!defined('_DEFAULT_CHARSET')) {
2647
+        /** Le charset par défaut lors de l'installation */
2648
+        define('_DEFAULT_CHARSET', 'utf-8');
2649
+    }
2650
+    if (!defined('_ROOT_PLUGINS')) {
2651
+        define('_ROOT_PLUGINS', _ROOT_RACINE . 'plugins/');
2652
+    }
2653
+    if (!defined('_ROOT_PLUGINS_DIST')) {
2654
+        define('_ROOT_PLUGINS_DIST', _ROOT_RACINE . 'plugins-dist/');
2655
+    }
2656
+    if (!defined('_ROOT_PLUGINS_SUPPL') && defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) {
2657
+        define('_ROOT_PLUGINS_SUPPL', _ROOT_RACINE . str_replace(_DIR_RACINE, '', _DIR_PLUGINS_SUPPL));
2658
+    }
2659
+
2660
+    // La taille des Log
2661
+    if (!defined('_MAX_LOG')) {
2662
+        define('_MAX_LOG', 100);
2663
+    }
2664
+
2665
+    // Sommes-nous dans l'empire du Mal ?
2666
+    // (ou sous le signe du Pingouin, ascendant GNU ?)
2667
+    if (isset($_SERVER['SERVER_SOFTWARE']) and strpos($_SERVER['SERVER_SOFTWARE'], '(Win') !== false) {
2668
+        if (!defined('_OS_SERVEUR')) {
2669
+            define('_OS_SERVEUR', 'windows');
2670
+        }
2671
+        if (!defined('_SPIP_LOCK_MODE')) {
2672
+            define('_SPIP_LOCK_MODE', 1);
2673
+        } // utiliser le flock php
2674
+    } else {
2675
+        if (!defined('_OS_SERVEUR')) {
2676
+            define('_OS_SERVEUR', '');
2677
+        }
2678
+        if (!defined('_SPIP_LOCK_MODE')) {
2679
+            define('_SPIP_LOCK_MODE', 1);
2680
+        } // utiliser le flock php
2681
+        #if (!defined('_SPIP_LOCK_MODE')) define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip mais link() est tres souvent interdite
2682
+    }
2683
+
2684
+    // Langue par defaut
2685
+    if (!defined('_LANGUE_PAR_DEFAUT')) {
2686
+        define('_LANGUE_PAR_DEFAUT', 'fr');
2687
+    }
2688
+
2689
+    //
2690
+    // Module de lecture/ecriture/suppression de fichiers utilisant flock()
2691
+    // (non surchargeable en l'etat ; attention si on utilise include_spip()
2692
+    // pour le rendre surchargeable, on va provoquer un reecriture
2693
+    // systematique du noyau ou une baisse de perfs => a etudier)
2694
+    include_once _ROOT_RESTREINT . 'inc/flock.php';
2695
+
2696
+    // charger tout de suite le path et son cache
2697
+    load_path_cache();
2698
+
2699
+    // *********** traiter les variables ************
2700
+
2701
+    //
2702
+    // Securite
2703
+    //
2704
+
2705
+    // Ne pas se faire manger par un bug php qui accepte ?GLOBALS[truc]=toto
2706
+    if (isset($_REQUEST['GLOBALS'])) {
2707
+        die();
2708
+    }
2709
+    // nettoyer les magic quotes \' et les caracteres nuls %00
2710
+    spip_desinfecte($_GET);
2711
+    spip_desinfecte($_POST);
2712
+    spip_desinfecte($_COOKIE);
2713
+    spip_desinfecte($_REQUEST);
2714
+
2715
+    // appliquer le cookie_prefix
2716
+    if ($GLOBALS['cookie_prefix'] != 'spip') {
2717
+        include_spip('inc/cookie');
2718
+        recuperer_cookies_spip($GLOBALS['cookie_prefix']);
2719
+    }
2720
+
2721
+    // Compatibilite avec serveurs ne fournissant pas $REQUEST_URI
2722
+    if (isset($_SERVER['REQUEST_URI'])) {
2723
+        $GLOBALS['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
2724
+    } else {
2725
+        $GLOBALS['REQUEST_URI'] = (php_sapi_name() !== 'cli') ? $_SERVER['PHP_SELF'] : '';
2726
+        if (
2727
+            !empty($_SERVER['QUERY_STRING'])
2728
+            and !strpos($_SERVER['REQUEST_URI'], '?')
2729
+        ) {
2730
+            $GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
2731
+        }
2732
+    }
2733
+
2734
+    // Duree de validite de l'alea pour les cookies et ce qui s'ensuit.
2735
+    if (!defined('_RENOUVELLE_ALEA')) {
2736
+        define('_RENOUVELLE_ALEA', 12 * 3600);
2737
+    }
2738
+    if (!defined('_DUREE_COOKIE_ADMIN')) {
2739
+        define('_DUREE_COOKIE_ADMIN', 14 * 24 * 3600);
2740
+    }
2741
+
2742
+    // charger les meta si possible et renouveller l'alea au besoin
2743
+    // charge aussi effacer_meta et ecrire_meta
2744
+    $inc_meta = charger_fonction('meta', 'inc');
2745
+    $inc_meta();
2746
+
2747
+    // nombre de repertoires depuis la racine
2748
+    // on compare a l'adresse de spip.php : $_SERVER["SCRIPT_NAME"]
2749
+    // ou a defaut celle donnee en meta ; (mais si celle-ci est fausse
2750
+    // le calcul est faux)
2751
+    if (!_DIR_RESTREINT) {
2752
+        $GLOBALS['profondeur_url'] = 1;
2753
+    } else {
2754
+        $uri = isset($_SERVER['REQUEST_URI']) ? explode('?', $_SERVER['REQUEST_URI']) : '';
2755
+        $uri_ref = $_SERVER['SCRIPT_NAME'];
2756
+        if (
2757
+            !$uri_ref
2758
+            // si on est appele avec un autre ti, on est sans doute en mutu
2759
+            // si jamais c'est de la mutu avec sous rep, on est perdu si on se fie
2760
+            // a spip.php qui est a la racine du spip, et vue qu'on sait pas se reperer
2761
+            // s'en remettre a l'adresse du site. alea jacta est.
2762
+            or $ti !== _NOM_TEMPORAIRES_INACCESSIBLES
2763
+        ) {
2764
+            if (isset($GLOBALS['meta']['adresse_site'])) {
2765
+                $uri_ref = parse_url($GLOBALS['meta']['adresse_site']);
2766
+                $uri_ref = ($uri_ref['path'] ?? '') . '/';
2767
+            } else {
2768
+                $uri_ref = '';
2769
+            }
2770
+        }
2771
+        if (!$uri or !$uri_ref) {
2772
+            $GLOBALS['profondeur_url'] = 0;
2773
+        } else {
2774
+            $GLOBALS['profondeur_url'] = max(
2775
+                0,
2776
+                substr_count($uri[0], '/')
2777
+                - substr_count($uri_ref, '/')
2778
+            );
2779
+        }
2780
+    }
2781
+    // s'il y a un cookie ou PHP_AUTH, initialiser visiteur_session
2782
+    if (_FILE_CONNECT) {
2783
+        if (
2784
+            verifier_visiteur() == '0minirezo'
2785
+            // si c'est un admin sans cookie admin, il faut ignorer le cache chemin !
2786
+            and !isset($_COOKIE['spip_admin'])
2787
+        ) {
2788
+            clear_path_cache();
2789
+        }
2790
+    }
2792 2791
 }
2793 2792
 
2794 2793
 /**
@@ -2797,157 +2796,157 @@  discard block
 block discarded – undo
2797 2796
  *
2798 2797
  */
2799 2798
 function spip_initialisation_suite() {
2800
-	static $too_late = 0;
2801
-	if ($too_late++) {
2802
-		return;
2803
-	}
2804
-
2805
-	// taille mini des login
2806
-	if (!defined('_LOGIN_TROP_COURT')) {
2807
-		define('_LOGIN_TROP_COURT', 4);
2808
-	}
2809
-
2810
-	// la taille maxi des logos (0 : pas de limite) (pas de define par defaut, ce n'est pas utile)
2811
-	#if (!defined('_LOGO_MAX_SIZE')) define('_LOGO_MAX_SIZE', 0); # poids en ko
2812
-	#if (!defined('_LOGO_MAX_WIDTH')) define('_LOGO_MAX_WIDTH', 0); # largeur en pixels
2813
-	#if (!defined('_LOGO_MAX_HEIGHT')) define('_LOGO_MAX_HEIGHT', 0); # hauteur en pixels
2814
-
2815
-	// la taille maxi des images (0 : pas de limite) (pas de define par defaut, ce n'est pas utile)
2816
-	#if (!defined('_DOC_MAX_SIZE')) define('_DOC_MAX_SIZE', 0); # poids en ko
2817
-	#if (!defined('_IMG_MAX_SIZE')) define('_IMG_MAX_SIZE', 0); # poids en ko
2818
-	#if (!defined('_IMG_MAX_WIDTH')) define('_IMG_MAX_WIDTH', 0); # largeur en pixels
2819
-	#if (!defined('_IMG_MAX_HEIGHT')) define('_IMG_MAX_HEIGHT', 0); # hauteur en pixels
2820
-
2821
-	if (!defined('_PASS_LONGUEUR_MINI')) {
2822
-		define('_PASS_LONGUEUR_MINI', 6);
2823
-	}
2824
-
2825
-	// largeur maximale des images dans l'administration
2826
-	if (!defined('_IMG_ADMIN_MAX_WIDTH')) {
2827
-		define('_IMG_ADMIN_MAX_WIDTH', 768);
2828
-	}
2829
-
2830
-	// Qualite des images calculees automatiquement. C'est un nombre entre 0 et 100, meme pour imagick (on ramene a 0..1 par la suite)
2831
-	if (!defined('_IMG_QUALITE')) {
2832
-		define('_IMG_QUALITE', 85);
2833
-	} # valeur par defaut
2834
-	if (!defined('_IMG_GD_QUALITE')) {
2835
-		define('_IMG_GD_QUALITE', _IMG_QUALITE);
2836
-	} # surcharge pour la lib GD
2837
-	if (!defined('_IMG_CONVERT_QUALITE')) {
2838
-		define('_IMG_CONVERT_QUALITE', _IMG_QUALITE);
2839
-	} # surcharge pour imagick en ligne de commande
2840
-	// Historiquement la valeur pour imagick semble differente. Si ca n'est pas necessaire, il serait preferable de garder _IMG_QUALITE
2841
-	if (!defined('_IMG_IMAGICK_QUALITE')) {
2842
-		define('_IMG_IMAGICK_QUALITE', 75);
2843
-	} # surcharge pour imagick en PHP
2844
-
2845
-	if (!defined('_COPIE_LOCALE_MAX_SIZE')) {
2846
-		define('_COPIE_LOCALE_MAX_SIZE', 33_554_432);
2847
-	} // poids en octet
2848
-
2849
-	// qq chaines standard
2850
-	if (!defined('_ACCESS_FILE_NAME')) {
2851
-		define('_ACCESS_FILE_NAME', '.htaccess');
2852
-	}
2853
-	if (!defined('_AUTH_USER_FILE')) {
2854
-		define('_AUTH_USER_FILE', '.htpasswd');
2855
-	}
2856
-	if (!defined('_SPIP_DUMP')) {
2857
-		define('_SPIP_DUMP', 'dump@nom_site@@[email protected]');
2858
-	}
2859
-	if (!defined('_CACHE_RUBRIQUES')) {
2860
-		/** Fichier cache pour le navigateur de rubrique du bandeau */
2861
-		define('_CACHE_RUBRIQUES', _DIR_TMP . 'menu-rubriques-cache.txt');
2862
-	}
2863
-	if (!defined('_CACHE_RUBRIQUES_MAX')) {
2864
-		/** Nombre maxi de rubriques enfants affichées pour chaque rubrique du navigateur de rubrique du bandeau */
2865
-		define('_CACHE_RUBRIQUES_MAX', 500);
2866
-	}
2867
-
2868
-	if (!defined('_CACHE_CONTEXTES_AJAX_SUR_LONGUEUR')) {
2869
-		/**
2870
-		 * Basculer les contextes ajax en fichier si la longueur d’url est trop grande
2871
-		 * @var int Nombre de caractères */
2872
-		define('_CACHE_CONTEXTES_AJAX_SUR_LONGUEUR', 2000);
2873
-	}
2874
-
2875
-	if (!defined('_EXTENSION_SQUELETTES')) {
2876
-		define('_EXTENSION_SQUELETTES', 'html');
2877
-	}
2878
-
2879
-	if (!defined('_DOCTYPE_ECRIRE')) {
2880
-		/** Définit le doctype de l’espace privé */
2881
-		define('_DOCTYPE_ECRIRE', "<!DOCTYPE html>\n");
2882
-	}
2883
-	if (!defined('_DOCTYPE_AIDE')) {
2884
-		/** Définit le doctype de l’aide en ligne */
2885
-		define(
2886
-			'_DOCTYPE_AIDE',
2887
-			"<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Frameset//EN' 'http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd'>"
2888
-		);
2889
-	}
2890
-
2891
-	if (!defined('_SPIP_SCRIPT')) {
2892
-		/** L'adresse de base du site ; on peut mettre '' si la racine est gerée par
2893
-		 * le script de l'espace public, alias index.php */
2894
-		define('_SPIP_SCRIPT', 'spip.php');
2895
-	}
2896
-	if (!defined('_SPIP_PAGE')) {
2897
-		/** Argument page, personalisable en cas de conflit avec un autre script */
2898
-		define('_SPIP_PAGE', 'page');
2899
-	}
2900
-
2901
-	// le script de l'espace prive
2902
-	// Mettre a "index.php" si DirectoryIndex ne le fait pas ou pb connexes:
2903
-	// les anciens IIS n'acceptent pas les POST sur ecrire/ (#419)
2904
-	// meme pb sur thttpd cf. https://forum.spip.net/fr_184153.html
2905
-	if (!defined('_SPIP_ECRIRE_SCRIPT')) {
2906
-		if (!empty($_SERVER['SERVER_SOFTWARE']) and preg_match(',IIS|thttpd,', $_SERVER['SERVER_SOFTWARE'])) {
2907
-			define('_SPIP_ECRIRE_SCRIPT', 'index.php');
2908
-		} else {
2909
-			define('_SPIP_ECRIRE_SCRIPT', '');
2910
-		}
2911
-	}
2912
-
2913
-
2914
-	if (!defined('_SPIP_AJAX')) {
2915
-		define('_SPIP_AJAX', ((!isset($_COOKIE['spip_accepte_ajax']))
2916
-			? 1
2917
-			: (($_COOKIE['spip_accepte_ajax'] != -1) ? 1 : 0)));
2918
-	}
2919
-
2920
-	// La requete est-elle en ajax ?
2921
-	if (!defined('_AJAX')) {
2922
-		define(
2923
-			'_AJAX',
2924
-			(isset($_SERVER['HTTP_X_REQUESTED_WITH']) # ajax jQuery
2925
-				or !empty($_REQUEST['var_ajax_redir']) # redirection 302 apres ajax jQuery
2926
-				or !empty($_REQUEST['var_ajaxcharset']) # compat ascendante pour plugins
2927
-				or !empty($_REQUEST['var_ajax']) # forms ajax & inclure ajax de spip
2928
-			)
2929
-			and empty($_REQUEST['var_noajax']) # horrible exception, car c'est pas parce que la requete est ajax jquery qu'il faut tuer tous les formulaires ajax qu'elle contient
2930
-		);
2931
-	}
2932
-
2933
-	# nombre de pixels maxi pour calcul de la vignette avec gd
2934
-	# au dela de 5500000 on considere que php n'est pas limite en memoire pour cette operation
2935
-	# les configurations limitees en memoire ont un seuil plutot vers 1MPixel
2936
-	if (!defined('_IMG_GD_MAX_PIXELS')) {
2937
-		define(
2938
-			'_IMG_GD_MAX_PIXELS',
2939
-			(isset($GLOBALS['meta']['max_taille_vignettes']) and $GLOBALS['meta']['max_taille_vignettes'])
2940
-			? $GLOBALS['meta']['max_taille_vignettes']
2941
-			: 0
2942
-		);
2943
-	}
2944
-
2945
-	// Protocoles a normaliser dans les chaines de langues
2946
-	if (!defined('_PROTOCOLES_STD')) {
2947
-		define('_PROTOCOLES_STD', 'http|https|ftp|mailto|webcal');
2948
-	}
2949
-
2950
-	init_var_mode();
2799
+    static $too_late = 0;
2800
+    if ($too_late++) {
2801
+        return;
2802
+    }
2803
+
2804
+    // taille mini des login
2805
+    if (!defined('_LOGIN_TROP_COURT')) {
2806
+        define('_LOGIN_TROP_COURT', 4);
2807
+    }
2808
+
2809
+    // la taille maxi des logos (0 : pas de limite) (pas de define par defaut, ce n'est pas utile)
2810
+    #if (!defined('_LOGO_MAX_SIZE')) define('_LOGO_MAX_SIZE', 0); # poids en ko
2811
+    #if (!defined('_LOGO_MAX_WIDTH')) define('_LOGO_MAX_WIDTH', 0); # largeur en pixels
2812
+    #if (!defined('_LOGO_MAX_HEIGHT')) define('_LOGO_MAX_HEIGHT', 0); # hauteur en pixels
2813
+
2814
+    // la taille maxi des images (0 : pas de limite) (pas de define par defaut, ce n'est pas utile)
2815
+    #if (!defined('_DOC_MAX_SIZE')) define('_DOC_MAX_SIZE', 0); # poids en ko
2816
+    #if (!defined('_IMG_MAX_SIZE')) define('_IMG_MAX_SIZE', 0); # poids en ko
2817
+    #if (!defined('_IMG_MAX_WIDTH')) define('_IMG_MAX_WIDTH', 0); # largeur en pixels
2818
+    #if (!defined('_IMG_MAX_HEIGHT')) define('_IMG_MAX_HEIGHT', 0); # hauteur en pixels
2819
+
2820
+    if (!defined('_PASS_LONGUEUR_MINI')) {
2821
+        define('_PASS_LONGUEUR_MINI', 6);
2822
+    }
2823
+
2824
+    // largeur maximale des images dans l'administration
2825
+    if (!defined('_IMG_ADMIN_MAX_WIDTH')) {
2826
+        define('_IMG_ADMIN_MAX_WIDTH', 768);
2827
+    }
2828
+
2829
+    // Qualite des images calculees automatiquement. C'est un nombre entre 0 et 100, meme pour imagick (on ramene a 0..1 par la suite)
2830
+    if (!defined('_IMG_QUALITE')) {
2831
+        define('_IMG_QUALITE', 85);
2832
+    } # valeur par defaut
2833
+    if (!defined('_IMG_GD_QUALITE')) {
2834
+        define('_IMG_GD_QUALITE', _IMG_QUALITE);
2835
+    } # surcharge pour la lib GD
2836
+    if (!defined('_IMG_CONVERT_QUALITE')) {
2837
+        define('_IMG_CONVERT_QUALITE', _IMG_QUALITE);
2838
+    } # surcharge pour imagick en ligne de commande
2839
+    // Historiquement la valeur pour imagick semble differente. Si ca n'est pas necessaire, il serait preferable de garder _IMG_QUALITE
2840
+    if (!defined('_IMG_IMAGICK_QUALITE')) {
2841
+        define('_IMG_IMAGICK_QUALITE', 75);
2842
+    } # surcharge pour imagick en PHP
2843
+
2844
+    if (!defined('_COPIE_LOCALE_MAX_SIZE')) {
2845
+        define('_COPIE_LOCALE_MAX_SIZE', 33_554_432);
2846
+    } // poids en octet
2847
+
2848
+    // qq chaines standard
2849
+    if (!defined('_ACCESS_FILE_NAME')) {
2850
+        define('_ACCESS_FILE_NAME', '.htaccess');
2851
+    }
2852
+    if (!defined('_AUTH_USER_FILE')) {
2853
+        define('_AUTH_USER_FILE', '.htpasswd');
2854
+    }
2855
+    if (!defined('_SPIP_DUMP')) {
2856
+        define('_SPIP_DUMP', 'dump@nom_site@@[email protected]');
2857
+    }
2858
+    if (!defined('_CACHE_RUBRIQUES')) {
2859
+        /** Fichier cache pour le navigateur de rubrique du bandeau */
2860
+        define('_CACHE_RUBRIQUES', _DIR_TMP . 'menu-rubriques-cache.txt');
2861
+    }
2862
+    if (!defined('_CACHE_RUBRIQUES_MAX')) {
2863
+        /** Nombre maxi de rubriques enfants affichées pour chaque rubrique du navigateur de rubrique du bandeau */
2864
+        define('_CACHE_RUBRIQUES_MAX', 500);
2865
+    }
2866
+
2867
+    if (!defined('_CACHE_CONTEXTES_AJAX_SUR_LONGUEUR')) {
2868
+        /**
2869
+         * Basculer les contextes ajax en fichier si la longueur d’url est trop grande
2870
+         * @var int Nombre de caractères */
2871
+        define('_CACHE_CONTEXTES_AJAX_SUR_LONGUEUR', 2000);
2872
+    }
2873
+
2874
+    if (!defined('_EXTENSION_SQUELETTES')) {
2875
+        define('_EXTENSION_SQUELETTES', 'html');
2876
+    }
2877
+
2878
+    if (!defined('_DOCTYPE_ECRIRE')) {
2879
+        /** Définit le doctype de l’espace privé */
2880
+        define('_DOCTYPE_ECRIRE', "<!DOCTYPE html>\n");
2881
+    }
2882
+    if (!defined('_DOCTYPE_AIDE')) {
2883
+        /** Définit le doctype de l’aide en ligne */
2884
+        define(
2885
+            '_DOCTYPE_AIDE',
2886
+            "<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Frameset//EN' 'http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd'>"
2887
+        );
2888
+    }
2889
+
2890
+    if (!defined('_SPIP_SCRIPT')) {
2891
+        /** L'adresse de base du site ; on peut mettre '' si la racine est gerée par
2892
+         * le script de l'espace public, alias index.php */
2893
+        define('_SPIP_SCRIPT', 'spip.php');
2894
+    }
2895
+    if (!defined('_SPIP_PAGE')) {
2896
+        /** Argument page, personalisable en cas de conflit avec un autre script */
2897
+        define('_SPIP_PAGE', 'page');
2898
+    }
2899
+
2900
+    // le script de l'espace prive
2901
+    // Mettre a "index.php" si DirectoryIndex ne le fait pas ou pb connexes:
2902
+    // les anciens IIS n'acceptent pas les POST sur ecrire/ (#419)
2903
+    // meme pb sur thttpd cf. https://forum.spip.net/fr_184153.html
2904
+    if (!defined('_SPIP_ECRIRE_SCRIPT')) {
2905
+        if (!empty($_SERVER['SERVER_SOFTWARE']) and preg_match(',IIS|thttpd,', $_SERVER['SERVER_SOFTWARE'])) {
2906
+            define('_SPIP_ECRIRE_SCRIPT', 'index.php');
2907
+        } else {
2908
+            define('_SPIP_ECRIRE_SCRIPT', '');
2909
+        }
2910
+    }
2911
+
2912
+
2913
+    if (!defined('_SPIP_AJAX')) {
2914
+        define('_SPIP_AJAX', ((!isset($_COOKIE['spip_accepte_ajax']))
2915
+            ? 1
2916
+            : (($_COOKIE['spip_accepte_ajax'] != -1) ? 1 : 0)));
2917
+    }
2918
+
2919
+    // La requete est-elle en ajax ?
2920
+    if (!defined('_AJAX')) {
2921
+        define(
2922
+            '_AJAX',
2923
+            (isset($_SERVER['HTTP_X_REQUESTED_WITH']) # ajax jQuery
2924
+                or !empty($_REQUEST['var_ajax_redir']) # redirection 302 apres ajax jQuery
2925
+                or !empty($_REQUEST['var_ajaxcharset']) # compat ascendante pour plugins
2926
+                or !empty($_REQUEST['var_ajax']) # forms ajax & inclure ajax de spip
2927
+            )
2928
+            and empty($_REQUEST['var_noajax']) # horrible exception, car c'est pas parce que la requete est ajax jquery qu'il faut tuer tous les formulaires ajax qu'elle contient
2929
+        );
2930
+    }
2931
+
2932
+    # nombre de pixels maxi pour calcul de la vignette avec gd
2933
+    # au dela de 5500000 on considere que php n'est pas limite en memoire pour cette operation
2934
+    # les configurations limitees en memoire ont un seuil plutot vers 1MPixel
2935
+    if (!defined('_IMG_GD_MAX_PIXELS')) {
2936
+        define(
2937
+            '_IMG_GD_MAX_PIXELS',
2938
+            (isset($GLOBALS['meta']['max_taille_vignettes']) and $GLOBALS['meta']['max_taille_vignettes'])
2939
+            ? $GLOBALS['meta']['max_taille_vignettes']
2940
+            : 0
2941
+        );
2942
+    }
2943
+
2944
+    // Protocoles a normaliser dans les chaines de langues
2945
+    if (!defined('_PROTOCOLES_STD')) {
2946
+        define('_PROTOCOLES_STD', 'http|https|ftp|mailto|webcal');
2947
+    }
2948
+
2949
+    init_var_mode();
2951 2950
 }
2952 2951
 
2953 2952
 /**
@@ -2981,136 +2980,136 @@  discard block
 block discarded – undo
2981 2980
  * `   var_mode` (calcul ou recalcul).
2982 2981
  */
2983 2982
 function init_var_mode() {
2984
-	static $done = false;
2985
-	if (!$done) {
2986
-		if (isset($_GET['var_mode'])) {
2987
-			$var_mode = explode(',', $_GET['var_mode']);
2988
-			// tout le monde peut calcul/recalcul
2989
-			if (!defined('_VAR_MODE')) {
2990
-				if (in_array('recalcul', $var_mode)) {
2991
-					define('_VAR_MODE', 'recalcul');
2992
-				} elseif (in_array('calcul', $var_mode)) {
2993
-					define('_VAR_MODE', 'calcul');
2994
-				}
2995
-			}
2996
-			$var_mode = array_diff($var_mode, ['calcul', 'recalcul']);
2997
-			if ($var_mode) {
2998
-				include_spip('inc/autoriser');
2999
-				// autoriser preview si preview seulement, et sinon autoriser debug
3000
-				if (
3001
-					autoriser(
3002
-						($_GET['var_mode'] == 'preview')
3003
-						? 'previsualiser'
3004
-						: 'debug'
3005
-					)
3006
-				) {
3007
-					if (in_array('traduction', $var_mode)) {
3008
-						// forcer le calcul pour passer dans traduire
3009
-						if (!defined('_VAR_MODE')) {
3010
-							define('_VAR_MODE', 'calcul');
3011
-						}
3012
-						// et ne pas enregistrer de cache pour ne pas trainer les surlignages sur d'autres pages
3013
-						if (!defined('_VAR_NOCACHE')) {
3014
-							define('_VAR_NOCACHE', true);
3015
-						}
3016
-						$var_mode = array_diff($var_mode, ['traduction']);
3017
-					}
3018
-					if (in_array('preview', $var_mode)) {
3019
-						// basculer sur les criteres de preview dans les boucles
3020
-						if (!defined('_VAR_PREVIEW')) {
3021
-							define('_VAR_PREVIEW', true);
3022
-						}
3023
-						// forcer le calcul
3024
-						if (!defined('_VAR_MODE')) {
3025
-							define('_VAR_MODE', 'calcul');
3026
-						}
3027
-						// et ne pas enregistrer de cache
3028
-						if (!defined('_VAR_NOCACHE')) {
3029
-							define('_VAR_NOCACHE', true);
3030
-						}
3031
-						$var_mode = array_diff($var_mode, ['preview']);
3032
-					}
3033
-					if (in_array('inclure', $var_mode)) {
3034
-						// forcer le compilo et ignorer les caches existants
3035
-						if (!defined('_VAR_MODE')) {
3036
-							define('_VAR_MODE', 'calcul');
3037
-						}
3038
-						if (!defined('_VAR_INCLURE')) {
3039
-							define('_VAR_INCLURE', true);
3040
-						}
3041
-						// et ne pas enregistrer de cache
3042
-						if (!defined('_VAR_NOCACHE')) {
3043
-							define('_VAR_NOCACHE', true);
3044
-						}
3045
-						$var_mode = array_diff($var_mode, ['inclure']);
3046
-					}
3047
-					if (in_array('urls', $var_mode)) {
3048
-						// forcer le compilo et ignorer les caches existants
3049
-						if (!defined('_VAR_MODE')) {
3050
-							define('_VAR_MODE', 'calcul');
3051
-						}
3052
-						if (!defined('_VAR_URLS')) {
3053
-							define('_VAR_URLS', true);
3054
-						}
3055
-						$var_mode = array_diff($var_mode, ['urls']);
3056
-					}
3057
-					if (in_array('images', $var_mode)) {
3058
-						// forcer le compilo et ignorer les caches existants
3059
-						if (!defined('_VAR_MODE')) {
3060
-							define('_VAR_MODE', 'calcul');
3061
-						}
3062
-						// indiquer qu'on doit recalculer les images
3063
-						if (!defined('_VAR_IMAGES')) {
3064
-							define('_VAR_IMAGES', true);
3065
-						}
3066
-						$var_mode = array_diff($var_mode, ['images']);
3067
-					}
3068
-					if (in_array('debug', $var_mode)) {
3069
-						if (!defined('_VAR_MODE')) {
3070
-							define('_VAR_MODE', 'debug');
3071
-						}
3072
-						// et ne pas enregistrer de cache
3073
-						if (!defined('_VAR_NOCACHE')) {
3074
-							define('_VAR_NOCACHE', true);
3075
-						}
3076
-						$var_mode = array_diff($var_mode, ['debug']);
3077
-					}
3078
-					if (count($var_mode) and !defined('_VAR_MODE')) {
3079
-						define('_VAR_MODE', reset($var_mode));
3080
-					}
3081
-					if (isset($GLOBALS['visiteur_session']['nom'])) {
3082
-						spip_log($GLOBALS['visiteur_session']['nom']
3083
-							. ' ' . _VAR_MODE);
3084
-					}
3085
-				} // pas autorise ?
3086
-				else {
3087
-					// si on n'est pas connecte on se redirige, si on est pas en cli et pas deja en train de se loger
3088
-					if (
3089
-						!$GLOBALS['visiteur_session']
3090
-						and !empty($_SERVER['HTTP_HOST'])
3091
-						and !empty($_SERVER['REQUEST_METHOD'])
3092
-						and $_SERVER['REQUEST_METHOD'] === 'GET'
3093
-					) {
3094
-						$self = self('&', true);
3095
-						if (strpos($self, 'page=login') === false) {
3096
-							include_spip('inc/headers');
3097
-							$redirect = parametre_url(self('&', true), 'var_mode', $_GET['var_mode'], '&');
3098
-							redirige_par_entete(generer_url_public('login', 'url=' . rawurlencode($redirect), true));
3099
-						}
3100
-					}
3101
-					// sinon tant pis
3102
-				}
3103
-			}
3104
-		}
3105
-		if (!defined('_VAR_MODE')) {
3106
-			/**
3107
-			 * Indique le mode de calcul ou d'affichage de la page.
3108
-			 * @see init_var_mode()
3109
-			 */
3110
-			define('_VAR_MODE', false);
3111
-		}
3112
-		$done = true;
3113
-	}
2983
+    static $done = false;
2984
+    if (!$done) {
2985
+        if (isset($_GET['var_mode'])) {
2986
+            $var_mode = explode(',', $_GET['var_mode']);
2987
+            // tout le monde peut calcul/recalcul
2988
+            if (!defined('_VAR_MODE')) {
2989
+                if (in_array('recalcul', $var_mode)) {
2990
+                    define('_VAR_MODE', 'recalcul');
2991
+                } elseif (in_array('calcul', $var_mode)) {
2992
+                    define('_VAR_MODE', 'calcul');
2993
+                }
2994
+            }
2995
+            $var_mode = array_diff($var_mode, ['calcul', 'recalcul']);
2996
+            if ($var_mode) {
2997
+                include_spip('inc/autoriser');
2998
+                // autoriser preview si preview seulement, et sinon autoriser debug
2999
+                if (
3000
+                    autoriser(
3001
+                        ($_GET['var_mode'] == 'preview')
3002
+                        ? 'previsualiser'
3003
+                        : 'debug'
3004
+                    )
3005
+                ) {
3006
+                    if (in_array('traduction', $var_mode)) {
3007
+                        // forcer le calcul pour passer dans traduire
3008
+                        if (!defined('_VAR_MODE')) {
3009
+                            define('_VAR_MODE', 'calcul');
3010
+                        }
3011
+                        // et ne pas enregistrer de cache pour ne pas trainer les surlignages sur d'autres pages
3012
+                        if (!defined('_VAR_NOCACHE')) {
3013
+                            define('_VAR_NOCACHE', true);
3014
+                        }
3015
+                        $var_mode = array_diff($var_mode, ['traduction']);
3016
+                    }
3017
+                    if (in_array('preview', $var_mode)) {
3018
+                        // basculer sur les criteres de preview dans les boucles
3019
+                        if (!defined('_VAR_PREVIEW')) {
3020
+                            define('_VAR_PREVIEW', true);
3021
+                        }
3022
+                        // forcer le calcul
3023
+                        if (!defined('_VAR_MODE')) {
3024
+                            define('_VAR_MODE', 'calcul');
3025
+                        }
3026
+                        // et ne pas enregistrer de cache
3027
+                        if (!defined('_VAR_NOCACHE')) {
3028
+                            define('_VAR_NOCACHE', true);
3029
+                        }
3030
+                        $var_mode = array_diff($var_mode, ['preview']);
3031
+                    }
3032
+                    if (in_array('inclure', $var_mode)) {
3033
+                        // forcer le compilo et ignorer les caches existants
3034
+                        if (!defined('_VAR_MODE')) {
3035
+                            define('_VAR_MODE', 'calcul');
3036
+                        }
3037
+                        if (!defined('_VAR_INCLURE')) {
3038
+                            define('_VAR_INCLURE', true);
3039
+                        }
3040
+                        // et ne pas enregistrer de cache
3041
+                        if (!defined('_VAR_NOCACHE')) {
3042
+                            define('_VAR_NOCACHE', true);
3043
+                        }
3044
+                        $var_mode = array_diff($var_mode, ['inclure']);
3045
+                    }
3046
+                    if (in_array('urls', $var_mode)) {
3047
+                        // forcer le compilo et ignorer les caches existants
3048
+                        if (!defined('_VAR_MODE')) {
3049
+                            define('_VAR_MODE', 'calcul');
3050
+                        }
3051
+                        if (!defined('_VAR_URLS')) {
3052
+                            define('_VAR_URLS', true);
3053
+                        }
3054
+                        $var_mode = array_diff($var_mode, ['urls']);
3055
+                    }
3056
+                    if (in_array('images', $var_mode)) {
3057
+                        // forcer le compilo et ignorer les caches existants
3058
+                        if (!defined('_VAR_MODE')) {
3059
+                            define('_VAR_MODE', 'calcul');
3060
+                        }
3061
+                        // indiquer qu'on doit recalculer les images
3062
+                        if (!defined('_VAR_IMAGES')) {
3063
+                            define('_VAR_IMAGES', true);
3064
+                        }
3065
+                        $var_mode = array_diff($var_mode, ['images']);
3066
+                    }
3067
+                    if (in_array('debug', $var_mode)) {
3068
+                        if (!defined('_VAR_MODE')) {
3069
+                            define('_VAR_MODE', 'debug');
3070
+                        }
3071
+                        // et ne pas enregistrer de cache
3072
+                        if (!defined('_VAR_NOCACHE')) {
3073
+                            define('_VAR_NOCACHE', true);
3074
+                        }
3075
+                        $var_mode = array_diff($var_mode, ['debug']);
3076
+                    }
3077
+                    if (count($var_mode) and !defined('_VAR_MODE')) {
3078
+                        define('_VAR_MODE', reset($var_mode));
3079
+                    }
3080
+                    if (isset($GLOBALS['visiteur_session']['nom'])) {
3081
+                        spip_log($GLOBALS['visiteur_session']['nom']
3082
+                            . ' ' . _VAR_MODE);
3083
+                    }
3084
+                } // pas autorise ?
3085
+                else {
3086
+                    // si on n'est pas connecte on se redirige, si on est pas en cli et pas deja en train de se loger
3087
+                    if (
3088
+                        !$GLOBALS['visiteur_session']
3089
+                        and !empty($_SERVER['HTTP_HOST'])
3090
+                        and !empty($_SERVER['REQUEST_METHOD'])
3091
+                        and $_SERVER['REQUEST_METHOD'] === 'GET'
3092
+                    ) {
3093
+                        $self = self('&', true);
3094
+                        if (strpos($self, 'page=login') === false) {
3095
+                            include_spip('inc/headers');
3096
+                            $redirect = parametre_url(self('&', true), 'var_mode', $_GET['var_mode'], '&');
3097
+                            redirige_par_entete(generer_url_public('login', 'url=' . rawurlencode($redirect), true));
3098
+                        }
3099
+                    }
3100
+                    // sinon tant pis
3101
+                }
3102
+            }
3103
+        }
3104
+        if (!defined('_VAR_MODE')) {
3105
+            /**
3106
+             * Indique le mode de calcul ou d'affichage de la page.
3107
+             * @see init_var_mode()
3108
+             */
3109
+            define('_VAR_MODE', false);
3110
+        }
3111
+        $done = true;
3112
+    }
3114 3113
 }
3115 3114
 
3116 3115
 /**
@@ -3122,16 +3121,16 @@  discard block
 block discarded – undo
3122 3121
  * @param bool $deep = true : appliquer récursivement
3123 3122
 **/
3124 3123
 function spip_desinfecte(&$t, $deep = true) {
3125
-	foreach ($t as $key => $val) {
3126
-		if (is_string($t[$key])) {
3127
-			$t[$key] = str_replace(chr(0), '-', $t[$key]);
3128
-		} // traiter aussi les "texte_plus" de article_edit
3129
-		else {
3130
-			if ($deep and is_array($t[$key]) and $key !== 'GLOBALS') {
3131
-				spip_desinfecte($t[$key], $deep);
3132
-			}
3133
-		}
3134
-	}
3124
+    foreach ($t as $key => $val) {
3125
+        if (is_string($t[$key])) {
3126
+            $t[$key] = str_replace(chr(0), '-', $t[$key]);
3127
+        } // traiter aussi les "texte_plus" de article_edit
3128
+        else {
3129
+            if ($deep and is_array($t[$key]) and $key !== 'GLOBALS') {
3130
+                spip_desinfecte($t[$key], $deep);
3131
+            }
3132
+        }
3133
+    }
3135 3134
 }
3136 3135
 
3137 3136
 /**
@@ -3144,64 +3143,64 @@  discard block
 block discarded – undo
3144 3143
  * @return string|0|false
3145 3144
 **/
3146 3145
 function verifier_visiteur() {
3147
-	@spip_initialisation_core(
3148
-		(_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES),
3149
-		(_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES),
3150
-		(_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES),
3151
-		(_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
3152
-	);
3153
-
3154
-	// Demarrer une session NON AUTHENTIFIEE si on donne son nom
3155
-	// dans un formulaire sans login (ex: #FORMULAIRE_FORUM)
3156
-	// Attention on separe bien session_nom et nom, pour eviter
3157
-	// les melanges entre donnees SQL et variables plus aleatoires
3158
-	$variables_session = ['session_nom', 'session_email'];
3159
-	foreach ($variables_session as $var) {
3160
-		if (_request($var) !== null) {
3161
-			$init = true;
3162
-			break;
3163
-		}
3164
-	}
3165
-	if (isset($init)) {
3166
-		#@spip_initialisation_suite();
3167
-		$session = charger_fonction('session', 'inc');
3168
-		$session();
3169
-		include_spip('inc/texte');
3170
-		foreach ($variables_session as $var) {
3171
-			if (($a = _request($var)) !== null) {
3172
-				$GLOBALS['visiteur_session'][$var] = safehtml($a);
3173
-			}
3174
-		}
3175
-		if (!isset($GLOBALS['visiteur_session']['id_auteur'])) {
3176
-			$GLOBALS['visiteur_session']['id_auteur'] = 0;
3177
-		}
3178
-		$session($GLOBALS['visiteur_session']);
3179
-
3180
-		return 0;
3181
-	}
3182
-
3183
-	$h = (isset($_SERVER['PHP_AUTH_USER']) and !$GLOBALS['ignore_auth_http']);
3184
-	if ($h or isset($_COOKIE['spip_session']) or isset($_COOKIE[$GLOBALS['cookie_prefix'] . '_session'])) {
3185
-		$session = charger_fonction('session', 'inc');
3186
-		if ($session()) {
3187
-			return $GLOBALS['visiteur_session']['statut'];
3188
-		}
3189
-		if ($h and isset($_SERVER['PHP_AUTH_PW'])) {
3190
-			include_spip('inc/auth');
3191
-			$h = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']);
3192
-		}
3193
-		if ($h) {
3194
-			$GLOBALS['visiteur_session'] = $h;
3195
-
3196
-			return $GLOBALS['visiteur_session']['statut'];
3197
-		}
3198
-	}
3199
-
3200
-	// au moins son navigateur nous dit la langue preferee de cet inconnu
3201
-	include_spip('inc/lang');
3202
-	utiliser_langue_visiteur();
3203
-
3204
-	return false;
3146
+    @spip_initialisation_core(
3147
+        (_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES),
3148
+        (_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES),
3149
+        (_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES),
3150
+        (_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
3151
+    );
3152
+
3153
+    // Demarrer une session NON AUTHENTIFIEE si on donne son nom
3154
+    // dans un formulaire sans login (ex: #FORMULAIRE_FORUM)
3155
+    // Attention on separe bien session_nom et nom, pour eviter
3156
+    // les melanges entre donnees SQL et variables plus aleatoires
3157
+    $variables_session = ['session_nom', 'session_email'];
3158
+    foreach ($variables_session as $var) {
3159
+        if (_request($var) !== null) {
3160
+            $init = true;
3161
+            break;
3162
+        }
3163
+    }
3164
+    if (isset($init)) {
3165
+        #@spip_initialisation_suite();
3166
+        $session = charger_fonction('session', 'inc');
3167
+        $session();
3168
+        include_spip('inc/texte');
3169
+        foreach ($variables_session as $var) {
3170
+            if (($a = _request($var)) !== null) {
3171
+                $GLOBALS['visiteur_session'][$var] = safehtml($a);
3172
+            }
3173
+        }
3174
+        if (!isset($GLOBALS['visiteur_session']['id_auteur'])) {
3175
+            $GLOBALS['visiteur_session']['id_auteur'] = 0;
3176
+        }
3177
+        $session($GLOBALS['visiteur_session']);
3178
+
3179
+        return 0;
3180
+    }
3181
+
3182
+    $h = (isset($_SERVER['PHP_AUTH_USER']) and !$GLOBALS['ignore_auth_http']);
3183
+    if ($h or isset($_COOKIE['spip_session']) or isset($_COOKIE[$GLOBALS['cookie_prefix'] . '_session'])) {
3184
+        $session = charger_fonction('session', 'inc');
3185
+        if ($session()) {
3186
+            return $GLOBALS['visiteur_session']['statut'];
3187
+        }
3188
+        if ($h and isset($_SERVER['PHP_AUTH_PW'])) {
3189
+            include_spip('inc/auth');
3190
+            $h = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']);
3191
+        }
3192
+        if ($h) {
3193
+            $GLOBALS['visiteur_session'] = $h;
3194
+
3195
+            return $GLOBALS['visiteur_session']['statut'];
3196
+        }
3197
+    }
3198
+
3199
+    // au moins son navigateur nous dit la langue preferee de cet inconnu
3200
+    include_spip('inc/lang');
3201
+    utiliser_langue_visiteur();
3202
+
3203
+    return false;
3205 3204
 }
3206 3205
 
3207 3206
 
@@ -3224,21 +3223,21 @@  discard block
 block discarded – undo
3224 3223
  *     - string Langue utilisée.
3225 3224
  **/
3226 3225
 function lang_select($lang = null) {
3227
-	static $pile_langues = [];
3228
-	if (!function_exists('changer_langue')) {
3229
-		include_spip('inc/lang');
3230
-	}
3231
-	if ($lang === null) {
3232
-		$lang = array_pop($pile_langues);
3233
-	} else {
3234
-		array_push($pile_langues, $GLOBALS['spip_lang']);
3235
-	}
3236
-	if (isset($GLOBALS['spip_lang']) and $lang == $GLOBALS['spip_lang']) {
3237
-		return $lang;
3238
-	}
3239
-	changer_langue($lang);
3226
+    static $pile_langues = [];
3227
+    if (!function_exists('changer_langue')) {
3228
+        include_spip('inc/lang');
3229
+    }
3230
+    if ($lang === null) {
3231
+        $lang = array_pop($pile_langues);
3232
+    } else {
3233
+        array_push($pile_langues, $GLOBALS['spip_lang']);
3234
+    }
3235
+    if (isset($GLOBALS['spip_lang']) and $lang == $GLOBALS['spip_lang']) {
3236
+        return $lang;
3237
+    }
3238
+    changer_langue($lang);
3240 3239
 
3241
-	return $lang;
3240
+    return $lang;
3242 3241
 }
3243 3242
 
3244 3243
 /**
@@ -3255,20 +3254,20 @@  discard block
 block discarded – undo
3255 3254
  *     Identifiant de la session
3256 3255
  **/
3257 3256
 function spip_session($force = false) {
3258
-	static $session;
3259
-	if ($force or !isset($session)) {
3260
-		$s = pipeline(
3261
-			'definir_session',
3262
-			$GLOBALS['visiteur_session']
3263
-				? serialize($GLOBALS['visiteur_session'])
3264
-				. '_' . @$_COOKIE['spip_session']
3265
-				: ''
3266
-		);
3267
-		$session = $s ? substr(md5($s), 0, 8) : '';
3268
-	}
3257
+    static $session;
3258
+    if ($force or !isset($session)) {
3259
+        $s = pipeline(
3260
+            'definir_session',
3261
+            $GLOBALS['visiteur_session']
3262
+                ? serialize($GLOBALS['visiteur_session'])
3263
+                . '_' . @$_COOKIE['spip_session']
3264
+                : ''
3265
+        );
3266
+        $session = $s ? substr(md5($s), 0, 8) : '';
3267
+    }
3269 3268
 
3270
-	#spip_log('session: '.$session);
3271
-	return $session;
3269
+    #spip_log('session: '.$session);
3270
+    return $session;
3272 3271
 }
3273 3272
 
3274 3273
 
@@ -3287,9 +3286,9 @@  discard block
 block discarded – undo
3287 3286
  *    Lien sur une icone d'aide
3288 3287
  **/
3289 3288
 function aider($aide = '', $distante = false) {
3290
-	$aider = charger_fonction('aide', 'inc', true);
3289
+    $aider = charger_fonction('aide', 'inc', true);
3291 3290
 
3292
-	return $aider ? $aider($aide, '', [], $distante) : '';
3291
+    return $aider ? $aider($aide, '', [], $distante) : '';
3293 3292
 }
3294 3293
 
3295 3294
 /**
@@ -3299,24 +3298,24 @@  discard block
 block discarded – undo
3299 3298
  */
3300 3299
 function exec_info_dist() {
3301 3300
 
3302
-	include_spip('inc/autoriser');
3303
-	if (autoriser('phpinfos')) {
3304
-		$cookies_masques = ['spip_session', 'PHPSESSID'];
3305
-		$cookies_backup = [];
3306
-		foreach ($cookies_masques as $k) {
3307
-			if (!empty($_COOKIE[$k])) {
3308
-				$cookies_backup[$k] = $_COOKIE[$k];
3309
-				$_COOKIE[$k] = '******************************';
3310
-			}
3311
-		}
3312
-		phpinfo();
3313
-		foreach ($cookies_backup as $k => $v) {
3314
-			$_COOKIE[$k] = $v;
3315
-		}
3316
-	} else {
3317
-		include_spip('inc/filtres');
3318
-		sinon_interdire_acces();
3319
-	}
3301
+    include_spip('inc/autoriser');
3302
+    if (autoriser('phpinfos')) {
3303
+        $cookies_masques = ['spip_session', 'PHPSESSID'];
3304
+        $cookies_backup = [];
3305
+        foreach ($cookies_masques as $k) {
3306
+            if (!empty($_COOKIE[$k])) {
3307
+                $cookies_backup[$k] = $_COOKIE[$k];
3308
+                $_COOKIE[$k] = '******************************';
3309
+            }
3310
+        }
3311
+        phpinfo();
3312
+        foreach ($cookies_backup as $k => $v) {
3313
+            $_COOKIE[$k] = $v;
3314
+        }
3315
+    } else {
3316
+        include_spip('inc/filtres');
3317
+        sinon_interdire_acces();
3318
+    }
3320 3319
 }
3321 3320
 
3322 3321
 /**
@@ -3336,13 +3335,13 @@  discard block
 block discarded – undo
3336 3335
  *     - string si $message à false.
3337 3336
  **/
3338 3337
 function erreur_squelette($message = '', $lieu = '') {
3339
-	$debusquer = charger_fonction('debusquer', 'public');
3340
-	if (is_array($lieu)) {
3341
-		include_spip('public/compiler');
3342
-		$lieu = reconstruire_contexte_compil($lieu);
3343
-	}
3338
+    $debusquer = charger_fonction('debusquer', 'public');
3339
+    if (is_array($lieu)) {
3340
+        include_spip('public/compiler');
3341
+        $lieu = reconstruire_contexte_compil($lieu);
3342
+    }
3344 3343
 
3345
-	return $debusquer($message, $lieu);
3344
+    return $debusquer($message, $lieu);
3346 3345
 }
3347 3346
 
3348 3347
 /**
@@ -3379,108 +3378,108 @@  discard block
 block discarded – undo
3379 3378
  *     - ou tableau d'information sur le squelette.
3380 3379
  */
3381 3380
 function recuperer_fond($fond, $contexte = [], $options = [], string $connect = '') {
3382
-	if (!function_exists('evaluer_fond')) {
3383
-		include_spip('public/assembler');
3384
-	}
3385
-	// assurer la compat avec l'ancienne syntaxe
3386
-	// (trim etait le 3eme argument, par defaut a true)
3387
-	if (!is_array($options)) {
3388
-		$options = ['trim' => $options];
3389
-	}
3390
-	if (!isset($options['trim'])) {
3391
-		$options['trim'] = true;
3392
-	}
3393
-
3394
-	if (isset($contexte['connect'])) {
3395
-		$connect = $contexte['connect'];
3396
-		unset($contexte['connect']);
3397
-	}
3398
-
3399
-	$texte = '';
3400
-	$pages = [];
3401
-	$lang_select = '';
3402
-	if (!isset($options['etoile']) or !$options['etoile']) {
3403
-		// Si on a inclus sans fixer le critere de lang, on prend la langue courante
3404
-		if (!isset($contexte['lang'])) {
3405
-			$contexte['lang'] = $GLOBALS['spip_lang'];
3406
-		}
3407
-
3408
-		if ($contexte['lang'] != $GLOBALS['meta']['langue_site']) {
3409
-			$lang_select = lang_select($contexte['lang']);
3410
-		}
3411
-	}
3412
-
3413
-	if (!isset($GLOBALS['_INC_PUBLIC'])) {
3414
-		$GLOBALS['_INC_PUBLIC'] = 0;
3415
-	}
3416
-
3417
-	$GLOBALS['_INC_PUBLIC']++;
3418
-
3419
-	// fix #4235
3420
-	$cache_utilise_session_appelant	= ($GLOBALS['cache_utilise_session'] ?? null);
3421
-
3422
-
3423
-	foreach (is_array($fond) ? $fond : [$fond] as $f) {
3424
-		unset($GLOBALS['cache_utilise_session']);	// fix #4235
3425
-
3426
-		$page = evaluer_fond($f, $contexte, $connect);
3427
-		if ($page === '') {
3428
-			$c = $options['compil'] ?? '';
3429
-			$a = ['fichier' => $f];
3430
-			$erreur = _T('info_erreur_squelette2', $a); // squelette introuvable
3431
-			erreur_squelette($erreur, $c);
3432
-			// eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
3433
-			$page = ['texte' => '', 'erreur' => $erreur];
3434
-		}
3435
-
3436
-		$page = pipeline('recuperer_fond', [
3437
-			'args' => ['fond' => $f, 'contexte' => $contexte, 'options' => $options, 'connect' => $connect],
3438
-			'data' => $page
3439
-		]);
3440
-		if (isset($options['ajax']) and $options['ajax']) {
3441
-			if (!function_exists('encoder_contexte_ajax')) {
3442
-				include_spip('inc/filtres');
3443
-			}
3444
-			$page['texte'] = encoder_contexte_ajax(
3445
-				array_merge(
3446
-					$contexte,
3447
-					['fond' => $f],
3448
-					($connect ? ['connect' => $connect] : [])
3449
-				),
3450
-				'',
3451
-				$page['texte'],
3452
-				$options['ajax']
3453
-			);
3454
-		}
3455
-
3456
-		if (isset($options['raw']) and $options['raw']) {
3457
-			$pages[] = $page;
3458
-		} else {
3459
-			$texte .= $options['trim'] ? rtrim($page['texte'] ?? '') : $page['texte'];
3460
-		}
3461
-
3462
-		// contamination de la session appelante, pour les inclusions statiques
3463
-		if (isset($page['invalideurs']['session'])) {
3464
-			$cache_utilise_session_appelant = $page['invalideurs']['session'];
3465
-		}
3466
-	}
3467
-
3468
-	// restaurer le sessionnement du contexte appelant,
3469
-	// éventuellement contaminé si on vient de récupérer une inclusion statique sessionnée
3470
-	if (isset($cache_utilise_session_appelant)) {
3471
-		$GLOBALS['cache_utilise_session'] = $cache_utilise_session_appelant;
3472
-	}
3473
-
3474
-	$GLOBALS['_INC_PUBLIC']--;
3475
-
3476
-	if ($lang_select) {
3477
-		lang_select();
3478
-	}
3479
-	if (isset($options['raw']) and $options['raw']) {
3480
-		return is_array($fond) ? $pages : reset($pages);
3481
-	} else {
3482
-		return $options['trim'] ? ltrim($texte) : $texte;
3483
-	}
3381
+    if (!function_exists('evaluer_fond')) {
3382
+        include_spip('public/assembler');
3383
+    }
3384
+    // assurer la compat avec l'ancienne syntaxe
3385
+    // (trim etait le 3eme argument, par defaut a true)
3386
+    if (!is_array($options)) {
3387
+        $options = ['trim' => $options];
3388
+    }
3389
+    if (!isset($options['trim'])) {
3390
+        $options['trim'] = true;
3391
+    }
3392
+
3393
+    if (isset($contexte['connect'])) {
3394
+        $connect = $contexte['connect'];
3395
+        unset($contexte['connect']);
3396
+    }
3397
+
3398
+    $texte = '';
3399
+    $pages = [];
3400
+    $lang_select = '';
3401
+    if (!isset($options['etoile']) or !$options['etoile']) {
3402
+        // Si on a inclus sans fixer le critere de lang, on prend la langue courante
3403
+        if (!isset($contexte['lang'])) {
3404
+            $contexte['lang'] = $GLOBALS['spip_lang'];
3405
+        }
3406
+
3407
+        if ($contexte['lang'] != $GLOBALS['meta']['langue_site']) {
3408
+            $lang_select = lang_select($contexte['lang']);
3409
+        }
3410
+    }
3411
+
3412
+    if (!isset($GLOBALS['_INC_PUBLIC'])) {
3413
+        $GLOBALS['_INC_PUBLIC'] = 0;
3414
+    }
3415
+
3416
+    $GLOBALS['_INC_PUBLIC']++;
3417
+
3418
+    // fix #4235
3419
+    $cache_utilise_session_appelant	= ($GLOBALS['cache_utilise_session'] ?? null);
3420
+
3421
+
3422
+    foreach (is_array($fond) ? $fond : [$fond] as $f) {
3423
+        unset($GLOBALS['cache_utilise_session']);	// fix #4235
3424
+
3425
+        $page = evaluer_fond($f, $contexte, $connect);
3426
+        if ($page === '') {
3427
+            $c = $options['compil'] ?? '';
3428
+            $a = ['fichier' => $f];
3429
+            $erreur = _T('info_erreur_squelette2', $a); // squelette introuvable
3430
+            erreur_squelette($erreur, $c);
3431
+            // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
3432
+            $page = ['texte' => '', 'erreur' => $erreur];
3433
+        }
3434
+
3435
+        $page = pipeline('recuperer_fond', [
3436
+            'args' => ['fond' => $f, 'contexte' => $contexte, 'options' => $options, 'connect' => $connect],
3437
+            'data' => $page
3438
+        ]);
3439
+        if (isset($options['ajax']) and $options['ajax']) {
3440
+            if (!function_exists('encoder_contexte_ajax')) {
3441
+                include_spip('inc/filtres');
3442
+            }
3443
+            $page['texte'] = encoder_contexte_ajax(
3444
+                array_merge(
3445
+                    $contexte,
3446
+                    ['fond' => $f],
3447
+                    ($connect ? ['connect' => $connect] : [])
3448
+                ),
3449
+                '',
3450
+                $page['texte'],
3451
+                $options['ajax']
3452
+            );
3453
+        }
3454
+
3455
+        if (isset($options['raw']) and $options['raw']) {
3456
+            $pages[] = $page;
3457
+        } else {
3458
+            $texte .= $options['trim'] ? rtrim($page['texte'] ?? '') : $page['texte'];
3459
+        }
3460
+
3461
+        // contamination de la session appelante, pour les inclusions statiques
3462
+        if (isset($page['invalideurs']['session'])) {
3463
+            $cache_utilise_session_appelant = $page['invalideurs']['session'];
3464
+        }
3465
+    }
3466
+
3467
+    // restaurer le sessionnement du contexte appelant,
3468
+    // éventuellement contaminé si on vient de récupérer une inclusion statique sessionnée
3469
+    if (isset($cache_utilise_session_appelant)) {
3470
+        $GLOBALS['cache_utilise_session'] = $cache_utilise_session_appelant;
3471
+    }
3472
+
3473
+    $GLOBALS['_INC_PUBLIC']--;
3474
+
3475
+    if ($lang_select) {
3476
+        lang_select();
3477
+    }
3478
+    if (isset($options['raw']) and $options['raw']) {
3479
+        return is_array($fond) ? $pages : reset($pages);
3480
+    } else {
3481
+        return $options['trim'] ? ltrim($texte) : $texte;
3482
+    }
3484 3483
 }
3485 3484
 
3486 3485
 /**
@@ -3490,7 +3489,7 @@  discard block
 block discarded – undo
3490 3489
  * @return string
3491 3490
  */
3492 3491
 function trouve_modele($nom) {
3493
-	return trouver_fond($nom, 'modeles/');
3492
+    return trouver_fond($nom, 'modeles/');
3494 3493
 }
3495 3494
 
3496 3495
 /**
@@ -3506,21 +3505,21 @@  discard block
 block discarded – undo
3506 3505
  * @return array|string
3507 3506
  */
3508 3507
 function trouver_fond($nom, $dir = '', $pathinfo = false) {
3509
-	$f = find_in_path($nom . '.' . _EXTENSION_SQUELETTES, $dir ? rtrim($dir, '/') . '/' : '');
3510
-	if (!$pathinfo) {
3511
-		return $f;
3512
-	}
3513
-	// renvoyer un tableau detaille si $pathinfo==true
3514
-	$p = pathinfo($f);
3515
-	if (!isset($p['extension']) or !$p['extension']) {
3516
-		$p['extension'] = _EXTENSION_SQUELETTES;
3517
-	}
3518
-	if (!isset($p['extension']) or !$p['filename']) {
3519
-		$p['filename'] = ($p['basename'] ? substr($p['basename'], 0, -strlen($p['extension']) - 1) : '');
3520
-	}
3521
-	$p['fond'] = ($f ? substr($f, 0, -strlen($p['extension']) - 1) : '');
3508
+    $f = find_in_path($nom . '.' . _EXTENSION_SQUELETTES, $dir ? rtrim($dir, '/') . '/' : '');
3509
+    if (!$pathinfo) {
3510
+        return $f;
3511
+    }
3512
+    // renvoyer un tableau detaille si $pathinfo==true
3513
+    $p = pathinfo($f);
3514
+    if (!isset($p['extension']) or !$p['extension']) {
3515
+        $p['extension'] = _EXTENSION_SQUELETTES;
3516
+    }
3517
+    if (!isset($p['extension']) or !$p['filename']) {
3518
+        $p['filename'] = ($p['basename'] ? substr($p['basename'], 0, -strlen($p['extension']) - 1) : '');
3519
+    }
3520
+    $p['fond'] = ($f ? substr($f, 0, -strlen($p['extension']) - 1) : '');
3522 3521
 
3523
-	return $p;
3522
+    return $p;
3524 3523
 }
3525 3524
 
3526 3525
 /**
@@ -3540,21 +3539,21 @@  discard block
 block discarded – undo
3540 3539
  *     Nom de l'exec, sinon chaîne vide.
3541 3540
  **/
3542 3541
 function tester_url_ecrire($nom) {
3543
-	static $exec = [];
3544
-	if (isset($exec[$nom])) {
3545
-		return $exec[$nom];
3546
-	}
3547
-	// tester si c'est une page en squelette
3548
-	if (trouver_fond($nom, 'prive/squelettes/contenu/')) {
3549
-		return $exec[$nom] = 'fond';
3550
-	} // echafaudage d'un fond !
3551
-	elseif (include_spip('public/styliser_par_z') and z_echafaudable($nom)) {
3552
-		return $exec[$nom] = 'fond';
3553
-	}
3554
-	// attention, il ne faut pas inclure l'exec ici
3555
-	// car sinon #URL_ECRIRE provoque des inclusions
3556
-	// et des define intrusifs potentiels
3557
-	return $exec[$nom] = ((find_in_path("{$nom}.php", 'exec/') or charger_fonction($nom, 'exec', true)) ? $nom : '');
3542
+    static $exec = [];
3543
+    if (isset($exec[$nom])) {
3544
+        return $exec[$nom];
3545
+    }
3546
+    // tester si c'est une page en squelette
3547
+    if (trouver_fond($nom, 'prive/squelettes/contenu/')) {
3548
+        return $exec[$nom] = 'fond';
3549
+    } // echafaudage d'un fond !
3550
+    elseif (include_spip('public/styliser_par_z') and z_echafaudable($nom)) {
3551
+        return $exec[$nom] = 'fond';
3552
+    }
3553
+    // attention, il ne faut pas inclure l'exec ici
3554
+    // car sinon #URL_ECRIRE provoque des inclusions
3555
+    // et des define intrusifs potentiels
3556
+    return $exec[$nom] = ((find_in_path("{$nom}.php", 'exec/') or charger_fonction($nom, 'exec', true)) ? $nom : '');
3558 3557
 }
3559 3558
 
3560 3559
 /**
@@ -3564,8 +3563,8 @@  discard block
 block discarded – undo
3564 3563
  *     true si la constante _VERSION_HTML n'est pas définie ou égale à html5
3565 3564
  **/
3566 3565
 function html5_permis() {
3567
-	return (!defined('_VERSION_HTML')
3568
-		or _VERSION_HTML !== 'html4');
3566
+    return (!defined('_VERSION_HTML')
3567
+        or _VERSION_HTML !== 'html4');
3569 3568
 }
3570 3569
 
3571 3570
 /**
@@ -3575,30 +3574,30 @@  discard block
 block discarded – undo
3575 3574
  * @return array
3576 3575
  */
3577 3576
 function formats_image_acceptables($gd = null, $svg_allowed = true) {
3578
-	$formats = null;
3579
-	if (!is_null($gd)) {
3580
-		$config = ($gd ? 'gd_formats' : 'formats_graphiques');
3581
-		if (isset($GLOBALS['meta'][$config])) {
3582
-			$formats = $GLOBALS['meta'][$config];
3583
-			$formats = explode(',', $formats);
3584
-			$formats = array_filter($formats);
3585
-			$formats = array_map('trim', $formats);
3586
-		}
3587
-	}
3588
-	if (is_null($formats)) {
3589
-		include_spip('inc/filtres_images_lib_mini');
3590
-		$formats = _image_extensions_acceptees_en_entree();
3591
-	}
3592
-
3593
-	if ($svg_allowed) {
3594
-		if (!in_array('svg', $formats)) {
3595
-			$formats[] = 'svg';
3596
-		}
3597
-	}
3598
-	else {
3599
-		$formats = array_diff($formats, ['svg']);
3600
-	}
3601
-	return $formats;
3577
+    $formats = null;
3578
+    if (!is_null($gd)) {
3579
+        $config = ($gd ? 'gd_formats' : 'formats_graphiques');
3580
+        if (isset($GLOBALS['meta'][$config])) {
3581
+            $formats = $GLOBALS['meta'][$config];
3582
+            $formats = explode(',', $formats);
3583
+            $formats = array_filter($formats);
3584
+            $formats = array_map('trim', $formats);
3585
+        }
3586
+    }
3587
+    if (is_null($formats)) {
3588
+        include_spip('inc/filtres_images_lib_mini');
3589
+        $formats = _image_extensions_acceptees_en_entree();
3590
+    }
3591
+
3592
+    if ($svg_allowed) {
3593
+        if (!in_array('svg', $formats)) {
3594
+            $formats[] = 'svg';
3595
+        }
3596
+    }
3597
+    else {
3598
+        $formats = array_diff($formats, ['svg']);
3599
+    }
3600
+    return $formats;
3602 3601
 }
3603 3602
 
3604 3603
 /**
@@ -3607,20 +3606,20 @@  discard block
 block discarded – undo
3607 3606
  * @return array|bool
3608 3607
  */
3609 3608
 function spip_getimagesize($fichier) {
3610
-	if (!$imagesize = @getimagesize($fichier)) {
3611
-		include_spip('inc/svg');
3612
-		if ($attrs = svg_lire_attributs($fichier)) {
3613
-			[$width, $height, $viewbox] = svg_getimagesize_from_attr($attrs);
3614
-			$imagesize = [
3615
-				$width,
3616
-				$height,
3617
-				IMAGETYPE_SVG,
3618
-				"width=\"{$width}\" height=\"{$height}\"",
3619
-				'mime' => 'image/svg+xml'
3620
-			];
3621
-		}
3622
-	}
3623
-	return $imagesize;
3609
+    if (!$imagesize = @getimagesize($fichier)) {
3610
+        include_spip('inc/svg');
3611
+        if ($attrs = svg_lire_attributs($fichier)) {
3612
+            [$width, $height, $viewbox] = svg_getimagesize_from_attr($attrs);
3613
+            $imagesize = [
3614
+                $width,
3615
+                $height,
3616
+                IMAGETYPE_SVG,
3617
+                "width=\"{$width}\" height=\"{$height}\"",
3618
+                'mime' => 'image/svg+xml'
3619
+            ];
3620
+        }
3621
+    }
3622
+    return $imagesize;
3624 3623
 }
3625 3624
 
3626 3625
 /**
@@ -3634,19 +3633,19 @@  discard block
 block discarded – undo
3634 3633
  * @param string $statut
3635 3634
  */
3636 3635
 function avertir_auteurs($nom, $message, $statut = '') {
3637
-	$alertes = $GLOBALS['meta']['message_alertes_auteurs'];
3638
-	if (
3639
-		!$alertes
3640
-		or !is_array($alertes = unserialize($alertes))
3641
-	) {
3642
-		$alertes = [];
3643
-	}
3636
+    $alertes = $GLOBALS['meta']['message_alertes_auteurs'];
3637
+    if (
3638
+        !$alertes
3639
+        or !is_array($alertes = unserialize($alertes))
3640
+    ) {
3641
+        $alertes = [];
3642
+    }
3644 3643
 
3645
-	if (!isset($alertes[$statut])) {
3646
-		$alertes[$statut] = [];
3647
-	}
3648
-	$alertes[$statut][$nom] = $message;
3649
-	ecrire_meta('message_alertes_auteurs', serialize($alertes));
3644
+    if (!isset($alertes[$statut])) {
3645
+        $alertes[$statut] = [];
3646
+    }
3647
+    $alertes[$statut][$nom] = $message;
3648
+    ecrire_meta('message_alertes_auteurs', serialize($alertes));
3650 3649
 }
3651 3650
 
3652 3651
 /**
@@ -3660,10 +3659,10 @@  discard block
 block discarded – undo
3660 3659
  * @return string|string[]
3661 3660
  */
3662 3661
 function spip_sanitize_classname($classes) {
3663
-	if (is_array($classes)) {
3664
-		return array_map('spip_sanitize_classname', $classes);
3665
-	}
3666
-	return preg_replace('/[^ 0-9a-z_\-+@]/i', '', $classes);
3662
+    if (is_array($classes)) {
3663
+        return array_map('spip_sanitize_classname', $classes);
3664
+    }
3665
+    return preg_replace('/[^ 0-9a-z_\-+@]/i', '', $classes);
3667 3666
 }
3668 3667
 
3669 3668
 
@@ -3688,32 +3687,32 @@  discard block
 block discarded – undo
3688 3687
  *    Avec operateur : bool.
3689 3688
  **/
3690 3689
 function spip_version_compare($v1, $v2, $op = null) {
3691
-	$v1 = strtolower(preg_replace(',([0-9])[\s.-]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v1));
3692
-	$v2 = strtolower(preg_replace(',([0-9])[\s.-]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v2));
3693
-	$v1 = str_replace('rc', 'RC', $v1); // certaines versions de PHP ne comprennent RC qu'en majuscule
3694
-	$v2 = str_replace('rc', 'RC', $v2); // certaines versions de PHP ne comprennent RC qu'en majuscule
3695
-
3696
-	$v1 = explode('.', $v1);
3697
-	$v2 = explode('.', $v2);
3698
-	// $v1 est toujours une version, donc sans etoile
3699
-	while (count($v1) < count($v2)) {
3700
-		$v1[] = '0';
3701
-	}
3702
-
3703
-	// $v2 peut etre une borne, donc accepte l'etoile
3704
-	$etoile = false;
3705
-	foreach ($v1 as $k => $v) {
3706
-		if (!isset($v2[$k])) {
3707
-			$v2[] = ($etoile and (is_numeric($v) or $v == 'pl' or $v == 'p')) ? $v : '0';
3708
-		} else {
3709
-			if ($v2[$k] == '*') {
3710
-				$etoile = true;
3711
-				$v2[$k] = $v;
3712
-			}
3713
-		}
3714
-	}
3715
-	$v1 = implode('.', $v1);
3716
-	$v2 = implode('.', $v2);
3717
-
3718
-	return $op ? version_compare($v1, $v2, $op) : version_compare($v1, $v2);
3690
+    $v1 = strtolower(preg_replace(',([0-9])[\s.-]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v1));
3691
+    $v2 = strtolower(preg_replace(',([0-9])[\s.-]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v2));
3692
+    $v1 = str_replace('rc', 'RC', $v1); // certaines versions de PHP ne comprennent RC qu'en majuscule
3693
+    $v2 = str_replace('rc', 'RC', $v2); // certaines versions de PHP ne comprennent RC qu'en majuscule
3694
+
3695
+    $v1 = explode('.', $v1);
3696
+    $v2 = explode('.', $v2);
3697
+    // $v1 est toujours une version, donc sans etoile
3698
+    while (count($v1) < count($v2)) {
3699
+        $v1[] = '0';
3700
+    }
3701
+
3702
+    // $v2 peut etre une borne, donc accepte l'etoile
3703
+    $etoile = false;
3704
+    foreach ($v1 as $k => $v) {
3705
+        if (!isset($v2[$k])) {
3706
+            $v2[] = ($etoile and (is_numeric($v) or $v == 'pl' or $v == 'p')) ? $v : '0';
3707
+        } else {
3708
+            if ($v2[$k] == '*') {
3709
+                $etoile = true;
3710
+                $v2[$k] = $v;
3711
+            }
3712
+        }
3713
+    }
3714
+    $v1 = implode('.', $v1);
3715
+    $v2 = implode('.', $v2);
3716
+
3717
+    return $op ? version_compare($v1, $v2, $op) : version_compare($v1, $v2);
3719 3718
 }
Please login to merge, or discard this patch.
ecrire/public/assembler.php 1 patch
Indentation   +633 added lines, -633 removed lines patch added patch discarded remove patch
@@ -20,178 +20,178 @@  discard block
 block discarded – undo
20 20
  **/
21 21
 
22 22
 if (!defined('_ECRIRE_INC_VERSION')) {
23
-	return;
23
+    return;
24 24
 }
25 25
 
26 26
 // En cas de modification, il faut aussi actualiser la regexp de nettoyer_uri_var() dans inc/utils.php
27 27
 if (!defined('_CONTEXTE_IGNORE_VARIABLES')) {
28
-	define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/');
28
+    define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/');
29 29
 }
30 30
 
31 31
 function assembler($fond, string $connect = '') {
32 32
 
33
-	$chemin_cache = null;
34
-	$lastmodified = null;
35
-	$res = null;
36
-	// flag_preserver est modifie ici, et utilise en globale
37
-	// use_cache sert a informer le bouton d'admin pr savoir s'il met un *
38
-	// contexte est utilise en globale dans le formulaire d'admin
39
-
40
-	$GLOBALS['contexte'] = calculer_contexte();
41
-	$page = ['contexte_implicite' => calculer_contexte_implicite()];
42
-	$page['contexte_implicite']['cache'] = $fond . preg_replace(
43
-		',\.[a-zA-Z0-9]*$,',
44
-		'',
45
-		preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])
46
-	);
47
-	// Cette fonction est utilisee deux fois
48
-	$cacher = charger_fonction('cacher', 'public', true);
49
-	// Les quatre derniers parametres sont modifies par la fonction:
50
-	// emplacement, validite, et, s'il est valide, contenu & age
51
-	if ($cacher) {
52
-		$res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified);
53
-	} else {
54
-		$GLOBALS['use_cache'] = -1;
55
-	}
56
-	// Si un resultat est retourne, c'est un message d'impossibilite
57
-	if ($res) {
58
-		return ['texte' => $res];
59
-	}
60
-
61
-	if (!$chemin_cache || !$lastmodified) {
62
-		$lastmodified = time();
63
-	}
64
-
65
-	$headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
66
-	$calculer_page = true;
67
-
68
-	// Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
69
-	// une perennite valide a meme reponse qu'une requete HEAD (par defaut les
70
-	// pages sont dynamiques)
71
-	if (
72
-		isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
73
-		and (!defined('_VAR_MODE') or !_VAR_MODE)
74
-		and $chemin_cache
75
-		and isset($page['entetes'])
76
-		and isset($page['entetes']['Cache-Control'])
77
-		and strstr($page['entetes']['Cache-Control'], 'max-age=')
78
-		and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
79
-	) {
80
-		$since = preg_replace(
81
-			'/;.*/',
82
-			'',
83
-			$_SERVER['HTTP_IF_MODIFIED_SINCE']
84
-		);
85
-		$since = str_replace('GMT', '', $since);
86
-		if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) {
87
-			$page['status'] = 304;
88
-			$headers_only = true;
89
-			$calculer_page = false;
90
-		}
91
-	}
92
-
93
-	// Si requete HEAD ou Last-modified compatible, ignorer le texte
94
-	// et pas de content-type (pour contrer le bouton admin de inc-public)
95
-	if (!$calculer_page) {
96
-		$page['texte'] = '';
97
-	} else {
98
-		// si la page est prise dans le cache
99
-		if (!$GLOBALS['use_cache']) {
100
-			// Informer les boutons d'admin du contexte
101
-			// (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
102
-			$GLOBALS['contexte'] = $page['contexte'];
103
-
104
-			// vider les globales url propres qui ne doivent plus etre utilisees en cas
105
-			// d'inversion url => objet
106
-			// plus necessaire si on utilise bien la fonction urls_decoder_url
107
-			#unset($_SERVER['REDIRECT_url_propre']);
108
-			#unset($_ENV['url_propre']);
109
-		} else {
110
-			// Compat ascendante :
111
-			// 1. $contexte est global
112
-			// (a evacuer car urls_decoder_url gere ce probleme ?)
113
-			// et calculer la page
114
-			if (!test_espace_prive()) {
115
-				include_spip('inc/urls');
116
-				[$fond, $GLOBALS['contexte'], $url_redirect] = urls_decoder_url(
117
-					nettoyer_uri(),
118
-					$fond,
119
-					$GLOBALS['contexte'],
120
-					true
121
-				);
122
-			}
123
-			// squelette par defaut
124
-			if (!strlen($fond ?? '')) {
125
-				$fond = 'sommaire';
126
-			}
127
-
128
-			// produire la page : peut mettre a jour $lastmodified
129
-			$produire_page = charger_fonction('produire_page', 'public');
130
-			$page = $produire_page(
131
-				$fond,
132
-				$GLOBALS['contexte'],
133
-				$GLOBALS['use_cache'],
134
-				$chemin_cache,
135
-				null,
136
-				$page,
137
-				$lastmodified,
138
-				$connect
139
-			);
140
-			if ($page === '') {
141
-				$erreur = _T(
142
-					'info_erreur_squelette2',
143
-					['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES]
144
-				);
145
-				erreur_squelette($erreur);
146
-				// eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
147
-				$page = ['texte' => '', 'erreur' => $erreur];
148
-			}
149
-		}
150
-
151
-		if ($page and $chemin_cache) {
152
-			$page['cache'] = $chemin_cache;
153
-		}
154
-
155
-		auto_content_type($page);
156
-
157
-		$GLOBALS['flag_preserver'] |= headers_sent();
158
-
159
-		// Definir les entetes si ce n'est fait
160
-		if (!$GLOBALS['flag_preserver']) {
161
-			// Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
162
-			if (
163
-				trim($page['texte']) === ''
164
-				and _VAR_MODE !== 'debug'
165
-				and !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
166
-			) {
167
-				$GLOBALS['contexte']['fond_erreur'] = $fond;
168
-				$page = message_page_indisponible($page, $GLOBALS['contexte']);
169
-			}
170
-			// pas de cache client en mode 'observation'
171
-			if (defined('_VAR_MODE') and _VAR_MODE) {
172
-				$page['entetes']['Cache-Control'] = 'no-cache,must-revalidate';
173
-				$page['entetes']['Pragma'] = 'no-cache';
174
-			}
175
-		}
176
-	}
177
-
178
-	// Entete Last-Modified:
179
-	// eviter d'etre incoherent en envoyant un lastmodified identique
180
-	// a celui qu'on a refuse d'honorer plus haut (cf. #655)
181
-	if (
182
-		$lastmodified
183
-		and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
184
-		and !isset($page['entetes']['Last-Modified'])
185
-	) {
186
-		$page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT';
187
-	}
188
-
189
-	// fermer la connexion apres les headers si requete HEAD
190
-	if ($headers_only) {
191
-		$page['entetes']['Connection'] = 'close';
192
-	}
193
-
194
-	return $page;
33
+    $chemin_cache = null;
34
+    $lastmodified = null;
35
+    $res = null;
36
+    // flag_preserver est modifie ici, et utilise en globale
37
+    // use_cache sert a informer le bouton d'admin pr savoir s'il met un *
38
+    // contexte est utilise en globale dans le formulaire d'admin
39
+
40
+    $GLOBALS['contexte'] = calculer_contexte();
41
+    $page = ['contexte_implicite' => calculer_contexte_implicite()];
42
+    $page['contexte_implicite']['cache'] = $fond . preg_replace(
43
+        ',\.[a-zA-Z0-9]*$,',
44
+        '',
45
+        preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])
46
+    );
47
+    // Cette fonction est utilisee deux fois
48
+    $cacher = charger_fonction('cacher', 'public', true);
49
+    // Les quatre derniers parametres sont modifies par la fonction:
50
+    // emplacement, validite, et, s'il est valide, contenu & age
51
+    if ($cacher) {
52
+        $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified);
53
+    } else {
54
+        $GLOBALS['use_cache'] = -1;
55
+    }
56
+    // Si un resultat est retourne, c'est un message d'impossibilite
57
+    if ($res) {
58
+        return ['texte' => $res];
59
+    }
60
+
61
+    if (!$chemin_cache || !$lastmodified) {
62
+        $lastmodified = time();
63
+    }
64
+
65
+    $headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
66
+    $calculer_page = true;
67
+
68
+    // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
69
+    // une perennite valide a meme reponse qu'une requete HEAD (par defaut les
70
+    // pages sont dynamiques)
71
+    if (
72
+        isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
73
+        and (!defined('_VAR_MODE') or !_VAR_MODE)
74
+        and $chemin_cache
75
+        and isset($page['entetes'])
76
+        and isset($page['entetes']['Cache-Control'])
77
+        and strstr($page['entetes']['Cache-Control'], 'max-age=')
78
+        and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
79
+    ) {
80
+        $since = preg_replace(
81
+            '/;.*/',
82
+            '',
83
+            $_SERVER['HTTP_IF_MODIFIED_SINCE']
84
+        );
85
+        $since = str_replace('GMT', '', $since);
86
+        if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) {
87
+            $page['status'] = 304;
88
+            $headers_only = true;
89
+            $calculer_page = false;
90
+        }
91
+    }
92
+
93
+    // Si requete HEAD ou Last-modified compatible, ignorer le texte
94
+    // et pas de content-type (pour contrer le bouton admin de inc-public)
95
+    if (!$calculer_page) {
96
+        $page['texte'] = '';
97
+    } else {
98
+        // si la page est prise dans le cache
99
+        if (!$GLOBALS['use_cache']) {
100
+            // Informer les boutons d'admin du contexte
101
+            // (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
102
+            $GLOBALS['contexte'] = $page['contexte'];
103
+
104
+            // vider les globales url propres qui ne doivent plus etre utilisees en cas
105
+            // d'inversion url => objet
106
+            // plus necessaire si on utilise bien la fonction urls_decoder_url
107
+            #unset($_SERVER['REDIRECT_url_propre']);
108
+            #unset($_ENV['url_propre']);
109
+        } else {
110
+            // Compat ascendante :
111
+            // 1. $contexte est global
112
+            // (a evacuer car urls_decoder_url gere ce probleme ?)
113
+            // et calculer la page
114
+            if (!test_espace_prive()) {
115
+                include_spip('inc/urls');
116
+                [$fond, $GLOBALS['contexte'], $url_redirect] = urls_decoder_url(
117
+                    nettoyer_uri(),
118
+                    $fond,
119
+                    $GLOBALS['contexte'],
120
+                    true
121
+                );
122
+            }
123
+            // squelette par defaut
124
+            if (!strlen($fond ?? '')) {
125
+                $fond = 'sommaire';
126
+            }
127
+
128
+            // produire la page : peut mettre a jour $lastmodified
129
+            $produire_page = charger_fonction('produire_page', 'public');
130
+            $page = $produire_page(
131
+                $fond,
132
+                $GLOBALS['contexte'],
133
+                $GLOBALS['use_cache'],
134
+                $chemin_cache,
135
+                null,
136
+                $page,
137
+                $lastmodified,
138
+                $connect
139
+            );
140
+            if ($page === '') {
141
+                $erreur = _T(
142
+                    'info_erreur_squelette2',
143
+                    ['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES]
144
+                );
145
+                erreur_squelette($erreur);
146
+                // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
147
+                $page = ['texte' => '', 'erreur' => $erreur];
148
+            }
149
+        }
150
+
151
+        if ($page and $chemin_cache) {
152
+            $page['cache'] = $chemin_cache;
153
+        }
154
+
155
+        auto_content_type($page);
156
+
157
+        $GLOBALS['flag_preserver'] |= headers_sent();
158
+
159
+        // Definir les entetes si ce n'est fait
160
+        if (!$GLOBALS['flag_preserver']) {
161
+            // Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
162
+            if (
163
+                trim($page['texte']) === ''
164
+                and _VAR_MODE !== 'debug'
165
+                and !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
166
+            ) {
167
+                $GLOBALS['contexte']['fond_erreur'] = $fond;
168
+                $page = message_page_indisponible($page, $GLOBALS['contexte']);
169
+            }
170
+            // pas de cache client en mode 'observation'
171
+            if (defined('_VAR_MODE') and _VAR_MODE) {
172
+                $page['entetes']['Cache-Control'] = 'no-cache,must-revalidate';
173
+                $page['entetes']['Pragma'] = 'no-cache';
174
+            }
175
+        }
176
+    }
177
+
178
+    // Entete Last-Modified:
179
+    // eviter d'etre incoherent en envoyant un lastmodified identique
180
+    // a celui qu'on a refuse d'honorer plus haut (cf. #655)
181
+    if (
182
+        $lastmodified
183
+        and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
184
+        and !isset($page['entetes']['Last-Modified'])
185
+    ) {
186
+        $page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT';
187
+    }
188
+
189
+    // fermer la connexion apres les headers si requete HEAD
190
+    if ($headers_only) {
191
+        $page['entetes']['Connection'] = 'close';
192
+    }
193
+
194
+    return $page;
195 195
 }
196 196
 
197 197
 /**
@@ -208,19 +208,19 @@  discard block
 block discarded – undo
208 208
  */
209 209
 function calculer_contexte() {
210 210
 
211
-	$contexte = [];
212
-	foreach ($_GET as $var => $val) {
213
-		if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
214
-			$contexte[$var] = $val;
215
-		}
216
-	}
217
-	foreach ($_POST as $var => $val) {
218
-		if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
219
-			$contexte[$var] = $val;
220
-		}
221
-	}
222
-
223
-	return $contexte;
211
+    $contexte = [];
212
+    foreach ($_GET as $var => $val) {
213
+        if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
214
+            $contexte[$var] = $val;
215
+        }
216
+    }
217
+    foreach ($_POST as $var => $val) {
218
+        if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
219
+            $contexte[$var] = $val;
220
+        }
221
+    }
222
+
223
+    return $contexte;
224 224
 }
225 225
 
226 226
 /**
@@ -231,25 +231,25 @@  discard block
 block discarded – undo
231 231
  * @return array
232 232
  */
233 233
 function calculer_contexte_implicite() {
234
-	static $notes = null;
235
-	if (is_null($notes)) {
236
-		$notes = charger_fonction('notes', 'inc', true);
237
-	}
238
-	$contexte_implicite = [
239
-		'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ?
240
-		'host' => ($_SERVER['HTTP_HOST'] ?? null),
241
-		'https' => ($_SERVER['HTTPS'] ?? ''),
242
-		'espace' => test_espace_prive(),
243
-		'marqueur' => ($GLOBALS['marqueur'] ?? ''),
244
-		'marqueur_skel' => ($GLOBALS['marqueur_skel'] ?? ''),
245
-		'notes' => $notes ? $notes('', 'contexter_cache') : '',
246
-		'spip_version_code' => $GLOBALS['spip_version_code'],
247
-	];
248
-	if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
249
-		$contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST'];
250
-	}
251
-
252
-	return $contexte_implicite;
234
+    static $notes = null;
235
+    if (is_null($notes)) {
236
+        $notes = charger_fonction('notes', 'inc', true);
237
+    }
238
+    $contexte_implicite = [
239
+        'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ?
240
+        'host' => ($_SERVER['HTTP_HOST'] ?? null),
241
+        'https' => ($_SERVER['HTTPS'] ?? ''),
242
+        'espace' => test_espace_prive(),
243
+        'marqueur' => ($GLOBALS['marqueur'] ?? ''),
244
+        'marqueur_skel' => ($GLOBALS['marqueur_skel'] ?? ''),
245
+        'notes' => $notes ? $notes('', 'contexter_cache') : '',
246
+        'spip_version_code' => $GLOBALS['spip_version_code'],
247
+    ];
248
+    if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
249
+        $contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST'];
250
+    }
251
+
252
+    return $contexte_implicite;
253 253
 }
254 254
 
255 255
 //
@@ -258,55 +258,55 @@  discard block
 block discarded – undo
258 258
 
259 259
 function auto_content_type($page) {
260 260
 
261
-	if (!isset($GLOBALS['flag_preserver'])) {
262
-		$GLOBALS['flag_preserver'] = ($page && preg_match(
263
-			'/header\s*\(\s*.content\-type:/isx',
264
-			$page['texte']
265
-		) || (isset($page['entetes']['Content-Type'])));
266
-	}
261
+    if (!isset($GLOBALS['flag_preserver'])) {
262
+        $GLOBALS['flag_preserver'] = ($page && preg_match(
263
+            '/header\s*\(\s*.content\-type:/isx',
264
+            $page['texte']
265
+        ) || (isset($page['entetes']['Content-Type'])));
266
+    }
267 267
 }
268 268
 
269 269
 function inclure_page($fond, $contexte, string $connect = '') {
270
-	$use_cache = null;
271
-	$chemin_cache = null;
272
-	$lastinclude = null;
273
-	$res = null;
274
-	static $cacher, $produire_page;
275
-
276
-	// enlever le fond de contexte inclus car sinon il prend la main
277
-	// dans les sous inclusions -> boucle infinie d'inclusion identique
278
-	// (cette precaution n'est probablement plus utile)
279
-	unset($contexte['fond']);
280
-	$page = ['contexte_implicite' => calculer_contexte_implicite()];
281
-	$page['contexte_implicite']['cache'] = $fond;
282
-	if (is_null($cacher)) {
283
-		$cacher = charger_fonction('cacher', 'public', true);
284
-	}
285
-	// Les quatre derniers parametres sont modifies par la fonction:
286
-	// emplacement, validite, et, s'il est valide, contenu & age
287
-	if ($cacher) {
288
-		$res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude);
289
-	} else {
290
-		$use_cache = -1;
291
-	}
292
-	// $res = message d'erreur : on sort de la
293
-	if ($res) {
294
-		return ['texte' => $res];
295
-	}
296
-
297
-	// Si use_cache ne vaut pas 0, la page doit etre calculee
298
-	// produire la page : peut mettre a jour $lastinclude
299
-	// le contexte_cache envoye a cacher() a ete conserve et est passe a produire
300
-	if ($use_cache) {
301
-		if (is_null($produire_page)) {
302
-			$produire_page = charger_fonction('produire_page', 'public');
303
-		}
304
-		$page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect);
305
-	}
306
-	// dans tous les cas, mettre a jour $GLOBALS['lastmodified']
307
-	$GLOBALS['lastmodified'] = max(($GLOBALS['lastmodified'] ?? 0), $lastinclude);
308
-
309
-	return $page;
270
+    $use_cache = null;
271
+    $chemin_cache = null;
272
+    $lastinclude = null;
273
+    $res = null;
274
+    static $cacher, $produire_page;
275
+
276
+    // enlever le fond de contexte inclus car sinon il prend la main
277
+    // dans les sous inclusions -> boucle infinie d'inclusion identique
278
+    // (cette precaution n'est probablement plus utile)
279
+    unset($contexte['fond']);
280
+    $page = ['contexte_implicite' => calculer_contexte_implicite()];
281
+    $page['contexte_implicite']['cache'] = $fond;
282
+    if (is_null($cacher)) {
283
+        $cacher = charger_fonction('cacher', 'public', true);
284
+    }
285
+    // Les quatre derniers parametres sont modifies par la fonction:
286
+    // emplacement, validite, et, s'il est valide, contenu & age
287
+    if ($cacher) {
288
+        $res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude);
289
+    } else {
290
+        $use_cache = -1;
291
+    }
292
+    // $res = message d'erreur : on sort de la
293
+    if ($res) {
294
+        return ['texte' => $res];
295
+    }
296
+
297
+    // Si use_cache ne vaut pas 0, la page doit etre calculee
298
+    // produire la page : peut mettre a jour $lastinclude
299
+    // le contexte_cache envoye a cacher() a ete conserve et est passe a produire
300
+    if ($use_cache) {
301
+        if (is_null($produire_page)) {
302
+            $produire_page = charger_fonction('produire_page', 'public');
303
+        }
304
+        $page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect);
305
+    }
306
+    // dans tous les cas, mettre a jour $GLOBALS['lastmodified']
307
+    $GLOBALS['lastmodified'] = max(($GLOBALS['lastmodified'] ?? 0), $lastinclude);
308
+
309
+    return $page;
310 310
 }
311 311
 
312 312
 /**
@@ -324,41 +324,41 @@  discard block
 block discarded – undo
324 324
  * @return array
325 325
  */
326 326
 function public_produire_page_dist(
327
-	$fond,
328
-	$contexte,
329
-	$use_cache,
330
-	$chemin_cache,
331
-	$contexte_cache,
332
-	&$page,
333
-	&$lastinclude,
334
-	$connect = ''
327
+    $fond,
328
+    $contexte,
329
+    $use_cache,
330
+    $chemin_cache,
331
+    $contexte_cache,
332
+    &$page,
333
+    &$lastinclude,
334
+    $connect = ''
335 335
 ) {
336
-	static $parametrer, $cacher;
337
-	if (!$parametrer) {
338
-		$parametrer = charger_fonction('parametrer', 'public');
339
-	}
340
-	$page = $parametrer($fond, $contexte, $chemin_cache, $connect);
341
-	// et on l'enregistre sur le disque
342
-	if (
343
-		$chemin_cache
344
-		and $use_cache > -1
345
-		and is_array($page)
346
-		and count($page)
347
-		and isset($page['entetes']['X-Spip-Cache'])
348
-		and $page['entetes']['X-Spip-Cache'] > 0
349
-	) {
350
-		if (is_null($cacher)) {
351
-			$cacher = charger_fonction('cacher', 'public', true);
352
-		}
353
-		$lastinclude = time();
354
-		if ($cacher) {
355
-			$cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude);
356
-		} else {
357
-			$use_cache = -1;
358
-		}
359
-	}
360
-
361
-	return $page;
336
+    static $parametrer, $cacher;
337
+    if (!$parametrer) {
338
+        $parametrer = charger_fonction('parametrer', 'public');
339
+    }
340
+    $page = $parametrer($fond, $contexte, $chemin_cache, $connect);
341
+    // et on l'enregistre sur le disque
342
+    if (
343
+        $chemin_cache
344
+        and $use_cache > -1
345
+        and is_array($page)
346
+        and count($page)
347
+        and isset($page['entetes']['X-Spip-Cache'])
348
+        and $page['entetes']['X-Spip-Cache'] > 0
349
+    ) {
350
+        if (is_null($cacher)) {
351
+            $cacher = charger_fonction('cacher', 'public', true);
352
+        }
353
+        $lastinclude = time();
354
+        if ($cacher) {
355
+            $cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude);
356
+        } else {
357
+            $use_cache = -1;
358
+        }
359
+    }
360
+
361
+    return $page;
362 362
 }
363 363
 
364 364
 // Fonction inseree par le compilateur dans le code compile.
@@ -372,14 +372,14 @@  discard block
 block discarded – undo
372 372
 // 4: langue
373 373
 
374 374
 function inserer_balise_dynamique($contexte_exec, $contexte_compil) {
375
-	arguments_balise_dyn_depuis_modele(null, 'reset');
376
-
377
-	if (!is_array($contexte_exec)) {
378
-		echo $contexte_exec;
379
-	} // message d'erreur etc
380
-	else {
381
-		inclure_balise_dynamique($contexte_exec, true, $contexte_compil);
382
-	}
375
+    arguments_balise_dyn_depuis_modele(null, 'reset');
376
+
377
+    if (!is_array($contexte_exec)) {
378
+        echo $contexte_exec;
379
+    } // message d'erreur etc
380
+    else {
381
+        inclure_balise_dynamique($contexte_exec, true, $contexte_compil);
382
+    }
383 383
 }
384 384
 
385 385
 /**
@@ -392,101 +392,101 @@  discard block
 block discarded – undo
392 392
  * @return string
393 393
  */
394 394
 function inclure_balise_dynamique($texte, $echo = true, $contexte_compil = []) {
395
-	if (is_array($texte)) {
396
-		[$fond, $delainc, $contexte_inclus] = $texte;
397
-
398
-		// delais a l'ancienne, c'est pratiquement mort
399
-		$d = $GLOBALS['delais'] ?? null;
400
-		$GLOBALS['delais'] = $delainc;
401
-
402
-		$page = recuperer_fond(
403
-			$fond,
404
-			$contexte_inclus,
405
-			['trim' => false, 'raw' => true, 'compil' => $contexte_compil]
406
-		);
407
-
408
-		$texte = $page['texte'];
409
-
410
-		$GLOBALS['delais'] = $d;
411
-		// Faire remonter les entetes
412
-		if (
413
-			isset($page['entetes'])
414
-			and is_array($page['entetes'])
415
-		) {
416
-			// mais pas toutes
417
-			unset($page['entetes']['X-Spip-Cache']);
418
-			unset($page['entetes']['Content-Type']);
419
-			if (isset($GLOBALS['page']) and is_array($GLOBALS['page'])) {
420
-				if (!is_array($GLOBALS['page']['entetes'])) {
421
-					$GLOBALS['page']['entetes'] = [];
422
-				}
423
-				$GLOBALS['page']['entetes'] =
424
-					array_merge($GLOBALS['page']['entetes'], $page['entetes']);
425
-			}
426
-		}
427
-		// _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines
428
-		if (
429
-			isset($page['contexte']['_pipelines'])
430
-			and is_array($page['contexte']['_pipelines'])
431
-			and count($page['contexte']['_pipelines'])
432
-		) {
433
-			foreach ($page['contexte']['_pipelines'] as $pipe => $args) {
434
-				$args['contexte'] = $page['contexte'];
435
-				unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul
436
-				$texte = pipeline(
437
-					$pipe,
438
-					[
439
-						'data' => $texte,
440
-						'args' => $args
441
-					]
442
-				);
443
-			}
444
-		}
445
-	}
446
-
447
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
448
-		// compatibilite : avant on donnait le numero de ligne ou rien.
449
-		$ligne = intval($contexte_compil[3] ?? $contexte_compil);
450
-		$GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
451
-	}
452
-	if ($echo) {
453
-		echo $texte;
454
-	} else {
455
-		return $texte;
456
-	}
395
+    if (is_array($texte)) {
396
+        [$fond, $delainc, $contexte_inclus] = $texte;
397
+
398
+        // delais a l'ancienne, c'est pratiquement mort
399
+        $d = $GLOBALS['delais'] ?? null;
400
+        $GLOBALS['delais'] = $delainc;
401
+
402
+        $page = recuperer_fond(
403
+            $fond,
404
+            $contexte_inclus,
405
+            ['trim' => false, 'raw' => true, 'compil' => $contexte_compil]
406
+        );
407
+
408
+        $texte = $page['texte'];
409
+
410
+        $GLOBALS['delais'] = $d;
411
+        // Faire remonter les entetes
412
+        if (
413
+            isset($page['entetes'])
414
+            and is_array($page['entetes'])
415
+        ) {
416
+            // mais pas toutes
417
+            unset($page['entetes']['X-Spip-Cache']);
418
+            unset($page['entetes']['Content-Type']);
419
+            if (isset($GLOBALS['page']) and is_array($GLOBALS['page'])) {
420
+                if (!is_array($GLOBALS['page']['entetes'])) {
421
+                    $GLOBALS['page']['entetes'] = [];
422
+                }
423
+                $GLOBALS['page']['entetes'] =
424
+                    array_merge($GLOBALS['page']['entetes'], $page['entetes']);
425
+            }
426
+        }
427
+        // _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines
428
+        if (
429
+            isset($page['contexte']['_pipelines'])
430
+            and is_array($page['contexte']['_pipelines'])
431
+            and count($page['contexte']['_pipelines'])
432
+        ) {
433
+            foreach ($page['contexte']['_pipelines'] as $pipe => $args) {
434
+                $args['contexte'] = $page['contexte'];
435
+                unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul
436
+                $texte = pipeline(
437
+                    $pipe,
438
+                    [
439
+                        'data' => $texte,
440
+                        'args' => $args
441
+                    ]
442
+                );
443
+            }
444
+        }
445
+    }
446
+
447
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
448
+        // compatibilite : avant on donnait le numero de ligne ou rien.
449
+        $ligne = intval($contexte_compil[3] ?? $contexte_compil);
450
+        $GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
451
+    }
452
+    if ($echo) {
453
+        echo $texte;
454
+    } else {
455
+        return $texte;
456
+    }
457 457
 }
458 458
 
459 459
 function message_page_indisponible($page, $contexte) {
460
-	static $deja = false;
461
-	if ($deja) {
462
-		return 'erreur';
463
-	}
464
-	$codes = [
465
-		'404' => '404 Not Found',
466
-		'503' => '503 Service Unavailable',
467
-	];
468
-
469
-	$contexte['status'] = ($page !== false) ? '404' : '503';
470
-	$contexte['code'] = $codes[$contexte['status']];
471
-	$contexte['fond'] = '404'; // gere les 2 erreurs
472
-	if (!isset($contexte['lang'])) {
473
-		include_spip('inc/lang');
474
-		$contexte['lang'] = $GLOBALS['spip_lang'];
475
-	}
476
-
477
-	$deja = true;
478
-	// passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent
479
-	// ex restriction d'acces => 401
480
-	$contexte = pipeline('page_indisponible', $contexte);
481
-
482
-	// produire la page d'erreur
483
-	$page = inclure_page($contexte['fond'], $contexte);
484
-	if (!$page) {
485
-		$page = inclure_page('404', $contexte);
486
-	}
487
-	$page['status'] = $contexte['status'];
488
-
489
-	return $page;
460
+    static $deja = false;
461
+    if ($deja) {
462
+        return 'erreur';
463
+    }
464
+    $codes = [
465
+        '404' => '404 Not Found',
466
+        '503' => '503 Service Unavailable',
467
+    ];
468
+
469
+    $contexte['status'] = ($page !== false) ? '404' : '503';
470
+    $contexte['code'] = $codes[$contexte['status']];
471
+    $contexte['fond'] = '404'; // gere les 2 erreurs
472
+    if (!isset($contexte['lang'])) {
473
+        include_spip('inc/lang');
474
+        $contexte['lang'] = $GLOBALS['spip_lang'];
475
+    }
476
+
477
+    $deja = true;
478
+    // passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent
479
+    // ex restriction d'acces => 401
480
+    $contexte = pipeline('page_indisponible', $contexte);
481
+
482
+    // produire la page d'erreur
483
+    $page = inclure_page($contexte['fond'], $contexte);
484
+    if (!$page) {
485
+        $page = inclure_page('404', $contexte);
486
+    }
487
+    $page['status'] = $contexte['status'];
488
+
489
+    return $page;
490 490
 }
491 491
 
492 492
 /**
@@ -498,44 +498,44 @@  discard block
 block discarded – undo
498 498
  * @return mixed
499 499
  */
500 500
 function arguments_balise_dyn_depuis_modele($arg, $operation = 'set') {
501
-	static $balise_dyn_appellee_par_modele = null;
502
-	switch ($operation) {
503
-		case 'read':
504
-			return $balise_dyn_appellee_par_modele;
505
-		case 'reset':
506
-			$balise_dyn_appellee_par_modele = null;
507
-			return null;
508
-		case 'set':
509
-		default:
510
-			$balise_dyn_appellee_par_modele = $arg;
511
-			return $arg;
512
-	}
501
+    static $balise_dyn_appellee_par_modele = null;
502
+    switch ($operation) {
503
+        case 'read':
504
+            return $balise_dyn_appellee_par_modele;
505
+        case 'reset':
506
+            $balise_dyn_appellee_par_modele = null;
507
+            return null;
508
+        case 'set':
509
+        default:
510
+            $balise_dyn_appellee_par_modele = $arg;
511
+            return $arg;
512
+    }
513 513
 }
514 514
 
515 515
 // temporairement ici : a mettre dans le futur inc/modeles
516 516
 // creer_contexte_de_modele('left', 'autostart=true', ...) renvoie un array()
517 517
 function creer_contexte_de_modele($args) {
518
-	$contexte = [];
519
-	foreach ($args as $var => $val) {
520
-		if (is_int($var)) { // argument pas formate
521
-			if (in_array($val, ['left', 'right', 'center'])) {
522
-				$var = 'align';
523
-				$contexte[$var] = $val;
524
-			} else {
525
-				$args = explode('=', $val);
526
-				if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args
527
-				$contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1);
528
-				} else // notation abregee
529
-				{
530
-					$contexte[trim($val)] = trim($val);
531
-				}
532
-			}
533
-		} else {
534
-			$contexte[$var] = $val;
535
-		}
536
-	}
537
-
538
-	return $contexte;
518
+    $contexte = [];
519
+    foreach ($args as $var => $val) {
520
+        if (is_int($var)) { // argument pas formate
521
+            if (in_array($val, ['left', 'right', 'center'])) {
522
+                $var = 'align';
523
+                $contexte[$var] = $val;
524
+            } else {
525
+                $args = explode('=', $val);
526
+                if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args
527
+                $contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1);
528
+                } else // notation abregee
529
+                {
530
+                    $contexte[trim($val)] = trim($val);
531
+                }
532
+            }
533
+        } else {
534
+            $contexte[$var] = $val;
535
+        }
536
+    }
537
+
538
+    return $contexte;
539 539
 }
540 540
 
541 541
 /**
@@ -550,43 +550,43 @@  discard block
 block discarded – undo
550 550
  * @return string
551 551
  */
552 552
 function styliser_modele($modele, $id, $contexte = null) {
553
-	static $styliseurs = null;
554
-	if (is_null($styliseurs)) {
555
-		$tables_objet = lister_tables_objets_sql();
556
-		foreach ($tables_objet as $table => $desc) {
557
-			if (
558
-				isset($desc['modeles']) and $desc['modeles']
559
-				and isset($desc['modeles_styliser']) and $desc['modeles_styliser']
560
-				and function_exists($desc['modeles_styliser'])
561
-			) {
562
-				$primary = id_table_objet($table);
563
-				foreach ($desc['modeles'] as $m) {
564
-					$styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']];
565
-				}
566
-			}
567
-		}
568
-	}
569
-
570
-	if (isset($styliseurs[$modele])) {
571
-		$styliseur = $styliseurs[$modele]['callback'];
572
-		$primary = $styliseurs[$modele]['primary'];
573
-		if (is_null($id) and $contexte) {
574
-			if (isset($contexte['id'])) {
575
-				$id = $contexte['id'];
576
-			} elseif (isset($contexte[$primary])) {
577
-				$id = $contexte[$primary];
578
-			}
579
-		}
580
-		if (is_null($id)) {
581
-			$msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]);
582
-			erreur_squelette($msg);
583
-			// on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant
584
-			$id = 0;
585
-		}
586
-		$modele = $styliseur($modele, $id);
587
-	}
588
-
589
-	return $modele;
553
+    static $styliseurs = null;
554
+    if (is_null($styliseurs)) {
555
+        $tables_objet = lister_tables_objets_sql();
556
+        foreach ($tables_objet as $table => $desc) {
557
+            if (
558
+                isset($desc['modeles']) and $desc['modeles']
559
+                and isset($desc['modeles_styliser']) and $desc['modeles_styliser']
560
+                and function_exists($desc['modeles_styliser'])
561
+            ) {
562
+                $primary = id_table_objet($table);
563
+                foreach ($desc['modeles'] as $m) {
564
+                    $styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']];
565
+                }
566
+            }
567
+        }
568
+    }
569
+
570
+    if (isset($styliseurs[$modele])) {
571
+        $styliseur = $styliseurs[$modele]['callback'];
572
+        $primary = $styliseurs[$modele]['primary'];
573
+        if (is_null($id) and $contexte) {
574
+            if (isset($contexte['id'])) {
575
+                $id = $contexte['id'];
576
+            } elseif (isset($contexte[$primary])) {
577
+                $id = $contexte[$primary];
578
+            }
579
+        }
580
+        if (is_null($id)) {
581
+            $msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]);
582
+            erreur_squelette($msg);
583
+            // on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant
584
+            $id = 0;
585
+        }
586
+        $modele = $styliseur($modele, $id);
587
+    }
588
+
589
+    return $modele;
590 590
 }
591 591
 
592 592
 /**
@@ -603,102 +603,102 @@  discard block
 block discarded – undo
603 603
  */
604 604
 function inclure_modele($type, $id, $params, $lien, string $connect = '', $env = []) {
605 605
 
606
-	static $compteur;
607
-	if (++$compteur > 10) {
608
-		return '';
609
-	} # ne pas boucler indefiniment
610
-
611
-	$type = strtolower($type);
612
-	$type = styliser_modele($type, $id);
613
-
614
-	$fond = $class = '';
615
-
616
-	$params = array_filter(explode('|', $params));
617
-	if ($params) {
618
-		$soustype = current($params);
619
-		$soustype = strtolower(trim($soustype));
620
-		if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) {
621
-			$soustype = next($params);
622
-			$soustype = strtolower($soustype);
623
-		}
624
-
625
-		if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
626
-			if (!trouve_modele($fond = ($type . '_' . $soustype))) {
627
-				$fond = '';
628
-				$class = $soustype;
629
-			}
630
-			// enlever le sous type des params
631
-			$params = array_diff($params, [$soustype]);
632
-		}
633
-	}
634
-
635
-	// Si ca marche pas en precisant le sous-type, prendre le type
636
-	if (!$fond and !trouve_modele($fond = $type)) {
637
-		spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE);
638
-
639
-		return false;
640
-	}
641
-	$fond = 'modeles/' . $fond;
642
-	// Creer le contexte
643
-	$contexte = $env;
644
-	$contexte['dir_racine'] = _DIR_RACINE; # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte
645
-
646
-	// Le numero du modele est mis dans l'environnement
647
-	// d'une part sous l'identifiant "id"
648
-	// et d'autre part sous l'identifiant de la cle primaire
649
-	// par la fonction id_table_objet,
650
-	// (<article1> =>> article =>> id_article =>> id_article=1)
651
-	$_id = id_table_objet($type);
652
-	$contexte['id'] = $contexte[$_id] = $id;
653
-
654
-	if (isset($class)) {
655
-		$contexte['class'] = $class;
656
-	}
657
-
658
-	// Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
659
-	if ($lien) {
660
-		# un eventuel guillemet (") sera reechappe par #ENV
661
-		$contexte['lien'] = str_replace('&quot;', '"', $lien['href']);
662
-		$contexte['lien_class'] = $lien['class'];
663
-		$contexte['lien_mime'] = $lien['mime'];
664
-		$contexte['lien_title'] = $lien['title'];
665
-		$contexte['lien_hreflang'] = $lien['hreflang'];
666
-	}
667
-
668
-	// Traiter les parametres
669
-	// par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
670
-	$arg_list = creer_contexte_de_modele($params);
671
-	$contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
672
-	$contexte = array_merge($contexte, $arg_list);
673
-
674
-	// Appliquer le modele avec le contexte
675
-	$retour = recuperer_fond($fond, $contexte, [], $connect);
676
-
677
-	// Regarder si le modele tient compte des liens (il *doit* alors indiquer
678
-	// spip_lien_ok dans les classes de son conteneur de premier niveau ;
679
-	// sinon, s'il y a un lien, on l'ajoute classiquement
680
-	if (
681
-		strstr(
682
-			' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
683
-			'spip_lien_ok'
684
-		)
685
-	) {
686
-		$retour = inserer_attribut(
687
-			$retour,
688
-			'class',
689
-			trim(str_replace(' spip_lien_ok ', ' ', " $classes "))
690
-		);
691
-	} else {
692
-		if ($lien) {
693
-			$retour = "<a href='" . $lien['href'] . "' class='" . $lien['class'] . "'>" . $retour . '</a>';
694
-		}
695
-	}
696
-
697
-	$compteur--;
698
-
699
-	return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax')
700
-		? encoder_contexte_ajax($contexte, '', $retour)
701
-		: $retour;
606
+    static $compteur;
607
+    if (++$compteur > 10) {
608
+        return '';
609
+    } # ne pas boucler indefiniment
610
+
611
+    $type = strtolower($type);
612
+    $type = styliser_modele($type, $id);
613
+
614
+    $fond = $class = '';
615
+
616
+    $params = array_filter(explode('|', $params));
617
+    if ($params) {
618
+        $soustype = current($params);
619
+        $soustype = strtolower(trim($soustype));
620
+        if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) {
621
+            $soustype = next($params);
622
+            $soustype = strtolower($soustype);
623
+        }
624
+
625
+        if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
626
+            if (!trouve_modele($fond = ($type . '_' . $soustype))) {
627
+                $fond = '';
628
+                $class = $soustype;
629
+            }
630
+            // enlever le sous type des params
631
+            $params = array_diff($params, [$soustype]);
632
+        }
633
+    }
634
+
635
+    // Si ca marche pas en precisant le sous-type, prendre le type
636
+    if (!$fond and !trouve_modele($fond = $type)) {
637
+        spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE);
638
+
639
+        return false;
640
+    }
641
+    $fond = 'modeles/' . $fond;
642
+    // Creer le contexte
643
+    $contexte = $env;
644
+    $contexte['dir_racine'] = _DIR_RACINE; # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte
645
+
646
+    // Le numero du modele est mis dans l'environnement
647
+    // d'une part sous l'identifiant "id"
648
+    // et d'autre part sous l'identifiant de la cle primaire
649
+    // par la fonction id_table_objet,
650
+    // (<article1> =>> article =>> id_article =>> id_article=1)
651
+    $_id = id_table_objet($type);
652
+    $contexte['id'] = $contexte[$_id] = $id;
653
+
654
+    if (isset($class)) {
655
+        $contexte['class'] = $class;
656
+    }
657
+
658
+    // Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
659
+    if ($lien) {
660
+        # un eventuel guillemet (") sera reechappe par #ENV
661
+        $contexte['lien'] = str_replace('&quot;', '"', $lien['href']);
662
+        $contexte['lien_class'] = $lien['class'];
663
+        $contexte['lien_mime'] = $lien['mime'];
664
+        $contexte['lien_title'] = $lien['title'];
665
+        $contexte['lien_hreflang'] = $lien['hreflang'];
666
+    }
667
+
668
+    // Traiter les parametres
669
+    // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
670
+    $arg_list = creer_contexte_de_modele($params);
671
+    $contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
672
+    $contexte = array_merge($contexte, $arg_list);
673
+
674
+    // Appliquer le modele avec le contexte
675
+    $retour = recuperer_fond($fond, $contexte, [], $connect);
676
+
677
+    // Regarder si le modele tient compte des liens (il *doit* alors indiquer
678
+    // spip_lien_ok dans les classes de son conteneur de premier niveau ;
679
+    // sinon, s'il y a un lien, on l'ajoute classiquement
680
+    if (
681
+        strstr(
682
+            ' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
683
+            'spip_lien_ok'
684
+        )
685
+    ) {
686
+        $retour = inserer_attribut(
687
+            $retour,
688
+            'class',
689
+            trim(str_replace(' spip_lien_ok ', ' ', " $classes "))
690
+        );
691
+    } else {
692
+        if ($lien) {
693
+            $retour = "<a href='" . $lien['href'] . "' class='" . $lien['class'] . "'>" . $retour . '</a>';
694
+        }
695
+    }
696
+
697
+    $compteur--;
698
+
699
+    return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax')
700
+        ? encoder_contexte_ajax($contexte, '', $retour)
701
+        : $retour;
702 702
 }
703 703
 
704 704
 // Un inclure_page qui marche aussi pour l'espace prive
@@ -707,105 +707,105 @@  discard block
 block discarded – undo
707 707
 // 	recuperer_fond($fond,$contexte,array('raw'=>true))
708 708
 function evaluer_fond($fond, $contexte = [], string $connect = '') {
709 709
 
710
-	$page = inclure_page($fond, $contexte, $connect);
711
-
712
-	if (!$page) {
713
-		return $page;
714
-	}
715
-	// eval $page et affecte $res
716
-	include _ROOT_RESTREINT . 'public/evaluer_page.php';
717
-
718
-	// Lever un drapeau (global) si le fond utilise #SESSION
719
-	// a destination de public/parametrer
720
-	// pour remonter vers les inclusions appelantes
721
-	// il faut bien lever ce drapeau apres avoir evalue le fond
722
-	// pour ne pas faire descendre le flag vers les inclusions appelees
723
-	if (
724
-		isset($page['invalideurs'])
725
-		and isset($page['invalideurs']['session'])
726
-	) {
727
-		$GLOBALS['cache_utilise_session'] = $page['invalideurs']['session'];
728
-	}
729
-
730
-	return $page;
710
+    $page = inclure_page($fond, $contexte, $connect);
711
+
712
+    if (!$page) {
713
+        return $page;
714
+    }
715
+    // eval $page et affecte $res
716
+    include _ROOT_RESTREINT . 'public/evaluer_page.php';
717
+
718
+    // Lever un drapeau (global) si le fond utilise #SESSION
719
+    // a destination de public/parametrer
720
+    // pour remonter vers les inclusions appelantes
721
+    // il faut bien lever ce drapeau apres avoir evalue le fond
722
+    // pour ne pas faire descendre le flag vers les inclusions appelees
723
+    if (
724
+        isset($page['invalideurs'])
725
+        and isset($page['invalideurs']['session'])
726
+    ) {
727
+        $GLOBALS['cache_utilise_session'] = $page['invalideurs']['session'];
728
+    }
729
+
730
+    return $page;
731 731
 }
732 732
 
733 733
 
734 734
 function page_base_href(&$texte) {
735
-	static $set_html_base = null;
736
-	if (is_null($set_html_base)) {
737
-		if (!defined('_SET_HTML_BASE')) {
738
-			// si la profondeur est superieure a 1
739
-			// est que ce n'est pas une url page ni une url action
740
-			// activer par defaut
741
-		$set_html_base = ((
742
-				$GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
743
-				and _request(_SPIP_PAGE) !== 'login'
744
-				and !_request('action')) ? true : false);
745
-		} else {
746
-			$set_html_base = _SET_HTML_BASE;
747
-		}
748
-	}
749
-
750
-	if (
751
-		$set_html_base
752
-		and isset($GLOBALS['html']) and $GLOBALS['html']
753
-		and $GLOBALS['profondeur_url'] > 0
754
-		and ($poshead = strpos($texte, '</head>')) !== false
755
-	) {
756
-		$head = substr($texte, 0, $poshead);
757
-		$insert = false;
758
-		$href_base = false;
759
-		if (strpos($head, '<base') === false) {
760
-			$insert = true;
761
-		} else {
762
-			// si aucun <base ...> n'a de href il faut en inserer un
763
-			// sinon juste re-ecrire les ancres si besoin
764
-			$insert = true;
765
-			include_spip('inc/filtres');
766
-			$bases = extraire_balises($head, 'base');
767
-			foreach ($bases as $base) {
768
-				if ($href_base = extraire_attribut($base, 'href')) {
769
-					$insert = false;
770
-					break;
771
-				}
772
-			}
773
-		}
774
-
775
-		if ($insert) {
776
-			include_spip('inc/filtres_mini');
777
-			// ajouter un base qui reglera tous les liens relatifs
778
-			$href_base = url_absolue('./');
779
-			$base = "\n<base href=\"$href_base\" />";
780
-			if (($pos = strpos($head, '<head>')) !== false) {
781
-				$head = substr_replace($head, $base, $pos + 6, 0);
782
-			} elseif (preg_match(',<head[^>]*>,i', $head, $r)) {
783
-				$head = str_replace($r[0], $r[0] . $base, $head);
784
-			}
785
-			$texte = $head . substr($texte, $poshead);
786
-		}
787
-		if ($href_base) {
788
-			// gerer les ancres
789
-			$base = $_SERVER['REQUEST_URI'];
790
-			// pas de guillemets ni < dans l'URL qu'on insere dans le HTML
791
-			if (strpos($base, "'") or strpos($base, '"') or strpos($base, '<')) {
792
-				$base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base);
793
-			}
794
-			if (strpos($texte, "href='#") !== false) {
795
-				$texte = str_replace("href='#", "href='$base#", $texte);
796
-			}
797
-			if (strpos($texte, 'href="#') !== false) {
798
-				$texte = str_replace('href="#', "href=\"$base#", $texte);
799
-			}
800
-		}
801
-	}
735
+    static $set_html_base = null;
736
+    if (is_null($set_html_base)) {
737
+        if (!defined('_SET_HTML_BASE')) {
738
+            // si la profondeur est superieure a 1
739
+            // est que ce n'est pas une url page ni une url action
740
+            // activer par defaut
741
+        $set_html_base = ((
742
+                $GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
743
+                and _request(_SPIP_PAGE) !== 'login'
744
+                and !_request('action')) ? true : false);
745
+        } else {
746
+            $set_html_base = _SET_HTML_BASE;
747
+        }
748
+    }
749
+
750
+    if (
751
+        $set_html_base
752
+        and isset($GLOBALS['html']) and $GLOBALS['html']
753
+        and $GLOBALS['profondeur_url'] > 0
754
+        and ($poshead = strpos($texte, '</head>')) !== false
755
+    ) {
756
+        $head = substr($texte, 0, $poshead);
757
+        $insert = false;
758
+        $href_base = false;
759
+        if (strpos($head, '<base') === false) {
760
+            $insert = true;
761
+        } else {
762
+            // si aucun <base ...> n'a de href il faut en inserer un
763
+            // sinon juste re-ecrire les ancres si besoin
764
+            $insert = true;
765
+            include_spip('inc/filtres');
766
+            $bases = extraire_balises($head, 'base');
767
+            foreach ($bases as $base) {
768
+                if ($href_base = extraire_attribut($base, 'href')) {
769
+                    $insert = false;
770
+                    break;
771
+                }
772
+            }
773
+        }
774
+
775
+        if ($insert) {
776
+            include_spip('inc/filtres_mini');
777
+            // ajouter un base qui reglera tous les liens relatifs
778
+            $href_base = url_absolue('./');
779
+            $base = "\n<base href=\"$href_base\" />";
780
+            if (($pos = strpos($head, '<head>')) !== false) {
781
+                $head = substr_replace($head, $base, $pos + 6, 0);
782
+            } elseif (preg_match(',<head[^>]*>,i', $head, $r)) {
783
+                $head = str_replace($r[0], $r[0] . $base, $head);
784
+            }
785
+            $texte = $head . substr($texte, $poshead);
786
+        }
787
+        if ($href_base) {
788
+            // gerer les ancres
789
+            $base = $_SERVER['REQUEST_URI'];
790
+            // pas de guillemets ni < dans l'URL qu'on insere dans le HTML
791
+            if (strpos($base, "'") or strpos($base, '"') or strpos($base, '<')) {
792
+                $base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base);
793
+            }
794
+            if (strpos($texte, "href='#") !== false) {
795
+                $texte = str_replace("href='#", "href='$base#", $texte);
796
+            }
797
+            if (strpos($texte, 'href="#') !== false) {
798
+                $texte = str_replace('href="#', "href=\"$base#", $texte);
799
+            }
800
+        }
801
+    }
802 802
 }
803 803
 
804 804
 
805 805
 // Envoyer les entetes, en retenant ceux qui sont a usage interne
806 806
 // et demarrent par X-Spip-...
807 807
 function envoyer_entetes($entetes) {
808
-	foreach ($entetes as $k => $v) { #	if (strncmp($k, 'X-Spip-', 7))
809
-	@header(strlen($v) ? "$k: $v" : $k);
810
-	}
808
+    foreach ($entetes as $k => $v) { #	if (strncmp($k, 'X-Spip-', 7))
809
+    @header(strlen($v) ? "$k: $v" : $k);
810
+    }
811 811
 }
Please login to merge, or discard this patch.
prive/formulaires/login.php 1 patch
Indentation   +249 added lines, -249 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 include_spip('base/abstract_sql');
@@ -31,11 +31,11 @@  discard block
 block discarded – undo
31 31
  *     true si espace privé, false sinon.
32 32
  **/
33 33
 function is_url_prive($cible) {
34
-	include_spip('inc/filtres_mini');
35
-	$path = parse_url(tester_url_absolue($cible) ? $cible : url_absolue($cible));
36
-	$path = ($path['path'] ?? '');
34
+    include_spip('inc/filtres_mini');
35
+    $path = parse_url(tester_url_absolue($cible) ? $cible : url_absolue($cible));
36
+    $path = ($path['path'] ?? '');
37 37
 
38
-	return strncmp(substr($path, -strlen(_DIR_RESTREINT_ABS)), _DIR_RESTREINT_ABS, strlen(_DIR_RESTREINT_ABS)) == 0;
38
+    return strncmp(substr($path, -strlen(_DIR_RESTREINT_ABS)), _DIR_RESTREINT_ABS, strlen(_DIR_RESTREINT_ABS)) == 0;
39 39
 }
40 40
 
41 41
 /**
@@ -60,111 +60,111 @@  discard block
 block discarded – undo
60 60
  *     Environnement du formulaire
61 61
  **/
62 62
 function formulaires_login_charger_dist($cible = '', $options = [], $deprecated = null) {
63
-	$erreur = _request('var_erreur');
64
-
65
-	if (!is_array($options)) {
66
-		$options = [
67
-			'login' => $options,
68
-			'prive' => $deprecated
69
-		];
70
-	}
71
-
72
-	$login = (empty($options['login']) ? '' : $options['login']);
73
-	$prive = (empty($options['prive']) ? null : $options['prive']);
74
-	// conserver le fonctionnement historique
75
-	if (!isset($options['autofocus'])) {
76
-		$options['autofocus'] = true;
77
-	}
78
-
79
-	if (!$login) {
80
-		$login = strval(_request('var_login'));
81
-	}
82
-	// si on est deja identifie
83
-	if (!$login and isset($GLOBALS['visiteur_session']['email'])) {
84
-		$login = $GLOBALS['visiteur_session']['email'];
85
-	}
86
-	if (!$login and isset($GLOBALS['visiteur_session']['login'])) {
87
-		$login = $GLOBALS['visiteur_session']['login'];
88
-	}
89
-	// ou si on a un cookie admin
90
-	if (!$login) {
91
-		if (
92
-			isset($_COOKIE['spip_admin'])
93
-			and preg_match(',^@(.*)$,', $_COOKIE['spip_admin'], $regs)
94
-		) {
95
-			$login = $regs[1];
96
-		}
97
-	}
98
-
99
-	$lang = $GLOBALS['spip_lang'];
100
-	include_spip('inc/auth');
101
-	$row = auth_informer_login($login);
102
-
103
-	// retablir la langue de l'URL si forcee (on ignore la langue de l'auteur dans ce cas)
104
-	if (_request('lang') === $lang and $GLOBALS['spip_lang'] !== $lang) {
105
-		changer_langue($lang);
106
-	}
107
-
108
-	// Construire l'environnement du squelette
109
-	// Ne pas proposer de "rester connecte quelques jours"
110
-	// si la duree de l'alea est inferieure a 12 h (valeur par defaut)
111
-
112
-	$valeurs = [
113
-		'var_login' => $login,
114
-		'editable' => !$row,
115
-		'cnx' => $row['cnx'] ?? '0',
116
-		'auth_http' => login_auth_http(),
117
-		'rester_connecte' => ((_RENOUVELLE_ALEA < 12 * 3600) ? '' : ' '),
118
-		'_logo' => $row['logo'] ?? '',
119
-		'_alea_actuel' => $row['alea_actuel'] ?? '',
120
-		'_alea_futur' => $row['alea_futur'] ?? '',
121
-		'_pipeline' => 'affiche_formulaire_login', // faire passer le formulaire dans un pipe dedie pour les methodes auth
122
-		'_autofocus' => ($options['autofocus'] and $options['autofocus'] !== 'non') ? ' ' : '',
123
-	];
124
-
125
-	if ($erreur or !isset($GLOBALS['visiteur_session']['id_auteur']) or !$GLOBALS['visiteur_session']['id_auteur']) {
126
-		$valeurs['editable'] = true;
127
-	}
128
-
129
-	if (is_null($prive) ? is_url_prive($cible) : $prive) {
130
-		include_spip('inc/autoriser');
131
-		$loge = autoriser('ecrire');
132
-	} else {
133
-		$loge = (isset($GLOBALS['visiteur_session']['auth']) and $GLOBALS['visiteur_session']['auth'] != '');
134
-	}
135
-
136
-	// Si on est connecte, appeler traiter()
137
-	// et lancer la redirection si besoin
138
-	if (!$valeurs['editable'] and $loge and _request('formulaire_action') !== 'login') {
139
-		$traiter = charger_fonction('traiter', 'formulaires/login');
140
-		$res = $traiter($cible, $login, $prive);
141
-		$valeurs = array_merge($valeurs, $res);
142
-
143
-		if (isset($res['redirect']) and $res['redirect']) {
144
-			include_spip('inc/headers');
145
-			# preparer un lien pour quand redirige_formulaire ne fonctionne pas
146
-			$m = redirige_formulaire($res['redirect']);
147
-			$valeurs['_deja_loge'] = inserer_attribut(
148
-				'<a>' . _T('login_par_ici') . "</a>$m",
149
-				'href',
150
-				$res['redirect']
151
-			);
152
-		}
153
-	}
154
-	// en cas d'echec de cookie, inc_auth a renvoye vers le script de
155
-	// pose de cookie ; s'il n'est pas la, c'est echec cookie
156
-	// s'il est la, c'est probablement un bookmark sur bonjour=oui,
157
-	// et pas un echec cookie.
158
-	if ($erreur == 'cookie') {
159
-		$valeurs['echec_cookie'] = ' ';
160
-	} elseif ($erreur) {
161
-		// une erreur d'un SSO indique dans la redirection vers ici
162
-		// mais il faut se proteger de toute tentative d'injection malveilante
163
-		include_spip('inc/filtres');
164
-		$valeurs['message_erreur'] = textebrut($erreur);
165
-	}
166
-
167
-	return $valeurs;
63
+    $erreur = _request('var_erreur');
64
+
65
+    if (!is_array($options)) {
66
+        $options = [
67
+            'login' => $options,
68
+            'prive' => $deprecated
69
+        ];
70
+    }
71
+
72
+    $login = (empty($options['login']) ? '' : $options['login']);
73
+    $prive = (empty($options['prive']) ? null : $options['prive']);
74
+    // conserver le fonctionnement historique
75
+    if (!isset($options['autofocus'])) {
76
+        $options['autofocus'] = true;
77
+    }
78
+
79
+    if (!$login) {
80
+        $login = strval(_request('var_login'));
81
+    }
82
+    // si on est deja identifie
83
+    if (!$login and isset($GLOBALS['visiteur_session']['email'])) {
84
+        $login = $GLOBALS['visiteur_session']['email'];
85
+    }
86
+    if (!$login and isset($GLOBALS['visiteur_session']['login'])) {
87
+        $login = $GLOBALS['visiteur_session']['login'];
88
+    }
89
+    // ou si on a un cookie admin
90
+    if (!$login) {
91
+        if (
92
+            isset($_COOKIE['spip_admin'])
93
+            and preg_match(',^@(.*)$,', $_COOKIE['spip_admin'], $regs)
94
+        ) {
95
+            $login = $regs[1];
96
+        }
97
+    }
98
+
99
+    $lang = $GLOBALS['spip_lang'];
100
+    include_spip('inc/auth');
101
+    $row = auth_informer_login($login);
102
+
103
+    // retablir la langue de l'URL si forcee (on ignore la langue de l'auteur dans ce cas)
104
+    if (_request('lang') === $lang and $GLOBALS['spip_lang'] !== $lang) {
105
+        changer_langue($lang);
106
+    }
107
+
108
+    // Construire l'environnement du squelette
109
+    // Ne pas proposer de "rester connecte quelques jours"
110
+    // si la duree de l'alea est inferieure a 12 h (valeur par defaut)
111
+
112
+    $valeurs = [
113
+        'var_login' => $login,
114
+        'editable' => !$row,
115
+        'cnx' => $row['cnx'] ?? '0',
116
+        'auth_http' => login_auth_http(),
117
+        'rester_connecte' => ((_RENOUVELLE_ALEA < 12 * 3600) ? '' : ' '),
118
+        '_logo' => $row['logo'] ?? '',
119
+        '_alea_actuel' => $row['alea_actuel'] ?? '',
120
+        '_alea_futur' => $row['alea_futur'] ?? '',
121
+        '_pipeline' => 'affiche_formulaire_login', // faire passer le formulaire dans un pipe dedie pour les methodes auth
122
+        '_autofocus' => ($options['autofocus'] and $options['autofocus'] !== 'non') ? ' ' : '',
123
+    ];
124
+
125
+    if ($erreur or !isset($GLOBALS['visiteur_session']['id_auteur']) or !$GLOBALS['visiteur_session']['id_auteur']) {
126
+        $valeurs['editable'] = true;
127
+    }
128
+
129
+    if (is_null($prive) ? is_url_prive($cible) : $prive) {
130
+        include_spip('inc/autoriser');
131
+        $loge = autoriser('ecrire');
132
+    } else {
133
+        $loge = (isset($GLOBALS['visiteur_session']['auth']) and $GLOBALS['visiteur_session']['auth'] != '');
134
+    }
135
+
136
+    // Si on est connecte, appeler traiter()
137
+    // et lancer la redirection si besoin
138
+    if (!$valeurs['editable'] and $loge and _request('formulaire_action') !== 'login') {
139
+        $traiter = charger_fonction('traiter', 'formulaires/login');
140
+        $res = $traiter($cible, $login, $prive);
141
+        $valeurs = array_merge($valeurs, $res);
142
+
143
+        if (isset($res['redirect']) and $res['redirect']) {
144
+            include_spip('inc/headers');
145
+            # preparer un lien pour quand redirige_formulaire ne fonctionne pas
146
+            $m = redirige_formulaire($res['redirect']);
147
+            $valeurs['_deja_loge'] = inserer_attribut(
148
+                '<a>' . _T('login_par_ici') . "</a>$m",
149
+                'href',
150
+                $res['redirect']
151
+            );
152
+        }
153
+    }
154
+    // en cas d'echec de cookie, inc_auth a renvoye vers le script de
155
+    // pose de cookie ; s'il n'est pas la, c'est echec cookie
156
+    // s'il est la, c'est probablement un bookmark sur bonjour=oui,
157
+    // et pas un echec cookie.
158
+    if ($erreur == 'cookie') {
159
+        $valeurs['echec_cookie'] = ' ';
160
+    } elseif ($erreur) {
161
+        // une erreur d'un SSO indique dans la redirection vers ici
162
+        // mais il faut se proteger de toute tentative d'injection malveilante
163
+        include_spip('inc/filtres');
164
+        $valeurs['message_erreur'] = textebrut($erreur);
165
+    }
166
+
167
+    return $valeurs;
168 168
 }
169 169
 
170 170
 
@@ -179,20 +179,20 @@  discard block
 block discarded – undo
179 179
  *     - chaîne vide sinon.
180 180
  **/
181 181
 function login_auth_http() {
182
-	if (
183
-		!$GLOBALS['ignore_auth_http']
184
-		and _request('var_erreur') == 'cookie'
185
-		and (!isset($_COOKIE['spip_session']) or $_COOKIE['spip_session'] != 'test_echec_cookie')
186
-		and (preg_match(',apache,', \PHP_SAPI)
187
-			or preg_match(',^Apache.* PHP,', $_SERVER['SERVER_SOFTWARE']))
188
-		// Attention dans le cas 'intranet' la proposition de se loger
189
-		// par auth_http peut conduire a l'echec.
190
-		and !(isset($_SERVER['PHP_AUTH_USER']) and isset($_SERVER['PHP_AUTH_PW']))
191
-	) {
192
-		return generer_url_action('cookie', '', false, true);
193
-	} else {
194
-		return '';
195
-	}
182
+    if (
183
+        !$GLOBALS['ignore_auth_http']
184
+        and _request('var_erreur') == 'cookie'
185
+        and (!isset($_COOKIE['spip_session']) or $_COOKIE['spip_session'] != 'test_echec_cookie')
186
+        and (preg_match(',apache,', \PHP_SAPI)
187
+            or preg_match(',^Apache.* PHP,', $_SERVER['SERVER_SOFTWARE']))
188
+        // Attention dans le cas 'intranet' la proposition de se loger
189
+        // par auth_http peut conduire a l'echec.
190
+        and !(isset($_SERVER['PHP_AUTH_USER']) and isset($_SERVER['PHP_AUTH_PW']))
191
+    ) {
192
+        return generer_url_action('cookie', '', false, true);
193
+    } else {
194
+        return '';
195
+    }
196 196
 }
197 197
 
198 198
 
@@ -218,65 +218,65 @@  discard block
 block discarded – undo
218 218
  **/
219 219
 function formulaires_login_verifier_dist($cible = '', $options = [], $deprecated = null) {
220 220
 
221
-	$erreurs = [];
222
-	if (!is_array($options)) {
223
-		$options = [
224
-			'login' => $options,
225
-			'prive' => $deprecated
226
-		];
227
-	}
228
-
229
-	$prive = (empty($options['prive']) ? null : $options['prive']);
230
-
231
-	$session_login = _request('var_login');
232
-	$session_password = _request('password');
233
-	$session_remember = _request('session_remember');
234
-
235
-	if (!$session_login) {
236
-		# pas de login saisi !
237
-		return ['var_login' => _T('info_obligatoire')];
238
-	}
239
-
240
-	// appeler auth_identifier_login qui va :
241
-	// - renvoyer un string si echec (message d'erreur)
242
-	// - un array decrivant l'auteur identifie si possible
243
-	// - rediriger vers un SSO qui renverra in fine sur action/auth qui finira l'authentification
244
-	include_spip('inc/auth');
245
-	$auteur = auth_identifier_login($session_login, $session_password);
246
-	// on arrive ici si on ne s'est pas identifie avec un SSO
247
-	if (!is_array($auteur)) {
248
-		$erreurs = [];
249
-		if (is_string($auteur) and strlen($auteur)) {
250
-			$erreurs['var_login'] = $auteur;
251
-		}
252
-		include_spip('inc/cookie');
253
-		spip_setcookie('spip_admin', '', time() - 3600);
254
-		if (strlen($session_password)) {
255
-			$erreurs['password'] = _T('login_erreur_pass');
256
-		} else {
257
-			// sinon c'est un login en deux passe old style (ou js en panne)
258
-			// pas de message d'erreur
259
-			$erreurs['password'] = ' ';
260
-			$erreurs['message_erreur'] = '';
261
-		}
262
-
263
-		return
264
-			$erreurs;
265
-	}
266
-	// on a ete authentifie, construire la session
267
-	// en gerant la duree demandee pour son cookie
268
-	if ($session_remember !== null) {
269
-		$auteur['cookie'] = $session_remember;
270
-	}
271
-	// si la connexion est refusee on renvoi un message erreur de mot de passe
272
-	// car en donnant plus de detail on renseignerait un assaillant sur l'existence d'un compte
273
-	if (auth_loger($auteur) === false) {
274
-		$erreurs['message_erreur'] = _T('login_erreur_pass');
275
-		return $erreurs;
276
-	}
277
-
278
-	return (is_null($prive) ? is_url_prive($cible) : $prive)
279
-		? login_autoriser() : [];
221
+    $erreurs = [];
222
+    if (!is_array($options)) {
223
+        $options = [
224
+            'login' => $options,
225
+            'prive' => $deprecated
226
+        ];
227
+    }
228
+
229
+    $prive = (empty($options['prive']) ? null : $options['prive']);
230
+
231
+    $session_login = _request('var_login');
232
+    $session_password = _request('password');
233
+    $session_remember = _request('session_remember');
234
+
235
+    if (!$session_login) {
236
+        # pas de login saisi !
237
+        return ['var_login' => _T('info_obligatoire')];
238
+    }
239
+
240
+    // appeler auth_identifier_login qui va :
241
+    // - renvoyer un string si echec (message d'erreur)
242
+    // - un array decrivant l'auteur identifie si possible
243
+    // - rediriger vers un SSO qui renverra in fine sur action/auth qui finira l'authentification
244
+    include_spip('inc/auth');
245
+    $auteur = auth_identifier_login($session_login, $session_password);
246
+    // on arrive ici si on ne s'est pas identifie avec un SSO
247
+    if (!is_array($auteur)) {
248
+        $erreurs = [];
249
+        if (is_string($auteur) and strlen($auteur)) {
250
+            $erreurs['var_login'] = $auteur;
251
+        }
252
+        include_spip('inc/cookie');
253
+        spip_setcookie('spip_admin', '', time() - 3600);
254
+        if (strlen($session_password)) {
255
+            $erreurs['password'] = _T('login_erreur_pass');
256
+        } else {
257
+            // sinon c'est un login en deux passe old style (ou js en panne)
258
+            // pas de message d'erreur
259
+            $erreurs['password'] = ' ';
260
+            $erreurs['message_erreur'] = '';
261
+        }
262
+
263
+        return
264
+            $erreurs;
265
+    }
266
+    // on a ete authentifie, construire la session
267
+    // en gerant la duree demandee pour son cookie
268
+    if ($session_remember !== null) {
269
+        $auteur['cookie'] = $session_remember;
270
+    }
271
+    // si la connexion est refusee on renvoi un message erreur de mot de passe
272
+    // car en donnant plus de detail on renseignerait un assaillant sur l'existence d'un compte
273
+    if (auth_loger($auteur) === false) {
274
+        $erreurs['message_erreur'] = _T('login_erreur_pass');
275
+        return $erreurs;
276
+    }
277
+
278
+    return (is_null($prive) ? is_url_prive($cible) : $prive)
279
+        ? login_autoriser() : [];
280 280
 }
281 281
 
282 282
 /**
@@ -291,21 +291,21 @@  discard block
 block discarded – undo
291 291
  *     - tableau vide sinon.
292 292
  **/
293 293
 function login_autoriser() {
294
-	include_spip('inc/autoriser');
295
-	if (!autoriser('ecrire')) {
296
-		$h = generer_url_action('logout', 'logout=prive&url=' . urlencode(self()));
297
-
298
-		return [
299
-			'message_erreur' => '<h1>'
300
-				. _T('avis_erreur_visiteur')
301
-				. '</h1><p>'
302
-				. _T('texte_erreur_visiteur')
303
-				. "</p><p class='retour'>[<a href='$h'>"
304
-				. _T('icone_deconnecter') . '</a>]</p>'
305
-		];
306
-	}
307
-
308
-	return [];
294
+    include_spip('inc/autoriser');
295
+    if (!autoriser('ecrire')) {
296
+        $h = generer_url_action('logout', 'logout=prive&url=' . urlencode(self()));
297
+
298
+        return [
299
+            'message_erreur' => '<h1>'
300
+                . _T('avis_erreur_visiteur')
301
+                . '</h1><p>'
302
+                . _T('texte_erreur_visiteur')
303
+                . "</p><p class='retour'>[<a href='$h'>"
304
+                . _T('icone_deconnecter') . '</a>]</p>'
305
+        ];
306
+    }
307
+
308
+    return [];
309 309
 }
310 310
 
311 311
 /**
@@ -326,55 +326,55 @@  discard block
 block discarded – undo
326 326
  *     Retours du traitement
327 327
  **/
328 328
 function formulaires_login_traiter_dist($cible = '', $options = [], $deprecated = null) {
329
-	$res = [];
330
-
331
-	if (!is_array($options)) {
332
-		$options = [
333
-			'login' => $options,
334
-			'prive' => $deprecated
335
-		];
336
-	}
337
-
338
-	$login = (empty($options['login']) ? '' : $options['login']);
339
-	$prive = (empty($options['prive']) ? null : $options['prive']);
340
-
341
-	// Si on se connecte dans l'espace prive,
342
-	// ajouter "bonjour" (repere a peu pres les cookies desactives)
343
-	if (is_null($prive) ? is_url_prive($cible) : $prive) {
344
-		$cible = parametre_url($cible, 'bonjour', 'oui', '&');
345
-	}
346
-	if ($cible == '@page_auteur') {
347
-		$cible = generer_objet_url($GLOBALS['auteur_session']['id_auteur'], 'auteur');
348
-	}
349
-
350
-	if ($cible) {
351
-		$cible = parametre_url($cible, 'var_login', '', '&');
352
-
353
-		// transformer la cible absolue en cible relative
354
-		// pour pas echouer quand la meta adresse_site est foireuse
355
-		if (strncmp($cible, $u = url_de_base(), strlen($u)) == 0) {
356
-			$cible = './' . substr($cible, strlen($u));
357
-		} elseif (tester_url_absolue($cible) and !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) {
358
-			// si c'est une url absolue, refuser la redirection
359
-			// sauf si cette securite est levee volontairement par le webmestre
360
-			$cible = '';
361
-		}
362
-	}
363
-
364
-	// Si on est connecte, envoyer vers la destination
365
-	if ($cible and ($cible != self('&')) and ($cible != self())) {
366
-		$res['redirect'] = $cible;
367
-		$res['message_ok'] = inserer_attribut(
368
-			'<a>' . _T('login_par_ici') . '</a>',
369
-			'href',
370
-			$cible
371
-		);
372
-	}
373
-
374
-	// avant de rediriger il faut mettre a jour les sessions sur le disque si on a charge une session
375
-	if (function_exists('terminer_actualiser_sessions')) {
376
-		terminer_actualiser_sessions();
377
-	}
378
-
379
-	return $res;
329
+    $res = [];
330
+
331
+    if (!is_array($options)) {
332
+        $options = [
333
+            'login' => $options,
334
+            'prive' => $deprecated
335
+        ];
336
+    }
337
+
338
+    $login = (empty($options['login']) ? '' : $options['login']);
339
+    $prive = (empty($options['prive']) ? null : $options['prive']);
340
+
341
+    // Si on se connecte dans l'espace prive,
342
+    // ajouter "bonjour" (repere a peu pres les cookies desactives)
343
+    if (is_null($prive) ? is_url_prive($cible) : $prive) {
344
+        $cible = parametre_url($cible, 'bonjour', 'oui', '&');
345
+    }
346
+    if ($cible == '@page_auteur') {
347
+        $cible = generer_objet_url($GLOBALS['auteur_session']['id_auteur'], 'auteur');
348
+    }
349
+
350
+    if ($cible) {
351
+        $cible = parametre_url($cible, 'var_login', '', '&');
352
+
353
+        // transformer la cible absolue en cible relative
354
+        // pour pas echouer quand la meta adresse_site est foireuse
355
+        if (strncmp($cible, $u = url_de_base(), strlen($u)) == 0) {
356
+            $cible = './' . substr($cible, strlen($u));
357
+        } elseif (tester_url_absolue($cible) and !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) {
358
+            // si c'est une url absolue, refuser la redirection
359
+            // sauf si cette securite est levee volontairement par le webmestre
360
+            $cible = '';
361
+        }
362
+    }
363
+
364
+    // Si on est connecte, envoyer vers la destination
365
+    if ($cible and ($cible != self('&')) and ($cible != self())) {
366
+        $res['redirect'] = $cible;
367
+        $res['message_ok'] = inserer_attribut(
368
+            '<a>' . _T('login_par_ici') . '</a>',
369
+            'href',
370
+            $cible
371
+        );
372
+    }
373
+
374
+    // avant de rediriger il faut mettre a jour les sessions sur le disque si on a charge une session
375
+    if (function_exists('terminer_actualiser_sessions')) {
376
+        terminer_actualiser_sessions();
377
+    }
378
+
379
+    return $res;
380 380
 }
Please login to merge, or discard this patch.