Completed
Push — master ( 71dce3...b469db )
by cam
01:44
created
ecrire/maj/2021.php 2 patches
Indentation   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -19,15 +19,15 @@
 block discarded – undo
19 19
  * @package SPIP\Core\SQL\Upgrade
20 20
  **/
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 $GLOBALS['maj'][2021_02_18_00] = [
26
-	['sql_alter', "TABLE spip_auteurs CHANGE imessage imessage VARCHAR(3) DEFAULT '' NOT NULL" ],
27
-	['sql_updateq', 'spip_auteurs', ['imessage' => 'oui'], "imessage != 'non' OR imessage IS NULL" ],
26
+    ['sql_alter', "TABLE spip_auteurs CHANGE imessage imessage VARCHAR(3) DEFAULT '' NOT NULL" ],
27
+    ['sql_updateq', 'spip_auteurs', ['imessage' => 'oui'], "imessage != 'non' OR imessage IS NULL" ],
28 28
 ];
29 29
 
30 30
 $GLOBALS['maj'][2022_02_23_02] = [
31
-	['sql_alter', "TABLE spip_auteurs ADD backup_cles mediumtext DEFAULT '' NOT NULL" ],
32
-	['sql_delete', "spip_meta","nom='secret_du_site'" ],
31
+    ['sql_alter', "TABLE spip_auteurs ADD backup_cles mediumtext DEFAULT '' NOT NULL" ],
32
+    ['sql_delete', "spip_meta","nom='secret_du_site'" ],
33 33
 ];
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -23,11 +23,11 @@
 block discarded – undo
23 23
 }
24 24
 
25 25
 $GLOBALS['maj'][2021_02_18_00] = [
26
-	['sql_alter', "TABLE spip_auteurs CHANGE imessage imessage VARCHAR(3) DEFAULT '' NOT NULL" ],
27
-	['sql_updateq', 'spip_auteurs', ['imessage' => 'oui'], "imessage != 'non' OR imessage IS NULL" ],
26
+	['sql_alter', "TABLE spip_auteurs CHANGE imessage imessage VARCHAR(3) DEFAULT '' NOT NULL"],
27
+	['sql_updateq', 'spip_auteurs', ['imessage' => 'oui'], "imessage != 'non' OR imessage IS NULL"],
28 28
 ];
29 29
 
30 30
 $GLOBALS['maj'][2022_02_23_02] = [
31
-	['sql_alter', "TABLE spip_auteurs ADD backup_cles mediumtext DEFAULT '' NOT NULL" ],
32
-	['sql_delete', "spip_meta","nom='secret_du_site'" ],
31
+	['sql_alter', "TABLE spip_auteurs ADD backup_cles mediumtext DEFAULT '' NOT NULL"],
32
+	['sql_delete', "spip_meta", "nom='secret_du_site'"],
33 33
 ];
Please login to merge, or discard this patch.
ecrire/action/inscrire_auteur.php 2 patches
Indentation   +238 added lines, -238 removed lines patch added patch discarded remove patch
@@ -21,7 +21,7 @@  discard block
 block discarded – undo
21 21
 
22 22
 
23 23
 if (!defined('_ECRIRE_INC_VERSION')) {
24
-	return;
24
+    return;
25 25
 }
26 26
 
27 27
 
@@ -44,70 +44,70 @@  discard block
 block discarded – undo
44 44
  * @return array|string
45 45
  */
46 46
 function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = []) {
47
-	if (!is_array($options)) {
48
-		$options = ['id' => $options];
49
-	}
50
-
51
-	if (function_exists('test_inscription')) {
52
-		$f = 'test_inscription';
53
-	} else {
54
-		$f = 'test_inscription_dist';
55
-	}
56
-	$desc = $f($statut, $mail_complet, $nom, $options);
57
-
58
-	// erreur ?
59
-	if (!is_array($desc)) {
60
-		return _T($desc);
61
-	}
62
-
63
-	include_spip('base/abstract_sql');
64
-	$res = sql_select('statut, id_auteur, login, email, nom', 'spip_auteurs', 'email=' . sql_quote($desc['email']));
65
-	// erreur ?
66
-	if (!$res) {
67
-		return _T('titre_probleme_technique');
68
-	}
69
-
70
-	$row = sql_fetch($res);
71
-	sql_free($res);
72
-	if ($row) {
73
-		if (isset($options['force_nouveau']) and $options['force_nouveau'] == true) {
74
-			$desc['id_auteur'] = $row['id_auteur'];
75
-			$desc = inscription_nouveau($desc);
76
-		} else {
77
-			$desc = $row;
78
-		}
79
-	} else // s'il n'existe pas deja, creer les identifiants
80
-	{
81
-		$desc = inscription_nouveau($desc);
82
-	}
83
-
84
-	// erreur ?
85
-	if (!is_array($desc)) {
86
-		return $desc;
87
-	}
88
-
89
-
90
-	// generer le mot de passe (ou le refaire si compte inutilise)
91
-	$desc['pass'] = creer_pass_pour_auteur($desc['id_auteur']);
92
-
93
-	// attribuer un jeton pour confirmation par clic sur un lien
94
-	$desc['jeton'] = auteur_attribuer_jeton($desc['id_auteur']);
95
-
96
-	// charger de suite cette fonction, pour ses utilitaires
97
-	$envoyer_inscription = charger_fonction('envoyer_inscription', '');
98
-	[$sujet, $msg, $from, $head] = $envoyer_inscription($desc, $nom, $statut, $options);
99
-
100
-	$notifications = charger_fonction('notifications', 'inc');
101
-	notifications_envoyer_mails($mail_complet, $msg, $sujet, $from, $head);
102
-
103
-	// Notifications
104
-	$notifications(
105
-		'inscription',
106
-		$desc['id_auteur'],
107
-		['nom' => $desc['nom'], 'email' => $desc['email']]
108
-	);
109
-
110
-	return $desc;
47
+    if (!is_array($options)) {
48
+        $options = ['id' => $options];
49
+    }
50
+
51
+    if (function_exists('test_inscription')) {
52
+        $f = 'test_inscription';
53
+    } else {
54
+        $f = 'test_inscription_dist';
55
+    }
56
+    $desc = $f($statut, $mail_complet, $nom, $options);
57
+
58
+    // erreur ?
59
+    if (!is_array($desc)) {
60
+        return _T($desc);
61
+    }
62
+
63
+    include_spip('base/abstract_sql');
64
+    $res = sql_select('statut, id_auteur, login, email, nom', 'spip_auteurs', 'email=' . sql_quote($desc['email']));
65
+    // erreur ?
66
+    if (!$res) {
67
+        return _T('titre_probleme_technique');
68
+    }
69
+
70
+    $row = sql_fetch($res);
71
+    sql_free($res);
72
+    if ($row) {
73
+        if (isset($options['force_nouveau']) and $options['force_nouveau'] == true) {
74
+            $desc['id_auteur'] = $row['id_auteur'];
75
+            $desc = inscription_nouveau($desc);
76
+        } else {
77
+            $desc = $row;
78
+        }
79
+    } else // s'il n'existe pas deja, creer les identifiants
80
+    {
81
+        $desc = inscription_nouveau($desc);
82
+    }
83
+
84
+    // erreur ?
85
+    if (!is_array($desc)) {
86
+        return $desc;
87
+    }
88
+
89
+
90
+    // generer le mot de passe (ou le refaire si compte inutilise)
91
+    $desc['pass'] = creer_pass_pour_auteur($desc['id_auteur']);
92
+
93
+    // attribuer un jeton pour confirmation par clic sur un lien
94
+    $desc['jeton'] = auteur_attribuer_jeton($desc['id_auteur']);
95
+
96
+    // charger de suite cette fonction, pour ses utilitaires
97
+    $envoyer_inscription = charger_fonction('envoyer_inscription', '');
98
+    [$sujet, $msg, $from, $head] = $envoyer_inscription($desc, $nom, $statut, $options);
99
+
100
+    $notifications = charger_fonction('notifications', 'inc');
101
+    notifications_envoyer_mails($mail_complet, $msg, $sujet, $from, $head);
102
+
103
+    // Notifications
104
+    $notifications(
105
+        'inscription',
106
+        $desc['id_auteur'],
107
+        ['nom' => $desc['nom'], 'email' => $desc['email']]
108
+    );
109
+
110
+    return $desc;
111 111
 }
112 112
 
113 113
 
@@ -130,23 +130,23 @@  discard block
 block discarded – undo
130 130
  *
131 131
  */
132 132
 function test_inscription_dist($statut, $mail, $nom, $options) {
133
-	include_spip('inc/filtres');
134
-	if (!$r = email_valide($mail)) {
135
-		return 'info_email_invalide';
136
-	}
137
-	$nom = trim(corriger_caracteres($nom));
138
-	$res = ['email' => $r, 'nom' => $nom, 'prefs' => $statut];
139
-	if (isset($options['login'])) {
140
-		$login = trim(corriger_caracteres($options['login']));
141
-		if ((strlen($login) >= _LOGIN_TROP_COURT) and (strlen($nom) <= 64)) {
142
-			$res['login'] = $login;
143
-		}
144
-	}
145
-	if (!isset($res['login']) and ((strlen($nom) < _LOGIN_TROP_COURT) or (strlen($nom) > 64))) {
146
-		return 'ecrire:info_login_trop_court';
147
-	}
148
-
149
-	return $res;
133
+    include_spip('inc/filtres');
134
+    if (!$r = email_valide($mail)) {
135
+        return 'info_email_invalide';
136
+    }
137
+    $nom = trim(corriger_caracteres($nom));
138
+    $res = ['email' => $r, 'nom' => $nom, 'prefs' => $statut];
139
+    if (isset($options['login'])) {
140
+        $login = trim(corriger_caracteres($options['login']));
141
+        if ((strlen($login) >= _LOGIN_TROP_COURT) and (strlen($nom) <= 64)) {
142
+            $res['login'] = $login;
143
+        }
144
+    }
145
+    if (!isset($res['login']) and ((strlen($nom) < _LOGIN_TROP_COURT) or (strlen($nom) > 64))) {
146
+        return 'ecrire:info_login_trop_court';
147
+    }
148
+
149
+    return $res;
150 150
 }
151 151
 
152 152
 
@@ -159,33 +159,33 @@  discard block
 block discarded – undo
159 159
  * @return mixed|string
160 160
  */
161 161
 function inscription_nouveau($desc) {
162
-	if (!isset($desc['login']) or !strlen($desc['login'])) {
163
-		$desc['login'] = test_login($desc['nom'], $desc['email']);
164
-	}
162
+    if (!isset($desc['login']) or !strlen($desc['login'])) {
163
+        $desc['login'] = test_login($desc['nom'], $desc['email']);
164
+    }
165 165
 
166
-	$desc['statut'] = 'nouveau';
167
-	include_spip('action/editer_auteur');
168
-	if (isset($desc['id_auteur'])) {
169
-		$id_auteur = $desc['id_auteur'];
170
-	} else {
171
-		$id_auteur = auteur_inserer();
172
-	}
166
+    $desc['statut'] = 'nouveau';
167
+    include_spip('action/editer_auteur');
168
+    if (isset($desc['id_auteur'])) {
169
+        $id_auteur = $desc['id_auteur'];
170
+    } else {
171
+        $id_auteur = auteur_inserer();
172
+    }
173 173
 
174
-	if (!$id_auteur) {
175
-		return _T('titre_probleme_technique');
176
-	}
174
+    if (!$id_auteur) {
175
+        return _T('titre_probleme_technique');
176
+    }
177 177
 
178
-	$desc['lang'] = $GLOBALS['spip_lang'];
178
+    $desc['lang'] = $GLOBALS['spip_lang'];
179 179
 
180
-	include_spip('inc/autoriser');
181
-	// lever l'autorisation pour pouvoir modifier le statut
182
-	autoriser_exception('modifier', 'auteur', $id_auteur);
183
-	auteur_modifier($id_auteur, $desc);
184
-	autoriser_exception('modifier', 'auteur', $id_auteur, false);
180
+    include_spip('inc/autoriser');
181
+    // lever l'autorisation pour pouvoir modifier le statut
182
+    autoriser_exception('modifier', 'auteur', $id_auteur);
183
+    auteur_modifier($id_auteur, $desc);
184
+    autoriser_exception('modifier', 'auteur', $id_auteur, false);
185 185
 
186
-	$desc['id_auteur'] = $id_auteur;
186
+    $desc['id_auteur'] = $id_auteur;
187 187
 
188
-	return $desc;
188
+    return $desc;
189 189
 }
190 190
 
191 191
 
@@ -202,27 +202,27 @@  discard block
 block discarded – undo
202 202
  * @return string
203 203
  */
204 204
 function test_login($nom, $mail) {
205
-	include_spip('inc/charsets');
206
-	$nom = strtolower(translitteration($nom));
207
-	$login_base = preg_replace('/[^\w\d_]/', '_', $nom);
208
-
209
-	// il faut eviter que le login soit vraiment trop court
210
-	if (strlen($login_base) < 3) {
211
-		$mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail)));
212
-		$login_base = preg_replace('/[^\w\d]/', '_', $mail);
213
-	}
214
-	if (strlen($login_base) < 3) {
215
-		$login_base = 'user';
216
-	}
217
-
218
-	$login = $login_base;
219
-
220
-	for ($i = 1;; $i++) {
221
-		if (!sql_countsel('spip_auteurs', "login='$login'")) {
222
-			return $login;
223
-		}
224
-		$login = $login_base . $i;
225
-	}
205
+    include_spip('inc/charsets');
206
+    $nom = strtolower(translitteration($nom));
207
+    $login_base = preg_replace('/[^\w\d_]/', '_', $nom);
208
+
209
+    // il faut eviter que le login soit vraiment trop court
210
+    if (strlen($login_base) < 3) {
211
+        $mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail)));
212
+        $login_base = preg_replace('/[^\w\d]/', '_', $mail);
213
+    }
214
+    if (strlen($login_base) < 3) {
215
+        $login_base = 'user';
216
+    }
217
+
218
+    $login = $login_base;
219
+
220
+    for ($i = 1;; $i++) {
221
+        if (!sql_countsel('spip_auteurs', "login='$login'")) {
222
+            return $login;
223
+        }
224
+        $login = $login_base . $i;
225
+    }
226 226
 }
227 227
 
228 228
 
@@ -240,26 +240,26 @@  discard block
 block discarded – undo
240 240
  */
241 241
 function envoyer_inscription_dist($desc, $nom, $mode, $options = []) {
242 242
 
243
-	$contexte = array_merge($desc, $options);
244
-	$contexte['nom'] = $nom;
245
-	$contexte['mode'] = $mode;
246
-	$contexte['url_confirm'] = generer_url_action('confirmer_inscription', '', true, true);
247
-	$contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'email', $desc['email']);
248
-	$contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'jeton', $desc['jeton']);
249
-	// S'il y a l'option redirect, on l'ajoute directement ici
250
-	if (isset($options['redirect'])) {
251
-		$contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'redirect', $options['redirect']);
252
-	}
253
-
254
-	$modele_mail = 'modeles/mail_inscription';
255
-	if (isset($options['modele_mail']) and $options['modele_mail']) {
256
-		$modele_mail = $options['modele_mail'];
257
-	}
258
-	$message = recuperer_fond($modele_mail, $contexte);
259
-	$from = ($options['from'] ?? null);
260
-	$head = null;
261
-
262
-	return ['', $message, $from, $head];
243
+    $contexte = array_merge($desc, $options);
244
+    $contexte['nom'] = $nom;
245
+    $contexte['mode'] = $mode;
246
+    $contexte['url_confirm'] = generer_url_action('confirmer_inscription', '', true, true);
247
+    $contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'email', $desc['email']);
248
+    $contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'jeton', $desc['jeton']);
249
+    // S'il y a l'option redirect, on l'ajoute directement ici
250
+    if (isset($options['redirect'])) {
251
+        $contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'redirect', $options['redirect']);
252
+    }
253
+
254
+    $modele_mail = 'modeles/mail_inscription';
255
+    if (isset($options['modele_mail']) and $options['modele_mail']) {
256
+        $modele_mail = $options['modele_mail'];
257
+    }
258
+    $message = recuperer_fond($modele_mail, $contexte);
259
+    $from = ($options['from'] ?? null);
260
+    $head = null;
261
+
262
+    return ['', $message, $from, $head];
263 263
 }
264 264
 
265 265
 
@@ -270,12 +270,12 @@  discard block
 block discarded – undo
270 270
  * @return string
271 271
  */
272 272
 function creer_pass_pour_auteur($id_auteur) {
273
-	include_spip('inc/acces');
274
-	$pass = creer_pass_aleatoire(max(_PASS_LONGUEUR_MINI, 16), $id_auteur);
275
-	include_spip('action/editer_auteur');
276
-	auteur_instituer($id_auteur, ['pass' => $pass]);
273
+    include_spip('inc/acces');
274
+    $pass = creer_pass_aleatoire(max(_PASS_LONGUEUR_MINI, 16), $id_auteur);
275
+    include_spip('action/editer_auteur');
276
+    auteur_instituer($id_auteur, ['pass' => $pass]);
277 277
 
278
-	return $pass;
278
+    return $pass;
279 279
 }
280 280
 
281 281
 /**
@@ -288,17 +288,17 @@  discard block
 block discarded – undo
288 288
  * @return string
289 289
  */
290 290
 function tester_statut_inscription($statut_tmp, $id) {
291
-	include_spip('inc/autoriser');
292
-	if ($statut_tmp) {
293
-		return autoriser('inscrireauteur', $statut_tmp, $id) ? $statut_tmp : '';
294
-	} elseif (
295
-		autoriser('inscrireauteur', $statut_tmp = '1comite', $id)
296
-		or autoriser('inscrireauteur', $statut_tmp = '6forum', $id)
297
-	) {
298
-		return $statut_tmp;
299
-	}
300
-
301
-	return '';
291
+    include_spip('inc/autoriser');
292
+    if ($statut_tmp) {
293
+        return autoriser('inscrireauteur', $statut_tmp, $id) ? $statut_tmp : '';
294
+    } elseif (
295
+        autoriser('inscrireauteur', $statut_tmp = '1comite', $id)
296
+        or autoriser('inscrireauteur', $statut_tmp = '6forum', $id)
297
+    ) {
298
+        return $statut_tmp;
299
+    }
300
+
301
+    return '';
302 302
 }
303 303
 
304 304
 
@@ -312,35 +312,35 @@  discard block
 block discarded – undo
312 312
  * @return array
313 313
  */
314 314
 function confirmer_statut_inscription($auteur) {
315
-	// securite
316
-	if ($auteur['statut'] != 'nouveau') {
317
-		return $auteur;
318
-	}
319
-
320
-	$s = $auteur['prefs'];
321
-	// securite, au cas ou prefs aurait ete corrompu (ou deja ecrase par un tableau serialize)
322
-	if (!preg_match(',^\w+$,', $s)) {
323
-		$s = '6forum';
324
-	}
325
-	include_spip('inc/autoriser');
326
-	if (!autoriser('inscrireauteur', $s)) {
327
-		return $auteur;
328
-	}
329
-
330
-	include_spip('inc/autoriser');
331
-	// accorder l'autorisation de modif du statut auteur
332
-	autoriser_exception('modifier', 'auteur', $auteur['id_auteur']);
333
-	include_spip('action/editer_auteur');
334
-	// changer le statut
335
-	auteur_modifier($auteur['id_auteur'], ['statut' => $s]);
336
-	unset($_COOKIE['spip_session']); // forcer la maj de la session
337
-	// lever l'autorisation de modif du statut auteur
338
-	autoriser_exception('modifier', 'auteur', $auteur['id_auteur'], false);
339
-
340
-	// mettre a jour le statut
341
-	$auteur['statut'] = $s;
342
-
343
-	return $auteur;
315
+    // securite
316
+    if ($auteur['statut'] != 'nouveau') {
317
+        return $auteur;
318
+    }
319
+
320
+    $s = $auteur['prefs'];
321
+    // securite, au cas ou prefs aurait ete corrompu (ou deja ecrase par un tableau serialize)
322
+    if (!preg_match(',^\w+$,', $s)) {
323
+        $s = '6forum';
324
+    }
325
+    include_spip('inc/autoriser');
326
+    if (!autoriser('inscrireauteur', $s)) {
327
+        return $auteur;
328
+    }
329
+
330
+    include_spip('inc/autoriser');
331
+    // accorder l'autorisation de modif du statut auteur
332
+    autoriser_exception('modifier', 'auteur', $auteur['id_auteur']);
333
+    include_spip('action/editer_auteur');
334
+    // changer le statut
335
+    auteur_modifier($auteur['id_auteur'], ['statut' => $s]);
336
+    unset($_COOKIE['spip_session']); // forcer la maj de la session
337
+    // lever l'autorisation de modif du statut auteur
338
+    autoriser_exception('modifier', 'auteur', $auteur['id_auteur'], false);
339
+
340
+    // mettre a jour le statut
341
+    $auteur['statut'] = $s;
342
+
343
+    return $auteur;
344 344
 }
345 345
 
346 346
 
@@ -354,20 +354,20 @@  discard block
 block discarded – undo
354 354
  * @return string
355 355
  */
356 356
 function auteur_attribuer_jeton($id_auteur): string {
357
-	include_spip('base/abstract_sql');
358
-	include_spip('inc/acces');
359
-	include_spip('inc/chiffrer');
360
-	// s'assurer de l'unicite du jeton pour le couple (email,cookie)
361
-	do {
362
-		// Un morceau du jeton est lisible en bdd pour éviter de devoir déchiffrer 
363
-		// tous les jetons connus pour vérifier le jeton d’un auteur. 
364
-		$public = substr(creer_uniqid(), 0, 7) . '.';
365
-		$jeton = $public . creer_uniqid();
366
-		$jeton_chiffre_prefixe = $public . Chiffrement::chiffrer($jeton, SpipCles::secret_du_site());
367
-		sql_updateq('spip_auteurs', ['cookie_oubli' => $jeton_chiffre_prefixe], 'id_auteur=' . intval($id_auteur));
368
-	} while (sql_countsel('spip_auteurs', 'cookie_oubli=' . sql_quote($jeton_chiffre_prefixe, '', 'string')) > 1);
369
-
370
-	return $jeton;
357
+    include_spip('base/abstract_sql');
358
+    include_spip('inc/acces');
359
+    include_spip('inc/chiffrer');
360
+    // s'assurer de l'unicite du jeton pour le couple (email,cookie)
361
+    do {
362
+        // Un morceau du jeton est lisible en bdd pour éviter de devoir déchiffrer 
363
+        // tous les jetons connus pour vérifier le jeton d’un auteur. 
364
+        $public = substr(creer_uniqid(), 0, 7) . '.';
365
+        $jeton = $public . creer_uniqid();
366
+        $jeton_chiffre_prefixe = $public . Chiffrement::chiffrer($jeton, SpipCles::secret_du_site());
367
+        sql_updateq('spip_auteurs', ['cookie_oubli' => $jeton_chiffre_prefixe], 'id_auteur=' . intval($id_auteur));
368
+    } while (sql_countsel('spip_auteurs', 'cookie_oubli=' . sql_quote($jeton_chiffre_prefixe, '', 'string')) > 1);
369
+
370
+    return $jeton;
371 371
 }
372 372
 
373 373
 /**
@@ -381,20 +381,20 @@  discard block
 block discarded – undo
381 381
  * @return string|null
382 382
  */
383 383
 function auteur_lire_jeton(int $id_auteur, bool $autoInit = false): ?string {
384
-	include_spip('base/abstract_sql');
385
-	$jeton_chiffre_prefixe = sql_getfetsel('cookie_oubli', 'spip_auteurs', 'id_auteur=' . $id_auteur);
386
-	if ($jeton_chiffre_prefixe) {
387
-		include_spip('inc/chiffrer');
388
-		$jeton_chiffre = substr($jeton_chiffre_prefixe, 8);
389
-		$jeton = Chiffrement::dechiffrer($jeton_chiffre, SpipCles::secret_du_site());
390
-		if ($jeton) {
391
-			return $jeton;
392
-		}
393
-	}
394
-	if ($autoInit) {
395
-		return auteur_attribuer_jeton($id_auteur);
396
-	}
397
-	return null;
384
+    include_spip('base/abstract_sql');
385
+    $jeton_chiffre_prefixe = sql_getfetsel('cookie_oubli', 'spip_auteurs', 'id_auteur=' . $id_auteur);
386
+    if ($jeton_chiffre_prefixe) {
387
+        include_spip('inc/chiffrer');
388
+        $jeton_chiffre = substr($jeton_chiffre_prefixe, 8);
389
+        $jeton = Chiffrement::dechiffrer($jeton_chiffre, SpipCles::secret_du_site());
390
+        if ($jeton) {
391
+            return $jeton;
392
+        }
393
+    }
394
+    if ($autoInit) {
395
+        return auteur_attribuer_jeton($id_auteur);
396
+    }
397
+    return null;
398 398
 }
399 399
 
400 400
 /**
@@ -404,25 +404,25 @@  discard block
 block discarded – undo
404 404
  * @return array|bool
405 405
  */
406 406
 function auteur_verifier_jeton($jeton) {
407
-	// refuser un jeton corrompu
408
-	if (preg_match(',[^0-9a-f.],i', $jeton)) {
409
-		return false;
410
-	}
411
-
412
-	include_spip('base/abstract_sql');
413
-	include_spip('inc/chiffrer');
414
-	$public = substr($jeton, 0, 8);
415
-
416
-	// Les auteurs qui ont un jetons ressemblant
417
-	$auteurs = sql_allfetsel('*', 'spip_auteurs', 'cookie_oubli LIKE ' . sql_quote($public . '%'));
418
-	foreach ($auteurs as $auteur) {
419
-		$jeton_chiffre = substr($auteur['cookie_oubli'], 8);
420
-		$_jeton = Chiffrement::dechiffrer($jeton_chiffre, SpipCles::secret_du_site());
421
-		if ($_jeton and hash_equals($jeton, $_jeton)) {
422
-			return $auteur;
423
-		}
424
-	}
425
-	return false;
407
+    // refuser un jeton corrompu
408
+    if (preg_match(',[^0-9a-f.],i', $jeton)) {
409
+        return false;
410
+    }
411
+
412
+    include_spip('base/abstract_sql');
413
+    include_spip('inc/chiffrer');
414
+    $public = substr($jeton, 0, 8);
415
+
416
+    // Les auteurs qui ont un jetons ressemblant
417
+    $auteurs = sql_allfetsel('*', 'spip_auteurs', 'cookie_oubli LIKE ' . sql_quote($public . '%'));
418
+    foreach ($auteurs as $auteur) {
419
+        $jeton_chiffre = substr($auteur['cookie_oubli'], 8);
420
+        $_jeton = Chiffrement::dechiffrer($jeton_chiffre, SpipCles::secret_du_site());
421
+        if ($_jeton and hash_equals($jeton, $_jeton)) {
422
+            return $auteur;
423
+        }
424
+    }
425
+    return false;
426 426
 }
427 427
 
428 428
 /**
@@ -432,6 +432,6 @@  discard block
 block discarded – undo
432 432
  * @return bool
433 433
  */
434 434
 function auteur_effacer_jeton($id_auteur) {
435
-	include_spip('base/abstract_sql');
436
-	return sql_updateq('spip_auteurs', ['cookie_oubli' => ''], 'id_auteur=' . intval($id_auteur));
435
+    include_spip('base/abstract_sql');
436
+    return sql_updateq('spip_auteurs', ['cookie_oubli' => ''], 'id_auteur=' . intval($id_auteur));
437 437
 }
Please login to merge, or discard this patch.
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -61,7 +61,7 @@  discard block
 block discarded – undo
61 61
 	}
62 62
 
63 63
 	include_spip('base/abstract_sql');
64
-	$res = sql_select('statut, id_auteur, login, email, nom', 'spip_auteurs', 'email=' . sql_quote($desc['email']));
64
+	$res = sql_select('statut, id_auteur, login, email, nom', 'spip_auteurs', 'email='.sql_quote($desc['email']));
65 65
 	// erreur ?
66 66
 	if (!$res) {
67 67
 		return _T('titre_probleme_technique');
@@ -217,11 +217,11 @@  discard block
 block discarded – undo
217 217
 
218 218
 	$login = $login_base;
219 219
 
220
-	for ($i = 1;; $i++) {
220
+	for ($i = 1; ; $i++) {
221 221
 		if (!sql_countsel('spip_auteurs', "login='$login'")) {
222 222
 			return $login;
223 223
 		}
224
-		$login = $login_base . $i;
224
+		$login = $login_base.$i;
225 225
 	}
226 226
 }
227 227
 
@@ -361,11 +361,11 @@  discard block
 block discarded – undo
361 361
 	do {
362 362
 		// Un morceau du jeton est lisible en bdd pour éviter de devoir déchiffrer 
363 363
 		// tous les jetons connus pour vérifier le jeton d’un auteur. 
364
-		$public = substr(creer_uniqid(), 0, 7) . '.';
365
-		$jeton = $public . creer_uniqid();
366
-		$jeton_chiffre_prefixe = $public . Chiffrement::chiffrer($jeton, SpipCles::secret_du_site());
367
-		sql_updateq('spip_auteurs', ['cookie_oubli' => $jeton_chiffre_prefixe], 'id_auteur=' . intval($id_auteur));
368
-	} while (sql_countsel('spip_auteurs', 'cookie_oubli=' . sql_quote($jeton_chiffre_prefixe, '', 'string')) > 1);
364
+		$public = substr(creer_uniqid(), 0, 7).'.';
365
+		$jeton = $public.creer_uniqid();
366
+		$jeton_chiffre_prefixe = $public.Chiffrement::chiffrer($jeton, SpipCles::secret_du_site());
367
+		sql_updateq('spip_auteurs', ['cookie_oubli' => $jeton_chiffre_prefixe], 'id_auteur='.intval($id_auteur));
368
+	} while (sql_countsel('spip_auteurs', 'cookie_oubli='.sql_quote($jeton_chiffre_prefixe, '', 'string')) > 1);
369 369
 
370 370
 	return $jeton;
371 371
 }
@@ -382,7 +382,7 @@  discard block
 block discarded – undo
382 382
  */
383 383
 function auteur_lire_jeton(int $id_auteur, bool $autoInit = false): ?string {
384 384
 	include_spip('base/abstract_sql');
385
-	$jeton_chiffre_prefixe = sql_getfetsel('cookie_oubli', 'spip_auteurs', 'id_auteur=' . $id_auteur);
385
+	$jeton_chiffre_prefixe = sql_getfetsel('cookie_oubli', 'spip_auteurs', 'id_auteur='.$id_auteur);
386 386
 	if ($jeton_chiffre_prefixe) {
387 387
 		include_spip('inc/chiffrer');
388 388
 		$jeton_chiffre = substr($jeton_chiffre_prefixe, 8);
@@ -414,7 +414,7 @@  discard block
 block discarded – undo
414 414
 	$public = substr($jeton, 0, 8);
415 415
 
416 416
 	// Les auteurs qui ont un jetons ressemblant
417
-	$auteurs = sql_allfetsel('*', 'spip_auteurs', 'cookie_oubli LIKE ' . sql_quote($public . '%'));
417
+	$auteurs = sql_allfetsel('*', 'spip_auteurs', 'cookie_oubli LIKE '.sql_quote($public.'%'));
418 418
 	foreach ($auteurs as $auteur) {
419 419
 		$jeton_chiffre = substr($auteur['cookie_oubli'], 8);
420 420
 		$_jeton = Chiffrement::dechiffrer($jeton_chiffre, SpipCles::secret_du_site());
@@ -433,5 +433,5 @@  discard block
 block discarded – undo
433 433
  */
434 434
 function auteur_effacer_jeton($id_auteur) {
435 435
 	include_spip('base/abstract_sql');
436
-	return sql_updateq('spip_auteurs', ['cookie_oubli' => ''], 'id_auteur=' . intval($id_auteur));
436
+	return sql_updateq('spip_auteurs', ['cookie_oubli' => ''], 'id_auteur='.intval($id_auteur));
437 437
 }
Please login to merge, or discard this patch.
ecrire/lang/ecrire_fr.php 1 patch
Indentation   +841 added lines, -841 removed lines patch added patch discarded remove patch
@@ -2,439 +2,439 @@  discard block
 block discarded – undo
2 2
 // This is a SPIP language file  --  Ceci est un fichier langue de SPIP
3 3
 // Fichier source, a modifier dans https://git.spip.net/spip/spip.git
4 4
 if (!defined('_ECRIRE_INC_VERSION')) {
5
-	return;
5
+    return;
6 6
 }
7 7
 
8 8
 $GLOBALS[$GLOBALS['idx_lang']] = array(
9 9
 
10
-	// A
11
-	'activer_plugin' => 'Activer le plugin',
12
-	'affichage' => 'Affichage',
13
-	'aide_non_disponible' => 'Cette partie de l’aide en ligne n’est pas encore disponible dans cette langue.',
14
-	'annuler_recherche' => 'Annuler la recherche',
15
-	'auteur' => 'Auteur :',
16
-	'avis_acces_interdit' => 'Accès interdit.',
17
-	'avis_acces_interdit_prive' => 'Vous n’avez pas le droit d’accéder à la page <b>@exec@</b>.',
18
-	'avis_article_modifie' => 'Attention, @nom_auteur_modif@ a travaillé sur cet article il y a @date_diff@ minutes',
19
-	'avis_aucun_resultat' => 'Aucun résultat.',
20
-	'avis_base_inaccessible' => 'Impossible de se connecter à la base de données @base@.',
21
-	'avis_chemin_invalide_1' => 'Le chemin que vous avez choisi',
22
-	'avis_chemin_invalide_2' => 'ne semble pas valide. Veuillez retourner à la page précédente et vérifier les informations fournies.',
23
-	'avis_connexion_echec_1' => 'La connexion  à la base de données a échoué.',
24
-	'avis_connexion_echec_2' => 'Revenez à la page précédente, et vérifiez les informations que vous avez fournies.',
25
-	'avis_connexion_echec_3' => '<b>N.B.</b> Sur de nombreux serveurs, vous devez <b>demander</b> l’activation de votre accès à la base de données avant de pouvoir l’utiliser. Si vous ne pouvez vous connecter, vérifiez que vous avez effectué cette démarche.',
26
-	'avis_connexion_erreur_creer_base' => 'La base de données n’a pas pu être créée.',
27
-	'avis_connexion_erreur_fichier_cle_manquant_1' => 'L\'installation doit être faite par un webmestre avec un backup des clés et son mot de passe',
28
-	'avis_connexion_erreur_fichier_cle_manquant_2' => 'L\'installation doit être faite par un webmestre avec un backup des clés',
29
-	'avis_connexion_erreur_nom_base' => 'Le nom de la base ne peut contenir que des lettres, des chiffres et des tirets',
30
-	'avis_connexion_ldap_echec_1' => 'La connexion au serveur LDAP a échoué.',
31
-	'avis_connexion_ldap_echec_2' => 'Revenez à la page précédente, et vérifiez les informations que vous avez fournies.',
32
-	'avis_connexion_ldap_echec_3' => 'Alternativement, n’utilisez pas le support LDAP pour importer des utilisateurs.',
33
-	'avis_deplacement_rubrique' => 'Attention ! Cette rubrique contient @contient_breves@ brève@scb@ : si vous la déplacez, veuillez cocher cette case de confirmation.',
34
-	'avis_erreur_connexion_mysql' => 'Erreur de connexion SQL',
35
-	'avis_erreur_creation_compte' => 'Echec lors de l\'initialisation du compte',
36
-	'avis_espace_interdit' => '<b>Espace interdit</b> <div>SPIP est déjà installé.</div>',
37
-	'avis_lecture_noms_bases_1' => 'Le programme d’installation n’a pas pu lire les noms des bases de données installées.',
38
-	'avis_lecture_noms_bases_2' => 'Soit aucune base n’est disponible, soit la fonction permettant de lister les bases a été désactivée
10
+    // A
11
+    'activer_plugin' => 'Activer le plugin',
12
+    'affichage' => 'Affichage',
13
+    'aide_non_disponible' => 'Cette partie de l’aide en ligne n’est pas encore disponible dans cette langue.',
14
+    'annuler_recherche' => 'Annuler la recherche',
15
+    'auteur' => 'Auteur :',
16
+    'avis_acces_interdit' => 'Accès interdit.',
17
+    'avis_acces_interdit_prive' => 'Vous n’avez pas le droit d’accéder à la page <b>@exec@</b>.',
18
+    'avis_article_modifie' => 'Attention, @nom_auteur_modif@ a travaillé sur cet article il y a @date_diff@ minutes',
19
+    'avis_aucun_resultat' => 'Aucun résultat.',
20
+    'avis_base_inaccessible' => 'Impossible de se connecter à la base de données @base@.',
21
+    'avis_chemin_invalide_1' => 'Le chemin que vous avez choisi',
22
+    'avis_chemin_invalide_2' => 'ne semble pas valide. Veuillez retourner à la page précédente et vérifier les informations fournies.',
23
+    'avis_connexion_echec_1' => 'La connexion  à la base de données a échoué.',
24
+    'avis_connexion_echec_2' => 'Revenez à la page précédente, et vérifiez les informations que vous avez fournies.',
25
+    'avis_connexion_echec_3' => '<b>N.B.</b> Sur de nombreux serveurs, vous devez <b>demander</b> l’activation de votre accès à la base de données avant de pouvoir l’utiliser. Si vous ne pouvez vous connecter, vérifiez que vous avez effectué cette démarche.',
26
+    'avis_connexion_erreur_creer_base' => 'La base de données n’a pas pu être créée.',
27
+    'avis_connexion_erreur_fichier_cle_manquant_1' => 'L\'installation doit être faite par un webmestre avec un backup des clés et son mot de passe',
28
+    'avis_connexion_erreur_fichier_cle_manquant_2' => 'L\'installation doit être faite par un webmestre avec un backup des clés',
29
+    'avis_connexion_erreur_nom_base' => 'Le nom de la base ne peut contenir que des lettres, des chiffres et des tirets',
30
+    'avis_connexion_ldap_echec_1' => 'La connexion au serveur LDAP a échoué.',
31
+    'avis_connexion_ldap_echec_2' => 'Revenez à la page précédente, et vérifiez les informations que vous avez fournies.',
32
+    'avis_connexion_ldap_echec_3' => 'Alternativement, n’utilisez pas le support LDAP pour importer des utilisateurs.',
33
+    'avis_deplacement_rubrique' => 'Attention ! Cette rubrique contient @contient_breves@ brève@scb@ : si vous la déplacez, veuillez cocher cette case de confirmation.',
34
+    'avis_erreur_connexion_mysql' => 'Erreur de connexion SQL',
35
+    'avis_erreur_creation_compte' => 'Echec lors de l\'initialisation du compte',
36
+    'avis_espace_interdit' => '<b>Espace interdit</b> <div>SPIP est déjà installé.</div>',
37
+    'avis_lecture_noms_bases_1' => 'Le programme d’installation n’a pas pu lire les noms des bases de données installées.',
38
+    'avis_lecture_noms_bases_2' => 'Soit aucune base n’est disponible, soit la fonction permettant de lister les bases a été désactivée
39 39
 		pour des raisons de sécurité (ce qui est le cas chez de nombreux hébergeurs).',
40
-	'avis_lecture_noms_bases_3' => 'Dans la seconde alternative, il est probable qu’une base portant votre nom de login soit utilisable :',
41
-	'avis_non_acces_page' => 'Vous n’avez pas accès à cette page.',
42
-	'avis_operation_echec' => 'L’opération a échoué.',
43
-	'avis_operation_impossible' => 'Opération impossible',
44
-	'avis_suppression_base' => 'ATTENTION, la suppression des données est irréversible',
40
+    'avis_lecture_noms_bases_3' => 'Dans la seconde alternative, il est probable qu’une base portant votre nom de login soit utilisable :',
41
+    'avis_non_acces_page' => 'Vous n’avez pas accès à cette page.',
42
+    'avis_operation_echec' => 'L’opération a échoué.',
43
+    'avis_operation_impossible' => 'Opération impossible',
44
+    'avis_suppression_base' => 'ATTENTION, la suppression des données est irréversible',
45 45
 
46
-	// B
47
-	'bouton_acces_ldap' => 'Ajouter l’accès à LDAP',
48
-	'bouton_ajouter' => 'Ajouter',
49
-	'bouton_annuler' => 'Annuler',
50
-	'bouton_cache_activer' => 'Réactiver le cache',
51
-	'bouton_cache_desactiver' => 'Désactiver temporairement le cache',
52
-	'bouton_demande_publication' => 'Demander la publication de cet article',
53
-	'bouton_desactive_tout' => 'Tout désactiver',
54
-	'bouton_desinstaller' => 'Désinstaller',
55
-	'bouton_effacer_tout' => 'Effacer TOUT',
56
-	'bouton_envoyer_message' => 'Message définitif : envoyer',
57
-	'bouton_fermer' => 'Fermer',
58
-	'bouton_mettre_a_jour_base' => 'Mettre à jour la base de données',
59
-	'bouton_modifier' => 'Modifier',
60
-	'bouton_radio_afficher' => 'Afficher',
61
-	'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Apparaître dans la liste des rédacteurs connectés',
62
-	'bouton_radio_envoi_annonces_adresse' => 'Envoyer les annonces à l’adresse :',
63
-	'bouton_radio_envoi_liste_nouveautes' => 'Envoyer la liste des nouveautés',
64
-	'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Ne pas apparaître dans la liste des rédacteurs',
65
-	'bouton_radio_non_envoi_annonces_editoriales' => 'Ne pas envoyer d’annonces éditoriales',
66
-	'bouton_redirection' => 'REDIRECTION',
67
-	'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Réinitialiser aux valeurs par défaut',
68
-	'bouton_relancer_inscription' => 'Relancer l’inscription',
69
-	'bouton_relancer_inscriptions' => 'Relancer les inscriptions',
70
-	'bouton_relancer_installation' => 'Relancer l’installation',
71
-	'bouton_reset_password' => 'Générer un nouveau mot de passe et l’envoyer par email',
72
-	'bouton_suivant' => 'Suivant',
73
-	'bouton_tenter_recuperation' => 'Tenter une réparation',
74
-	'bouton_test_proxy' => 'Essayer le proxy',
75
-	'bouton_vider_cache' => 'Vider le cache',
46
+    // B
47
+    'bouton_acces_ldap' => 'Ajouter l’accès à LDAP',
48
+    'bouton_ajouter' => 'Ajouter',
49
+    'bouton_annuler' => 'Annuler',
50
+    'bouton_cache_activer' => 'Réactiver le cache',
51
+    'bouton_cache_desactiver' => 'Désactiver temporairement le cache',
52
+    'bouton_demande_publication' => 'Demander la publication de cet article',
53
+    'bouton_desactive_tout' => 'Tout désactiver',
54
+    'bouton_desinstaller' => 'Désinstaller',
55
+    'bouton_effacer_tout' => 'Effacer TOUT',
56
+    'bouton_envoyer_message' => 'Message définitif : envoyer',
57
+    'bouton_fermer' => 'Fermer',
58
+    'bouton_mettre_a_jour_base' => 'Mettre à jour la base de données',
59
+    'bouton_modifier' => 'Modifier',
60
+    'bouton_radio_afficher' => 'Afficher',
61
+    'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Apparaître dans la liste des rédacteurs connectés',
62
+    'bouton_radio_envoi_annonces_adresse' => 'Envoyer les annonces à l’adresse :',
63
+    'bouton_radio_envoi_liste_nouveautes' => 'Envoyer la liste des nouveautés',
64
+    'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Ne pas apparaître dans la liste des rédacteurs',
65
+    'bouton_radio_non_envoi_annonces_editoriales' => 'Ne pas envoyer d’annonces éditoriales',
66
+    'bouton_redirection' => 'REDIRECTION',
67
+    'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Réinitialiser aux valeurs par défaut',
68
+    'bouton_relancer_inscription' => 'Relancer l’inscription',
69
+    'bouton_relancer_inscriptions' => 'Relancer les inscriptions',
70
+    'bouton_relancer_installation' => 'Relancer l’installation',
71
+    'bouton_reset_password' => 'Générer un nouveau mot de passe et l’envoyer par email',
72
+    'bouton_suivant' => 'Suivant',
73
+    'bouton_tenter_recuperation' => 'Tenter une réparation',
74
+    'bouton_test_proxy' => 'Essayer le proxy',
75
+    'bouton_vider_cache' => 'Vider le cache',
76 76
 
77
-	// C
78
-	'cache_modifiable_webmestre' => 'Ce paramètre est modifiable par le webmestre du site.',
79
-	'calendrier_synchro' => 'Si vous utilisez un logiciel d’agenda compatible <b>iCal</b>, vous pouvez le synchroniser avec les informations de ce site.',
80
-	'config_activer_champs' => 'Activer les champs suivants',
81
-	'config_choix_base_sup' => 'indiquer une base sur ce serveur',
82
-	'config_erreur_base_sup' => 'SPIP n’a pas accès à la liste des bases accessibles',
83
-	'config_info_base_sup' => 'Si vous avez d’autres bases de données à interroger à travers SPIP, avec son serveur SQL ou avec un autre, le formulaire ci-dessous, vous permet de les déclarer. Si vous laissez certains champs vides, les identifiants de connexion à la base principale seront utilisés.',
84
-	'config_info_base_sup_disponibles' => 'Bases supplémentaires déjà interrogeables :',
85
-	'config_info_enregistree' => 'La nouvelle configuration a été enregistrée',
86
-	'config_info_logos' => 'Chaque élément du site peut avoir un logo, ainsi qu’un « logo de survol »',
87
-	'config_info_logos_utiliser' => 'Utiliser les logos',
88
-	'config_info_logos_utiliser_non' => 'Ne pas utiliser les logos',
89
-	'config_info_logos_utiliser_survol' => 'Utiliser les logos de survol',
90
-	'config_info_logos_utiliser_survol_non' => 'Ne pas utiliser les logos de survol',
91
-	'config_info_redirection' => 'En activant cette option, vous pourrez créer des articles virtuels, simples références d’articles publiés sur d’autres sites ou hors de SPIP.',
92
-	'config_redirection' => 'Articles virtuels',
93
-	'config_titre_base_sup' => 'Déclaration d’une base supplémentaire',
94
-	'config_titre_base_sup_choix' => 'Choisissez une base supplémentaire',
95
-	'connexion_ldap' => 'Connexion :',
96
-	'creer_et_associer_un_auteur' => 'Créer et associer un auteur',
77
+    // C
78
+    'cache_modifiable_webmestre' => 'Ce paramètre est modifiable par le webmestre du site.',
79
+    'calendrier_synchro' => 'Si vous utilisez un logiciel d’agenda compatible <b>iCal</b>, vous pouvez le synchroniser avec les informations de ce site.',
80
+    'config_activer_champs' => 'Activer les champs suivants',
81
+    'config_choix_base_sup' => 'indiquer une base sur ce serveur',
82
+    'config_erreur_base_sup' => 'SPIP n’a pas accès à la liste des bases accessibles',
83
+    'config_info_base_sup' => 'Si vous avez d’autres bases de données à interroger à travers SPIP, avec son serveur SQL ou avec un autre, le formulaire ci-dessous, vous permet de les déclarer. Si vous laissez certains champs vides, les identifiants de connexion à la base principale seront utilisés.',
84
+    'config_info_base_sup_disponibles' => 'Bases supplémentaires déjà interrogeables :',
85
+    'config_info_enregistree' => 'La nouvelle configuration a été enregistrée',
86
+    'config_info_logos' => 'Chaque élément du site peut avoir un logo, ainsi qu’un « logo de survol »',
87
+    'config_info_logos_utiliser' => 'Utiliser les logos',
88
+    'config_info_logos_utiliser_non' => 'Ne pas utiliser les logos',
89
+    'config_info_logos_utiliser_survol' => 'Utiliser les logos de survol',
90
+    'config_info_logos_utiliser_survol_non' => 'Ne pas utiliser les logos de survol',
91
+    'config_info_redirection' => 'En activant cette option, vous pourrez créer des articles virtuels, simples références d’articles publiés sur d’autres sites ou hors de SPIP.',
92
+    'config_redirection' => 'Articles virtuels',
93
+    'config_titre_base_sup' => 'Déclaration d’une base supplémentaire',
94
+    'config_titre_base_sup_choix' => 'Choisissez une base supplémentaire',
95
+    'connexion_ldap' => 'Connexion :',
96
+    'creer_et_associer_un_auteur' => 'Créer et associer un auteur',
97 97
 
98
-	// D
99
-	'date_mot_heures' => 'heures',
98
+    // D
99
+    'date_mot_heures' => 'heures',
100 100
 
101
-	// E
102
-	'ecran_connexion_couleur_principale' => 'Couleur principale',
103
-	'ecran_connexion_image_fond' => 'Image de fond',
104
-	'ecran_connexion_image_fond_explication' => 'Utiliser une image (format JPEG, 1920x1080 pixels)',
105
-	'ecran_connexion_image_revenir_couleur_defaut' => 'Revenir à la couleur par défaut',
106
-	'ecran_connexion_titre' => 'Écran de connexion',
107
-	'ecran_securite' => ' + écran de sécurité @version@',
108
-	'email' => 'email',
109
-	'email_2' => 'email :',
110
-	'en_savoir_plus' => 'En savoir plus',
111
-	'entree_adresse_annuaire' => 'Adresse de l’annuaire',
112
-	'entree_adresse_email' => 'Votre adresse email',
113
-	'entree_adresse_email_2' => 'Adresse email',
114
-	'entree_base_donnee_1' => 'Adresse de la base de données',
115
-	'entree_base_donnee_2' => '(Souvent cette adresse correspond à celle de votre site, parfois elle correspond à la mention « localhost », parfois elle est laissée totalement vide.)',
116
-	'entree_biographie' => 'Courte biographie en quelques mots.',
117
-	'entree_chemin_acces' => '<b>Entrer</b> le chemin d’accès :',
118
-	'entree_cle_pgp' => 'Votre clé PGP',
119
-	'entree_cle_pgp_2' => 'Clé PGP',
120
-	'entree_contenu_rubrique' => '(Contenu de la rubrique en quelques mots.)',
121
-	'entree_identifiants_connexion' => 'Vos identifiants de connexion...',
122
-	'entree_identifiants_connexion_2' => 'Identifiants de connexion',
123
-	'entree_informations_connexion_ldap' => 'Veuillez entrer dans ce formulaire les informations de connexion à votre annuaire LDAP.
101
+    // E
102
+    'ecran_connexion_couleur_principale' => 'Couleur principale',
103
+    'ecran_connexion_image_fond' => 'Image de fond',
104
+    'ecran_connexion_image_fond_explication' => 'Utiliser une image (format JPEG, 1920x1080 pixels)',
105
+    'ecran_connexion_image_revenir_couleur_defaut' => 'Revenir à la couleur par défaut',
106
+    'ecran_connexion_titre' => 'Écran de connexion',
107
+    'ecran_securite' => ' + écran de sécurité @version@',
108
+    'email' => 'email',
109
+    'email_2' => 'email :',
110
+    'en_savoir_plus' => 'En savoir plus',
111
+    'entree_adresse_annuaire' => 'Adresse de l’annuaire',
112
+    'entree_adresse_email' => 'Votre adresse email',
113
+    'entree_adresse_email_2' => 'Adresse email',
114
+    'entree_base_donnee_1' => 'Adresse de la base de données',
115
+    'entree_base_donnee_2' => '(Souvent cette adresse correspond à celle de votre site, parfois elle correspond à la mention « localhost », parfois elle est laissée totalement vide.)',
116
+    'entree_biographie' => 'Courte biographie en quelques mots.',
117
+    'entree_chemin_acces' => '<b>Entrer</b> le chemin d’accès :',
118
+    'entree_cle_pgp' => 'Votre clé PGP',
119
+    'entree_cle_pgp_2' => 'Clé PGP',
120
+    'entree_contenu_rubrique' => '(Contenu de la rubrique en quelques mots.)',
121
+    'entree_identifiants_connexion' => 'Vos identifiants de connexion...',
122
+    'entree_identifiants_connexion_2' => 'Identifiants de connexion',
123
+    'entree_informations_connexion_ldap' => 'Veuillez entrer dans ce formulaire les informations de connexion à votre annuaire LDAP.
124 124
 	Ces informations doivent pouvoir vous être fournies par l’administrateur du système,
125 125
 	ou du réseau.',
126
-	'entree_infos_perso' => 'Qui êtes-vous ?',
127
-	'entree_infos_perso_2' => 'Qui est l’auteur ?',
128
-	'entree_interieur_rubrique' => 'À l’intérieur de la rubrique :',
129
-	'entree_liens_sites' => '<b>Lien hypertexte</b> (référence, site à visiter...)',
130
-	'entree_login' => 'Votre login',
131
-	'entree_login_connexion_1' => 'Le login de connexion',
132
-	'entree_login_connexion_2' => '(Correspond parfois à votre login d’accès au FTP ; parfois laissé vide)',
133
-	'entree_mot_passe' => 'Votre mot de passe',
134
-	'entree_mot_passe_1' => 'Le mot de passe de connexion',
135
-	'entree_mot_passe_2' => '(Correspond parfois à votre mot de passe pour le FTP ; parfois laissé vide)',
136
-	'entree_nom_fichier' => 'Veuillez entrer le nom du fichier @texte_compresse@ :',
137
-	'entree_nom_pseudo' => 'Votre nom ou votre pseudo',
138
-	'entree_nom_pseudo_1' => '(Votre nom ou votre pseudo)',
139
-	'entree_nom_pseudo_2' => 'Nom ou pseudo',
140
-	'entree_nom_site' => 'Le nom de votre site',
141
-	'entree_nom_site_2' => 'Nom du site de l’auteur',
142
-	'entree_nouveau_passe' => 'Nouveau mot de passe',
143
-	'entree_passe_ldap' => 'Mot de passe',
144
-	'entree_port_annuaire' => 'Le numéro de port de l’annuaire',
145
-	'entree_signature' => 'Signature',
146
-	'entree_titre_obligatoire' => '<b>Titre</b> [Obligatoire]<br />',
147
-	'entree_url' => 'L’adresse (URL) de votre site',
148
-	'entree_url_2' => 'Adresse (URL) du site',
149
-	'erreur_connect_deja_existant' => 'Un serveur existe déjà avec ce nom',
150
-	'erreur_contenu_suspect' => 'Texte échappé',
151
-	'erreur_email_deja_existant' => 'Cette adresse email est déjà enregistrée.',
152
-	'erreur_nom_connect_incorrect' => 'Ce nom de serveur n’est pas autorisé',
153
-	'erreur_plugin_attribut_balise_manquant' => 'Attribut @attribut@ manquant dans la balise @balise@.',
154
-	'erreur_plugin_desinstalation_echouee' => 'La désinstallation du plugin a échoué. Vous pouvez néanmoins le désactiver.',
155
-	'erreur_plugin_fichier_absent' => 'Fichier absent',
156
-	'erreur_plugin_fichier_def_absent' => 'Fichier de définition absent',
157
-	'erreur_plugin_nom_fonction_interdit' => 'Nom de fonction interdit',
158
-	'erreur_plugin_nom_manquant' => 'Nom du plugin manquant',
159
-	'erreur_plugin_prefix_manquant' => 'Espace de nommage du plugin non défini',
160
-	'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; manquant dans le fichier de définition',
161
-	'erreur_plugin_version_manquant' => 'Version du plugin manquante',
162
-	'erreur_type_fichier' => 'Type de fichier incorrect',
126
+    'entree_infos_perso' => 'Qui êtes-vous ?',
127
+    'entree_infos_perso_2' => 'Qui est l’auteur ?',
128
+    'entree_interieur_rubrique' => 'À l’intérieur de la rubrique :',
129
+    'entree_liens_sites' => '<b>Lien hypertexte</b> (référence, site à visiter...)',
130
+    'entree_login' => 'Votre login',
131
+    'entree_login_connexion_1' => 'Le login de connexion',
132
+    'entree_login_connexion_2' => '(Correspond parfois à votre login d’accès au FTP ; parfois laissé vide)',
133
+    'entree_mot_passe' => 'Votre mot de passe',
134
+    'entree_mot_passe_1' => 'Le mot de passe de connexion',
135
+    'entree_mot_passe_2' => '(Correspond parfois à votre mot de passe pour le FTP ; parfois laissé vide)',
136
+    'entree_nom_fichier' => 'Veuillez entrer le nom du fichier @texte_compresse@ :',
137
+    'entree_nom_pseudo' => 'Votre nom ou votre pseudo',
138
+    'entree_nom_pseudo_1' => '(Votre nom ou votre pseudo)',
139
+    'entree_nom_pseudo_2' => 'Nom ou pseudo',
140
+    'entree_nom_site' => 'Le nom de votre site',
141
+    'entree_nom_site_2' => 'Nom du site de l’auteur',
142
+    'entree_nouveau_passe' => 'Nouveau mot de passe',
143
+    'entree_passe_ldap' => 'Mot de passe',
144
+    'entree_port_annuaire' => 'Le numéro de port de l’annuaire',
145
+    'entree_signature' => 'Signature',
146
+    'entree_titre_obligatoire' => '<b>Titre</b> [Obligatoire]<br />',
147
+    'entree_url' => 'L’adresse (URL) de votre site',
148
+    'entree_url_2' => 'Adresse (URL) du site',
149
+    'erreur_connect_deja_existant' => 'Un serveur existe déjà avec ce nom',
150
+    'erreur_contenu_suspect' => 'Texte échappé',
151
+    'erreur_email_deja_existant' => 'Cette adresse email est déjà enregistrée.',
152
+    'erreur_nom_connect_incorrect' => 'Ce nom de serveur n’est pas autorisé',
153
+    'erreur_plugin_attribut_balise_manquant' => 'Attribut @attribut@ manquant dans la balise @balise@.',
154
+    'erreur_plugin_desinstalation_echouee' => 'La désinstallation du plugin a échoué. Vous pouvez néanmoins le désactiver.',
155
+    'erreur_plugin_fichier_absent' => 'Fichier absent',
156
+    'erreur_plugin_fichier_def_absent' => 'Fichier de définition absent',
157
+    'erreur_plugin_nom_fonction_interdit' => 'Nom de fonction interdit',
158
+    'erreur_plugin_nom_manquant' => 'Nom du plugin manquant',
159
+    'erreur_plugin_prefix_manquant' => 'Espace de nommage du plugin non défini',
160
+    'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; manquant dans le fichier de définition',
161
+    'erreur_plugin_version_manquant' => 'Version du plugin manquante',
162
+    'erreur_type_fichier' => 'Type de fichier incorrect',
163 163
 
164
-	// H
165
-	'htaccess_a_simuler' => 'Avertissement : la configuration de votre serveur HTTP ne tient pas compte des fichiers @htaccess@. Pour pouvoir assurer une bonne sécurité, il faut que vous modifiiez cette configuration sur ce point, ou bien que les constantes @constantes@ (définissables dans le fichier mes_options.php) aient comme valeur des répertoires en dehors de @document_root@.',
166
-	'htaccess_inoperant' => 'htaccess inopérant',
164
+    // H
165
+    'htaccess_a_simuler' => 'Avertissement : la configuration de votre serveur HTTP ne tient pas compte des fichiers @htaccess@. Pour pouvoir assurer une bonne sécurité, il faut que vous modifiiez cette configuration sur ce point, ou bien que les constantes @constantes@ (définissables dans le fichier mes_options.php) aient comme valeur des répertoires en dehors de @document_root@.',
166
+    'htaccess_inoperant' => 'htaccess inopérant',
167 167
 
168
-	// I
169
-	'ical_info1' => 'Cette page présente plusieurs méthodes pour rester en contact avec la vie de ce site.',
170
-	'ical_info2' => 'Pour plus de renseignements sur toutes ces techniques, n’hésitez pas à consulter <a href="@spipnet@">la documentation de SPIP</a>.',
171
-	'ical_info_calendrier' => 'Deux calendriers sont à votre disposition. Le premier est un plan du site annonçant tous les articles publiés. Le second contient les annonces éditoriales ainsi que vos derniers messages privés : il vous est réservé grâce à une clé personnelle, que vous pouvez modifier à tout moment en renouvelant votre mot de passe.',
172
-	'ical_methode_http' => 'Téléchargement',
173
-	'ical_methode_webcal' => 'Synchronisation (webcal://)',
174
-	'ical_texte_js' => 'Une ligne de javascript vous permet d’afficher très simplement, sur n’importe quel site vous appartenant, les articles récents publiés sur ce site.',
175
-	'ical_texte_prive' => 'Ce calendrier, à usage strictement personnel, vous informe de l’activité éditoriale privée de ce site (tâches et rendez-vous personnels, articles et brèves proposés...).',
176
-	'ical_texte_public' => 'Ce calendrier vous permet de suivre l’activité publique de ce site (articles et brèves publiés).',
177
-	'ical_texte_rss' => 'Vous pouvez syndiquer les nouveautés de ce site dans n’importe quel lecteur de fichiers au format XML/RSS (Rich Site Summary). C’est aussi le format qui permet à SPIP de lire les nouveautés publiées sur d’autres sites utilisant un format d’échange compatible (sites syndiqués).',
178
-	'ical_titre_js' => 'Javascript',
179
-	'ical_titre_mailing' => 'Mailing-list',
180
-	'ical_titre_rss' => 'Fichiers de syndication',
181
-	'icone_accueil' => 'Accueil',
182
-	'icone_activer_cookie' => 'Activer le cookie de correspondance',
183
-	'icone_activite' => 'Activité',
184
-	'icone_admin_plugin' => 'Gestion des plugins',
185
-	'icone_administration' => 'Maintenance',
186
-	'icone_afficher_auteurs' => 'Afficher les auteurs',
187
-	'icone_afficher_visiteurs' => 'Afficher les visiteurs',
188
-	'icone_arret_discussion' => 'Ne plus participer à cette discussion',
189
-	'icone_calendrier' => 'Calendrier',
190
-	'icone_configuration' => 'Configuration',
191
-	'icone_creer_auteur' => 'Créer un nouvel auteur et l’associer à cet article',
192
-	'icone_creer_mot_cle' => 'Créer un nouveau mot-clé et le lier à cet article',
193
-	'icone_creer_rubrique_2' => 'Créer une nouvelle rubrique',
194
-	'icone_developpement' => 'Développement',
195
-	'icone_edition' => 'Édition',
196
-	'icone_ma_langue' => 'Ma langue',
197
-	'icone_mes_infos' => 'Mes informations',
198
-	'icone_mes_preferences' => 'Mes préférences',
199
-	'icone_modifier_article' => 'Modifier cet article',
200
-	'icone_modifier_rubrique' => 'Modifier cette rubrique',
201
-	'icone_publication' => 'Publication',
202
-	'icone_relancer_signataire' => 'Relancer le signataire',
203
-	'icone_retour' => 'Retour',
204
-	'icone_retour_article' => 'Retour à l’article',
205
-	'icone_squelette' => 'Squelettes',
206
-	'icone_suivi_publication' => 'Suivi de la publication',
207
-	'icone_supprimer_cookie' => 'Supprimer le cookie de correspondance',
208
-	'icone_supprimer_rubrique' => 'Supprimer cette rubrique',
209
-	'icone_supprimer_signature' => 'Supprimer cette signature',
210
-	'icone_valider_signature' => 'Valider cette signature',
211
-	'image_administrer_rubrique' => 'Vous pouvez administrer cette rubrique',
212
-	'impossible_modifier_login_auteur' => 'Impossible de modifier le login.',
213
-	'impossible_modifier_pass_auteur' => 'Impossible de modifier le mot de passe.',
214
-	'info_1_article' => '1 article',
215
-	'info_1_auteur' => '1 auteur',
216
-	'info_1_message' => '1 message',
217
-	'info_1_mot_cle' => '1 mot-clé',
218
-	'info_1_rubrique' => '1 rubrique',
219
-	'info_1_visiteur' => '1 visiteur',
220
-	'info_activer_cookie' => 'Vous pouvez activer un <b>cookie de correspondance</b>, ce qui vous
168
+    // I
169
+    'ical_info1' => 'Cette page présente plusieurs méthodes pour rester en contact avec la vie de ce site.',
170
+    'ical_info2' => 'Pour plus de renseignements sur toutes ces techniques, n’hésitez pas à consulter <a href="@spipnet@">la documentation de SPIP</a>.',
171
+    'ical_info_calendrier' => 'Deux calendriers sont à votre disposition. Le premier est un plan du site annonçant tous les articles publiés. Le second contient les annonces éditoriales ainsi que vos derniers messages privés : il vous est réservé grâce à une clé personnelle, que vous pouvez modifier à tout moment en renouvelant votre mot de passe.',
172
+    'ical_methode_http' => 'Téléchargement',
173
+    'ical_methode_webcal' => 'Synchronisation (webcal://)',
174
+    'ical_texte_js' => 'Une ligne de javascript vous permet d’afficher très simplement, sur n’importe quel site vous appartenant, les articles récents publiés sur ce site.',
175
+    'ical_texte_prive' => 'Ce calendrier, à usage strictement personnel, vous informe de l’activité éditoriale privée de ce site (tâches et rendez-vous personnels, articles et brèves proposés...).',
176
+    'ical_texte_public' => 'Ce calendrier vous permet de suivre l’activité publique de ce site (articles et brèves publiés).',
177
+    'ical_texte_rss' => 'Vous pouvez syndiquer les nouveautés de ce site dans n’importe quel lecteur de fichiers au format XML/RSS (Rich Site Summary). C’est aussi le format qui permet à SPIP de lire les nouveautés publiées sur d’autres sites utilisant un format d’échange compatible (sites syndiqués).',
178
+    'ical_titre_js' => 'Javascript',
179
+    'ical_titre_mailing' => 'Mailing-list',
180
+    'ical_titre_rss' => 'Fichiers de syndication',
181
+    'icone_accueil' => 'Accueil',
182
+    'icone_activer_cookie' => 'Activer le cookie de correspondance',
183
+    'icone_activite' => 'Activité',
184
+    'icone_admin_plugin' => 'Gestion des plugins',
185
+    'icone_administration' => 'Maintenance',
186
+    'icone_afficher_auteurs' => 'Afficher les auteurs',
187
+    'icone_afficher_visiteurs' => 'Afficher les visiteurs',
188
+    'icone_arret_discussion' => 'Ne plus participer à cette discussion',
189
+    'icone_calendrier' => 'Calendrier',
190
+    'icone_configuration' => 'Configuration',
191
+    'icone_creer_auteur' => 'Créer un nouvel auteur et l’associer à cet article',
192
+    'icone_creer_mot_cle' => 'Créer un nouveau mot-clé et le lier à cet article',
193
+    'icone_creer_rubrique_2' => 'Créer une nouvelle rubrique',
194
+    'icone_developpement' => 'Développement',
195
+    'icone_edition' => 'Édition',
196
+    'icone_ma_langue' => 'Ma langue',
197
+    'icone_mes_infos' => 'Mes informations',
198
+    'icone_mes_preferences' => 'Mes préférences',
199
+    'icone_modifier_article' => 'Modifier cet article',
200
+    'icone_modifier_rubrique' => 'Modifier cette rubrique',
201
+    'icone_publication' => 'Publication',
202
+    'icone_relancer_signataire' => 'Relancer le signataire',
203
+    'icone_retour' => 'Retour',
204
+    'icone_retour_article' => 'Retour à l’article',
205
+    'icone_squelette' => 'Squelettes',
206
+    'icone_suivi_publication' => 'Suivi de la publication',
207
+    'icone_supprimer_cookie' => 'Supprimer le cookie de correspondance',
208
+    'icone_supprimer_rubrique' => 'Supprimer cette rubrique',
209
+    'icone_supprimer_signature' => 'Supprimer cette signature',
210
+    'icone_valider_signature' => 'Valider cette signature',
211
+    'image_administrer_rubrique' => 'Vous pouvez administrer cette rubrique',
212
+    'impossible_modifier_login_auteur' => 'Impossible de modifier le login.',
213
+    'impossible_modifier_pass_auteur' => 'Impossible de modifier le mot de passe.',
214
+    'info_1_article' => '1 article',
215
+    'info_1_auteur' => '1 auteur',
216
+    'info_1_message' => '1 message',
217
+    'info_1_mot_cle' => '1 mot-clé',
218
+    'info_1_rubrique' => '1 rubrique',
219
+    'info_1_visiteur' => '1 visiteur',
220
+    'info_activer_cookie' => 'Vous pouvez activer un <b>cookie de correspondance</b>, ce qui vous
221 221
 	permettra de passer facilement du site public au site privé.',
222
-	'info_activer_menu_developpement' => 'Afficher le menu Développement',
223
-	'info_admin_etre_webmestre' => 'Me donner les droits de webmestre',
224
-	'info_admin_je_suis_webmestre' => 'Je suis <b>webmestre</b>',
225
-	'info_admin_statuer_webmestre' => 'Donner à cet administrateur les droits de webmestre',
226
-	'info_admin_webmestre' => 'Cet administrateur est <b>webmestre</b>',
227
-	'info_administrateur' => 'Administrateur',
228
-	'info_administrateur_1' => 'Administrateur',
229
-	'info_administrateur_2' => 'du site (<i>utilisez avec précaution</i>)',
230
-	'info_administrateur_site_01' => 'Si vous êtes administrateur du site, veuillez',
231
-	'info_administrateur_site_02' => 'cliquer sur ce lien',
232
-	'info_administrateurs' => 'Administrateurs',
233
-	'info_administrer_rubrique' => 'Vous pouvez administrer cette rubrique',
234
-	'info_adresse' => 'à l’adresse :',
235
-	'info_adresse_desinscription' => 'Adresse de désinscription :',
236
-	'info_adresse_url' => 'Adresse (URL) du site public',
237
-	'info_afficher_par_nb' => 'Afficher par',
238
-	'info_aide_en_ligne' => 'Aide en ligne SPIP',
239
-	'info_ajout_image' => 'Lorsque vous ajoutez des images en tant que documents joints à un article,
222
+    'info_activer_menu_developpement' => 'Afficher le menu Développement',
223
+    'info_admin_etre_webmestre' => 'Me donner les droits de webmestre',
224
+    'info_admin_je_suis_webmestre' => 'Je suis <b>webmestre</b>',
225
+    'info_admin_statuer_webmestre' => 'Donner à cet administrateur les droits de webmestre',
226
+    'info_admin_webmestre' => 'Cet administrateur est <b>webmestre</b>',
227
+    'info_administrateur' => 'Administrateur',
228
+    'info_administrateur_1' => 'Administrateur',
229
+    'info_administrateur_2' => 'du site (<i>utilisez avec précaution</i>)',
230
+    'info_administrateur_site_01' => 'Si vous êtes administrateur du site, veuillez',
231
+    'info_administrateur_site_02' => 'cliquer sur ce lien',
232
+    'info_administrateurs' => 'Administrateurs',
233
+    'info_administrer_rubrique' => 'Vous pouvez administrer cette rubrique',
234
+    'info_adresse' => 'à l’adresse :',
235
+    'info_adresse_desinscription' => 'Adresse de désinscription :',
236
+    'info_adresse_url' => 'Adresse (URL) du site public',
237
+    'info_afficher_par_nb' => 'Afficher par',
238
+    'info_aide_en_ligne' => 'Aide en ligne SPIP',
239
+    'info_ajout_image' => 'Lorsque vous ajoutez des images en tant que documents joints à un article,
240 240
 		SPIP peut créer pour vous, automatiquement, des vignettes (miniatures) des
241 241
 		images insérées. Cela permet par exemple de créer
242 242
 		automatiquement une galerie ou un portfolio.',
243
-	'info_ajouter_rubrique' => 'Ajouter une autre rubrique à administrer :',
244
-	'info_annonce_nouveautes' => 'Annonce des nouveautés',
245
-	'info_article' => 'article',
246
-	'info_article_2' => 'articles',
247
-	'info_article_a_paraitre' => 'Les articles post-datés à paraître',
248
-	'info_articles_02' => 'articles',
249
-	'info_articles_2' => 'Articles',
250
-	'info_articles_auteur' => 'Les articles de cet auteur',
251
-	'info_articles_miens' => 'Mes articles',
252
-	'info_articles_tous' => 'Tous les articles',
253
-	'info_articles_trouves' => 'Articles trouvés',
254
-	'info_attente_validation' => 'Vos articles en attente de validation',
255
-	'info_aucun_article' => 'Aucun article',
256
-	'info_aucun_auteur' => 'Aucun auteur',
257
-	'info_aucun_message' => 'Aucun message',
258
-	'info_aucun_rubrique' => 'Aucune rubrique',
259
-	'info_aujourdhui' => 'aujourd’hui :',
260
-	'info_auteur_gere_rubriques' => 'Cet auteur gère les rubriques suivantes :',
261
-	'info_auteur_gere_toutes_rubriques' => 'Cet auteur gère <b>toutes les rubriques</b>',
262
-	'info_auteur_gere_toutes_rubriques_2' => 'Je gère <b>toutes les rubriques</b>',
263
-	'info_auteurs' => 'Les auteurs',
264
-	'info_auteurs_par_tri' => 'Auteurs@partri@',
265
-	'info_auteurs_trouves' => 'Auteurs trouvés',
266
-	'info_authentification_externe' => 'Authentification externe',
267
-	'info_avertissement' => 'Avertissement',
268
-	'info_barre_outils' => 'avec sa barre d’outils ?',
269
-	'info_base_installee' => 'La structure de votre base de données est installée.',
270
-	'info_bio' => 'Biographie',
271
-	'info_cache_desactive' => 'Le cache est temporairement désactivé.',
272
-	'info_chapeau' => 'Chapeau',
273
-	'info_chapeau_2' => 'Chapeau :',
274
-	'info_chemin_acces_1' => 'Options : <b>Chemin d’accès dans l’annuaire</b>',
275
-	'info_chemin_acces_2' => 'Vous devez désormais configurer le chemin d’accès aux informations dans l’annuaire. Cette information est indispensable pour lire les profils utilisateurs stockés dans l’annuaire.',
276
-	'info_chemin_acces_annuaire' => 'Options : <b>Chemin d’accès dans l’annuaire</b>',
277
-	'info_choix_base' => 'Troisième étape :',
278
-	'info_classement_1' => '<sup>er</sup> sur @liste@',
279
-	'info_classement_2' => '<sup>e</sup> sur @liste@',
280
-	'info_code_acces' => 'N’oubliez pas vos propres codes d’accès !',
281
-	'info_config_suivi' => 'Si cette adresse correspond à une mailing-list, vous pouvez indiquer ci-dessous l’adresse à laquelle les participants au site peuvent s’inscrire. Cette adresse peut être une URL (par exemple la page d’inscription à la liste par le Web), ou une adresse email dotée d’un sujet spécifique (par exemple : <tt>@adresse_suivi@?subject=subscribe</tt>) :',
282
-	'info_config_suivi_explication' => 'Vous pouvez vous abonner à la mailing-list de ce site. Vous recevrez alors par courrier électronique les annonces d’articles et de brèves proposés à la publication.',
283
-	'info_confirmer_passe' => 'Confirmer ce nouveau mot de passe :',
284
-	'info_conflit_edition_avis_non_sauvegarde' => 'Attention, les champs suivants ont été modifiés par ailleurs. Vos modifications sur ces champs n’ont donc pas été enregistrées.',
285
-	'info_conflit_edition_differences' => 'Différences :',
286
-	'info_conflit_edition_version_enregistree' => 'La version enregistrée :',
287
-	'info_conflit_edition_votre_version' => 'Votre version :',
288
-	'info_connexion_base' => 'Essai de connexion à la base',
289
-	'info_connexion_base_donnee' => 'Connexion à votre base de données',
290
-	'info_connexion_ldap_ok' => '<b>La connexion LDAP a réussi.</b><p> Vous pouvez passer à l’étape suivante.</p>',
291
-	'info_connexion_mysql' => 'Votre connexion SQL',
292
-	'info_connexion_ok' => 'La connexion a réussi.',
293
-	'info_contact' => 'Contact',
294
-	'info_contenu_articles' => 'Contenu des articles',
295
-	'info_contributions' => 'Contributions',
296
-	'info_creation_paragraphe' => 'Pour créer des paragraphes, laissez simplement des lignes vides.',
297
-	'info_creation_rubrique' => 'Avant de pouvoir écrire des articles,<br /> vous devez créer au moins une rubrique.<br />',
298
-	'info_creation_tables' => 'Création des tables de la base',
299
-	'info_creer_base' => '<b>Créer</b> une nouvelle base de données :',
300
-	'info_dans_rubrique' => 'Dans la rubrique :',
301
-	'info_date_publication_anterieure' => 'Date de rédaction antérieure :',
302
-	'info_date_referencement' => 'DATE DE RÉFÉRENCEMENT DE CE SITE :',
303
-	'info_derniere_etape' => 'C’est terminé !',
304
-	'info_descriptif' => 'Descriptif :',
305
-	'info_desinstaller_plugin' => 'supprime les données et désactive le plugin',
306
-	'info_discussion_cours' => 'Discussions en cours',
307
-	'info_ecrire_article' => 'Avant de pouvoir écrire des articles, vous devez créer au moins une rubrique.',
308
-	'info_email_envoi' => 'Adresse email d’envoi (optionnel)',
309
-	'info_email_envoi_txt' => 'Indiquez ici l’adresse à utiliser pour envoyer les emails (à défaut, l’adresse destinataire sera utilisée comme adresse d’envoi) :',
310
-	'info_email_webmestre' => 'Adresse email du webmestre',
311
-	'info_envoi_email_automatique' => 'Envoi de mails automatique',
312
-	'info_envoyer_maintenant' => 'Envoyer maintenant',
313
-	'info_etape_suivante' => 'Passer à l’étape suivante',
314
-	'info_etape_suivante_1' => 'Vous pouvez passer à l’étape suivante.',
315
-	'info_etape_suivante_2' => 'Vous pouvez passer à l’étape suivante.',
316
-	'info_exceptions_proxy' => 'Exceptions pour le proxy',
317
-	'info_exportation_base' => 'exportation de la base vers @archive@',
318
-	'info_facilite_suivi_activite' => 'Afin de faciliter le suivi de l’activité
243
+    'info_ajouter_rubrique' => 'Ajouter une autre rubrique à administrer :',
244
+    'info_annonce_nouveautes' => 'Annonce des nouveautés',
245
+    'info_article' => 'article',
246
+    'info_article_2' => 'articles',
247
+    'info_article_a_paraitre' => 'Les articles post-datés à paraître',
248
+    'info_articles_02' => 'articles',
249
+    'info_articles_2' => 'Articles',
250
+    'info_articles_auteur' => 'Les articles de cet auteur',
251
+    'info_articles_miens' => 'Mes articles',
252
+    'info_articles_tous' => 'Tous les articles',
253
+    'info_articles_trouves' => 'Articles trouvés',
254
+    'info_attente_validation' => 'Vos articles en attente de validation',
255
+    'info_aucun_article' => 'Aucun article',
256
+    'info_aucun_auteur' => 'Aucun auteur',
257
+    'info_aucun_message' => 'Aucun message',
258
+    'info_aucun_rubrique' => 'Aucune rubrique',
259
+    'info_aujourdhui' => 'aujourd’hui :',
260
+    'info_auteur_gere_rubriques' => 'Cet auteur gère les rubriques suivantes :',
261
+    'info_auteur_gere_toutes_rubriques' => 'Cet auteur gère <b>toutes les rubriques</b>',
262
+    'info_auteur_gere_toutes_rubriques_2' => 'Je gère <b>toutes les rubriques</b>',
263
+    'info_auteurs' => 'Les auteurs',
264
+    'info_auteurs_par_tri' => 'Auteurs@partri@',
265
+    'info_auteurs_trouves' => 'Auteurs trouvés',
266
+    'info_authentification_externe' => 'Authentification externe',
267
+    'info_avertissement' => 'Avertissement',
268
+    'info_barre_outils' => 'avec sa barre d’outils ?',
269
+    'info_base_installee' => 'La structure de votre base de données est installée.',
270
+    'info_bio' => 'Biographie',
271
+    'info_cache_desactive' => 'Le cache est temporairement désactivé.',
272
+    'info_chapeau' => 'Chapeau',
273
+    'info_chapeau_2' => 'Chapeau :',
274
+    'info_chemin_acces_1' => 'Options : <b>Chemin d’accès dans l’annuaire</b>',
275
+    'info_chemin_acces_2' => 'Vous devez désormais configurer le chemin d’accès aux informations dans l’annuaire. Cette information est indispensable pour lire les profils utilisateurs stockés dans l’annuaire.',
276
+    'info_chemin_acces_annuaire' => 'Options : <b>Chemin d’accès dans l’annuaire</b>',
277
+    'info_choix_base' => 'Troisième étape :',
278
+    'info_classement_1' => '<sup>er</sup> sur @liste@',
279
+    'info_classement_2' => '<sup>e</sup> sur @liste@',
280
+    'info_code_acces' => 'N’oubliez pas vos propres codes d’accès !',
281
+    'info_config_suivi' => 'Si cette adresse correspond à une mailing-list, vous pouvez indiquer ci-dessous l’adresse à laquelle les participants au site peuvent s’inscrire. Cette adresse peut être une URL (par exemple la page d’inscription à la liste par le Web), ou une adresse email dotée d’un sujet spécifique (par exemple : <tt>@adresse_suivi@?subject=subscribe</tt>) :',
282
+    'info_config_suivi_explication' => 'Vous pouvez vous abonner à la mailing-list de ce site. Vous recevrez alors par courrier électronique les annonces d’articles et de brèves proposés à la publication.',
283
+    'info_confirmer_passe' => 'Confirmer ce nouveau mot de passe :',
284
+    'info_conflit_edition_avis_non_sauvegarde' => 'Attention, les champs suivants ont été modifiés par ailleurs. Vos modifications sur ces champs n’ont donc pas été enregistrées.',
285
+    'info_conflit_edition_differences' => 'Différences :',
286
+    'info_conflit_edition_version_enregistree' => 'La version enregistrée :',
287
+    'info_conflit_edition_votre_version' => 'Votre version :',
288
+    'info_connexion_base' => 'Essai de connexion à la base',
289
+    'info_connexion_base_donnee' => 'Connexion à votre base de données',
290
+    'info_connexion_ldap_ok' => '<b>La connexion LDAP a réussi.</b><p> Vous pouvez passer à l’étape suivante.</p>',
291
+    'info_connexion_mysql' => 'Votre connexion SQL',
292
+    'info_connexion_ok' => 'La connexion a réussi.',
293
+    'info_contact' => 'Contact',
294
+    'info_contenu_articles' => 'Contenu des articles',
295
+    'info_contributions' => 'Contributions',
296
+    'info_creation_paragraphe' => 'Pour créer des paragraphes, laissez simplement des lignes vides.',
297
+    'info_creation_rubrique' => 'Avant de pouvoir écrire des articles,<br /> vous devez créer au moins une rubrique.<br />',
298
+    'info_creation_tables' => 'Création des tables de la base',
299
+    'info_creer_base' => '<b>Créer</b> une nouvelle base de données :',
300
+    'info_dans_rubrique' => 'Dans la rubrique :',
301
+    'info_date_publication_anterieure' => 'Date de rédaction antérieure :',
302
+    'info_date_referencement' => 'DATE DE RÉFÉRENCEMENT DE CE SITE :',
303
+    'info_derniere_etape' => 'C’est terminé !',
304
+    'info_descriptif' => 'Descriptif :',
305
+    'info_desinstaller_plugin' => 'supprime les données et désactive le plugin',
306
+    'info_discussion_cours' => 'Discussions en cours',
307
+    'info_ecrire_article' => 'Avant de pouvoir écrire des articles, vous devez créer au moins une rubrique.',
308
+    'info_email_envoi' => 'Adresse email d’envoi (optionnel)',
309
+    'info_email_envoi_txt' => 'Indiquez ici l’adresse à utiliser pour envoyer les emails (à défaut, l’adresse destinataire sera utilisée comme adresse d’envoi) :',
310
+    'info_email_webmestre' => 'Adresse email du webmestre',
311
+    'info_envoi_email_automatique' => 'Envoi de mails automatique',
312
+    'info_envoyer_maintenant' => 'Envoyer maintenant',
313
+    'info_etape_suivante' => 'Passer à l’étape suivante',
314
+    'info_etape_suivante_1' => 'Vous pouvez passer à l’étape suivante.',
315
+    'info_etape_suivante_2' => 'Vous pouvez passer à l’étape suivante.',
316
+    'info_exceptions_proxy' => 'Exceptions pour le proxy',
317
+    'info_exportation_base' => 'exportation de la base vers @archive@',
318
+    'info_facilite_suivi_activite' => 'Afin de faciliter le suivi de l’activité
319 319
 		éditoriale du site, SPIP peut faire parvenir par mail, par exemple
320 320
 		à une mailing-list des rédacteurs, l’annonce des demandes de
321 321
 		publication et des validations d’articles.',
322
-	'info_fichiers_authent' => 'Fichiers d’authentification « .htpasswd »',
323
-	'info_forums_abo_invites' => 'Votre site comporte des forums sur abonnement ; les visiteurs sont donc invités à s’enregistrer sur le site public.',
324
-	'info_gauche_admin_tech' => '<b>Cette page est uniquement accessible aux responsables du site.</b><p> Elle donne accès aux différentes
322
+    'info_fichiers_authent' => 'Fichiers d’authentification « .htpasswd »',
323
+    'info_forums_abo_invites' => 'Votre site comporte des forums sur abonnement ; les visiteurs sont donc invités à s’enregistrer sur le site public.',
324
+    'info_gauche_admin_tech' => '<b>Cette page est uniquement accessible aux responsables du site.</b><p> Elle donne accès aux différentes
325 325
 fonctions de maintenance technique. Certaines d’entre elles donnent lieu à un processus d’authentification spécifique, qui
326 326
 exige d’avoir un accès FTP au site Web.</p>',
327
-	'info_gauche_admin_vider' => '<b>Cette page est uniquement accessible aux responsables du site.</b><p> Elle donne accès aux différentes
327
+    'info_gauche_admin_vider' => '<b>Cette page est uniquement accessible aux responsables du site.</b><p> Elle donne accès aux différentes
328 328
 fonctions de maintenance technique. Certaines d’entre elles donnent lieu à un processus d’authentification spécifique, qui
329 329
 exige d’avoir un accès FTP au site Web.</p>',
330
-	'info_gauche_auteurs' => 'Vous trouverez ici tous les auteurs du site.
330
+    'info_gauche_auteurs' => 'Vous trouverez ici tous les auteurs du site.
331 331
  Leur statut est indiqué par la couleur de leur icone (administrateur = vert ; rédacteur = jaune).',
332
-	'info_gauche_auteurs_exterieurs' => 'Les auteurs extérieurs, sans accès au site, sont indiqués par une icone bleue ;
332
+    'info_gauche_auteurs_exterieurs' => 'Les auteurs extérieurs, sans accès au site, sont indiqués par une icone bleue ;
333 333
 		les auteurs effacés par une icone grise.',
334
-	'info_gauche_messagerie' => 'La messagerie vous permet d’échanger des messages entre rédacteurs, de conserver des pense-bêtes (pour votre usage personnel) ou d’afficher des annonces sur la page d’accueil de l’espace privé (si vous êtes administrateur).',
335
-	'info_gauche_statistiques_referers' => 'Cette page présente la liste des <i>referers</i>, c’est-à-dire des sites contenant des liens menant vers votre propre site, uniquement pour hier et aujourd’hui ; cette liste est remise à zéro toutes les 24 heures.',
336
-	'info_gauche_visiteurs_enregistres' => 'Vous trouverez ici les visiteurs enregistrés
334
+    'info_gauche_messagerie' => 'La messagerie vous permet d’échanger des messages entre rédacteurs, de conserver des pense-bêtes (pour votre usage personnel) ou d’afficher des annonces sur la page d’accueil de l’espace privé (si vous êtes administrateur).',
335
+    'info_gauche_statistiques_referers' => 'Cette page présente la liste des <i>referers</i>, c’est-à-dire des sites contenant des liens menant vers votre propre site, uniquement pour hier et aujourd’hui ; cette liste est remise à zéro toutes les 24 heures.',
336
+    'info_gauche_visiteurs_enregistres' => 'Vous trouverez ici les visiteurs enregistrés
337 337
 	dans l’espace public du site (forums sur abonnement).',
338
-	'info_generation_miniatures_images' => 'Génération de miniatures des images',
339
-	'info_gerer_trad_objets' => '@objets@ : gérer les liens de traduction',
340
-	'info_hebergeur_desactiver_envoi_email' => 'Certains hébergeurs désactivent l’envoi automatique de
338
+    'info_generation_miniatures_images' => 'Génération de miniatures des images',
339
+    'info_gerer_trad_objets' => '@objets@ : gérer les liens de traduction',
340
+    'info_hebergeur_desactiver_envoi_email' => 'Certains hébergeurs désactivent l’envoi automatique de
341 341
 		mails depuis leurs serveurs. Dans ce cas, les fonctionnalités suivantes
342 342
 		de SPIP ne fonctionneront pas.',
343
-	'info_hier' => 'hier :',
344
-	'info_identification_publique' => 'Votre identité publique...',
345
-	'info_image_process' => 'Veuillez sélectionner la meilleure méthode de fabrication des vignettes en cliquant sur l’image correspondante.',
346
-	'info_image_process2' => 'Si aucune image n’apparaît, alors le serveur qui héberge votre site n’a pas été configuré pour utiliser de tels outils. Si vous souhaitez utiliser ces fonctions, contactez le responsable technique et demandez les extensions « GD » ou « Imagick ».',
347
-	'info_images_auto' => 'Images calculées automatiquement',
348
-	'info_informations_personnelles' => 'Informations personnelles',
349
-	'info_inscription' => 'Inscription le',
350
-	'info_inscription_automatique' => 'Inscription automatique de nouveaux rédacteurs',
351
-	'info_jeu_caractere' => 'Jeu de caractères du site',
352
-	'info_jours' => 'jours',
353
-	'info_laisser_champs_vides' => 'laisser ces champs vides)',
354
-	'info_langues' => 'Langues du site',
355
-	'info_ldap_ok' => 'L’authentification LDAP est installée.',
356
-	'info_lien_hypertexte' => 'Lien hypertexte :',
357
-	'info_liste_nouveautes_envoyee' => 'La liste des nouveautés a été envoyée',
358
-	'info_liste_redacteurs_connectes' => 'Liste des rédacteurs connectés',
359
-	'info_login_existant' => 'Ce login existe déjà.',
360
-	'info_login_trop_court' => 'Login trop court.',
361
-	'info_login_trop_court_car_pluriel' => 'Le login doit contenir au moins @nb@ caractères.',
362
-	'info_logos' => 'Les logos',
363
-	'info_maximum' => 'maximum :',
364
-	'info_meme_rubrique' => 'Dans la même rubrique',
365
-	'info_message_en_redaction' => 'Vos messages en cours de rédaction',
366
-	'info_message_technique' => 'Message technique :',
367
-	'info_messagerie_interne' => 'Messagerie interne',
368
-	'info_mise_a_niveau_base' => 'mise à niveau de votre base SQL',
369
-	'info_mise_a_niveau_base_2' => '{{Attention !}} Vous avez installé une version
343
+    'info_hier' => 'hier :',
344
+    'info_identification_publique' => 'Votre identité publique...',
345
+    'info_image_process' => 'Veuillez sélectionner la meilleure méthode de fabrication des vignettes en cliquant sur l’image correspondante.',
346
+    'info_image_process2' => 'Si aucune image n’apparaît, alors le serveur qui héberge votre site n’a pas été configuré pour utiliser de tels outils. Si vous souhaitez utiliser ces fonctions, contactez le responsable technique et demandez les extensions « GD » ou « Imagick ».',
347
+    'info_images_auto' => 'Images calculées automatiquement',
348
+    'info_informations_personnelles' => 'Informations personnelles',
349
+    'info_inscription' => 'Inscription le',
350
+    'info_inscription_automatique' => 'Inscription automatique de nouveaux rédacteurs',
351
+    'info_jeu_caractere' => 'Jeu de caractères du site',
352
+    'info_jours' => 'jours',
353
+    'info_laisser_champs_vides' => 'laisser ces champs vides)',
354
+    'info_langues' => 'Langues du site',
355
+    'info_ldap_ok' => 'L’authentification LDAP est installée.',
356
+    'info_lien_hypertexte' => 'Lien hypertexte :',
357
+    'info_liste_nouveautes_envoyee' => 'La liste des nouveautés a été envoyée',
358
+    'info_liste_redacteurs_connectes' => 'Liste des rédacteurs connectés',
359
+    'info_login_existant' => 'Ce login existe déjà.',
360
+    'info_login_trop_court' => 'Login trop court.',
361
+    'info_login_trop_court_car_pluriel' => 'Le login doit contenir au moins @nb@ caractères.',
362
+    'info_logos' => 'Les logos',
363
+    'info_maximum' => 'maximum :',
364
+    'info_meme_rubrique' => 'Dans la même rubrique',
365
+    'info_message_en_redaction' => 'Vos messages en cours de rédaction',
366
+    'info_message_technique' => 'Message technique :',
367
+    'info_messagerie_interne' => 'Messagerie interne',
368
+    'info_mise_a_niveau_base' => 'mise à niveau de votre base SQL',
369
+    'info_mise_a_niveau_base_2' => '{{Attention !}} Vous avez installé une version
370 370
 		des fichiers SPIP {antérieure} à celle qui se trouvait
371 371
 		auparavant sur ce site : votre base de données risque d’être
372 372
 		perdue et votre site ne fonctionnera plus.<br />{{Réinstallez les
373 373
 		fichiers de SPIP.}}',
374
-	'info_modification_enregistree' => 'Votre modification a été enregistrée',
375
-	'info_modifier_auteur' => 'Modifier l’auteur :',
376
-	'info_modifier_rubrique' => 'Modifier la rubrique :',
377
-	'info_modifier_titre' => 'Modifier : @titre@',
378
-	'info_mon_site_spip' => 'Mon site SPIP',
379
-	'info_moyenne' => 'moyenne :',
380
-	'info_multi_cet_article' => 'Langue de cet article :',
381
-	'info_multi_langues_choisies' => 'Veuillez sélectionner ci-après les langues à disposition des rédacteurs de votre site.
374
+    'info_modification_enregistree' => 'Votre modification a été enregistrée',
375
+    'info_modifier_auteur' => 'Modifier l’auteur :',
376
+    'info_modifier_rubrique' => 'Modifier la rubrique :',
377
+    'info_modifier_titre' => 'Modifier : @titre@',
378
+    'info_mon_site_spip' => 'Mon site SPIP',
379
+    'info_moyenne' => 'moyenne :',
380
+    'info_multi_cet_article' => 'Langue de cet article :',
381
+    'info_multi_langues_choisies' => 'Veuillez sélectionner ci-après les langues à disposition des rédacteurs de votre site.
382 382
 		Les langues déjà utilisées dans votre site (affichées en premier) ne peuvent pas être désactivées.',
383
-	'info_multi_objets' => '@objets@ : activer le menu de langue',
384
-	'info_multi_secteurs' => '... seulement pour les rubriques situées à la racine ?',
385
-	'info_nb_articles' => '@nb@ articles',
386
-	'info_nb_auteurs' => '@nb@ auteurs',
387
-	'info_nb_messages' => '@nb@ messages',
388
-	'info_nb_mots_cles' => '@nb@ mots-clés',
389
-	'info_nb_rubriques' => '@nb@ rubriques',
390
-	'info_nb_visiteurs' => '@nb@ visiteurs',
391
-	'info_nom' => 'Nom',
392
-	'info_nom_destinataire' => 'Nom du destinataire',
393
-	'info_nom_pas_conforme' => 'les tags html ne sont pas autorisés',
394
-	'info_nom_site' => 'Nom de votre site',
395
-	'info_nombre_articles' => '@nb_articles@ articles,',
396
-	'info_nombre_rubriques' => '@nb_rubriques@ rubriques,',
397
-	'info_nombre_sites' => '@nb_sites@ sites,',
398
-	'info_non_deplacer' => 'Ne pas déplacer...',
399
-	'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP peut envoyer, régulièrement, l’annonce des dernières nouveautés du site
383
+    'info_multi_objets' => '@objets@ : activer le menu de langue',
384
+    'info_multi_secteurs' => '... seulement pour les rubriques situées à la racine ?',
385
+    'info_nb_articles' => '@nb@ articles',
386
+    'info_nb_auteurs' => '@nb@ auteurs',
387
+    'info_nb_messages' => '@nb@ messages',
388
+    'info_nb_mots_cles' => '@nb@ mots-clés',
389
+    'info_nb_rubriques' => '@nb@ rubriques',
390
+    'info_nb_visiteurs' => '@nb@ visiteurs',
391
+    'info_nom' => 'Nom',
392
+    'info_nom_destinataire' => 'Nom du destinataire',
393
+    'info_nom_pas_conforme' => 'les tags html ne sont pas autorisés',
394
+    'info_nom_site' => 'Nom de votre site',
395
+    'info_nombre_articles' => '@nb_articles@ articles,',
396
+    'info_nombre_rubriques' => '@nb_rubriques@ rubriques,',
397
+    'info_nombre_sites' => '@nb_sites@ sites,',
398
+    'info_non_deplacer' => 'Ne pas déplacer...',
399
+    'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP peut envoyer, régulièrement, l’annonce des dernières nouveautés du site
400 400
 		(articles et brèves récemment publiés).',
401
-	'info_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés',
402
-	'info_non_modifiable' => 'ne peut pas être modifié',
403
-	'info_non_suppression_mot_cle' => 'je ne veux pas supprimer ce mot-clé.',
404
-	'info_notes' => 'Notes',
405
-	'info_nouvel_article' => 'Nouvel article',
406
-	'info_nouvelle_traduction' => 'Nouvelle traduction :',
407
-	'info_numero_article' => 'ARTICLE NUMÉRO :',
408
-	'info_obligatoire_02' => '(obligatoire)',
409
-	'info_option_accepter_visiteurs' => 'Accepter l’inscription de visiteurs du site public',
410
-	'info_option_ne_pas_accepter_visiteurs' => 'Refuser l’inscription des visiteurs',
411
-	'info_options_avancees' => 'OPTIONS AVANCÉES',
412
-	'info_ou' => 'ou...',
413
-	'info_page_interdite' => 'Page interdite',
414
-	'info_par_nom' => 'par nom',
415
-	'info_par_nombre_article' => 'par nombre d’articles',
416
-	'info_par_statut' => 'par statut',
417
-	'info_par_tri' => '’(par @tri@)’',
418
-	'info_passe_trop_court' => 'Mot de passe trop court.',
419
-	'info_passe_trop_court_car_pluriel' => 'Le mot de passe doit contenir au moins @nb@ caractères.',
420
-	'info_passes_identiques' => 'Les deux mots de passe ne sont pas identiques.',
421
-	'info_plus_cinq_car' => 'plus de 5 caractères',
422
-	'info_plus_cinq_car_2' => '(Plus de 5 caractères)',
423
-	'info_plus_trois_car' => '(Plus de 3 caractères)',
424
-	'info_popularite' => 'popularité : @popularite@ ; visites : @visites@',
425
-	'info_post_scriptum' => 'Post-Scriptum',
426
-	'info_post_scriptum_2' => 'Post-scriptum :',
427
-	'info_pour' => 'pour',
428
-	'info_preview_texte' => 'Il est possible de prévisualiser les différents éléments éditoriaux du site ayant au moins le statut « proposé », ainsi que les éléments en cours de rédaction dont on est l’auteur. Cette fonctionnalité doit-elle être disponible pour les administrateurs, les rédacteurs, ou personne ?',
429
-	'info_procedez_par_etape' => 'procédez étape par étape',
430
-	'info_procedure_maj_version' => 'la procédure de mise à jour doit être lancée afin d’adapter
401
+    'info_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés',
402
+    'info_non_modifiable' => 'ne peut pas être modifié',
403
+    'info_non_suppression_mot_cle' => 'je ne veux pas supprimer ce mot-clé.',
404
+    'info_notes' => 'Notes',
405
+    'info_nouvel_article' => 'Nouvel article',
406
+    'info_nouvelle_traduction' => 'Nouvelle traduction :',
407
+    'info_numero_article' => 'ARTICLE NUMÉRO :',
408
+    'info_obligatoire_02' => '(obligatoire)',
409
+    'info_option_accepter_visiteurs' => 'Accepter l’inscription de visiteurs du site public',
410
+    'info_option_ne_pas_accepter_visiteurs' => 'Refuser l’inscription des visiteurs',
411
+    'info_options_avancees' => 'OPTIONS AVANCÉES',
412
+    'info_ou' => 'ou...',
413
+    'info_page_interdite' => 'Page interdite',
414
+    'info_par_nom' => 'par nom',
415
+    'info_par_nombre_article' => 'par nombre d’articles',
416
+    'info_par_statut' => 'par statut',
417
+    'info_par_tri' => '’(par @tri@)’',
418
+    'info_passe_trop_court' => 'Mot de passe trop court.',
419
+    'info_passe_trop_court_car_pluriel' => 'Le mot de passe doit contenir au moins @nb@ caractères.',
420
+    'info_passes_identiques' => 'Les deux mots de passe ne sont pas identiques.',
421
+    'info_plus_cinq_car' => 'plus de 5 caractères',
422
+    'info_plus_cinq_car_2' => '(Plus de 5 caractères)',
423
+    'info_plus_trois_car' => '(Plus de 3 caractères)',
424
+    'info_popularite' => 'popularité : @popularite@ ; visites : @visites@',
425
+    'info_post_scriptum' => 'Post-Scriptum',
426
+    'info_post_scriptum_2' => 'Post-scriptum :',
427
+    'info_pour' => 'pour',
428
+    'info_preview_texte' => 'Il est possible de prévisualiser les différents éléments éditoriaux du site ayant au moins le statut « proposé », ainsi que les éléments en cours de rédaction dont on est l’auteur. Cette fonctionnalité doit-elle être disponible pour les administrateurs, les rédacteurs, ou personne ?',
429
+    'info_procedez_par_etape' => 'procédez étape par étape',
430
+    'info_procedure_maj_version' => 'la procédure de mise à jour doit être lancée afin d’adapter
431 431
 	la base de données à la nouvelle version de SPIP.',
432
-	'info_proxy_ok' => 'Test du proxy réussi.',
433
-	'info_ps' => 'P.-S.',
434
-	'info_publier' => 'publier',
435
-	'info_publies' => 'Vos articles publiés en ligne',
436
-	'info_question_accepter_visiteurs' => 'Si les squelettes de votre site prévoient l’enregistrement de visiteurs sans accès à l’espace privé, veuillez activer l’option ci-dessous :',
437
-	'info_question_inscription_nouveaux_redacteurs' => 'Acceptez-vous les inscriptions de nouveaux rédacteurs à
432
+    'info_proxy_ok' => 'Test du proxy réussi.',
433
+    'info_ps' => 'P.-S.',
434
+    'info_publier' => 'publier',
435
+    'info_publies' => 'Vos articles publiés en ligne',
436
+    'info_question_accepter_visiteurs' => 'Si les squelettes de votre site prévoient l’enregistrement de visiteurs sans accès à l’espace privé, veuillez activer l’option ci-dessous :',
437
+    'info_question_inscription_nouveaux_redacteurs' => 'Acceptez-vous les inscriptions de nouveaux rédacteurs à
438 438
   partir du site public ? Si vous acceptez, les visiteurs pourront s’inscrire
439 439
   depuis un formulaire automatisé et accéderont alors à l’espace privé pour
440 440
   proposer leurs propres articles. <div class="notice">Lors de la phase d’inscription,
@@ -443,406 +443,406 @@  discard block
 block discarded – undo
443 443
   hébergeurs désactivent l’envoi de mails depuis leurs
444 444
   serveurs : dans ce cas, l’inscription automatique est
445 445
   impossible.</div>',
446
-	'info_qui_edite' => '@nom_auteur_modif@ a travaillé sur ce contenu il y a @date_diff@ minutes',
447
-	'info_racine_site' => 'Racine du site',
448
-	'info_recharger_page' => 'Veuillez recharger cette page dans quelques instants.',
449
-	'info_recherche_auteur_zero' => 'Aucun résultat pour « @cherche_auteur@ ».',
450
-	'info_recommencer' => 'Veuillez recommencer.',
451
-	'info_redacteur_1' => 'Rédacteur',
452
-	'info_redacteur_2' => 'ayant accès à l’espace privé (<i>recommandé</i>)',
453
-	'info_redacteurs' => 'Rédacteurs',
454
-	'info_redaction_en_cours' => 'EN COURS DE RÉDACTION',
455
-	'info_redirection' => 'Redirection',
456
-	'info_redirection_activee' => 'La redirection est activée.',
457
-	'info_redirection_boucle' => 'Vous essayez de rediriger l’article sur lui-même.',
458
-	'info_redirection_desactivee' => 'La redirection a été supprimée.',
459
-	'info_refuses' => 'Vos articles refusés',
460
-	'info_reglage_ldap' => 'Options : <b>Réglage de l’importation LDAP</b>',
461
-	'info_renvoi_article' => '<b>Redirection.</b> Cet article renvoie à la page :',
462
-	'info_reserve_admin' => 'Seuls les administrateurs peuvent modifier cette adresse.',
463
-	'info_restreindre_rubrique' => 'Restreindre la gestion à la rubrique :',
464
-	'info_resultat_recherche' => 'Résultats de la recherche :',
465
-	'info_rubriques' => 'Rubriques',
466
-	'info_rubriques_02' => 'rubriques',
467
-	'info_rubriques_trouvees' => 'Rubriques trouvées',
468
-	'info_sans_titre' => 'Sans titre',
469
-	'info_selection_chemin_acces' => '<b>Sélectionnez</b> ci-après le chemin d’accès dans l’annuaire :',
470
-	'info_signatures' => 'signatures',
471
-	'info_site' => 'Site',
472
-	'info_site_2' => 'site :',
473
-	'info_site_min' => 'site',
474
-	'info_site_reference_2' => 'Site référencé',
475
-	'info_site_web' => 'Site Web :',
476
-	'info_sites' => 'sites',
477
-	'info_sites_lies_mot' => 'Les sites référencés liés à ce mot-clé',
478
-	'info_sites_proxy' => 'Utiliser un proxy',
479
-	'info_sites_trouves' => 'Sites trouvés',
480
-	'info_sous_titre' => 'Soustitre :',
481
-	'info_statut_administrateur' => 'Administrateur',
482
-	'info_statut_auteur' => 'Statut de cet auteur :',
483
-	'info_statut_auteur_2' => 'Je suis',
484
-	'info_statut_auteur_a_confirmer' => 'Inscription à confirmer',
485
-	'info_statut_auteur_autre' => 'Autre statut :',
486
-	'info_statut_redacteur' => 'Rédacteur',
487
-	'info_statut_utilisateurs_1' => 'Statut par défaut des utilisateurs importés',
488
-	'info_statut_utilisateurs_2' => 'Choisissez le statut qui est attribué aux personnes présentes dans l’annuaire LDAP lorsqu’elles se connectent pour la première fois. Vous pourrez par la suite modifier cette valeur pour chaque auteur au cas par cas.',
489
-	'info_suivi_activite' => 'Suivi de l’activité éditoriale',
490
-	'info_surtitre' => 'Surtitre :',
491
-	'info_syndication_integrale_1' => 'Votre site propose des fichiers de syndication (voir « <a href="@url@">@titre@</a> »).',
492
-	'info_syndication_integrale_2' => 'Souhaitez-vous transmettre les articles dans leur intégralité, ou ne diffuser qu’un résumé de quelques centaines de caractères ?',
493
-	'info_table_prefix' => 'Vous pouvez modifier le préfixe du nom des tables de données (ceci est indispensable lorsque l’on souhaite installer plusieurs sites dans la même base de données). Ce préfixe s’écrit en lettres minuscules, non accentuées, et sans espace.',
494
-	'info_taille_maximale_images' => 'SPIP va tester la taille maximale des images qu’il peut traiter (en millions de pixels).<br /> Les images plus grandes ne seront pas réduites.',
495
-	'info_taille_maximale_vignette' => 'Taille maximale des vignettes générées par le système :',
496
-	'info_terminer_installation' => 'Vous pouvez maintenant terminer la procédure d’installation standard.',
497
-	'info_texte' => 'Texte',
498
-	'info_texte_explicatif' => 'Texte explicatif',
499
-	'info_texte_long' => '(le texte est long : il apparaît donc en plusieurs parties qui seront recollées après validation.)',
500
-	'info_texte_message' => 'Texte de votre message',
501
-	'info_texte_message_02' => 'Texte du message',
502
-	'info_titre' => 'Titre :',
503
-	'info_total' => 'total :',
504
-	'info_tous_articles_en_redaction' => 'Tous les articles en cours de rédaction',
505
-	'info_tous_articles_presents' => 'Tous les articles publiés dans cette rubrique',
506
-	'info_tous_articles_refuses' => 'Tous les articles refusés',
507
-	'info_tous_les' => 'tous les :',
508
-	'info_tout_site' => 'Tout le site',
509
-	'info_tout_site2' => 'L’article n’a pas été traduit dans cette langue.',
510
-	'info_tout_site3' => 'L’article a été traduit dans cette langue, mais des modifications ont été apportées par la suite à l’article de référence. La traduction doit être mise à jour.',
511
-	'info_tout_site4' => 'L’article a été traduit dans cette langue, et la traduction est à jour.',
512
-	'info_tout_site5' => 'Article original.',
513
-	'info_tout_site6' => '<b>Attention :</b> seuls les articles originaux sont affichés.
446
+    'info_qui_edite' => '@nom_auteur_modif@ a travaillé sur ce contenu il y a @date_diff@ minutes',
447
+    'info_racine_site' => 'Racine du site',
448
+    'info_recharger_page' => 'Veuillez recharger cette page dans quelques instants.',
449
+    'info_recherche_auteur_zero' => 'Aucun résultat pour « @cherche_auteur@ ».',
450
+    'info_recommencer' => 'Veuillez recommencer.',
451
+    'info_redacteur_1' => 'Rédacteur',
452
+    'info_redacteur_2' => 'ayant accès à l’espace privé (<i>recommandé</i>)',
453
+    'info_redacteurs' => 'Rédacteurs',
454
+    'info_redaction_en_cours' => 'EN COURS DE RÉDACTION',
455
+    'info_redirection' => 'Redirection',
456
+    'info_redirection_activee' => 'La redirection est activée.',
457
+    'info_redirection_boucle' => 'Vous essayez de rediriger l’article sur lui-même.',
458
+    'info_redirection_desactivee' => 'La redirection a été supprimée.',
459
+    'info_refuses' => 'Vos articles refusés',
460
+    'info_reglage_ldap' => 'Options : <b>Réglage de l’importation LDAP</b>',
461
+    'info_renvoi_article' => '<b>Redirection.</b> Cet article renvoie à la page :',
462
+    'info_reserve_admin' => 'Seuls les administrateurs peuvent modifier cette adresse.',
463
+    'info_restreindre_rubrique' => 'Restreindre la gestion à la rubrique :',
464
+    'info_resultat_recherche' => 'Résultats de la recherche :',
465
+    'info_rubriques' => 'Rubriques',
466
+    'info_rubriques_02' => 'rubriques',
467
+    'info_rubriques_trouvees' => 'Rubriques trouvées',
468
+    'info_sans_titre' => 'Sans titre',
469
+    'info_selection_chemin_acces' => '<b>Sélectionnez</b> ci-après le chemin d’accès dans l’annuaire :',
470
+    'info_signatures' => 'signatures',
471
+    'info_site' => 'Site',
472
+    'info_site_2' => 'site :',
473
+    'info_site_min' => 'site',
474
+    'info_site_reference_2' => 'Site référencé',
475
+    'info_site_web' => 'Site Web :',
476
+    'info_sites' => 'sites',
477
+    'info_sites_lies_mot' => 'Les sites référencés liés à ce mot-clé',
478
+    'info_sites_proxy' => 'Utiliser un proxy',
479
+    'info_sites_trouves' => 'Sites trouvés',
480
+    'info_sous_titre' => 'Soustitre :',
481
+    'info_statut_administrateur' => 'Administrateur',
482
+    'info_statut_auteur' => 'Statut de cet auteur :',
483
+    'info_statut_auteur_2' => 'Je suis',
484
+    'info_statut_auteur_a_confirmer' => 'Inscription à confirmer',
485
+    'info_statut_auteur_autre' => 'Autre statut :',
486
+    'info_statut_redacteur' => 'Rédacteur',
487
+    'info_statut_utilisateurs_1' => 'Statut par défaut des utilisateurs importés',
488
+    'info_statut_utilisateurs_2' => 'Choisissez le statut qui est attribué aux personnes présentes dans l’annuaire LDAP lorsqu’elles se connectent pour la première fois. Vous pourrez par la suite modifier cette valeur pour chaque auteur au cas par cas.',
489
+    'info_suivi_activite' => 'Suivi de l’activité éditoriale',
490
+    'info_surtitre' => 'Surtitre :',
491
+    'info_syndication_integrale_1' => 'Votre site propose des fichiers de syndication (voir « <a href="@url@">@titre@</a> »).',
492
+    'info_syndication_integrale_2' => 'Souhaitez-vous transmettre les articles dans leur intégralité, ou ne diffuser qu’un résumé de quelques centaines de caractères ?',
493
+    'info_table_prefix' => 'Vous pouvez modifier le préfixe du nom des tables de données (ceci est indispensable lorsque l’on souhaite installer plusieurs sites dans la même base de données). Ce préfixe s’écrit en lettres minuscules, non accentuées, et sans espace.',
494
+    'info_taille_maximale_images' => 'SPIP va tester la taille maximale des images qu’il peut traiter (en millions de pixels).<br /> Les images plus grandes ne seront pas réduites.',
495
+    'info_taille_maximale_vignette' => 'Taille maximale des vignettes générées par le système :',
496
+    'info_terminer_installation' => 'Vous pouvez maintenant terminer la procédure d’installation standard.',
497
+    'info_texte' => 'Texte',
498
+    'info_texte_explicatif' => 'Texte explicatif',
499
+    'info_texte_long' => '(le texte est long : il apparaît donc en plusieurs parties qui seront recollées après validation.)',
500
+    'info_texte_message' => 'Texte de votre message',
501
+    'info_texte_message_02' => 'Texte du message',
502
+    'info_titre' => 'Titre :',
503
+    'info_total' => 'total :',
504
+    'info_tous_articles_en_redaction' => 'Tous les articles en cours de rédaction',
505
+    'info_tous_articles_presents' => 'Tous les articles publiés dans cette rubrique',
506
+    'info_tous_articles_refuses' => 'Tous les articles refusés',
507
+    'info_tous_les' => 'tous les :',
508
+    'info_tout_site' => 'Tout le site',
509
+    'info_tout_site2' => 'L’article n’a pas été traduit dans cette langue.',
510
+    'info_tout_site3' => 'L’article a été traduit dans cette langue, mais des modifications ont été apportées par la suite à l’article de référence. La traduction doit être mise à jour.',
511
+    'info_tout_site4' => 'L’article a été traduit dans cette langue, et la traduction est à jour.',
512
+    'info_tout_site5' => 'Article original.',
513
+    'info_tout_site6' => '<b>Attention :</b> seuls les articles originaux sont affichés.
514 514
 Les traductions sont associées à l’original,
515 515
 dans une couleur qui indique leur état :',
516
-	'info_traductions' => 'Traductions',
517
-	'info_travail_colaboratif' => 'Travail collaboratif sur les articles',
518
-	'info_un_article' => 'un article,',
519
-	'info_un_site' => 'un site,',
520
-	'info_une_rubrique' => 'une rubrique,',
521
-	'info_une_rubrique_02' => '1 rubrique',
522
-	'info_url' => 'URL :',
523
-	'info_url_proxy' => 'URL du proxy',
524
-	'info_url_proxy_pas_conforme' => 'l’URL du proxy n’est pas valide.',
525
-	'info_url_site_pas_conforme' => 'l’URL du site n’est pas valide.',
526
-	'info_url_test_proxy' => 'URL de test',
527
-	'info_urlref' => 'Lien hypertexte :',
528
-	'info_utilisation_spip' => 'Vous pouvez maintenant commencer à utiliser le système de publication assistée...',
529
-	'info_visites_par_mois' => 'Affichage par mois :',
530
-	'info_visiteur_1' => 'Visiteur',
531
-	'info_visiteur_2' => 'du site public',
532
-	'info_visiteurs' => 'Visiteurs',
533
-	'info_visiteurs_02' => 'Visiteurs du site public',
534
-	'info_webmestre_forces' => 'Les webmestres sont actuellement définis dans <tt>@file_options@</tt>.',
535
-	'install_adresse_base_hebergeur' => 'Adresse de la base de données attribuée par l’hébergeur',
536
-	'install_connect_ok' => 'La nouvelle base a bien été déclarée sous le nom de serveur @connect@.',
537
-	'install_echec_annonce' => 'L’installation va probablement échouer, ou aboutir à un site non fonctionnel...',
538
-	'install_extension_mbstring' => 'SPIP ne fonctionne pas avec :',
539
-	'install_extension_php_obligatoire' => 'SPIP exige l’extension php :',
540
-	'install_login_base_hebergeur' => 'Login de connexion attribué par l’hébergeur',
541
-	'install_nom_base_hebergeur' => 'Nom de la base attribué par l’hébergeur :',
542
-	'install_pas_table' => 'Base actuellement sans tables',
543
-	'install_pass_base_hebergeur' => 'Mot de passe de connexion attribué par l’hébergeur',
544
-	'install_php_extension' => 'Les extensions suivantes sont manquantes : @extensions@',
545
-	'install_php_version' => 'PHP version @version@ insuffisant (minimum = @minimum@)',
546
-	'install_php_version_max' => 'PHP version @version@ trop récent (maximum = @maximum@)',
547
-	'install_select_langue' => 'Sélectionnez une langue puis cliquez sur le bouton « suivant » pour lancer la procédure d’installation.',
548
-	'install_select_type_db' => 'Indiquer le type de base de données :',
549
-	'install_select_type_mysql' => 'MySQL',
550
-	'install_select_type_pg' => 'PostgreSQL',
551
-	'install_select_type_sqlite2' => 'SQLite 2',
552
-	'install_select_type_sqlite3' => 'SQLite 3',
553
-	'install_serveur_hebergeur' => 'Serveur de base de données attribué par l’hébergeur',
554
-	'install_table_prefix_hebergeur' => 'Préfixe de table attribué par l’hébergeur :',
555
-	'install_tables_base' => 'Tables de la base',
556
-	'install_types_db_connus' => 'SPIP sait utiliser <b>MySQL</b> (le plus répandu) et <b>SQLite</b>.',
557
-	'install_types_db_connus_avertissement' => 'Le support de <b>PostgreSQL</b> est également proposé à titre experimental',
558
-	'instituer_erreur_statut_a_change' => 'Le statut a déjà été modifié',
559
-	'instituer_erreur_statut_non_autorise' => 'Vous ne pouvez pas choisir ce statut',
560
-	'intem_redacteur' => 'rédacteur',
561
-	'intitule_licence' => 'Licence',
562
-	'item_accepter_inscriptions' => 'Accepter les inscriptions',
563
-	'item_activer_messages_avertissement' => 'Activer les messages d’avertissement',
564
-	'item_administrateur_2' => 'administrateur',
565
-	'item_afficher_calendrier' => 'Afficher dans le calendrier',
566
-	'item_autoriser_syndication_integrale' => 'Diffuser l’intégralité des articles dans les fichiers de syndication',
567
-	'item_choix_administrateurs' => 'les administrateurs',
568
-	'item_choix_generation_miniature' => 'Générer automatiquement les miniatures des images.',
569
-	'item_choix_non_generation_miniature' => 'Ne pas générer de miniatures des images.',
570
-	'item_choix_redacteurs' => 'les rédacteurs',
571
-	'item_choix_visiteurs' => 'les visiteurs du site public',
572
-	'item_creer_fichiers_authent' => 'Créer les fichiers .htpasswd',
573
-	'item_login' => 'Login',
574
-	'item_messagerie_agenda' => 'Activer la messagerie et l’agenda',
575
-	'item_mots_cles_association_articles' => 'aux articles',
576
-	'item_mots_cles_association_rubriques' => 'aux rubriques',
577
-	'item_mots_cles_association_sites' => 'aux sites référencés ou syndiqués.',
578
-	'item_non' => 'Non',
579
-	'item_non_accepter_inscriptions' => 'Ne pas accepter les inscriptions',
580
-	'item_non_activer_messages_avertissement' => 'Pas de messages d’avertissement',
581
-	'item_non_afficher_calendrier' => 'Ne pas afficher dans le calendrier',
582
-	'item_non_autoriser_syndication_integrale' => 'Ne diffuser qu’un résumé',
583
-	'item_non_creer_fichiers_authent' => 'Ne pas créer ces fichiers',
584
-	'item_non_messagerie_agenda' => 'Désactiver la messagerie et l’agenda',
585
-	'item_non_publier_articles' => 'Ne pas publier les articles avant la date de publication fixée.',
586
-	'item_nouvel_auteur' => 'Nouvel auteur',
587
-	'item_nouvelle_rubrique' => 'Nouvelle rubrique',
588
-	'item_oui' => 'Oui',
589
-	'item_publier_articles' => 'Publier les articles, quelle que soit leur date de publication.',
590
-	'item_reponse_article' => 'Réponse à l’article',
591
-	'item_visiteur' => 'visiteur',
516
+    'info_traductions' => 'Traductions',
517
+    'info_travail_colaboratif' => 'Travail collaboratif sur les articles',
518
+    'info_un_article' => 'un article,',
519
+    'info_un_site' => 'un site,',
520
+    'info_une_rubrique' => 'une rubrique,',
521
+    'info_une_rubrique_02' => '1 rubrique',
522
+    'info_url' => 'URL :',
523
+    'info_url_proxy' => 'URL du proxy',
524
+    'info_url_proxy_pas_conforme' => 'l’URL du proxy n’est pas valide.',
525
+    'info_url_site_pas_conforme' => 'l’URL du site n’est pas valide.',
526
+    'info_url_test_proxy' => 'URL de test',
527
+    'info_urlref' => 'Lien hypertexte :',
528
+    'info_utilisation_spip' => 'Vous pouvez maintenant commencer à utiliser le système de publication assistée...',
529
+    'info_visites_par_mois' => 'Affichage par mois :',
530
+    'info_visiteur_1' => 'Visiteur',
531
+    'info_visiteur_2' => 'du site public',
532
+    'info_visiteurs' => 'Visiteurs',
533
+    'info_visiteurs_02' => 'Visiteurs du site public',
534
+    'info_webmestre_forces' => 'Les webmestres sont actuellement définis dans <tt>@file_options@</tt>.',
535
+    'install_adresse_base_hebergeur' => 'Adresse de la base de données attribuée par l’hébergeur',
536
+    'install_connect_ok' => 'La nouvelle base a bien été déclarée sous le nom de serveur @connect@.',
537
+    'install_echec_annonce' => 'L’installation va probablement échouer, ou aboutir à un site non fonctionnel...',
538
+    'install_extension_mbstring' => 'SPIP ne fonctionne pas avec :',
539
+    'install_extension_php_obligatoire' => 'SPIP exige l’extension php :',
540
+    'install_login_base_hebergeur' => 'Login de connexion attribué par l’hébergeur',
541
+    'install_nom_base_hebergeur' => 'Nom de la base attribué par l’hébergeur :',
542
+    'install_pas_table' => 'Base actuellement sans tables',
543
+    'install_pass_base_hebergeur' => 'Mot de passe de connexion attribué par l’hébergeur',
544
+    'install_php_extension' => 'Les extensions suivantes sont manquantes : @extensions@',
545
+    'install_php_version' => 'PHP version @version@ insuffisant (minimum = @minimum@)',
546
+    'install_php_version_max' => 'PHP version @version@ trop récent (maximum = @maximum@)',
547
+    'install_select_langue' => 'Sélectionnez une langue puis cliquez sur le bouton « suivant » pour lancer la procédure d’installation.',
548
+    'install_select_type_db' => 'Indiquer le type de base de données :',
549
+    'install_select_type_mysql' => 'MySQL',
550
+    'install_select_type_pg' => 'PostgreSQL',
551
+    'install_select_type_sqlite2' => 'SQLite 2',
552
+    'install_select_type_sqlite3' => 'SQLite 3',
553
+    'install_serveur_hebergeur' => 'Serveur de base de données attribué par l’hébergeur',
554
+    'install_table_prefix_hebergeur' => 'Préfixe de table attribué par l’hébergeur :',
555
+    'install_tables_base' => 'Tables de la base',
556
+    'install_types_db_connus' => 'SPIP sait utiliser <b>MySQL</b> (le plus répandu) et <b>SQLite</b>.',
557
+    'install_types_db_connus_avertissement' => 'Le support de <b>PostgreSQL</b> est également proposé à titre experimental',
558
+    'instituer_erreur_statut_a_change' => 'Le statut a déjà été modifié',
559
+    'instituer_erreur_statut_non_autorise' => 'Vous ne pouvez pas choisir ce statut',
560
+    'intem_redacteur' => 'rédacteur',
561
+    'intitule_licence' => 'Licence',
562
+    'item_accepter_inscriptions' => 'Accepter les inscriptions',
563
+    'item_activer_messages_avertissement' => 'Activer les messages d’avertissement',
564
+    'item_administrateur_2' => 'administrateur',
565
+    'item_afficher_calendrier' => 'Afficher dans le calendrier',
566
+    'item_autoriser_syndication_integrale' => 'Diffuser l’intégralité des articles dans les fichiers de syndication',
567
+    'item_choix_administrateurs' => 'les administrateurs',
568
+    'item_choix_generation_miniature' => 'Générer automatiquement les miniatures des images.',
569
+    'item_choix_non_generation_miniature' => 'Ne pas générer de miniatures des images.',
570
+    'item_choix_redacteurs' => 'les rédacteurs',
571
+    'item_choix_visiteurs' => 'les visiteurs du site public',
572
+    'item_creer_fichiers_authent' => 'Créer les fichiers .htpasswd',
573
+    'item_login' => 'Login',
574
+    'item_messagerie_agenda' => 'Activer la messagerie et l’agenda',
575
+    'item_mots_cles_association_articles' => 'aux articles',
576
+    'item_mots_cles_association_rubriques' => 'aux rubriques',
577
+    'item_mots_cles_association_sites' => 'aux sites référencés ou syndiqués.',
578
+    'item_non' => 'Non',
579
+    'item_non_accepter_inscriptions' => 'Ne pas accepter les inscriptions',
580
+    'item_non_activer_messages_avertissement' => 'Pas de messages d’avertissement',
581
+    'item_non_afficher_calendrier' => 'Ne pas afficher dans le calendrier',
582
+    'item_non_autoriser_syndication_integrale' => 'Ne diffuser qu’un résumé',
583
+    'item_non_creer_fichiers_authent' => 'Ne pas créer ces fichiers',
584
+    'item_non_messagerie_agenda' => 'Désactiver la messagerie et l’agenda',
585
+    'item_non_publier_articles' => 'Ne pas publier les articles avant la date de publication fixée.',
586
+    'item_nouvel_auteur' => 'Nouvel auteur',
587
+    'item_nouvelle_rubrique' => 'Nouvelle rubrique',
588
+    'item_oui' => 'Oui',
589
+    'item_publier_articles' => 'Publier les articles, quelle que soit leur date de publication.',
590
+    'item_reponse_article' => 'Réponse à l’article',
591
+    'item_visiteur' => 'visiteur',
592 592
 
593
-	// J
594
-	'jour_non_connu_nc' => 'n.c.',
593
+    // J
594
+    'jour_non_connu_nc' => 'n.c.',
595 595
 
596
-	// L
597
-	'label_bando_outils' => 'Barre d’outils',
598
-	'label_bando_outils_afficher' => 'Afficher les outils',
599
-	'label_bando_outils_masquer' => 'Masquer les outils',
600
-	'label_choix_langue' => 'Sélectionnez votre langue',
601
-	'label_nom_fichier_connect' => 'Indiquez le nom utilisé pour ce serveur',
602
-	'label_slogan_site' => 'Slogan du site',
603
-	'label_taille_ecran' => 'Largeur de l’écran',
604
-	'label_texte_et_icones_navigation' => 'Menu de navigation',
605
-	'label_texte_et_icones_page' => 'Affichage dans la page',
606
-	'ldap_correspondance' => 'héritage du champ @champ@',
607
-	'ldap_correspondance_1' => 'Héritage des champs LDAP',
608
-	'ldap_correspondance_2' => 'Pour chacun des champs SPIP suivants, indiquer le nom du champ LDAP correspondant. Laisser vide pour ne pas le remplir, séparer par des espaces ou des virgules pour essayer plusieurs champs LDAP.',
609
-	'lien_ajouter_auteur' => 'Ajouter cet auteur',
610
-	'lien_ajouter_une_rubrique' => 'Ajouter cette rubrique',
611
-	'lien_email' => 'email',
612
-	'lien_nom_site' => 'NOM DU SITE :',
613
-	'lien_rapide_contenu' => 'Aller au contenu',
614
-	'lien_rapide_navigation' => 'Aller à la navigation',
615
-	'lien_rapide_recherche' => 'Aller à la recherche',
616
-	'lien_retirer_auteur' => 'Retirer l’auteur',
617
-	'lien_retirer_rubrique' => 'Retirer la rubrique',
618
-	'lien_retirer_tous_auteurs' => 'Retirer tous les auteurs',
619
-	'lien_retirer_toutes_rubriques' => 'Retirer toutes les rubriques',
620
-	'lien_site' => 'site',
621
-	'lien_tout_decocher' => 'Tout décocher',
622
-	'lien_tout_deplier' => 'Tout déplier',
623
-	'lien_tout_replier' => 'Tout replier',
624
-	'lien_tout_supprimer' => 'Tout supprimer',
625
-	'lien_trier_nom' => 'Trier par nom',
626
-	'lien_trier_nombre_articles' => 'Trier par nombre d’articles',
627
-	'lien_trier_statut' => 'Trier par statut',
628
-	'lien_voir_en_ligne' => 'VOIR EN LIGNE :',
629
-	'logo_article' => 'Logo de l’article',
630
-	'logo_auteur' => 'Logo de l’auteur',
631
-	'logo_rubrique' => 'Logo de la rubrique',
632
-	'logo_site' => 'Logo de ce site',
633
-	'logo_standard_rubrique' => 'Logo standard des rubriques',
634
-	'logo_survol' => 'Logo pour survol',
596
+    // L
597
+    'label_bando_outils' => 'Barre d’outils',
598
+    'label_bando_outils_afficher' => 'Afficher les outils',
599
+    'label_bando_outils_masquer' => 'Masquer les outils',
600
+    'label_choix_langue' => 'Sélectionnez votre langue',
601
+    'label_nom_fichier_connect' => 'Indiquez le nom utilisé pour ce serveur',
602
+    'label_slogan_site' => 'Slogan du site',
603
+    'label_taille_ecran' => 'Largeur de l’écran',
604
+    'label_texte_et_icones_navigation' => 'Menu de navigation',
605
+    'label_texte_et_icones_page' => 'Affichage dans la page',
606
+    'ldap_correspondance' => 'héritage du champ @champ@',
607
+    'ldap_correspondance_1' => 'Héritage des champs LDAP',
608
+    'ldap_correspondance_2' => 'Pour chacun des champs SPIP suivants, indiquer le nom du champ LDAP correspondant. Laisser vide pour ne pas le remplir, séparer par des espaces ou des virgules pour essayer plusieurs champs LDAP.',
609
+    'lien_ajouter_auteur' => 'Ajouter cet auteur',
610
+    'lien_ajouter_une_rubrique' => 'Ajouter cette rubrique',
611
+    'lien_email' => 'email',
612
+    'lien_nom_site' => 'NOM DU SITE :',
613
+    'lien_rapide_contenu' => 'Aller au contenu',
614
+    'lien_rapide_navigation' => 'Aller à la navigation',
615
+    'lien_rapide_recherche' => 'Aller à la recherche',
616
+    'lien_retirer_auteur' => 'Retirer l’auteur',
617
+    'lien_retirer_rubrique' => 'Retirer la rubrique',
618
+    'lien_retirer_tous_auteurs' => 'Retirer tous les auteurs',
619
+    'lien_retirer_toutes_rubriques' => 'Retirer toutes les rubriques',
620
+    'lien_site' => 'site',
621
+    'lien_tout_decocher' => 'Tout décocher',
622
+    'lien_tout_deplier' => 'Tout déplier',
623
+    'lien_tout_replier' => 'Tout replier',
624
+    'lien_tout_supprimer' => 'Tout supprimer',
625
+    'lien_trier_nom' => 'Trier par nom',
626
+    'lien_trier_nombre_articles' => 'Trier par nombre d’articles',
627
+    'lien_trier_statut' => 'Trier par statut',
628
+    'lien_voir_en_ligne' => 'VOIR EN LIGNE :',
629
+    'logo_article' => 'Logo de l’article',
630
+    'logo_auteur' => 'Logo de l’auteur',
631
+    'logo_rubrique' => 'Logo de la rubrique',
632
+    'logo_site' => 'Logo de ce site',
633
+    'logo_standard_rubrique' => 'Logo standard des rubriques',
634
+    'logo_survol' => 'Logo pour survol',
635 635
 
636
-	// M
637
-	'menu_aide_installation_choix_base' => 'Choix de votre base',
638
-	'module_fichier_langue' => 'Fichier de langue',
639
-	'module_raccourci' => 'Raccourci',
640
-	'module_texte_affiche' => 'Texte affiché',
641
-	'module_texte_explicatif' => 'Vous pouvez insérer les raccourcis suivants dans les squelettes de votre site public. Ils seront automatiquement traduits dans les différentes langues pour lesquelles il existe un fichier de langue.',
642
-	'module_texte_traduction' => 'Le fichier de langue « @module@ » est disponible en :',
643
-	'mois_non_connu' => 'non connu',
636
+    // M
637
+    'menu_aide_installation_choix_base' => 'Choix de votre base',
638
+    'module_fichier_langue' => 'Fichier de langue',
639
+    'module_raccourci' => 'Raccourci',
640
+    'module_texte_affiche' => 'Texte affiché',
641
+    'module_texte_explicatif' => 'Vous pouvez insérer les raccourcis suivants dans les squelettes de votre site public. Ils seront automatiquement traduits dans les différentes langues pour lesquelles il existe un fichier de langue.',
642
+    'module_texte_traduction' => 'Le fichier de langue « @module@ » est disponible en :',
643
+    'mois_non_connu' => 'non connu',
644 644
 
645
-	// N
646
-	'nouvelle_version_spip' => 'La mise à jour @version@ de SPIP est disponible',
647
-	'nouvelle_version_spip_majeure' => 'Une nouvelle version SPIP @version@ est disponible',
645
+    // N
646
+    'nouvelle_version_spip' => 'La mise à jour @version@ de SPIP est disponible',
647
+    'nouvelle_version_spip_majeure' => 'Une nouvelle version SPIP @version@ est disponible',
648 648
 
649
-	// O
650
-	'onglet_contenu' => 'Contenu',
651
-	'onglet_declarer_une_autre_base' => 'Déclarer une autre base',
652
-	'onglet_discuter' => 'Discuter',
653
-	'onglet_interactivite' => 'Interactivité',
654
-	'onglet_proprietes' => 'Propriétés',
655
-	'onglet_repartition_actuelle' => 'actuellement',
656
-	'onglet_sous_rubriques' => 'Sous-rubriques',
649
+    // O
650
+    'onglet_contenu' => 'Contenu',
651
+    'onglet_declarer_une_autre_base' => 'Déclarer une autre base',
652
+    'onglet_discuter' => 'Discuter',
653
+    'onglet_interactivite' => 'Interactivité',
654
+    'onglet_proprietes' => 'Propriétés',
655
+    'onglet_repartition_actuelle' => 'actuellement',
656
+    'onglet_sous_rubriques' => 'Sous-rubriques',
657 657
 
658
-	// P
659
-	'page_pas_proxy' => 'Cette page ne doit pas passer par le proxy',
660
-	'pas_de_proxy_pour' => 'Au besoin, indiquez les machines ou domaines pour lesquels ce proxy ne doit pas s’appliquer (par exemple : @exemple@)',
661
-	'phpinfo' => 'Configuration PHP',
662
-	'plugin_charge_paquet' => 'Chargement du paquet @name@',
663
-	'plugin_charger' => 'Télécharger',
664
-	'plugin_erreur_charger' => 'erreur : impossible de charger @zip@',
665
-	'plugin_erreur_droit1' => 'Le répertoire <code>@dest@</code> n’est pas accessible en écriture.',
666
-	'plugin_erreur_droit2' => 'Veuillez vérifier les droits sur ce répertoire (et le créer le cas échéant), ou installer les fichiers par FTP.',
667
-	'plugin_erreur_zip' => 'échec pclzip : erreur @status@',
668
-	'plugin_etat_developpement' => 'en développement',
669
-	'plugin_etat_experimental' => 'expérimental',
670
-	'plugin_etat_stable' => 'stable',
671
-	'plugin_etat_test' => 'en test',
672
-	'plugin_impossible_activer' => 'Impossible d’activer le plugin @plugin@',
673
-	'plugin_info_automatique1' => 'Si vous souhaitez autoriser l’installation automatique des plugins, veuillez :',
674
-	'plugin_info_automatique1_lib' => 'Si vous souhaitez autoriser l’installation automatique de cette librairie, veuillez :',
675
-	'plugin_info_automatique2' => 'créer un répertoire <code>@rep@</code> ;',
676
-	'plugin_info_automatique3' => 'vérifier que le serveur est autorisé à écrire dans ce répertoire.',
677
-	'plugin_info_automatique_creer' => 'à créer à la racine du site.',
678
-	'plugin_info_automatique_exemples' => 'exemples :',
679
-	'plugin_info_automatique_ftp' => 'Vous pouvez installer des plugins, par FTP, dans le répertoire <tt>@rep@</tt>',
680
-	'plugin_info_automatique_lib' => 'Certains plugins demandent aussi à pouvoir télécharger des fichiers dans le répertoire <code>lib/</code>, à créer le cas échéant à la racine du site.',
681
-	'plugin_info_automatique_liste' => 'Vos listes de plugins :',
682
-	'plugin_info_automatique_liste_officielle' => 'les plugins officiels',
683
-	'plugin_info_automatique_liste_update' => 'Mettre à jour les listes',
684
-	'plugin_info_automatique_ou' => 'ou...',
685
-	'plugin_info_automatique_select' => 'Sélectionnez ci-dessous un plugin : SPIP le téléchargera et l’installera dans le répertoire <code>@rep@</code> ; si ce plugin existe déjà, il sera mis à jour.',
686
-	'plugin_info_credit' => 'Crédits',
687
-	'plugin_info_erreur_xml' => 'La déclaration de ce plugin est incorrecte',
688
-	'plugin_info_install_ok' => 'Installation réussie',
689
-	'plugin_info_necessite' => 'Nécessite :',
690
-	'plugin_info_non_compatible_spip' => 'Ce plugin n’est pas compatible avec cette version de SPIP',
691
-	'plugin_info_plugins_dist_1' => 'Les plugins ci-dessous sont chargés et activés dans le répertoire @plugins_dist@.',
692
-	'plugin_info_plugins_dist_2' => 'Ils ne sont pas désactivables.',
693
-	'plugin_info_telecharger' => 'à télécharger depuis @url@ et à installer dans @rep@',
694
-	'plugin_info_upgrade_ok' => 'Mise à jour réussie',
695
-	'plugin_librairies_installees' => 'Librairies installées',
696
-	'plugin_necessite_extension_php' => 'Nécessite l’extension PHP @plugin@ en version @version@.',
697
-	'plugin_necessite_extension_php_sans_version' => 'Nécessite l’extension PHP @plugin@',
698
-	'plugin_necessite_lib' => 'Ce plugin nécessite la librairie @lib@',
699
-	'plugin_necessite_php' => 'Nécessite @plugin@ en version @version@.',
700
-	'plugin_necessite_plugin' => 'Nécessite le plugin @plugin@ en version @version@.',
701
-	'plugin_necessite_plugin_sans_version' => 'Nécessite le plugin @plugin@',
702
-	'plugin_necessite_spip' => 'Nécessite SPIP en version @version@ minimum.',
703
-	'plugin_source' => 'source : ',
704
-	'plugin_titre_automatique' => 'Installation automatique',
705
-	'plugin_titre_automatique_ajouter' => 'Ajouter des plugins',
706
-	'plugin_titre_installation' => 'Installation du plugin @plugin@',
707
-	'plugin_titre_modifier' => 'Mes plugins',
708
-	'plugin_utilise_extension_php' => 'L’extension PHP @plugin@ doit être en version @version@.',
709
-	'plugin_utilise_php' => '@plugin@ doit être en version @version@.',
710
-	'plugin_utilise_plugin' => 'Le plugin @plugin@ doit être en version @version@.',
711
-	'plugin_zip_active' => 'Continuez pour l’activer',
712
-	'plugin_zip_adresse' => 'indiquez ci-dessous l’adresse d’un fichier zip de plugin à télécharger, ou encore l’adresse d’une liste de plugins.',
713
-	'plugin_zip_adresse_champ' => 'Adresse du plugin ou de la liste ',
714
-	'plugin_zip_content' => 'Il contient les fichiers suivants (@taille@),<br />prêts à installer dans le répertoire <code>@rep@</code>',
715
-	'plugin_zip_installe_finie' => 'Le fichier @zip@ a été décompacté et installé.',
716
-	'plugin_zip_installe_rep_finie' => 'Le fichier @zip@ a été décompacté et installé dans le répertoire @rep@',
717
-	'plugin_zip_installer' => 'Vous pouvez maintenant l’installer.',
718
-	'plugin_zip_telecharge' => 'Le fichier @zip@ a été téléchargé',
719
-	'plugins_actif_aucun' => 'Aucun plugin activé.',
720
-	'plugins_actif_un' => 'Un plugin activé.',
721
-	'plugins_actifs' => '@count@ plugins activés.',
722
-	'plugins_actifs_liste' => 'Actifs',
723
-	'plugins_compte' => '@count@ plugins',
724
-	'plugins_disponible_un' => 'Un plugin disponible.',
725
-	'plugins_disponibles' => '@count@ plugins disponibles.',
726
-	'plugins_erreur' => 'Erreur dans les plugins : @plugins@',
727
-	'plugins_liste' => 'Liste des plugins',
728
-	'plugins_liste_dist' => 'Plugins verrouillés',
729
-	'plugins_recents' => 'Plugins récents.',
730
-	'plugins_tous_liste' => 'Tous',
731
-	'plugins_vue_hierarchie' => 'Hiérarchie',
732
-	'plugins_vue_liste' => 'Liste',
733
-	'protocole_ldap' => 'Version du protocole :',
658
+    // P
659
+    'page_pas_proxy' => 'Cette page ne doit pas passer par le proxy',
660
+    'pas_de_proxy_pour' => 'Au besoin, indiquez les machines ou domaines pour lesquels ce proxy ne doit pas s’appliquer (par exemple : @exemple@)',
661
+    'phpinfo' => 'Configuration PHP',
662
+    'plugin_charge_paquet' => 'Chargement du paquet @name@',
663
+    'plugin_charger' => 'Télécharger',
664
+    'plugin_erreur_charger' => 'erreur : impossible de charger @zip@',
665
+    'plugin_erreur_droit1' => 'Le répertoire <code>@dest@</code> n’est pas accessible en écriture.',
666
+    'plugin_erreur_droit2' => 'Veuillez vérifier les droits sur ce répertoire (et le créer le cas échéant), ou installer les fichiers par FTP.',
667
+    'plugin_erreur_zip' => 'échec pclzip : erreur @status@',
668
+    'plugin_etat_developpement' => 'en développement',
669
+    'plugin_etat_experimental' => 'expérimental',
670
+    'plugin_etat_stable' => 'stable',
671
+    'plugin_etat_test' => 'en test',
672
+    'plugin_impossible_activer' => 'Impossible d’activer le plugin @plugin@',
673
+    'plugin_info_automatique1' => 'Si vous souhaitez autoriser l’installation automatique des plugins, veuillez :',
674
+    'plugin_info_automatique1_lib' => 'Si vous souhaitez autoriser l’installation automatique de cette librairie, veuillez :',
675
+    'plugin_info_automatique2' => 'créer un répertoire <code>@rep@</code> ;',
676
+    'plugin_info_automatique3' => 'vérifier que le serveur est autorisé à écrire dans ce répertoire.',
677
+    'plugin_info_automatique_creer' => 'à créer à la racine du site.',
678
+    'plugin_info_automatique_exemples' => 'exemples :',
679
+    'plugin_info_automatique_ftp' => 'Vous pouvez installer des plugins, par FTP, dans le répertoire <tt>@rep@</tt>',
680
+    'plugin_info_automatique_lib' => 'Certains plugins demandent aussi à pouvoir télécharger des fichiers dans le répertoire <code>lib/</code>, à créer le cas échéant à la racine du site.',
681
+    'plugin_info_automatique_liste' => 'Vos listes de plugins :',
682
+    'plugin_info_automatique_liste_officielle' => 'les plugins officiels',
683
+    'plugin_info_automatique_liste_update' => 'Mettre à jour les listes',
684
+    'plugin_info_automatique_ou' => 'ou...',
685
+    'plugin_info_automatique_select' => 'Sélectionnez ci-dessous un plugin : SPIP le téléchargera et l’installera dans le répertoire <code>@rep@</code> ; si ce plugin existe déjà, il sera mis à jour.',
686
+    'plugin_info_credit' => 'Crédits',
687
+    'plugin_info_erreur_xml' => 'La déclaration de ce plugin est incorrecte',
688
+    'plugin_info_install_ok' => 'Installation réussie',
689
+    'plugin_info_necessite' => 'Nécessite :',
690
+    'plugin_info_non_compatible_spip' => 'Ce plugin n’est pas compatible avec cette version de SPIP',
691
+    'plugin_info_plugins_dist_1' => 'Les plugins ci-dessous sont chargés et activés dans le répertoire @plugins_dist@.',
692
+    'plugin_info_plugins_dist_2' => 'Ils ne sont pas désactivables.',
693
+    'plugin_info_telecharger' => 'à télécharger depuis @url@ et à installer dans @rep@',
694
+    'plugin_info_upgrade_ok' => 'Mise à jour réussie',
695
+    'plugin_librairies_installees' => 'Librairies installées',
696
+    'plugin_necessite_extension_php' => 'Nécessite l’extension PHP @plugin@ en version @version@.',
697
+    'plugin_necessite_extension_php_sans_version' => 'Nécessite l’extension PHP @plugin@',
698
+    'plugin_necessite_lib' => 'Ce plugin nécessite la librairie @lib@',
699
+    'plugin_necessite_php' => 'Nécessite @plugin@ en version @version@.',
700
+    'plugin_necessite_plugin' => 'Nécessite le plugin @plugin@ en version @version@.',
701
+    'plugin_necessite_plugin_sans_version' => 'Nécessite le plugin @plugin@',
702
+    'plugin_necessite_spip' => 'Nécessite SPIP en version @version@ minimum.',
703
+    'plugin_source' => 'source : ',
704
+    'plugin_titre_automatique' => 'Installation automatique',
705
+    'plugin_titre_automatique_ajouter' => 'Ajouter des plugins',
706
+    'plugin_titre_installation' => 'Installation du plugin @plugin@',
707
+    'plugin_titre_modifier' => 'Mes plugins',
708
+    'plugin_utilise_extension_php' => 'L’extension PHP @plugin@ doit être en version @version@.',
709
+    'plugin_utilise_php' => '@plugin@ doit être en version @version@.',
710
+    'plugin_utilise_plugin' => 'Le plugin @plugin@ doit être en version @version@.',
711
+    'plugin_zip_active' => 'Continuez pour l’activer',
712
+    'plugin_zip_adresse' => 'indiquez ci-dessous l’adresse d’un fichier zip de plugin à télécharger, ou encore l’adresse d’une liste de plugins.',
713
+    'plugin_zip_adresse_champ' => 'Adresse du plugin ou de la liste ',
714
+    'plugin_zip_content' => 'Il contient les fichiers suivants (@taille@),<br />prêts à installer dans le répertoire <code>@rep@</code>',
715
+    'plugin_zip_installe_finie' => 'Le fichier @zip@ a été décompacté et installé.',
716
+    'plugin_zip_installe_rep_finie' => 'Le fichier @zip@ a été décompacté et installé dans le répertoire @rep@',
717
+    'plugin_zip_installer' => 'Vous pouvez maintenant l’installer.',
718
+    'plugin_zip_telecharge' => 'Le fichier @zip@ a été téléchargé',
719
+    'plugins_actif_aucun' => 'Aucun plugin activé.',
720
+    'plugins_actif_un' => 'Un plugin activé.',
721
+    'plugins_actifs' => '@count@ plugins activés.',
722
+    'plugins_actifs_liste' => 'Actifs',
723
+    'plugins_compte' => '@count@ plugins',
724
+    'plugins_disponible_un' => 'Un plugin disponible.',
725
+    'plugins_disponibles' => '@count@ plugins disponibles.',
726
+    'plugins_erreur' => 'Erreur dans les plugins : @plugins@',
727
+    'plugins_liste' => 'Liste des plugins',
728
+    'plugins_liste_dist' => 'Plugins verrouillés',
729
+    'plugins_recents' => 'Plugins récents.',
730
+    'plugins_tous_liste' => 'Tous',
731
+    'plugins_vue_hierarchie' => 'Hiérarchie',
732
+    'plugins_vue_liste' => 'Liste',
733
+    'protocole_ldap' => 'Version du protocole :',
734 734
 
735
-	// Q
736
-	'queue_executer_maintenant' => 'Exécuter maintenant',
737
-	'queue_info_purger' => 'Vous pouvez supprimer toutes les tâches de fond en attente et réinitialiser la liste avec les tâches périodiques',
738
-	'queue_nb_jobs_in_queue' => '@nb@ tâches en attente',
739
-	'queue_next_job_in_nb_sec' => 'Prochaine tâche dans @nb@ s',
740
-	'queue_no_job_in_queue' => 'Aucune tâche en attente',
741
-	'queue_one_job_in_queue' => '1 tâche en attente',
742
-	'queue_priorite_tache' => 'priorité',
743
-	'queue_purger_queue' => 'Réinitialiser la liste des tâches',
744
-	'queue_titre' => 'Tâches de fond',
735
+    // Q
736
+    'queue_executer_maintenant' => 'Exécuter maintenant',
737
+    'queue_info_purger' => 'Vous pouvez supprimer toutes les tâches de fond en attente et réinitialiser la liste avec les tâches périodiques',
738
+    'queue_nb_jobs_in_queue' => '@nb@ tâches en attente',
739
+    'queue_next_job_in_nb_sec' => 'Prochaine tâche dans @nb@ s',
740
+    'queue_no_job_in_queue' => 'Aucune tâche en attente',
741
+    'queue_one_job_in_queue' => '1 tâche en attente',
742
+    'queue_priorite_tache' => 'priorité',
743
+    'queue_purger_queue' => 'Réinitialiser la liste des tâches',
744
+    'queue_titre' => 'Tâches de fond',
745 745
 
746
-	// R
747
-	'repertoire_plugins' => 'Répertoire :',
748
-	'required' => '(obligatoire)',
746
+    // R
747
+    'repertoire_plugins' => 'Répertoire :',
748
+    'required' => '(obligatoire)',
749 749
 
750
-	// S
751
-	'sans_heure' => 'sans heure',
752
-	'statut_admin_restreint' => 'admin restreint',
753
-	'statut_webmestre' => 'webmestre',
750
+    // S
751
+    'sans_heure' => 'sans heure',
752
+    'statut_admin_restreint' => 'admin restreint',
753
+    'statut_webmestre' => 'webmestre',
754 754
 
755
-	// T
756
-	'tache_cron_asap' => 'Tâche CRON @function@ (ASAP)',
757
-	'tache_cron_secondes' => 'Tâche CRON @function@ (toutes les @nb@ s)',
758
-	'taille_cache_image' => 'Les images calculées automatiquement par SPIP (vignettes des documents, titres présentés sous forme graphique, fonctions mathématiques au format TeX...) occupent dans le répertoire @dir@ un total de @taille@.',
759
-	'taille_cache_infinie' => 'Ce site ne prévoit pas de limitation de taille du répertoire du cache.',
760
-	'taille_cache_maxi' => 'SPIP essaie de limiter la taille du répertoire du cache de ce site à environ <b>@octets@</b> de données.',
761
-	'taille_cache_moins_de' => 'La taille du cache est de moins de @octets@.',
762
-	'taille_cache_octets' => 'La taille du cache est actuellement de @octets@ environ.',
763
-	'taille_cache_vide' => 'Le cache est vide.',
764
-	'taille_repertoire_cache' => 'Taille du répertoire cache',
765
-	'text_article_propose_publication' => 'Article proposé pour la publication.',
766
-	'texte_acces_ldap_anonyme_1' => 'Certains serveurs LDAP n’acceptent aucun accès anonyme. Dans ce cas il faut spécifier un identifiant d’accès initial afin de pouvoir ensuite rechercher des informations dans l’annuaire. Dans la plupart des cas néanmoins, les champs suivants pourront être laissés vides.',
767
-	'texte_admin_effacer_01' => 'Cette commande efface <i>tout</i> le contenu de la base de données,
755
+    // T
756
+    'tache_cron_asap' => 'Tâche CRON @function@ (ASAP)',
757
+    'tache_cron_secondes' => 'Tâche CRON @function@ (toutes les @nb@ s)',
758
+    'taille_cache_image' => 'Les images calculées automatiquement par SPIP (vignettes des documents, titres présentés sous forme graphique, fonctions mathématiques au format TeX...) occupent dans le répertoire @dir@ un total de @taille@.',
759
+    'taille_cache_infinie' => 'Ce site ne prévoit pas de limitation de taille du répertoire du cache.',
760
+    'taille_cache_maxi' => 'SPIP essaie de limiter la taille du répertoire du cache de ce site à environ <b>@octets@</b> de données.',
761
+    'taille_cache_moins_de' => 'La taille du cache est de moins de @octets@.',
762
+    'taille_cache_octets' => 'La taille du cache est actuellement de @octets@ environ.',
763
+    'taille_cache_vide' => 'Le cache est vide.',
764
+    'taille_repertoire_cache' => 'Taille du répertoire cache',
765
+    'text_article_propose_publication' => 'Article proposé pour la publication.',
766
+    'texte_acces_ldap_anonyme_1' => 'Certains serveurs LDAP n’acceptent aucun accès anonyme. Dans ce cas il faut spécifier un identifiant d’accès initial afin de pouvoir ensuite rechercher des informations dans l’annuaire. Dans la plupart des cas néanmoins, les champs suivants pourront être laissés vides.',
767
+    'texte_admin_effacer_01' => 'Cette commande efface <i>tout</i> le contenu de la base de données,
768 768
 y compris <i>tous</i> les accès rédacteurs et administrateurs. Après l’avoir exécutée, vous devrez lancer la
769 769
 réinstallation de SPIP pour recréer une nouvelle base ainsi qu’un premier accès administrateur.',
770
-	'texte_adresse_annuaire_1' => '(Si votre annuaire est installé sur la même machine que ce site Web, il s’agit probablement de « localhost ».)',
771
-	'texte_ajout_auteur' => 'L’auteur suivant a été ajouté à l’article :',
772
-	'texte_annuaire_ldap_1' => 'Si vous avez accès à un annuaire (LDAP), vous pouvez l’utiliser pour importer automatiquement des utilisateurs sous SPIP.',
773
-	'texte_article_statut' => 'Cet article est :',
774
-	'texte_article_virtuel' => 'Article virtuel',
775
-	'texte_article_virtuel_reference' => '<b>Article virtuel :</b> article référencé dans votre site SPIP, mais redirigé vers une autre URL. Pour supprimer la redirection, effacez l’URL ci-dessus.',
776
-	'texte_aucun_resultat_auteur' => 'Aucun résultat pour "@cherche_auteur@"',
777
-	'texte_auteur_messagerie' => 'Ce site peut vous indiquer en permanence la liste des rédacteurs connectés, ce qui vous permet d’échanger des messages en direct. Vous pouvez décider de ne pas apparaître dans cette liste (vous êtes « invisible » pour les autres utilisateurs).',
778
-	'texte_auteurs' => 'LES AUTEURS',
779
-	'texte_choix_base_1' => 'Choisissez votre base :',
780
-	'texte_choix_base_2' => 'Le serveur SQL contient plusieurs bases de données.',
781
-	'texte_choix_base_3' => '<b>Sélectionnez</b> ci-après celle qui vous a été attribuée par votre hébergeur :',
782
-	'texte_choix_table_prefix' => 'Préfixe des tables :',
783
-	'texte_compte_element' => '@count@ élément',
784
-	'texte_compte_elements' => '@count@ éléments',
785
-	'texte_conflit_edition_correction' => 'Veuillez contrôler ci-dessous les différences entre les deux versions du texte ; vous pouvez aussi copier vos modifications, puis recommencer.',
786
-	'texte_connexion_mysql' => 'Consultez les informations fournies par votre hébergeur : vous devez y trouver le serveur de base de données qu’il propose et vos identifiants personnels pour vous y connecter.',
787
-	'texte_contenu_article' => '(Contenu de l’article en quelques mots.)',
788
-	'texte_contenu_articles' => 'Selon la maquette adoptée pour votre site, vous pouvez décider
770
+    'texte_adresse_annuaire_1' => '(Si votre annuaire est installé sur la même machine que ce site Web, il s’agit probablement de « localhost ».)',
771
+    'texte_ajout_auteur' => 'L’auteur suivant a été ajouté à l’article :',
772
+    'texte_annuaire_ldap_1' => 'Si vous avez accès à un annuaire (LDAP), vous pouvez l’utiliser pour importer automatiquement des utilisateurs sous SPIP.',
773
+    'texte_article_statut' => 'Cet article est :',
774
+    'texte_article_virtuel' => 'Article virtuel',
775
+    'texte_article_virtuel_reference' => '<b>Article virtuel :</b> article référencé dans votre site SPIP, mais redirigé vers une autre URL. Pour supprimer la redirection, effacez l’URL ci-dessus.',
776
+    'texte_aucun_resultat_auteur' => 'Aucun résultat pour "@cherche_auteur@"',
777
+    'texte_auteur_messagerie' => 'Ce site peut vous indiquer en permanence la liste des rédacteurs connectés, ce qui vous permet d’échanger des messages en direct. Vous pouvez décider de ne pas apparaître dans cette liste (vous êtes « invisible » pour les autres utilisateurs).',
778
+    'texte_auteurs' => 'LES AUTEURS',
779
+    'texte_choix_base_1' => 'Choisissez votre base :',
780
+    'texte_choix_base_2' => 'Le serveur SQL contient plusieurs bases de données.',
781
+    'texte_choix_base_3' => '<b>Sélectionnez</b> ci-après celle qui vous a été attribuée par votre hébergeur :',
782
+    'texte_choix_table_prefix' => 'Préfixe des tables :',
783
+    'texte_compte_element' => '@count@ élément',
784
+    'texte_compte_elements' => '@count@ éléments',
785
+    'texte_conflit_edition_correction' => 'Veuillez contrôler ci-dessous les différences entre les deux versions du texte ; vous pouvez aussi copier vos modifications, puis recommencer.',
786
+    'texte_connexion_mysql' => 'Consultez les informations fournies par votre hébergeur : vous devez y trouver le serveur de base de données qu’il propose et vos identifiants personnels pour vous y connecter.',
787
+    'texte_contenu_article' => '(Contenu de l’article en quelques mots.)',
788
+    'texte_contenu_articles' => 'Selon la maquette adoptée pour votre site, vous pouvez décider
789 789
 		que certains éléments des articles ne sont pas utilisés.
790 790
 		Utilisez la liste ci-dessous pour indiquer quels éléments sont disponibles.',
791
-	'texte_crash_base' => 'Si votre base de données a
791
+    'texte_crash_base' => 'Si votre base de données a
792 792
 			crashé, vous pouvez tenter une réparation
793 793
 			automatique.',
794
-	'texte_creer_rubrique' => 'Avant de pouvoir écrire des articles,<br /> vous devez créer une rubrique.',
795
-	'texte_date_creation_article' => 'DATE DE CRÉATION DE L’ARTICLE :', # on ajoute le ":"
796
-	'texte_date_creation_objet' => 'Date de création :', # on ajoute le ":"
797
-	'texte_date_publication_anterieure' => 'Date de rédaction antérieure :',
798
-	'texte_date_publication_anterieure_nonaffichee' => 'Ne pas afficher de date de rédaction antérieure.',
799
-	'texte_date_publication_article' => 'DATE DE PUBLICATION EN LIGNE :',
800
-	'texte_date_publication_objet' => 'Date de publication en ligne :',
801
-	'texte_definir_comme_traduction_rubrique' => 'Cette rubrique est une traduction de la rubrique numéro :',
802
-	'texte_descriptif_rapide' => 'Descriptif rapide',
803
-	'texte_effacer_base' => 'Effacer la base de données SPIP',
804
-	'texte_effacer_statistiques' => 'Effacer les statistiques',
805
-	'texte_en_cours_validation' => 'Les contenus ci-dessous sont en attente de validation.',
806
-	'texte_enrichir_mise_a_jour' => 'Vous pouvez enrichir la mise en page de votre texte en utilisant des « raccourcis typographiques ».',
807
-	'texte_fichier_authent' => '<b>SPIP doit-il créer les fichiers spéciaux
794
+    'texte_creer_rubrique' => 'Avant de pouvoir écrire des articles,<br /> vous devez créer une rubrique.',
795
+    'texte_date_creation_article' => 'DATE DE CRÉATION DE L’ARTICLE :', # on ajoute le ":"
796
+    'texte_date_creation_objet' => 'Date de création :', # on ajoute le ":"
797
+    'texte_date_publication_anterieure' => 'Date de rédaction antérieure :',
798
+    'texte_date_publication_anterieure_nonaffichee' => 'Ne pas afficher de date de rédaction antérieure.',
799
+    'texte_date_publication_article' => 'DATE DE PUBLICATION EN LIGNE :',
800
+    'texte_date_publication_objet' => 'Date de publication en ligne :',
801
+    'texte_definir_comme_traduction_rubrique' => 'Cette rubrique est une traduction de la rubrique numéro :',
802
+    'texte_descriptif_rapide' => 'Descriptif rapide',
803
+    'texte_effacer_base' => 'Effacer la base de données SPIP',
804
+    'texte_effacer_statistiques' => 'Effacer les statistiques',
805
+    'texte_en_cours_validation' => 'Les contenus ci-dessous sont en attente de validation.',
806
+    'texte_enrichir_mise_a_jour' => 'Vous pouvez enrichir la mise en page de votre texte en utilisant des « raccourcis typographiques ».',
807
+    'texte_fichier_authent' => '<b>SPIP doit-il créer les fichiers spéciaux
808 808
 <tt>.htpasswd</tt> et <tt>.htpasswd-admin</tt> dans le répertoire @dossier@ ?</b>
809 809
 <p>Ces fichiers peuvent vous servir à restreindre l’accès aux auteurs et administrateurs en d’autres endroits de votre site (programme externe de statistiques, par exemple).</p>
810 810
 <p>Si vous n’en avez pas l’utilité, vous pouvez laisser cette option à sa valeur par défaut (pas de création des fichiers).</p>',
811
-	'texte_informations_personnelles_1' => 'Le système va maintenant vous créer un accès personnalisé au site.',
812
-	'texte_informations_personnelles_2' => '(Note : il s’agit d’une réinstallation, si votre accès marche toujours vous pouvez',
813
-	'texte_introductif_article' => '(Texte introductif de l’article.)',
814
-	'texte_jeu_caractere' => 'Il est conseillé d’employer, sur votre site, l’alphabet universel (<tt>utf-8</tt>) : celui-ci permet l’affichage de textes dans toutes les langues, et ne pose plus de problèmes de compatibilité avec les navigateurs modernes.',
815
-	'texte_jeu_caractere_3' => 'Votre site est actuellement installé dans le jeu de caractères :',
816
-	'texte_jeu_caractere_4' => 'Si cela ne correspond pas à la réalité de vos données (suite, par exemple, à une restauration de base de données), ou si <em>vous démarrez ce site</em> et souhaitez partir sur un autre jeu de caractères, veuillez indiquer ce dernier ici :',
817
-	'texte_login_ldap_1' => '(Laisser vide pour un accès anonyme, ou entrer le chemin complet, par exemple « <tt>uid=dupont, ou=users, dc=mon-domaine, dc=com</tt> ».)',
818
-	'texte_login_precaution' => 'Attention ! Ceci est le login sous lequel vous êtes connecté actuellement.
811
+    'texte_informations_personnelles_1' => 'Le système va maintenant vous créer un accès personnalisé au site.',
812
+    'texte_informations_personnelles_2' => '(Note : il s’agit d’une réinstallation, si votre accès marche toujours vous pouvez',
813
+    'texte_introductif_article' => '(Texte introductif de l’article.)',
814
+    'texte_jeu_caractere' => 'Il est conseillé d’employer, sur votre site, l’alphabet universel (<tt>utf-8</tt>) : celui-ci permet l’affichage de textes dans toutes les langues, et ne pose plus de problèmes de compatibilité avec les navigateurs modernes.',
815
+    'texte_jeu_caractere_3' => 'Votre site est actuellement installé dans le jeu de caractères :',
816
+    'texte_jeu_caractere_4' => 'Si cela ne correspond pas à la réalité de vos données (suite, par exemple, à une restauration de base de données), ou si <em>vous démarrez ce site</em> et souhaitez partir sur un autre jeu de caractères, veuillez indiquer ce dernier ici :',
817
+    'texte_login_ldap_1' => '(Laisser vide pour un accès anonyme, ou entrer le chemin complet, par exemple « <tt>uid=dupont, ou=users, dc=mon-domaine, dc=com</tt> ».)',
818
+    'texte_login_precaution' => 'Attention ! Ceci est le login sous lequel vous êtes connecté actuellement.
819 819
 	Utilisez ce formulaire avec précaution...',
820
-	'texte_messagerie_agenda' => 'Une messagerie permet aux rédacteurs du site de communiquer entre eux directement dans l’espace privé du site. Elle est associée à un agenda.',
821
-	'texte_mise_a_niveau_base_1' => 'Vous venez de mettre à jour les fichiers SPIP.
820
+    'texte_messagerie_agenda' => 'Une messagerie permet aux rédacteurs du site de communiquer entre eux directement dans l’espace privé du site. Elle est associée à un agenda.',
821
+    'texte_mise_a_niveau_base_1' => 'Vous venez de mettre à jour les fichiers SPIP.
822 822
 	Il faut maintenant mettre à niveau la base de données
823 823
 	du site.',
824
-	'texte_modifier_article' => 'Modifier l’article :',
825
-	'texte_multilinguisme' => 'Si vous souhaitez gérer des objets en plusieurs langues, avec une navigation complexe, vous pouvez ajouter un menu de sélection de langue sur ces objets, en fonction de l’organisation de votre site.',
826
-	'texte_multilinguisme_trad' => 'Vous pouvez également activer un système de gestion de liens entre les différentes traductions sur certains objets.',
827
-	'texte_non_compresse' => '<i>non compressé</i> (votre serveur ne supportant pas cette fonctionnalité)',
828
-	'texte_nouvelle_version_spip_1' => 'Vous avez installé une nouvelle version de SPIP.',
829
-	'texte_nouvelle_version_spip_2' => 'Cette nouvelle version nécessite une mise à jour plus complète qu’à l’accoutumée. Si vous êtes webmestre du site, veuillez effacer le fichier @connect@ et reprendre l’installation afin de mettre à jour vos paramètres de connexion à la base de données.<p> (NB. : si vous avez oublié vos paramètres de connexion, jetez un œil au fichier @connect@ avant de le supprimer...)</p>',
830
-	'texte_operation_echec' => 'Retournez à la page précédente, sélectionnez une autre base ou créez-en une nouvelle. Vérifiez les informations fournies par votre hébergeur.',
831
-	'texte_plus_trois_car' => 'plus de 3 caractères',
832
-	'texte_plusieurs_articles' => 'Plusieurs auteurs trouvés pour "@cherche_auteur@" :',
833
-	'texte_port_annuaire' => '(La valeur indiquée par défaut convient généralement.)',
834
-	'texte_presente_plugin' => 'Cette page liste les plugins disponibles sur le site. Vous pouvez activer les plugins nécessaires en cochant la case correspondante.',
835
-	'texte_proposer_publication' => 'Lorsque votre article est terminé,<br /> vous pouvez proposer sa publication.',
836
-	'texte_proxy' => 'Dans certains cas (intranet, réseaux protégés), les sites distants (documentation de SPIP, sites syndiqués, etc.) ne sont accessibles qu’à travers un <i>proxy HTTP</i>. Le cas échéant, indiquez ci-dessous son adresse, sous la forme @proxy_en_cours@. En général, vous laisserez cette case vide.',
837
-	'texte_publication_articles_post_dates' => 'Quel comportement SPIP doit-il adopter face aux articles dont la
824
+    'texte_modifier_article' => 'Modifier l’article :',
825
+    'texte_multilinguisme' => 'Si vous souhaitez gérer des objets en plusieurs langues, avec une navigation complexe, vous pouvez ajouter un menu de sélection de langue sur ces objets, en fonction de l’organisation de votre site.',
826
+    'texte_multilinguisme_trad' => 'Vous pouvez également activer un système de gestion de liens entre les différentes traductions sur certains objets.',
827
+    'texte_non_compresse' => '<i>non compressé</i> (votre serveur ne supportant pas cette fonctionnalité)',
828
+    'texte_nouvelle_version_spip_1' => 'Vous avez installé une nouvelle version de SPIP.',
829
+    'texte_nouvelle_version_spip_2' => 'Cette nouvelle version nécessite une mise à jour plus complète qu’à l’accoutumée. Si vous êtes webmestre du site, veuillez effacer le fichier @connect@ et reprendre l’installation afin de mettre à jour vos paramètres de connexion à la base de données.<p> (NB. : si vous avez oublié vos paramètres de connexion, jetez un œil au fichier @connect@ avant de le supprimer...)</p>',
830
+    'texte_operation_echec' => 'Retournez à la page précédente, sélectionnez une autre base ou créez-en une nouvelle. Vérifiez les informations fournies par votre hébergeur.',
831
+    'texte_plus_trois_car' => 'plus de 3 caractères',
832
+    'texte_plusieurs_articles' => 'Plusieurs auteurs trouvés pour "@cherche_auteur@" :',
833
+    'texte_port_annuaire' => '(La valeur indiquée par défaut convient généralement.)',
834
+    'texte_presente_plugin' => 'Cette page liste les plugins disponibles sur le site. Vous pouvez activer les plugins nécessaires en cochant la case correspondante.',
835
+    'texte_proposer_publication' => 'Lorsque votre article est terminé,<br /> vous pouvez proposer sa publication.',
836
+    'texte_proxy' => 'Dans certains cas (intranet, réseaux protégés), les sites distants (documentation de SPIP, sites syndiqués, etc.) ne sont accessibles qu’à travers un <i>proxy HTTP</i>. Le cas échéant, indiquez ci-dessous son adresse, sous la forme @proxy_en_cours@. En général, vous laisserez cette case vide.',
837
+    'texte_publication_articles_post_dates' => 'Quel comportement SPIP doit-il adopter face aux articles dont la
838 838
 		date de publication a été fixée à une
839 839
 		échéance future ?',
840
-	'texte_rappel_selection_champs' => '[N’oubliez pas de sélectionner correctement ce champ.]',
841
-	'texte_recalcul_page' => 'Si vous voulez
840
+    'texte_rappel_selection_champs' => '[N’oubliez pas de sélectionner correctement ce champ.]',
841
+    'texte_recalcul_page' => 'Si vous voulez
842 842
 recalculer une seule page, passez plutôt par l’espace public et utilisez-y le bouton « recalculer ».',
843
-	'texte_recuperer_base' => 'Réparer la base de données',
844
-	'texte_reference_mais_redirige' => 'article référencé dans votre site SPIP, mais redirigé vers une autre URL.',
845
-	'texte_requetes_echouent' => '<b>Lorsque certaines requêtes SQL échouent
843
+    'texte_recuperer_base' => 'Réparer la base de données',
844
+    'texte_reference_mais_redirige' => 'article référencé dans votre site SPIP, mais redirigé vers une autre URL.',
845
+    'texte_requetes_echouent' => '<b>Lorsque certaines requêtes SQL échouent
846 846
   systématiquement et sans raison apparente, il est possible
847 847
   que ce soit à cause de la base de données
848 848
   elle-même.</b><p>
@@ -853,90 +853,90 @@  discard block
 block discarded – undo
853 853
   peut-être des indices de ce qui ne va pas...</p><p>
854 854
   Si le problème persiste, prenez contact avec votre
855 855
   hébergeur.</p>',
856
-	'texte_selection_langue_principale' => 'Vous pouvez sélectionner ci-dessous la « langue principale » du site. Ce choix ne vous oblige - heureusement ! - pas à écrire vos articles dans la langue sélectionnée, mais permet de déterminer :
856
+    'texte_selection_langue_principale' => 'Vous pouvez sélectionner ci-dessous la « langue principale » du site. Ce choix ne vous oblige - heureusement ! - pas à écrire vos articles dans la langue sélectionnée, mais permet de déterminer :
857 857
 	<ul><li> le format par défaut des dates sur le site public ;</li>
858 858
 	<li> la nature du moteur typographique que SPIP doit utiliser pour le rendu des textes ;</li>
859 859
 	<li> la langue utilisée dans les formulaires du site public ;</li>
860 860
 	<li> la langue présentée par défaut dans l’espace privé.</li></ul>',
861
-	'texte_sous_titre' => 'Sous-titre',
862
-	'texte_statistiques_visites' => '(barres foncées :  dimanche / courbe foncée : évolution de la moyenne)',
863
-	'texte_statut_attente_validation' => 'en attente de validation',
864
-	'texte_statut_publies' => 'publiés en ligne',
865
-	'texte_statut_refuses' => 'refusés',
866
-	'texte_suppression_fichiers' => 'Utilisez cette commande afin de supprimer tous les fichiers présents
861
+    'texte_sous_titre' => 'Sous-titre',
862
+    'texte_statistiques_visites' => '(barres foncées :  dimanche / courbe foncée : évolution de la moyenne)',
863
+    'texte_statut_attente_validation' => 'en attente de validation',
864
+    'texte_statut_publies' => 'publiés en ligne',
865
+    'texte_statut_refuses' => 'refusés',
866
+    'texte_suppression_fichiers' => 'Utilisez cette commande afin de supprimer tous les fichiers présents
867 867
 dans le cache SPIP. Cela permet par exemple de forcer un recalcul de toutes les pages si vous
868 868
 avez fait des modifications importantes de graphisme ou de structure du site.',
869
-	'texte_sur_titre' => 'Sur-titre',
870
-	'texte_table_ok' => ' : cette table est OK.',
871
-	'texte_tentative_recuperation' => 'Tentative de réparation',
872
-	'texte_tenter_reparation' => 'Tenter une réparation de la base de données',
873
-	'texte_test_proxy' => 'Pour faire un essai de ce proxy, indiquez ici l’adresse d’un site Web
869
+    'texte_sur_titre' => 'Sur-titre',
870
+    'texte_table_ok' => ' : cette table est OK.',
871
+    'texte_tentative_recuperation' => 'Tentative de réparation',
872
+    'texte_tenter_reparation' => 'Tenter une réparation de la base de données',
873
+    'texte_test_proxy' => 'Pour faire un essai de ce proxy, indiquez ici l’adresse d’un site Web
874 874
 				que vous souhaitez tester.',
875
-	'texte_titre_02' => 'Titre :',
876
-	'texte_titre_obligatoire' => '<b>Titre</b> [Obligatoire]',
877
-	'texte_travail_article' => '@nom_auteur_modif@ a travaillé sur cet article il y a @date_diff@ minutes',
878
-	'texte_travail_collaboratif' => 'S’il est fréquent que plusieurs rédacteurs
875
+    'texte_titre_02' => 'Titre :',
876
+    'texte_titre_obligatoire' => '<b>Titre</b> [Obligatoire]',
877
+    'texte_travail_article' => '@nom_auteur_modif@ a travaillé sur cet article il y a @date_diff@ minutes',
878
+    'texte_travail_collaboratif' => 'S’il est fréquent que plusieurs rédacteurs
879 879
 		travaillent sur le même article, le système
880 880
 		peut afficher les articles récemment « ouverts »
881 881
 		afin d’éviter les modifications simultanées.
882 882
 		Cette option est désactivée par défaut
883 883
 		afin d’éviter d’afficher des messages d’avertissement
884 884
 		intempestifs.',
885
-	'texte_vide' => 'vide',
886
-	'texte_vider_cache' => 'Vider le cache',
887
-	'titre_admin_tech' => 'Maintenance technique',
888
-	'titre_admin_vider' => 'Maintenance technique',
889
-	'titre_ajouter_un_auteur' => 'Ajouter un auteur',
890
-	'titre_ajouter_un_mot' => 'Ajouter un mot-clé',
891
-	'titre_cadre_afficher_article' => 'Afficher les articles',
892
-	'titre_cadre_afficher_traductions' => 'Afficher l’état des traductions pour les langues suivantes :',
893
-	'titre_cadre_ajouter_auteur' => 'AJOUTER UN AUTEUR :',
894
-	'titre_cadre_interieur_rubrique' => 'À l’intérieur de la rubrique',
895
-	'titre_cadre_numero_auteur' => 'AUTEUR NUMÉRO',
896
-	'titre_cadre_numero_objet' => '@objet@ NUMÉRO :',
897
-	'titre_cadre_signature_obligatoire' => '<b>Signature</b> [Obligatoire]<br />',
898
-	'titre_config_contenu_notifications' => 'Notifications',
899
-	'titre_config_contenu_prive' => 'Dans l’espace privé',
900
-	'titre_config_contenu_public' => 'Sur le site public',
901
-	'titre_config_fonctions' => 'Configuration du site',
902
-	'titre_config_langage' => 'Configurer la langue',
903
-	'titre_configuration' => 'Configuration du site',
904
-	'titre_configurer_preferences' => 'Configurer vos préférences',
905
-	'titre_configurer_preferences_menus' => 'Configurer vos préférences de menus',
906
-	'titre_conflit_edition' => 'Conflit lors de l’édition',
907
-	'titre_connexion_ldap' => 'Options : <b>Votre connexion LDAP</b>',
908
-	'titre_groupe_mots' => 'GROUPE DE MOTS :',
909
-	'titre_identite_site' => 'Identité du site',
910
-	'titre_langue_article' => 'Langue de l’article',
911
-	'titre_langue_rubrique' => 'Langue de la rubrique',
912
-	'titre_langue_trad_article' => 'LANGUE ET TRADUCTIONS DE L’ARTICLE',
913
-	'titre_les_articles' => 'LES ARTICLES',
914
-	'titre_messagerie_agenda' => 'Messagerie et agenda',
915
-	'titre_naviguer_dans_le_site' => 'Naviguer dans le site...',
916
-	'titre_nouvelle_rubrique' => 'Nouvelle rubrique',
917
-	'titre_numero_rubrique' => 'RUBRIQUE NUMÉRO :',
918
-	'titre_page_articles_edit' => 'Modifier : @titre@',
919
-	'titre_page_articles_page' => 'Les articles',
920
-	'titre_page_articles_tous' => 'Tout le site',
921
-	'titre_page_calendrier' => 'Calendrier @nom_mois@ @annee@',
922
-	'titre_page_config_contenu' => 'Configuration du site',
923
-	'titre_page_delete_all' => 'suppression totale et irréversible',
924
-	'titre_page_recherche' => 'Résultats de la recherche @recherche@',
925
-	'titre_page_statistiques_referers' => 'Statistiques (liens entrants)',
926
-	'titre_page_upgrade' => 'Mise à niveau de SPIP',
927
-	'titre_preference_menus_favoris' => 'Menus favoris',
928
-	'titre_publication_articles_post_dates' => 'Publication des articles post-datés',
929
-	'titre_reparation' => 'Réparation',
930
-	'titre_suivi_petition' => 'Suivi des pétitions',
931
-	'tls_ldap' => 'Transport Layer Security :',
932
-	'trad_article_traduction' => 'Toutes les versions de cet article :',
933
-	'trad_delier' => 'Ne plus lier à ces traductions',
934
-	'trad_lier' => 'Cet article est une traduction de l’article numéro :',
935
-	'trad_new' => 'Écrire une nouvelle traduction',
885
+    'texte_vide' => 'vide',
886
+    'texte_vider_cache' => 'Vider le cache',
887
+    'titre_admin_tech' => 'Maintenance technique',
888
+    'titre_admin_vider' => 'Maintenance technique',
889
+    'titre_ajouter_un_auteur' => 'Ajouter un auteur',
890
+    'titre_ajouter_un_mot' => 'Ajouter un mot-clé',
891
+    'titre_cadre_afficher_article' => 'Afficher les articles',
892
+    'titre_cadre_afficher_traductions' => 'Afficher l’état des traductions pour les langues suivantes :',
893
+    'titre_cadre_ajouter_auteur' => 'AJOUTER UN AUTEUR :',
894
+    'titre_cadre_interieur_rubrique' => 'À l’intérieur de la rubrique',
895
+    'titre_cadre_numero_auteur' => 'AUTEUR NUMÉRO',
896
+    'titre_cadre_numero_objet' => '@objet@ NUMÉRO :',
897
+    'titre_cadre_signature_obligatoire' => '<b>Signature</b> [Obligatoire]<br />',
898
+    'titre_config_contenu_notifications' => 'Notifications',
899
+    'titre_config_contenu_prive' => 'Dans l’espace privé',
900
+    'titre_config_contenu_public' => 'Sur le site public',
901
+    'titre_config_fonctions' => 'Configuration du site',
902
+    'titre_config_langage' => 'Configurer la langue',
903
+    'titre_configuration' => 'Configuration du site',
904
+    'titre_configurer_preferences' => 'Configurer vos préférences',
905
+    'titre_configurer_preferences_menus' => 'Configurer vos préférences de menus',
906
+    'titre_conflit_edition' => 'Conflit lors de l’édition',
907
+    'titre_connexion_ldap' => 'Options : <b>Votre connexion LDAP</b>',
908
+    'titre_groupe_mots' => 'GROUPE DE MOTS :',
909
+    'titre_identite_site' => 'Identité du site',
910
+    'titre_langue_article' => 'Langue de l’article',
911
+    'titre_langue_rubrique' => 'Langue de la rubrique',
912
+    'titre_langue_trad_article' => 'LANGUE ET TRADUCTIONS DE L’ARTICLE',
913
+    'titre_les_articles' => 'LES ARTICLES',
914
+    'titre_messagerie_agenda' => 'Messagerie et agenda',
915
+    'titre_naviguer_dans_le_site' => 'Naviguer dans le site...',
916
+    'titre_nouvelle_rubrique' => 'Nouvelle rubrique',
917
+    'titre_numero_rubrique' => 'RUBRIQUE NUMÉRO :',
918
+    'titre_page_articles_edit' => 'Modifier : @titre@',
919
+    'titre_page_articles_page' => 'Les articles',
920
+    'titre_page_articles_tous' => 'Tout le site',
921
+    'titre_page_calendrier' => 'Calendrier @nom_mois@ @annee@',
922
+    'titre_page_config_contenu' => 'Configuration du site',
923
+    'titre_page_delete_all' => 'suppression totale et irréversible',
924
+    'titre_page_recherche' => 'Résultats de la recherche @recherche@',
925
+    'titre_page_statistiques_referers' => 'Statistiques (liens entrants)',
926
+    'titre_page_upgrade' => 'Mise à niveau de SPIP',
927
+    'titre_preference_menus_favoris' => 'Menus favoris',
928
+    'titre_publication_articles_post_dates' => 'Publication des articles post-datés',
929
+    'titre_reparation' => 'Réparation',
930
+    'titre_suivi_petition' => 'Suivi des pétitions',
931
+    'tls_ldap' => 'Transport Layer Security :',
932
+    'trad_article_traduction' => 'Toutes les versions de cet article :',
933
+    'trad_delier' => 'Ne plus lier à ces traductions',
934
+    'trad_lier' => 'Cet article est une traduction de l’article numéro :',
935
+    'trad_new' => 'Écrire une nouvelle traduction',
936 936
 
937
-	// U
938
-	'utf8_convert_erreur_orig' => 'Erreur : le jeu de caractères @charset@ n’est pas supporté.',
937
+    // U
938
+    'utf8_convert_erreur_orig' => 'Erreur : le jeu de caractères @charset@ n’est pas supporté.',
939 939
 
940
-	// V
941
-	'version' => 'Version :'
940
+    // V
941
+    'version' => 'Version :'
942 942
 );
Please login to merge, or discard this patch.
ecrire/auth/spip.php 3 patches
Indentation   +376 added lines, -376 removed lines patch added patch discarded remove patch
@@ -19,7 +19,7 @@  discard block
 block discarded – undo
19 19
 use Spip\Chiffrer\SpipCles;
20 20
 
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 /**
@@ -34,138 +34,138 @@  discard block
 block discarded – undo
34 34
  */
35 35
 function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) {
36 36
 
37
-	// retrouver le login
38
-	$login = auth_spip_retrouver_login($login);
39
-	// login inconnu, n'allons pas plus loin
40
-	if (!$login) {
41
-		return [];
42
-	}
43
-
44
-	$md5pass = '';
45
-	$shapass = $shanext = '';
46
-	$auteur_peut_sauver_cles = false;
47
-
48
-	if ($pass) {
49
-		$row = sql_fetsel(
50
-			'*',
51
-			'spip_auteurs',
52
-			'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
53
-			'',
54
-			'',
55
-			'',
56
-			'',
57
-			$serveur
58
-		);
59
-
60
-		// lever un flag si cet auteur peut sauver les cles
61
-		if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) {
62
-			$auteur_peut_sauver_cles = true;
63
-		}
64
-	}
65
-
66
-	// login inexistant ou mot de passe vide
67
-	if (!$pass or !$row) {
68
-		return [];
69
-	}
70
-
71
-	include_spip('inc/chiffrer');
72
-	$cles = SpipCles::instance();
73
-	$secret = $cles->getSecretAuth();
74
-
75
-	switch (strlen($row['pass'])) {
76
-		case 32:
77
-			// tres anciens mots de passe encodes en md5(alea.pass)
78
-			$md5pass = md5($row['alea_actuel'] . $pass);
79
-			if ($row['pass'] !== $md5pass) {
80
-				unset($row);
81
-			}
82
-			break;
83
-		case 64:
84
-			// anciens mots de passe encodes en sha256(alea.pass)
85
-			include_spip('auth/sha256.inc');
86
-			$shapass = spip_sha256($row['alea_actuel'] . $pass);
87
-			if ($row['pass'] !== $shapass) {
88
-				unset($row);
89
-			}
90
-			break;
91
-
92
-		case 60:
93
-		case 98:
94
-		default:
95
-			// doit-on restaurer un backup des cles ?
96
-			if (
97
-				!$secret
98
-				and $auteur_peut_sauver_cles
99
-				and !empty($row['backup_cles'])
100
-			) {
101
-				if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
102
-					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
103
-					$cles->save();
104
-				}
105
-				else {
106
-					spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
107
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
108
-				}
109
-			}
110
-
111
-			if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) {
112
-				unset($row);
113
-			}
114
-			break;
115
-	}
116
-
117
-	// Migration depuis ancienne version : si on a pas encore de cle
118
-	// ET si c'est le login d'un auteur qui peut sauver la cle
119
-	// créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php)
120
-	// si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre
121
-	if (!$secret and $auteur_peut_sauver_cles) {
122
-		if (auth_spip_initialiser_secret()) {
123
-			$secret = $cles->getSecretAuth();
124
-		}
125
-	}
126
-
127
-	// login/mot de passe incorrect
128
-	if (empty($row)) {
129
-		return [];
130
-	}
131
-
132
-	// fait tourner le codage du pass dans la base
133
-	// sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
134
-	if (!$phpauth and $secret) {
135
-		include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess
136
-		$pass_hash_next = Password::hacher($pass, $secret);
137
-		if ($pass_hash_next) {
138
-			$set = [
139
-				'alea_actuel' => 'alea_futur', // @deprecated 4.1
140
-				'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1
141
-				'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
142
-			];
143
-			// a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre)
144
-			if ($auteur_peut_sauver_cles) {
145
-				$set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text');
146
-			}
147
-
148
-			@sql_update(
149
-				'spip_auteurs',
150
-				$set,
151
-				'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote(
152
-					$row['pass'],
153
-					$serveur,
154
-					'text'
155
-				),
156
-				[],
157
-				$serveur
158
-			);
159
-		}
160
-
161
-		// En profiter pour verifier la securite de tmp/
162
-		// Si elle ne fonctionne pas a l'installation, prevenir
163
-		if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) {
164
-			return false;
165
-		}
166
-	}
167
-
168
-	return $row;
37
+    // retrouver le login
38
+    $login = auth_spip_retrouver_login($login);
39
+    // login inconnu, n'allons pas plus loin
40
+    if (!$login) {
41
+        return [];
42
+    }
43
+
44
+    $md5pass = '';
45
+    $shapass = $shanext = '';
46
+    $auteur_peut_sauver_cles = false;
47
+
48
+    if ($pass) {
49
+        $row = sql_fetsel(
50
+            '*',
51
+            'spip_auteurs',
52
+            'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
53
+            '',
54
+            '',
55
+            '',
56
+            '',
57
+            $serveur
58
+        );
59
+
60
+        // lever un flag si cet auteur peut sauver les cles
61
+        if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) {
62
+            $auteur_peut_sauver_cles = true;
63
+        }
64
+    }
65
+
66
+    // login inexistant ou mot de passe vide
67
+    if (!$pass or !$row) {
68
+        return [];
69
+    }
70
+
71
+    include_spip('inc/chiffrer');
72
+    $cles = SpipCles::instance();
73
+    $secret = $cles->getSecretAuth();
74
+
75
+    switch (strlen($row['pass'])) {
76
+        case 32:
77
+            // tres anciens mots de passe encodes en md5(alea.pass)
78
+            $md5pass = md5($row['alea_actuel'] . $pass);
79
+            if ($row['pass'] !== $md5pass) {
80
+                unset($row);
81
+            }
82
+            break;
83
+        case 64:
84
+            // anciens mots de passe encodes en sha256(alea.pass)
85
+            include_spip('auth/sha256.inc');
86
+            $shapass = spip_sha256($row['alea_actuel'] . $pass);
87
+            if ($row['pass'] !== $shapass) {
88
+                unset($row);
89
+            }
90
+            break;
91
+
92
+        case 60:
93
+        case 98:
94
+        default:
95
+            // doit-on restaurer un backup des cles ?
96
+            if (
97
+                !$secret
98
+                and $auteur_peut_sauver_cles
99
+                and !empty($row['backup_cles'])
100
+            ) {
101
+                if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
102
+                    spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
103
+                    $cles->save();
104
+                }
105
+                else {
106
+                    spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
107
+                    sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
108
+                }
109
+            }
110
+
111
+            if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) {
112
+                unset($row);
113
+            }
114
+            break;
115
+    }
116
+
117
+    // Migration depuis ancienne version : si on a pas encore de cle
118
+    // ET si c'est le login d'un auteur qui peut sauver la cle
119
+    // créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php)
120
+    // si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre
121
+    if (!$secret and $auteur_peut_sauver_cles) {
122
+        if (auth_spip_initialiser_secret()) {
123
+            $secret = $cles->getSecretAuth();
124
+        }
125
+    }
126
+
127
+    // login/mot de passe incorrect
128
+    if (empty($row)) {
129
+        return [];
130
+    }
131
+
132
+    // fait tourner le codage du pass dans la base
133
+    // sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
134
+    if (!$phpauth and $secret) {
135
+        include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess
136
+        $pass_hash_next = Password::hacher($pass, $secret);
137
+        if ($pass_hash_next) {
138
+            $set = [
139
+                'alea_actuel' => 'alea_futur', // @deprecated 4.1
140
+                'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1
141
+                'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
142
+            ];
143
+            // a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre)
144
+            if ($auteur_peut_sauver_cles) {
145
+                $set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text');
146
+            }
147
+
148
+            @sql_update(
149
+                'spip_auteurs',
150
+                $set,
151
+                'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote(
152
+                    $row['pass'],
153
+                    $serveur,
154
+                    'text'
155
+                ),
156
+                [],
157
+                $serveur
158
+            );
159
+        }
160
+
161
+        // En profiter pour verifier la securite de tmp/
162
+        // Si elle ne fonctionne pas a l'installation, prevenir
163
+        if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) {
164
+            return false;
165
+        }
166
+    }
167
+
168
+    return $row;
169 169
 }
170 170
 
171 171
 /**
@@ -180,33 +180,33 @@  discard block
 block discarded – undo
180 180
  * @return bool
181 181
  */
182 182
 function auth_spip_initialiser_secret(bool $force = false): bool {
183
-	include_spip('inc/chiffrer');
184
-	$cles = SpipCles::instance();
185
-	$secret = $cles->getSecretAuth();
186
-
187
-	// on ne fait rien si on a un secret dispo
188
-	if ($secret) {
189
-		return false;
190
-	}
191
-
192
-	// si force, on ne verifie pas la presence d'un backup chez un webmestre
193
-	if ($force) {
194
-		spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
195
-		$secret = $cles->getSecretAuth(true);
196
-		return true;
197
-	}
198
-
199
-	$has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
200
-	$has_backup = array_column($has_backup, 'id_auteur');
201
-	if (empty($has_backup)) {
202
-		spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE);
203
-		$secret = $cles->getSecretAuth(true);
204
-		return true;
205
-	}
206
-	else {
207
-		spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
208
-		return false;
209
-	}
183
+    include_spip('inc/chiffrer');
184
+    $cles = SpipCles::instance();
185
+    $secret = $cles->getSecretAuth();
186
+
187
+    // on ne fait rien si on a un secret dispo
188
+    if ($secret) {
189
+        return false;
190
+    }
191
+
192
+    // si force, on ne verifie pas la presence d'un backup chez un webmestre
193
+    if ($force) {
194
+        spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
195
+        $secret = $cles->getSecretAuth(true);
196
+        return true;
197
+    }
198
+
199
+    $has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
200
+    $has_backup = array_column($has_backup, 'id_auteur');
201
+    if (empty($has_backup)) {
202
+        spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE);
203
+        $secret = $cles->getSecretAuth(true);
204
+        return true;
205
+    }
206
+    else {
207
+        spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
208
+        return false;
209
+    }
210 210
 }
211 211
 
212 212
 /**
@@ -216,19 +216,19 @@  discard block
 block discarded – undo
216 216
  * @return array
217 217
  */
218 218
 function auth_spip_formulaire_login($flux) {
219
-	// javascript qui gere la securite du login en evitant de faire circuler le pass en clair
220
-	$js = file_get_contents(find_in_path('prive/javascript/login.js'));
221
-	$flux['data'] .=
222
-		  '<script type="text/javascript">/*<![CDATA[*/'
223
-		. "$js\n"
224
-		. "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
225
-		. "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
226
-		. "'informe_auteur_en_cours':false,"
227
-		. "'attente_informe':0};"
228
-		. "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
229
-		. '/*]]>*/</script>';
230
-
231
-	return $flux;
219
+    // javascript qui gere la securite du login en evitant de faire circuler le pass en clair
220
+    $js = file_get_contents(find_in_path('prive/javascript/login.js'));
221
+    $flux['data'] .=
222
+            '<script type="text/javascript">/*<![CDATA[*/'
223
+        . "$js\n"
224
+        . "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
225
+        . "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
226
+        . "'informe_auteur_en_cours':false,"
227
+        . "'attente_informe':0};"
228
+        . "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
229
+        . '/*]]>*/</script>';
230
+
231
+    return $flux;
232 232
 }
233 233
 
234 234
 
@@ -240,11 +240,11 @@  discard block
 block discarded – undo
240 240
  *   toujours true pour un auteur cree dans SPIP
241 241
  */
242 242
 function auth_spip_autoriser_modifier_login(string $serveur = ''): bool {
243
-	// les fonctions d'ecriture sur base distante sont encore incompletes
244
-	if (strlen($serveur)) {
245
-		return false;
246
-	}
247
-	return true;
243
+    // les fonctions d'ecriture sur base distante sont encore incompletes
244
+    if (strlen($serveur)) {
245
+        return false;
246
+    }
247
+    return true;
248 248
 }
249 249
 
250 250
 /**
@@ -258,25 +258,25 @@  discard block
 block discarded – undo
258 258
  *  message d'erreur si login non valide, chaine vide sinon
259 259
  */
260 260
 function auth_spip_verifier_login($new_login, $id_auteur = 0, $serveur = '') {
261
-	// login et mot de passe
262
-	if (strlen($new_login)) {
263
-		if (strlen($new_login) < _LOGIN_TROP_COURT) {
264
-			return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]);
265
-		} else {
266
-			$n = sql_countsel(
267
-				'spip_auteurs',
268
-				'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'",
269
-				'',
270
-				'',
271
-				$serveur
272
-			);
273
-			if ($n) {
274
-				return _T('info_login_existant');
275
-			}
276
-		}
277
-	}
278
-
279
-	return '';
261
+    // login et mot de passe
262
+    if (strlen($new_login)) {
263
+        if (strlen($new_login) < _LOGIN_TROP_COURT) {
264
+            return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]);
265
+        } else {
266
+            $n = sql_countsel(
267
+                'spip_auteurs',
268
+                'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'",
269
+                '',
270
+                '',
271
+                $serveur
272
+            );
273
+            if ($n) {
274
+                return _T('info_login_existant');
275
+            }
276
+        }
277
+    }
278
+
279
+    return '';
280 280
 }
281 281
 
282 282
 /**
@@ -288,41 +288,41 @@  discard block
 block discarded – undo
288 288
  * @return bool
289 289
  */
290 290
 function auth_spip_modifier_login($new_login, $id_auteur, $serveur = '') {
291
-	if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') {
292
-		return false;
293
-	}
294
-	if (
295
-		!$id_auteur = intval($id_auteur)
296
-		or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
297
-	) {
298
-		return false;
299
-	}
300
-	if ($new_login == $auteur['login']) {
301
-		return true;
302
-	} // on a rien fait mais c'est bon !
303
-
304
-	include_spip('action/editer_auteur');
305
-
306
-	// vider le login des auteurs a la poubelle qui avaient ce meme login
307
-	if (strlen($new_login)) {
308
-		$anciens = sql_allfetsel(
309
-			'id_auteur',
310
-			'spip_auteurs',
311
-			'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
312
-			'',
313
-			'',
314
-			'',
315
-			'',
316
-			$serveur
317
-		);
318
-		while ($row = array_pop($anciens)) {
319
-			auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur
320
-		}
321
-	}
322
-
323
-	auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur
324
-
325
-	return true;
291
+    if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') {
292
+        return false;
293
+    }
294
+    if (
295
+        !$id_auteur = intval($id_auteur)
296
+        or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
297
+    ) {
298
+        return false;
299
+    }
300
+    if ($new_login == $auteur['login']) {
301
+        return true;
302
+    } // on a rien fait mais c'est bon !
303
+
304
+    include_spip('action/editer_auteur');
305
+
306
+    // vider le login des auteurs a la poubelle qui avaient ce meme login
307
+    if (strlen($new_login)) {
308
+        $anciens = sql_allfetsel(
309
+            'id_auteur',
310
+            'spip_auteurs',
311
+            'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
312
+            '',
313
+            '',
314
+            '',
315
+            '',
316
+            $serveur
317
+        );
318
+        while ($row = array_pop($anciens)) {
319
+            auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur
320
+        }
321
+    }
322
+
323
+    auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur
324
+
325
+    return true;
326 326
 }
327 327
 
328 328
 /**
@@ -334,44 +334,44 @@  discard block
 block discarded – undo
334 334
  * @return string
335 335
  */
336 336
 function auth_spip_retrouver_login($login, $serveur = '') {
337
-	if (!strlen($login)) {
338
-		return null;
339
-	} // pas la peine de requeter
340
-	$l = sql_quote($login, $serveur, 'text');
341
-	if (
342
-		$r = sql_getfetsel(
343
-			'login',
344
-			'spip_auteurs',
345
-			"statut<>'5poubelle'" .
346
-			' AND (length(pass)>0)' .
347
-			" AND (login=$l)",
348
-			'',
349
-			'',
350
-			'',
351
-			'',
352
-			$serveur
353
-		)
354
-	) {
355
-		return $r;
356
-	}
357
-	// Si pas d'auteur avec ce login
358
-	// regarder s'il a saisi son nom ou son mail.
359
-	// Ne pas fusionner avec la requete precedente
360
-	// car un nom peut etre homonyme d'un autre login
361
-	else {
362
-		return sql_getfetsel(
363
-			'login',
364
-			'spip_auteurs',
365
-			"statut<>'5poubelle'" .
366
-			' AND (length(pass)>0)' .
367
-			" AND (login<>'' AND (nom=$l OR email=$l))",
368
-			'',
369
-			'',
370
-			'',
371
-			'',
372
-			$serveur
373
-		);
374
-	}
337
+    if (!strlen($login)) {
338
+        return null;
339
+    } // pas la peine de requeter
340
+    $l = sql_quote($login, $serveur, 'text');
341
+    if (
342
+        $r = sql_getfetsel(
343
+            'login',
344
+            'spip_auteurs',
345
+            "statut<>'5poubelle'" .
346
+            ' AND (length(pass)>0)' .
347
+            " AND (login=$l)",
348
+            '',
349
+            '',
350
+            '',
351
+            '',
352
+            $serveur
353
+        )
354
+    ) {
355
+        return $r;
356
+    }
357
+    // Si pas d'auteur avec ce login
358
+    // regarder s'il a saisi son nom ou son mail.
359
+    // Ne pas fusionner avec la requete precedente
360
+    // car un nom peut etre homonyme d'un autre login
361
+    else {
362
+        return sql_getfetsel(
363
+            'login',
364
+            'spip_auteurs',
365
+            "statut<>'5poubelle'" .
366
+            ' AND (length(pass)>0)' .
367
+            " AND (login<>'' AND (nom=$l OR email=$l))",
368
+            '',
369
+            '',
370
+            '',
371
+            '',
372
+            $serveur
373
+        );
374
+    }
375 375
 }
376 376
 
377 377
 /**
@@ -382,11 +382,11 @@  discard block
 block discarded – undo
382 382
  *  toujours true pour un auteur cree dans SPIP
383 383
  */
384 384
 function auth_spip_autoriser_modifier_pass(string $serveur = ''): bool {
385
-	// les fonctions d'ecriture sur base distante sont encore incompletes
386
-	if (strlen($serveur)) {
387
-		return false;
388
-	}
389
-	return true;
385
+    // les fonctions d'ecriture sur base distante sont encore incompletes
386
+    if (strlen($serveur)) {
387
+        return false;
388
+    }
389
+    return true;
390 390
 }
391 391
 
392 392
 
@@ -407,12 +407,12 @@  discard block
 block discarded – undo
407 407
  *  message d'erreur si login non valide, chaine vide sinon
408 408
  */
409 409
 function auth_spip_verifier_pass($login, $new_pass, $id_auteur = 0, $serveur = '') {
410
-	// login et mot de passe
411
-	if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
412
-		return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]);
413
-	}
410
+    // login et mot de passe
411
+    if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
412
+        return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]);
413
+    }
414 414
 
415
-	return '';
415
+    return '';
416 416
 }
417 417
 
418 418
 /**
@@ -426,48 +426,48 @@  discard block
 block discarded – undo
426 426
  * @return bool
427 427
  */
428 428
 function auth_spip_modifier_pass($login, $new_pass, $id_auteur, $serveur = '') {
429
-	if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
430
-		return false;
431
-	}
432
-
433
-	if (
434
-		!$id_auteur = intval($id_auteur)
435
-		or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
436
-	) {
437
-		return false;
438
-	}
439
-
440
-	include_spip('inc/chiffrer');
441
-	$cles = SpipCles::instance();
442
-	$secret = $cles->getSecretAuth();
443
-	if (!$secret) {
444
-		if (auth_spip_initialiser_secret()) {
445
-			$secret = $cles->getSecretAuth();
446
-		}
447
-		else {
448
-			return false;
449
-		}
450
-	}
451
-
452
-
453
-	include_spip('inc/acces');
454
-	$set = [
455
-		'pass' => Password::hacher($new_pass, $secret),
456
-		'htpass' => generer_htpass($new_pass),
457
-		'alea_actuel' => creer_uniqid(), // @deprecated 4.1
458
-		'alea_futur' => creer_uniqid(), // @deprecated 4.1
459
-		'low_sec' => '',
460
-	];
461
-
462
-	// si c'est un webmestre, on met a jour son backup des cles
463
-	if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') {
464
-		$set['backup_cles'] = $cles->backup($new_pass);
465
-	}
466
-
467
-	include_spip('action/editer_auteur');
468
-	auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur
469
-
470
-	return true; // on a bien modifie le pass
429
+    if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
430
+        return false;
431
+    }
432
+
433
+    if (
434
+        !$id_auteur = intval($id_auteur)
435
+        or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
436
+    ) {
437
+        return false;
438
+    }
439
+
440
+    include_spip('inc/chiffrer');
441
+    $cles = SpipCles::instance();
442
+    $secret = $cles->getSecretAuth();
443
+    if (!$secret) {
444
+        if (auth_spip_initialiser_secret()) {
445
+            $secret = $cles->getSecretAuth();
446
+        }
447
+        else {
448
+            return false;
449
+        }
450
+    }
451
+
452
+
453
+    include_spip('inc/acces');
454
+    $set = [
455
+        'pass' => Password::hacher($new_pass, $secret),
456
+        'htpass' => generer_htpass($new_pass),
457
+        'alea_actuel' => creer_uniqid(), // @deprecated 4.1
458
+        'alea_futur' => creer_uniqid(), // @deprecated 4.1
459
+        'low_sec' => '',
460
+    ];
461
+
462
+    // si c'est un webmestre, on met a jour son backup des cles
463
+    if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') {
464
+        $set['backup_cles'] = $cles->backup($new_pass);
465
+    }
466
+
467
+    include_spip('action/editer_auteur');
468
+    auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur
469
+
470
+    return true; // on a bien modifie le pass
471 471
 }
472 472
 
473 473
 /**
@@ -481,58 +481,58 @@  discard block
 block discarded – undo
481 481
  * @return void
482 482
  */
483 483
 function auth_spip_synchroniser_distant($id_auteur, $champs, $options = [], string $serveur = ''): void {
484
-	// ne rien faire pour une base distante : on ne sait pas regenerer les htaccess
485
-	if (strlen($serveur)) {
486
-		return;
487
-	}
488
-	// si un login, pass ou statut a ete modifie
489
-	// regenerer les fichier htpass
490
-	if (
491
-		isset($champs['login'])
492
-		or isset($champs['pass'])
493
-		or isset($champs['statut'])
494
-		or (isset($options['all']) and $options['all'])
495
-	) {
496
-		$htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
497
-		$htpasswd = _DIR_TMP . _AUTH_USER_FILE;
498
-
499
-		// Cette variable de configuration peut etre posee par un plugin
500
-		// par exemple acces_restreint ;
501
-		// si .htaccess existe, outrepasser spip_meta
502
-		if (
503
-			(!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui'))
504
-			and !@file_exists($htaccess)
505
-		) {
506
-			spip_unlink($htpasswd);
507
-			spip_unlink($htpasswd . '-admin');
508
-
509
-			return;
510
-		}
511
-
512
-		# remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
513
-		# de devenir redacteur le cas echeant (auth http)... a nettoyer
514
-		// attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
515
-
516
-		$p1 = ''; // login:htpass pour tous
517
-		$p2 = ''; // login:htpass pour les admins
518
-		$s = sql_select(
519
-			'login, htpass, statut',
520
-			'spip_auteurs',
521
-			sql_in('statut', ['1comite', '0minirezo', 'nouveau'])
522
-		);
523
-		while ($t = sql_fetch($s)) {
524
-			if (strlen($t['login']) and strlen($t['htpass'])) {
525
-				$p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
526
-				if ($t['statut'] == '0minirezo') {
527
-					$p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
528
-				}
529
-			}
530
-		}
531
-		sql_free($s);
532
-		if ($p1) {
533
-			ecrire_fichier($htpasswd, $p1);
534
-			ecrire_fichier($htpasswd . '-admin', $p2);
535
-			spip_log("Ecriture de $htpasswd et $htpasswd-admin");
536
-		}
537
-	}
484
+    // ne rien faire pour une base distante : on ne sait pas regenerer les htaccess
485
+    if (strlen($serveur)) {
486
+        return;
487
+    }
488
+    // si un login, pass ou statut a ete modifie
489
+    // regenerer les fichier htpass
490
+    if (
491
+        isset($champs['login'])
492
+        or isset($champs['pass'])
493
+        or isset($champs['statut'])
494
+        or (isset($options['all']) and $options['all'])
495
+    ) {
496
+        $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
497
+        $htpasswd = _DIR_TMP . _AUTH_USER_FILE;
498
+
499
+        // Cette variable de configuration peut etre posee par un plugin
500
+        // par exemple acces_restreint ;
501
+        // si .htaccess existe, outrepasser spip_meta
502
+        if (
503
+            (!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui'))
504
+            and !@file_exists($htaccess)
505
+        ) {
506
+            spip_unlink($htpasswd);
507
+            spip_unlink($htpasswd . '-admin');
508
+
509
+            return;
510
+        }
511
+
512
+        # remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
513
+        # de devenir redacteur le cas echeant (auth http)... a nettoyer
514
+        // attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
515
+
516
+        $p1 = ''; // login:htpass pour tous
517
+        $p2 = ''; // login:htpass pour les admins
518
+        $s = sql_select(
519
+            'login, htpass, statut',
520
+            'spip_auteurs',
521
+            sql_in('statut', ['1comite', '0minirezo', 'nouveau'])
522
+        );
523
+        while ($t = sql_fetch($s)) {
524
+            if (strlen($t['login']) and strlen($t['htpass'])) {
525
+                $p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
526
+                if ($t['statut'] == '0minirezo') {
527
+                    $p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
528
+                }
529
+            }
530
+        }
531
+        sql_free($s);
532
+        if ($p1) {
533
+            ecrire_fichier($htpasswd, $p1);
534
+            ecrire_fichier($htpasswd . '-admin', $p2);
535
+            spip_log("Ecriture de $htpasswd et $htpasswd-admin");
536
+        }
537
+    }
538 538
 }
Please login to merge, or discard this patch.
Spacing   +27 added lines, -27 removed lines patch added patch discarded remove patch
@@ -49,7 +49,7 @@  discard block
 block discarded – undo
49 49
 		$row = sql_fetsel(
50 50
 			'*',
51 51
 			'spip_auteurs',
52
-			'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
52
+			'login='.sql_quote($login, $serveur, 'text')." AND statut<>'5poubelle'",
53 53
 			'',
54 54
 			'',
55 55
 			'',
@@ -75,7 +75,7 @@  discard block
 block discarded – undo
75 75
 	switch (strlen($row['pass'])) {
76 76
 		case 32:
77 77
 			// tres anciens mots de passe encodes en md5(alea.pass)
78
-			$md5pass = md5($row['alea_actuel'] . $pass);
78
+			$md5pass = md5($row['alea_actuel'].$pass);
79 79
 			if ($row['pass'] !== $md5pass) {
80 80
 				unset($row);
81 81
 			}
@@ -83,7 +83,7 @@  discard block
 block discarded – undo
83 83
 		case 64:
84 84
 			// anciens mots de passe encodes en sha256(alea.pass)
85 85
 			include_spip('auth/sha256.inc');
86
-			$shapass = spip_sha256($row['alea_actuel'] . $pass);
86
+			$shapass = spip_sha256($row['alea_actuel'].$pass);
87 87
 			if ($row['pass'] !== $shapass) {
88 88
 				unset($row);
89 89
 			}
@@ -99,12 +99,12 @@  discard block
 block discarded – undo
99 99
 				and !empty($row['backup_cles'])
100 100
 			) {
101 101
 				if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
102
-					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
102
+					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #'.$row['id_auteur'], 'auth'._LOG_INFO_IMPORTANTE);
103 103
 					$cles->save();
104 104
 				}
105 105
 				else {
106
-					spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
107
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
106
+					spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #'.$row['id_auteur']." n'est pas valide", 'auth'._LOG_ERREUR);
107
+					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur='.intval($row['id_auteur']));
108 108
 				}
109 109
 			}
110 110
 
@@ -148,7 +148,7 @@  discard block
 block discarded – undo
148 148
 			@sql_update(
149 149
 				'spip_auteurs',
150 150
 				$set,
151
-				'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote(
151
+				'id_auteur='.intval($row['id_auteur']).' AND pass='.sql_quote(
152 152
 					$row['pass'],
153 153
 					$serveur,
154 154
 					'text'
@@ -191,20 +191,20 @@  discard block
 block discarded – undo
191 191
 
192 192
 	// si force, on ne verifie pas la presence d'un backup chez un webmestre
193 193
 	if ($force) {
194
-		spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
194
+		spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth'._LOG_INFO_IMPORTANTE);
195 195
 		$secret = $cles->getSecretAuth(true);
196 196
 		return true;
197 197
 	}
198 198
 
199
-	$has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
199
+	$has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut='.sql_quote('0minirezo').' AND webmestre='.sql_quote('oui')." AND backup_cles!=''");
200 200
 	$has_backup = array_column($has_backup, 'id_auteur');
201 201
 	if (empty($has_backup)) {
202
-		spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE);
202
+		spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth'._LOG_INFO_IMPORTANTE);
203 203
 		$secret = $cles->getSecretAuth(true);
204 204
 		return true;
205 205
 	}
206 206
 	else {
207
-		spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
207
+		spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #'.implode(', #', $has_backup).' doit se connecter pour restaurer son backup des cles', 'auth'._LOG_ERREUR);
208 208
 		return false;
209 209
 	}
210 210
 }
@@ -221,8 +221,8 @@  discard block
 block discarded – undo
221 221
 	$flux['data'] .=
222 222
 		  '<script type="text/javascript">/*<![CDATA[*/'
223 223
 		. "$js\n"
224
-		. "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
225
-		. "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
224
+		. "var login_info={'login':'".$flux['args']['contexte']['var_login']."',"
225
+		. "'page_auteur': '".generer_url_public('informer_auteur')."',"
226 226
 		. "'informe_auteur_en_cours':false,"
227 227
 		. "'attente_informe':0};"
228 228
 		. "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
@@ -265,7 +265,7 @@  discard block
 block discarded – undo
265 265
 		} else {
266 266
 			$n = sql_countsel(
267 267
 				'spip_auteurs',
268
-				'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'",
268
+				'login='.sql_quote($new_login).' AND id_auteur!='.intval($id_auteur)." AND statut!='5poubelle'",
269 269
 				'',
270 270
 				'',
271 271
 				$serveur
@@ -293,7 +293,7 @@  discard block
 block discarded – undo
293 293
 	}
294 294
 	if (
295 295
 		!$id_auteur = intval($id_auteur)
296
-		or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
296
+		or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur='.intval($id_auteur), '', '', '', '', $serveur)
297 297
 	) {
298 298
 		return false;
299 299
 	}
@@ -308,7 +308,7 @@  discard block
 block discarded – undo
308 308
 		$anciens = sql_allfetsel(
309 309
 			'id_auteur',
310 310
 			'spip_auteurs',
311
-			'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
311
+			'login='.sql_quote($new_login, $serveur, 'text')." AND statut='5poubelle'",
312 312
 			'',
313 313
 			'',
314 314
 			'',
@@ -342,8 +342,8 @@  discard block
 block discarded – undo
342 342
 		$r = sql_getfetsel(
343 343
 			'login',
344 344
 			'spip_auteurs',
345
-			"statut<>'5poubelle'" .
346
-			' AND (length(pass)>0)' .
345
+			"statut<>'5poubelle'".
346
+			' AND (length(pass)>0)'.
347 347
 			" AND (login=$l)",
348 348
 			'',
349 349
 			'',
@@ -362,8 +362,8 @@  discard block
 block discarded – undo
362 362
 		return sql_getfetsel(
363 363
 			'login',
364 364
 			'spip_auteurs',
365
-			"statut<>'5poubelle'" .
366
-			' AND (length(pass)>0)' .
365
+			"statut<>'5poubelle'".
366
+			' AND (length(pass)>0)'.
367 367
 			" AND (login<>'' AND (nom=$l OR email=$l))",
368 368
 			'',
369 369
 			'',
@@ -432,7 +432,7 @@  discard block
 block discarded – undo
432 432
 
433 433
 	if (
434 434
 		!$id_auteur = intval($id_auteur)
435
-		or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
435
+		or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur='.intval($id_auteur), '', '', '', '', $serveur)
436 436
 	) {
437 437
 		return false;
438 438
 	}
@@ -493,8 +493,8 @@  discard block
 block discarded – undo
493 493
 		or isset($champs['statut'])
494 494
 		or (isset($options['all']) and $options['all'])
495 495
 	) {
496
-		$htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
497
-		$htpasswd = _DIR_TMP . _AUTH_USER_FILE;
496
+		$htaccess = _DIR_RESTREINT._ACCESS_FILE_NAME;
497
+		$htpasswd = _DIR_TMP._AUTH_USER_FILE;
498 498
 
499 499
 		// Cette variable de configuration peut etre posee par un plugin
500 500
 		// par exemple acces_restreint ;
@@ -504,7 +504,7 @@  discard block
 block discarded – undo
504 504
 			and !@file_exists($htaccess)
505 505
 		) {
506 506
 			spip_unlink($htpasswd);
507
-			spip_unlink($htpasswd . '-admin');
507
+			spip_unlink($htpasswd.'-admin');
508 508
 
509 509
 			return;
510 510
 		}
@@ -522,16 +522,16 @@  discard block
 block discarded – undo
522 522
 		);
523 523
 		while ($t = sql_fetch($s)) {
524 524
 			if (strlen($t['login']) and strlen($t['htpass'])) {
525
-				$p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
525
+				$p1 .= $t['login'].':'.$t['htpass']."\n";
526 526
 				if ($t['statut'] == '0minirezo') {
527
-					$p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
527
+					$p2 .= $t['login'].':'.$t['htpass']."\n";
528 528
 				}
529 529
 			}
530 530
 		}
531 531
 		sql_free($s);
532 532
 		if ($p1) {
533 533
 			ecrire_fichier($htpasswd, $p1);
534
-			ecrire_fichier($htpasswd . '-admin', $p2);
534
+			ecrire_fichier($htpasswd.'-admin', $p2);
535 535
 			spip_log("Ecriture de $htpasswd et $htpasswd-admin");
536 536
 		}
537 537
 	}
Please login to merge, or discard this patch.
Braces   +3 added lines, -6 removed lines patch added patch discarded remove patch
@@ -101,8 +101,7 @@  discard block
 block discarded – undo
101 101
 				if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
102 102
 					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
103 103
 					$cles->save();
104
-				}
105
-				else {
104
+				} else {
106 105
 					spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
107 106
 					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
108 107
 				}
@@ -202,8 +201,7 @@  discard block
 block discarded – undo
202 201
 		spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE);
203 202
 		$secret = $cles->getSecretAuth(true);
204 203
 		return true;
205
-	}
206
-	else {
204
+	} else {
207 205
 		spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
208 206
 		return false;
209 207
 	}
@@ -443,8 +441,7 @@  discard block
 block discarded – undo
443 441
 	if (!$secret) {
444 442
 		if (auth_spip_initialiser_secret()) {
445 443
 			$secret = $cles->getSecretAuth();
446
-		}
447
-		else {
444
+		} else {
448 445
 			return false;
449 446
 		}
450 447
 	}
Please login to merge, or discard this patch.
ecrire/inc/securiser_action.php 2 patches
Indentation   +188 added lines, -188 removed lines patch added patch discarded remove patch
@@ -16,10 +16,10 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Actions
17 17
  **/
18 18
 
19
- use \Spip\Chiffrer\SpipCles;
19
+    use \Spip\Chiffrer\SpipCles;
20 20
 
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 /**
@@ -52,19 +52,19 @@  discard block
 block discarded – undo
52 52
  * @return array|string
53 53
  */
54 54
 function inc_securiser_action_dist($action = '', $arg = '', $redirect = '', $mode = false, $att = '', $public = false) {
55
-	if ($action) {
56
-		return securiser_action_auteur($action, $arg, $redirect, $mode, $att, $public);
57
-	} else {
58
-		$arg = _request('arg');
59
-		$hash = _request('hash');
60
-		$action = _request('action') ?: _request('formulaire_action');
61
-		if ($a = verifier_action_auteur("$action-$arg", $hash)) {
62
-			return $arg;
63
-		}
64
-		include_spip('inc/minipres');
65
-		echo minipres();
66
-		exit;
67
-	}
55
+    if ($action) {
56
+        return securiser_action_auteur($action, $arg, $redirect, $mode, $att, $public);
57
+    } else {
58
+        $arg = _request('arg');
59
+        $hash = _request('hash');
60
+        $action = _request('action') ?: _request('formulaire_action');
61
+        if ($a = verifier_action_auteur("$action-$arg", $hash)) {
62
+            return $arg;
63
+        }
64
+        include_spip('inc/minipres');
65
+        echo minipres();
66
+        exit;
67
+    }
68 68
 }
69 69
 
70 70
 /**
@@ -83,29 +83,29 @@  discard block
 block discarded – undo
83 83
  */
84 84
 function demander_confirmation_avant_action($titre, $titre_bouton, $url_action = null) {
85 85
 
86
-	if (!$url_action) {
87
-		$url_action = self();
88
-		$action = _request('action');
89
-		$url_action = parametre_url($url_action, 'action', $action, '&');
90
-	}
91
-	else {
92
-		$action = parametre_url($url_action, 'action');
93
-	}
94
-
95
-	$arg = parametre_url($url_action, 'arg');
96
-	$confirm = md5("$action:$arg:" . realpath(__FILE__));
97
-	if (_request('confirm_action') === $confirm) {
98
-		return true;
99
-	}
100
-
101
-	$url_confirm = parametre_url($url_action, 'confirm_action', $confirm, '&');
102
-	include_spip('inc/filtres');
103
-	$bouton_action = bouton_action($titre_bouton, $url_confirm);
104
-	$corps = "<div style='text-align:center;'>$bouton_action</div>";
105
-
106
-	include_spip('inc/minipres');
107
-	echo minipres($titre, $corps);
108
-	exit;
86
+    if (!$url_action) {
87
+        $url_action = self();
88
+        $action = _request('action');
89
+        $url_action = parametre_url($url_action, 'action', $action, '&');
90
+    }
91
+    else {
92
+        $action = parametre_url($url_action, 'action');
93
+    }
94
+
95
+    $arg = parametre_url($url_action, 'arg');
96
+    $confirm = md5("$action:$arg:" . realpath(__FILE__));
97
+    if (_request('confirm_action') === $confirm) {
98
+        return true;
99
+    }
100
+
101
+    $url_confirm = parametre_url($url_action, 'confirm_action', $confirm, '&');
102
+    include_spip('inc/filtres');
103
+    $bouton_action = bouton_action($titre_bouton, $url_confirm);
104
+    $corps = "<div style='text-align:center;'>$bouton_action</div>";
105
+
106
+    include_spip('inc/minipres');
107
+    echo minipres($titre, $corps);
108
+    exit;
109 109
 }
110 110
 
111 111
 /**
@@ -136,34 +136,34 @@  discard block
 block discarded – undo
136 136
  */
137 137
 function securiser_action_auteur($action, $arg, $redirect = '', $mode = false, $att = '', $public = false) {
138 138
 
139
-	// mode URL ou array
140
-	if (!is_string($mode)) {
141
-		$hash = calculer_action_auteur("$action-$arg", is_numeric($att) ? $att : null);
142
-
143
-		$r = rawurlencode($redirect);
144
-		if ($mode === -1) {
145
-			return ['action' => $action, 'arg' => $arg, 'hash' => $hash];
146
-		} else {
147
-			return generer_url_action(
148
-				$action,
149
-				'arg=' . rawurlencode($arg) . "&hash=$hash" . (!$r ? '' : "&redirect=$r"),
150
-				$mode,
151
-				$public
152
-			);
153
-		}
154
-	}
155
-
156
-	// mode formulaire
157
-	$hash = calculer_action_auteur("$action-$arg");
158
-	$att .= " style='margin: 0px; border: 0px'";
159
-	if ($redirect) {
160
-		$redirect = "\n\t\t<input name='redirect' type='hidden' value='" . str_replace("'", '&#39;', $redirect) . "' />";
161
-	}
162
-	$mode .= $redirect . "
139
+    // mode URL ou array
140
+    if (!is_string($mode)) {
141
+        $hash = calculer_action_auteur("$action-$arg", is_numeric($att) ? $att : null);
142
+
143
+        $r = rawurlencode($redirect);
144
+        if ($mode === -1) {
145
+            return ['action' => $action, 'arg' => $arg, 'hash' => $hash];
146
+        } else {
147
+            return generer_url_action(
148
+                $action,
149
+                'arg=' . rawurlencode($arg) . "&hash=$hash" . (!$r ? '' : "&redirect=$r"),
150
+                $mode,
151
+                $public
152
+            );
153
+        }
154
+    }
155
+
156
+    // mode formulaire
157
+    $hash = calculer_action_auteur("$action-$arg");
158
+    $att .= " style='margin: 0px; border: 0px'";
159
+    if ($redirect) {
160
+        $redirect = "\n\t\t<input name='redirect' type='hidden' value='" . str_replace("'", '&#39;', $redirect) . "' />";
161
+    }
162
+    $mode .= $redirect . "
163 163
 <input name='hash' type='hidden' value='$hash' />
164 164
 <input name='arg' type='hidden' value='$arg' />";
165 165
 
166
-	return generer_form_action($action, $mode, $att, $public);
166
+    return generer_form_action($action, $mode, $att, $public);
167 167
 }
168 168
 
169 169
 /**
@@ -173,48 +173,48 @@  discard block
 block discarded – undo
173 173
  * @return array
174 174
  */
175 175
 function caracteriser_auteur($id_auteur = null) {
176
-	static $caracterisation = [];
177
-
178
-	if (is_null($id_auteur) and !isset($GLOBALS['visiteur_session']['id_auteur'])) {
179
-		// si l'auteur courant n'est pas connu alors qu'il peut demander une action
180
-		// c'est une connexion par php_auth ou 1 instal, on se rabat sur le cookie.
181
-		// S'il n'avait pas le droit de realiser cette action, le hash sera faux.
182
-		if (
183
-			isset($_COOKIE['spip_session'])
184
-			and (preg_match('/^(\d+)/', $_COOKIE['spip_session'], $r))
185
-		) {
186
-			return [$r[1], ''];
187
-			// Necessaire aux forums anonymes.
188
-			// Pour le reste, ca echouera.
189
-		} else {
190
-			return ['0', ''];
191
-		}
192
-	}
193
-	// Eviter l'acces SQL si le pass est connu de PHP
194
-	if (is_null($id_auteur)) {
195
-		$id_auteur = $GLOBALS['visiteur_session']['id_auteur'] ?? 0;
196
-		if (isset($GLOBALS['visiteur_session']['pass']) and $GLOBALS['visiteur_session']['pass']) {
197
-			return $caracterisation[$id_auteur] = [$id_auteur, $GLOBALS['visiteur_session']['pass']];
198
-		}
199
-	}
200
-
201
-	if (isset($caracterisation[$id_auteur])) {
202
-		return $caracterisation[$id_auteur];
203
-	}
204
-
205
-	if ($id_auteur) {
206
-		include_spip('base/abstract_sql');
207
-		$t = sql_fetsel('id_auteur, pass', 'spip_auteurs', "id_auteur=$id_auteur");
208
-		if ($t) {
209
-			return $caracterisation[$id_auteur] = [$t['id_auteur'], $t['pass']];
210
-		}
211
-		include_spip('inc/minipres');
212
-		echo minipres();
213
-		exit;
214
-	} // Visiteur anonyme, pour ls forums par exemple
215
-	else {
216
-		return ['0', ''];
217
-	}
176
+    static $caracterisation = [];
177
+
178
+    if (is_null($id_auteur) and !isset($GLOBALS['visiteur_session']['id_auteur'])) {
179
+        // si l'auteur courant n'est pas connu alors qu'il peut demander une action
180
+        // c'est une connexion par php_auth ou 1 instal, on se rabat sur le cookie.
181
+        // S'il n'avait pas le droit de realiser cette action, le hash sera faux.
182
+        if (
183
+            isset($_COOKIE['spip_session'])
184
+            and (preg_match('/^(\d+)/', $_COOKIE['spip_session'], $r))
185
+        ) {
186
+            return [$r[1], ''];
187
+            // Necessaire aux forums anonymes.
188
+            // Pour le reste, ca echouera.
189
+        } else {
190
+            return ['0', ''];
191
+        }
192
+    }
193
+    // Eviter l'acces SQL si le pass est connu de PHP
194
+    if (is_null($id_auteur)) {
195
+        $id_auteur = $GLOBALS['visiteur_session']['id_auteur'] ?? 0;
196
+        if (isset($GLOBALS['visiteur_session']['pass']) and $GLOBALS['visiteur_session']['pass']) {
197
+            return $caracterisation[$id_auteur] = [$id_auteur, $GLOBALS['visiteur_session']['pass']];
198
+        }
199
+    }
200
+
201
+    if (isset($caracterisation[$id_auteur])) {
202
+        return $caracterisation[$id_auteur];
203
+    }
204
+
205
+    if ($id_auteur) {
206
+        include_spip('base/abstract_sql');
207
+        $t = sql_fetsel('id_auteur, pass', 'spip_auteurs', "id_auteur=$id_auteur");
208
+        if ($t) {
209
+            return $caracterisation[$id_auteur] = [$t['id_auteur'], $t['pass']];
210
+        }
211
+        include_spip('inc/minipres');
212
+        echo minipres();
213
+        exit;
214
+    } // Visiteur anonyme, pour ls forums par exemple
215
+    else {
216
+        return ['0', ''];
217
+    }
218 218
 }
219 219
 
220 220
 /**
@@ -229,30 +229,30 @@  discard block
 block discarded – undo
229 229
  * @return string
230 230
  */
231 231
 function _action_auteur(string $action, int $id_auteur, ?string $pass, string $alea): string {
232
-	static $sha = [];
233
-	$pass = $pass ?? '';
234
-	$entry = "$action:$id_auteur:$pass:$alea";
235
-	if (!isset($sha[$entry])) {
236
-		$sha[$entry] = hash_hmac('sha256', "$action::$id_auteur", "$pass::" . _action_get_alea($alea));
237
-	}
238
-
239
-	return $sha[$entry];
232
+    static $sha = [];
233
+    $pass = $pass ?? '';
234
+    $entry = "$action:$id_auteur:$pass:$alea";
235
+    if (!isset($sha[$entry])) {
236
+        $sha[$entry] = hash_hmac('sha256', "$action::$id_auteur", "$pass::" . _action_get_alea($alea));
237
+    }
238
+
239
+    return $sha[$entry];
240 240
 }
241 241
 
242 242
 function _action_get_alea(string $alea): string {
243
-	if (!isset($GLOBALS['meta'][$alea])) {
244
-		if (!$exec = _request('exec') or !autoriser_sans_cookie($exec)) {
245
-			include_spip('inc/acces');
246
-			charger_aleas();
247
-			if (empty($GLOBALS['meta'][$alea])) {
248
-				include_spip('inc/minipres');
249
-				echo minipres();
250
-				spip_log("$alea indisponible");
251
-				exit;
252
-			}
253
-		}
254
-	}
255
-	return $GLOBALS['meta'][$alea] ?? '';
243
+    if (!isset($GLOBALS['meta'][$alea])) {
244
+        if (!$exec = _request('exec') or !autoriser_sans_cookie($exec)) {
245
+            include_spip('inc/acces');
246
+            charger_aleas();
247
+            if (empty($GLOBALS['meta'][$alea])) {
248
+                include_spip('inc/minipres');
249
+                echo minipres();
250
+                spip_log("$alea indisponible");
251
+                exit;
252
+            }
253
+        }
254
+    }
255
+    return $GLOBALS['meta'][$alea] ?? '';
256 256
 }
257 257
 
258 258
 /**
@@ -263,9 +263,9 @@  discard block
 block discarded – undo
263 263
  * @return string
264 264
  */
265 265
 function calculer_action_auteur($action, $id_auteur = null) {
266
-	[$id_auteur, $pass] = caracteriser_auteur($id_auteur);
266
+    [$id_auteur, $pass] = caracteriser_auteur($id_auteur);
267 267
 
268
-	return _action_auteur($action, $id_auteur, $pass, 'alea_ephemere');
268
+    return _action_auteur($action, $id_auteur, $pass, 'alea_ephemere');
269 269
 }
270 270
 
271 271
 
@@ -278,15 +278,15 @@  discard block
 block discarded – undo
278 278
  * @return bool
279 279
  */
280 280
 function verifier_action_auteur($action, $hash) {
281
-	[$id_auteur, $pass] = caracteriser_auteur();
282
-	if (
283
-		hash_equals($hash, _action_auteur($action, $id_auteur, $pass, 'alea_ephemere'))
284
-		or hash_equals($hash, _action_auteur($action, $id_auteur, $pass, 'alea_ephemere_ancien'))
285
-	) {
286
-		return true;
287
-	}
288
-
289
-	return false;
281
+    [$id_auteur, $pass] = caracteriser_auteur();
282
+    if (
283
+        hash_equals($hash, _action_auteur($action, $id_auteur, $pass, 'alea_ephemere'))
284
+        or hash_equals($hash, _action_auteur($action, $id_auteur, $pass, 'alea_ephemere_ancien'))
285
+    ) {
286
+        return true;
287
+    }
288
+
289
+    return false;
290 290
 }
291 291
 
292 292
 //
@@ -301,8 +301,8 @@  discard block
 block discarded – undo
301 301
  * @return string
302 302
  */
303 303
 function secret_du_site() {
304
-	include_spip('inc/chiffrer');
305
-	return SpipCles::secret_du_site();
304
+    include_spip('inc/chiffrer');
305
+    return SpipCles::secret_du_site();
306 306
 }
307 307
 
308 308
 /**
@@ -312,7 +312,7 @@  discard block
 block discarded – undo
312 312
  * @return string
313 313
  */
314 314
 function calculer_cle_action($action) {
315
-	return hash_hmac('sha256', $action, secret_du_site());
315
+    return hash_hmac('sha256', $action, secret_du_site());
316 316
 }
317 317
 
318 318
 /**
@@ -323,7 +323,7 @@  discard block
 block discarded – undo
323 323
  * @return bool
324 324
  */
325 325
 function verifier_cle_action($action, $cle) {
326
-	return hash_equals($cle, calculer_cle_action($action));
326
+    return hash_equals($cle, calculer_cle_action($action));
327 327
 }
328 328
 
329 329
 
@@ -340,19 +340,19 @@  discard block
 block discarded – undo
340 340
  * @return string Token, de la forme "{id}*{hash}"
341 341
  */
342 342
 function calculer_token_previsu($url, $id_auteur = null, $alea = 'alea_ephemere') {
343
-	if (is_null($id_auteur)) {
344
-		if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
345
-			$id_auteur = $GLOBALS['visiteur_session']['id_auteur'];
346
-		}
347
-	}
348
-	if (!$id_auteur = intval($id_auteur)) {
349
-		return '';
350
-	}
351
-	// On nettoie l’URL de tous les var_.
352
-	$url = nettoyer_uri_var($url);
353
-
354
-	$token = _action_auteur('previsualiser-' . $url, $id_auteur, secret_du_site(), $alea);
355
-	return "$id_auteur-$token";
343
+    if (is_null($id_auteur)) {
344
+        if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
345
+            $id_auteur = $GLOBALS['visiteur_session']['id_auteur'];
346
+        }
347
+    }
348
+    if (!$id_auteur = intval($id_auteur)) {
349
+        return '';
350
+    }
351
+    // On nettoie l’URL de tous les var_.
352
+    $url = nettoyer_uri_var($url);
353
+
354
+    $token = _action_auteur('previsualiser-' . $url, $id_auteur, secret_du_site(), $alea);
355
+    return "$id_auteur-$token";
356 356
 }
357 357
 
358 358
 
@@ -370,31 +370,31 @@  discard block
 block discarded – undo
370 370
  *     + Tableau (id auteur, type d’objet, id_objet) sinon.
371 371
  */
372 372
 function verifier_token_previsu($token) {
373
-	// retrouver auteur / hash
374
-	$e = explode('-', $token, 2);
375
-	if (count($e) == 2 and is_numeric(reset($e))) {
376
-		$id_auteur = intval(reset($e));
377
-	} else {
378
-		return false;
379
-	}
380
-
381
-	// calculer le type et id de l’url actuelle
382
-	include_spip('inc/urls');
383
-	include_spip('inc/filtres_mini');
384
-	$url = url_absolue(self());
385
-
386
-	// verifier le token
387
-	$_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere');
388
-	if (!$_token or !hash_equals($token, $_token)) {
389
-		$_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere_ancien');
390
-		if (!$_token or !hash_equals($token, $_token)) {
391
-			return false;
392
-		}
393
-	}
394
-
395
-	return [
396
-		'id_auteur' => $id_auteur,
397
-	];
373
+    // retrouver auteur / hash
374
+    $e = explode('-', $token, 2);
375
+    if (count($e) == 2 and is_numeric(reset($e))) {
376
+        $id_auteur = intval(reset($e));
377
+    } else {
378
+        return false;
379
+    }
380
+
381
+    // calculer le type et id de l’url actuelle
382
+    include_spip('inc/urls');
383
+    include_spip('inc/filtres_mini');
384
+    $url = url_absolue(self());
385
+
386
+    // verifier le token
387
+    $_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere');
388
+    if (!$_token or !hash_equals($token, $_token)) {
389
+        $_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere_ancien');
390
+        if (!$_token or !hash_equals($token, $_token)) {
391
+            return false;
392
+        }
393
+    }
394
+
395
+    return [
396
+        'id_auteur' => $id_auteur,
397
+    ];
398 398
 }
399 399
 
400 400
 /**
@@ -403,13 +403,13 @@  discard block
 block discarded – undo
403 403
  * @return bool|array
404 404
  */
405 405
 function decrire_token_previsu() {
406
-	static $desc = null;
407
-	if (is_null($desc)) {
408
-		if ($token = _request('var_previewtoken')) {
409
-			$desc = verifier_token_previsu($token);
410
-		} else {
411
-			$desc = false;
412
-		}
413
-	}
414
-	return $desc;
406
+    static $desc = null;
407
+    if (is_null($desc)) {
408
+        if ($token = _request('var_previewtoken')) {
409
+            $desc = verifier_token_previsu($token);
410
+        } else {
411
+            $desc = false;
412
+        }
413
+    }
414
+    return $desc;
415 415
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -93,7 +93,7 @@  discard block
 block discarded – undo
93 93
 	}
94 94
 
95 95
 	$arg = parametre_url($url_action, 'arg');
96
-	$confirm = md5("$action:$arg:" . realpath(__FILE__));
96
+	$confirm = md5("$action:$arg:".realpath(__FILE__));
97 97
 	if (_request('confirm_action') === $confirm) {
98 98
 		return true;
99 99
 	}
@@ -146,7 +146,7 @@  discard block
 block discarded – undo
146 146
 		} else {
147 147
 			return generer_url_action(
148 148
 				$action,
149
-				'arg=' . rawurlencode($arg) . "&hash=$hash" . (!$r ? '' : "&redirect=$r"),
149
+				'arg='.rawurlencode($arg)."&hash=$hash".(!$r ? '' : "&redirect=$r"),
150 150
 				$mode,
151 151
 				$public
152 152
 			);
@@ -157,9 +157,9 @@  discard block
 block discarded – undo
157 157
 	$hash = calculer_action_auteur("$action-$arg");
158 158
 	$att .= " style='margin: 0px; border: 0px'";
159 159
 	if ($redirect) {
160
-		$redirect = "\n\t\t<input name='redirect' type='hidden' value='" . str_replace("'", '&#39;', $redirect) . "' />";
160
+		$redirect = "\n\t\t<input name='redirect' type='hidden' value='".str_replace("'", '&#39;', $redirect)."' />";
161 161
 	}
162
-	$mode .= $redirect . "
162
+	$mode .= $redirect."
163 163
 <input name='hash' type='hidden' value='$hash' />
164 164
 <input name='arg' type='hidden' value='$arg' />";
165 165
 
@@ -233,7 +233,7 @@  discard block
 block discarded – undo
233 233
 	$pass = $pass ?? '';
234 234
 	$entry = "$action:$id_auteur:$pass:$alea";
235 235
 	if (!isset($sha[$entry])) {
236
-		$sha[$entry] = hash_hmac('sha256', "$action::$id_auteur", "$pass::" . _action_get_alea($alea));
236
+		$sha[$entry] = hash_hmac('sha256', "$action::$id_auteur", "$pass::"._action_get_alea($alea));
237 237
 	}
238 238
 
239 239
 	return $sha[$entry];
@@ -351,7 +351,7 @@  discard block
 block discarded – undo
351 351
 	// On nettoie l’URL de tous les var_.
352 352
 	$url = nettoyer_uri_var($url);
353 353
 
354
-	$token = _action_auteur('previsualiser-' . $url, $id_auteur, secret_du_site(), $alea);
354
+	$token = _action_auteur('previsualiser-'.$url, $id_auteur, secret_du_site(), $alea);
355 355
 	return "$id_auteur-$token";
356 356
 }
357 357
 
Please login to merge, or discard this patch.
ecrire/inc/auth.php 2 patches
Indentation   +430 added lines, -430 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');
@@ -35,33 +35,33 @@  discard block
 block discarded – undo
35 35
  *  - une chaîne vide si autorisation à pénétrer dans l'espace privé.
36 36
  */
37 37
 function inc_auth_dist() {
38
-	$row = auth_mode();
38
+    $row = auth_mode();
39 39
 
40
-	if ($row) {
41
-		return auth_init_droits($row);
42
-	}
40
+    if ($row) {
41
+        return auth_init_droits($row);
42
+    }
43 43
 
44
-	if (!$GLOBALS['connect_login']) {
45
-		return auth_a_loger();
46
-	}
44
+    if (!$GLOBALS['connect_login']) {
45
+        return auth_a_loger();
46
+    }
47 47
 
48
-	// Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui
49
-	// C'est soit parce que la base est inutilisable,
50
-	// soit parce que la table des auteurs a changee (restauration etc)
51
-	// Pas la peine d'insister.
52
-	// Renvoyer le nom fautif et une URL de remise a zero
48
+    // Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui
49
+    // C'est soit parce que la base est inutilisable,
50
+    // soit parce que la table des auteurs a changee (restauration etc)
51
+    // Pas la peine d'insister.
52
+    // Renvoyer le nom fautif et une URL de remise a zero
53 53
 
54
-	if (spip_connect()) {
55
-		return [
56
-			'login' => $GLOBALS['connect_login'],
57
-			'site' => generer_url_public('', 'action=logout&amp;logout=prive')
58
-		];
59
-	}
54
+    if (spip_connect()) {
55
+        return [
56
+            'login' => $GLOBALS['connect_login'],
57
+            'site' => generer_url_public('', 'action=logout&amp;logout=prive')
58
+        ];
59
+    }
60 60
 
61
-	$n = intval(sql_errno());
62
-	spip_log("Erreur base de donnees $n " . sql_error());
61
+    $n = intval(sql_errno());
62
+    spip_log("Erreur base de donnees $n " . sql_error());
63 63
 
64
-	return $n ?: 1;
64
+    return $n ?: 1;
65 65
 }
66 66
 
67 67
 /**
@@ -73,39 +73,39 @@  discard block
 block discarded – undo
73 73
  * @return array|string
74 74
  */
75 75
 function auth_echec($raison) {
76
-	include_spip('inc/minipres');
77
-	include_spip('inc/headers');
78
-	// pas authentifie. Pourquoi ?
79
-	if (is_string($raison)) {
80
-		// redirection vers une page d'authentification
81
-		// on ne revient pas de cette fonction
82
-		// sauf si pb de header
83
-		$raison = redirige_formulaire($raison);
84
-	} elseif (is_int($raison)) {
85
-		// erreur SQL a afficher
86
-		$raison = minipres(
87
-			_T('info_travaux_titre'),
88
-			_T('titre_probleme_technique') . '<p><tt>' . sql_errno() . ' ' . sql_error() . '</tt></p>'
89
-		);
90
-	} elseif (@$raison['statut']) {
91
-		// un simple visiteur n'a pas acces a l'espace prive
92
-		spip_log('connexion refusee a ' . @$raison['id_auteur']);
93
-		$raison = minipres(_T('avis_erreur_connexion'), _T('avis_erreur_visiteur'));
94
-	} else {
95
-		// auteur en fin de droits ...
96
-		$h = $raison['site'];
97
-		$raison = minipres(
98
-			_T('avis_erreur_connexion'),
99
-			'<br /><br /><p>'
100
-			. _T('texte_inc_auth_1', ['auth_login' => $raison['login']])
101
-			. " <a href='$h'>"
102
-			. _T('texte_inc_auth_2')
103
-			. '</a>'
104
-			. _T('texte_inc_auth_3')
105
-		);
106
-	}
107
-
108
-	return $raison;
76
+    include_spip('inc/minipres');
77
+    include_spip('inc/headers');
78
+    // pas authentifie. Pourquoi ?
79
+    if (is_string($raison)) {
80
+        // redirection vers une page d'authentification
81
+        // on ne revient pas de cette fonction
82
+        // sauf si pb de header
83
+        $raison = redirige_formulaire($raison);
84
+    } elseif (is_int($raison)) {
85
+        // erreur SQL a afficher
86
+        $raison = minipres(
87
+            _T('info_travaux_titre'),
88
+            _T('titre_probleme_technique') . '<p><tt>' . sql_errno() . ' ' . sql_error() . '</tt></p>'
89
+        );
90
+    } elseif (@$raison['statut']) {
91
+        // un simple visiteur n'a pas acces a l'espace prive
92
+        spip_log('connexion refusee a ' . @$raison['id_auteur']);
93
+        $raison = minipres(_T('avis_erreur_connexion'), _T('avis_erreur_visiteur'));
94
+    } else {
95
+        // auteur en fin de droits ...
96
+        $h = $raison['site'];
97
+        $raison = minipres(
98
+            _T('avis_erreur_connexion'),
99
+            '<br /><br /><p>'
100
+            . _T('texte_inc_auth_1', ['auth_login' => $raison['login']])
101
+            . " <a href='$h'>"
102
+            . _T('texte_inc_auth_2')
103
+            . '</a>'
104
+            . _T('texte_inc_auth_3')
105
+        );
106
+    }
107
+
108
+    return $raison;
109 109
 }
110 110
 
111 111
 /**
@@ -115,81 +115,81 @@  discard block
 block discarded – undo
115 115
  * @return array|bool|string
116 116
  */
117 117
 function auth_mode() {
118
-	//
119
-	// Initialiser variables (eviter hacks par URL)
120
-	//
121
-	$GLOBALS['connect_login'] = '';
122
-	$id_auteur = null;
123
-	$GLOBALS['auth_can_disconnect'] = false;
124
-
125
-	//
126
-	// Recuperer les donnees d'identification
127
-	//
128
-	include_spip('inc/session');
129
-	// Session valide en cours ?
130
-	if (isset($_COOKIE['spip_session'])) {
131
-		$session = charger_fonction('session', 'inc');
132
-		if (
133
-			$id_auteur = $session()
134
-			or $id_auteur === 0 // reprise sur restauration
135
-		) {
136
-			$GLOBALS['auth_can_disconnect'] = true;
137
-			$GLOBALS['connect_login'] = session_get('login');
138
-		} else {
139
-			unset($_COOKIE['spip_session']);
140
-		}
141
-	}
142
-
143
-	// Essayer auth http si significatif
144
-	// (ignorer les login d'intranet independants de spip)
145
-	if (!$GLOBALS['ignore_auth_http']) {
146
-		if (
147
-			(isset($_SERVER['PHP_AUTH_USER']) and isset($_SERVER['PHP_AUTH_PW'])
148
-				and $r = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))
149
-			or
150
-			// Si auth http differtente de basic, PHP_AUTH_PW
151
-			// est indisponible mais tentons quand meme pour
152
-			// autocreation via LDAP
153
-			(isset($_SERVER['REMOTE_USER'])
154
-				and $r = lire_php_auth($_SERVER['PHP_AUTH_USER'] = $_SERVER['REMOTE_USER'], ''))
155
-		) {
156
-			if (!$id_auteur) {
157
-				$_SERVER['PHP_AUTH_PW'] = '';
158
-				$GLOBALS['auth_can_disconnect'] = true;
159
-				$GLOBALS['visiteur_session'] = $r;
160
-				$GLOBALS['connect_login'] = session_get('login');
161
-				$id_auteur = $r['id_auteur'];
162
-			} else {
163
-				// cas de la session en plus de PHP_AUTH
164
-				/*				  if ($id_auteur != $r['id_auteur']){
118
+    //
119
+    // Initialiser variables (eviter hacks par URL)
120
+    //
121
+    $GLOBALS['connect_login'] = '';
122
+    $id_auteur = null;
123
+    $GLOBALS['auth_can_disconnect'] = false;
124
+
125
+    //
126
+    // Recuperer les donnees d'identification
127
+    //
128
+    include_spip('inc/session');
129
+    // Session valide en cours ?
130
+    if (isset($_COOKIE['spip_session'])) {
131
+        $session = charger_fonction('session', 'inc');
132
+        if (
133
+            $id_auteur = $session()
134
+            or $id_auteur === 0 // reprise sur restauration
135
+        ) {
136
+            $GLOBALS['auth_can_disconnect'] = true;
137
+            $GLOBALS['connect_login'] = session_get('login');
138
+        } else {
139
+            unset($_COOKIE['spip_session']);
140
+        }
141
+    }
142
+
143
+    // Essayer auth http si significatif
144
+    // (ignorer les login d'intranet independants de spip)
145
+    if (!$GLOBALS['ignore_auth_http']) {
146
+        if (
147
+            (isset($_SERVER['PHP_AUTH_USER']) and isset($_SERVER['PHP_AUTH_PW'])
148
+                and $r = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))
149
+            or
150
+            // Si auth http differtente de basic, PHP_AUTH_PW
151
+            // est indisponible mais tentons quand meme pour
152
+            // autocreation via LDAP
153
+            (isset($_SERVER['REMOTE_USER'])
154
+                and $r = lire_php_auth($_SERVER['PHP_AUTH_USER'] = $_SERVER['REMOTE_USER'], ''))
155
+        ) {
156
+            if (!$id_auteur) {
157
+                $_SERVER['PHP_AUTH_PW'] = '';
158
+                $GLOBALS['auth_can_disconnect'] = true;
159
+                $GLOBALS['visiteur_session'] = $r;
160
+                $GLOBALS['connect_login'] = session_get('login');
161
+                $id_auteur = $r['id_auteur'];
162
+            } else {
163
+                // cas de la session en plus de PHP_AUTH
164
+                /*				  if ($id_auteur != $r['id_auteur']){
165 165
 					spip_log("vol de session $id_auteur" . join(', ', $r));
166 166
 				unset($_COOKIE['spip_session']);
167 167
 				$id_auteur = '';
168 168
 				} */
169
-			}
170
-		} else {
171
-			// Authentification .htaccess old style, car .htaccess semble
172
-			// souvent definir *aussi* PHP_AUTH_USER et PHP_AUTH_PW
173
-			if (isset($_SERVER['REMOTE_USER'])) {
174
-				$GLOBALS['connect_login'] = $_SERVER['REMOTE_USER'];
175
-			}
176
-		}
177
-	}
178
-
179
-	$where = (is_numeric($id_auteur)
180
-		/*AND $id_auteur>0*/ // reprise lors des restaurations
181
-	) ?
182
-		"id_auteur=$id_auteur" :
183
-		(!strlen($GLOBALS['connect_login']) ? '' : 'login=' . sql_quote($GLOBALS['connect_login'], '', 'text'));
184
-
185
-	if (!$where) {
186
-		return '';
187
-	}
188
-
189
-	// Trouver les autres infos dans la table auteurs.
190
-	// le champ 'quand' est utilise par l'agenda
191
-
192
-	return sql_fetsel('*, en_ligne AS quand', 'spip_auteurs', "$where AND statut!='5poubelle'");
169
+            }
170
+        } else {
171
+            // Authentification .htaccess old style, car .htaccess semble
172
+            // souvent definir *aussi* PHP_AUTH_USER et PHP_AUTH_PW
173
+            if (isset($_SERVER['REMOTE_USER'])) {
174
+                $GLOBALS['connect_login'] = $_SERVER['REMOTE_USER'];
175
+            }
176
+        }
177
+    }
178
+
179
+    $where = (is_numeric($id_auteur)
180
+        /*AND $id_auteur>0*/ // reprise lors des restaurations
181
+    ) ?
182
+        "id_auteur=$id_auteur" :
183
+        (!strlen($GLOBALS['connect_login']) ? '' : 'login=' . sql_quote($GLOBALS['connect_login'], '', 'text'));
184
+
185
+    if (!$where) {
186
+        return '';
187
+    }
188
+
189
+    // Trouver les autres infos dans la table auteurs.
190
+    // le champ 'quand' est utilise par l'agenda
191
+
192
+    return sql_fetsel('*, en_ligne AS quand', 'spip_auteurs', "$where AND statut!='5poubelle'");
193 193
 }
194 194
 
195 195
 /**
@@ -207,86 +207,86 @@  discard block
 block discarded – undo
207 207
  */
208 208
 function auth_init_droits($row) {
209 209
 
210
-	include_spip('inc/autoriser');
211
-	if (!autoriser('loger', '', 0, $row)) {
212
-		return false;
213
-	}
214
-
215
-
216
-	if ($row['statut'] == 'nouveau') {
217
-		include_spip('action/inscrire_auteur');
218
-		$row = confirmer_statut_inscription($row);
219
-	}
220
-
221
-	$GLOBALS['connect_id_auteur'] = $row['id_auteur'];
222
-	$GLOBALS['connect_login'] = $row['login'];
223
-	$GLOBALS['connect_statut'] = $row['statut'];
224
-
225
-	$GLOBALS['visiteur_session'] = array_merge((array)$GLOBALS['visiteur_session'], $row);
226
-
227
-	// au cas ou : ne pas memoriser les champs sensibles
228
-	unset($GLOBALS['visiteur_session']['pass']);
229
-	unset($GLOBALS['visiteur_session']['htpass']);
230
-	unset($GLOBALS['visiteur_session']['alea_actuel']);
231
-	unset($GLOBALS['visiteur_session']['alea_futur']);
232
-	unset($GLOBALS['visiteur_session']['ldap_password']);
233
-
234
-	// creer la session au besoin
235
-	if (!isset($_COOKIE['spip_session'])) {
236
-		$session = charger_fonction('session', 'inc');
237
-		$spip_session = $session($row);
238
-	}
239
-
240
-	// reinjecter les preferences_auteur apres le reset de spip_session
241
-	// car utilisees au retour par auth_loger()
242
-	$r = @unserialize($row['prefs']);
243
-	$GLOBALS['visiteur_session']['prefs'] = ($r ?: []);
244
-	// si prefs pas definies, les definir par defaut
245
-	if (!isset($GLOBALS['visiteur_session']['prefs']['couleur'])) {
246
-		$GLOBALS['visiteur_session']['prefs']['couleur'] = 2;
247
-		$GLOBALS['visiteur_session']['prefs']['display'] = 2;
248
-		$GLOBALS['visiteur_session']['prefs']['display_navigation'] = 'navigation_avec_icones';
249
-		$GLOBALS['visiteur_session']['prefs']['display_outils'] = 'oui';
250
-	}
251
-
252
-	$GLOBALS['visiteur_session'] = pipeline(
253
-		'preparer_visiteur_session',
254
-		['args' => ['row' => $row],
255
-		'data' => $GLOBALS['visiteur_session']]
256
-	);
257
-
258
-	// Etablir les droits selon le codage attendu
259
-	// dans ecrire/index.php ecrire/prive.php
260
-
261
-	// Pas autorise a acceder a ecrire ? renvoyer le tableau
262
-	// A noter : le premier appel a autoriser() a le bon gout
263
-	// d'initialiser $GLOBALS['visiteur_session']['restreint'],
264
-	// qui ne figure pas dans le fichier de session
265
-
266
-	if (!autoriser('ecrire')) {
267
-		return $row;
268
-	}
269
-
270
-	// autoriser('ecrire') ne laisse passer que les Admin et les Redac
271
-
272
-	auth_trace($row);
273
-
274
-	// Administrateurs
275
-	if (in_array($GLOBALS['connect_statut'], explode(',', _STATUT_AUTEUR_RUBRIQUE))) {
276
-		if (
277
-			isset($GLOBALS['visiteur_session']['restreint'])
278
-			and is_array($GLOBALS['visiteur_session']['restreint'])
279
-		) {
280
-			$GLOBALS['connect_id_rubrique'] = $GLOBALS['visiteur_session']['restreint'];
281
-		}
282
-		if ($GLOBALS['connect_statut'] == '0minirezo') {
283
-			$GLOBALS['connect_toutes_rubriques'] = !$GLOBALS['connect_id_rubrique'];
284
-		}
285
-	}
286
-
287
-	// Pour les redacteurs, inc_version a fait l'initialisation minimale
288
-
289
-	return ''; // i.e. pas de pb.
210
+    include_spip('inc/autoriser');
211
+    if (!autoriser('loger', '', 0, $row)) {
212
+        return false;
213
+    }
214
+
215
+
216
+    if ($row['statut'] == 'nouveau') {
217
+        include_spip('action/inscrire_auteur');
218
+        $row = confirmer_statut_inscription($row);
219
+    }
220
+
221
+    $GLOBALS['connect_id_auteur'] = $row['id_auteur'];
222
+    $GLOBALS['connect_login'] = $row['login'];
223
+    $GLOBALS['connect_statut'] = $row['statut'];
224
+
225
+    $GLOBALS['visiteur_session'] = array_merge((array)$GLOBALS['visiteur_session'], $row);
226
+
227
+    // au cas ou : ne pas memoriser les champs sensibles
228
+    unset($GLOBALS['visiteur_session']['pass']);
229
+    unset($GLOBALS['visiteur_session']['htpass']);
230
+    unset($GLOBALS['visiteur_session']['alea_actuel']);
231
+    unset($GLOBALS['visiteur_session']['alea_futur']);
232
+    unset($GLOBALS['visiteur_session']['ldap_password']);
233
+
234
+    // creer la session au besoin
235
+    if (!isset($_COOKIE['spip_session'])) {
236
+        $session = charger_fonction('session', 'inc');
237
+        $spip_session = $session($row);
238
+    }
239
+
240
+    // reinjecter les preferences_auteur apres le reset de spip_session
241
+    // car utilisees au retour par auth_loger()
242
+    $r = @unserialize($row['prefs']);
243
+    $GLOBALS['visiteur_session']['prefs'] = ($r ?: []);
244
+    // si prefs pas definies, les definir par defaut
245
+    if (!isset($GLOBALS['visiteur_session']['prefs']['couleur'])) {
246
+        $GLOBALS['visiteur_session']['prefs']['couleur'] = 2;
247
+        $GLOBALS['visiteur_session']['prefs']['display'] = 2;
248
+        $GLOBALS['visiteur_session']['prefs']['display_navigation'] = 'navigation_avec_icones';
249
+        $GLOBALS['visiteur_session']['prefs']['display_outils'] = 'oui';
250
+    }
251
+
252
+    $GLOBALS['visiteur_session'] = pipeline(
253
+        'preparer_visiteur_session',
254
+        ['args' => ['row' => $row],
255
+        'data' => $GLOBALS['visiteur_session']]
256
+    );
257
+
258
+    // Etablir les droits selon le codage attendu
259
+    // dans ecrire/index.php ecrire/prive.php
260
+
261
+    // Pas autorise a acceder a ecrire ? renvoyer le tableau
262
+    // A noter : le premier appel a autoriser() a le bon gout
263
+    // d'initialiser $GLOBALS['visiteur_session']['restreint'],
264
+    // qui ne figure pas dans le fichier de session
265
+
266
+    if (!autoriser('ecrire')) {
267
+        return $row;
268
+    }
269
+
270
+    // autoriser('ecrire') ne laisse passer que les Admin et les Redac
271
+
272
+    auth_trace($row);
273
+
274
+    // Administrateurs
275
+    if (in_array($GLOBALS['connect_statut'], explode(',', _STATUT_AUTEUR_RUBRIQUE))) {
276
+        if (
277
+            isset($GLOBALS['visiteur_session']['restreint'])
278
+            and is_array($GLOBALS['visiteur_session']['restreint'])
279
+        ) {
280
+            $GLOBALS['connect_id_rubrique'] = $GLOBALS['visiteur_session']['restreint'];
281
+        }
282
+        if ($GLOBALS['connect_statut'] == '0minirezo') {
283
+            $GLOBALS['connect_toutes_rubriques'] = !$GLOBALS['connect_id_rubrique'];
284
+        }
285
+    }
286
+
287
+    // Pour les redacteurs, inc_version a fait l'initialisation minimale
288
+
289
+    return ''; // i.e. pas de pb.
290 290
 }
291 291
 
292 292
 /**
@@ -295,23 +295,23 @@  discard block
 block discarded – undo
295 295
  * @return string
296 296
  */
297 297
 function auth_a_loger() {
298
-	$redirect = generer_url_public('login', 'url=' . rawurlencode(self('&', true)), true);
299
-
300
-	// un echec au "bonjour" (login initial) quand le statut est
301
-	// inconnu signale sans doute un probleme de cookies
302
-	if (isset($_GET['bonjour'])) {
303
-		$redirect = parametre_url(
304
-			$redirect,
305
-			'var_erreur',
306
-			(!isset($GLOBALS['visiteur_session']['statut'])
307
-				? 'cookie'
308
-				: 'statut'
309
-			),
310
-			'&'
311
-		);
312
-	}
313
-
314
-	return $redirect;
298
+    $redirect = generer_url_public('login', 'url=' . rawurlencode(self('&', true)), true);
299
+
300
+    // un echec au "bonjour" (login initial) quand le statut est
301
+    // inconnu signale sans doute un probleme de cookies
302
+    if (isset($_GET['bonjour'])) {
303
+        $redirect = parametre_url(
304
+            $redirect,
305
+            'var_erreur',
306
+            (!isset($GLOBALS['visiteur_session']['statut'])
307
+                ? 'cookie'
308
+                : 'statut'
309
+            ),
310
+            '&'
311
+        );
312
+    }
313
+
314
+    return $redirect;
315 315
 }
316 316
 
317 317
 /**
@@ -323,19 +323,19 @@  discard block
 block discarded – undo
323 323
  * @param null|string $date
324 324
  */
325 325
 function auth_trace($row, $date = null) {
326
-	// Indiquer la connexion. A la minute pres ca suffit.
327
-	if (!is_numeric($connect_quand = $row['quand'] ?? '')) {
328
-		$connect_quand = strtotime($connect_quand);
329
-	}
326
+    // Indiquer la connexion. A la minute pres ca suffit.
327
+    if (!is_numeric($connect_quand = $row['quand'] ?? '')) {
328
+        $connect_quand = strtotime($connect_quand);
329
+    }
330 330
 
331
-	$date ??= date('Y-m-d H:i:s');
331
+    $date ??= date('Y-m-d H:i:s');
332 332
 
333
-	if (abs(strtotime($date) - $connect_quand) >= 60) {
334
-		sql_updateq('spip_auteurs', ['en_ligne' => $date], 'id_auteur=' . intval($row['id_auteur']));
335
-		$row['en_ligne'] = $date;
336
-	}
333
+    if (abs(strtotime($date) - $connect_quand) >= 60) {
334
+        sql_updateq('spip_auteurs', ['en_ligne' => $date], 'id_auteur=' . intval($row['id_auteur']));
335
+        $row['en_ligne'] = $date;
336
+    }
337 337
 
338
-	pipeline('trig_auth_trace', ['args' => ['row' => $row, 'date' => $date]]);
338
+    pipeline('trig_auth_trace', ['args' => ['row' => $row, 'date' => $date]]);
339 339
 }
340 340
 
341 341
 
@@ -361,28 +361,28 @@  discard block
 block discarded – undo
361 361
  * @return mixed
362 362
  */
363 363
 function auth_administrer($fonction, $args, $defaut = false) {
364
-	$auth_methode = array_shift($args);
365
-	$auth_methode = $auth_methode ?: 'spip'; // valeur par defaut au cas ou
366
-	if (
367
-		$auth = charger_fonction($auth_methode, 'auth', true)
368
-		and function_exists($f = "auth_{$auth_methode}_$fonction")
369
-	) {
370
-		$res = $f(...$args);
371
-	} else {
372
-		$res = $defaut;
373
-	}
374
-	$res = pipeline(
375
-		'auth_administrer',
376
-		[
377
-			'args' => [
378
-				'fonction' => $fonction,
379
-				'methode' => $auth_methode,
380
-				'args' => $args
381
-			],
382
-			'data' => $res
383
-		]
384
-	);
385
-	return $res;
364
+    $auth_methode = array_shift($args);
365
+    $auth_methode = $auth_methode ?: 'spip'; // valeur par defaut au cas ou
366
+    if (
367
+        $auth = charger_fonction($auth_methode, 'auth', true)
368
+        and function_exists($f = "auth_{$auth_methode}_$fonction")
369
+    ) {
370
+        $res = $f(...$args);
371
+    } else {
372
+        $res = $defaut;
373
+    }
374
+    $res = pipeline(
375
+        'auth_administrer',
376
+        [
377
+            'args' => [
378
+                'fonction' => $fonction,
379
+                'methode' => $auth_methode,
380
+                'args' => $args
381
+            ],
382
+            'data' => $res
383
+        ]
384
+    );
385
+    return $res;
386 386
 }
387 387
 
388 388
 /**
@@ -392,11 +392,11 @@  discard block
 block discarded – undo
392 392
  * @return array
393 393
  */
394 394
 function auth_formulaire_login($flux) {
395
-	foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
396
-		$flux = auth_administrer('formulaire_login', [$methode, $flux], $flux);
397
-	}
395
+    foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
396
+        $flux = auth_administrer('formulaire_login', [$methode, $flux], $flux);
397
+    }
398 398
 
399
-	return $flux;
399
+    return $flux;
400 400
 }
401 401
 
402 402
 
@@ -410,19 +410,19 @@  discard block
 block discarded – undo
410 410
  * @return string/bool
411 411
  */
412 412
 function auth_retrouver_login($login, $serveur = '') {
413
-	if (!spip_connect($serveur)) {
414
-		include_spip('inc/minipres');
415
-		echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'));
416
-		exit;
417
-	}
418
-
419
-	foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
420
-		if ($auteur = auth_administrer('retrouver_login', [$methode, $login, $serveur])) {
421
-			return $auteur;
422
-		}
423
-	}
424
-
425
-	return false;
413
+    if (!spip_connect($serveur)) {
414
+        include_spip('inc/minipres');
415
+        echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'));
416
+        exit;
417
+    }
418
+
419
+    foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
420
+        if ($auteur = auth_administrer('retrouver_login', [$methode, $login, $serveur])) {
421
+            return $auteur;
422
+        }
423
+    }
424
+
425
+    return false;
426 426
 }
427 427
 
428 428
 /**
@@ -437,34 +437,34 @@  discard block
 block discarded – undo
437 437
  * @return array
438 438
  */
439 439
 function auth_informer_login($login, $serveur = '') {
440
-	if (
441
-		!$login
442
-		or !$login_base = auth_retrouver_login($login, $serveur)
443
-		or !$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur)
444
-	) {
445
-		// generer de fausses infos, mais credibles, pour eviter une attaque
446
-		// https://core.spip.net/issues/1758 + https://core.spip.net/issues/3691
447
-
448
-		$row = [
449
-			'login' => $login,
450
-			'cnx' => '0',
451
-			'logo' => '',
452
-		];
453
-
454
-		return $row;
455
-	}
456
-
457
-	$prefs = @unserialize($row['prefs']);
458
-	$infos = [
459
-		'id_auteur' => $row['id_auteur'],
460
-		'login' => $row['login'],
461
-		'cnx' => (isset($prefs['cnx']) and $prefs['cnx'] === 'perma') ? '1' : '0',
462
-		'logo' => recuperer_fond('formulaires/inc-logo_auteur', $row),
463
-	];
464
-
465
-	verifier_visiteur();
466
-
467
-	return auth_administrer('informer_login', [$row['source'], $infos, $row, $serveur], $infos);
440
+    if (
441
+        !$login
442
+        or !$login_base = auth_retrouver_login($login, $serveur)
443
+        or !$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur)
444
+    ) {
445
+        // generer de fausses infos, mais credibles, pour eviter une attaque
446
+        // https://core.spip.net/issues/1758 + https://core.spip.net/issues/3691
447
+
448
+        $row = [
449
+            'login' => $login,
450
+            'cnx' => '0',
451
+            'logo' => '',
452
+        ];
453
+
454
+        return $row;
455
+    }
456
+
457
+    $prefs = @unserialize($row['prefs']);
458
+    $infos = [
459
+        'id_auteur' => $row['id_auteur'],
460
+        'login' => $row['login'],
461
+        'cnx' => (isset($prefs['cnx']) and $prefs['cnx'] === 'perma') ? '1' : '0',
462
+        'logo' => recuperer_fond('formulaires/inc-logo_auteur', $row),
463
+    ];
464
+
465
+    verifier_visiteur();
466
+
467
+    return auth_administrer('informer_login', [$row['source'], $infos, $row, $serveur], $infos);
468 468
 }
469 469
 
470 470
 
@@ -478,21 +478,21 @@  discard block
 block discarded – undo
478 478
  * @return mixed
479 479
  */
480 480
 function auth_identifier_login($login, $password, $serveur = '') {
481
-	$erreur = '';
482
-	foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
483
-		if ($auth = charger_fonction($methode, 'auth', true)) {
484
-			$auteur = $auth($login, $password, $serveur);
485
-			if (is_array($auteur) and count($auteur)) {
486
-				spip_log("connexion de $login par methode $methode");
487
-				$auteur['auth'] = $methode;
488
-				return $auteur;
489
-			} elseif (is_string($auteur)) {
490
-				$erreur .= "$auteur ";
491
-			}
492
-		}
493
-	}
494
-
495
-	return $erreur;
481
+    $erreur = '';
482
+    foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
483
+        if ($auth = charger_fonction($methode, 'auth', true)) {
484
+            $auteur = $auth($login, $password, $serveur);
485
+            if (is_array($auteur) and count($auteur)) {
486
+                spip_log("connexion de $login par methode $methode");
487
+                $auteur['auth'] = $methode;
488
+                return $auteur;
489
+            } elseif (is_string($auteur)) {
490
+                $erreur .= "$auteur ";
491
+            }
492
+        }
493
+    }
494
+
495
+    return $erreur;
496 496
 }
497 497
 
498 498
 /**
@@ -506,8 +506,8 @@  discard block
 block discarded – undo
506 506
  * @return string
507 507
  */
508 508
 function auth_url_retour_login($auth_methode, $login, $redirect = '', $serveur = '') {
509
-	$securiser_action = charger_fonction('securiser_action', 'inc');
510
-	return $securiser_action('auth', "$auth_methode/$login", $redirect, true);
509
+    $securiser_action = charger_fonction('securiser_action', 'inc');
510
+    return $securiser_action('auth', "$auth_methode/$login", $redirect, true);
511 511
 }
512 512
 
513 513
 /**
@@ -521,9 +521,9 @@  discard block
 block discarded – undo
521 521
  * @return mixed
522 522
  */
523 523
 function auth_terminer_identifier_login($auth_methode, $login, $serveur = '') {
524
-	$args = func_get_args();
525
-	$auteur = auth_administrer('terminer_identifier_login', $args);
526
-	return $auteur;
524
+    $args = func_get_args();
525
+    $auteur = auth_administrer('terminer_identifier_login', $args);
526
+    return $auteur;
527 527
 }
528 528
 
529 529
 /**
@@ -533,29 +533,29 @@  discard block
 block discarded – undo
533 533
  * @return bool
534 534
  */
535 535
 function auth_loger($auteur) {
536
-	if (!is_array($auteur) or !count($auteur)) {
537
-		return false;
538
-	}
539
-
540
-	// initialiser et poser le cookie de session
541
-	unset($_COOKIE['spip_session']);
542
-	if (auth_init_droits($auteur) === false) {
543
-		return false;
544
-	}
545
-
546
-	// initialiser les prefs
547
-	$p = $GLOBALS['visiteur_session']['prefs'];
548
-	$p['cnx'] = (isset($auteur['cookie']) and $auteur['cookie'] == 'oui') ? 'perma' : '';
549
-
550
-	sql_updateq(
551
-		'spip_auteurs',
552
-		['prefs' => serialize($p)],
553
-		'id_auteur=' . intval($auteur['id_auteur'])
554
-	);
555
-
556
-	//  bloquer ici le visiteur qui tente d'abuser de ses droits
557
-	verifier_visiteur();
558
-	return true;
536
+    if (!is_array($auteur) or !count($auteur)) {
537
+        return false;
538
+    }
539
+
540
+    // initialiser et poser le cookie de session
541
+    unset($_COOKIE['spip_session']);
542
+    if (auth_init_droits($auteur) === false) {
543
+        return false;
544
+    }
545
+
546
+    // initialiser les prefs
547
+    $p = $GLOBALS['visiteur_session']['prefs'];
548
+    $p['cnx'] = (isset($auteur['cookie']) and $auteur['cookie'] == 'oui') ? 'perma' : '';
549
+
550
+    sql_updateq(
551
+        'spip_auteurs',
552
+        ['prefs' => serialize($p)],
553
+        'id_auteur=' . intval($auteur['id_auteur'])
554
+    );
555
+
556
+    //  bloquer ici le visiteur qui tente d'abuser de ses droits
557
+    verifier_visiteur();
558
+    return true;
559 559
 }
560 560
 
561 561
 /**
@@ -565,8 +565,8 @@  discard block
 block discarded – undo
565 565
  * return void
566 566
  **/
567 567
 function auth_deloger() {
568
-	$logout = charger_fonction('logout', 'action');
569
-	$logout();
568
+    $logout = charger_fonction('logout', 'action');
569
+    $logout();
570 570
 }
571 571
 
572 572
 /**
@@ -580,8 +580,8 @@  discard block
 block discarded – undo
580 580
  * @return bool
581 581
  */
582 582
 function auth_autoriser_modifier_login($auth_methode, $serveur = '') {
583
-	$args = func_get_args();
584
-	return auth_administrer('autoriser_modifier_login', $args);
583
+    $args = func_get_args();
584
+    return auth_administrer('autoriser_modifier_login', $args);
585 585
 }
586 586
 
587 587
 /**
@@ -596,8 +596,8 @@  discard block
 block discarded – undo
596 596
  *  message d'erreur ou chaine vide si pas d'erreur
597 597
  */
598 598
 function auth_verifier_login($auth_methode, $new_login, $id_auteur = 0, $serveur = '') {
599
-	$args = func_get_args();
600
-	return auth_administrer('verifier_login', $args, '');
599
+    $args = func_get_args();
600
+    return auth_administrer('verifier_login', $args, '');
601 601
 }
602 602
 
603 603
 /**
@@ -610,8 +610,8 @@  discard block
 block discarded – undo
610 610
  * @return bool
611 611
  */
612 612
 function auth_modifier_login($auth_methode, $new_login, $id_auteur, $serveur = '') {
613
-	$args = func_get_args();
614
-	return auth_administrer('modifier_login', $args);
613
+    $args = func_get_args();
614
+    return auth_administrer('modifier_login', $args);
615 615
 }
616 616
 
617 617
 /**
@@ -626,8 +626,8 @@  discard block
 block discarded – undo
626 626
  *  succès ou échec
627 627
  */
628 628
 function auth_autoriser_modifier_pass($auth_methode, $serveur = '') {
629
-	$args = func_get_args();
630
-	return auth_administrer('autoriser_modifier_pass', $args);
629
+    $args = func_get_args();
630
+    return auth_administrer('autoriser_modifier_pass', $args);
631 631
 }
632 632
 
633 633
 /**
@@ -643,8 +643,8 @@  discard block
 block discarded – undo
643 643
  *  message d'erreur ou chaine vide si pas d'erreur
644 644
  */
645 645
 function auth_verifier_pass($auth_methode, $login, $new_pass, $id_auteur = 0, $serveur = '') {
646
-	$args = func_get_args();
647
-	return auth_administrer('verifier_pass', $args, '');
646
+    $args = func_get_args();
647
+    return auth_administrer('verifier_pass', $args, '');
648 648
 }
649 649
 
650 650
 /**
@@ -660,8 +660,8 @@  discard block
 block discarded – undo
660 660
  *  succes ou echec
661 661
  */
662 662
 function auth_modifier_pass($auth_methode, $login, $new_pass, $id_auteur, $serveur = '') {
663
-	$args = func_get_args();
664
-	return auth_administrer('modifier_pass', $args);
663
+    $args = func_get_args();
664
+    return auth_administrer('modifier_pass', $args);
665 665
 }
666 666
 
667 667
 /**
@@ -677,24 +677,24 @@  discard block
 block discarded – undo
677 677
  * @return void
678 678
  */
679 679
 function auth_synchroniser_distant(
680
-	$auth_methode = true,
681
-	$id_auteur = 0,
682
-	$champs = [],
683
-	$options = [],
684
-	$serveur = ''
680
+    $auth_methode = true,
681
+    $id_auteur = 0,
682
+    $champs = [],
683
+    $options = [],
684
+    $serveur = ''
685 685
 ) {
686
-	$args = func_get_args();
687
-	if ($auth_methode === true or (isset($options['all']) and $options['all'] == true)) {
688
-		$options['all'] = true; // ajouter une option all=>true pour chaque auth
689
-		$args = [true, $id_auteur, $champs, $options, $serveur];
690
-		foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
691
-			array_shift($args);
692
-			array_unshift($args, $methode);
693
-			auth_administrer('synchroniser_distant', $args);
694
-		}
695
-	} else {
696
-		auth_administrer('synchroniser_distant', $args);
697
-	}
686
+    $args = func_get_args();
687
+    if ($auth_methode === true or (isset($options['all']) and $options['all'] == true)) {
688
+        $options['all'] = true; // ajouter une option all=>true pour chaque auth
689
+        $args = [true, $id_auteur, $champs, $options, $serveur];
690
+        foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
691
+            array_shift($args);
692
+            array_unshift($args, $methode);
693
+            auth_administrer('synchroniser_distant', $args);
694
+        }
695
+    } else {
696
+        auth_administrer('synchroniser_distant', $args);
697
+    }
698 698
 }
699 699
 
700 700
 
@@ -707,45 +707,45 @@  discard block
 block discarded – undo
707 707
  * @return array|bool
708 708
  */
709 709
 function lire_php_auth($login, $pw, $serveur = '') {
710
-	if (
711
-		!$login
712
-		or !$login = auth_retrouver_login($login, $serveur)
713
-	) {
714
-		return false;
715
-	}
716
-
717
-	$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login, $serveur, 'text'), '', '', '', '', $serveur);
718
-
719
-	if (!$row) {
720
-		if (
721
-			include_spip('inc/auth')
722
-			and auth_ldap_connect($serveur)
723
-			and $auth_ldap = charger_fonction('ldap', 'auth', true)
724
-		) {
725
-			return $auth_ldap($login, $pw, $serveur, true);
726
-		}
727
-
728
-		return false;
729
-	}
730
-	// su pas de source definie
731
-	// ou auth/xxx introuvable, utiliser 'spip'
732
-	if (
733
-		!$auth_methode = $row['source']
734
-		or !$auth = charger_fonction($auth_methode, 'auth', true)
735
-	) {
736
-		$auth = charger_fonction('spip', 'auth', true);
737
-	}
738
-
739
-	$auteur = '';
740
-	if ($auth) {
741
-		$auteur = $auth($login, $pw, $serveur, true);
742
-	}
743
-	// verifier que ce n'est pas un message d'erreur
744
-	if (is_array($auteur) and count($auteur)) {
745
-		return $auteur;
746
-	}
747
-
748
-	return false;
710
+    if (
711
+        !$login
712
+        or !$login = auth_retrouver_login($login, $serveur)
713
+    ) {
714
+        return false;
715
+    }
716
+
717
+    $row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login, $serveur, 'text'), '', '', '', '', $serveur);
718
+
719
+    if (!$row) {
720
+        if (
721
+            include_spip('inc/auth')
722
+            and auth_ldap_connect($serveur)
723
+            and $auth_ldap = charger_fonction('ldap', 'auth', true)
724
+        ) {
725
+            return $auth_ldap($login, $pw, $serveur, true);
726
+        }
727
+
728
+        return false;
729
+    }
730
+    // su pas de source definie
731
+    // ou auth/xxx introuvable, utiliser 'spip'
732
+    if (
733
+        !$auth_methode = $row['source']
734
+        or !$auth = charger_fonction($auth_methode, 'auth', true)
735
+    ) {
736
+        $auth = charger_fonction('spip', 'auth', true);
737
+    }
738
+
739
+    $auteur = '';
740
+    if ($auth) {
741
+        $auteur = $auth($login, $pw, $serveur, true);
742
+    }
743
+    // verifier que ce n'est pas un message d'erreur
744
+    if (is_array($auteur) and count($auteur)) {
745
+        return $auteur;
746
+    }
747
+
748
+    return false;
749 749
 }
750 750
 
751 751
 /**
@@ -761,21 +761,21 @@  discard block
 block discarded – undo
761 761
  * @param string $lien
762 762
  */
763 763
 function ask_php_auth($pb, $raison, $retour = '', $url = '', $re = '', $lien = '') {
764
-	@Header('WWW-Authenticate: Basic realm="espace prive"');
765
-	@Header('HTTP/1.0 401 Unauthorized');
766
-	$corps = '';
767
-	$public = generer_url_public();
768
-	$ecrire = generer_url_ecrire();
769
-	$retour = $retour ?: _T('icone_retour');
770
-	$corps .= "<p>$raison</p>[<a href='$public'>$retour</a>] ";
771
-	if ($url) {
772
-		$corps .= "[<a href='" . generer_url_action('cookie', "essai_auth_http=oui&$url") . "'>$re</a>]";
773
-	}
774
-
775
-	if ($lien) {
776
-		$corps .= " [<a href='$ecrire'>" . _T('login_espace_prive') . '</a>]';
777
-	}
778
-	include_spip('inc/minipres');
779
-	echo minipres($pb, $corps);
780
-	exit;
764
+    @Header('WWW-Authenticate: Basic realm="espace prive"');
765
+    @Header('HTTP/1.0 401 Unauthorized');
766
+    $corps = '';
767
+    $public = generer_url_public();
768
+    $ecrire = generer_url_ecrire();
769
+    $retour = $retour ?: _T('icone_retour');
770
+    $corps .= "<p>$raison</p>[<a href='$public'>$retour</a>] ";
771
+    if ($url) {
772
+        $corps .= "[<a href='" . generer_url_action('cookie', "essai_auth_http=oui&$url") . "'>$re</a>]";
773
+    }
774
+
775
+    if ($lien) {
776
+        $corps .= " [<a href='$ecrire'>" . _T('login_espace_prive') . '</a>]';
777
+    }
778
+    include_spip('inc/minipres');
779
+    echo minipres($pb, $corps);
780
+    exit;
781 781
 }
Please login to merge, or discard this patch.
Spacing   +12 added lines, -13 removed lines patch added patch discarded remove patch
@@ -59,7 +59,7 @@  discard block
 block discarded – undo
59 59
 	}
60 60
 
61 61
 	$n = intval(sql_errno());
62
-	spip_log("Erreur base de donnees $n " . sql_error());
62
+	spip_log("Erreur base de donnees $n ".sql_error());
63 63
 
64 64
 	return $n ?: 1;
65 65
 }
@@ -85,11 +85,11 @@  discard block
 block discarded – undo
85 85
 		// erreur SQL a afficher
86 86
 		$raison = minipres(
87 87
 			_T('info_travaux_titre'),
88
-			_T('titre_probleme_technique') . '<p><tt>' . sql_errno() . ' ' . sql_error() . '</tt></p>'
88
+			_T('titre_probleme_technique').'<p><tt>'.sql_errno().' '.sql_error().'</tt></p>'
89 89
 		);
90 90
 	} elseif (@$raison['statut']) {
91 91
 		// un simple visiteur n'a pas acces a l'espace prive
92
-		spip_log('connexion refusee a ' . @$raison['id_auteur']);
92
+		spip_log('connexion refusee a '.@$raison['id_auteur']);
93 93
 		$raison = minipres(_T('avis_erreur_connexion'), _T('avis_erreur_visiteur'));
94 94
 	} else {
95 95
 		// auteur en fin de droits ...
@@ -179,8 +179,7 @@  discard block
 block discarded – undo
179 179
 	$where = (is_numeric($id_auteur)
180 180
 		/*AND $id_auteur>0*/ // reprise lors des restaurations
181 181
 	) ?
182
-		"id_auteur=$id_auteur" :
183
-		(!strlen($GLOBALS['connect_login']) ? '' : 'login=' . sql_quote($GLOBALS['connect_login'], '', 'text'));
182
+		"id_auteur=$id_auteur" : (!strlen($GLOBALS['connect_login']) ? '' : 'login='.sql_quote($GLOBALS['connect_login'], '', 'text'));
184 183
 
185 184
 	if (!$where) {
186 185
 		return '';
@@ -222,7 +221,7 @@  discard block
 block discarded – undo
222 221
 	$GLOBALS['connect_login'] = $row['login'];
223 222
 	$GLOBALS['connect_statut'] = $row['statut'];
224 223
 
225
-	$GLOBALS['visiteur_session'] = array_merge((array)$GLOBALS['visiteur_session'], $row);
224
+	$GLOBALS['visiteur_session'] = array_merge((array) $GLOBALS['visiteur_session'], $row);
226 225
 
227 226
 	// au cas ou : ne pas memoriser les champs sensibles
228 227
 	unset($GLOBALS['visiteur_session']['pass']);
@@ -295,7 +294,7 @@  discard block
 block discarded – undo
295 294
  * @return string
296 295
  */
297 296
 function auth_a_loger() {
298
-	$redirect = generer_url_public('login', 'url=' . rawurlencode(self('&', true)), true);
297
+	$redirect = generer_url_public('login', 'url='.rawurlencode(self('&', true)), true);
299 298
 
300 299
 	// un echec au "bonjour" (login initial) quand le statut est
301 300
 	// inconnu signale sans doute un probleme de cookies
@@ -331,7 +330,7 @@  discard block
 block discarded – undo
331 330
 	$date ??= date('Y-m-d H:i:s');
332 331
 
333 332
 	if (abs(strtotime($date) - $connect_quand) >= 60) {
334
-		sql_updateq('spip_auteurs', ['en_ligne' => $date], 'id_auteur=' . intval($row['id_auteur']));
333
+		sql_updateq('spip_auteurs', ['en_ligne' => $date], 'id_auteur='.intval($row['id_auteur']));
335 334
 		$row['en_ligne'] = $date;
336 335
 	}
337 336
 
@@ -440,7 +439,7 @@  discard block
 block discarded – undo
440 439
 	if (
441 440
 		!$login
442 441
 		or !$login_base = auth_retrouver_login($login, $serveur)
443
-		or !$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur)
442
+		or !$row = sql_fetsel('*', 'spip_auteurs', 'login='.sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur)
444 443
 	) {
445 444
 		// generer de fausses infos, mais credibles, pour eviter une attaque
446 445
 		// https://core.spip.net/issues/1758 + https://core.spip.net/issues/3691
@@ -550,7 +549,7 @@  discard block
 block discarded – undo
550 549
 	sql_updateq(
551 550
 		'spip_auteurs',
552 551
 		['prefs' => serialize($p)],
553
-		'id_auteur=' . intval($auteur['id_auteur'])
552
+		'id_auteur='.intval($auteur['id_auteur'])
554 553
 	);
555 554
 
556 555
 	//  bloquer ici le visiteur qui tente d'abuser de ses droits
@@ -714,7 +713,7 @@  discard block
 block discarded – undo
714 713
 		return false;
715 714
 	}
716 715
 
717
-	$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login, $serveur, 'text'), '', '', '', '', $serveur);
716
+	$row = sql_fetsel('*', 'spip_auteurs', 'login='.sql_quote($login, $serveur, 'text'), '', '', '', '', $serveur);
718 717
 
719 718
 	if (!$row) {
720 719
 		if (
@@ -769,11 +768,11 @@  discard block
 block discarded – undo
769 768
 	$retour = $retour ?: _T('icone_retour');
770 769
 	$corps .= "<p>$raison</p>[<a href='$public'>$retour</a>] ";
771 770
 	if ($url) {
772
-		$corps .= "[<a href='" . generer_url_action('cookie', "essai_auth_http=oui&$url") . "'>$re</a>]";
771
+		$corps .= "[<a href='".generer_url_action('cookie', "essai_auth_http=oui&$url")."'>$re</a>]";
773 772
 	}
774 773
 
775 774
 	if ($lien) {
776
-		$corps .= " [<a href='$ecrire'>" . _T('login_espace_prive') . '</a>]';
775
+		$corps .= " [<a href='$ecrire'>"._T('login_espace_prive').'</a>]';
777 776
 	}
778 777
 	include_spip('inc/minipres');
779 778
 	echo minipres($pb, $corps);
Please login to merge, or discard this patch.
ecrire/inc/utils.php 2 patches
Indentation   +2258 added lines, -2259 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,322 +2484,322 @@  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
-	//
2723
-	// Capacites php (en fonction de la version)
2724
-	//
2725
-	$GLOBALS['flag_ob'] = (function_exists('ob_start')
2726
-		&& function_exists('ini_get')
2727
-		&& !strstr(@ini_get('disable_functions'), 'ob_'));
2728
-	$GLOBALS['flag_sapi_name'] = function_exists('php_sapi_name');
2729
-	$GLOBALS['flag_get_cfg_var'] = (@get_cfg_var('error_reporting') != '');
2730
-	$GLOBALS['flag_upload'] = (!$GLOBALS['flag_get_cfg_var'] ||
2731
-		(get_cfg_var('upload_max_filesize') > 0));
2732
-
2733
-
2734
-	// Compatibilite avec serveurs ne fournissant pas $REQUEST_URI
2735
-	if (isset($_SERVER['REQUEST_URI'])) {
2736
-		$GLOBALS['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
2737
-	} else {
2738
-		$GLOBALS['REQUEST_URI'] = (php_sapi_name() !== 'cli') ? $_SERVER['PHP_SELF'] : '';
2739
-		if (
2740
-			!empty($_SERVER['QUERY_STRING'])
2741
-			and !strpos($_SERVER['REQUEST_URI'], '?')
2742
-		) {
2743
-			$GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
2744
-		}
2745
-	}
2746
-
2747
-	// Duree de validite de l'alea pour les cookies et ce qui s'ensuit.
2748
-	if (!defined('_RENOUVELLE_ALEA')) {
2749
-		define('_RENOUVELLE_ALEA', 12 * 3600);
2750
-	}
2751
-	if (!defined('_DUREE_COOKIE_ADMIN')) {
2752
-		define('_DUREE_COOKIE_ADMIN', 14 * 24 * 3600);
2753
-	}
2754
-
2755
-	// charger les meta si possible et renouveller l'alea au besoin
2756
-	// charge aussi effacer_meta et ecrire_meta
2757
-	$inc_meta = charger_fonction('meta', 'inc');
2758
-	$inc_meta();
2759
-
2760
-	// nombre de repertoires depuis la racine
2761
-	// on compare a l'adresse de spip.php : $_SERVER["SCRIPT_NAME"]
2762
-	// ou a defaut celle donnee en meta ; (mais si celle-ci est fausse
2763
-	// le calcul est faux)
2764
-	if (!_DIR_RESTREINT) {
2765
-		$GLOBALS['profondeur_url'] = 1;
2766
-	} else {
2767
-		$uri = isset($_SERVER['REQUEST_URI']) ? explode('?', $_SERVER['REQUEST_URI']) : '';
2768
-		$uri_ref = $_SERVER['SCRIPT_NAME'];
2769
-		if (
2770
-			!$uri_ref
2771
-			// si on est appele avec un autre ti, on est sans doute en mutu
2772
-			// si jamais c'est de la mutu avec sous rep, on est perdu si on se fie
2773
-			// a spip.php qui est a la racine du spip, et vue qu'on sait pas se reperer
2774
-			// s'en remettre a l'adresse du site. alea jacta est.
2775
-			or $ti !== _NOM_TEMPORAIRES_INACCESSIBLES
2776
-		) {
2777
-			if (isset($GLOBALS['meta']['adresse_site'])) {
2778
-				$uri_ref = parse_url($GLOBALS['meta']['adresse_site']);
2779
-				$uri_ref = ($uri_ref['path'] ?? '') . '/';
2780
-			} else {
2781
-				$uri_ref = '';
2782
-			}
2783
-		}
2784
-		if (!$uri or !$uri_ref) {
2785
-			$GLOBALS['profondeur_url'] = 0;
2786
-		} else {
2787
-			$GLOBALS['profondeur_url'] = max(
2788
-				0,
2789
-				substr_count($uri[0], '/')
2790
-				- substr_count($uri_ref, '/')
2791
-			);
2792
-		}
2793
-	}
2794
-	// s'il y a un cookie ou PHP_AUTH, initialiser visiteur_session
2795
-	if (_FILE_CONNECT) {
2796
-		if (
2797
-			verifier_visiteur() == '0minirezo'
2798
-			// si c'est un admin sans cookie admin, il faut ignorer le cache chemin !
2799
-			and !isset($_COOKIE['spip_admin'])
2800
-		) {
2801
-			clear_path_cache();
2802
-		}
2803
-	}
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
+    //
2722
+    // Capacites php (en fonction de la version)
2723
+    //
2724
+    $GLOBALS['flag_ob'] = (function_exists('ob_start')
2725
+        && function_exists('ini_get')
2726
+        && !strstr(@ini_get('disable_functions'), 'ob_'));
2727
+    $GLOBALS['flag_sapi_name'] = function_exists('php_sapi_name');
2728
+    $GLOBALS['flag_get_cfg_var'] = (@get_cfg_var('error_reporting') != '');
2729
+    $GLOBALS['flag_upload'] = (!$GLOBALS['flag_get_cfg_var'] ||
2730
+        (get_cfg_var('upload_max_filesize') > 0));
2731
+
2732
+
2733
+    // Compatibilite avec serveurs ne fournissant pas $REQUEST_URI
2734
+    if (isset($_SERVER['REQUEST_URI'])) {
2735
+        $GLOBALS['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
2736
+    } else {
2737
+        $GLOBALS['REQUEST_URI'] = (php_sapi_name() !== 'cli') ? $_SERVER['PHP_SELF'] : '';
2738
+        if (
2739
+            !empty($_SERVER['QUERY_STRING'])
2740
+            and !strpos($_SERVER['REQUEST_URI'], '?')
2741
+        ) {
2742
+            $GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
2743
+        }
2744
+    }
2745
+
2746
+    // Duree de validite de l'alea pour les cookies et ce qui s'ensuit.
2747
+    if (!defined('_RENOUVELLE_ALEA')) {
2748
+        define('_RENOUVELLE_ALEA', 12 * 3600);
2749
+    }
2750
+    if (!defined('_DUREE_COOKIE_ADMIN')) {
2751
+        define('_DUREE_COOKIE_ADMIN', 14 * 24 * 3600);
2752
+    }
2753
+
2754
+    // charger les meta si possible et renouveller l'alea au besoin
2755
+    // charge aussi effacer_meta et ecrire_meta
2756
+    $inc_meta = charger_fonction('meta', 'inc');
2757
+    $inc_meta();
2758
+
2759
+    // nombre de repertoires depuis la racine
2760
+    // on compare a l'adresse de spip.php : $_SERVER["SCRIPT_NAME"]
2761
+    // ou a defaut celle donnee en meta ; (mais si celle-ci est fausse
2762
+    // le calcul est faux)
2763
+    if (!_DIR_RESTREINT) {
2764
+        $GLOBALS['profondeur_url'] = 1;
2765
+    } else {
2766
+        $uri = isset($_SERVER['REQUEST_URI']) ? explode('?', $_SERVER['REQUEST_URI']) : '';
2767
+        $uri_ref = $_SERVER['SCRIPT_NAME'];
2768
+        if (
2769
+            !$uri_ref
2770
+            // si on est appele avec un autre ti, on est sans doute en mutu
2771
+            // si jamais c'est de la mutu avec sous rep, on est perdu si on se fie
2772
+            // a spip.php qui est a la racine du spip, et vue qu'on sait pas se reperer
2773
+            // s'en remettre a l'adresse du site. alea jacta est.
2774
+            or $ti !== _NOM_TEMPORAIRES_INACCESSIBLES
2775
+        ) {
2776
+            if (isset($GLOBALS['meta']['adresse_site'])) {
2777
+                $uri_ref = parse_url($GLOBALS['meta']['adresse_site']);
2778
+                $uri_ref = ($uri_ref['path'] ?? '') . '/';
2779
+            } else {
2780
+                $uri_ref = '';
2781
+            }
2782
+        }
2783
+        if (!$uri or !$uri_ref) {
2784
+            $GLOBALS['profondeur_url'] = 0;
2785
+        } else {
2786
+            $GLOBALS['profondeur_url'] = max(
2787
+                0,
2788
+                substr_count($uri[0], '/')
2789
+                - substr_count($uri_ref, '/')
2790
+            );
2791
+        }
2792
+    }
2793
+    // s'il y a un cookie ou PHP_AUTH, initialiser visiteur_session
2794
+    if (_FILE_CONNECT) {
2795
+        if (
2796
+            verifier_visiteur() == '0minirezo'
2797
+            // si c'est un admin sans cookie admin, il faut ignorer le cache chemin !
2798
+            and !isset($_COOKIE['spip_admin'])
2799
+        ) {
2800
+            clear_path_cache();
2801
+        }
2802
+    }
2804 2803
 }
2805 2804
 
2806 2805
 /**
@@ -2809,157 +2808,157 @@  discard block
 block discarded – undo
2809 2808
  *
2810 2809
  */
2811 2810
 function spip_initialisation_suite() {
2812
-	static $too_late = 0;
2813
-	if ($too_late++) {
2814
-		return;
2815
-	}
2816
-
2817
-	// taille mini des login
2818
-	if (!defined('_LOGIN_TROP_COURT')) {
2819
-		define('_LOGIN_TROP_COURT', 4);
2820
-	}
2821
-
2822
-	// la taille maxi des logos (0 : pas de limite) (pas de define par defaut, ce n'est pas utile)
2823
-	#if (!defined('_LOGO_MAX_SIZE')) define('_LOGO_MAX_SIZE', 0); # poids en ko
2824
-	#if (!defined('_LOGO_MAX_WIDTH')) define('_LOGO_MAX_WIDTH', 0); # largeur en pixels
2825
-	#if (!defined('_LOGO_MAX_HEIGHT')) define('_LOGO_MAX_HEIGHT', 0); # hauteur en pixels
2826
-
2827
-	// la taille maxi des images (0 : pas de limite) (pas de define par defaut, ce n'est pas utile)
2828
-	#if (!defined('_DOC_MAX_SIZE')) define('_DOC_MAX_SIZE', 0); # poids en ko
2829
-	#if (!defined('_IMG_MAX_SIZE')) define('_IMG_MAX_SIZE', 0); # poids en ko
2830
-	#if (!defined('_IMG_MAX_WIDTH')) define('_IMG_MAX_WIDTH', 0); # largeur en pixels
2831
-	#if (!defined('_IMG_MAX_HEIGHT')) define('_IMG_MAX_HEIGHT', 0); # hauteur en pixels
2832
-
2833
-	if (!defined('_PASS_LONGUEUR_MINI')) {
2834
-		define('_PASS_LONGUEUR_MINI', 6);
2835
-	}
2836
-
2837
-	// largeur maximale des images dans l'administration
2838
-	if (!defined('_IMG_ADMIN_MAX_WIDTH')) {
2839
-		define('_IMG_ADMIN_MAX_WIDTH', 768);
2840
-	}
2841
-
2842
-	// Qualite des images calculees automatiquement. C'est un nombre entre 0 et 100, meme pour imagick (on ramene a 0..1 par la suite)
2843
-	if (!defined('_IMG_QUALITE')) {
2844
-		define('_IMG_QUALITE', 85);
2845
-	} # valeur par defaut
2846
-	if (!defined('_IMG_GD_QUALITE')) {
2847
-		define('_IMG_GD_QUALITE', _IMG_QUALITE);
2848
-	} # surcharge pour la lib GD
2849
-	if (!defined('_IMG_CONVERT_QUALITE')) {
2850
-		define('_IMG_CONVERT_QUALITE', _IMG_QUALITE);
2851
-	} # surcharge pour imagick en ligne de commande
2852
-	// Historiquement la valeur pour imagick semble differente. Si ca n'est pas necessaire, il serait preferable de garder _IMG_QUALITE
2853
-	if (!defined('_IMG_IMAGICK_QUALITE')) {
2854
-		define('_IMG_IMAGICK_QUALITE', 75);
2855
-	} # surcharge pour imagick en PHP
2856
-
2857
-	if (!defined('_COPIE_LOCALE_MAX_SIZE')) {
2858
-		define('_COPIE_LOCALE_MAX_SIZE', 33_554_432);
2859
-	} // poids en octet
2860
-
2861
-	// qq chaines standard
2862
-	if (!defined('_ACCESS_FILE_NAME')) {
2863
-		define('_ACCESS_FILE_NAME', '.htaccess');
2864
-	}
2865
-	if (!defined('_AUTH_USER_FILE')) {
2866
-		define('_AUTH_USER_FILE', '.htpasswd');
2867
-	}
2868
-	if (!defined('_SPIP_DUMP')) {
2869
-		define('_SPIP_DUMP', 'dump@nom_site@@[email protected]');
2870
-	}
2871
-	if (!defined('_CACHE_RUBRIQUES')) {
2872
-		/** Fichier cache pour le navigateur de rubrique du bandeau */
2873
-		define('_CACHE_RUBRIQUES', _DIR_TMP . 'menu-rubriques-cache.txt');
2874
-	}
2875
-	if (!defined('_CACHE_RUBRIQUES_MAX')) {
2876
-		/** Nombre maxi de rubriques enfants affichées pour chaque rubrique du navigateur de rubrique du bandeau */
2877
-		define('_CACHE_RUBRIQUES_MAX', 500);
2878
-	}
2879
-
2880
-	if (!defined('_CACHE_CONTEXTES_AJAX_SUR_LONGUEUR')) {
2881
-		/**
2882
-		 * Basculer les contextes ajax en fichier si la longueur d’url est trop grande
2883
-		 * @var int Nombre de caractères */
2884
-		define('_CACHE_CONTEXTES_AJAX_SUR_LONGUEUR', 2000);
2885
-	}
2886
-
2887
-	if (!defined('_EXTENSION_SQUELETTES')) {
2888
-		define('_EXTENSION_SQUELETTES', 'html');
2889
-	}
2890
-
2891
-	if (!defined('_DOCTYPE_ECRIRE')) {
2892
-		/** Définit le doctype de l’espace privé */
2893
-		define('_DOCTYPE_ECRIRE', "<!DOCTYPE html>\n");
2894
-	}
2895
-	if (!defined('_DOCTYPE_AIDE')) {
2896
-		/** Définit le doctype de l’aide en ligne */
2897
-		define(
2898
-			'_DOCTYPE_AIDE',
2899
-			"<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Frameset//EN' 'http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd'>"
2900
-		);
2901
-	}
2902
-
2903
-	if (!defined('_SPIP_SCRIPT')) {
2904
-		/** L'adresse de base du site ; on peut mettre '' si la racine est gerée par
2905
-		 * le script de l'espace public, alias index.php */
2906
-		define('_SPIP_SCRIPT', 'spip.php');
2907
-	}
2908
-	if (!defined('_SPIP_PAGE')) {
2909
-		/** Argument page, personalisable en cas de conflit avec un autre script */
2910
-		define('_SPIP_PAGE', 'page');
2911
-	}
2912
-
2913
-	// le script de l'espace prive
2914
-	// Mettre a "index.php" si DirectoryIndex ne le fait pas ou pb connexes:
2915
-	// les anciens IIS n'acceptent pas les POST sur ecrire/ (#419)
2916
-	// meme pb sur thttpd cf. https://forum.spip.net/fr_184153.html
2917
-	if (!defined('_SPIP_ECRIRE_SCRIPT')) {
2918
-		if (!empty($_SERVER['SERVER_SOFTWARE']) and preg_match(',IIS|thttpd,', $_SERVER['SERVER_SOFTWARE'])) {
2919
-			define('_SPIP_ECRIRE_SCRIPT', 'index.php');
2920
-		} else {
2921
-			define('_SPIP_ECRIRE_SCRIPT', '');
2922
-		}
2923
-	}
2924
-
2925
-
2926
-	if (!defined('_SPIP_AJAX')) {
2927
-		define('_SPIP_AJAX', ((!isset($_COOKIE['spip_accepte_ajax']))
2928
-			? 1
2929
-			: (($_COOKIE['spip_accepte_ajax'] != -1) ? 1 : 0)));
2930
-	}
2931
-
2932
-	// La requete est-elle en ajax ?
2933
-	if (!defined('_AJAX')) {
2934
-		define(
2935
-			'_AJAX',
2936
-			(isset($_SERVER['HTTP_X_REQUESTED_WITH']) # ajax jQuery
2937
-				or !empty($_REQUEST['var_ajax_redir']) # redirection 302 apres ajax jQuery
2938
-				or !empty($_REQUEST['var_ajaxcharset']) # compat ascendante pour plugins
2939
-				or !empty($_REQUEST['var_ajax']) # forms ajax & inclure ajax de spip
2940
-			)
2941
-			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
2942
-		);
2943
-	}
2944
-
2945
-	# nombre de pixels maxi pour calcul de la vignette avec gd
2946
-	# au dela de 5500000 on considere que php n'est pas limite en memoire pour cette operation
2947
-	# les configurations limitees en memoire ont un seuil plutot vers 1MPixel
2948
-	if (!defined('_IMG_GD_MAX_PIXELS')) {
2949
-		define(
2950
-			'_IMG_GD_MAX_PIXELS',
2951
-			(isset($GLOBALS['meta']['max_taille_vignettes']) and $GLOBALS['meta']['max_taille_vignettes'])
2952
-			? $GLOBALS['meta']['max_taille_vignettes']
2953
-			: 0
2954
-		);
2955
-	}
2956
-
2957
-	// Protocoles a normaliser dans les chaines de langues
2958
-	if (!defined('_PROTOCOLES_STD')) {
2959
-		define('_PROTOCOLES_STD', 'http|https|ftp|mailto|webcal');
2960
-	}
2961
-
2962
-	init_var_mode();
2811
+    static $too_late = 0;
2812
+    if ($too_late++) {
2813
+        return;
2814
+    }
2815
+
2816
+    // taille mini des login
2817
+    if (!defined('_LOGIN_TROP_COURT')) {
2818
+        define('_LOGIN_TROP_COURT', 4);
2819
+    }
2820
+
2821
+    // la taille maxi des logos (0 : pas de limite) (pas de define par defaut, ce n'est pas utile)
2822
+    #if (!defined('_LOGO_MAX_SIZE')) define('_LOGO_MAX_SIZE', 0); # poids en ko
2823
+    #if (!defined('_LOGO_MAX_WIDTH')) define('_LOGO_MAX_WIDTH', 0); # largeur en pixels
2824
+    #if (!defined('_LOGO_MAX_HEIGHT')) define('_LOGO_MAX_HEIGHT', 0); # hauteur en pixels
2825
+
2826
+    // la taille maxi des images (0 : pas de limite) (pas de define par defaut, ce n'est pas utile)
2827
+    #if (!defined('_DOC_MAX_SIZE')) define('_DOC_MAX_SIZE', 0); # poids en ko
2828
+    #if (!defined('_IMG_MAX_SIZE')) define('_IMG_MAX_SIZE', 0); # poids en ko
2829
+    #if (!defined('_IMG_MAX_WIDTH')) define('_IMG_MAX_WIDTH', 0); # largeur en pixels
2830
+    #if (!defined('_IMG_MAX_HEIGHT')) define('_IMG_MAX_HEIGHT', 0); # hauteur en pixels
2831
+
2832
+    if (!defined('_PASS_LONGUEUR_MINI')) {
2833
+        define('_PASS_LONGUEUR_MINI', 6);
2834
+    }
2835
+
2836
+    // largeur maximale des images dans l'administration
2837
+    if (!defined('_IMG_ADMIN_MAX_WIDTH')) {
2838
+        define('_IMG_ADMIN_MAX_WIDTH', 768);
2839
+    }
2840
+
2841
+    // Qualite des images calculees automatiquement. C'est un nombre entre 0 et 100, meme pour imagick (on ramene a 0..1 par la suite)
2842
+    if (!defined('_IMG_QUALITE')) {
2843
+        define('_IMG_QUALITE', 85);
2844
+    } # valeur par defaut
2845
+    if (!defined('_IMG_GD_QUALITE')) {
2846
+        define('_IMG_GD_QUALITE', _IMG_QUALITE);
2847
+    } # surcharge pour la lib GD
2848
+    if (!defined('_IMG_CONVERT_QUALITE')) {
2849
+        define('_IMG_CONVERT_QUALITE', _IMG_QUALITE);
2850
+    } # surcharge pour imagick en ligne de commande
2851
+    // Historiquement la valeur pour imagick semble differente. Si ca n'est pas necessaire, il serait preferable de garder _IMG_QUALITE
2852
+    if (!defined('_IMG_IMAGICK_QUALITE')) {
2853
+        define('_IMG_IMAGICK_QUALITE', 75);
2854
+    } # surcharge pour imagick en PHP
2855
+
2856
+    if (!defined('_COPIE_LOCALE_MAX_SIZE')) {
2857
+        define('_COPIE_LOCALE_MAX_SIZE', 33_554_432);
2858
+    } // poids en octet
2859
+
2860
+    // qq chaines standard
2861
+    if (!defined('_ACCESS_FILE_NAME')) {
2862
+        define('_ACCESS_FILE_NAME', '.htaccess');
2863
+    }
2864
+    if (!defined('_AUTH_USER_FILE')) {
2865
+        define('_AUTH_USER_FILE', '.htpasswd');
2866
+    }
2867
+    if (!defined('_SPIP_DUMP')) {
2868
+        define('_SPIP_DUMP', 'dump@nom_site@@[email protected]');
2869
+    }
2870
+    if (!defined('_CACHE_RUBRIQUES')) {
2871
+        /** Fichier cache pour le navigateur de rubrique du bandeau */
2872
+        define('_CACHE_RUBRIQUES', _DIR_TMP . 'menu-rubriques-cache.txt');
2873
+    }
2874
+    if (!defined('_CACHE_RUBRIQUES_MAX')) {
2875
+        /** Nombre maxi de rubriques enfants affichées pour chaque rubrique du navigateur de rubrique du bandeau */
2876
+        define('_CACHE_RUBRIQUES_MAX', 500);
2877
+    }
2878
+
2879
+    if (!defined('_CACHE_CONTEXTES_AJAX_SUR_LONGUEUR')) {
2880
+        /**
2881
+         * Basculer les contextes ajax en fichier si la longueur d’url est trop grande
2882
+         * @var int Nombre de caractères */
2883
+        define('_CACHE_CONTEXTES_AJAX_SUR_LONGUEUR', 2000);
2884
+    }
2885
+
2886
+    if (!defined('_EXTENSION_SQUELETTES')) {
2887
+        define('_EXTENSION_SQUELETTES', 'html');
2888
+    }
2889
+
2890
+    if (!defined('_DOCTYPE_ECRIRE')) {
2891
+        /** Définit le doctype de l’espace privé */
2892
+        define('_DOCTYPE_ECRIRE', "<!DOCTYPE html>\n");
2893
+    }
2894
+    if (!defined('_DOCTYPE_AIDE')) {
2895
+        /** Définit le doctype de l’aide en ligne */
2896
+        define(
2897
+            '_DOCTYPE_AIDE',
2898
+            "<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Frameset//EN' 'http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd'>"
2899
+        );
2900
+    }
2901
+
2902
+    if (!defined('_SPIP_SCRIPT')) {
2903
+        /** L'adresse de base du site ; on peut mettre '' si la racine est gerée par
2904
+         * le script de l'espace public, alias index.php */
2905
+        define('_SPIP_SCRIPT', 'spip.php');
2906
+    }
2907
+    if (!defined('_SPIP_PAGE')) {
2908
+        /** Argument page, personalisable en cas de conflit avec un autre script */
2909
+        define('_SPIP_PAGE', 'page');
2910
+    }
2911
+
2912
+    // le script de l'espace prive
2913
+    // Mettre a "index.php" si DirectoryIndex ne le fait pas ou pb connexes:
2914
+    // les anciens IIS n'acceptent pas les POST sur ecrire/ (#419)
2915
+    // meme pb sur thttpd cf. https://forum.spip.net/fr_184153.html
2916
+    if (!defined('_SPIP_ECRIRE_SCRIPT')) {
2917
+        if (!empty($_SERVER['SERVER_SOFTWARE']) and preg_match(',IIS|thttpd,', $_SERVER['SERVER_SOFTWARE'])) {
2918
+            define('_SPIP_ECRIRE_SCRIPT', 'index.php');
2919
+        } else {
2920
+            define('_SPIP_ECRIRE_SCRIPT', '');
2921
+        }
2922
+    }
2923
+
2924
+
2925
+    if (!defined('_SPIP_AJAX')) {
2926
+        define('_SPIP_AJAX', ((!isset($_COOKIE['spip_accepte_ajax']))
2927
+            ? 1
2928
+            : (($_COOKIE['spip_accepte_ajax'] != -1) ? 1 : 0)));
2929
+    }
2930
+
2931
+    // La requete est-elle en ajax ?
2932
+    if (!defined('_AJAX')) {
2933
+        define(
2934
+            '_AJAX',
2935
+            (isset($_SERVER['HTTP_X_REQUESTED_WITH']) # ajax jQuery
2936
+                or !empty($_REQUEST['var_ajax_redir']) # redirection 302 apres ajax jQuery
2937
+                or !empty($_REQUEST['var_ajaxcharset']) # compat ascendante pour plugins
2938
+                or !empty($_REQUEST['var_ajax']) # forms ajax & inclure ajax de spip
2939
+            )
2940
+            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
2941
+        );
2942
+    }
2943
+
2944
+    # nombre de pixels maxi pour calcul de la vignette avec gd
2945
+    # au dela de 5500000 on considere que php n'est pas limite en memoire pour cette operation
2946
+    # les configurations limitees en memoire ont un seuil plutot vers 1MPixel
2947
+    if (!defined('_IMG_GD_MAX_PIXELS')) {
2948
+        define(
2949
+            '_IMG_GD_MAX_PIXELS',
2950
+            (isset($GLOBALS['meta']['max_taille_vignettes']) and $GLOBALS['meta']['max_taille_vignettes'])
2951
+            ? $GLOBALS['meta']['max_taille_vignettes']
2952
+            : 0
2953
+        );
2954
+    }
2955
+
2956
+    // Protocoles a normaliser dans les chaines de langues
2957
+    if (!defined('_PROTOCOLES_STD')) {
2958
+        define('_PROTOCOLES_STD', 'http|https|ftp|mailto|webcal');
2959
+    }
2960
+
2961
+    init_var_mode();
2963 2962
 }
2964 2963
 
2965 2964
 /**
@@ -2993,219 +2992,219 @@  discard block
 block discarded – undo
2993 2992
  * `   var_mode` (calcul ou recalcul).
2994 2993
  */
2995 2994
 function init_var_mode() {
2996
-	static $done = false;
2997
-	if (!$done) {
2998
-		if (isset($_GET['var_mode'])) {
2999
-			$var_mode = explode(',', $_GET['var_mode']);
3000
-			// tout le monde peut calcul/recalcul
3001
-			if (!defined('_VAR_MODE')) {
3002
-				if (in_array('recalcul', $var_mode)) {
3003
-					define('_VAR_MODE', 'recalcul');
3004
-				} elseif (in_array('calcul', $var_mode)) {
3005
-					define('_VAR_MODE', 'calcul');
3006
-				}
3007
-			}
3008
-			$var_mode = array_diff($var_mode, ['calcul', 'recalcul']);
3009
-			if ($var_mode) {
3010
-				include_spip('inc/autoriser');
3011
-				// autoriser preview si preview seulement, et sinon autoriser debug
3012
-				if (
3013
-					autoriser(
3014
-						($_GET['var_mode'] == 'preview')
3015
-						? 'previsualiser'
3016
-						: 'debug'
3017
-					)
3018
-				) {
3019
-					if (in_array('traduction', $var_mode)) {
3020
-						// forcer le calcul pour passer dans traduire
3021
-						if (!defined('_VAR_MODE')) {
3022
-							define('_VAR_MODE', 'calcul');
3023
-						}
3024
-						// et ne pas enregistrer de cache pour ne pas trainer les surlignages sur d'autres pages
3025
-						if (!defined('_VAR_NOCACHE')) {
3026
-							define('_VAR_NOCACHE', true);
3027
-						}
3028
-						$var_mode = array_diff($var_mode, ['traduction']);
3029
-					}
3030
-					if (in_array('preview', $var_mode)) {
3031
-						// basculer sur les criteres de preview dans les boucles
3032
-						if (!defined('_VAR_PREVIEW')) {
3033
-							define('_VAR_PREVIEW', true);
3034
-						}
3035
-						// forcer le calcul
3036
-						if (!defined('_VAR_MODE')) {
3037
-							define('_VAR_MODE', 'calcul');
3038
-						}
3039
-						// et ne pas enregistrer de cache
3040
-						if (!defined('_VAR_NOCACHE')) {
3041
-							define('_VAR_NOCACHE', true);
3042
-						}
3043
-						$var_mode = array_diff($var_mode, ['preview']);
3044
-					}
3045
-					if (in_array('inclure', $var_mode)) {
3046
-						// forcer le compilo et ignorer les caches existants
3047
-						if (!defined('_VAR_MODE')) {
3048
-							define('_VAR_MODE', 'calcul');
3049
-						}
3050
-						if (!defined('_VAR_INCLURE')) {
3051
-							define('_VAR_INCLURE', true);
3052
-						}
3053
-						// et ne pas enregistrer de cache
3054
-						if (!defined('_VAR_NOCACHE')) {
3055
-							define('_VAR_NOCACHE', true);
3056
-						}
3057
-						$var_mode = array_diff($var_mode, ['inclure']);
3058
-					}
3059
-					if (in_array('urls', $var_mode)) {
3060
-						// forcer le compilo et ignorer les caches existants
3061
-						if (!defined('_VAR_MODE')) {
3062
-							define('_VAR_MODE', 'calcul');
3063
-						}
3064
-						if (!defined('_VAR_URLS')) {
3065
-							define('_VAR_URLS', true);
3066
-						}
3067
-						$var_mode = array_diff($var_mode, ['urls']);
3068
-					}
3069
-					if (in_array('images', $var_mode)) {
3070
-						// forcer le compilo et ignorer les caches existants
3071
-						if (!defined('_VAR_MODE')) {
3072
-							define('_VAR_MODE', 'calcul');
3073
-						}
3074
-						// indiquer qu'on doit recalculer les images
3075
-						if (!defined('_VAR_IMAGES')) {
3076
-							define('_VAR_IMAGES', true);
3077
-						}
3078
-						$var_mode = array_diff($var_mode, ['images']);
3079
-					}
3080
-					if (in_array('debug', $var_mode)) {
3081
-						if (!defined('_VAR_MODE')) {
3082
-							define('_VAR_MODE', 'debug');
3083
-						}
3084
-						// et ne pas enregistrer de cache
3085
-						if (!defined('_VAR_NOCACHE')) {
3086
-							define('_VAR_NOCACHE', true);
3087
-						}
3088
-						$var_mode = array_diff($var_mode, ['debug']);
3089
-					}
3090
-					if (count($var_mode) and !defined('_VAR_MODE')) {
3091
-						define('_VAR_MODE', reset($var_mode));
3092
-					}
3093
-					if (isset($GLOBALS['visiteur_session']['nom'])) {
3094
-						spip_log($GLOBALS['visiteur_session']['nom']
3095
-							. ' ' . _VAR_MODE);
3096
-					}
3097
-				} // pas autorise ?
3098
-				else {
3099
-					// si on n'est pas connecte on se redirige, si on est pas en cli et pas deja en train de se loger
3100
-					if (
3101
-						!$GLOBALS['visiteur_session']
3102
-						and !empty($_SERVER['HTTP_HOST'])
3103
-						and !empty($_SERVER['REQUEST_METHOD'])
3104
-						and $_SERVER['REQUEST_METHOD'] === 'GET'
3105
-					) {
3106
-						$self = self('&', true);
3107
-						if (strpos($self, 'page=login') === false) {
3108
-							include_spip('inc/headers');
3109
-							$redirect = parametre_url(self('&', true), 'var_mode', $_GET['var_mode'], '&');
3110
-							redirige_par_entete(generer_url_public('login', 'url=' . rawurlencode($redirect), true));
3111
-						}
3112
-					}
3113
-					// sinon tant pis
3114
-				}
3115
-			}
3116
-		}
3117
-		if (!defined('_VAR_MODE')) {
3118
-			/**
3119
-			 * Indique le mode de calcul ou d'affichage de la page.
3120
-			 * @see init_var_mode()
3121
-			 */
3122
-			define('_VAR_MODE', false);
3123
-		}
3124
-		$done = true;
3125
-	}
2995
+    static $done = false;
2996
+    if (!$done) {
2997
+        if (isset($_GET['var_mode'])) {
2998
+            $var_mode = explode(',', $_GET['var_mode']);
2999
+            // tout le monde peut calcul/recalcul
3000
+            if (!defined('_VAR_MODE')) {
3001
+                if (in_array('recalcul', $var_mode)) {
3002
+                    define('_VAR_MODE', 'recalcul');
3003
+                } elseif (in_array('calcul', $var_mode)) {
3004
+                    define('_VAR_MODE', 'calcul');
3005
+                }
3006
+            }
3007
+            $var_mode = array_diff($var_mode, ['calcul', 'recalcul']);
3008
+            if ($var_mode) {
3009
+                include_spip('inc/autoriser');
3010
+                // autoriser preview si preview seulement, et sinon autoriser debug
3011
+                if (
3012
+                    autoriser(
3013
+                        ($_GET['var_mode'] == 'preview')
3014
+                        ? 'previsualiser'
3015
+                        : 'debug'
3016
+                    )
3017
+                ) {
3018
+                    if (in_array('traduction', $var_mode)) {
3019
+                        // forcer le calcul pour passer dans traduire
3020
+                        if (!defined('_VAR_MODE')) {
3021
+                            define('_VAR_MODE', 'calcul');
3022
+                        }
3023
+                        // et ne pas enregistrer de cache pour ne pas trainer les surlignages sur d'autres pages
3024
+                        if (!defined('_VAR_NOCACHE')) {
3025
+                            define('_VAR_NOCACHE', true);
3026
+                        }
3027
+                        $var_mode = array_diff($var_mode, ['traduction']);
3028
+                    }
3029
+                    if (in_array('preview', $var_mode)) {
3030
+                        // basculer sur les criteres de preview dans les boucles
3031
+                        if (!defined('_VAR_PREVIEW')) {
3032
+                            define('_VAR_PREVIEW', true);
3033
+                        }
3034
+                        // forcer le calcul
3035
+                        if (!defined('_VAR_MODE')) {
3036
+                            define('_VAR_MODE', 'calcul');
3037
+                        }
3038
+                        // et ne pas enregistrer de cache
3039
+                        if (!defined('_VAR_NOCACHE')) {
3040
+                            define('_VAR_NOCACHE', true);
3041
+                        }
3042
+                        $var_mode = array_diff($var_mode, ['preview']);
3043
+                    }
3044
+                    if (in_array('inclure', $var_mode)) {
3045
+                        // forcer le compilo et ignorer les caches existants
3046
+                        if (!defined('_VAR_MODE')) {
3047
+                            define('_VAR_MODE', 'calcul');
3048
+                        }
3049
+                        if (!defined('_VAR_INCLURE')) {
3050
+                            define('_VAR_INCLURE', true);
3051
+                        }
3052
+                        // et ne pas enregistrer de cache
3053
+                        if (!defined('_VAR_NOCACHE')) {
3054
+                            define('_VAR_NOCACHE', true);
3055
+                        }
3056
+                        $var_mode = array_diff($var_mode, ['inclure']);
3057
+                    }
3058
+                    if (in_array('urls', $var_mode)) {
3059
+                        // forcer le compilo et ignorer les caches existants
3060
+                        if (!defined('_VAR_MODE')) {
3061
+                            define('_VAR_MODE', 'calcul');
3062
+                        }
3063
+                        if (!defined('_VAR_URLS')) {
3064
+                            define('_VAR_URLS', true);
3065
+                        }
3066
+                        $var_mode = array_diff($var_mode, ['urls']);
3067
+                    }
3068
+                    if (in_array('images', $var_mode)) {
3069
+                        // forcer le compilo et ignorer les caches existants
3070
+                        if (!defined('_VAR_MODE')) {
3071
+                            define('_VAR_MODE', 'calcul');
3072
+                        }
3073
+                        // indiquer qu'on doit recalculer les images
3074
+                        if (!defined('_VAR_IMAGES')) {
3075
+                            define('_VAR_IMAGES', true);
3076
+                        }
3077
+                        $var_mode = array_diff($var_mode, ['images']);
3078
+                    }
3079
+                    if (in_array('debug', $var_mode)) {
3080
+                        if (!defined('_VAR_MODE')) {
3081
+                            define('_VAR_MODE', 'debug');
3082
+                        }
3083
+                        // et ne pas enregistrer de cache
3084
+                        if (!defined('_VAR_NOCACHE')) {
3085
+                            define('_VAR_NOCACHE', true);
3086
+                        }
3087
+                        $var_mode = array_diff($var_mode, ['debug']);
3088
+                    }
3089
+                    if (count($var_mode) and !defined('_VAR_MODE')) {
3090
+                        define('_VAR_MODE', reset($var_mode));
3091
+                    }
3092
+                    if (isset($GLOBALS['visiteur_session']['nom'])) {
3093
+                        spip_log($GLOBALS['visiteur_session']['nom']
3094
+                            . ' ' . _VAR_MODE);
3095
+                    }
3096
+                } // pas autorise ?
3097
+                else {
3098
+                    // si on n'est pas connecte on se redirige, si on est pas en cli et pas deja en train de se loger
3099
+                    if (
3100
+                        !$GLOBALS['visiteur_session']
3101
+                        and !empty($_SERVER['HTTP_HOST'])
3102
+                        and !empty($_SERVER['REQUEST_METHOD'])
3103
+                        and $_SERVER['REQUEST_METHOD'] === 'GET'
3104
+                    ) {
3105
+                        $self = self('&', true);
3106
+                        if (strpos($self, 'page=login') === false) {
3107
+                            include_spip('inc/headers');
3108
+                            $redirect = parametre_url(self('&', true), 'var_mode', $_GET['var_mode'], '&');
3109
+                            redirige_par_entete(generer_url_public('login', 'url=' . rawurlencode($redirect), true));
3110
+                        }
3111
+                    }
3112
+                    // sinon tant pis
3113
+                }
3114
+            }
3115
+        }
3116
+        if (!defined('_VAR_MODE')) {
3117
+            /**
3118
+             * Indique le mode de calcul ou d'affichage de la page.
3119
+             * @see init_var_mode()
3120
+             */
3121
+            define('_VAR_MODE', false);
3122
+        }
3123
+        $done = true;
3124
+    }
3126 3125
 }
3127 3126
 
3128 3127
 // Annuler les magic quotes \' sur GET POST COOKIE et GLOBALS ;
3129 3128
 // supprimer aussi les eventuels caracteres nuls %00, qui peuvent tromper
3130 3129
 // la commande is_readable('chemin/vers/fichier/interdit%00truc_normal')
3131 3130
 function spip_desinfecte(&$t, $deep = true) {
3132
-	foreach ($t as $key => $val) {
3133
-		if (is_string($t[$key])) {
3134
-			$t[$key] = str_replace(chr(0), '-', $t[$key]);
3135
-		} // traiter aussi les "texte_plus" de article_edit
3136
-		else {
3137
-			if ($deep and is_array($t[$key]) and $key !== 'GLOBALS') {
3138
-				spip_desinfecte($t[$key], $deep);
3139
-			}
3140
-		}
3141
-	}
3131
+    foreach ($t as $key => $val) {
3132
+        if (is_string($t[$key])) {
3133
+            $t[$key] = str_replace(chr(0), '-', $t[$key]);
3134
+        } // traiter aussi les "texte_plus" de article_edit
3135
+        else {
3136
+            if ($deep and is_array($t[$key]) and $key !== 'GLOBALS') {
3137
+                spip_desinfecte($t[$key], $deep);
3138
+            }
3139
+        }
3140
+    }
3142 3141
 }
3143 3142
 
3144 3143
 //  retourne le statut du visiteur s'il s'annonce
3145 3144
 
3146 3145
 function verifier_visiteur() {
3147
-	// Rq: pour que cette fonction marche depuis mes_options
3148
-	// il faut forcer l'init si ce n'est fait
3149
-	// mais on risque de perturber des plugins en initialisant trop tot
3150
-	// certaines constantes
3151
-	@spip_initialisation_core(
3152
-		(_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES),
3153
-		(_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES),
3154
-		(_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES),
3155
-		(_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
3156
-	);
3157
-
3158
-	// Demarrer une session NON AUTHENTIFIEE si on donne son nom
3159
-	// dans un formulaire sans login (ex: #FORMULAIRE_FORUM)
3160
-	// Attention on separe bien session_nom et nom, pour eviter
3161
-	// les melanges entre donnees SQL et variables plus aleatoires
3162
-	$variables_session = ['session_nom', 'session_email'];
3163
-	foreach ($variables_session as $var) {
3164
-		if (_request($var) !== null) {
3165
-			$init = true;
3166
-			break;
3167
-		}
3168
-	}
3169
-	if (isset($init)) {
3170
-		#@spip_initialisation_suite();
3171
-		$session = charger_fonction('session', 'inc');
3172
-		$session();
3173
-		include_spip('inc/texte');
3174
-		foreach ($variables_session as $var) {
3175
-			if (($a = _request($var)) !== null) {
3176
-				$GLOBALS['visiteur_session'][$var] = safehtml($a);
3177
-			}
3178
-		}
3179
-		if (!isset($GLOBALS['visiteur_session']['id_auteur'])) {
3180
-			$GLOBALS['visiteur_session']['id_auteur'] = 0;
3181
-		}
3182
-		$session($GLOBALS['visiteur_session']);
3183
-
3184
-		return 0;
3185
-	}
3186
-
3187
-	$h = (isset($_SERVER['PHP_AUTH_USER']) and !$GLOBALS['ignore_auth_http']);
3188
-	if ($h or isset($_COOKIE['spip_session']) or isset($_COOKIE[$GLOBALS['cookie_prefix'] . '_session'])) {
3189
-		$session = charger_fonction('session', 'inc');
3190
-		if ($session()) {
3191
-			return $GLOBALS['visiteur_session']['statut'];
3192
-		}
3193
-		if ($h and isset($_SERVER['PHP_AUTH_PW'])) {
3194
-			include_spip('inc/auth');
3195
-			$h = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']);
3196
-		}
3197
-		if ($h) {
3198
-			$GLOBALS['visiteur_session'] = $h;
3199
-
3200
-			return $GLOBALS['visiteur_session']['statut'];
3201
-		}
3202
-	}
3203
-
3204
-	// au moins son navigateur nous dit la langue preferee de cet inconnu
3205
-	include_spip('inc/lang');
3206
-	utiliser_langue_visiteur();
3207
-
3208
-	return false;
3146
+    // Rq: pour que cette fonction marche depuis mes_options
3147
+    // il faut forcer l'init si ce n'est fait
3148
+    // mais on risque de perturber des plugins en initialisant trop tot
3149
+    // certaines constantes
3150
+    @spip_initialisation_core(
3151
+        (_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES),
3152
+        (_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES),
3153
+        (_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES),
3154
+        (_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
3155
+    );
3156
+
3157
+    // Demarrer une session NON AUTHENTIFIEE si on donne son nom
3158
+    // dans un formulaire sans login (ex: #FORMULAIRE_FORUM)
3159
+    // Attention on separe bien session_nom et nom, pour eviter
3160
+    // les melanges entre donnees SQL et variables plus aleatoires
3161
+    $variables_session = ['session_nom', 'session_email'];
3162
+    foreach ($variables_session as $var) {
3163
+        if (_request($var) !== null) {
3164
+            $init = true;
3165
+            break;
3166
+        }
3167
+    }
3168
+    if (isset($init)) {
3169
+        #@spip_initialisation_suite();
3170
+        $session = charger_fonction('session', 'inc');
3171
+        $session();
3172
+        include_spip('inc/texte');
3173
+        foreach ($variables_session as $var) {
3174
+            if (($a = _request($var)) !== null) {
3175
+                $GLOBALS['visiteur_session'][$var] = safehtml($a);
3176
+            }
3177
+        }
3178
+        if (!isset($GLOBALS['visiteur_session']['id_auteur'])) {
3179
+            $GLOBALS['visiteur_session']['id_auteur'] = 0;
3180
+        }
3181
+        $session($GLOBALS['visiteur_session']);
3182
+
3183
+        return 0;
3184
+    }
3185
+
3186
+    $h = (isset($_SERVER['PHP_AUTH_USER']) and !$GLOBALS['ignore_auth_http']);
3187
+    if ($h or isset($_COOKIE['spip_session']) or isset($_COOKIE[$GLOBALS['cookie_prefix'] . '_session'])) {
3188
+        $session = charger_fonction('session', 'inc');
3189
+        if ($session()) {
3190
+            return $GLOBALS['visiteur_session']['statut'];
3191
+        }
3192
+        if ($h and isset($_SERVER['PHP_AUTH_PW'])) {
3193
+            include_spip('inc/auth');
3194
+            $h = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']);
3195
+        }
3196
+        if ($h) {
3197
+            $GLOBALS['visiteur_session'] = $h;
3198
+
3199
+            return $GLOBALS['visiteur_session']['statut'];
3200
+        }
3201
+    }
3202
+
3203
+    // au moins son navigateur nous dit la langue preferee de cet inconnu
3204
+    include_spip('inc/lang');
3205
+    utiliser_langue_visiteur();
3206
+
3207
+    return false;
3209 3208
 }
3210 3209
 
3211 3210
 
@@ -3228,21 +3227,21 @@  discard block
 block discarded – undo
3228 3227
  *     - string Langue utilisée.
3229 3228
  **/
3230 3229
 function lang_select($lang = null) {
3231
-	static $pile_langues = [];
3232
-	if (!function_exists('changer_langue')) {
3233
-		include_spip('inc/lang');
3234
-	}
3235
-	if ($lang === null) {
3236
-		$lang = array_pop($pile_langues);
3237
-	} else {
3238
-		array_push($pile_langues, $GLOBALS['spip_lang']);
3239
-	}
3240
-	if (isset($GLOBALS['spip_lang']) and $lang == $GLOBALS['spip_lang']) {
3241
-		return $lang;
3242
-	}
3243
-	changer_langue($lang);
3230
+    static $pile_langues = [];
3231
+    if (!function_exists('changer_langue')) {
3232
+        include_spip('inc/lang');
3233
+    }
3234
+    if ($lang === null) {
3235
+        $lang = array_pop($pile_langues);
3236
+    } else {
3237
+        array_push($pile_langues, $GLOBALS['spip_lang']);
3238
+    }
3239
+    if (isset($GLOBALS['spip_lang']) and $lang == $GLOBALS['spip_lang']) {
3240
+        return $lang;
3241
+    }
3242
+    changer_langue($lang);
3244 3243
 
3245
-	return $lang;
3244
+    return $lang;
3246 3245
 }
3247 3246
 
3248 3247
 /**
@@ -3259,20 +3258,20 @@  discard block
 block discarded – undo
3259 3258
  *     Identifiant de la session
3260 3259
  **/
3261 3260
 function spip_session($force = false) {
3262
-	static $session;
3263
-	if ($force or !isset($session)) {
3264
-		$s = pipeline(
3265
-			'definir_session',
3266
-			$GLOBALS['visiteur_session']
3267
-				? serialize($GLOBALS['visiteur_session'])
3268
-				. '_' . @$_COOKIE['spip_session']
3269
-				: ''
3270
-		);
3271
-		$session = $s ? substr(md5($s), 0, 8) : '';
3272
-	}
3261
+    static $session;
3262
+    if ($force or !isset($session)) {
3263
+        $s = pipeline(
3264
+            'definir_session',
3265
+            $GLOBALS['visiteur_session']
3266
+                ? serialize($GLOBALS['visiteur_session'])
3267
+                . '_' . @$_COOKIE['spip_session']
3268
+                : ''
3269
+        );
3270
+        $session = $s ? substr(md5($s), 0, 8) : '';
3271
+    }
3273 3272
 
3274
-	#spip_log('session: '.$session);
3275
-	return $session;
3273
+    #spip_log('session: '.$session);
3274
+    return $session;
3276 3275
 }
3277 3276
 
3278 3277
 
@@ -3291,9 +3290,9 @@  discard block
 block discarded – undo
3291 3290
  *    Lien sur une icone d'aide
3292 3291
  **/
3293 3292
 function aider($aide = '', $distante = false) {
3294
-	$aider = charger_fonction('aide', 'inc', true);
3293
+    $aider = charger_fonction('aide', 'inc', true);
3295 3294
 
3296
-	return $aider ? $aider($aide, '', [], $distante) : '';
3295
+    return $aider ? $aider($aide, '', [], $distante) : '';
3297 3296
 }
3298 3297
 
3299 3298
 /**
@@ -3303,24 +3302,24 @@  discard block
 block discarded – undo
3303 3302
  */
3304 3303
 function exec_info_dist() {
3305 3304
 
3306
-	include_spip('inc/autoriser');
3307
-	if (autoriser('phpinfos')) {
3308
-		$cookies_masques = ['spip_session', 'PHPSESSID'];
3309
-		$cookies_backup = [];
3310
-		foreach ($cookies_masques as $k) {
3311
-			if (!empty($_COOKIE[$k])) {
3312
-				$cookies_backup[$k] = $_COOKIE[$k];
3313
-				$_COOKIE[$k] = '******************************';
3314
-			}
3315
-		}
3316
-		phpinfo();
3317
-		foreach ($cookies_backup as $k => $v) {
3318
-			$_COOKIE[$k] = $v;
3319
-		}
3320
-	} else {
3321
-		include_spip('inc/filtres');
3322
-		sinon_interdire_acces();
3323
-	}
3305
+    include_spip('inc/autoriser');
3306
+    if (autoriser('phpinfos')) {
3307
+        $cookies_masques = ['spip_session', 'PHPSESSID'];
3308
+        $cookies_backup = [];
3309
+        foreach ($cookies_masques as $k) {
3310
+            if (!empty($_COOKIE[$k])) {
3311
+                $cookies_backup[$k] = $_COOKIE[$k];
3312
+                $_COOKIE[$k] = '******************************';
3313
+            }
3314
+        }
3315
+        phpinfo();
3316
+        foreach ($cookies_backup as $k => $v) {
3317
+            $_COOKIE[$k] = $v;
3318
+        }
3319
+    } else {
3320
+        include_spip('inc/filtres');
3321
+        sinon_interdire_acces();
3322
+    }
3324 3323
 }
3325 3324
 
3326 3325
 /**
@@ -3340,13 +3339,13 @@  discard block
 block discarded – undo
3340 3339
  *     - string si $message à false.
3341 3340
  **/
3342 3341
 function erreur_squelette($message = '', $lieu = '') {
3343
-	$debusquer = charger_fonction('debusquer', 'public');
3344
-	if (is_array($lieu)) {
3345
-		include_spip('public/compiler');
3346
-		$lieu = reconstruire_contexte_compil($lieu);
3347
-	}
3342
+    $debusquer = charger_fonction('debusquer', 'public');
3343
+    if (is_array($lieu)) {
3344
+        include_spip('public/compiler');
3345
+        $lieu = reconstruire_contexte_compil($lieu);
3346
+    }
3348 3347
 
3349
-	return $debusquer($message, $lieu);
3348
+    return $debusquer($message, $lieu);
3350 3349
 }
3351 3350
 
3352 3351
 /**
@@ -3383,108 +3382,108 @@  discard block
 block discarded – undo
3383 3382
  *     - ou tableau d'information sur le squelette.
3384 3383
  */
3385 3384
 function recuperer_fond($fond, $contexte = [], $options = [], string $connect = '') {
3386
-	if (!function_exists('evaluer_fond')) {
3387
-		include_spip('public/assembler');
3388
-	}
3389
-	// assurer la compat avec l'ancienne syntaxe
3390
-	// (trim etait le 3eme argument, par defaut a true)
3391
-	if (!is_array($options)) {
3392
-		$options = ['trim' => $options];
3393
-	}
3394
-	if (!isset($options['trim'])) {
3395
-		$options['trim'] = true;
3396
-	}
3397
-
3398
-	if (isset($contexte['connect'])) {
3399
-		$connect = $contexte['connect'];
3400
-		unset($contexte['connect']);
3401
-	}
3402
-
3403
-	$texte = '';
3404
-	$pages = [];
3405
-	$lang_select = '';
3406
-	if (!isset($options['etoile']) or !$options['etoile']) {
3407
-		// Si on a inclus sans fixer le critere de lang, on prend la langue courante
3408
-		if (!isset($contexte['lang'])) {
3409
-			$contexte['lang'] = $GLOBALS['spip_lang'];
3410
-		}
3411
-
3412
-		if ($contexte['lang'] != $GLOBALS['meta']['langue_site']) {
3413
-			$lang_select = lang_select($contexte['lang']);
3414
-		}
3415
-	}
3416
-
3417
-	if (!isset($GLOBALS['_INC_PUBLIC'])) {
3418
-		$GLOBALS['_INC_PUBLIC'] = 0;
3419
-	}
3420
-
3421
-	$GLOBALS['_INC_PUBLIC']++;
3422
-
3423
-	// fix #4235
3424
-	$cache_utilise_session_appelant	= ($GLOBALS['cache_utilise_session'] ?? null);
3425
-
3426
-
3427
-	foreach (is_array($fond) ? $fond : [$fond] as $f) {
3428
-		unset($GLOBALS['cache_utilise_session']);	// fix #4235
3429
-
3430
-		$page = evaluer_fond($f, $contexte, $connect);
3431
-		if ($page === '') {
3432
-			$c = $options['compil'] ?? '';
3433
-			$a = ['fichier' => $f];
3434
-			$erreur = _T('info_erreur_squelette2', $a); // squelette introuvable
3435
-			erreur_squelette($erreur, $c);
3436
-			// eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
3437
-			$page = ['texte' => '', 'erreur' => $erreur];
3438
-		}
3439
-
3440
-		$page = pipeline('recuperer_fond', [
3441
-			'args' => ['fond' => $f, 'contexte' => $contexte, 'options' => $options, 'connect' => $connect],
3442
-			'data' => $page
3443
-		]);
3444
-		if (isset($options['ajax']) and $options['ajax']) {
3445
-			if (!function_exists('encoder_contexte_ajax')) {
3446
-				include_spip('inc/filtres');
3447
-			}
3448
-			$page['texte'] = encoder_contexte_ajax(
3449
-				array_merge(
3450
-					$contexte,
3451
-					['fond' => $f],
3452
-					($connect ? ['connect' => $connect] : [])
3453
-				),
3454
-				'',
3455
-				$page['texte'],
3456
-				$options['ajax']
3457
-			);
3458
-		}
3459
-
3460
-		if (isset($options['raw']) and $options['raw']) {
3461
-			$pages[] = $page;
3462
-		} else {
3463
-			$texte .= $options['trim'] ? rtrim($page['texte'] ?? '') : $page['texte'];
3464
-		}
3465
-
3466
-		// contamination de la session appelante, pour les inclusions statiques
3467
-		if (isset($page['invalideurs']['session'])) {
3468
-			$cache_utilise_session_appelant = $page['invalideurs']['session'];
3469
-		}
3470
-	}
3471
-
3472
-	// restaurer le sessionnement du contexte appelant,
3473
-	// éventuellement contaminé si on vient de récupérer une inclusion statique sessionnée
3474
-	if (isset($cache_utilise_session_appelant)) {
3475
-		$GLOBALS['cache_utilise_session'] = $cache_utilise_session_appelant;
3476
-	}
3477
-
3478
-	$GLOBALS['_INC_PUBLIC']--;
3479
-
3480
-	if ($lang_select) {
3481
-		lang_select();
3482
-	}
3483
-	if (isset($options['raw']) and $options['raw']) {
3484
-		return is_array($fond) ? $pages : reset($pages);
3485
-	} else {
3486
-		return $options['trim'] ? ltrim($texte) : $texte;
3487
-	}
3385
+    if (!function_exists('evaluer_fond')) {
3386
+        include_spip('public/assembler');
3387
+    }
3388
+    // assurer la compat avec l'ancienne syntaxe
3389
+    // (trim etait le 3eme argument, par defaut a true)
3390
+    if (!is_array($options)) {
3391
+        $options = ['trim' => $options];
3392
+    }
3393
+    if (!isset($options['trim'])) {
3394
+        $options['trim'] = true;
3395
+    }
3396
+
3397
+    if (isset($contexte['connect'])) {
3398
+        $connect = $contexte['connect'];
3399
+        unset($contexte['connect']);
3400
+    }
3401
+
3402
+    $texte = '';
3403
+    $pages = [];
3404
+    $lang_select = '';
3405
+    if (!isset($options['etoile']) or !$options['etoile']) {
3406
+        // Si on a inclus sans fixer le critere de lang, on prend la langue courante
3407
+        if (!isset($contexte['lang'])) {
3408
+            $contexte['lang'] = $GLOBALS['spip_lang'];
3409
+        }
3410
+
3411
+        if ($contexte['lang'] != $GLOBALS['meta']['langue_site']) {
3412
+            $lang_select = lang_select($contexte['lang']);
3413
+        }
3414
+    }
3415
+
3416
+    if (!isset($GLOBALS['_INC_PUBLIC'])) {
3417
+        $GLOBALS['_INC_PUBLIC'] = 0;
3418
+    }
3419
+
3420
+    $GLOBALS['_INC_PUBLIC']++;
3421
+
3422
+    // fix #4235
3423
+    $cache_utilise_session_appelant	= ($GLOBALS['cache_utilise_session'] ?? null);
3424
+
3425
+
3426
+    foreach (is_array($fond) ? $fond : [$fond] as $f) {
3427
+        unset($GLOBALS['cache_utilise_session']);	// fix #4235
3428
+
3429
+        $page = evaluer_fond($f, $contexte, $connect);
3430
+        if ($page === '') {
3431
+            $c = $options['compil'] ?? '';
3432
+            $a = ['fichier' => $f];
3433
+            $erreur = _T('info_erreur_squelette2', $a); // squelette introuvable
3434
+            erreur_squelette($erreur, $c);
3435
+            // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
3436
+            $page = ['texte' => '', 'erreur' => $erreur];
3437
+        }
3438
+
3439
+        $page = pipeline('recuperer_fond', [
3440
+            'args' => ['fond' => $f, 'contexte' => $contexte, 'options' => $options, 'connect' => $connect],
3441
+            'data' => $page
3442
+        ]);
3443
+        if (isset($options['ajax']) and $options['ajax']) {
3444
+            if (!function_exists('encoder_contexte_ajax')) {
3445
+                include_spip('inc/filtres');
3446
+            }
3447
+            $page['texte'] = encoder_contexte_ajax(
3448
+                array_merge(
3449
+                    $contexte,
3450
+                    ['fond' => $f],
3451
+                    ($connect ? ['connect' => $connect] : [])
3452
+                ),
3453
+                '',
3454
+                $page['texte'],
3455
+                $options['ajax']
3456
+            );
3457
+        }
3458
+
3459
+        if (isset($options['raw']) and $options['raw']) {
3460
+            $pages[] = $page;
3461
+        } else {
3462
+            $texte .= $options['trim'] ? rtrim($page['texte'] ?? '') : $page['texte'];
3463
+        }
3464
+
3465
+        // contamination de la session appelante, pour les inclusions statiques
3466
+        if (isset($page['invalideurs']['session'])) {
3467
+            $cache_utilise_session_appelant = $page['invalideurs']['session'];
3468
+        }
3469
+    }
3470
+
3471
+    // restaurer le sessionnement du contexte appelant,
3472
+    // éventuellement contaminé si on vient de récupérer une inclusion statique sessionnée
3473
+    if (isset($cache_utilise_session_appelant)) {
3474
+        $GLOBALS['cache_utilise_session'] = $cache_utilise_session_appelant;
3475
+    }
3476
+
3477
+    $GLOBALS['_INC_PUBLIC']--;
3478
+
3479
+    if ($lang_select) {
3480
+        lang_select();
3481
+    }
3482
+    if (isset($options['raw']) and $options['raw']) {
3483
+        return is_array($fond) ? $pages : reset($pages);
3484
+    } else {
3485
+        return $options['trim'] ? ltrim($texte) : $texte;
3486
+    }
3488 3487
 }
3489 3488
 
3490 3489
 /**
@@ -3494,7 +3493,7 @@  discard block
 block discarded – undo
3494 3493
  * @return string
3495 3494
  */
3496 3495
 function trouve_modele($nom) {
3497
-	return trouver_fond($nom, 'modeles/');
3496
+    return trouver_fond($nom, 'modeles/');
3498 3497
 }
3499 3498
 
3500 3499
 /**
@@ -3510,21 +3509,21 @@  discard block
 block discarded – undo
3510 3509
  * @return array|string
3511 3510
  */
3512 3511
 function trouver_fond($nom, $dir = '', $pathinfo = false) {
3513
-	$f = find_in_path($nom . '.' . _EXTENSION_SQUELETTES, $dir ? rtrim($dir, '/') . '/' : '');
3514
-	if (!$pathinfo) {
3515
-		return $f;
3516
-	}
3517
-	// renvoyer un tableau detaille si $pathinfo==true
3518
-	$p = pathinfo($f);
3519
-	if (!isset($p['extension']) or !$p['extension']) {
3520
-		$p['extension'] = _EXTENSION_SQUELETTES;
3521
-	}
3522
-	if (!isset($p['extension']) or !$p['filename']) {
3523
-		$p['filename'] = ($p['basename'] ? substr($p['basename'], 0, -strlen($p['extension']) - 1) : '');
3524
-	}
3525
-	$p['fond'] = ($f ? substr($f, 0, -strlen($p['extension']) - 1) : '');
3512
+    $f = find_in_path($nom . '.' . _EXTENSION_SQUELETTES, $dir ? rtrim($dir, '/') . '/' : '');
3513
+    if (!$pathinfo) {
3514
+        return $f;
3515
+    }
3516
+    // renvoyer un tableau detaille si $pathinfo==true
3517
+    $p = pathinfo($f);
3518
+    if (!isset($p['extension']) or !$p['extension']) {
3519
+        $p['extension'] = _EXTENSION_SQUELETTES;
3520
+    }
3521
+    if (!isset($p['extension']) or !$p['filename']) {
3522
+        $p['filename'] = ($p['basename'] ? substr($p['basename'], 0, -strlen($p['extension']) - 1) : '');
3523
+    }
3524
+    $p['fond'] = ($f ? substr($f, 0, -strlen($p['extension']) - 1) : '');
3526 3525
 
3527
-	return $p;
3526
+    return $p;
3528 3527
 }
3529 3528
 
3530 3529
 /**
@@ -3544,21 +3543,21 @@  discard block
 block discarded – undo
3544 3543
  *     Nom de l'exec, sinon chaîne vide.
3545 3544
  **/
3546 3545
 function tester_url_ecrire($nom) {
3547
-	static $exec = [];
3548
-	if (isset($exec[$nom])) {
3549
-		return $exec[$nom];
3550
-	}
3551
-	// tester si c'est une page en squelette
3552
-	if (trouver_fond($nom, 'prive/squelettes/contenu/')) {
3553
-		return $exec[$nom] = 'fond';
3554
-	} // echafaudage d'un fond !
3555
-	elseif (include_spip('public/styliser_par_z') and z_echafaudable($nom)) {
3556
-		return $exec[$nom] = 'fond';
3557
-	}
3558
-	// attention, il ne faut pas inclure l'exec ici
3559
-	// car sinon #URL_ECRIRE provoque des inclusions
3560
-	// et des define intrusifs potentiels
3561
-	return $exec[$nom] = ((find_in_path("{$nom}.php", 'exec/') or charger_fonction($nom, 'exec', true)) ? $nom : '');
3546
+    static $exec = [];
3547
+    if (isset($exec[$nom])) {
3548
+        return $exec[$nom];
3549
+    }
3550
+    // tester si c'est une page en squelette
3551
+    if (trouver_fond($nom, 'prive/squelettes/contenu/')) {
3552
+        return $exec[$nom] = 'fond';
3553
+    } // echafaudage d'un fond !
3554
+    elseif (include_spip('public/styliser_par_z') and z_echafaudable($nom)) {
3555
+        return $exec[$nom] = 'fond';
3556
+    }
3557
+    // attention, il ne faut pas inclure l'exec ici
3558
+    // car sinon #URL_ECRIRE provoque des inclusions
3559
+    // et des define intrusifs potentiels
3560
+    return $exec[$nom] = ((find_in_path("{$nom}.php", 'exec/') or charger_fonction($nom, 'exec', true)) ? $nom : '');
3562 3561
 }
3563 3562
 
3564 3563
 /**
@@ -3568,8 +3567,8 @@  discard block
 block discarded – undo
3568 3567
  *     true si la constante _VERSION_HTML n'est pas définie ou égale à html5
3569 3568
  **/
3570 3569
 function html5_permis() {
3571
-	return (!defined('_VERSION_HTML')
3572
-		or _VERSION_HTML !== 'html4');
3570
+    return (!defined('_VERSION_HTML')
3571
+        or _VERSION_HTML !== 'html4');
3573 3572
 }
3574 3573
 
3575 3574
 /**
@@ -3579,30 +3578,30 @@  discard block
 block discarded – undo
3579 3578
  * @return array
3580 3579
  */
3581 3580
 function formats_image_acceptables($gd = null, $svg_allowed = true) {
3582
-	$formats = null;
3583
-	if (!is_null($gd)) {
3584
-		$config = ($gd ? 'gd_formats' : 'formats_graphiques');
3585
-		if (isset($GLOBALS['meta'][$config])) {
3586
-			$formats = $GLOBALS['meta'][$config];
3587
-			$formats = explode(',', $formats);
3588
-			$formats = array_filter($formats);
3589
-			$formats = array_map('trim', $formats);
3590
-		}
3591
-	}
3592
-	if (is_null($formats)) {
3593
-		include_spip('inc/filtres_images_lib_mini');
3594
-		$formats = _image_extensions_acceptees_en_entree();
3595
-	}
3596
-
3597
-	if ($svg_allowed) {
3598
-		if (!in_array('svg', $formats)) {
3599
-			$formats[] = 'svg';
3600
-		}
3601
-	}
3602
-	else {
3603
-		$formats = array_diff($formats, ['svg']);
3604
-	}
3605
-	return $formats;
3581
+    $formats = null;
3582
+    if (!is_null($gd)) {
3583
+        $config = ($gd ? 'gd_formats' : 'formats_graphiques');
3584
+        if (isset($GLOBALS['meta'][$config])) {
3585
+            $formats = $GLOBALS['meta'][$config];
3586
+            $formats = explode(',', $formats);
3587
+            $formats = array_filter($formats);
3588
+            $formats = array_map('trim', $formats);
3589
+        }
3590
+    }
3591
+    if (is_null($formats)) {
3592
+        include_spip('inc/filtres_images_lib_mini');
3593
+        $formats = _image_extensions_acceptees_en_entree();
3594
+    }
3595
+
3596
+    if ($svg_allowed) {
3597
+        if (!in_array('svg', $formats)) {
3598
+            $formats[] = 'svg';
3599
+        }
3600
+    }
3601
+    else {
3602
+        $formats = array_diff($formats, ['svg']);
3603
+    }
3604
+    return $formats;
3606 3605
 }
3607 3606
 
3608 3607
 /**
@@ -3611,20 +3610,20 @@  discard block
 block discarded – undo
3611 3610
  * @return array|bool
3612 3611
  */
3613 3612
 function spip_getimagesize($fichier) {
3614
-	if (!$imagesize = @getimagesize($fichier)) {
3615
-		include_spip('inc/svg');
3616
-		if ($attrs = svg_lire_attributs($fichier)) {
3617
-			[$width, $height, $viewbox] = svg_getimagesize_from_attr($attrs);
3618
-			$imagesize = [
3619
-				$width,
3620
-				$height,
3621
-				IMAGETYPE_SVG,
3622
-				"width=\"{$width}\" height=\"{$height}\"",
3623
-				'mime' => 'image/svg+xml'
3624
-			];
3625
-		}
3626
-	}
3627
-	return $imagesize;
3613
+    if (!$imagesize = @getimagesize($fichier)) {
3614
+        include_spip('inc/svg');
3615
+        if ($attrs = svg_lire_attributs($fichier)) {
3616
+            [$width, $height, $viewbox] = svg_getimagesize_from_attr($attrs);
3617
+            $imagesize = [
3618
+                $width,
3619
+                $height,
3620
+                IMAGETYPE_SVG,
3621
+                "width=\"{$width}\" height=\"{$height}\"",
3622
+                'mime' => 'image/svg+xml'
3623
+            ];
3624
+        }
3625
+    }
3626
+    return $imagesize;
3628 3627
 }
3629 3628
 
3630 3629
 /**
@@ -3638,19 +3637,19 @@  discard block
 block discarded – undo
3638 3637
  * @param string $statut
3639 3638
  */
3640 3639
 function avertir_auteurs($nom, $message, $statut = '') {
3641
-	$alertes = $GLOBALS['meta']['message_alertes_auteurs'];
3642
-	if (
3643
-		!$alertes
3644
-		or !is_array($alertes = unserialize($alertes))
3645
-	) {
3646
-		$alertes = [];
3647
-	}
3640
+    $alertes = $GLOBALS['meta']['message_alertes_auteurs'];
3641
+    if (
3642
+        !$alertes
3643
+        or !is_array($alertes = unserialize($alertes))
3644
+    ) {
3645
+        $alertes = [];
3646
+    }
3648 3647
 
3649
-	if (!isset($alertes[$statut])) {
3650
-		$alertes[$statut] = [];
3651
-	}
3652
-	$alertes[$statut][$nom] = $message;
3653
-	ecrire_meta('message_alertes_auteurs', serialize($alertes));
3648
+    if (!isset($alertes[$statut])) {
3649
+        $alertes[$statut] = [];
3650
+    }
3651
+    $alertes[$statut][$nom] = $message;
3652
+    ecrire_meta('message_alertes_auteurs', serialize($alertes));
3654 3653
 }
3655 3654
 
3656 3655
 /**
@@ -3664,10 +3663,10 @@  discard block
 block discarded – undo
3664 3663
  * @return string|string[]
3665 3664
  */
3666 3665
 function spip_sanitize_classname($classes) {
3667
-	if (is_array($classes)) {
3668
-		return array_map('spip_sanitize_classname', $classes);
3669
-	}
3670
-	return preg_replace('/[^ 0-9a-z_\-+@]/i', '', $classes);
3666
+    if (is_array($classes)) {
3667
+        return array_map('spip_sanitize_classname', $classes);
3668
+    }
3669
+    return preg_replace('/[^ 0-9a-z_\-+@]/i', '', $classes);
3671 3670
 }
3672 3671
 
3673 3672
 
@@ -3692,32 +3691,32 @@  discard block
 block discarded – undo
3692 3691
  *    Avec operateur : bool.
3693 3692
  **/
3694 3693
 function spip_version_compare($v1, $v2, $op = null) {
3695
-	$v1 = strtolower(preg_replace(',([0-9])[\s.-]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v1));
3696
-	$v2 = strtolower(preg_replace(',([0-9])[\s.-]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v2));
3697
-	$v1 = str_replace('rc', 'RC', $v1); // certaines versions de PHP ne comprennent RC qu'en majuscule
3698
-	$v2 = str_replace('rc', 'RC', $v2); // certaines versions de PHP ne comprennent RC qu'en majuscule
3699
-
3700
-	$v1 = explode('.', $v1);
3701
-	$v2 = explode('.', $v2);
3702
-	// $v1 est toujours une version, donc sans etoile
3703
-	while (count($v1) < count($v2)) {
3704
-		$v1[] = '0';
3705
-	}
3706
-
3707
-	// $v2 peut etre une borne, donc accepte l'etoile
3708
-	$etoile = false;
3709
-	foreach ($v1 as $k => $v) {
3710
-		if (!isset($v2[$k])) {
3711
-			$v2[] = ($etoile and (is_numeric($v) or $v == 'pl' or $v == 'p')) ? $v : '0';
3712
-		} else {
3713
-			if ($v2[$k] == '*') {
3714
-				$etoile = true;
3715
-				$v2[$k] = $v;
3716
-			}
3717
-		}
3718
-	}
3719
-	$v1 = implode('.', $v1);
3720
-	$v2 = implode('.', $v2);
3721
-
3722
-	return $op ? version_compare($v1, $v2, $op) : version_compare($v1, $v2);
3694
+    $v1 = strtolower(preg_replace(',([0-9])[\s.-]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v1));
3695
+    $v2 = strtolower(preg_replace(',([0-9])[\s.-]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v2));
3696
+    $v1 = str_replace('rc', 'RC', $v1); // certaines versions de PHP ne comprennent RC qu'en majuscule
3697
+    $v2 = str_replace('rc', 'RC', $v2); // certaines versions de PHP ne comprennent RC qu'en majuscule
3698
+
3699
+    $v1 = explode('.', $v1);
3700
+    $v2 = explode('.', $v2);
3701
+    // $v1 est toujours une version, donc sans etoile
3702
+    while (count($v1) < count($v2)) {
3703
+        $v1[] = '0';
3704
+    }
3705
+
3706
+    // $v2 peut etre une borne, donc accepte l'etoile
3707
+    $etoile = false;
3708
+    foreach ($v1 as $k => $v) {
3709
+        if (!isset($v2[$k])) {
3710
+            $v2[] = ($etoile and (is_numeric($v) or $v == 'pl' or $v == 'p')) ? $v : '0';
3711
+        } else {
3712
+            if ($v2[$k] == '*') {
3713
+                $etoile = true;
3714
+                $v2[$k] = $v;
3715
+            }
3716
+        }
3717
+    }
3718
+    $v1 = implode('.', $v1);
3719
+    $v2 = implode('.', $v2);
3720
+
3721
+    return $op ? version_compare($v1, $v2, $op) : version_compare($v1, $v2);
3723 3722
 }
Please login to merge, or discard this patch.
Spacing   +123 added lines, -124 removed lines patch added patch discarded remove patch
@@ -53,12 +53,12 @@  discard block
 block discarded – undo
53 53
 	if (strlen($dossier) and substr($dossier, -1) != '/') {
54 54
 		$dossier .= '/';
55 55
 	}
56
-	$f = str_replace('/', '_', $dossier) . $nom;
56
+	$f = str_replace('/', '_', $dossier).$nom;
57 57
 
58 58
 	if (function_exists($f)) {
59 59
 		return $f;
60 60
 	}
61
-	if (function_exists($g = $f . '_dist')) {
61
+	if (function_exists($g = $f.'_dist')) {
62 62
 		return $g;
63 63
 	}
64 64
 
@@ -79,7 +79,7 @@  discard block
 block discarded – undo
79 79
 	// passer en minuscules (cf les balises de formulaires)
80 80
 	// et inclure le fichier
81 81
 	if (
82
-		!$inc = include_spip($dossier . ($d = strtolower($nom)))
82
+		!$inc = include_spip($dossier.($d = strtolower($nom)))
83 83
 		// si le fichier truc/machin/nom.php n'existe pas,
84 84
 		// la fonction peut etre definie dans truc/machin.php qui regroupe plusieurs petites fonctions
85 85
 		and strlen(dirname($dossier)) and dirname($dossier) != '.'
@@ -98,19 +98,19 @@  discard block
 block discarded – undo
98 98
 	}
99 99
 
100 100
 	// Echec : message d'erreur
101
-	spip_log("fonction $nom ($f ou $g) indisponible" .
101
+	spip_log("fonction $nom ($f ou $g) indisponible".
102 102
 		($inc ? '' : " (fichier $d absent de $dossier)"));
103 103
 
104 104
 	include_spip('inc/minipres');
105 105
 	echo minipres(
106 106
 		_T('forum_titre_erreur'),
107 107
 		$inc ?
108
-			_T('fonction_introuvable', ['fonction' => '<code>' . spip_htmlentities($f) . '</code>'])
108
+			_T('fonction_introuvable', ['fonction' => '<code>'.spip_htmlentities($f).'</code>'])
109 109
 			. '<br />'
110
-			. _T('fonction_introuvable', ['fonction' => '<code>' . spip_htmlentities($g) . '</code>'])
110
+			. _T('fonction_introuvable', ['fonction' => '<code>'.spip_htmlentities($g).'</code>'])
111 111
 			:
112
-			_T('fichier_introuvable', ['fichier' => '<code>' . spip_htmlentities($d) . '</code>']),
113
-		['all_inline' => true,'status' => 404]
112
+			_T('fichier_introuvable', ['fichier' => '<code>'.spip_htmlentities($d).'</code>']),
113
+		['all_inline' => true, 'status' => 404]
114 114
 	);
115 115
 	exit;
116 116
 }
@@ -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
 
@@ -193,7 +193,7 @@  discard block
 block discarded – undo
193 193
 		// donc il faut l'inclure "en globals"
194 194
 		if ($f = find_in_path('mes_fonctions.php')) {
195 195
 			global $dossier_squelettes;
196
-			include_once(_ROOT_CWD . $f);
196
+			include_once(_ROOT_CWD.$f);
197 197
 		}
198 198
 
199 199
 		if (@is_readable(_CACHE_PLUGINS_FCT)) {
@@ -298,7 +298,7 @@  discard block
 block discarded – undo
298 298
 	}
299 299
 
300 300
 	// appliquer notre fonction si elle existe
301
-	$fonc = 'execute_pipeline_' . strtolower($action);
301
+	$fonc = 'execute_pipeline_'.strtolower($action);
302 302
 	if (function_exists($fonc)) {
303 303
 		$val = $fonc($val);
304 304
 	} // plantage ?
@@ -363,7 +363,7 @@  discard block
 block discarded – undo
363 363
 function spip_log($message = null, $name = null) {
364 364
 	static $pre = [];
365 365
 	static $log;
366
-	preg_match('/^([a-z_]*)\.?(\d)?$/iS', (string)$name, $regs);
366
+	preg_match('/^([a-z_]*)\.?(\d)?$/iS', (string) $name, $regs);
367 367
 	if (!isset($regs[1]) or !$logname = $regs[1]) {
368 368
 		$logname = null;
369 369
 	}
@@ -391,7 +391,7 @@  discard block
 block discarded – undo
391 391
 		if (!is_string($message)) {
392 392
 			$message = print_r($message, true);
393 393
 		}
394
-		$log($pre[$niveau] . ' ' . $message, $logname);
394
+		$log($pre[$niveau].' '.$message, $logname);
395 395
 	}
396 396
 }
397 397
 
@@ -592,7 +592,7 @@  discard block
 block discarded – undo
592 592
 		$a = './';
593 593
 	}
594 594
 
595
-	$regexp = ',^(' . str_replace('[]', '\[\]', $c) . '[[]?[]]?)(=.*)?$,';
595
+	$regexp = ',^('.str_replace('[]', '\[\]', $c).'[[]?[]]?)(=.*)?$,';
596 596
 	$ajouts = array_flip(explode('|', $c));
597 597
 	$u = is_array($v) ? $v : rawurlencode((string) $v);
598 598
 	$testv = (is_array($v) ? count($v) : strlen((string) $v));
@@ -619,7 +619,7 @@  discard block
 block discarded – undo
619 619
 			// Ajout. Pour une variable, remplacer au meme endroit,
620 620
 			// pour un tableau ce sera fait dans la prochaine boucle
621 621
 			elseif (substr($r[1], -2) != '[]') {
622
-				$url[$n] = $r[1] . '=' . $u;
622
+				$url[$n] = $r[1].'='.$u;
623 623
 				unset($ajouts[$r[1]]);
624 624
 			}
625 625
 			// Pour les tableaux on laisse tomber les valeurs de
@@ -640,11 +640,11 @@  discard block
 block discarded – undo
640 640
 	} elseif ($testv) {
641 641
 		foreach ($ajouts as $k => $n) {
642 642
 			if (!is_array($v)) {
643
-				$url[] = $k . '=' . $u;
643
+				$url[] = $k.'='.$u;
644 644
 			} else {
645
-				$id = (substr($k, -2) == '[]') ? $k : ($k . '[]');
645
+				$id = (substr($k, -2) == '[]') ? $k : ($k.'[]');
646 646
 				foreach ($v as $w) {
647
-					$url[] = $id . '=' . (is_array($w) ? 'Array' : rawurlencode($w));
647
+					$url[] = $id.'='.(is_array($w) ? 'Array' : rawurlencode($w));
648 648
 				}
649 649
 			}
650 650
 		}
@@ -655,10 +655,10 @@  discard block
 block discarded – undo
655 655
 
656 656
 	// recomposer l'adresse
657 657
 	if ($url) {
658
-		$a .= '?' . join($sep, $url);
658
+		$a .= '?'.join($sep, $url);
659 659
 	}
660 660
 
661
-	return $a . $ancre;
661
+	return $a.$ancre;
662 662
 }
663 663
 
664 664
 /**
@@ -690,7 +690,7 @@  discard block
 block discarded – undo
690 690
 			translitteration($ancre)
691 691
 		);
692 692
 	}
693
-	return $url . (strlen($ancre) ? '#' . $ancre : '');
693
+	return $url.(strlen($ancre) ? '#'.$ancre : '');
694 694
 }
695 695
 
696 696
 /**
@@ -806,7 +806,7 @@  discard block
 block discarded – undo
806 806
  * @return bool
807 807
  */
808 808
 function test_plugin_actif($plugin) {
809
-	return ($plugin and defined('_DIR_PLUGIN_' . strtoupper($plugin))) ? true : false;
809
+	return ($plugin and defined('_DIR_PLUGIN_'.strtoupper($plugin))) ? true : false;
810 810
 }
811 811
 
812 812
 /**
@@ -938,7 +938,7 @@  discard block
 block discarded – undo
938 938
 					$value = interdire_scripts($value, -1);
939 939
 				}
940 940
 				if (!empty($options['class'])) {
941
-					$value = "<span class='" . $options['class'] . "'>$value</span>";
941
+					$value = "<span class='".$options['class']."'>$value</span>";
942 942
 				}
943 943
 				$text = str_replace("@$name@", $value, $text);
944 944
 				unset($args[$name]);
@@ -947,7 +947,7 @@  discard block
 block discarded – undo
947 947
 		// Si des variables n'ont pas ete inserees, le signaler
948 948
 		// (chaines de langues pas a jour)
949 949
 		if ($args) {
950
-			spip_log("$f:  variables inutilisees " . join(', ', array_keys($args)), _LOG_DEBUG);
950
+			spip_log("$f:  variables inutilisees ".join(', ', array_keys($args)), _LOG_DEBUG);
951 951
 		}
952 952
 	}
953 953
 
@@ -971,7 +971,7 @@  discard block
 block discarded – undo
971 971
 function joli_repertoire($rep) {
972 972
 	$a = substr($rep, 0, 1);
973 973
 	if ($a <> '.' and $a <> '/') {
974
-		$rep = (_DIR_RESTREINT ? '' : _DIR_RESTREINT_ABS) . $rep;
974
+		$rep = (_DIR_RESTREINT ? '' : _DIR_RESTREINT_ABS).$rep;
975 975
 	}
976 976
 	$rep = preg_replace(',(^\.\.\/),', '', $rep);
977 977
 
@@ -1025,7 +1025,7 @@  discard block
 block discarded – undo
1025 1025
 			$p -= ($x * 1000);
1026 1026
 		}
1027 1027
 
1028
-		return $s . sprintf($s ? '%07.3f ms' : '%.3f ms', $p);
1028
+		return $s.sprintf($s ? '%07.3f ms' : '%.3f ms', $p);
1029 1029
 	}
1030 1030
 }
1031 1031
 
@@ -1092,7 +1092,7 @@  discard block
 block discarded – undo
1092 1092
 	if ($taches and count($taches) and !spip_connect()) {
1093 1093
 		return false;
1094 1094
 	}
1095
-	spip_log('cron !', 'jq' . _LOG_DEBUG);
1095
+	spip_log('cron !', 'jq'._LOG_DEBUG);
1096 1096
 	if ($genie = charger_fonction('genie', 'inc', true)) {
1097 1097
 		return $genie($taches);
1098 1098
 	}
@@ -1196,7 +1196,7 @@  discard block
 block discarded – undo
1196 1196
 
1197 1197
 	if ($queue_next_job_time == -1) {
1198 1198
 		if (!defined('_JQ_NEXT_JOB_TIME_FILENAME')) {
1199
-			define('_JQ_NEXT_JOB_TIME_FILENAME', _DIR_TMP . 'job_queue_next.txt');
1199
+			define('_JQ_NEXT_JOB_TIME_FILENAME', _DIR_TMP.'job_queue_next.txt');
1200 1200
 		}
1201 1201
 		// utiliser un cache memoire si dispo
1202 1202
 		if (function_exists('cache_get') and defined('_MEMOIZE_MEMORY') and _MEMOIZE_MEMORY) {
@@ -1265,8 +1265,8 @@  discard block
 block discarded – undo
1265 1265
 		$src = '';
1266 1266
 	}
1267 1267
 	if ($script) {
1268
-		$script = ("/*<![CDATA[*/\n" .
1269
-			preg_replace(',</([^>]*)>,', '<\/\1>', $script) .
1268
+		$script = ("/*<![CDATA[*/\n".
1269
+			preg_replace(',</([^>]*)>,', '<\/\1>', $script).
1270 1270
 			'/*]]>*/');
1271 1271
 	}
1272 1272
 	if ($noscript) {
@@ -1352,13 +1352,13 @@  discard block
 block discarded – undo
1352 1352
 	if ($path_base == null) {
1353 1353
 		// Chemin standard depuis l'espace public
1354 1354
 		$path = defined('_SPIP_PATH') ? _SPIP_PATH :
1355
-			_DIR_RACINE . ':' .
1356
-			_DIR_RACINE . 'squelettes-dist/:' .
1357
-			_DIR_RACINE . 'prive/:' .
1355
+			_DIR_RACINE.':'.
1356
+			_DIR_RACINE.'squelettes-dist/:'.
1357
+			_DIR_RACINE.'prive/:'.
1358 1358
 			_DIR_RESTREINT;
1359 1359
 		// Ajouter squelettes/
1360
-		if (@is_dir(_DIR_RACINE . 'squelettes')) {
1361
-			$path = _DIR_RACINE . 'squelettes/:' . $path;
1360
+		if (@is_dir(_DIR_RACINE.'squelettes')) {
1361
+			$path = _DIR_RACINE.'squelettes/:'.$path;
1362 1362
 		}
1363 1363
 		foreach (explode(':', $path) as $dir) {
1364 1364
 			if (strlen($dir) and substr($dir, -1) != '/') {
@@ -1370,7 +1370,7 @@  discard block
 block discarded – undo
1370 1370
 		// Et le(s) dossier(s) des squelettes nommes
1371 1371
 		if (strlen($GLOBALS['dossier_squelettes'])) {
1372 1372
 			foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) {
1373
-				array_unshift($path_full, ($d[0] == '/' ? '' : _DIR_RACINE) . $d . '/');
1373
+				array_unshift($path_full, ($d[0] == '/' ? '' : _DIR_RACINE).$d.'/');
1374 1374
 			}
1375 1375
 		}
1376 1376
 		$GLOBALS['path_sig'] = md5(serialize($path_full));
@@ -1381,7 +1381,7 @@  discard block
 block discarded – undo
1381 1381
 
1382 1382
 	if (is_array($dir_path) or strlen($dir_path)) {
1383 1383
 		$tete = '';
1384
-		if (reset($path_base) == _DIR_RACINE . 'squelettes/') {
1384
+		if (reset($path_base) == _DIR_RACINE.'squelettes/') {
1385 1385
 			$tete = array_shift($path_base);
1386 1386
 		}
1387 1387
 		$dirs = (is_array($dir_path) ? $dir_path : explode(':', $dir_path));
@@ -1402,7 +1402,7 @@  discard block
 block discarded – undo
1402 1402
 	// Et le(s) dossier(s) des squelettes nommes
1403 1403
 	if (strlen($GLOBALS['dossier_squelettes'])) {
1404 1404
 		foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) {
1405
-			array_unshift($path_full, ((isset($d[0]) and $d[0] == '/') ? '' : _DIR_RACINE) . $d . '/');
1405
+			array_unshift($path_full, ((isset($d[0]) and $d[0] == '/') ? '' : _DIR_RACINE).$d.'/');
1406 1406
 		}
1407 1407
 	}
1408 1408
 
@@ -1473,14 +1473,14 @@  discard block
 block discarded – undo
1473 1473
 	// si il y a un .svg a la bonne taille (-16.svg) a cote, on l'utilise en remplacement du -16.png
1474 1474
 	if (
1475 1475
 		preg_match(',-(\d+)[.](png|gif|svg)$,', $file, $m)
1476
-		and $file_svg_generique = substr($file, 0, -strlen($m[0])) . '-xx.svg'
1476
+		and $file_svg_generique = substr($file, 0, -strlen($m[0])).'-xx.svg'
1477 1477
 		and $f = find_in_theme("$file_svg_generique")
1478 1478
 	) {
1479
-		if ($fsize = substr($f, 0, -6) . $m[1] . '.svg' and file_exists($fsize)) {
1479
+		if ($fsize = substr($f, 0, -6).$m[1].'.svg' and file_exists($fsize)) {
1480 1480
 			return $themefiles["$subdir$file"] = $fsize;
1481 1481
 		}
1482 1482
 		else {
1483
-			return $themefiles["$subdir$file"] = "$f?" . $m[1] . 'px';
1483
+			return $themefiles["$subdir$file"] = "$f?".$m[1].'px';
1484 1484
 		}
1485 1485
 	}
1486 1486
 
@@ -1490,7 +1490,7 @@  discard block
 block discarded – undo
1490 1490
 			return $themefiles["$subdir$file"] = $f;
1491 1491
 		}
1492 1492
 	}
1493
-	spip_log("$file introuvable dans le theme prive " . reset($themes), 'theme');
1493
+	spip_log("$file introuvable dans le theme prive ".reset($themes), 'theme');
1494 1494
 
1495 1495
 	return $themefiles["$subdir$file"] = '';
1496 1496
 }
@@ -1598,8 +1598,8 @@  discard block
 block discarded – undo
1598 1598
 			return false;
1599 1599
 		}
1600 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;
1601
+			include_once _ROOT_CWD.$GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file];
1602
+			$inc[$dirname][$file] = $inc[''][$dirname.$file] = true;
1603 1603
 		}
1604 1604
 
1605 1605
 		return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file];
@@ -1612,14 +1612,14 @@  discard block
 block discarded – undo
1612 1612
 	}
1613 1613
 
1614 1614
 	foreach (creer_chemin() as $dir) {
1615
-		if (!isset($dirs[$a = $dir . $dirname])) {
1616
-			$dirs[$a] = (is_dir(_ROOT_CWD . $a) || !$a);
1615
+		if (!isset($dirs[$a = $dir.$dirname])) {
1616
+			$dirs[$a] = (is_dir(_ROOT_CWD.$a) || !$a);
1617 1617
 		}
1618 1618
 		if ($dirs[$a]) {
1619
-			if (file_exists(_ROOT_CWD . ($a .= $file))) {
1619
+			if (file_exists(_ROOT_CWD.($a .= $file))) {
1620 1620
 				if ($include and !isset($inc[$dirname][$file])) {
1621
-					include_once _ROOT_CWD . $a;
1622
-					$inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
1621
+					include_once _ROOT_CWD.$a;
1622
+					$inc[$dirname][$file] = $inc[''][$dirname.$file] = true;
1623 1623
 				}
1624 1624
 				if (!defined('_SAUVER_CHEMIN')) {
1625 1625
 					// si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
@@ -1629,7 +1629,7 @@  discard block
 block discarded – undo
1629 1629
 					define('_SAUVER_CHEMIN', true);
1630 1630
 				}
1631 1631
 
1632
-				return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = $a;
1632
+				return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname.$file] = $a;
1633 1633
 			}
1634 1634
 		}
1635 1635
 	}
@@ -1655,7 +1655,7 @@  discard block
 block discarded – undo
1655 1655
 		define('_SAUVER_CHEMIN', true);
1656 1656
 	}
1657 1657
 
1658
-	return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = false;
1658
+	return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname.$file] = false;
1659 1659
 }
1660 1660
 
1661 1661
 function clear_path_cache() {
@@ -1725,12 +1725,12 @@  discard block
 block discarded – undo
1725 1725
 	// cas borderline si dans mes_options on appelle redirige_par_entete qui utilise _T et charge un fichier de langue
1726 1726
 	// on a pas encore inclus flock.php
1727 1727
 	if (!function_exists('preg_files')) {
1728
-		include_once _ROOT_RESTREINT . 'inc/flock.php';
1728
+		include_once _ROOT_RESTREINT.'inc/flock.php';
1729 1729
 	}
1730 1730
 
1731 1731
 	// Parcourir le chemin
1732 1732
 	foreach (creer_chemin() as $d) {
1733
-		$f = $d . $dir;
1733
+		$f = $d.$dir;
1734 1734
 		if (@is_dir($f)) {
1735 1735
 			$liste = preg_files($f, $pattern, $maxfiles - count($liste_fichiers), $recurs === true ? [] : $recurs);
1736 1736
 			foreach ($liste as $chemin) {
@@ -1780,9 +1780,9 @@  discard block
 block discarded – undo
1780 1780
 	if ($type === 'defaut') {
1781 1781
 		$objet = objet_type($quoi);
1782 1782
 		if (
1783
-			$f = charger_fonction('generer_' . $objet . '_url', 'urls', true)
1783
+			$f = charger_fonction('generer_'.$objet.'_url', 'urls', true)
1784 1784
 			// deprecated
1785
-			or $f = charger_fonction('generer_url_' . $objet, 'urls', true)
1785
+			or $f = charger_fonction('generer_url_'.$objet, 'urls', true)
1786 1786
 		) {
1787 1787
 			return $f;
1788 1788
 		}
@@ -1795,7 +1795,7 @@  discard block
 block discarded – undo
1795 1795
 	}
1796 1796
 
1797 1797
 	// inclure le module d'url
1798
-	include_spip('urls/' . $url_type);
1798
+	include_spip('urls/'.$url_type);
1799 1799
 
1800 1800
 	switch ($quoi) {
1801 1801
 		case 'page':
@@ -1826,7 +1826,7 @@  discard block
 block discarded – undo
1826 1826
 				return $f;
1827 1827
 			}
1828 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'){
1829
+			if (!$type and $url_type !== 'page') {
1830 1830
 				return charger_fonction_url($quoi, 'page');
1831 1831
 			}
1832 1832
 			return '';
@@ -1951,8 +1951,8 @@  discard block
 block discarded – undo
1951 1951
 	include_spip('base/connect_sql');
1952 1952
 	$id_type = id_table_objet($entite, $public);
1953 1953
 
1954
-	return _DIR_RACINE . get_spip_script('./')
1955
-	. '?' . _SPIP_PAGE . "=$entite&$id_type=$i&connect=$public"
1954
+	return _DIR_RACINE.get_spip_script('./')
1955
+	. '?'._SPIP_PAGE."=$entite&$id_type=$i&connect=$public"
1956 1956
 	. (!$args ? '' : "&$args")
1957 1957
 	. (!$ancre ? '' : "#$ancre");
1958 1958
 }
@@ -2123,7 +2123,7 @@  discard block
 block discarded – undo
2123 2123
 				!empty($_SERVER['QUERY_STRING'])
2124 2124
 				and !strpos($_SERVER['REQUEST_URI'], '?')
2125 2125
 			) {
2126
-				$GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
2126
+				$GLOBALS['REQUEST_URI'] .= '?'.$_SERVER['QUERY_STRING'];
2127 2127
 			}
2128 2128
 		}
2129 2129
 	}
@@ -2158,9 +2158,9 @@  discard block
 block discarded – undo
2158 2158
 		array_shift($myself);
2159 2159
 		$myself = implode('/', $myself);
2160 2160
 	}
2161
-	$url = join('/', array_slice(explode('/', $myself), 0, -1 - $prof)) . '/';
2161
+	$url = join('/', array_slice(explode('/', $myself), 0, -1 - $prof)).'/';
2162 2162
 
2163
-	$url = $http . '://' . rtrim($host, '/') . '/' . ltrim($url, '/');
2163
+	$url = $http.'://'.rtrim($host, '/').'/'.ltrim($url, '/');
2164 2164
 
2165 2165
 	return $url;
2166 2166
 }
@@ -2199,16 +2199,16 @@  discard block
 block discarded – undo
2199 2199
 function generer_url_ecrire(?string $script = '', $args = '', $no_entities = false, $rel = false) {
2200 2200
 	$script ??= '';
2201 2201
 	if (!$rel) {
2202
-		$rel = url_de_base() . _DIR_RESTREINT_ABS . _SPIP_ECRIRE_SCRIPT;
2202
+		$rel = url_de_base()._DIR_RESTREINT_ABS._SPIP_ECRIRE_SCRIPT;
2203 2203
 	} else {
2204 2204
 		if (!is_string($rel)) {
2205
-			$rel = _DIR_RESTREINT ?: './' . _SPIP_ECRIRE_SCRIPT;
2205
+			$rel = _DIR_RESTREINT ?: './'._SPIP_ECRIRE_SCRIPT;
2206 2206
 		}
2207 2207
 	}
2208 2208
 
2209 2209
 	[$script, $ancre] = array_pad(explode('#', $script), 2, null);
2210 2210
 	if ($script and ($script <> 'accueil' or $rel)) {
2211
-		$args = "?exec=$script" . (!$args ? '' : "&$args");
2211
+		$args = "?exec=$script".(!$args ? '' : "&$args");
2212 2212
 	} elseif ($args) {
2213 2213
 		$args = "?$args";
2214 2214
 	}
@@ -2216,7 +2216,7 @@  discard block
 block discarded – undo
2216 2216
 		$args .= "#$ancre";
2217 2217
 	}
2218 2218
 
2219
-	return $rel . ($no_entities ? $args : str_replace('&', '&amp;', $args));
2219
+	return $rel.($no_entities ? $args : str_replace('&', '&amp;', $args));
2220 2220
 }
2221 2221
 
2222 2222
 //
@@ -2298,10 +2298,10 @@  discard block
 block discarded – undo
2298 2298
 			$action = parametre_url($action, _SPIP_PAGE, $script, '&');
2299 2299
 		}
2300 2300
 		if ($args) {
2301
-			$action .= (strpos($action, '?') !== false ? '&' : '?') . $args;
2301
+			$action .= (strpos($action, '?') !== false ? '&' : '?').$args;
2302 2302
 		}
2303 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"));
2304
+		$url = ($rel ? _DIR_RACINE . $action : rtrim(url_de_base(), '/').preg_replace(',^/[.]/,', '/', "/$action"));
2305 2305
 	}
2306 2306
 
2307 2307
 	if (!$no_entities) {
@@ -2313,7 +2313,7 @@  discard block
 block discarded – undo
2313 2313
 
2314 2314
 function generer_url_prive($script, $args = '', $no_entities = false) {
2315 2315
 
2316
-	return generer_url_public($script, $args, $no_entities, false, _DIR_RESTREINT_ABS . 'prive.php');
2316
+	return generer_url_public($script, $args, $no_entities, false, _DIR_RESTREINT_ABS.'prive.php');
2317 2317
 }
2318 2318
 
2319 2319
 // Pour les formulaires en methode POST,
@@ -2348,8 +2348,7 @@  discard block
 block discarded – undo
2348 2348
 	. "><div>\n"
2349 2349
 	. "<input type='hidden' name='exec' value='$script1' />"
2350 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>'))
2351
+	. (!$submit ? '' : ("<div style='text-align: ".$GLOBALS['spip_lang_right']."'><input class='fondo submit btn' type='submit' value=\"".entites_html($submit).'" /></div>'))
2353 2352
 	. "</div></form>\n";
2354 2353
 }
2355 2354
 
@@ -2374,14 +2373,14 @@  discard block
 block discarded – undo
2374 2373
 		? generer_url_ecrire(_request('exec'))
2375 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 .
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.
2385 2384
 	'</div></form>';
2386 2385
 }
2387 2386
 
@@ -2409,7 +2408,7 @@  discard block
 block discarded – undo
2409 2408
 		: generer_url_public('', '', false, false);
2410 2409
 	$url = parametre_url($url, 'action', $script);
2411 2410
 	if ($args) {
2412
-		$url .= quote_amp('&' . $args);
2411
+		$url .= quote_amp('&'.$args);
2413 2412
 	}
2414 2413
 
2415 2414
 	if ($no_entities) {
@@ -2443,9 +2442,9 @@  discard block
 block discarded – undo
2443 2442
 	}
2444 2443
 	$url =
2445 2444
 		(($public ? _DIR_RACINE : _DIR_RESTREINT) ?: './')
2446
-	. $script . '/'
2445
+	. $script.'/'
2447 2446
 	. ($path ? trim($path, '/') : '')
2448
-	. ($args ? '?' . quote_amp($args) : '');
2447
+	. ($args ? '?'.quote_amp($args) : '');
2449 2448
 
2450 2449
 	if ($no_entities) {
2451 2450
 		$url = str_replace('&amp;', '&', $url);
@@ -2494,17 +2493,17 @@  discard block
 block discarded – undo
2494 2493
 
2495 2494
 	// le nom du repertoire plugins/ activables/desactivables
2496 2495
 	if (!defined('_DIR_PLUGINS')) {
2497
-		define('_DIR_PLUGINS', _DIR_RACINE . 'plugins/');
2496
+		define('_DIR_PLUGINS', _DIR_RACINE.'plugins/');
2498 2497
 	}
2499 2498
 
2500 2499
 	// le nom du repertoire des extensions/ permanentes du core, toujours actives
2501 2500
 	if (!defined('_DIR_PLUGINS_DIST')) {
2502
-		define('_DIR_PLUGINS_DIST', _DIR_RACINE . 'plugins-dist/');
2501
+		define('_DIR_PLUGINS_DIST', _DIR_RACINE.'plugins-dist/');
2503 2502
 	}
2504 2503
 
2505 2504
 	// le nom du repertoire des librairies
2506 2505
 	if (!defined('_DIR_LIB')) {
2507
-		define('_DIR_LIB', _DIR_RACINE . 'lib/');
2506
+		define('_DIR_LIB', _DIR_RACINE.'lib/');
2508 2507
 	}
2509 2508
 
2510 2509
 	if (!defined('_DIR_IMG')) {
@@ -2514,29 +2513,29 @@  discard block
 block discarded – undo
2514 2513
 		define('_DIR_LOGOS', $pa);
2515 2514
 	}
2516 2515
 	if (!defined('_DIR_IMG_ICONES')) {
2517
-		define('_DIR_IMG_ICONES', _DIR_LOGOS . 'icones/');
2516
+		define('_DIR_IMG_ICONES', _DIR_LOGOS.'icones/');
2518 2517
 	}
2519 2518
 
2520 2519
 	if (!defined('_DIR_DUMP')) {
2521
-		define('_DIR_DUMP', $ti . 'dump/');
2520
+		define('_DIR_DUMP', $ti.'dump/');
2522 2521
 	}
2523 2522
 	if (!defined('_DIR_SESSIONS')) {
2524
-		define('_DIR_SESSIONS', $ti . 'sessions/');
2523
+		define('_DIR_SESSIONS', $ti.'sessions/');
2525 2524
 	}
2526 2525
 	if (!defined('_DIR_TRANSFERT')) {
2527
-		define('_DIR_TRANSFERT', $ti . 'upload/');
2526
+		define('_DIR_TRANSFERT', $ti.'upload/');
2528 2527
 	}
2529 2528
 	if (!defined('_DIR_CACHE')) {
2530
-		define('_DIR_CACHE', $ti . 'cache/');
2529
+		define('_DIR_CACHE', $ti.'cache/');
2531 2530
 	}
2532 2531
 	if (!defined('_DIR_CACHE_XML')) {
2533
-		define('_DIR_CACHE_XML', _DIR_CACHE . 'xml/');
2532
+		define('_DIR_CACHE_XML', _DIR_CACHE.'xml/');
2534 2533
 	}
2535 2534
 	if (!defined('_DIR_SKELS')) {
2536
-		define('_DIR_SKELS', _DIR_CACHE . 'skel/');
2535
+		define('_DIR_SKELS', _DIR_CACHE.'skel/');
2537 2536
 	}
2538 2537
 	if (!defined('_DIR_AIDE')) {
2539
-		define('_DIR_AIDE', _DIR_CACHE . 'aide/');
2538
+		define('_DIR_AIDE', _DIR_CACHE.'aide/');
2540 2539
 	}
2541 2540
 	if (!defined('_DIR_TMP')) {
2542 2541
 		define('_DIR_TMP', $ti);
@@ -2565,27 +2564,27 @@  discard block
 block discarded – undo
2565 2564
 	// Declaration des fichiers
2566 2565
 
2567 2566
 	if (!defined('_CACHE_PLUGINS_PATH')) {
2568
-		define('_CACHE_PLUGINS_PATH', _DIR_CACHE . 'charger_plugins_chemins.php');
2567
+		define('_CACHE_PLUGINS_PATH', _DIR_CACHE.'charger_plugins_chemins.php');
2569 2568
 	}
2570 2569
 	if (!defined('_CACHE_PLUGINS_OPT')) {
2571
-		define('_CACHE_PLUGINS_OPT', _DIR_CACHE . 'charger_plugins_options.php');
2570
+		define('_CACHE_PLUGINS_OPT', _DIR_CACHE.'charger_plugins_options.php');
2572 2571
 	}
2573 2572
 	if (!defined('_CACHE_PLUGINS_FCT')) {
2574
-		define('_CACHE_PLUGINS_FCT', _DIR_CACHE . 'charger_plugins_fonctions.php');
2573
+		define('_CACHE_PLUGINS_FCT', _DIR_CACHE.'charger_plugins_fonctions.php');
2575 2574
 	}
2576 2575
 	if (!defined('_CACHE_PIPELINES')) {
2577
-		define('_CACHE_PIPELINES', _DIR_CACHE . 'charger_pipelines.php');
2576
+		define('_CACHE_PIPELINES', _DIR_CACHE.'charger_pipelines.php');
2578 2577
 	}
2579 2578
 	if (!defined('_CACHE_CHEMIN')) {
2580
-		define('_CACHE_CHEMIN', _DIR_CACHE . 'chemin.txt');
2579
+		define('_CACHE_CHEMIN', _DIR_CACHE.'chemin.txt');
2581 2580
 	}
2582 2581
 
2583 2582
 	# attention .php obligatoire pour ecrire_fichier_securise
2584 2583
 	if (!defined('_FILE_META')) {
2585
-		define('_FILE_META', $ti . 'meta_cache.php');
2584
+		define('_FILE_META', $ti.'meta_cache.php');
2586 2585
 	}
2587 2586
 	if (!defined('_DIR_LOG')) {
2588
-		define('_DIR_LOG', _DIR_TMP . 'log/');
2587
+		define('_DIR_LOG', _DIR_TMP.'log/');
2589 2588
 	}
2590 2589
 	if (!defined('_FILE_LOG')) {
2591 2590
 		define('_FILE_LOG', 'spip');
@@ -2602,8 +2601,8 @@  discard block
 block discarded – undo
2602 2601
 	if (!defined('_FILE_CONNECT')) {
2603 2602
 		define(
2604 2603
 			'_FILE_CONNECT',
2605
-			(@is_readable($f = _DIR_CONNECT . _FILE_CONNECT_INS . '.php') ? $f
2606
-			: (@is_readable($f = _DIR_RESTREINT . 'inc_connect.php') ? $f
2604
+			(@is_readable($f = _DIR_CONNECT._FILE_CONNECT_INS.'.php') ? $f
2605
+			: (@is_readable($f = _DIR_RESTREINT.'inc_connect.php') ? $f
2607 2606
 			: false))
2608 2607
 		);
2609 2608
 	}
@@ -2615,7 +2614,7 @@  discard block
 block discarded – undo
2615 2614
 	if (!defined('_FILE_CHMOD')) {
2616 2615
 		define(
2617 2616
 			'_FILE_CHMOD',
2618
-			(@is_readable($f = _DIR_CHMOD . _FILE_CHMOD_INS . '.php') ? $f
2617
+			(@is_readable($f = _DIR_CHMOD._FILE_CHMOD_INS.'.php') ? $f
2619 2618
 			: false)
2620 2619
 		);
2621 2620
 	}
@@ -2628,10 +2627,10 @@  discard block
 block discarded – undo
2628 2627
 		define('_FILE_TMP_SUFFIX', '.tmp.php');
2629 2628
 	}
2630 2629
 	if (!defined('_FILE_CONNECT_TMP')) {
2631
-		define('_FILE_CONNECT_TMP', _DIR_CONNECT . _FILE_CONNECT_INS . _FILE_TMP_SUFFIX);
2630
+		define('_FILE_CONNECT_TMP', _DIR_CONNECT._FILE_CONNECT_INS._FILE_TMP_SUFFIX);
2632 2631
 	}
2633 2632
 	if (!defined('_FILE_CHMOD_TMP')) {
2634
-		define('_FILE_CHMOD_TMP', _DIR_CHMOD . _FILE_CHMOD_INS . _FILE_TMP_SUFFIX);
2633
+		define('_FILE_CHMOD_TMP', _DIR_CHMOD._FILE_CHMOD_INS._FILE_TMP_SUFFIX);
2635 2634
 	}
2636 2635
 
2637 2636
 	// Definition des droits d'acces en ecriture
@@ -2649,13 +2648,13 @@  discard block
 block discarded – undo
2649 2648
 		define('_DEFAULT_CHARSET', 'utf-8');
2650 2649
 	}
2651 2650
 	if (!defined('_ROOT_PLUGINS')) {
2652
-		define('_ROOT_PLUGINS', _ROOT_RACINE . 'plugins/');
2651
+		define('_ROOT_PLUGINS', _ROOT_RACINE.'plugins/');
2653 2652
 	}
2654 2653
 	if (!defined('_ROOT_PLUGINS_DIST')) {
2655
-		define('_ROOT_PLUGINS_DIST', _ROOT_RACINE . 'plugins-dist/');
2654
+		define('_ROOT_PLUGINS_DIST', _ROOT_RACINE.'plugins-dist/');
2656 2655
 	}
2657 2656
 	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));
2657
+		define('_ROOT_PLUGINS_SUPPL', _ROOT_RACINE.str_replace(_DIR_RACINE, '', _DIR_PLUGINS_SUPPL));
2659 2658
 	}
2660 2659
 
2661 2660
 	// La taille des Log
@@ -2692,7 +2691,7 @@  discard block
 block discarded – undo
2692 2691
 	// (non surchargeable en l'etat ; attention si on utilise include_spip()
2693 2692
 	// pour le rendre surchargeable, on va provoquer un reecriture
2694 2693
 	// systematique du noyau ou une baisse de perfs => a etudier)
2695
-	include_once _ROOT_RESTREINT . 'inc/flock.php';
2694
+	include_once _ROOT_RESTREINT.'inc/flock.php';
2696 2695
 
2697 2696
 	// charger tout de suite le path et son cache
2698 2697
 	load_path_cache();
@@ -2740,7 +2739,7 @@  discard block
 block discarded – undo
2740 2739
 			!empty($_SERVER['QUERY_STRING'])
2741 2740
 			and !strpos($_SERVER['REQUEST_URI'], '?')
2742 2741
 		) {
2743
-			$GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
2742
+			$GLOBALS['REQUEST_URI'] .= '?'.$_SERVER['QUERY_STRING'];
2744 2743
 		}
2745 2744
 	}
2746 2745
 
@@ -2776,7 +2775,7 @@  discard block
 block discarded – undo
2776 2775
 		) {
2777 2776
 			if (isset($GLOBALS['meta']['adresse_site'])) {
2778 2777
 				$uri_ref = parse_url($GLOBALS['meta']['adresse_site']);
2779
-				$uri_ref = ($uri_ref['path'] ?? '') . '/';
2778
+				$uri_ref = ($uri_ref['path'] ?? '').'/';
2780 2779
 			} else {
2781 2780
 				$uri_ref = '';
2782 2781
 			}
@@ -2870,7 +2869,7 @@  discard block
 block discarded – undo
2870 2869
 	}
2871 2870
 	if (!defined('_CACHE_RUBRIQUES')) {
2872 2871
 		/** Fichier cache pour le navigateur de rubrique du bandeau */
2873
-		define('_CACHE_RUBRIQUES', _DIR_TMP . 'menu-rubriques-cache.txt');
2872
+		define('_CACHE_RUBRIQUES', _DIR_TMP.'menu-rubriques-cache.txt');
2874 2873
 	}
2875 2874
 	if (!defined('_CACHE_RUBRIQUES_MAX')) {
2876 2875
 		/** Nombre maxi de rubriques enfants affichées pour chaque rubrique du navigateur de rubrique du bandeau */
@@ -3092,7 +3091,7 @@  discard block
 block discarded – undo
3092 3091
 					}
3093 3092
 					if (isset($GLOBALS['visiteur_session']['nom'])) {
3094 3093
 						spip_log($GLOBALS['visiteur_session']['nom']
3095
-							. ' ' . _VAR_MODE);
3094
+							. ' '._VAR_MODE);
3096 3095
 					}
3097 3096
 				} // pas autorise ?
3098 3097
 				else {
@@ -3107,7 +3106,7 @@  discard block
 block discarded – undo
3107 3106
 						if (strpos($self, 'page=login') === false) {
3108 3107
 							include_spip('inc/headers');
3109 3108
 							$redirect = parametre_url(self('&', true), 'var_mode', $_GET['var_mode'], '&');
3110
-							redirige_par_entete(generer_url_public('login', 'url=' . rawurlencode($redirect), true));
3109
+							redirige_par_entete(generer_url_public('login', 'url='.rawurlencode($redirect), true));
3111 3110
 						}
3112 3111
 					}
3113 3112
 					// sinon tant pis
@@ -3149,10 +3148,10 @@  discard block
 block discarded – undo
3149 3148
 	// mais on risque de perturber des plugins en initialisant trop tot
3150 3149
 	// certaines constantes
3151 3150
 	@spip_initialisation_core(
3152
-		(_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES),
3153
-		(_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES),
3154
-		(_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES),
3155
-		(_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
3151
+		(_DIR_RACINE._NOM_PERMANENTS_INACCESSIBLES),
3152
+		(_DIR_RACINE._NOM_PERMANENTS_ACCESSIBLES),
3153
+		(_DIR_RACINE._NOM_TEMPORAIRES_INACCESSIBLES),
3154
+		(_DIR_RACINE._NOM_TEMPORAIRES_ACCESSIBLES)
3156 3155
 	);
3157 3156
 
3158 3157
 	// Demarrer une session NON AUTHENTIFIEE si on donne son nom
@@ -3185,7 +3184,7 @@  discard block
 block discarded – undo
3185 3184
 	}
3186 3185
 
3187 3186
 	$h = (isset($_SERVER['PHP_AUTH_USER']) and !$GLOBALS['ignore_auth_http']);
3188
-	if ($h or isset($_COOKIE['spip_session']) or isset($_COOKIE[$GLOBALS['cookie_prefix'] . '_session'])) {
3187
+	if ($h or isset($_COOKIE['spip_session']) or isset($_COOKIE[$GLOBALS['cookie_prefix'].'_session'])) {
3189 3188
 		$session = charger_fonction('session', 'inc');
3190 3189
 		if ($session()) {
3191 3190
 			return $GLOBALS['visiteur_session']['statut'];
@@ -3265,7 +3264,7 @@  discard block
 block discarded – undo
3265 3264
 			'definir_session',
3266 3265
 			$GLOBALS['visiteur_session']
3267 3266
 				? serialize($GLOBALS['visiteur_session'])
3268
-				. '_' . @$_COOKIE['spip_session']
3267
+				. '_'.@$_COOKIE['spip_session']
3269 3268
 				: ''
3270 3269
 		);
3271 3270
 		$session = $s ? substr(md5($s), 0, 8) : '';
@@ -3421,11 +3420,11 @@  discard block
 block discarded – undo
3421 3420
 	$GLOBALS['_INC_PUBLIC']++;
3422 3421
 
3423 3422
 	// fix #4235
3424
-	$cache_utilise_session_appelant	= ($GLOBALS['cache_utilise_session'] ?? null);
3423
+	$cache_utilise_session_appelant = ($GLOBALS['cache_utilise_session'] ?? null);
3425 3424
 
3426 3425
 
3427 3426
 	foreach (is_array($fond) ? $fond : [$fond] as $f) {
3428
-		unset($GLOBALS['cache_utilise_session']);	// fix #4235
3427
+		unset($GLOBALS['cache_utilise_session']); // fix #4235
3429 3428
 
3430 3429
 		$page = evaluer_fond($f, $contexte, $connect);
3431 3430
 		if ($page === '') {
@@ -3510,7 +3509,7 @@  discard block
 block discarded – undo
3510 3509
  * @return array|string
3511 3510
  */
3512 3511
 function trouver_fond($nom, $dir = '', $pathinfo = false) {
3513
-	$f = find_in_path($nom . '.' . _EXTENSION_SQUELETTES, $dir ? rtrim($dir, '/') . '/' : '');
3512
+	$f = find_in_path($nom.'.'._EXTENSION_SQUELETTES, $dir ? rtrim($dir, '/').'/' : '');
3514 3513
 	if (!$pathinfo) {
3515 3514
 		return $f;
3516 3515
 	}
Please login to merge, or discard this patch.
ecrire/inc/chiffrer.php 1 patch
Indentation   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@
 block discarded – undo
11 11
  * \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 include_spip('src/Chiffrer/Chiffrement');
Please login to merge, or discard this patch.
ecrire/base/objets.php 1 patch
Indentation   +1257 added lines, -1257 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
 /**
@@ -32,11 +32,11 @@  discard block
 block discarded – undo
32 32
  * @return void
33 33
  **/
34 34
 function array_set_merge(&$table, $index, $valeur) {
35
-	if (!isset($table[$index])) {
36
-		$table[$index] = $valeur;
37
-	} else {
38
-		$table[$index] = array_merge($table[$index], $valeur);
39
-	}
35
+    if (!isset($table[$index])) {
36
+        $table[$index] = $valeur;
37
+    } else {
38
+        $table[$index] = array_merge($table[$index], $valeur);
39
+    }
40 40
 }
41 41
 
42 42
 /**
@@ -55,441 +55,441 @@  discard block
 block discarded – undo
55 55
  *   - string (interne) si table '::md5' retourne un hash
56 56
  */
57 57
 function lister_tables_objets_sql(?string $table_sql = null, $desc = []) {
58
-	static $deja_la = false;
59
-	static $infos_tables = null;
60
-	static $md5 = null;
61
-	static $plugin_hash = null;
62
-
63
-	// plugins hash connu ? non si _CACHE_PLUGINS_OPT est pas encore chargé.
64
-	$_PLUGINS_HASH = defined('_PLUGINS_HASH') ? _PLUGINS_HASH : '!_CACHE_PLUGINS_OPT';
65
-
66
-	// prealablement recuperer les tables_principales
67
-	if (is_null($infos_tables) or $plugin_hash !== $_PLUGINS_HASH) {
68
-		// pas de reentrance (cas base/serial)
69
-		if ($deja_la) {
70
-			spip_log('Re-entrance anormale sur lister_tables_objets_sql : '
71
-				. var_export(debug_backtrace(), true), _LOG_CRITIQUE);
72
-
73
-			return ($table_sql === '::md5' ? $md5 : []);
74
-		}
75
-		$deja_la = true;
76
-		$plugin_hash = $_PLUGINS_HASH; // avant de lancer les pipelines
77
-
78
-		// recuperer les declarations explicites ancienne mode
79
-		// qui servent a completer declarer_tables_objets_sql
80
-		base_serial($GLOBALS['tables_principales']);
81
-		base_auxiliaires($GLOBALS['tables_auxiliaires']);
82
-		$infos_tables = [
83
-			'spip_articles' => [
84
-				'page' => 'article',
85
-				'texte_retour' => 'icone_retour_article',
86
-				'texte_modifier' => 'icone_modifier_article',
87
-				'texte_creer' => 'icone_ecrire_article',
88
-				'texte_objets' => 'public:articles',
89
-				'texte_objet' => 'public:article',
90
-				'texte_signale_edition' => 'texte_travail_article',
91
-				'info_aucun_objet' => 'info_aucun_article',
92
-				'info_1_objet' => 'info_1_article',
93
-				'info_nb_objets' => 'info_nb_articles',
94
-				'texte_logo_objet' => 'logo_article',
95
-				'texte_langue_objet' => 'titre_langue_article',
96
-				'texte_definir_comme_traduction_objet' => 'trad_lier',
97
-				'titre' => 'titre, lang',
98
-				'date' => 'date',
99
-				'principale' => 'oui',
100
-				'introduction_longueur' => '500',
101
-				'champs_editables' => [
102
-					'surtitre',
103
-					'titre',
104
-					'soustitre',
105
-					'descriptif',
106
-					'nom_site',
107
-					'url_site',
108
-					'chapo',
109
-					'texte',
110
-					'ps',
111
-					'virtuel'
112
-				],
113
-				'champs_versionnes' => [
114
-					'id_rubrique',
115
-					'surtitre',
116
-					'titre',
117
-					'soustitre',
118
-					'jointure_auteurs',
119
-					'descriptif',
120
-					'nom_site',
121
-					'url_site',
122
-					'chapo',
123
-					'texte',
124
-					'ps'
125
-				],
126
-				'field' => [
127
-					'id_article' => 'bigint(21) NOT NULL',
128
-					'surtitre' => "text DEFAULT '' NOT NULL",
129
-					'titre' => "text DEFAULT '' NOT NULL",
130
-					'soustitre' => "text DEFAULT '' NOT NULL",
131
-					'id_rubrique' => "bigint(21) DEFAULT '0' NOT NULL",
132
-					'descriptif' => "text DEFAULT '' NOT NULL",
133
-					'chapo' => "mediumtext DEFAULT '' NOT NULL",
134
-					'texte' => "longtext DEFAULT '' NOT NULL",
135
-					'ps' => "mediumtext DEFAULT '' NOT NULL",
136
-					'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
137
-					'statut' => "varchar(10) DEFAULT '0' NOT NULL",
138
-					'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL",
139
-					'maj' => 'TIMESTAMP',
140
-					'export' => "VARCHAR(10) DEFAULT 'oui'",
141
-					'date_redac' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
142
-					'visites' => "integer DEFAULT '0' NOT NULL",
143
-					'referers' => "integer DEFAULT '0' NOT NULL",
144
-					'popularite' => "DOUBLE DEFAULT '0' NOT NULL",
145
-					'accepter_forum' => "CHAR(3) DEFAULT '' NOT NULL",
146
-					'date_modif' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
147
-					'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
148
-					'langue_choisie' => "VARCHAR(3) DEFAULT 'non'",
149
-					'id_trad' => "bigint(21) DEFAULT '0' NOT NULL",
150
-					'nom_site' => "tinytext DEFAULT '' NOT NULL",
151
-					'url_site' => "text DEFAULT '' NOT NULL",
152
-					'virtuel' => "text DEFAULT '' NOT NULL",
153
-				],
154
-				'key' => [
155
-					'PRIMARY KEY' => 'id_article',
156
-					'KEY id_rubrique' => 'id_rubrique',
157
-					'KEY id_secteur' => 'id_secteur',
158
-					'KEY id_trad' => 'id_trad',
159
-					'KEY lang' => 'lang',
160
-					'KEY statut' => 'statut, date',
161
-				],
162
-				'join' => [
163
-					'id_article' => 'id_article',
164
-					'id_rubrique' => 'id_rubrique'
165
-				],
166
-				'parent' => [
167
-					['type' => 'rubrique', 'champ' => 'id_rubrique']
168
-				],
169
-				'rechercher_champs' => [
170
-					'surtitre' => 5,
171
-					'titre' => 8,
172
-					'soustitre' => 5,
173
-					'chapo' => 3,
174
-					'texte' => 1,
175
-					'ps' => 1,
176
-					'nom_site' => 1,
177
-					'url_site' => 1,
178
-					'descriptif' => 4
179
-				],
180
-				'rechercher_jointures' => [
181
-					'auteur' => ['nom' => 10],
182
-				],
183
-				'statut' => [
184
-					[
185
-						'champ' => 'statut',
186
-						'publie' => 'publie',
187
-						'previsu' => 'publie,prop,prepa/auteur',
188
-						'post_date' => 'date',
189
-						'exception' => ['statut', 'tout']
190
-					]
191
-				],
192
-				'statut_titres' => [
193
-					'prepa' => 'info_article_redaction',
194
-					'prop' => 'info_article_propose',
195
-					'publie' => 'info_article_publie',
196
-					'refuse' => 'info_article_refuse',
197
-					'poubelle' => 'info_article_supprime'
198
-				],
199
-				'statut_textes_instituer' => [
200
-					'prepa' => 'texte_statut_en_cours_redaction',
201
-					'prop' => 'texte_statut_propose_evaluation',
202
-					'publie' => 'texte_statut_publie',
203
-					'refuse' => 'texte_statut_refuse',
204
-					'poubelle' => 'texte_statut_poubelle',
205
-				],
206
-				'texte_changer_statut' => 'texte_article_statut',
207
-				'aide_changer_statut' => 'artstatut',
208
-				'tables_jointures' => [
209
-					'profondeur' => 'rubriques',
210
-					#'id_auteur' => 'auteurs_liens' // declaration generique plus bas
211
-				],
212
-			],
213
-			'spip_auteurs' => [
214
-				'page' => 'auteur',
215
-				'texte_retour' => 'icone_retour',
216
-				'texte_ajouter' => 'titre_ajouter_un_auteur',
217
-				'texte_modifier' => 'admin_modifier_auteur',
218
-				'texte_objets' => 'icone_auteurs',
219
-				'texte_objet' => 'public:auteur',
220
-				'info_aucun_objet' => 'info_aucun_auteur',
221
-				'info_1_objet' => 'info_1_auteur',
222
-				'info_nb_objets' => 'info_nb_auteurs',
223
-				'texte_logo_objet' => 'logo_auteur',
224
-				'texte_creer_associer' => 'creer_et_associer_un_auteur',
225
-				'titre' => "nom AS titre, '' AS lang",
226
-				'date' => 'date',
227
-				'principale' => 'oui',
228
-				'champs_editables' => ['nom', 'email', 'bio', 'nom_site', 'url_site', 'imessage', 'pgp'],
229
-				'champs_versionnes' => ['nom', 'bio', 'email', 'nom_site', 'url_site', 'login'],
230
-				'field' => [
231
-					'id_auteur' => 'bigint(21) NOT NULL',
232
-					'nom' => "text DEFAULT '' NOT NULL",
233
-					'bio' => "text DEFAULT '' NOT NULL",
234
-					'email' => "tinytext DEFAULT '' NOT NULL",
235
-					'nom_site' => "tinytext DEFAULT '' NOT NULL",
236
-					'url_site' => "text DEFAULT '' NOT NULL",
237
-					'login' => 'VARCHAR(255) BINARY',
238
-					'pass' => "tinytext DEFAULT '' NOT NULL",
239
-					'low_sec' => "tinytext DEFAULT '' NOT NULL",
240
-					'statut' => "varchar(255)  DEFAULT '0' NOT NULL",
241
-					'webmestre' => "varchar(3)  DEFAULT 'non' NOT NULL",
242
-					'maj' => 'TIMESTAMP',
243
-					'pgp' => "TEXT DEFAULT '' NOT NULL",
244
-					'htpass' => "tinytext DEFAULT '' NOT NULL",
245
-					'en_ligne' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
246
-					'alea_actuel' => 'tinytext',
247
-					'alea_futur' => 'tinytext',
248
-					'prefs' => 'text',
249
-					'cookie_oubli' => 'tinytext',
250
-					'source' => "VARCHAR(10) DEFAULT 'spip' NOT NULL",
251
-					'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
252
-					'imessage' => "VARCHAR(3) DEFAULT '' NOT NULL",
253
-					'backup_cles' => "mediumtext DEFAULT '' NOT NULL",
254
-				],
255
-				'key' => [
256
-					'PRIMARY KEY' => 'id_auteur',
257
-					'KEY login' => 'login',
258
-					'KEY statut' => 'statut',
259
-					'KEY en_ligne' => 'en_ligne',
260
-				],
261
-				'join' => [
262
-					'id_auteur' => 'id_auteur',
263
-					'login' => 'login'
264
-				],
265
-				'rechercher_champs' => [
266
-					'nom' => 5,
267
-					'bio' => 1,
268
-					'email' => 1,
269
-					'nom_site' => 1,
270
-					'url_site' => 1,
271
-					'login' => 1
272
-				],
273
-				// 2 conditions pour les auteurs : statut!=poubelle,
274
-				// et avoir des articles publies
275
-				'statut' => [
276
-					[
277
-						'champ' => 'statut',
278
-						'publie' => '!5poubelle',
279
-						'previsu' => '!5poubelle',
280
-						'exception' => 'statut'
281
-					],
282
-					[
283
-						'champ' => [
284
-							['spip_auteurs_liens', 'id_auteur'],
285
-							[
286
-								'spip_articles',
287
-								['id_objet', 'id_article', 'objet', 'article']
288
-							],
289
-							'statut'
290
-						],
291
-						'publie' => 'publie',
292
-						'previsu' => '!',
293
-						'post_date' => 'date',
294
-						'exception' => ['statut', 'lien', 'tout']
295
-					],
296
-				],
297
-				'statut_images' => [
298
-					'auteur-6forum-16.png',
299
-					'0minirezo' => 'auteur-0minirezo-16.png',
300
-					'1comite' => 'auteur-1comite-16.png',
301
-					'6forum' => 'auteur-6forum-16.png',
302
-					'5poubelle' => 'auteur-5poubelle-16.png',
303
-					'nouveau' => ''
304
-				],
305
-				'statut_titres' => [
306
-					'titre_image_visiteur',
307
-					'0minirezo' => 'titre_image_administrateur',
308
-					'1comite' => 'titre_image_redacteur_02',
309
-					'6forum' => 'titre_image_visiteur',
310
-					'5poubelle' => 'titre_image_auteur_supprime',
311
-				],
312
-				'tables_jointures' => [#'auteurs_liens' // declaration generique plus bas
313
-				],
314
-			],
315
-			'spip_rubriques' => [
316
-				'page' => 'rubrique',
317
-				'url_voir' => 'rubrique',
318
-				'url_edit' => 'rubrique_edit',
319
-				'texte_retour' => 'icone_retour',
320
-				'texte_objets' => 'public:rubriques',
321
-				'texte_objet' => 'public:rubrique',
322
-				'texte_modifier' => 'icone_modifier_rubrique',
323
-				'texte_creer' => 'icone_creer_rubrique',
324
-				'texte_ajouter' => 'titre_ajouter_une_rubrique',
325
-				'texte_creer_associer' => 'creer_et_associer_une_rubrique',
326
-				'info_aucun_objet' => 'info_aucun_rubrique',
327
-				'info_1_objet' => 'info_1_rubrique',
328
-				'info_nb_objets' => 'info_nb_rubriques',
329
-				'texte_logo_objet' => 'logo_rubrique',
330
-				'texte_langue_objet' => 'titre_langue_rubrique',
331
-				'texte_definir_comme_traduction_objet' => 'texte_definir_comme_traduction_rubrique',
332
-				'titre' => 'titre, lang',
333
-				'date' => 'date',
334
-				'principale' => 'oui',
335
-				'introduction_longueur' => '600',
336
-				'champs_editables' => ['titre', 'texte', 'descriptif', 'extra'],
337
-				'champs_versionnes' => ['titre', 'descriptif', 'texte'],
338
-				'field' => [
339
-					'id_rubrique' => 'bigint(21) NOT NULL',
340
-					'id_parent' => "bigint(21) DEFAULT '0' NOT NULL",
341
-					'titre' => "text DEFAULT '' NOT NULL",
342
-					'descriptif' => "text DEFAULT '' NOT NULL",
343
-					'texte' => "longtext DEFAULT '' NOT NULL",
344
-					'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL",
345
-					'maj' => 'TIMESTAMP',
346
-					'statut' => "varchar(10) DEFAULT '0' NOT NULL",
347
-					'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
348
-					'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
349
-					'langue_choisie' => "VARCHAR(3) DEFAULT 'non'",
350
-					'statut_tmp' => "varchar(10) DEFAULT '0' NOT NULL",
351
-					'date_tmp' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
352
-					'profondeur' => "smallint(5) DEFAULT '0' NOT NULL"
353
-				],
354
-				'key' => [
355
-					'PRIMARY KEY' => 'id_rubrique',
356
-					'KEY lang' => 'lang',
357
-					'KEY id_parent' => 'id_parent',
358
-				],
359
-				'parent' => [
360
-					['type' => 'rubrique', 'champ' => 'id_parent']
361
-				],
362
-				'rechercher_champs' => [
363
-					'titre' => 8,
364
-					'descriptif' => 5,
365
-					'texte' => 1
366
-				],
367
-				'statut' => [
368
-					[
369
-						'champ' => 'statut',
370
-						'publie' => 'publie',
371
-						'previsu' => '!',
372
-						'exception' => ['statut', 'tout']
373
-					],
374
-				],
375
-				'tables_jointures' => [#'id_auteur' => 'auteurs_liens' // declaration generique plus bas
376
-				],
377
-			],
378
-			// toutes les tables ont le droit a une jointure sur les auteurs
379
-			['tables_jointures' => ['id_auteur' => 'auteurs_liens']]
380
-		];
381
-
382
-		// avant d'appeller les pipeline qui peuvent generer une reentrance a l'install
383
-		// initialiser la signature
384
-		$md5 = md5(serialize($infos_tables));
385
-
386
-		$GLOBALS['tables_principales'] = pipeline('declarer_tables_principales', $GLOBALS['tables_principales']);
387
-		$GLOBALS['tables_auxiliaires'] = pipeline('declarer_tables_auxiliaires', $GLOBALS['tables_auxiliaires']);
388
-		$infos_tables = pipeline('declarer_tables_objets_sql', $infos_tables);
389
-
390
-		// completer les informations manquantes ou implicites
391
-		$all = [];
392
-		foreach (array_keys($infos_tables) as $t) {
393
-			// les cles numeriques servent a declarer
394
-			// les proprietes applicables a tous les objets
395
-			// on les mets de cote
396
-			if (is_numeric($t)) {
397
-				$all = array_merge_recursive($all, $infos_tables[$t]);
398
-				unset($infos_tables[$t]);
399
-			} else {
400
-				$infos_tables[$t] = renseigner_table_objet_sql($t, $infos_tables[$t]);
401
-			}
402
-		}
403
-
404
-		// repercuter les proprietes generales communes a tous les objets
405
-		foreach (array_keys($infos_tables) as $t) {
406
-			foreach ($all as $i => $v) {
407
-				if (in_array($i, ['tables_jointures', 'champs_versionnes'])) {
408
-					$add = $all[$i];
409
-					// eviter les doublons de declaration de table jointure (ex des mots sur auteurs)
410
-					// pour les declarations generiques avec cles numeriques
411
-					if ($i == 'tables_jointures' and isset($infos_tables[$t][$i]) and is_countable($infos_tables[$t][$i]) ? count($infos_tables[$t][$i]) : 0) {
412
-						$doublons = array_intersect($infos_tables[$t][$i], $add);
413
-						foreach ($doublons as $d) {
414
-							if (
415
-								is_numeric(array_search($d, $infos_tables[$t][$i]))
416
-								and is_numeric($k = array_search($d, $add))
417
-							) {
418
-								unset($add[$k]);
419
-							}
420
-						}
421
-					}
422
-					$infos_tables[$t][$i] = array_merge($infos_tables[$t][$i] ?? [], $add);
423
-				} else {
424
-					$infos_tables[$t][$i] = array_merge_recursive(
425
-						$infos_tables[$t][$i] ?? [],
426
-						$all[$i]
427
-					);
428
-				}
429
-			}
430
-		}
431
-
432
-		// completer les tables principales et auxiliaires
433
-		// avec celles declarees uniquement dans declarer_table_objets_sql
434
-		// pour assurer la compat en transition
435
-		foreach ($infos_tables as $table => $infos) {
436
-			$principale_ou_auxiliaire = ($infos['principale'] ? 'tables_principales' : 'tables_auxiliaires');
437
-			// memoriser des champs eventuels declares par des plugins dans le pipeline tables_xxx
438
-			// qui a ete appelle avant
439
-			$mem = ($GLOBALS[$principale_ou_auxiliaire][$table] ?? []);
440
-			// l'ajouter au tableau
441
-			$GLOBALS[$principale_ou_auxiliaire][$table] = [];
442
-			if (isset($infos['field']) and isset($infos['key'])) {
443
-				foreach (['field', 'key', 'join'] as $k) {
444
-					if (isset($infos_tables[$table][$k])) {
445
-						$GLOBALS[$principale_ou_auxiliaire][$table][$k] = &$infos_tables[$table][$k];
446
-					}
447
-				}
448
-			} else {
449
-				// ici on ne renvoie que les declarations, donc RIEN
450
-				// pour avoir la vrai description en base, il faut passer par trouver_table
451
-				$GLOBALS[$principale_ou_auxiliaire][$table] = [];
452
-			}
453
-			if (is_countable($mem) ? count($mem) : 0) {
454
-				foreach (array_keys($mem) as $k) {
455
-					if (isset($GLOBALS[$principale_ou_auxiliaire][$table][$k])) {
456
-						$GLOBALS[$principale_ou_auxiliaire][$table][$k] = array_merge(
457
-							$GLOBALS[$principale_ou_auxiliaire][$table][$k],
458
-							$mem[$k]
459
-						);
460
-					} else {
461
-						$GLOBALS[$principale_ou_auxiliaire][$table][$k] = $mem[$k];
462
-					}
463
-				}
464
-			}
465
-		}
466
-
467
-		// recuperer les interfaces (table_titre, table_date)
468
-		// on ne le fait que dans un second temps pour que table_objet soit fonctionnel
469
-		// dans le pipeline de declarer_tables_interfaces
470
-		include_spip('public/interfaces');
471
-		foreach (array_keys($infos_tables) as $t) {
472
-			$infos_tables[$t] = renseigner_table_objet_interfaces($t, $infos_tables[$t]);
473
-		}
474
-
475
-		$deja_la = false;
476
-		// signature
477
-		$md5 = md5(serialize($infos_tables));
478
-	}
479
-	if ($table_sql === '::md5') {
480
-		return $md5;
481
-	}
482
-	if ($table_sql and !isset($infos_tables[$table_sql])) {
483
-		#$desc = renseigner_table_objet_sql($table_sql,$desc);
484
-		$desc = renseigner_table_objet_interfaces($table_sql, $desc);
485
-
486
-		return $desc;
487
-	}
488
-	if ($table_sql) {
489
-		return $infos_tables[$table_sql] ?? [];
490
-	}
491
-
492
-	return $infos_tables;
58
+    static $deja_la = false;
59
+    static $infos_tables = null;
60
+    static $md5 = null;
61
+    static $plugin_hash = null;
62
+
63
+    // plugins hash connu ? non si _CACHE_PLUGINS_OPT est pas encore chargé.
64
+    $_PLUGINS_HASH = defined('_PLUGINS_HASH') ? _PLUGINS_HASH : '!_CACHE_PLUGINS_OPT';
65
+
66
+    // prealablement recuperer les tables_principales
67
+    if (is_null($infos_tables) or $plugin_hash !== $_PLUGINS_HASH) {
68
+        // pas de reentrance (cas base/serial)
69
+        if ($deja_la) {
70
+            spip_log('Re-entrance anormale sur lister_tables_objets_sql : '
71
+                . var_export(debug_backtrace(), true), _LOG_CRITIQUE);
72
+
73
+            return ($table_sql === '::md5' ? $md5 : []);
74
+        }
75
+        $deja_la = true;
76
+        $plugin_hash = $_PLUGINS_HASH; // avant de lancer les pipelines
77
+
78
+        // recuperer les declarations explicites ancienne mode
79
+        // qui servent a completer declarer_tables_objets_sql
80
+        base_serial($GLOBALS['tables_principales']);
81
+        base_auxiliaires($GLOBALS['tables_auxiliaires']);
82
+        $infos_tables = [
83
+            'spip_articles' => [
84
+                'page' => 'article',
85
+                'texte_retour' => 'icone_retour_article',
86
+                'texte_modifier' => 'icone_modifier_article',
87
+                'texte_creer' => 'icone_ecrire_article',
88
+                'texte_objets' => 'public:articles',
89
+                'texte_objet' => 'public:article',
90
+                'texte_signale_edition' => 'texte_travail_article',
91
+                'info_aucun_objet' => 'info_aucun_article',
92
+                'info_1_objet' => 'info_1_article',
93
+                'info_nb_objets' => 'info_nb_articles',
94
+                'texte_logo_objet' => 'logo_article',
95
+                'texte_langue_objet' => 'titre_langue_article',
96
+                'texte_definir_comme_traduction_objet' => 'trad_lier',
97
+                'titre' => 'titre, lang',
98
+                'date' => 'date',
99
+                'principale' => 'oui',
100
+                'introduction_longueur' => '500',
101
+                'champs_editables' => [
102
+                    'surtitre',
103
+                    'titre',
104
+                    'soustitre',
105
+                    'descriptif',
106
+                    'nom_site',
107
+                    'url_site',
108
+                    'chapo',
109
+                    'texte',
110
+                    'ps',
111
+                    'virtuel'
112
+                ],
113
+                'champs_versionnes' => [
114
+                    'id_rubrique',
115
+                    'surtitre',
116
+                    'titre',
117
+                    'soustitre',
118
+                    'jointure_auteurs',
119
+                    'descriptif',
120
+                    'nom_site',
121
+                    'url_site',
122
+                    'chapo',
123
+                    'texte',
124
+                    'ps'
125
+                ],
126
+                'field' => [
127
+                    'id_article' => 'bigint(21) NOT NULL',
128
+                    'surtitre' => "text DEFAULT '' NOT NULL",
129
+                    'titre' => "text DEFAULT '' NOT NULL",
130
+                    'soustitre' => "text DEFAULT '' NOT NULL",
131
+                    'id_rubrique' => "bigint(21) DEFAULT '0' NOT NULL",
132
+                    'descriptif' => "text DEFAULT '' NOT NULL",
133
+                    'chapo' => "mediumtext DEFAULT '' NOT NULL",
134
+                    'texte' => "longtext DEFAULT '' NOT NULL",
135
+                    'ps' => "mediumtext DEFAULT '' NOT NULL",
136
+                    'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
137
+                    'statut' => "varchar(10) DEFAULT '0' NOT NULL",
138
+                    'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL",
139
+                    'maj' => 'TIMESTAMP',
140
+                    'export' => "VARCHAR(10) DEFAULT 'oui'",
141
+                    'date_redac' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
142
+                    'visites' => "integer DEFAULT '0' NOT NULL",
143
+                    'referers' => "integer DEFAULT '0' NOT NULL",
144
+                    'popularite' => "DOUBLE DEFAULT '0' NOT NULL",
145
+                    'accepter_forum' => "CHAR(3) DEFAULT '' NOT NULL",
146
+                    'date_modif' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
147
+                    'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
148
+                    'langue_choisie' => "VARCHAR(3) DEFAULT 'non'",
149
+                    'id_trad' => "bigint(21) DEFAULT '0' NOT NULL",
150
+                    'nom_site' => "tinytext DEFAULT '' NOT NULL",
151
+                    'url_site' => "text DEFAULT '' NOT NULL",
152
+                    'virtuel' => "text DEFAULT '' NOT NULL",
153
+                ],
154
+                'key' => [
155
+                    'PRIMARY KEY' => 'id_article',
156
+                    'KEY id_rubrique' => 'id_rubrique',
157
+                    'KEY id_secteur' => 'id_secteur',
158
+                    'KEY id_trad' => 'id_trad',
159
+                    'KEY lang' => 'lang',
160
+                    'KEY statut' => 'statut, date',
161
+                ],
162
+                'join' => [
163
+                    'id_article' => 'id_article',
164
+                    'id_rubrique' => 'id_rubrique'
165
+                ],
166
+                'parent' => [
167
+                    ['type' => 'rubrique', 'champ' => 'id_rubrique']
168
+                ],
169
+                'rechercher_champs' => [
170
+                    'surtitre' => 5,
171
+                    'titre' => 8,
172
+                    'soustitre' => 5,
173
+                    'chapo' => 3,
174
+                    'texte' => 1,
175
+                    'ps' => 1,
176
+                    'nom_site' => 1,
177
+                    'url_site' => 1,
178
+                    'descriptif' => 4
179
+                ],
180
+                'rechercher_jointures' => [
181
+                    'auteur' => ['nom' => 10],
182
+                ],
183
+                'statut' => [
184
+                    [
185
+                        'champ' => 'statut',
186
+                        'publie' => 'publie',
187
+                        'previsu' => 'publie,prop,prepa/auteur',
188
+                        'post_date' => 'date',
189
+                        'exception' => ['statut', 'tout']
190
+                    ]
191
+                ],
192
+                'statut_titres' => [
193
+                    'prepa' => 'info_article_redaction',
194
+                    'prop' => 'info_article_propose',
195
+                    'publie' => 'info_article_publie',
196
+                    'refuse' => 'info_article_refuse',
197
+                    'poubelle' => 'info_article_supprime'
198
+                ],
199
+                'statut_textes_instituer' => [
200
+                    'prepa' => 'texte_statut_en_cours_redaction',
201
+                    'prop' => 'texte_statut_propose_evaluation',
202
+                    'publie' => 'texte_statut_publie',
203
+                    'refuse' => 'texte_statut_refuse',
204
+                    'poubelle' => 'texte_statut_poubelle',
205
+                ],
206
+                'texte_changer_statut' => 'texte_article_statut',
207
+                'aide_changer_statut' => 'artstatut',
208
+                'tables_jointures' => [
209
+                    'profondeur' => 'rubriques',
210
+                    #'id_auteur' => 'auteurs_liens' // declaration generique plus bas
211
+                ],
212
+            ],
213
+            'spip_auteurs' => [
214
+                'page' => 'auteur',
215
+                'texte_retour' => 'icone_retour',
216
+                'texte_ajouter' => 'titre_ajouter_un_auteur',
217
+                'texte_modifier' => 'admin_modifier_auteur',
218
+                'texte_objets' => 'icone_auteurs',
219
+                'texte_objet' => 'public:auteur',
220
+                'info_aucun_objet' => 'info_aucun_auteur',
221
+                'info_1_objet' => 'info_1_auteur',
222
+                'info_nb_objets' => 'info_nb_auteurs',
223
+                'texte_logo_objet' => 'logo_auteur',
224
+                'texte_creer_associer' => 'creer_et_associer_un_auteur',
225
+                'titre' => "nom AS titre, '' AS lang",
226
+                'date' => 'date',
227
+                'principale' => 'oui',
228
+                'champs_editables' => ['nom', 'email', 'bio', 'nom_site', 'url_site', 'imessage', 'pgp'],
229
+                'champs_versionnes' => ['nom', 'bio', 'email', 'nom_site', 'url_site', 'login'],
230
+                'field' => [
231
+                    'id_auteur' => 'bigint(21) NOT NULL',
232
+                    'nom' => "text DEFAULT '' NOT NULL",
233
+                    'bio' => "text DEFAULT '' NOT NULL",
234
+                    'email' => "tinytext DEFAULT '' NOT NULL",
235
+                    'nom_site' => "tinytext DEFAULT '' NOT NULL",
236
+                    'url_site' => "text DEFAULT '' NOT NULL",
237
+                    'login' => 'VARCHAR(255) BINARY',
238
+                    'pass' => "tinytext DEFAULT '' NOT NULL",
239
+                    'low_sec' => "tinytext DEFAULT '' NOT NULL",
240
+                    'statut' => "varchar(255)  DEFAULT '0' NOT NULL",
241
+                    'webmestre' => "varchar(3)  DEFAULT 'non' NOT NULL",
242
+                    'maj' => 'TIMESTAMP',
243
+                    'pgp' => "TEXT DEFAULT '' NOT NULL",
244
+                    'htpass' => "tinytext DEFAULT '' NOT NULL",
245
+                    'en_ligne' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
246
+                    'alea_actuel' => 'tinytext',
247
+                    'alea_futur' => 'tinytext',
248
+                    'prefs' => 'text',
249
+                    'cookie_oubli' => 'tinytext',
250
+                    'source' => "VARCHAR(10) DEFAULT 'spip' NOT NULL",
251
+                    'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
252
+                    'imessage' => "VARCHAR(3) DEFAULT '' NOT NULL",
253
+                    'backup_cles' => "mediumtext DEFAULT '' NOT NULL",
254
+                ],
255
+                'key' => [
256
+                    'PRIMARY KEY' => 'id_auteur',
257
+                    'KEY login' => 'login',
258
+                    'KEY statut' => 'statut',
259
+                    'KEY en_ligne' => 'en_ligne',
260
+                ],
261
+                'join' => [
262
+                    'id_auteur' => 'id_auteur',
263
+                    'login' => 'login'
264
+                ],
265
+                'rechercher_champs' => [
266
+                    'nom' => 5,
267
+                    'bio' => 1,
268
+                    'email' => 1,
269
+                    'nom_site' => 1,
270
+                    'url_site' => 1,
271
+                    'login' => 1
272
+                ],
273
+                // 2 conditions pour les auteurs : statut!=poubelle,
274
+                // et avoir des articles publies
275
+                'statut' => [
276
+                    [
277
+                        'champ' => 'statut',
278
+                        'publie' => '!5poubelle',
279
+                        'previsu' => '!5poubelle',
280
+                        'exception' => 'statut'
281
+                    ],
282
+                    [
283
+                        'champ' => [
284
+                            ['spip_auteurs_liens', 'id_auteur'],
285
+                            [
286
+                                'spip_articles',
287
+                                ['id_objet', 'id_article', 'objet', 'article']
288
+                            ],
289
+                            'statut'
290
+                        ],
291
+                        'publie' => 'publie',
292
+                        'previsu' => '!',
293
+                        'post_date' => 'date',
294
+                        'exception' => ['statut', 'lien', 'tout']
295
+                    ],
296
+                ],
297
+                'statut_images' => [
298
+                    'auteur-6forum-16.png',
299
+                    '0minirezo' => 'auteur-0minirezo-16.png',
300
+                    '1comite' => 'auteur-1comite-16.png',
301
+                    '6forum' => 'auteur-6forum-16.png',
302
+                    '5poubelle' => 'auteur-5poubelle-16.png',
303
+                    'nouveau' => ''
304
+                ],
305
+                'statut_titres' => [
306
+                    'titre_image_visiteur',
307
+                    '0minirezo' => 'titre_image_administrateur',
308
+                    '1comite' => 'titre_image_redacteur_02',
309
+                    '6forum' => 'titre_image_visiteur',
310
+                    '5poubelle' => 'titre_image_auteur_supprime',
311
+                ],
312
+                'tables_jointures' => [#'auteurs_liens' // declaration generique plus bas
313
+                ],
314
+            ],
315
+            'spip_rubriques' => [
316
+                'page' => 'rubrique',
317
+                'url_voir' => 'rubrique',
318
+                'url_edit' => 'rubrique_edit',
319
+                'texte_retour' => 'icone_retour',
320
+                'texte_objets' => 'public:rubriques',
321
+                'texte_objet' => 'public:rubrique',
322
+                'texte_modifier' => 'icone_modifier_rubrique',
323
+                'texte_creer' => 'icone_creer_rubrique',
324
+                'texte_ajouter' => 'titre_ajouter_une_rubrique',
325
+                'texte_creer_associer' => 'creer_et_associer_une_rubrique',
326
+                'info_aucun_objet' => 'info_aucun_rubrique',
327
+                'info_1_objet' => 'info_1_rubrique',
328
+                'info_nb_objets' => 'info_nb_rubriques',
329
+                'texte_logo_objet' => 'logo_rubrique',
330
+                'texte_langue_objet' => 'titre_langue_rubrique',
331
+                'texte_definir_comme_traduction_objet' => 'texte_definir_comme_traduction_rubrique',
332
+                'titre' => 'titre, lang',
333
+                'date' => 'date',
334
+                'principale' => 'oui',
335
+                'introduction_longueur' => '600',
336
+                'champs_editables' => ['titre', 'texte', 'descriptif', 'extra'],
337
+                'champs_versionnes' => ['titre', 'descriptif', 'texte'],
338
+                'field' => [
339
+                    'id_rubrique' => 'bigint(21) NOT NULL',
340
+                    'id_parent' => "bigint(21) DEFAULT '0' NOT NULL",
341
+                    'titre' => "text DEFAULT '' NOT NULL",
342
+                    'descriptif' => "text DEFAULT '' NOT NULL",
343
+                    'texte' => "longtext DEFAULT '' NOT NULL",
344
+                    'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL",
345
+                    'maj' => 'TIMESTAMP',
346
+                    'statut' => "varchar(10) DEFAULT '0' NOT NULL",
347
+                    'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
348
+                    'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
349
+                    'langue_choisie' => "VARCHAR(3) DEFAULT 'non'",
350
+                    'statut_tmp' => "varchar(10) DEFAULT '0' NOT NULL",
351
+                    'date_tmp' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
352
+                    'profondeur' => "smallint(5) DEFAULT '0' NOT NULL"
353
+                ],
354
+                'key' => [
355
+                    'PRIMARY KEY' => 'id_rubrique',
356
+                    'KEY lang' => 'lang',
357
+                    'KEY id_parent' => 'id_parent',
358
+                ],
359
+                'parent' => [
360
+                    ['type' => 'rubrique', 'champ' => 'id_parent']
361
+                ],
362
+                'rechercher_champs' => [
363
+                    'titre' => 8,
364
+                    'descriptif' => 5,
365
+                    'texte' => 1
366
+                ],
367
+                'statut' => [
368
+                    [
369
+                        'champ' => 'statut',
370
+                        'publie' => 'publie',
371
+                        'previsu' => '!',
372
+                        'exception' => ['statut', 'tout']
373
+                    ],
374
+                ],
375
+                'tables_jointures' => [#'id_auteur' => 'auteurs_liens' // declaration generique plus bas
376
+                ],
377
+            ],
378
+            // toutes les tables ont le droit a une jointure sur les auteurs
379
+            ['tables_jointures' => ['id_auteur' => 'auteurs_liens']]
380
+        ];
381
+
382
+        // avant d'appeller les pipeline qui peuvent generer une reentrance a l'install
383
+        // initialiser la signature
384
+        $md5 = md5(serialize($infos_tables));
385
+
386
+        $GLOBALS['tables_principales'] = pipeline('declarer_tables_principales', $GLOBALS['tables_principales']);
387
+        $GLOBALS['tables_auxiliaires'] = pipeline('declarer_tables_auxiliaires', $GLOBALS['tables_auxiliaires']);
388
+        $infos_tables = pipeline('declarer_tables_objets_sql', $infos_tables);
389
+
390
+        // completer les informations manquantes ou implicites
391
+        $all = [];
392
+        foreach (array_keys($infos_tables) as $t) {
393
+            // les cles numeriques servent a declarer
394
+            // les proprietes applicables a tous les objets
395
+            // on les mets de cote
396
+            if (is_numeric($t)) {
397
+                $all = array_merge_recursive($all, $infos_tables[$t]);
398
+                unset($infos_tables[$t]);
399
+            } else {
400
+                $infos_tables[$t] = renseigner_table_objet_sql($t, $infos_tables[$t]);
401
+            }
402
+        }
403
+
404
+        // repercuter les proprietes generales communes a tous les objets
405
+        foreach (array_keys($infos_tables) as $t) {
406
+            foreach ($all as $i => $v) {
407
+                if (in_array($i, ['tables_jointures', 'champs_versionnes'])) {
408
+                    $add = $all[$i];
409
+                    // eviter les doublons de declaration de table jointure (ex des mots sur auteurs)
410
+                    // pour les declarations generiques avec cles numeriques
411
+                    if ($i == 'tables_jointures' and isset($infos_tables[$t][$i]) and is_countable($infos_tables[$t][$i]) ? count($infos_tables[$t][$i]) : 0) {
412
+                        $doublons = array_intersect($infos_tables[$t][$i], $add);
413
+                        foreach ($doublons as $d) {
414
+                            if (
415
+                                is_numeric(array_search($d, $infos_tables[$t][$i]))
416
+                                and is_numeric($k = array_search($d, $add))
417
+                            ) {
418
+                                unset($add[$k]);
419
+                            }
420
+                        }
421
+                    }
422
+                    $infos_tables[$t][$i] = array_merge($infos_tables[$t][$i] ?? [], $add);
423
+                } else {
424
+                    $infos_tables[$t][$i] = array_merge_recursive(
425
+                        $infos_tables[$t][$i] ?? [],
426
+                        $all[$i]
427
+                    );
428
+                }
429
+            }
430
+        }
431
+
432
+        // completer les tables principales et auxiliaires
433
+        // avec celles declarees uniquement dans declarer_table_objets_sql
434
+        // pour assurer la compat en transition
435
+        foreach ($infos_tables as $table => $infos) {
436
+            $principale_ou_auxiliaire = ($infos['principale'] ? 'tables_principales' : 'tables_auxiliaires');
437
+            // memoriser des champs eventuels declares par des plugins dans le pipeline tables_xxx
438
+            // qui a ete appelle avant
439
+            $mem = ($GLOBALS[$principale_ou_auxiliaire][$table] ?? []);
440
+            // l'ajouter au tableau
441
+            $GLOBALS[$principale_ou_auxiliaire][$table] = [];
442
+            if (isset($infos['field']) and isset($infos['key'])) {
443
+                foreach (['field', 'key', 'join'] as $k) {
444
+                    if (isset($infos_tables[$table][$k])) {
445
+                        $GLOBALS[$principale_ou_auxiliaire][$table][$k] = &$infos_tables[$table][$k];
446
+                    }
447
+                }
448
+            } else {
449
+                // ici on ne renvoie que les declarations, donc RIEN
450
+                // pour avoir la vrai description en base, il faut passer par trouver_table
451
+                $GLOBALS[$principale_ou_auxiliaire][$table] = [];
452
+            }
453
+            if (is_countable($mem) ? count($mem) : 0) {
454
+                foreach (array_keys($mem) as $k) {
455
+                    if (isset($GLOBALS[$principale_ou_auxiliaire][$table][$k])) {
456
+                        $GLOBALS[$principale_ou_auxiliaire][$table][$k] = array_merge(
457
+                            $GLOBALS[$principale_ou_auxiliaire][$table][$k],
458
+                            $mem[$k]
459
+                        );
460
+                    } else {
461
+                        $GLOBALS[$principale_ou_auxiliaire][$table][$k] = $mem[$k];
462
+                    }
463
+                }
464
+            }
465
+        }
466
+
467
+        // recuperer les interfaces (table_titre, table_date)
468
+        // on ne le fait que dans un second temps pour que table_objet soit fonctionnel
469
+        // dans le pipeline de declarer_tables_interfaces
470
+        include_spip('public/interfaces');
471
+        foreach (array_keys($infos_tables) as $t) {
472
+            $infos_tables[$t] = renseigner_table_objet_interfaces($t, $infos_tables[$t]);
473
+        }
474
+
475
+        $deja_la = false;
476
+        // signature
477
+        $md5 = md5(serialize($infos_tables));
478
+    }
479
+    if ($table_sql === '::md5') {
480
+        return $md5;
481
+    }
482
+    if ($table_sql and !isset($infos_tables[$table_sql])) {
483
+        #$desc = renseigner_table_objet_sql($table_sql,$desc);
484
+        $desc = renseigner_table_objet_interfaces($table_sql, $desc);
485
+
486
+        return $desc;
487
+    }
488
+    if ($table_sql) {
489
+        return $infos_tables[$table_sql] ?? [];
490
+    }
491
+
492
+    return $infos_tables;
493 493
 }
494 494
 
495 495
 
@@ -504,27 +504,27 @@  discard block
 block discarded – undo
504 504
  **/
505 505
 function base_serial(&$tables_principales) {
506 506
 
507
-	$spip_jobs = [
508
-		'id_job' => 'bigint(21) NOT NULL',
509
-		'descriptif' => "text DEFAULT '' NOT NULL",
510
-		'fonction' => 'varchar(255) NOT NULL', //nom de la fonction
511
-		'args' => "longblob DEFAULT '' NOT NULL", // arguments
512
-		'md5args' => "char(32) NOT NULL default ''", // signature des arguments
513
-		'inclure' => 'varchar(255) NOT NULL', // fichier a inclure ou path/ pour charger_fonction
514
-		'priorite' => 'smallint(6) NOT NULL default 0',
515
-		'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // date au plus tot
516
-		'status' => 'tinyint NOT NULL default 1',
517
-	];
518
-
519
-	$spip_jobs_key = [
520
-		'PRIMARY KEY' => 'id_job',
521
-		'KEY date' => 'date',
522
-		'KEY status' => 'status',
523
-	];
524
-
525
-	/// Attention: mes_fonctions peut avoir deja defini cette variable
526
-	/// il faut donc rajouter, mais pas reinitialiser
527
-	$tables_principales['spip_jobs'] = ['field' => &$spip_jobs, 'key' => &$spip_jobs_key];
507
+    $spip_jobs = [
508
+        'id_job' => 'bigint(21) NOT NULL',
509
+        'descriptif' => "text DEFAULT '' NOT NULL",
510
+        'fonction' => 'varchar(255) NOT NULL', //nom de la fonction
511
+        'args' => "longblob DEFAULT '' NOT NULL", // arguments
512
+        'md5args' => "char(32) NOT NULL default ''", // signature des arguments
513
+        'inclure' => 'varchar(255) NOT NULL', // fichier a inclure ou path/ pour charger_fonction
514
+        'priorite' => 'smallint(6) NOT NULL default 0',
515
+        'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // date au plus tot
516
+        'status' => 'tinyint NOT NULL default 1',
517
+    ];
518
+
519
+    $spip_jobs_key = [
520
+        'PRIMARY KEY' => 'id_job',
521
+        'KEY date' => 'date',
522
+        'KEY status' => 'status',
523
+    ];
524
+
525
+    /// Attention: mes_fonctions peut avoir deja defini cette variable
526
+    /// il faut donc rajouter, mais pas reinitialiser
527
+    $tables_principales['spip_jobs'] = ['field' => &$spip_jobs, 'key' => &$spip_jobs_key];
528 528
 }
529 529
 
530 530
 
@@ -536,71 +536,71 @@  discard block
 block discarded – undo
536 536
  * @return void
537 537
  **/
538 538
 function base_auxiliaires(&$tables_auxiliaires) {
539
-	$spip_resultats = [
540
-		'recherche' => "char(16) DEFAULT '' NOT NULL",
541
-		'id' => 'INT UNSIGNED NOT NULL',
542
-		'points' => "INT UNSIGNED DEFAULT '0' NOT NULL",
543
-		'table_objet' => "varchar(30) DEFAULT '' NOT NULL",
544
-		'serveur' => "char(16) DEFAULT '' NOT NULL", // hash md5 partiel du serveur de base ('' pour le serveur principal)
545
-		'maj' => 'TIMESTAMP'
546
-	];
547
-
548
-	$spip_resultats_key = [// pas de cle ni index, ca fait des insertions plus rapides et les requetes jointes utilisees en recheche ne sont pas plus lentes ...
549
-	];
550
-
551
-	$spip_auteurs_liens = [
552
-		'id_auteur' => "bigint(21) DEFAULT '0' NOT NULL",
553
-		'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
554
-		'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
555
-		'vu' => "VARCHAR(6) DEFAULT 'non' NOT NULL"
556
-	];
557
-
558
-	$spip_auteurs_liens_key = [
559
-		'PRIMARY KEY' => 'id_auteur,id_objet,objet',
560
-		'KEY id_auteur' => 'id_auteur',
561
-		'KEY id_objet' => 'id_objet',
562
-		'KEY objet' => 'objet',
563
-	];
564
-
565
-	$spip_meta = [
566
-		'nom' => 'VARCHAR (255) NOT NULL',
567
-		'valeur' => "text DEFAULT ''",
568
-		'impt' => "ENUM('non', 'oui') DEFAULT 'oui' NOT NULL",
569
-		'maj' => 'TIMESTAMP'
570
-	];
571
-
572
-	$spip_meta_key = [
573
-		'PRIMARY KEY' => 'nom'
574
-	];
575
-
576
-	$spip_jobs_liens = [
577
-		'id_job' => "bigint(21) DEFAULT '0' NOT NULL",
578
-		'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
579
-		'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
580
-	];
581
-
582
-	$spip_jobs_liens_key = [
583
-		'PRIMARY KEY' => 'id_job,id_objet,objet',
584
-		'KEY id_job' => 'id_job'
585
-	];
586
-
587
-	$tables_auxiliaires['spip_auteurs_liens'] = [
588
-		'field' => &$spip_auteurs_liens,
589
-		'key' => &$spip_auteurs_liens_key
590
-	];
591
-
592
-	$tables_auxiliaires['spip_meta'] = [
593
-		'field' => &$spip_meta,
594
-		'key' => &$spip_meta_key
595
-	];
596
-	$tables_auxiliaires['spip_resultats'] = [
597
-		'field' => &$spip_resultats,
598
-		'key' => &$spip_resultats_key
599
-	];
600
-	$tables_auxiliaires['spip_jobs_liens'] = [
601
-		'field' => &$spip_jobs_liens,
602
-		'key' => &$spip_jobs_liens_key
603
-	];
539
+    $spip_resultats = [
540
+        'recherche' => "char(16) DEFAULT '' NOT NULL",
541
+        'id' => 'INT UNSIGNED NOT NULL',
542
+        'points' => "INT UNSIGNED DEFAULT '0' NOT NULL",
543
+        'table_objet' => "varchar(30) DEFAULT '' NOT NULL",
544
+        'serveur' => "char(16) DEFAULT '' NOT NULL", // hash md5 partiel du serveur de base ('' pour le serveur principal)
545
+        'maj' => 'TIMESTAMP'
546
+    ];
547
+
548
+    $spip_resultats_key = [// pas de cle ni index, ca fait des insertions plus rapides et les requetes jointes utilisees en recheche ne sont pas plus lentes ...
549
+    ];
550
+
551
+    $spip_auteurs_liens = [
552
+        'id_auteur' => "bigint(21) DEFAULT '0' NOT NULL",
553
+        'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
554
+        'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
555
+        'vu' => "VARCHAR(6) DEFAULT 'non' NOT NULL"
556
+    ];
557
+
558
+    $spip_auteurs_liens_key = [
559
+        'PRIMARY KEY' => 'id_auteur,id_objet,objet',
560
+        'KEY id_auteur' => 'id_auteur',
561
+        'KEY id_objet' => 'id_objet',
562
+        'KEY objet' => 'objet',
563
+    ];
564
+
565
+    $spip_meta = [
566
+        'nom' => 'VARCHAR (255) NOT NULL',
567
+        'valeur' => "text DEFAULT ''",
568
+        'impt' => "ENUM('non', 'oui') DEFAULT 'oui' NOT NULL",
569
+        'maj' => 'TIMESTAMP'
570
+    ];
571
+
572
+    $spip_meta_key = [
573
+        'PRIMARY KEY' => 'nom'
574
+    ];
575
+
576
+    $spip_jobs_liens = [
577
+        'id_job' => "bigint(21) DEFAULT '0' NOT NULL",
578
+        'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
579
+        'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
580
+    ];
581
+
582
+    $spip_jobs_liens_key = [
583
+        'PRIMARY KEY' => 'id_job,id_objet,objet',
584
+        'KEY id_job' => 'id_job'
585
+    ];
586
+
587
+    $tables_auxiliaires['spip_auteurs_liens'] = [
588
+        'field' => &$spip_auteurs_liens,
589
+        'key' => &$spip_auteurs_liens_key
590
+    ];
591
+
592
+    $tables_auxiliaires['spip_meta'] = [
593
+        'field' => &$spip_meta,
594
+        'key' => &$spip_meta_key
595
+    ];
596
+    $tables_auxiliaires['spip_resultats'] = [
597
+        'field' => &$spip_resultats,
598
+        'key' => &$spip_resultats_key
599
+    ];
600
+    $tables_auxiliaires['spip_jobs_liens'] = [
601
+        'field' => &$spip_jobs_liens,
602
+        'key' => &$spip_jobs_liens_key
603
+    ];
604 604
 }
605 605
 
606 606
 
@@ -657,129 +657,129 @@  discard block
 block discarded – undo
657 657
  * @return array
658 658
  */
659 659
 function renseigner_table_objet_sql($table_sql, &$infos) {
660
-	if (!isset($infos['type'])) {
661
-		// si on arrive de base/trouver_table, on a la cle primaire :
662
-		// s'en servir pour extrapoler le type
663
-		if (isset($infos['key']['PRIMARY KEY'])) {
664
-			$primary = $infos['key']['PRIMARY KEY'];
665
-			$primary = explode(',', $primary);
666
-			$primary = reset($primary);
667
-			$infos['type'] = preg_replace(',^spip_|^id_|s$,', '', $primary);
668
-		} else {
669
-			$infos['type'] = preg_replace(',^spip_|s$,', '', $table_sql);
670
-		}
671
-	}
672
-	if (!isset($infos['type_surnoms'])) {
673
-		$infos['type_surnoms'] = [];
674
-	}
675
-
676
-	if (!isset($infos['table_objet'])) {
677
-		$infos['table_objet'] = preg_replace(',^spip_,', '', $table_sql);
678
-	}
679
-	if (!isset($infos['table_objet_surnoms'])) {
680
-		$infos['table_objet_surnoms'] = [];
681
-	}
682
-
683
-	if (!isset($infos['principale'])) {
684
-		$infos['principale'] = (isset($GLOBALS['tables_principales'][$table_sql]) ? 'oui' : false);
685
-	}
686
-
687
-	// normaliser pour pouvoir tester en php $infos['principale']?
688
-	// et dans une boucle {principale=oui}
689
-	$infos['principale'] = (($infos['principale'] and $infos['principale'] != 'non') ? 'oui' : false);
690
-
691
-	// declarer et normaliser pour pouvoir tester en php $infos['editable']?
692
-	// et dans une boucle {editable=oui}
693
-	if (!isset($infos['editable'])) {
694
-		$infos['editable'] = 'oui';
695
-	}
696
-
697
-	$infos['editable'] = (($infos['editable'] and $infos['editable'] != 'non') ? 'oui' : false);
698
-
699
-	// les urls publiques sont par defaut page=type pour les tables principales, et rien pour les autres
700
-	// seules les exceptions sont donc a declarer
701
-	if (!isset($infos['page'])) {
702
-		$infos['page'] = ($infos['principale'] ? $infos['type'] : '');
703
-	}
704
-
705
-	if (!isset($infos['url_voir'])) {
706
-		$infos['url_voir'] = $infos['type'];
707
-	}
708
-	if (!isset($infos['url_edit'])) {
709
-		$infos['url_edit'] = $infos['url_voir'] . ($infos['editable'] ? '_edit' : '');
710
-	}
711
-	if (!isset($infos['icone_objet'])) {
712
-		$infos['icone_objet'] = $infos['type'];
713
-	}
714
-
715
-	// chaines de langue
716
-	// par defaut : objet:icone_xxx_objet
717
-	if (!isset($infos['texte_retour'])) {
718
-		$infos['texte_retour'] = 'icone_retour';
719
-	}
720
-	if (!isset($infos['texte_modifier'])) {
721
-		$infos['texte_modifier'] = $infos['type'] . ':' . 'icone_modifier_' . $infos['type'];
722
-	}
723
-	if (!isset($infos['texte_creer'])) {
724
-		$infos['texte_creer'] = $infos['type'] . ':' . 'icone_creer_' . $infos['type'];
725
-	}
726
-	if (!isset($infos['texte_creer_associer'])) {
727
-		$infos['texte_creer_associer'] = $infos['type'] . ':' . 'texte_creer_associer_' . $infos['type'];
728
-	}
729
-	if (!isset($infos['texte_ajouter'])) {
730
-		// Ajouter un X
731
-		$infos['texte_ajouter'] = $infos['type'] . ':' . 'texte_ajouter_' . $infos['type'];
732
-	}
733
-	if (!isset($infos['texte_objets'])) {
734
-		$infos['texte_objets'] = $infos['type'] . ':' . 'titre_' . $infos['table_objet'];
735
-	}
736
-	if (!isset($infos['texte_objet'])) {
737
-		$infos['texte_objet'] = $infos['type'] . ':' . 'titre_' . $infos['type'];
738
-	}
739
-	if (!isset($infos['texte_logo_objet'])) {
740
-		// objet:titre_logo_objet "Logo de ce X"
741
-		$infos['texte_logo_objet'] = $infos['type'] . ':' . 'titre_logo_' . $infos['type'];
742
-	}
743
-	if (!isset($infos['texte_langue_objet'])) {
744
-		// objet:texte_langue_objet "Langue de ce X"
745
-		$infos['texte_langue_objet'] = $infos['type'] . ':' . 'titre_langue_' . $infos['type'];
746
-	}
747
-	if (!isset($infos['texte_definir_comme_traduction_objet'])) {
748
-		// "Ce X est une traduction du X numéro :"
749
-		$infos['texte_definir_comme_traduction_objet'] = $infos['type'] . ':' . 'texte_definir_comme_traduction_' . $infos['type'];
750
-	}
751
-
752
-	// objet:info_aucun_objet
753
-	if (!isset($infos['info_aucun_objet'])) {
754
-		$infos['info_aucun_objet'] = $infos['type'] . ':' . 'info_aucun_' . $infos['type'];
755
-	}
756
-	// objet:info_1_objet
757
-	if (!isset($infos['info_1_objet'])) {
758
-		$infos['info_1_objet'] = $infos['type'] . ':' . 'info_1_' . $infos['type'];
759
-	}
760
-	// objet:info_nb_objets
761
-	if (!isset($infos['info_nb_objets'])) {
762
-		$infos['info_nb_objets'] = $infos['type'] . ':' . 'info_nb_' . $infos['table_objet'];
763
-	}
764
-
765
-	if (!isset($infos['champs_editables'])) {
766
-		$infos['champs_editables'] = [];
767
-	}
768
-	if (!isset($infos['champs_versionnes'])) {
769
-		$infos['champs_versionnes'] = [];
770
-	}
771
-	if (!isset($infos['rechercher_champs'])) {
772
-		$infos['rechercher_champs'] = [];
773
-	}
774
-	if (!isset($infos['rechercher_jointures'])) {
775
-		$infos['rechercher_jointures'] = [];
776
-	}
777
-
778
-	if (!isset($infos['modeles'])) {
779
-		$infos['modeles'] = [$infos['type']];
780
-	}
781
-
782
-	return $infos;
660
+    if (!isset($infos['type'])) {
661
+        // si on arrive de base/trouver_table, on a la cle primaire :
662
+        // s'en servir pour extrapoler le type
663
+        if (isset($infos['key']['PRIMARY KEY'])) {
664
+            $primary = $infos['key']['PRIMARY KEY'];
665
+            $primary = explode(',', $primary);
666
+            $primary = reset($primary);
667
+            $infos['type'] = preg_replace(',^spip_|^id_|s$,', '', $primary);
668
+        } else {
669
+            $infos['type'] = preg_replace(',^spip_|s$,', '', $table_sql);
670
+        }
671
+    }
672
+    if (!isset($infos['type_surnoms'])) {
673
+        $infos['type_surnoms'] = [];
674
+    }
675
+
676
+    if (!isset($infos['table_objet'])) {
677
+        $infos['table_objet'] = preg_replace(',^spip_,', '', $table_sql);
678
+    }
679
+    if (!isset($infos['table_objet_surnoms'])) {
680
+        $infos['table_objet_surnoms'] = [];
681
+    }
682
+
683
+    if (!isset($infos['principale'])) {
684
+        $infos['principale'] = (isset($GLOBALS['tables_principales'][$table_sql]) ? 'oui' : false);
685
+    }
686
+
687
+    // normaliser pour pouvoir tester en php $infos['principale']?
688
+    // et dans une boucle {principale=oui}
689
+    $infos['principale'] = (($infos['principale'] and $infos['principale'] != 'non') ? 'oui' : false);
690
+
691
+    // declarer et normaliser pour pouvoir tester en php $infos['editable']?
692
+    // et dans une boucle {editable=oui}
693
+    if (!isset($infos['editable'])) {
694
+        $infos['editable'] = 'oui';
695
+    }
696
+
697
+    $infos['editable'] = (($infos['editable'] and $infos['editable'] != 'non') ? 'oui' : false);
698
+
699
+    // les urls publiques sont par defaut page=type pour les tables principales, et rien pour les autres
700
+    // seules les exceptions sont donc a declarer
701
+    if (!isset($infos['page'])) {
702
+        $infos['page'] = ($infos['principale'] ? $infos['type'] : '');
703
+    }
704
+
705
+    if (!isset($infos['url_voir'])) {
706
+        $infos['url_voir'] = $infos['type'];
707
+    }
708
+    if (!isset($infos['url_edit'])) {
709
+        $infos['url_edit'] = $infos['url_voir'] . ($infos['editable'] ? '_edit' : '');
710
+    }
711
+    if (!isset($infos['icone_objet'])) {
712
+        $infos['icone_objet'] = $infos['type'];
713
+    }
714
+
715
+    // chaines de langue
716
+    // par defaut : objet:icone_xxx_objet
717
+    if (!isset($infos['texte_retour'])) {
718
+        $infos['texte_retour'] = 'icone_retour';
719
+    }
720
+    if (!isset($infos['texte_modifier'])) {
721
+        $infos['texte_modifier'] = $infos['type'] . ':' . 'icone_modifier_' . $infos['type'];
722
+    }
723
+    if (!isset($infos['texte_creer'])) {
724
+        $infos['texte_creer'] = $infos['type'] . ':' . 'icone_creer_' . $infos['type'];
725
+    }
726
+    if (!isset($infos['texte_creer_associer'])) {
727
+        $infos['texte_creer_associer'] = $infos['type'] . ':' . 'texte_creer_associer_' . $infos['type'];
728
+    }
729
+    if (!isset($infos['texte_ajouter'])) {
730
+        // Ajouter un X
731
+        $infos['texte_ajouter'] = $infos['type'] . ':' . 'texte_ajouter_' . $infos['type'];
732
+    }
733
+    if (!isset($infos['texte_objets'])) {
734
+        $infos['texte_objets'] = $infos['type'] . ':' . 'titre_' . $infos['table_objet'];
735
+    }
736
+    if (!isset($infos['texte_objet'])) {
737
+        $infos['texte_objet'] = $infos['type'] . ':' . 'titre_' . $infos['type'];
738
+    }
739
+    if (!isset($infos['texte_logo_objet'])) {
740
+        // objet:titre_logo_objet "Logo de ce X"
741
+        $infos['texte_logo_objet'] = $infos['type'] . ':' . 'titre_logo_' . $infos['type'];
742
+    }
743
+    if (!isset($infos['texte_langue_objet'])) {
744
+        // objet:texte_langue_objet "Langue de ce X"
745
+        $infos['texte_langue_objet'] = $infos['type'] . ':' . 'titre_langue_' . $infos['type'];
746
+    }
747
+    if (!isset($infos['texte_definir_comme_traduction_objet'])) {
748
+        // "Ce X est une traduction du X numéro :"
749
+        $infos['texte_definir_comme_traduction_objet'] = $infos['type'] . ':' . 'texte_definir_comme_traduction_' . $infos['type'];
750
+    }
751
+
752
+    // objet:info_aucun_objet
753
+    if (!isset($infos['info_aucun_objet'])) {
754
+        $infos['info_aucun_objet'] = $infos['type'] . ':' . 'info_aucun_' . $infos['type'];
755
+    }
756
+    // objet:info_1_objet
757
+    if (!isset($infos['info_1_objet'])) {
758
+        $infos['info_1_objet'] = $infos['type'] . ':' . 'info_1_' . $infos['type'];
759
+    }
760
+    // objet:info_nb_objets
761
+    if (!isset($infos['info_nb_objets'])) {
762
+        $infos['info_nb_objets'] = $infos['type'] . ':' . 'info_nb_' . $infos['table_objet'];
763
+    }
764
+
765
+    if (!isset($infos['champs_editables'])) {
766
+        $infos['champs_editables'] = [];
767
+    }
768
+    if (!isset($infos['champs_versionnes'])) {
769
+        $infos['champs_versionnes'] = [];
770
+    }
771
+    if (!isset($infos['rechercher_champs'])) {
772
+        $infos['rechercher_champs'] = [];
773
+    }
774
+    if (!isset($infos['rechercher_jointures'])) {
775
+        $infos['rechercher_jointures'] = [];
776
+    }
777
+
778
+    if (!isset($infos['modeles'])) {
779
+        $infos['modeles'] = [$infos['type']];
780
+    }
781
+
782
+    return $infos;
783 783
 }
784 784
 
785 785
 /**
@@ -796,30 +796,30 @@  discard block
 block discarded – undo
796 796
  * @return array
797 797
  */
798 798
 function renseigner_table_objet_interfaces($table_sql, &$infos) {
799
-	if (!isset($infos['titre'])) {
800
-		if (isset($infos['table_objet']) and isset($GLOBALS['table_titre'][$infos['table_objet']])) {
801
-			$infos['titre'] = $GLOBALS['table_titre'][$infos['table_objet']];
802
-		} else {
803
-			$infos['titre'] = ((isset($infos['field']['titre'])) ? 'titre,' : "'' as titre,");
804
-			$infos['titre'] .= ((isset($infos['field']['lang'])) ? 'lang' : "'' as lang");
805
-		}
806
-	}
807
-	if (!isset($infos['date'])) {
808
-		if (isset($infos['table_objet']) and isset($GLOBALS['table_date'][$infos['table_objet']])) {
809
-			$infos['date'] = $GLOBALS['table_date'][$infos['table_objet']];
810
-		} else {
811
-			$infos['date'] = ((isset($infos['field']['date'])) ? 'date' : '');
812
-		}
813
-	}
814
-
815
-	$infos['statut'] ??= $GLOBALS['table_statut'][$table_sql] ?? '';
816
-	$infos['tables_jointures'] ??= [];
817
-
818
-	if (isset($GLOBALS['tables_jointures'][$table_sql])) {
819
-		$infos['tables_jointures'] = array_merge($infos['tables_jointures'], $GLOBALS['tables_jointures'][$table_sql]);
820
-	}
821
-
822
-	return $infos;
799
+    if (!isset($infos['titre'])) {
800
+        if (isset($infos['table_objet']) and isset($GLOBALS['table_titre'][$infos['table_objet']])) {
801
+            $infos['titre'] = $GLOBALS['table_titre'][$infos['table_objet']];
802
+        } else {
803
+            $infos['titre'] = ((isset($infos['field']['titre'])) ? 'titre,' : "'' as titre,");
804
+            $infos['titre'] .= ((isset($infos['field']['lang'])) ? 'lang' : "'' as lang");
805
+        }
806
+    }
807
+    if (!isset($infos['date'])) {
808
+        if (isset($infos['table_objet']) and isset($GLOBALS['table_date'][$infos['table_objet']])) {
809
+            $infos['date'] = $GLOBALS['table_date'][$infos['table_objet']];
810
+        } else {
811
+            $infos['date'] = ((isset($infos['field']['date'])) ? 'date' : '');
812
+        }
813
+    }
814
+
815
+    $infos['statut'] ??= $GLOBALS['table_statut'][$table_sql] ?? '';
816
+    $infos['tables_jointures'] ??= [];
817
+
818
+    if (isset($GLOBALS['tables_jointures'][$table_sql])) {
819
+        $infos['tables_jointures'] = array_merge($infos['tables_jointures'], $GLOBALS['tables_jointures'][$table_sql]);
820
+    }
821
+
822
+    return $infos;
823 823
 }
824 824
 
825 825
 /**
@@ -830,13 +830,13 @@  discard block
 block discarded – undo
830 830
  *     Liste et descriptions des tables principales
831 831
  **/
832 832
 function lister_tables_principales() {
833
-	static $done = false;
834
-	if (!$done or !(is_countable($GLOBALS['tables_principales']) ? count($GLOBALS['tables_principales']) : 0)) {
835
-		lister_tables_objets_sql();
836
-		$done = true;
837
-	}
833
+    static $done = false;
834
+    if (!$done or !(is_countable($GLOBALS['tables_principales']) ? count($GLOBALS['tables_principales']) : 0)) {
835
+        lister_tables_objets_sql();
836
+        $done = true;
837
+    }
838 838
 
839
-	return $GLOBALS['tables_principales'];
839
+    return $GLOBALS['tables_principales'];
840 840
 }
841 841
 
842 842
 /**
@@ -847,13 +847,13 @@  discard block
 block discarded – undo
847 847
  *     Liste et descriptions des tables auxiliaires
848 848
  **/
849 849
 function lister_tables_auxiliaires() {
850
-	static $done = false;
851
-	if (!$done or !(is_countable($GLOBALS['tables_auxiliaires']) ? count($GLOBALS['tables_auxiliaires']) : 0)) {
852
-		lister_tables_objets_sql();
853
-		$done = true;
854
-	}
850
+    static $done = false;
851
+    if (!$done or !(is_countable($GLOBALS['tables_auxiliaires']) ? count($GLOBALS['tables_auxiliaires']) : 0)) {
852
+        lister_tables_objets_sql();
853
+        $done = true;
854
+    }
855 855
 
856
-	return $GLOBALS['tables_auxiliaires'];
856
+    return $GLOBALS['tables_auxiliaires'];
857 857
 }
858 858
 
859 859
 /**
@@ -862,45 +862,45 @@  discard block
 block discarded – undo
862 862
  * @return array
863 863
  */
864 864
 function lister_tables_objets_surnoms() {
865
-	static $surnoms = null;
866
-	static $md5 = null;
867
-	if (
868
-		!$surnoms
869
-		or $md5 != lister_tables_objets_sql('::md5')
870
-	) {
871
-		// passer dans un pipeline qui permet aux plugins de declarer leurs exceptions
872
-		// pour compatibilite, car il faut dorenavent utiliser
873
-		// declarer_table_objets_sql
874
-		$surnoms = pipeline(
875
-			'declarer_tables_objets_surnoms',
876
-			[
877
-				# pour les modeles
878
-				# a enlever ?
879
-				'doc' => 'documents',
880
-				'img' => 'documents',
881
-				'emb' => 'documents',
882
-			]
883
-		);
884
-		$infos_tables = lister_tables_objets_sql();
885
-		foreach ($infos_tables as $t => $infos) {
886
-			// cas de base type=>table
887
-			// et preg_replace(',^spip_|^id_|s$,',table)=>table
888
-			if ($infos['table_objet']) { // securite, si la fonction est appelee trop tot, c'est vide
889
-				// optimisations pour table_objet
890
-				//$surnoms[$infos['type']] = $infos['table_objet'];
891
-				$surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['table_objet'];
892
-				$surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['table_objet'];
893
-				if (is_array($infos['table_objet_surnoms']) and count($infos['table_objet_surnoms'])) {
894
-					foreach ($infos['table_objet_surnoms'] as $surnom) {
895
-						$surnoms[$surnom] = $infos['table_objet'];
896
-					}
897
-				}
898
-			}
899
-		}
900
-		$md5 = lister_tables_objets_sql('::md5');
901
-	}
902
-
903
-	return $surnoms;
865
+    static $surnoms = null;
866
+    static $md5 = null;
867
+    if (
868
+        !$surnoms
869
+        or $md5 != lister_tables_objets_sql('::md5')
870
+    ) {
871
+        // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions
872
+        // pour compatibilite, car il faut dorenavent utiliser
873
+        // declarer_table_objets_sql
874
+        $surnoms = pipeline(
875
+            'declarer_tables_objets_surnoms',
876
+            [
877
+                # pour les modeles
878
+                # a enlever ?
879
+                'doc' => 'documents',
880
+                'img' => 'documents',
881
+                'emb' => 'documents',
882
+            ]
883
+        );
884
+        $infos_tables = lister_tables_objets_sql();
885
+        foreach ($infos_tables as $t => $infos) {
886
+            // cas de base type=>table
887
+            // et preg_replace(',^spip_|^id_|s$,',table)=>table
888
+            if ($infos['table_objet']) { // securite, si la fonction est appelee trop tot, c'est vide
889
+                // optimisations pour table_objet
890
+                //$surnoms[$infos['type']] = $infos['table_objet'];
891
+                $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['table_objet'];
892
+                $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['table_objet'];
893
+                if (is_array($infos['table_objet_surnoms']) and count($infos['table_objet_surnoms'])) {
894
+                    foreach ($infos['table_objet_surnoms'] as $surnom) {
895
+                        $surnoms[$surnom] = $infos['table_objet'];
896
+                    }
897
+                }
898
+            }
899
+        }
900
+        $md5 = lister_tables_objets_sql('::md5');
901
+    }
902
+
903
+    return $surnoms;
904 904
 }
905 905
 
906 906
 /**
@@ -909,35 +909,35 @@  discard block
 block discarded – undo
909 909
  * @return array
910 910
  */
911 911
 function lister_types_surnoms() {
912
-	static $surnoms = null;
913
-	static $md5 = null;
914
-	if (
915
-		!$surnoms
916
-		or $md5 != lister_tables_objets_sql('::md5')
917
-	) {
918
-		// passer dans un pipeline qui permet aux plugins de declarer leurs exceptions
919
-		// pour compatibilite, car il faut dorenavent utiliser
920
-		// declarer_table_objets_sql
921
-		$surnoms = pipeline('declarer_type_surnoms', ['racine-site' => 'site']);
922
-		$infos_tables = lister_tables_objets_sql();
923
-		foreach ($infos_tables as $t => $infos) {
924
-			if ($infos['type']) { // securite, si la fonction est appelee trop tot, c'est vide
925
-				// optimisations pour objet_type
926
-				//$surnoms[$infos['type']] = $infos['type'];
927
-				$surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['type'];
928
-				$surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['type'];
929
-				// surnoms declares
930
-				if (is_array($infos['type_surnoms']) and count($infos['type_surnoms'])) {
931
-					foreach ($infos['type_surnoms'] as $surnom) {
932
-						$surnoms[$surnom] = $infos['type'];
933
-					}
934
-				}
935
-			}
936
-		}
937
-		$md5 = lister_tables_objets_sql('::md5');
938
-	}
939
-
940
-	return $surnoms;
912
+    static $surnoms = null;
913
+    static $md5 = null;
914
+    if (
915
+        !$surnoms
916
+        or $md5 != lister_tables_objets_sql('::md5')
917
+    ) {
918
+        // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions
919
+        // pour compatibilite, car il faut dorenavent utiliser
920
+        // declarer_table_objets_sql
921
+        $surnoms = pipeline('declarer_type_surnoms', ['racine-site' => 'site']);
922
+        $infos_tables = lister_tables_objets_sql();
923
+        foreach ($infos_tables as $t => $infos) {
924
+            if ($infos['type']) { // securite, si la fonction est appelee trop tot, c'est vide
925
+                // optimisations pour objet_type
926
+                //$surnoms[$infos['type']] = $infos['type'];
927
+                $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['type'];
928
+                $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['type'];
929
+                // surnoms declares
930
+                if (is_array($infos['type_surnoms']) and count($infos['type_surnoms'])) {
931
+                    foreach ($infos['type_surnoms'] as $surnom) {
932
+                        $surnoms[$surnom] = $infos['type'];
933
+                    }
934
+                }
935
+            }
936
+        }
937
+        $md5 = lister_tables_objets_sql('::md5');
938
+    }
939
+
940
+    return $surnoms;
941 941
 }
942 942
 
943 943
 /**
@@ -951,22 +951,22 @@  discard block
 block discarded – undo
951 951
  *     Couples (nom de la table SQL => même nom, sans 'spip_' devant)
952 952
  **/
953 953
 function lister_tables_spip($serveur = '') {
954
-	static $tables = [];
955
-	if (!isset($tables[$serveur])) {
956
-		$tables[$serveur] = [];
957
-		if (!function_exists('sql_alltable')) {
958
-			include_spip('base/abstract_sql');
959
-		}
960
-		$ts = sql_alltable(null, $serveur); // toutes les tables "spip_" (ou prefixe perso)
961
-		$connexion = $GLOBALS['connexions'][$serveur ?: 0];
962
-		$spip = $connexion['prefixe'] . '_';
963
-		foreach ($ts as $t) {
964
-			$t = substr($t, strlen($spip));
965
-			$tables[$serveur]["spip_$t"] = $t;
966
-		}
967
-	}
968
-
969
-	return $tables[$serveur];
954
+    static $tables = [];
955
+    if (!isset($tables[$serveur])) {
956
+        $tables[$serveur] = [];
957
+        if (!function_exists('sql_alltable')) {
958
+            include_spip('base/abstract_sql');
959
+        }
960
+        $ts = sql_alltable(null, $serveur); // toutes les tables "spip_" (ou prefixe perso)
961
+        $connexion = $GLOBALS['connexions'][$serveur ?: 0];
962
+        $spip = $connexion['prefixe'] . '_';
963
+        foreach ($ts as $t) {
964
+            $t = substr($t, strlen($spip));
965
+            $tables[$serveur]["spip_$t"] = $t;
966
+        }
967
+    }
968
+
969
+    return $tables[$serveur];
970 970
 }
971 971
 
972 972
 
@@ -981,18 +981,18 @@  discard block
 block discarded – undo
981 981
  *     Couples (nom de la table SQL => même nom)
982 982
  **/
983 983
 function lister_toutes_tables($serveur) {
984
-	static $tables = [];
985
-	if (!isset($tables[$serveur])) {
986
-		$tables[$serveur] = [];
987
-		if (!function_exists('sql_alltable')) {
988
-			include_spip('base/abstract_sql');
989
-		}
990
-		$ts = sql_alltable('%', $serveur); // toutes les tables
991
-		foreach ($ts as $t) {
992
-			$tables[$serveur][$t] = $t;
993
-		}
994
-	}
995
-	return $tables[$serveur];
984
+    static $tables = [];
985
+    if (!isset($tables[$serveur])) {
986
+        $tables[$serveur] = [];
987
+        if (!function_exists('sql_alltable')) {
988
+            include_spip('base/abstract_sql');
989
+        }
990
+        $ts = sql_alltable('%', $serveur); // toutes les tables
991
+        foreach ($ts as $t) {
992
+            $tables[$serveur][$t] = $t;
993
+        }
994
+    }
995
+    return $tables[$serveur];
996 996
 }
997 997
 
998 998
 /**
@@ -1013,39 +1013,39 @@  discard block
 block discarded – undo
1013 1013
  **/
1014 1014
 function table_objet(string $type, string $serveur = ''): string {
1015 1015
 
1016
-	if ($type) {
1017
-		$type = preg_replace(',^spip_|^id_|s$,', '', $type);
1018
-	}
1019
-	if (!strlen($type)) {
1020
-		return '';
1021
-	}
1022
-
1023
-	$surnoms = lister_tables_objets_surnoms();
1024
-	if (isset($surnoms[$type])) {
1025
-		return $surnoms[$type];
1026
-	}
1027
-
1028
-	if ($serveur !== false) {
1029
-		$t = lister_tables_spip($serveur);
1030
-		$trouver_table = charger_fonction('trouver_table', 'base');
1031
-		$typetrim = rtrim($type, 's') . 's';
1032
-		if (
1033
-			(isset($t[$typetrim]) or in_array($typetrim, $t))
1034
-			and ($desc = $trouver_table(rtrim($type, 's') . 's', $serveur))
1035
-		) {
1036
-			return $desc['id_table'];
1037
-		} elseif (
1038
-			(isset($t[$type]) or in_array($type, $t))
1039
-			and ($desc = $trouver_table($type, $serveur))
1040
-		) {
1041
-			return $desc['id_table'];
1042
-		}
1043
-
1044
-		spip_log('table_objet(' . $type . ') calculee sans verification');
1045
-		#spip_log(debug_backtrace(),'db');
1046
-	}
1047
-
1048
-	return rtrim($type, 's') . 's'; # cas historique ne devant plus servir, sauf si $serveur=false
1016
+    if ($type) {
1017
+        $type = preg_replace(',^spip_|^id_|s$,', '', $type);
1018
+    }
1019
+    if (!strlen($type)) {
1020
+        return '';
1021
+    }
1022
+
1023
+    $surnoms = lister_tables_objets_surnoms();
1024
+    if (isset($surnoms[$type])) {
1025
+        return $surnoms[$type];
1026
+    }
1027
+
1028
+    if ($serveur !== false) {
1029
+        $t = lister_tables_spip($serveur);
1030
+        $trouver_table = charger_fonction('trouver_table', 'base');
1031
+        $typetrim = rtrim($type, 's') . 's';
1032
+        if (
1033
+            (isset($t[$typetrim]) or in_array($typetrim, $t))
1034
+            and ($desc = $trouver_table(rtrim($type, 's') . 's', $serveur))
1035
+        ) {
1036
+            return $desc['id_table'];
1037
+        } elseif (
1038
+            (isset($t[$type]) or in_array($type, $t))
1039
+            and ($desc = $trouver_table($type, $serveur))
1040
+        ) {
1041
+            return $desc['id_table'];
1042
+        }
1043
+
1044
+        spip_log('table_objet(' . $type . ') calculee sans verification');
1045
+        #spip_log(debug_backtrace(),'db');
1046
+    }
1047
+
1048
+    return rtrim($type, 's') . 's'; # cas historique ne devant plus servir, sauf si $serveur=false
1049 1049
 }
1050 1050
 
1051 1051
 /**
@@ -1066,33 +1066,33 @@  discard block
 block discarded – undo
1066 1066
  **/
1067 1067
 function table_objet_sql(string $type, string $serveur = ''): string {
1068 1068
 
1069
-	$nom = table_objet($type, $serveur);
1070
-	if (!strlen($nom)) {
1071
-		return '';
1072
-	}
1073
-	if (!isset($GLOBALS['table_des_tables']['articles'])) {
1074
-		// eviter de multiples inclusions
1075
-		include_spip('public/interfaces');
1076
-	}
1077
-	if (isset($GLOBALS['table_des_tables'][$nom])) {
1078
-		$nom = $GLOBALS['table_des_tables'][$nom];
1079
-		$nom = "spip_$nom";
1080
-	} else {
1081
-		$infos_tables = lister_tables_objets_sql();
1082
-		if (isset($infos_tables["spip_$nom"])) {
1083
-			$nom = "spip_$nom";
1084
-		} elseif ($serveur !== false) {
1085
-			$t = lister_tables_spip($serveur);
1086
-			if (isset($t[$nom]) or in_array($nom, $t)) {
1087
-				$trouver_table = charger_fonction('trouver_table', 'base');
1088
-				if ($desc = $trouver_table($nom, $serveur)) {
1089
-					return $desc['table_sql'];
1090
-				}
1091
-			}
1092
-		}
1093
-	}
1094
-
1095
-	return $nom;
1069
+    $nom = table_objet($type, $serveur);
1070
+    if (!strlen($nom)) {
1071
+        return '';
1072
+    }
1073
+    if (!isset($GLOBALS['table_des_tables']['articles'])) {
1074
+        // eviter de multiples inclusions
1075
+        include_spip('public/interfaces');
1076
+    }
1077
+    if (isset($GLOBALS['table_des_tables'][$nom])) {
1078
+        $nom = $GLOBALS['table_des_tables'][$nom];
1079
+        $nom = "spip_$nom";
1080
+    } else {
1081
+        $infos_tables = lister_tables_objets_sql();
1082
+        if (isset($infos_tables["spip_$nom"])) {
1083
+            $nom = "spip_$nom";
1084
+        } elseif ($serveur !== false) {
1085
+            $t = lister_tables_spip($serveur);
1086
+            if (isset($t[$nom]) or in_array($nom, $t)) {
1087
+                $trouver_table = charger_fonction('trouver_table', 'base');
1088
+                if ($desc = $trouver_table($nom, $serveur)) {
1089
+                    return $desc['table_sql'];
1090
+                }
1091
+            }
1092
+        }
1093
+    }
1094
+
1095
+    return $nom;
1096 1096
 }
1097 1097
 
1098 1098
 /**
@@ -1111,35 +1111,35 @@  discard block
 block discarded – undo
1111 1111
  *     Nom de la clé primaire
1112 1112
  **/
1113 1113
 function id_table_objet($type, $serveur = '') {
1114
-	static $trouver_table = null;
1115
-	$type = objet_type($type, $serveur);
1116
-	if (!$type) {
1117
-		return null;
1118
-	}
1119
-	$t = table_objet($type);
1120
-	if (!$trouver_table) {
1121
-		$trouver_table = charger_fonction('trouver_table', 'base');
1122
-	}
1123
-
1124
-	$ts = lister_tables_spip($serveur);
1125
-	if (
1126
-		in_array($t, $ts)
1127
-		or in_array($t, lister_toutes_tables($serveur))
1128
-	) {
1129
-		$desc = $trouver_table($t, $serveur);
1130
-		if (isset($desc['key']['PRIMARY KEY'])) {
1131
-			return $desc['key']['PRIMARY KEY'];
1132
-		}
1133
-		if (!$desc or isset($desc['field']["id_$type"])) {
1134
-			return "id_$type";
1135
-		}
1136
-		// sinon renvoyer le premier champ de la table...
1137
-		$keys = array_keys($desc['field']);
1138
-
1139
-		return array_shift($keys);
1140
-	}
1141
-
1142
-	return "id_$type";
1114
+    static $trouver_table = null;
1115
+    $type = objet_type($type, $serveur);
1116
+    if (!$type) {
1117
+        return null;
1118
+    }
1119
+    $t = table_objet($type);
1120
+    if (!$trouver_table) {
1121
+        $trouver_table = charger_fonction('trouver_table', 'base');
1122
+    }
1123
+
1124
+    $ts = lister_tables_spip($serveur);
1125
+    if (
1126
+        in_array($t, $ts)
1127
+        or in_array($t, lister_toutes_tables($serveur))
1128
+    ) {
1129
+        $desc = $trouver_table($t, $serveur);
1130
+        if (isset($desc['key']['PRIMARY KEY'])) {
1131
+            return $desc['key']['PRIMARY KEY'];
1132
+        }
1133
+        if (!$desc or isset($desc['field']["id_$type"])) {
1134
+            return "id_$type";
1135
+        }
1136
+        // sinon renvoyer le premier champ de la table...
1137
+        $keys = array_keys($desc['field']);
1138
+
1139
+        return array_shift($keys);
1140
+    }
1141
+
1142
+    return "id_$type";
1143 1143
 }
1144 1144
 
1145 1145
 /**
@@ -1158,60 +1158,60 @@  discard block
 block discarded – undo
1158 1158
  *     Type de l'objet
1159 1159
  **/
1160 1160
 function objet_type(string $table_objet, string $serveur = ''): ?string {
1161
-	if (!$table_objet) {
1162
-		return null;
1163
-	}
1164
-	$surnoms = lister_types_surnoms();
1165
-
1166
-	// scenario de base
1167
-	// le type est decline a partir du nom de la table en enlevant le prefixe eventuel
1168
-	// et la marque du pluriel
1169
-	// on accepte id_xx en entree aussi
1170
-	$type = preg_replace(',^spip_|^id_|s$,', '', $table_objet);
1171
-	if (isset($surnoms[$type])) {
1172
-		return $surnoms[$type];
1173
-	}
1174
-
1175
-	// securite : eliminer les caracteres non \w
1176
-	$type = preg_replace(',[^\w-],', '', $type);
1177
-
1178
-	// si le type redonne bien la table c'est bon
1179
-	// oui si table_objet ressemblait deja a un type
1180
-	if (
1181
-		$type == $table_objet
1182
-		or (table_objet($type, $serveur) == $table_objet)
1183
-		or (table_objet_sql($type, $serveur) == $table_objet)
1184
-	) {
1185
-		return $type;
1186
-	}
1187
-
1188
-	// si on ne veut pas chercher en base
1189
-	if ($serveur === false) {
1190
-		return $type;
1191
-	}
1192
-
1193
-	// sinon on passe par la cle primaire id_xx pour trouver le type
1194
-	// car le s a la fin est incertain
1195
-	// notamment en cas de pluriel derogatoire
1196
-	// id_jeu/spip_jeux id_journal/spip_journaux qui necessitent tout deux
1197
-	// une declaration jeu => jeux, journal => journaux
1198
-	// dans le pipeline declarer_tables_objets_surnoms
1199
-	$trouver_table = charger_fonction('trouver_table', 'base');
1200
-	$ts = lister_tables_spip($serveur);
1201
-	$desc = false;
1202
-	if (in_array($table_objet, $ts)) {
1203
-		$desc = $trouver_table($table_objet);
1204
-	}
1205
-	if (!$desc and in_array($table_objet = table_objet($type, $serveur), $ts)) {
1206
-		$desc = $trouver_table($table_objet, $serveur);
1207
-	}
1208
-	// si le type est declare : bingo !
1209
-	if ($desc and isset($desc['type'])) {
1210
-		return $desc['type'];
1211
-	}
1212
-
1213
-	// on a fait ce qu'on a pu
1214
-	return $type;
1161
+    if (!$table_objet) {
1162
+        return null;
1163
+    }
1164
+    $surnoms = lister_types_surnoms();
1165
+
1166
+    // scenario de base
1167
+    // le type est decline a partir du nom de la table en enlevant le prefixe eventuel
1168
+    // et la marque du pluriel
1169
+    // on accepte id_xx en entree aussi
1170
+    $type = preg_replace(',^spip_|^id_|s$,', '', $table_objet);
1171
+    if (isset($surnoms[$type])) {
1172
+        return $surnoms[$type];
1173
+    }
1174
+
1175
+    // securite : eliminer les caracteres non \w
1176
+    $type = preg_replace(',[^\w-],', '', $type);
1177
+
1178
+    // si le type redonne bien la table c'est bon
1179
+    // oui si table_objet ressemblait deja a un type
1180
+    if (
1181
+        $type == $table_objet
1182
+        or (table_objet($type, $serveur) == $table_objet)
1183
+        or (table_objet_sql($type, $serveur) == $table_objet)
1184
+    ) {
1185
+        return $type;
1186
+    }
1187
+
1188
+    // si on ne veut pas chercher en base
1189
+    if ($serveur === false) {
1190
+        return $type;
1191
+    }
1192
+
1193
+    // sinon on passe par la cle primaire id_xx pour trouver le type
1194
+    // car le s a la fin est incertain
1195
+    // notamment en cas de pluriel derogatoire
1196
+    // id_jeu/spip_jeux id_journal/spip_journaux qui necessitent tout deux
1197
+    // une declaration jeu => jeux, journal => journaux
1198
+    // dans le pipeline declarer_tables_objets_surnoms
1199
+    $trouver_table = charger_fonction('trouver_table', 'base');
1200
+    $ts = lister_tables_spip($serveur);
1201
+    $desc = false;
1202
+    if (in_array($table_objet, $ts)) {
1203
+        $desc = $trouver_table($table_objet);
1204
+    }
1205
+    if (!$desc and in_array($table_objet = table_objet($type, $serveur), $ts)) {
1206
+        $desc = $trouver_table($table_objet, $serveur);
1207
+    }
1208
+    // si le type est declare : bingo !
1209
+    if ($desc and isset($desc['type'])) {
1210
+        return $desc['type'];
1211
+    }
1212
+
1213
+    // on a fait ce qu'on a pu
1214
+    return $type;
1215 1215
 }
1216 1216
 
1217 1217
 /**
@@ -1227,62 +1227,62 @@  discard block
 block discarded – undo
1227 1227
  * @return bool
1228 1228
  */
1229 1229
 function objet_test_si_publie($objet, $id_objet, $serveur = '') {
1230
-	// voir si une fonction est definie pour faire le boulot
1231
-	// elle a la priorite dans ce cas
1232
-	if ($f = charger_fonction($objet . '_test_si_publie', 'base', true)) {
1233
-		return $f($objet, $id_objet, $serveur);
1234
-	}
1235
-
1236
-	// sinon on se fie a la declaration de l'objet si presente
1237
-	$id_table = $table_objet = table_objet($objet);
1238
-	$id_table_objet = id_table_objet($objet, $serveur);
1239
-	$trouver_table = charger_fonction('trouver_table', 'base');
1240
-	if (
1241
-		$desc = $trouver_table($table_objet, $serveur)
1242
-		and isset($desc['statut'])
1243
-		and $desc['statut']
1244
-	) {
1245
-		$boucle = new Boucle();
1246
-		$boucle->show = $desc;
1247
-		$boucle->nom = 'objet_test_si_publie';
1248
-		$boucle->id_boucle = $id_table;
1249
-		$boucle->id_table = $id_table;
1250
-		$boucle->primary = $desc['key']['PRIMARY KEY'] ?? '';
1251
-		$boucle->sql_serveur = $serveur;
1252
-		$boucle->select[] = $id_table_objet;
1253
-		$boucle->from[$table_objet] = table_objet_sql($objet, $serveur);
1254
-		$boucle->where[] = $id_table . '.' . $id_table_objet . '=' . intval($id_objet);
1255
-
1256
-		$boucle->descr['nom'] = 'objet_test_si_publie'; // eviter notice php
1257
-		$boucle->descr['sourcefile'] = 'internal';
1258
-		$boucle->descr['gram'] = 'html';
1259
-
1260
-		include_spip('public/compiler');
1261
-		include_spip('public/composer');
1262
-		instituer_boucle($boucle, false, true);
1263
-		$res = calculer_select(
1264
-			$boucle->select,
1265
-			$boucle->from,
1266
-			$boucle->from_type,
1267
-			$boucle->where,
1268
-			$boucle->join,
1269
-			$boucle->group,
1270
-			$boucle->order,
1271
-			$boucle->limit,
1272
-			$boucle->having,
1273
-			$table_objet,
1274
-			$id_table,
1275
-			$serveur
1276
-		);
1277
-		if (sql_fetch($res)) {
1278
-			return true;
1279
-		}
1280
-
1281
-		return false;
1282
-	}
1283
-
1284
-	// si pas d'info statut ni de fonction : l'objet est publie
1285
-	return true;
1230
+    // voir si une fonction est definie pour faire le boulot
1231
+    // elle a la priorite dans ce cas
1232
+    if ($f = charger_fonction($objet . '_test_si_publie', 'base', true)) {
1233
+        return $f($objet, $id_objet, $serveur);
1234
+    }
1235
+
1236
+    // sinon on se fie a la declaration de l'objet si presente
1237
+    $id_table = $table_objet = table_objet($objet);
1238
+    $id_table_objet = id_table_objet($objet, $serveur);
1239
+    $trouver_table = charger_fonction('trouver_table', 'base');
1240
+    if (
1241
+        $desc = $trouver_table($table_objet, $serveur)
1242
+        and isset($desc['statut'])
1243
+        and $desc['statut']
1244
+    ) {
1245
+        $boucle = new Boucle();
1246
+        $boucle->show = $desc;
1247
+        $boucle->nom = 'objet_test_si_publie';
1248
+        $boucle->id_boucle = $id_table;
1249
+        $boucle->id_table = $id_table;
1250
+        $boucle->primary = $desc['key']['PRIMARY KEY'] ?? '';
1251
+        $boucle->sql_serveur = $serveur;
1252
+        $boucle->select[] = $id_table_objet;
1253
+        $boucle->from[$table_objet] = table_objet_sql($objet, $serveur);
1254
+        $boucle->where[] = $id_table . '.' . $id_table_objet . '=' . intval($id_objet);
1255
+
1256
+        $boucle->descr['nom'] = 'objet_test_si_publie'; // eviter notice php
1257
+        $boucle->descr['sourcefile'] = 'internal';
1258
+        $boucle->descr['gram'] = 'html';
1259
+
1260
+        include_spip('public/compiler');
1261
+        include_spip('public/composer');
1262
+        instituer_boucle($boucle, false, true);
1263
+        $res = calculer_select(
1264
+            $boucle->select,
1265
+            $boucle->from,
1266
+            $boucle->from_type,
1267
+            $boucle->where,
1268
+            $boucle->join,
1269
+            $boucle->group,
1270
+            $boucle->order,
1271
+            $boucle->limit,
1272
+            $boucle->having,
1273
+            $table_objet,
1274
+            $id_table,
1275
+            $serveur
1276
+        );
1277
+        if (sql_fetch($res)) {
1278
+            return true;
1279
+        }
1280
+
1281
+        return false;
1282
+    }
1283
+
1284
+    // si pas d'info statut ni de fonction : l'objet est publie
1285
+    return true;
1286 1286
 }
1287 1287
 
1288 1288
 
@@ -1317,124 +1317,124 @@  discard block
 block discarded – undo
1317 1317
  *     Retourne un tableau décrivant les parents trouvés
1318 1318
  */
1319 1319
 function objet_lister_parents($objet, $id_objet, $parent_direct_seulement = false) {
1320
-	$parents = [];
1321
-
1322
-	// Si on trouve une ou des méthodes de parent
1323
-	if ($parent_methodes = objet_type_decrire_infos_parents($objet)) {
1324
-		// On identifie les informations sur l'objet source dont on cherche le parent.
1325
-		include_spip('base/abstract_sql');
1326
-		$table_objet = table_objet_sql($objet);
1327
-		$cle_objet = id_table_objet($objet);
1328
-		$id_objet = intval($id_objet);
1329
-
1330
-		// On teste chacun méthode dans l'ordre, et dès qu'on a trouvé un parent on s'arrête
1331
-		foreach ($parent_methodes as $parent_methode) {
1332
-			// Champ identifiant le parent (id et éventuellement le type)
1333
-			// -- cette identification ne dépend pas du fait que le parent soit stocké dans une table de différente
1334
-			//    de celle de l'objet source
1335
-			$select = [];
1336
-			if (isset($parent_methode['champ'])) {
1337
-				$select[] = $parent_methode['champ'];
1338
-			}
1339
-			if (isset($parent_methode['champ_type'])) {
1340
-				$select[] = $parent_methode['champ_type'];
1341
-			}
1342
-
1343
-			// Détermination de la table du parent et des conditions sur l'objet source et le parent.
1344
-			$condition_objet_invalide = false;
1345
-			$where = [];
1346
-			if (!isset($parent_methode['table'])) {
1347
-				// Le parent est stocké dans la même table que l'objet source :
1348
-				// -- toutes les conditions s'appliquent à la table source.
1349
-				$table = $table_objet;
1350
-				$where = ["$cle_objet = $id_objet"];
1351
-				// -- Condition supplémentaire sur la détection du parent
1352
-				if (isset($parent_methode['condition'])) {
1353
-					$where[] = $parent_methode['condition'];
1354
-				}
1355
-			} elseif (!$parent_direct_seulement) {
1356
-				// Le parent est stocké dans une table différente de l'objet source.
1357
-				// -- on vérifie d'emblée si il y a une condition sur l'objet source et si celle-ci est vérifiée
1358
-				//    Si non, on peut arrêter le traitement.
1359
-				if (isset($parent_methode['condition'])) {
1360
-					$where = [
1361
-						"$cle_objet = $id_objet",
1362
-						$parent_methode['condition']
1363
-					];
1364
-					if (!sql_countsel($table_objet, $where)) {
1365
-						$condition_objet_invalide = true;
1366
-					}
1367
-				}
1368
-
1369
-				// Si pas de condition sur l'objet source ou que la condition est vérifiée, on peut construire
1370
-				// la requête sur la table qui accueille le parent.
1371
-				if (!$condition_objet_invalide) {
1372
-					$table = $parent_methode['table'];
1373
-					// On construit les conditions en fonction de l'identification de l'objet source
1374
-					$where = [];
1375
-					// -- si le champ_source de l'id n'est pas précisé c'est qu'il est déjà connu et donc que c'est
1376
-					//    le même que celui de l'objet source.
1377
-					$where[] = isset($parent_methode['source_champ'])
1378
-						? "{$parent_methode['source_champ']} = $id_objet"
1379
-						: "${cle_objet} = $id_objet";
1380
-					if (isset($parent_methode['source_champ_type'])) {
1381
-						$where[] = "{$parent_methode['source_champ_type']} = " . sql_quote($objet);
1382
-					}
1383
-					// -- Condition supplémentaire sur la détection du parent
1384
-					if (isset($parent_methode['table_condition'])) {
1385
-						$where[] = $parent_methode['table_condition'];
1386
-					}
1387
-				}
1388
-			}
1389
-
1390
-			// On lance la requête de récupération du parent
1391
-			$is_table_lien = (strpos($table, '_liens') !== false and substr($table, -6) === '_liens');
1392
-			if (
1393
-				!$condition_objet_invalide
1394
-				and $where
1395
-				and ($lignes = sql_allfetsel($is_table_lien ? '*' : $select, $table, $where))
1396
-			) {
1397
-				foreach ($lignes as $ligne) {
1398
-					// Si le type est fixe
1399
-					if (isset($parent_methode['type'])) {
1400
-						$parent = [
1401
-							'objet' 	=> $parent_methode['type'],
1402
-							'id_objet'	=> intval($ligne[$parent_methode['champ']]),
1403
-							'champ' 	=> $parent_methode['champ'],
1404
-							'table'    => $table,
1405
-						];
1406
-					}
1407
-					elseif (isset($parent_methode['champ_type'])) {
1408
-						$parent = [
1409
-							'objet' 	 => $ligne[$parent_methode['champ_type']],
1410
-							'id_objet' 	 => intval($ligne[$parent_methode['champ']]),
1411
-							'champ' 	 => $parent_methode['champ'],
1412
-							'champ_type' => $parent_methode['champ_type'],
1413
-							'table'    => $table,
1414
-						];
1415
-					}
1416
-					if ($is_table_lien) {
1417
-						$parent['lien'] = $ligne;
1418
-					}
1419
-					$parents[] = $parent;
1420
-				}
1421
-			}
1422
-		}
1423
-	}
1424
-
1425
-	// On passe par un pipeline avant de retourner
1426
-	$parents = pipeline(
1427
-		'objet_lister_parents',
1428
-		[
1429
-			'args' => [
1430
-				'objet' => $objet,
1431
-				'id_objet' => $id_objet,
1432
-			],
1433
-			'data' => $parents,
1434
-		]
1435
-	);
1436
-
1437
-	return $parents;
1320
+    $parents = [];
1321
+
1322
+    // Si on trouve une ou des méthodes de parent
1323
+    if ($parent_methodes = objet_type_decrire_infos_parents($objet)) {
1324
+        // On identifie les informations sur l'objet source dont on cherche le parent.
1325
+        include_spip('base/abstract_sql');
1326
+        $table_objet = table_objet_sql($objet);
1327
+        $cle_objet = id_table_objet($objet);
1328
+        $id_objet = intval($id_objet);
1329
+
1330
+        // On teste chacun méthode dans l'ordre, et dès qu'on a trouvé un parent on s'arrête
1331
+        foreach ($parent_methodes as $parent_methode) {
1332
+            // Champ identifiant le parent (id et éventuellement le type)
1333
+            // -- cette identification ne dépend pas du fait que le parent soit stocké dans une table de différente
1334
+            //    de celle de l'objet source
1335
+            $select = [];
1336
+            if (isset($parent_methode['champ'])) {
1337
+                $select[] = $parent_methode['champ'];
1338
+            }
1339
+            if (isset($parent_methode['champ_type'])) {
1340
+                $select[] = $parent_methode['champ_type'];
1341
+            }
1342
+
1343
+            // Détermination de la table du parent et des conditions sur l'objet source et le parent.
1344
+            $condition_objet_invalide = false;
1345
+            $where = [];
1346
+            if (!isset($parent_methode['table'])) {
1347
+                // Le parent est stocké dans la même table que l'objet source :
1348
+                // -- toutes les conditions s'appliquent à la table source.
1349
+                $table = $table_objet;
1350
+                $where = ["$cle_objet = $id_objet"];
1351
+                // -- Condition supplémentaire sur la détection du parent
1352
+                if (isset($parent_methode['condition'])) {
1353
+                    $where[] = $parent_methode['condition'];
1354
+                }
1355
+            } elseif (!$parent_direct_seulement) {
1356
+                // Le parent est stocké dans une table différente de l'objet source.
1357
+                // -- on vérifie d'emblée si il y a une condition sur l'objet source et si celle-ci est vérifiée
1358
+                //    Si non, on peut arrêter le traitement.
1359
+                if (isset($parent_methode['condition'])) {
1360
+                    $where = [
1361
+                        "$cle_objet = $id_objet",
1362
+                        $parent_methode['condition']
1363
+                    ];
1364
+                    if (!sql_countsel($table_objet, $where)) {
1365
+                        $condition_objet_invalide = true;
1366
+                    }
1367
+                }
1368
+
1369
+                // Si pas de condition sur l'objet source ou que la condition est vérifiée, on peut construire
1370
+                // la requête sur la table qui accueille le parent.
1371
+                if (!$condition_objet_invalide) {
1372
+                    $table = $parent_methode['table'];
1373
+                    // On construit les conditions en fonction de l'identification de l'objet source
1374
+                    $where = [];
1375
+                    // -- si le champ_source de l'id n'est pas précisé c'est qu'il est déjà connu et donc que c'est
1376
+                    //    le même que celui de l'objet source.
1377
+                    $where[] = isset($parent_methode['source_champ'])
1378
+                        ? "{$parent_methode['source_champ']} = $id_objet"
1379
+                        : "${cle_objet} = $id_objet";
1380
+                    if (isset($parent_methode['source_champ_type'])) {
1381
+                        $where[] = "{$parent_methode['source_champ_type']} = " . sql_quote($objet);
1382
+                    }
1383
+                    // -- Condition supplémentaire sur la détection du parent
1384
+                    if (isset($parent_methode['table_condition'])) {
1385
+                        $where[] = $parent_methode['table_condition'];
1386
+                    }
1387
+                }
1388
+            }
1389
+
1390
+            // On lance la requête de récupération du parent
1391
+            $is_table_lien = (strpos($table, '_liens') !== false and substr($table, -6) === '_liens');
1392
+            if (
1393
+                !$condition_objet_invalide
1394
+                and $where
1395
+                and ($lignes = sql_allfetsel($is_table_lien ? '*' : $select, $table, $where))
1396
+            ) {
1397
+                foreach ($lignes as $ligne) {
1398
+                    // Si le type est fixe
1399
+                    if (isset($parent_methode['type'])) {
1400
+                        $parent = [
1401
+                            'objet' 	=> $parent_methode['type'],
1402
+                            'id_objet'	=> intval($ligne[$parent_methode['champ']]),
1403
+                            'champ' 	=> $parent_methode['champ'],
1404
+                            'table'    => $table,
1405
+                        ];
1406
+                    }
1407
+                    elseif (isset($parent_methode['champ_type'])) {
1408
+                        $parent = [
1409
+                            'objet' 	 => $ligne[$parent_methode['champ_type']],
1410
+                            'id_objet' 	 => intval($ligne[$parent_methode['champ']]),
1411
+                            'champ' 	 => $parent_methode['champ'],
1412
+                            'champ_type' => $parent_methode['champ_type'],
1413
+                            'table'    => $table,
1414
+                        ];
1415
+                    }
1416
+                    if ($is_table_lien) {
1417
+                        $parent['lien'] = $ligne;
1418
+                    }
1419
+                    $parents[] = $parent;
1420
+                }
1421
+            }
1422
+        }
1423
+    }
1424
+
1425
+    // On passe par un pipeline avant de retourner
1426
+    $parents = pipeline(
1427
+        'objet_lister_parents',
1428
+        [
1429
+            'args' => [
1430
+                'objet' => $objet,
1431
+                'id_objet' => $id_objet,
1432
+            ],
1433
+            'data' => $parents,
1434
+        ]
1435
+    );
1436
+
1437
+    return $parents;
1438 1438
 }
1439 1439
 
1440 1440
 /**
@@ -1446,17 +1446,17 @@  discard block
 block discarded – undo
1446 1446
  * @return array
1447 1447
  */
1448 1448
 function objet_lister_parents_par_type($objet, $id_objet) {
1449
-	$parents = objet_lister_parents($objet, $id_objet);
1449
+    $parents = objet_lister_parents($objet, $id_objet);
1450 1450
 
1451
-	$parents_par_type = [];
1452
-	foreach ($parents as $parent) {
1453
-		if (!isset($parents_par_type[$parent['objet']])) {
1454
-			$parents_par_type[$parent['objet']] = [];
1455
-		}
1456
-		$parents_par_type[$parent['objet']][] = $parent['id_objet'];
1457
-	}
1451
+    $parents_par_type = [];
1452
+    foreach ($parents as $parent) {
1453
+        if (!isset($parents_par_type[$parent['objet']])) {
1454
+            $parents_par_type[$parent['objet']] = [];
1455
+        }
1456
+        $parents_par_type[$parent['objet']][] = $parent['id_objet'];
1457
+    }
1458 1458
 
1459
-	return $parents_par_type;
1459
+    return $parents_par_type;
1460 1460
 }
1461 1461
 
1462 1462
 
@@ -1489,85 +1489,85 @@  discard block
 block discarded – undo
1489 1489
  *     Retourne un tableau de tableaux, avec comme clés les types des objets, et dans chacun un tableau des identifiants trouvés
1490 1490
  */
1491 1491
 function objet_lister_enfants($objet, $id_objet) {
1492
-	$enfants = [];
1493
-
1494
-	// Si on trouve des types d'enfants et leurs méthodes
1495
-	if ($enfants_methodes = objet_type_decrire_infos_enfants($objet)) {
1496
-		include_spip('base/abstract_sql');
1497
-		$id_objet = intval($id_objet);
1498
-
1499
-		// On parcourt tous les types d'enfants trouvés
1500
-		foreach ($enfants_methodes as $objet_enfant => $_methode_parent) {
1501
-			// On construit les conditions d'identification du parent
1502
-			$where = [];
1503
-			// -- L'identifiant du parent
1504
-			if (isset($_methode_parent['champ'])) {
1505
-				$where[] = $_methode_parent['champ'] . ' = ' . $id_objet;
1506
-			}
1507
-			// -- Si le parent est variable
1508
-			if (isset($_methode_parent['champ_type'])) {
1509
-				$where[] = $_methode_parent['champ_type'] . ' = ' . sql_quote($objet);
1510
-			}
1511
-
1512
-			// On détermine la table, le champ id des enfants et on complète éventuellement les conditions
1513
-			if (!isset($_methode_parent['table'])) {
1514
-				// Les enfants sont stockés dans la même table que l'objet parent :
1515
-				$table_enfant = table_objet_sql($objet_enfant);
1516
-				$cle_objet_enfant = id_table_objet($objet_enfant);
1517
-
1518
-				// S'il y a une condition supplémentaire
1519
-				if (isset($_methode_parent['condition'])) {
1520
-					$where[] = $_methode_parent['condition'];
1521
-				}
1522
-			} else {
1523
-				// Les enfants sont stockés dans une table différente de l'objet parent.
1524
-				$table_enfant = $_methode_parent['table'];
1525
-				$cle_objet_enfant = $_methode_parent['source_champ'] ?? id_table_objet($objet_enfant);
1526
-
1527
-				// S'il y a une condition supplémentaire
1528
-				if (isset($_methode_parent['table_condition'])) {
1529
-					$where[] = $_methode_parent['table_condition'];
1530
-				}
1531
-			}
1532
-
1533
-			// On lance la requête
1534
-			$is_table_lien = (strpos($table_enfant, '_liens') !== false and substr($table_enfant, -6) === '_liens');
1535
-			if ($rows = sql_allfetsel($is_table_lien ? '*' : $cle_objet_enfant, $table_enfant, $where)) {
1536
-				$enfant = [
1537
-					'objet' => $objet_enfant,
1538
-					'id_objet' => 0,
1539
-					'table' => $table_enfant
1540
-				];
1541
-				if (isset($_methode_parent['champ'])) {
1542
-					$enfant['champ'] = $_methode_parent['champ'];
1543
-				}
1544
-				if (isset($_methode_parent['champ_type'])) {
1545
-					$enfant['champ_type'] = $_methode_parent['champ_type'];
1546
-				}
1547
-				foreach ($rows as $row) {
1548
-					$enfant['id_objet'] = intval($row[$cle_objet_enfant]);
1549
-					if ($is_table_lien) {
1550
-						$enfant['lien'] = $row;
1551
-					}
1552
-					$enfants[] = $enfant;
1553
-				}
1554
-			}
1555
-		}
1556
-	}
1557
-
1558
-	// On passe par un pipeline avant de retourner
1559
-	$enfants = pipeline(
1560
-		'objet_lister_enfants',
1561
-		[
1562
-			'args' => [
1563
-				'objet' => $objet,
1564
-				'id_objet' => $id_objet,
1565
-			],
1566
-			'data' => $enfants,
1567
-		]
1568
-	);
1569
-
1570
-	return $enfants;
1492
+    $enfants = [];
1493
+
1494
+    // Si on trouve des types d'enfants et leurs méthodes
1495
+    if ($enfants_methodes = objet_type_decrire_infos_enfants($objet)) {
1496
+        include_spip('base/abstract_sql');
1497
+        $id_objet = intval($id_objet);
1498
+
1499
+        // On parcourt tous les types d'enfants trouvés
1500
+        foreach ($enfants_methodes as $objet_enfant => $_methode_parent) {
1501
+            // On construit les conditions d'identification du parent
1502
+            $where = [];
1503
+            // -- L'identifiant du parent
1504
+            if (isset($_methode_parent['champ'])) {
1505
+                $where[] = $_methode_parent['champ'] . ' = ' . $id_objet;
1506
+            }
1507
+            // -- Si le parent est variable
1508
+            if (isset($_methode_parent['champ_type'])) {
1509
+                $where[] = $_methode_parent['champ_type'] . ' = ' . sql_quote($objet);
1510
+            }
1511
+
1512
+            // On détermine la table, le champ id des enfants et on complète éventuellement les conditions
1513
+            if (!isset($_methode_parent['table'])) {
1514
+                // Les enfants sont stockés dans la même table que l'objet parent :
1515
+                $table_enfant = table_objet_sql($objet_enfant);
1516
+                $cle_objet_enfant = id_table_objet($objet_enfant);
1517
+
1518
+                // S'il y a une condition supplémentaire
1519
+                if (isset($_methode_parent['condition'])) {
1520
+                    $where[] = $_methode_parent['condition'];
1521
+                }
1522
+            } else {
1523
+                // Les enfants sont stockés dans une table différente de l'objet parent.
1524
+                $table_enfant = $_methode_parent['table'];
1525
+                $cle_objet_enfant = $_methode_parent['source_champ'] ?? id_table_objet($objet_enfant);
1526
+
1527
+                // S'il y a une condition supplémentaire
1528
+                if (isset($_methode_parent['table_condition'])) {
1529
+                    $where[] = $_methode_parent['table_condition'];
1530
+                }
1531
+            }
1532
+
1533
+            // On lance la requête
1534
+            $is_table_lien = (strpos($table_enfant, '_liens') !== false and substr($table_enfant, -6) === '_liens');
1535
+            if ($rows = sql_allfetsel($is_table_lien ? '*' : $cle_objet_enfant, $table_enfant, $where)) {
1536
+                $enfant = [
1537
+                    'objet' => $objet_enfant,
1538
+                    'id_objet' => 0,
1539
+                    'table' => $table_enfant
1540
+                ];
1541
+                if (isset($_methode_parent['champ'])) {
1542
+                    $enfant['champ'] = $_methode_parent['champ'];
1543
+                }
1544
+                if (isset($_methode_parent['champ_type'])) {
1545
+                    $enfant['champ_type'] = $_methode_parent['champ_type'];
1546
+                }
1547
+                foreach ($rows as $row) {
1548
+                    $enfant['id_objet'] = intval($row[$cle_objet_enfant]);
1549
+                    if ($is_table_lien) {
1550
+                        $enfant['lien'] = $row;
1551
+                    }
1552
+                    $enfants[] = $enfant;
1553
+                }
1554
+            }
1555
+        }
1556
+    }
1557
+
1558
+    // On passe par un pipeline avant de retourner
1559
+    $enfants = pipeline(
1560
+        'objet_lister_enfants',
1561
+        [
1562
+            'args' => [
1563
+                'objet' => $objet,
1564
+                'id_objet' => $id_objet,
1565
+            ],
1566
+            'data' => $enfants,
1567
+        ]
1568
+    );
1569
+
1570
+    return $enfants;
1571 1571
 }
1572 1572
 
1573 1573
 /**
@@ -1579,17 +1579,17 @@  discard block
 block discarded – undo
1579 1579
  * @return array
1580 1580
  */
1581 1581
 function objet_lister_enfants_par_type($objet, $id_objet) {
1582
-	$enfants = objet_lister_enfants($objet, $id_objet);
1582
+    $enfants = objet_lister_enfants($objet, $id_objet);
1583 1583
 
1584
-	$enfants_par_type = [];
1585
-	foreach ($enfants as $enfant) {
1586
-		if (!isset($enfants_par_type[$enfant['objet']])) {
1587
-			$enfants_par_type[$enfant['objet']] = [];
1588
-		}
1589
-		$enfants_par_type[$enfant['objet']][] = $enfant['id_objet'];
1590
-	}
1584
+    $enfants_par_type = [];
1585
+    foreach ($enfants as $enfant) {
1586
+        if (!isset($enfants_par_type[$enfant['objet']])) {
1587
+            $enfants_par_type[$enfant['objet']] = [];
1588
+        }
1589
+        $enfants_par_type[$enfant['objet']][] = $enfant['id_objet'];
1590
+    }
1591 1591
 
1592
-	return $enfants_par_type;
1592
+    return $enfants_par_type;
1593 1593
 }
1594 1594
 
1595 1595
 /**
@@ -1601,35 +1601,35 @@  discard block
 block discarded – undo
1601 1601
  *     Retourne un tableau de tableau contenant les informations de type et de champ pour trouver le parent ou false sinon
1602 1602
  */
1603 1603
 function objet_type_decrire_infos_parents($objet) {
1604
-	static $parents = [];
1605
-
1606
-	// Si on ne l'a pas encore cherché pour cet objet
1607
-	if (!isset($parents[$objet])) {
1608
-		$parents[$objet] = false;
1609
-		$table = table_objet_sql($objet);
1610
-
1611
-		// Si on trouve bien la description de cet objet
1612
-		if ($infos = lister_tables_objets_sql($table)) {
1613
-			if (isset($infos['parent']) and is_array($infos['parent'])) {
1614
-				// S'il y a une description explicite de parent, c'est prioritaire
1615
-				// -- on traite les cas où il y a une ou plusieurs description mais on renvoie toujours un tableau
1616
-				//    de description
1617
-				if (!isset($infos['parent'][0])) {
1618
-					$parents[$objet] = [$infos['parent']];
1619
-				} else {
1620
-					$parents[$objet] = $infos['parent'];
1621
-				}
1622
-			} elseif (isset($infos['field']['id_rubrique'])) {
1623
-				// Sinon on cherche des cas courants connus magiquement, à commencer par id_rubrique
1624
-				$parents[$objet] = [['type' => 'rubrique', 'champ' => 'id_rubrique']];
1625
-			} elseif (isset($infos['field']['id_parent'])) {
1626
-				// Sinon on cherche un champ id_parent, ce qui signifie que l'objet est parent de lui-même
1627
-				$parents[$objet] = [['type' => $objet, 'champ' => 'id_parent']];
1628
-			}
1629
-		}
1630
-	}
1631
-
1632
-	return $parents[$objet];
1604
+    static $parents = [];
1605
+
1606
+    // Si on ne l'a pas encore cherché pour cet objet
1607
+    if (!isset($parents[$objet])) {
1608
+        $parents[$objet] = false;
1609
+        $table = table_objet_sql($objet);
1610
+
1611
+        // Si on trouve bien la description de cet objet
1612
+        if ($infos = lister_tables_objets_sql($table)) {
1613
+            if (isset($infos['parent']) and is_array($infos['parent'])) {
1614
+                // S'il y a une description explicite de parent, c'est prioritaire
1615
+                // -- on traite les cas où il y a une ou plusieurs description mais on renvoie toujours un tableau
1616
+                //    de description
1617
+                if (!isset($infos['parent'][0])) {
1618
+                    $parents[$objet] = [$infos['parent']];
1619
+                } else {
1620
+                    $parents[$objet] = $infos['parent'];
1621
+                }
1622
+            } elseif (isset($infos['field']['id_rubrique'])) {
1623
+                // Sinon on cherche des cas courants connus magiquement, à commencer par id_rubrique
1624
+                $parents[$objet] = [['type' => 'rubrique', 'champ' => 'id_rubrique']];
1625
+            } elseif (isset($infos['field']['id_parent'])) {
1626
+                // Sinon on cherche un champ id_parent, ce qui signifie que l'objet est parent de lui-même
1627
+                $parents[$objet] = [['type' => $objet, 'champ' => 'id_parent']];
1628
+            }
1629
+        }
1630
+    }
1631
+
1632
+    return $parents[$objet];
1633 1633
 }
1634 1634
 
1635 1635
 /**
@@ -1641,36 +1641,36 @@  discard block
 block discarded – undo
1641 1641
  *     Retourne un tableau de tableaux contenant chacun les informations d'un type d'enfant
1642 1642
  */
1643 1643
 function objet_type_decrire_infos_enfants($objet) {
1644
-	static $enfants = [];
1645
-
1646
-	// Si on a déjà fait la recherche pour ce type d'objet
1647
-	if (!isset($enfants[$objet])) {
1648
-		$enfants[$objet] = [];
1649
-		$tables = lister_tables_objets_sql();
1650
-
1651
-		// On parcourt toutes les tables d'objet, et on cherche si chacune peut être enfant
1652
-		foreach ($tables as $table => $infos) {
1653
-			$objet_enfant = objet_type($table);
1654
-
1655
-			// On ne va pas refaire les tests des différents cas, on réutilise
1656
-			if ($parent_methodes = objet_type_decrire_infos_parents($objet_enfant)) {
1657
-				// On parcourt les différents cas possible, si certains peuvent concerner l'objet demandé
1658
-				foreach ($parent_methodes as $parent_methode) {
1659
-					// Si la méthode qu'on teste n'exclut pas le parent demandé
1660
-					if (!isset($parent_methode['exclus']) or !in_array($objet, $parent_methode['exclus'])) {
1661
-						// Si le type du parent est fixe et directement l'objet demandé
1662
-						if (isset($parent_methode['type']) and isset($parent_methode['champ']) and $parent_methode['type'] == $objet) {
1663
-							$enfants[$objet][$objet_enfant] = $parent_methode;
1664
-						}
1665
-						// Si le type est variable, alors l'objet demandé peut forcément être parent
1666
-						elseif (isset($parent_methode['champ_type']) and isset($parent_methode['champ'])) {
1667
-							$enfants[$objet][$objet_enfant] = $parent_methode;
1668
-						}
1669
-					}
1670
-				}
1671
-			}
1672
-		}
1673
-	}
1674
-
1675
-	return $enfants[$objet];
1644
+    static $enfants = [];
1645
+
1646
+    // Si on a déjà fait la recherche pour ce type d'objet
1647
+    if (!isset($enfants[$objet])) {
1648
+        $enfants[$objet] = [];
1649
+        $tables = lister_tables_objets_sql();
1650
+
1651
+        // On parcourt toutes les tables d'objet, et on cherche si chacune peut être enfant
1652
+        foreach ($tables as $table => $infos) {
1653
+            $objet_enfant = objet_type($table);
1654
+
1655
+            // On ne va pas refaire les tests des différents cas, on réutilise
1656
+            if ($parent_methodes = objet_type_decrire_infos_parents($objet_enfant)) {
1657
+                // On parcourt les différents cas possible, si certains peuvent concerner l'objet demandé
1658
+                foreach ($parent_methodes as $parent_methode) {
1659
+                    // Si la méthode qu'on teste n'exclut pas le parent demandé
1660
+                    if (!isset($parent_methode['exclus']) or !in_array($objet, $parent_methode['exclus'])) {
1661
+                        // Si le type du parent est fixe et directement l'objet demandé
1662
+                        if (isset($parent_methode['type']) and isset($parent_methode['champ']) and $parent_methode['type'] == $objet) {
1663
+                            $enfants[$objet][$objet_enfant] = $parent_methode;
1664
+                        }
1665
+                        // Si le type est variable, alors l'objet demandé peut forcément être parent
1666
+                        elseif (isset($parent_methode['champ_type']) and isset($parent_methode['champ'])) {
1667
+                            $enfants[$objet][$objet_enfant] = $parent_methode;
1668
+                        }
1669
+                    }
1670
+                }
1671
+            }
1672
+        }
1673
+    }
1674
+
1675
+    return $enfants[$objet];
1676 1676
 }
Please login to merge, or discard this patch.