Completed
Push — master ( 8ce9c8...350a8b )
by cam
01:02
created
ecrire/base/upgrade.php 1 patch
Indentation   +285 added lines, -285 removed lines patch added patch discarded remove patch
@@ -16,17 +16,17 @@  discard block
 block discarded – undo
16 16
  */
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 if (!defined('_UPGRADE_TIME_OUT')) {
23
-	/**
24
-	 * Durée en secondes pour relancer les scripts de mises à jour, x secondes
25
-	 * avant que la durée d'exécution du script provoque un timeout
26
-	 *
27
-	 * @var int
28
-	 **/
29
-	define('_UPGRADE_TIME_OUT', 20);
23
+    /**
24
+     * Durée en secondes pour relancer les scripts de mises à jour, x secondes
25
+     * avant que la durée d'exécution du script provoque un timeout
26
+     *
27
+     * @var int
28
+     **/
29
+    define('_UPGRADE_TIME_OUT', 20);
30 30
 }
31 31
 
32 32
 /**
@@ -49,40 +49,40 @@  discard block
 block discarded – undo
49 49
  * @return void
50 50
  */
51 51
 function base_upgrade_dist($titre = '', $reprise = '') {
52
-	if (!$titre) {
53
-		return;
54
-	} // anti-testeur automatique
55
-	if ($GLOBALS['spip_version_base'] != $GLOBALS['meta']['version_installee']) {
56
-		if (!is_numeric(_request('reinstall'))) {
57
-			include_spip('base/create');
58
-			spip_log('recree les tables eventuellement disparues', 'maj.' . _LOG_INFO_IMPORTANTE);
59
-			creer_base();
60
-		}
61
-
62
-		// quand on rentre par ici, c'est toujours une mise a jour de SPIP
63
-		// lancement de l'upgrade SPIP
64
-		$res = maj_base();
65
-
66
-		if ($res) {
67
-			// on arrete tout ici !
68
-			exit;
69
-		}
70
-	}
71
-	spip_log('Fin de mise a jour SQL. Debut m-a-j acces et config', 'maj.' . _LOG_INFO_IMPORTANTE);
72
-
73
-	// supprimer quelques fichiers temporaires qui peuvent se retrouver invalides
74
-	@spip_unlink(_CACHE_RUBRIQUES);
75
-	@spip_unlink(_CACHE_PIPELINES);
76
-	@spip_unlink(_CACHE_PLUGINS_PATH);
77
-	@spip_unlink(_CACHE_PLUGINS_OPT);
78
-	@spip_unlink(_CACHE_PLUGINS_FCT);
79
-	@spip_unlink(_CACHE_CHEMIN);
80
-	@spip_unlink(_DIR_TMP . 'plugin_xml_cache.gz');
81
-
82
-	include_spip('inc/auth');
83
-	auth_synchroniser_distant();
84
-	$config = charger_fonction('config', 'inc');
85
-	$config();
52
+    if (!$titre) {
53
+        return;
54
+    } // anti-testeur automatique
55
+    if ($GLOBALS['spip_version_base'] != $GLOBALS['meta']['version_installee']) {
56
+        if (!is_numeric(_request('reinstall'))) {
57
+            include_spip('base/create');
58
+            spip_log('recree les tables eventuellement disparues', 'maj.' . _LOG_INFO_IMPORTANTE);
59
+            creer_base();
60
+        }
61
+
62
+        // quand on rentre par ici, c'est toujours une mise a jour de SPIP
63
+        // lancement de l'upgrade SPIP
64
+        $res = maj_base();
65
+
66
+        if ($res) {
67
+            // on arrete tout ici !
68
+            exit;
69
+        }
70
+    }
71
+    spip_log('Fin de mise a jour SQL. Debut m-a-j acces et config', 'maj.' . _LOG_INFO_IMPORTANTE);
72
+
73
+    // supprimer quelques fichiers temporaires qui peuvent se retrouver invalides
74
+    @spip_unlink(_CACHE_RUBRIQUES);
75
+    @spip_unlink(_CACHE_PIPELINES);
76
+    @spip_unlink(_CACHE_PLUGINS_PATH);
77
+    @spip_unlink(_CACHE_PLUGINS_OPT);
78
+    @spip_unlink(_CACHE_PLUGINS_FCT);
79
+    @spip_unlink(_CACHE_CHEMIN);
80
+    @spip_unlink(_DIR_TMP . 'plugin_xml_cache.gz');
81
+
82
+    include_spip('inc/auth');
83
+    auth_synchroniser_distant();
84
+    $config = charger_fonction('config', 'inc');
85
+    $config();
86 86
 }
87 87
 
88 88
 /**
@@ -113,51 +113,51 @@  discard block
 block discarded – undo
113 113
  */
114 114
 function maj_base($version_cible = 0, $redirect = '', $debut_page = true) {
115 115
 
116
-	$version_installee = $GLOBALS['meta']['version_installee'] ?? null;
117
-
118
-	spip_log(
119
-		"Version anterieure: $version_installee. Courante: " . $GLOBALS['spip_version_base'],
120
-		'maj.' . _LOG_INFO_IMPORTANTE
121
-	);
122
-	if (!$version_installee or ($GLOBALS['spip_version_base'] < $version_installee)) {
123
-		sql_replace(
124
-			'spip_meta',
125
-			[
126
-				'nom' => 'version_installee',
127
-				'valeur' => $GLOBALS['spip_version_base'],
128
-				'impt' => 'non'
129
-			]
130
-		);
131
-		return false;
132
-	}
133
-	if (!upgrade_test()) {
134
-		return true;
135
-	}
136
-
137
-	$cible = ($version_cible ?: $GLOBALS['spip_version_base']);
138
-
139
-	if ($version_installee < 2021_01_01_00) {
140
-		include_spip('maj/legacy/v21');
141
-		include_spip('maj/legacy/v30');
142
-		include_spip('maj/legacy/v31');
143
-		include_spip('maj/legacy/v32');
144
-		include_spip('maj/legacy/v40');
145
-	}
146
-
147
-	include_spip('maj/2021');
148
-
149
-	ksort($GLOBALS['maj']);
150
-	$res = maj_while($version_installee, $cible, $GLOBALS['maj'], 'version_installee', 'meta', $redirect, $debut_page);
151
-	if ($res) {
152
-		if (!is_array($res)) {
153
-			spip_log("Pb d'acces SQL a la mise a jour", 'maj.' . _LOG_ERREUR);
154
-		} else {
155
-			echo _T('avis_operation_echec') . ' ' . join(' ', $res);
156
-			echo install_fin_html();
157
-		}
158
-	}
159
-
160
-	return $res;
116
+    $version_installee = $GLOBALS['meta']['version_installee'] ?? null;
117
+
118
+    spip_log(
119
+        "Version anterieure: $version_installee. Courante: " . $GLOBALS['spip_version_base'],
120
+        'maj.' . _LOG_INFO_IMPORTANTE
121
+    );
122
+    if (!$version_installee or ($GLOBALS['spip_version_base'] < $version_installee)) {
123
+        sql_replace(
124
+            'spip_meta',
125
+            [
126
+                'nom' => 'version_installee',
127
+                'valeur' => $GLOBALS['spip_version_base'],
128
+                'impt' => 'non'
129
+            ]
130
+        );
131
+        return false;
132
+    }
133
+    if (!upgrade_test()) {
134
+        return true;
135
+    }
136
+
137
+    $cible = ($version_cible ?: $GLOBALS['spip_version_base']);
138
+
139
+    if ($version_installee < 2021_01_01_00) {
140
+        include_spip('maj/legacy/v21');
141
+        include_spip('maj/legacy/v30');
142
+        include_spip('maj/legacy/v31');
143
+        include_spip('maj/legacy/v32');
144
+        include_spip('maj/legacy/v40');
145
+    }
146
+
147
+    include_spip('maj/2021');
148
+
149
+    ksort($GLOBALS['maj']);
150
+    $res = maj_while($version_installee, $cible, $GLOBALS['maj'], 'version_installee', 'meta', $redirect, $debut_page);
151
+    if ($res) {
152
+        if (!is_array($res)) {
153
+            spip_log("Pb d'acces SQL a la mise a jour", 'maj.' . _LOG_ERREUR);
154
+        } else {
155
+            echo _T('avis_operation_echec') . ' ' . join(' ', $res);
156
+            echo install_fin_html();
157
+        }
158
+    }
159
+
160
+    return $res;
161 161
 }
162 162
 
163 163
 /**
@@ -199,53 +199,53 @@  discard block
 block discarded – undo
199 199
  */
200 200
 function maj_plugin($nom_meta_base_version, $version_cible, $maj, $table_meta = 'meta') {
201 201
 
202
-	if ($table_meta !== 'meta') {
203
-		installer_table_meta($table_meta);
204
-	}
205
-
206
-	$current_version = null;
207
-
208
-	if (
209
-		(!isset($GLOBALS[$table_meta][$nom_meta_base_version]))
210
-		|| (!spip_version_compare($current_version = $GLOBALS[$table_meta][$nom_meta_base_version], $version_cible, '='))
211
-	) {
212
-		// $maj['create'] contient les directives propres a la premiere creation de base
213
-		// c'est une operation derogatoire qui fait aboutir directement dans la version_cible
214
-		if (isset($maj['create'])) {
215
-			if (!isset($GLOBALS[$table_meta][$nom_meta_base_version])) {
216
-				// installation : on ne fait que l'operation create
217
-				$maj = ['init' => $maj['create']];
218
-				// et on lui ajoute un appel a inc/config
219
-				// pour creer les metas par defaut
220
-				$config = charger_fonction('config', 'inc');
221
-				$maj[$version_cible] = [[$config]];
222
-			}
223
-			// dans tous les cas enlever cet index du tableau
224
-			unset($maj['create']);
225
-		}
226
-		// si init, deja dans le bon ordre
227
-		if (!isset($maj['init'])) {
228
-			include_spip('inc/plugin'); // pour spip_version_compare
229
-			uksort($maj, 'spip_version_compare');
230
-		}
231
-
232
-		// la redirection se fait par defaut sur la page d'administration des plugins
233
-		// sauf lorsque nous sommes sur l'installation de SPIP
234
-		// ou define _REDIRECT_MAJ_PLUGIN
235
-		$redirect = (defined('_REDIRECT_MAJ_PLUGIN') ? _REDIRECT_MAJ_PLUGIN : generer_url_ecrire('admin_plugin'));
236
-		if (defined('_ECRIRE_INSTALL')) {
237
-			$redirect = parametre_url(generer_url_ecrire('install'), 'etape', _request('etape'));
238
-		}
239
-
240
-		$res = maj_while($current_version, $version_cible, $maj, $nom_meta_base_version, $table_meta, $redirect);
241
-		if ($res) {
242
-			if (!is_array($res)) {
243
-				spip_log("Pb d'acces SQL a la mise a jour", 'maj.' . _LOG_ERREUR);
244
-			} else {
245
-				echo '<p>' . _T('avis_operation_echec') . ' ' . join(' ', $res) . '</p>';
246
-			}
247
-		}
248
-	}
202
+    if ($table_meta !== 'meta') {
203
+        installer_table_meta($table_meta);
204
+    }
205
+
206
+    $current_version = null;
207
+
208
+    if (
209
+        (!isset($GLOBALS[$table_meta][$nom_meta_base_version]))
210
+        || (!spip_version_compare($current_version = $GLOBALS[$table_meta][$nom_meta_base_version], $version_cible, '='))
211
+    ) {
212
+        // $maj['create'] contient les directives propres a la premiere creation de base
213
+        // c'est une operation derogatoire qui fait aboutir directement dans la version_cible
214
+        if (isset($maj['create'])) {
215
+            if (!isset($GLOBALS[$table_meta][$nom_meta_base_version])) {
216
+                // installation : on ne fait que l'operation create
217
+                $maj = ['init' => $maj['create']];
218
+                // et on lui ajoute un appel a inc/config
219
+                // pour creer les metas par defaut
220
+                $config = charger_fonction('config', 'inc');
221
+                $maj[$version_cible] = [[$config]];
222
+            }
223
+            // dans tous les cas enlever cet index du tableau
224
+            unset($maj['create']);
225
+        }
226
+        // si init, deja dans le bon ordre
227
+        if (!isset($maj['init'])) {
228
+            include_spip('inc/plugin'); // pour spip_version_compare
229
+            uksort($maj, 'spip_version_compare');
230
+        }
231
+
232
+        // la redirection se fait par defaut sur la page d'administration des plugins
233
+        // sauf lorsque nous sommes sur l'installation de SPIP
234
+        // ou define _REDIRECT_MAJ_PLUGIN
235
+        $redirect = (defined('_REDIRECT_MAJ_PLUGIN') ? _REDIRECT_MAJ_PLUGIN : generer_url_ecrire('admin_plugin'));
236
+        if (defined('_ECRIRE_INSTALL')) {
237
+            $redirect = parametre_url(generer_url_ecrire('install'), 'etape', _request('etape'));
238
+        }
239
+
240
+        $res = maj_while($current_version, $version_cible, $maj, $nom_meta_base_version, $table_meta, $redirect);
241
+        if ($res) {
242
+            if (!is_array($res)) {
243
+                spip_log("Pb d'acces SQL a la mise a jour", 'maj.' . _LOG_ERREUR);
244
+            } else {
245
+                echo '<p>' . _T('avis_operation_echec') . ' ' . join(' ', $res) . '</p>';
246
+            }
247
+        }
248
+    }
249 249
 }
250 250
 
251 251
 /**
@@ -262,17 +262,17 @@  discard block
 block discarded – undo
262 262
  * @return void
263 263
  */
264 264
 function relance_maj($meta, $table, $redirect = '') {
265
-	include_spip('inc/headers');
266
-	if (!$redirect) {
267
-		// recuperer la valeur installee en cours
268
-		// on la tronque numeriquement, elle ne sert pas reellement
269
-		// sauf pour verifier que ce n'est pas oui ou non
270
-		// sinon is_numeric va echouer sur un numero de version 1.2.3
271
-		$installee = intval($GLOBALS[$table][$meta]);
272
-		$redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true);
273
-	}
274
-	echo redirige_formulaire($redirect);
275
-	exit();
265
+    include_spip('inc/headers');
266
+    if (!$redirect) {
267
+        // recuperer la valeur installee en cours
268
+        // on la tronque numeriquement, elle ne sert pas reellement
269
+        // sauf pour verifier que ce n'est pas oui ou non
270
+        // sinon is_numeric va echouer sur un numero de version 1.2.3
271
+        $installee = intval($GLOBALS[$table][$meta]);
272
+        $redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true);
273
+    }
274
+    echo redirige_formulaire($redirect);
275
+    exit();
276 276
 }
277 277
 
278 278
 /**
@@ -285,29 +285,29 @@  discard block
 block discarded – undo
285 285
  * @return void
286 286
  */
287 287
 function maj_debut_page($installee, $meta, $table) {
288
-	static $done = false;
289
-	if ($done) {
290
-		return;
291
-	}
292
-	include_spip('inc/minipres');
293
-	include_spip('inc/filtres');
294
-	if (function_exists('ini_set')) {
295
-		@ini_set('zlib.output_compression', '0'); // pour permettre l'affichage au fur et a mesure
296
-	}
297
-	$timeout = _UPGRADE_TIME_OUT * 2;
298
-	$titre = _T('titre_page_upgrade');
299
-	$balise_img = charger_filtre('balise_img');
300
-	$titre .= $balise_img(chemin_image('loader.svg'), '', 'loader');
301
-	echo(install_debut_html($titre));
302
-	// script de rechargement auto sur timeout
303
-	$redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true);
304
-	echo http_script("window.setTimeout('location.href=\"" . $redirect . "\";'," . ($timeout * 1000) . ')');
305
-	echo "<div style='text-align: left'>\n";
306
-	if (ob_get_level()) {
307
-		ob_flush();
308
-	}
309
-	flush();
310
-	$done = true;
288
+    static $done = false;
289
+    if ($done) {
290
+        return;
291
+    }
292
+    include_spip('inc/minipres');
293
+    include_spip('inc/filtres');
294
+    if (function_exists('ini_set')) {
295
+        @ini_set('zlib.output_compression', '0'); // pour permettre l'affichage au fur et a mesure
296
+    }
297
+    $timeout = _UPGRADE_TIME_OUT * 2;
298
+    $titre = _T('titre_page_upgrade');
299
+    $balise_img = charger_filtre('balise_img');
300
+    $titre .= $balise_img(chemin_image('loader.svg'), '', 'loader');
301
+    echo(install_debut_html($titre));
302
+    // script de rechargement auto sur timeout
303
+    $redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true);
304
+    echo http_script("window.setTimeout('location.href=\"" . $redirect . "\";'," . ($timeout * 1000) . ')');
305
+    echo "<div style='text-align: left'>\n";
306
+    if (ob_get_level()) {
307
+        ob_flush();
308
+    }
309
+    flush();
310
+    $done = true;
311 311
 }
312 312
 
313 313
 
@@ -351,64 +351,64 @@  discard block
 block discarded – undo
351 351
  *    - tableau vide sinon.
352 352
  */
353 353
 function maj_while($installee, $cible, $maj, $meta = '', $table = 'meta', $redirect = '', $debut_page = false) {
354
-	# inclusions pour que les procedures d'upgrade disposent des fonctions de base
355
-	include_spip('base/create');
356
-	include_spip('base/abstract_sql');
357
-	$trouver_table = charger_fonction('trouver_table', 'base');
358
-	include_spip('inc/plugin'); // pour spip_version_compare
359
-	$n = 0;
360
-	$time = time();
361
-
362
-	if (!defined('_TIME_OUT')) {
363
-		/**
364
-		 * Définir le timeout qui peut-être utilisé dans les fonctions
365
-		 * de mises à jour qui durent trop longtemps
366
-		 *
367
-		 * À utiliser tel que : `if (time() >= _TIME_OUT)`
368
-		 *
369
-		 * @var int
370
-		 */
371
-		define('_TIME_OUT', $time + _UPGRADE_TIME_OUT);
372
-	}
373
-
374
-	foreach ($maj as $v => $operations) {
375
-		// si une maj pour cette version
376
-		if (
377
-			$v == 'init' or
378
-			(spip_version_compare($v, $installee, '>')
379
-				and spip_version_compare($v, $cible, '<='))
380
-		) {
381
-			if ($debut_page) {
382
-				maj_debut_page($v, $meta, $table);
383
-			}
384
-			echo "MAJ $v";
385
-			$etape = serie_alter($v, $operations, $meta, $table, $redirect);
386
-			$trouver_table(''); // vider le cache des descriptions de table
387
-			# echec sur une etape en cours ?
388
-			# on sort
389
-			if ($etape) {
390
-				return [$v, $etape];
391
-			}
392
-			$n = time() - $time;
393
-			spip_log("$table $meta: $v en $n secondes", 'maj.' . _LOG_INFO_IMPORTANTE);
394
-			if ($meta) {
395
-				ecrire_meta($meta, $installee = $v, 'oui', $table);
396
-			}
397
-			echo (_IS_CLI ? "\n" : '<br />');
398
-		}
399
-		if (time() >= _TIME_OUT) {
400
-			relance_maj($meta, $table, $redirect);
401
-		}
402
-	}
403
-	$trouver_table(''); // vider le cache des descriptions de table
404
-	// indispensable pour les chgt de versions qui n'ecrivent pas en base
405
-	// tant pis pour la redondance eventuelle avec ci-dessus
406
-	if ($meta) {
407
-		ecrire_meta($meta, $cible, 'oui', $table);
408
-	}
409
-	spip_log("MAJ terminee. $meta: $installee", 'maj.' . _LOG_INFO_IMPORTANTE);
410
-
411
-	return [];
354
+    # inclusions pour que les procedures d'upgrade disposent des fonctions de base
355
+    include_spip('base/create');
356
+    include_spip('base/abstract_sql');
357
+    $trouver_table = charger_fonction('trouver_table', 'base');
358
+    include_spip('inc/plugin'); // pour spip_version_compare
359
+    $n = 0;
360
+    $time = time();
361
+
362
+    if (!defined('_TIME_OUT')) {
363
+        /**
364
+         * Définir le timeout qui peut-être utilisé dans les fonctions
365
+         * de mises à jour qui durent trop longtemps
366
+         *
367
+         * À utiliser tel que : `if (time() >= _TIME_OUT)`
368
+         *
369
+         * @var int
370
+         */
371
+        define('_TIME_OUT', $time + _UPGRADE_TIME_OUT);
372
+    }
373
+
374
+    foreach ($maj as $v => $operations) {
375
+        // si une maj pour cette version
376
+        if (
377
+            $v == 'init' or
378
+            (spip_version_compare($v, $installee, '>')
379
+                and spip_version_compare($v, $cible, '<='))
380
+        ) {
381
+            if ($debut_page) {
382
+                maj_debut_page($v, $meta, $table);
383
+            }
384
+            echo "MAJ $v";
385
+            $etape = serie_alter($v, $operations, $meta, $table, $redirect);
386
+            $trouver_table(''); // vider le cache des descriptions de table
387
+            # echec sur une etape en cours ?
388
+            # on sort
389
+            if ($etape) {
390
+                return [$v, $etape];
391
+            }
392
+            $n = time() - $time;
393
+            spip_log("$table $meta: $v en $n secondes", 'maj.' . _LOG_INFO_IMPORTANTE);
394
+            if ($meta) {
395
+                ecrire_meta($meta, $installee = $v, 'oui', $table);
396
+            }
397
+            echo (_IS_CLI ? "\n" : '<br />');
398
+        }
399
+        if (time() >= _TIME_OUT) {
400
+            relance_maj($meta, $table, $redirect);
401
+        }
402
+    }
403
+    $trouver_table(''); // vider le cache des descriptions de table
404
+    // indispensable pour les chgt de versions qui n'ecrivent pas en base
405
+    // tant pis pour la redondance eventuelle avec ci-dessus
406
+    if ($meta) {
407
+        ecrire_meta($meta, $cible, 'oui', $table);
408
+    }
409
+    spip_log("MAJ terminee. $meta: $installee", 'maj.' . _LOG_INFO_IMPORTANTE);
410
+
411
+    return [];
412 412
 }
413 413
 
414 414
 /**
@@ -431,53 +431,53 @@  discard block
 block discarded – undo
431 431
  * @return int
432 432
  */
433 433
 function serie_alter($serie, $q = [], $meta = '', $table = 'meta', $redirect = '') {
434
-	$meta2 = $meta . '_maj_' . $serie;
435
-	$etape = 0;
436
-	if (isset($GLOBALS[$table][$meta2])) {
437
-		$etape = intval($GLOBALS[$table][$meta2]);
438
-	}
439
-	foreach ($q as $i => $r) {
440
-		if ($i >= $etape) {
441
-			$msg = "maj $table $meta2 etape $i";
442
-			if (
443
-				is_array($r)
444
-				and function_exists($f = array_shift($r))
445
-			) {
446
-				// note: $r (arguments de la fonction $f) peut avoir des données tabulaires
447
-				spip_log("$msg: $f " . @join(',', $r), 'maj.' . _LOG_INFO_IMPORTANTE);
448
-				// pour les fonctions atomiques sql_xx
449
-				// on enregistre le meta avant de lancer la fonction,
450
-				// de maniere a eviter de boucler sur timeout
451
-				// mais pour les fonctions complexes,
452
-				// il faut les rejouer jusqu'a achevement.
453
-				// C'est a elle d'assurer qu'elles progressent a chaque rappel
454
-				if (strncmp($f, 'sql_', 4) == 0) {
455
-					ecrire_meta($meta2, $i + 1, 'non', $table);
456
-				}
457
-				echo (_IS_CLI ? '.' : " <span title='$i'>.</span>");
458
-				$f(...$r);
459
-				// si temps imparti depasse, on relance sans ecrire en meta
460
-				// car on est peut etre sorti sur timeout si c'est une fonction longue
461
-				if (time() >= _TIME_OUT) {
462
-					relance_maj($meta, $table, $redirect);
463
-				}
464
-				ecrire_meta($meta2, $i + 1, 'non', $table);
465
-				spip_log("$meta2: ok", 'maj.' . _LOG_INFO_IMPORTANTE);
466
-			} else {
467
-				if (!is_array($r)) {
468
-					spip_log("maj $i format incorrect", 'maj.' . _LOG_ERREUR);
469
-				} else {
470
-					spip_log("maj $i fonction $f non definie", 'maj.' . _LOG_ERREUR);
471
-				}
472
-				// en cas d'erreur serieuse, on s'arrete
473
-				// mais on permet de passer par dessus en rechargeant la page.
474
-				return $i + 1;
475
-			}
476
-		}
477
-	}
478
-	effacer_meta($meta2, $table);
479
-
480
-	return 0;
434
+    $meta2 = $meta . '_maj_' . $serie;
435
+    $etape = 0;
436
+    if (isset($GLOBALS[$table][$meta2])) {
437
+        $etape = intval($GLOBALS[$table][$meta2]);
438
+    }
439
+    foreach ($q as $i => $r) {
440
+        if ($i >= $etape) {
441
+            $msg = "maj $table $meta2 etape $i";
442
+            if (
443
+                is_array($r)
444
+                and function_exists($f = array_shift($r))
445
+            ) {
446
+                // note: $r (arguments de la fonction $f) peut avoir des données tabulaires
447
+                spip_log("$msg: $f " . @join(',', $r), 'maj.' . _LOG_INFO_IMPORTANTE);
448
+                // pour les fonctions atomiques sql_xx
449
+                // on enregistre le meta avant de lancer la fonction,
450
+                // de maniere a eviter de boucler sur timeout
451
+                // mais pour les fonctions complexes,
452
+                // il faut les rejouer jusqu'a achevement.
453
+                // C'est a elle d'assurer qu'elles progressent a chaque rappel
454
+                if (strncmp($f, 'sql_', 4) == 0) {
455
+                    ecrire_meta($meta2, $i + 1, 'non', $table);
456
+                }
457
+                echo (_IS_CLI ? '.' : " <span title='$i'>.</span>");
458
+                $f(...$r);
459
+                // si temps imparti depasse, on relance sans ecrire en meta
460
+                // car on est peut etre sorti sur timeout si c'est une fonction longue
461
+                if (time() >= _TIME_OUT) {
462
+                    relance_maj($meta, $table, $redirect);
463
+                }
464
+                ecrire_meta($meta2, $i + 1, 'non', $table);
465
+                spip_log("$meta2: ok", 'maj.' . _LOG_INFO_IMPORTANTE);
466
+            } else {
467
+                if (!is_array($r)) {
468
+                    spip_log("maj $i format incorrect", 'maj.' . _LOG_ERREUR);
469
+                } else {
470
+                    spip_log("maj $i fonction $f non definie", 'maj.' . _LOG_ERREUR);
471
+                }
472
+                // en cas d'erreur serieuse, on s'arrete
473
+                // mais on permet de passer par dessus en rechargeant la page.
474
+                return $i + 1;
475
+            }
476
+        }
477
+    }
478
+    effacer_meta($meta2, $table);
479
+
480
+    return 0;
481 481
 }
482 482
 
483 483
 /**
@@ -486,16 +486,16 @@  discard block
 block discarded – undo
486 486
  * @return bool True si possible.
487 487
  **/
488 488
 function upgrade_test() {
489
-	sql_drop_table('spip_test', true);
490
-	sql_create('spip_test', ['a' => 'int']);
491
-	sql_alter('TABLE spip_test ADD b INT');
492
-	sql_insertq('spip_test', ['b' => 1], ['field' => ['b' => 'int']]);
493
-	$result = sql_select('b', 'spip_test');
494
-	// ne pas garder le resultat de la requete sinon sqlite3
495
-	// ne peut pas supprimer la table spip_test lors du sql_alter qui suit
496
-	// car cette table serait alors 'verouillee'
497
-	$result = $result ? true : false;
498
-	sql_alter('TABLE spip_test DROP b');
499
-
500
-	return $result;
489
+    sql_drop_table('spip_test', true);
490
+    sql_create('spip_test', ['a' => 'int']);
491
+    sql_alter('TABLE spip_test ADD b INT');
492
+    sql_insertq('spip_test', ['b' => 1], ['field' => ['b' => 'int']]);
493
+    $result = sql_select('b', 'spip_test');
494
+    // ne pas garder le resultat de la requete sinon sqlite3
495
+    // ne peut pas supprimer la table spip_test lors du sql_alter qui suit
496
+    // car cette table serait alors 'verouillee'
497
+    $result = $result ? true : false;
498
+    sql_alter('TABLE spip_test DROP b');
499
+
500
+    return $result;
501 501
 }
Please login to merge, or discard this patch.
ecrire/inc/auth.php 1 patch
Indentation   +454 added lines, -454 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  **/
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 include_spip('base/abstract_sql');
@@ -34,33 +34,33 @@  discard block
 block discarded – undo
34 34
  *  - une chaîne vide si autorisation à pénétrer dans l'espace privé.
35 35
  */
36 36
 function inc_auth_dist() {
37
-	$row = auth_mode();
37
+    $row = auth_mode();
38 38
 
39
-	if ($row) {
40
-		return auth_init_droits($row);
41
-	}
39
+    if ($row) {
40
+        return auth_init_droits($row);
41
+    }
42 42
 
43
-	if (!$GLOBALS['connect_login']) {
44
-		return auth_a_loger();
45
-	}
43
+    if (!$GLOBALS['connect_login']) {
44
+        return auth_a_loger();
45
+    }
46 46
 
47
-	// Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui
48
-	// C'est soit parce que la base est inutilisable,
49
-	// soit parce que la table des auteurs a changee (restauration etc)
50
-	// Pas la peine d'insister.
51
-	// Renvoyer le nom fautif et une URL de remise a zero
47
+    // Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui
48
+    // C'est soit parce que la base est inutilisable,
49
+    // soit parce que la table des auteurs a changee (restauration etc)
50
+    // Pas la peine d'insister.
51
+    // Renvoyer le nom fautif et une URL de remise a zero
52 52
 
53
-	if (spip_connect()) {
54
-		return [
55
-			'login' => $GLOBALS['connect_login'],
56
-			'site' => generer_url_public('', 'action=logout&amp;logout=prive')
57
-		];
58
-	}
53
+    if (spip_connect()) {
54
+        return [
55
+            'login' => $GLOBALS['connect_login'],
56
+            'site' => generer_url_public('', 'action=logout&amp;logout=prive')
57
+        ];
58
+    }
59 59
 
60
-	$n = intval(sql_errno());
61
-	spip_log("Erreur base de donnees $n " . sql_error());
60
+    $n = intval(sql_errno());
61
+    spip_log("Erreur base de donnees $n " . sql_error());
62 62
 
63
-	return $n ?: 1;
63
+    return $n ?: 1;
64 64
 }
65 65
 
66 66
 /**
@@ -70,22 +70,22 @@  discard block
 block discarded – undo
70 70
  */
71 71
 function auth_controler_password_auteur_connecte(#[\SensitiveParameter] string $password): bool {
72 72
 
73
-	if (
74
-		empty($GLOBALS['visiteur_session']['id_auteur'])
75
-		or empty($GLOBALS['visiteur_session']['login'])
76
-	) {
77
-		return false;
78
-	}
79
-
80
-	$auth = auth_identifier_login($GLOBALS['visiteur_session']['login'], $password, '', true);
81
-	if (
82
-		is_array($auth)
83
-		and $auth['id_auteur'] == $GLOBALS['visiteur_session']['id_auteur']
84
-	) {
85
-		return true;
86
-	}
87
-
88
-	return false;
73
+    if (
74
+        empty($GLOBALS['visiteur_session']['id_auteur'])
75
+        or empty($GLOBALS['visiteur_session']['login'])
76
+    ) {
77
+        return false;
78
+    }
79
+
80
+    $auth = auth_identifier_login($GLOBALS['visiteur_session']['login'], $password, '', true);
81
+    if (
82
+        is_array($auth)
83
+        and $auth['id_auteur'] == $GLOBALS['visiteur_session']['id_auteur']
84
+    ) {
85
+        return true;
86
+    }
87
+
88
+    return false;
89 89
 }
90 90
 
91 91
 /**
@@ -97,47 +97,47 @@  discard block
 block discarded – undo
97 97
  * @return array|string
98 98
  */
99 99
 function auth_echec($raison) {
100
-	include_spip('inc/minipres');
101
-	include_spip('inc/headers');
102
-	// pas authentifie. Pourquoi ?
103
-	if (is_string($raison)) {
104
-		// redirection vers une page d'authentification
105
-		// on ne revient pas de cette fonction
106
-		// sauf si pb de header
107
-		$raison = redirige_formulaire($raison);
108
-	} elseif (is_int($raison)) {
109
-		// erreur SQL a afficher
110
-		$raison = minipres(
111
-			_T('info_travaux_titre'),
112
-			_T('titre_probleme_technique') . '<p><tt>' . sql_errno() . ' ' . sql_error() . '</tt></p>'
113
-		);
114
-	} elseif (@$raison['statut']) {
115
-		// un simple visiteur n'a pas acces a l'espace prive
116
-		spip_log('connexion refusee a ' . @$raison['id_auteur']);
117
-		$est_connecte = (!empty($GLOBALS['visiteur_session']['login']) and !empty($GLOBALS['visiteur_session']['statut'])); // idem test balise #URL_LOGOUT
118
-		$raison = minipres(
119
-			_T('avis_erreur_connexion'),
120
-			_T('avis_erreur_visiteur')
121
-				// Lien vers le site public
122
-				. '<br /><a href="' . url_de_base() . '">' . _T('login_retour_public') . '</a>'
123
-				// Si la personne est connectée, lien de déconnexion ramenant vers la page de login
124
-				. ($est_connecte ? ' | <a href="' . generer_url_public('', 'action=logout&amp;logout=prive') . '">' . _T('icone_deconnecter') . '</a>' : '')
125
-		);
126
-	} else {
127
-		// auteur en fin de droits ...
128
-		$h = $raison['site'];
129
-		$raison = minipres(
130
-			_T('avis_erreur_connexion'),
131
-			'<br /><br /><p>'
132
-			. _T('texte_inc_auth_1', ['auth_login' => $raison['login']])
133
-			. " <a href='$h'>"
134
-			. _T('texte_inc_auth_2')
135
-			. '</a>'
136
-			. _T('texte_inc_auth_3')
137
-		);
138
-	}
139
-
140
-	return $raison;
100
+    include_spip('inc/minipres');
101
+    include_spip('inc/headers');
102
+    // pas authentifie. Pourquoi ?
103
+    if (is_string($raison)) {
104
+        // redirection vers une page d'authentification
105
+        // on ne revient pas de cette fonction
106
+        // sauf si pb de header
107
+        $raison = redirige_formulaire($raison);
108
+    } elseif (is_int($raison)) {
109
+        // erreur SQL a afficher
110
+        $raison = minipres(
111
+            _T('info_travaux_titre'),
112
+            _T('titre_probleme_technique') . '<p><tt>' . sql_errno() . ' ' . sql_error() . '</tt></p>'
113
+        );
114
+    } elseif (@$raison['statut']) {
115
+        // un simple visiteur n'a pas acces a l'espace prive
116
+        spip_log('connexion refusee a ' . @$raison['id_auteur']);
117
+        $est_connecte = (!empty($GLOBALS['visiteur_session']['login']) and !empty($GLOBALS['visiteur_session']['statut'])); // idem test balise #URL_LOGOUT
118
+        $raison = minipres(
119
+            _T('avis_erreur_connexion'),
120
+            _T('avis_erreur_visiteur')
121
+                // Lien vers le site public
122
+                . '<br /><a href="' . url_de_base() . '">' . _T('login_retour_public') . '</a>'
123
+                // Si la personne est connectée, lien de déconnexion ramenant vers la page de login
124
+                . ($est_connecte ? ' | <a href="' . generer_url_public('', 'action=logout&amp;logout=prive') . '">' . _T('icone_deconnecter') . '</a>' : '')
125
+        );
126
+    } else {
127
+        // auteur en fin de droits ...
128
+        $h = $raison['site'];
129
+        $raison = minipres(
130
+            _T('avis_erreur_connexion'),
131
+            '<br /><br /><p>'
132
+            . _T('texte_inc_auth_1', ['auth_login' => $raison['login']])
133
+            . " <a href='$h'>"
134
+            . _T('texte_inc_auth_2')
135
+            . '</a>'
136
+            . _T('texte_inc_auth_3')
137
+        );
138
+    }
139
+
140
+    return $raison;
141 141
 }
142 142
 
143 143
 /**
@@ -147,81 +147,81 @@  discard block
 block discarded – undo
147 147
  * @return array|bool|string
148 148
  */
149 149
 function auth_mode() {
150
-	//
151
-	// Initialiser variables (eviter hacks par URL)
152
-	//
153
-	$GLOBALS['connect_login'] = '';
154
-	$id_auteur = null;
155
-	$GLOBALS['auth_can_disconnect'] = false;
156
-
157
-	//
158
-	// Recuperer les donnees d'identification
159
-	//
160
-	include_spip('inc/session');
161
-	// Session valide en cours ?
162
-	if (isset($_COOKIE['spip_session'])) {
163
-		$session = charger_fonction('session', 'inc');
164
-		if (
165
-			$id_auteur = $session()
166
-			or $id_auteur === 0 // reprise sur restauration
167
-		) {
168
-			$GLOBALS['auth_can_disconnect'] = true;
169
-			$GLOBALS['connect_login'] = session_get('login');
170
-		} else {
171
-			unset($_COOKIE['spip_session']);
172
-		}
173
-	}
174
-
175
-	// Essayer auth http si significatif
176
-	// (ignorer les login d'intranet independants de spip)
177
-	if (!$GLOBALS['ignore_auth_http']) {
178
-		if (
179
-			(isset($_SERVER['PHP_AUTH_USER']) and isset($_SERVER['PHP_AUTH_PW'])
180
-				and $r = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))
181
-			or
182
-			// Si auth http differtente de basic, PHP_AUTH_PW
183
-			// est indisponible mais tentons quand meme pour
184
-			// autocreation via LDAP
185
-			(isset($_SERVER['REMOTE_USER'])
186
-				and $r = lire_php_auth($_SERVER['PHP_AUTH_USER'] = $_SERVER['REMOTE_USER'], ''))
187
-		) {
188
-			if (!$id_auteur) {
189
-				$_SERVER['PHP_AUTH_PW'] = '';
190
-				$GLOBALS['auth_can_disconnect'] = true;
191
-				$GLOBALS['visiteur_session'] = $r;
192
-				$GLOBALS['connect_login'] = session_get('login');
193
-				$id_auteur = $r['id_auteur'];
194
-			} else {
195
-				// cas de la session en plus de PHP_AUTH
196
-				/*				  if ($id_auteur != $r['id_auteur']){
150
+    //
151
+    // Initialiser variables (eviter hacks par URL)
152
+    //
153
+    $GLOBALS['connect_login'] = '';
154
+    $id_auteur = null;
155
+    $GLOBALS['auth_can_disconnect'] = false;
156
+
157
+    //
158
+    // Recuperer les donnees d'identification
159
+    //
160
+    include_spip('inc/session');
161
+    // Session valide en cours ?
162
+    if (isset($_COOKIE['spip_session'])) {
163
+        $session = charger_fonction('session', 'inc');
164
+        if (
165
+            $id_auteur = $session()
166
+            or $id_auteur === 0 // reprise sur restauration
167
+        ) {
168
+            $GLOBALS['auth_can_disconnect'] = true;
169
+            $GLOBALS['connect_login'] = session_get('login');
170
+        } else {
171
+            unset($_COOKIE['spip_session']);
172
+        }
173
+    }
174
+
175
+    // Essayer auth http si significatif
176
+    // (ignorer les login d'intranet independants de spip)
177
+    if (!$GLOBALS['ignore_auth_http']) {
178
+        if (
179
+            (isset($_SERVER['PHP_AUTH_USER']) and isset($_SERVER['PHP_AUTH_PW'])
180
+                and $r = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))
181
+            or
182
+            // Si auth http differtente de basic, PHP_AUTH_PW
183
+            // est indisponible mais tentons quand meme pour
184
+            // autocreation via LDAP
185
+            (isset($_SERVER['REMOTE_USER'])
186
+                and $r = lire_php_auth($_SERVER['PHP_AUTH_USER'] = $_SERVER['REMOTE_USER'], ''))
187
+        ) {
188
+            if (!$id_auteur) {
189
+                $_SERVER['PHP_AUTH_PW'] = '';
190
+                $GLOBALS['auth_can_disconnect'] = true;
191
+                $GLOBALS['visiteur_session'] = $r;
192
+                $GLOBALS['connect_login'] = session_get('login');
193
+                $id_auteur = $r['id_auteur'];
194
+            } else {
195
+                // cas de la session en plus de PHP_AUTH
196
+                /*				  if ($id_auteur != $r['id_auteur']){
197 197
 					spip_log("vol de session $id_auteur" . join(', ', $r));
198 198
 				unset($_COOKIE['spip_session']);
199 199
 				$id_auteur = '';
200 200
 				} */
201
-			}
202
-		} else {
203
-			// Authentification .htaccess old style, car .htaccess semble
204
-			// souvent definir *aussi* PHP_AUTH_USER et PHP_AUTH_PW
205
-			if (isset($_SERVER['REMOTE_USER'])) {
206
-				$GLOBALS['connect_login'] = $_SERVER['REMOTE_USER'];
207
-			}
208
-		}
209
-	}
210
-
211
-	$where = (is_numeric($id_auteur)
212
-		/*AND $id_auteur>0*/ // reprise lors des restaurations
213
-	) ?
214
-		"id_auteur=$id_auteur" :
215
-		(!strlen($GLOBALS['connect_login']) ? '' : 'login=' . sql_quote($GLOBALS['connect_login'], '', 'text'));
216
-
217
-	if (!$where) {
218
-		return '';
219
-	}
220
-
221
-	// Trouver les autres infos dans la table auteurs.
222
-	// le champ 'quand' est utilise par l'agenda
223
-
224
-	return sql_fetsel('*, en_ligne AS quand', 'spip_auteurs', "$where AND statut!='5poubelle'");
201
+            }
202
+        } else {
203
+            // Authentification .htaccess old style, car .htaccess semble
204
+            // souvent definir *aussi* PHP_AUTH_USER et PHP_AUTH_PW
205
+            if (isset($_SERVER['REMOTE_USER'])) {
206
+                $GLOBALS['connect_login'] = $_SERVER['REMOTE_USER'];
207
+            }
208
+        }
209
+    }
210
+
211
+    $where = (is_numeric($id_auteur)
212
+        /*AND $id_auteur>0*/ // reprise lors des restaurations
213
+    ) ?
214
+        "id_auteur=$id_auteur" :
215
+        (!strlen($GLOBALS['connect_login']) ? '' : 'login=' . sql_quote($GLOBALS['connect_login'], '', 'text'));
216
+
217
+    if (!$where) {
218
+        return '';
219
+    }
220
+
221
+    // Trouver les autres infos dans la table auteurs.
222
+    // le champ 'quand' est utilise par l'agenda
223
+
224
+    return sql_fetsel('*, en_ligne AS quand', 'spip_auteurs', "$where AND statut!='5poubelle'");
225 225
 }
226 226
 
227 227
 /**
@@ -239,85 +239,85 @@  discard block
 block discarded – undo
239 239
  */
240 240
 function auth_init_droits($row) {
241 241
 
242
-	include_spip('inc/autoriser');
243
-	if (!autoriser('loger', '', 0, $row)) {
244
-		return false;
245
-	}
246
-
247
-
248
-	if ($row['statut'] == 'nouveau') {
249
-		include_spip('action/inscrire_auteur');
250
-		$row = confirmer_statut_inscription($row);
251
-	}
252
-
253
-	$GLOBALS['connect_id_auteur'] = $row['id_auteur'];
254
-	$GLOBALS['connect_login'] = $row['login'];
255
-	$GLOBALS['connect_statut'] = $row['statut'];
256
-
257
-	$GLOBALS['visiteur_session'] = array_merge((array)$GLOBALS['visiteur_session'], $row);
258
-
259
-	// au cas ou : ne pas memoriser les champs sensibles
260
-	unset($GLOBALS['visiteur_session']['pass']);
261
-	unset($GLOBALS['visiteur_session']['htpass']);
262
-	unset($GLOBALS['visiteur_session']['alea_actuel']);
263
-	unset($GLOBALS['visiteur_session']['alea_futur']);
264
-	unset($GLOBALS['visiteur_session']['ldap_password']);
265
-
266
-	// creer la session au besoin
267
-	if (!isset($_COOKIE['spip_session'])) {
268
-		$session = charger_fonction('session', 'inc');
269
-		$spip_session = $session($row);
270
-	}
271
-
272
-	// reinjecter les preferences_auteur apres le reset de spip_session
273
-	// car utilisees au retour par auth_loger()
274
-	$r = @unserialize($row['prefs']);
275
-	$GLOBALS['visiteur_session']['prefs'] = ($r ?: []);
276
-	// si prefs pas definies, les definir par defaut
277
-	if (!isset($GLOBALS['visiteur_session']['prefs']['couleur'])) {
278
-		$GLOBALS['visiteur_session']['prefs']['couleur'] = 2;
279
-		$GLOBALS['visiteur_session']['prefs']['display'] = 2;
280
-		$GLOBALS['visiteur_session']['prefs']['display_navigation'] = 'navigation_avec_icones';
281
-	}
282
-
283
-	$GLOBALS['visiteur_session'] = pipeline(
284
-		'preparer_visiteur_session',
285
-		['args' => ['row' => $row],
286
-		'data' => $GLOBALS['visiteur_session']]
287
-	);
288
-
289
-	// Etablir les droits selon le codage attendu
290
-	// dans ecrire/index.php ecrire/prive.php
291
-
292
-	// Pas autorise a acceder a ecrire ? renvoyer le tableau
293
-	// A noter : le premier appel a autoriser() a le bon gout
294
-	// d'initialiser $GLOBALS['visiteur_session']['restreint'],
295
-	// qui ne figure pas dans le fichier de session
296
-
297
-	if (!autoriser('ecrire')) {
298
-		return $row;
299
-	}
300
-
301
-	// autoriser('ecrire') ne laisse passer que les Admin et les Redac
302
-
303
-	auth_trace($row);
304
-
305
-	// Administrateurs
306
-	if (in_array($GLOBALS['connect_statut'], explode(',', _STATUT_AUTEUR_RUBRIQUE))) {
307
-		if (
308
-			isset($GLOBALS['visiteur_session']['restreint'])
309
-			and is_array($GLOBALS['visiteur_session']['restreint'])
310
-		) {
311
-			$GLOBALS['connect_id_rubrique'] = $GLOBALS['visiteur_session']['restreint'];
312
-		}
313
-		if ($GLOBALS['connect_statut'] == '0minirezo') {
314
-			$GLOBALS['connect_toutes_rubriques'] = !$GLOBALS['connect_id_rubrique'];
315
-		}
316
-	}
317
-
318
-	// Pour les redacteurs, inc_version a fait l'initialisation minimale
319
-
320
-	return ''; // i.e. pas de pb.
242
+    include_spip('inc/autoriser');
243
+    if (!autoriser('loger', '', 0, $row)) {
244
+        return false;
245
+    }
246
+
247
+
248
+    if ($row['statut'] == 'nouveau') {
249
+        include_spip('action/inscrire_auteur');
250
+        $row = confirmer_statut_inscription($row);
251
+    }
252
+
253
+    $GLOBALS['connect_id_auteur'] = $row['id_auteur'];
254
+    $GLOBALS['connect_login'] = $row['login'];
255
+    $GLOBALS['connect_statut'] = $row['statut'];
256
+
257
+    $GLOBALS['visiteur_session'] = array_merge((array)$GLOBALS['visiteur_session'], $row);
258
+
259
+    // au cas ou : ne pas memoriser les champs sensibles
260
+    unset($GLOBALS['visiteur_session']['pass']);
261
+    unset($GLOBALS['visiteur_session']['htpass']);
262
+    unset($GLOBALS['visiteur_session']['alea_actuel']);
263
+    unset($GLOBALS['visiteur_session']['alea_futur']);
264
+    unset($GLOBALS['visiteur_session']['ldap_password']);
265
+
266
+    // creer la session au besoin
267
+    if (!isset($_COOKIE['spip_session'])) {
268
+        $session = charger_fonction('session', 'inc');
269
+        $spip_session = $session($row);
270
+    }
271
+
272
+    // reinjecter les preferences_auteur apres le reset de spip_session
273
+    // car utilisees au retour par auth_loger()
274
+    $r = @unserialize($row['prefs']);
275
+    $GLOBALS['visiteur_session']['prefs'] = ($r ?: []);
276
+    // si prefs pas definies, les definir par defaut
277
+    if (!isset($GLOBALS['visiteur_session']['prefs']['couleur'])) {
278
+        $GLOBALS['visiteur_session']['prefs']['couleur'] = 2;
279
+        $GLOBALS['visiteur_session']['prefs']['display'] = 2;
280
+        $GLOBALS['visiteur_session']['prefs']['display_navigation'] = 'navigation_avec_icones';
281
+    }
282
+
283
+    $GLOBALS['visiteur_session'] = pipeline(
284
+        'preparer_visiteur_session',
285
+        ['args' => ['row' => $row],
286
+        'data' => $GLOBALS['visiteur_session']]
287
+    );
288
+
289
+    // Etablir les droits selon le codage attendu
290
+    // dans ecrire/index.php ecrire/prive.php
291
+
292
+    // Pas autorise a acceder a ecrire ? renvoyer le tableau
293
+    // A noter : le premier appel a autoriser() a le bon gout
294
+    // d'initialiser $GLOBALS['visiteur_session']['restreint'],
295
+    // qui ne figure pas dans le fichier de session
296
+
297
+    if (!autoriser('ecrire')) {
298
+        return $row;
299
+    }
300
+
301
+    // autoriser('ecrire') ne laisse passer que les Admin et les Redac
302
+
303
+    auth_trace($row);
304
+
305
+    // Administrateurs
306
+    if (in_array($GLOBALS['connect_statut'], explode(',', _STATUT_AUTEUR_RUBRIQUE))) {
307
+        if (
308
+            isset($GLOBALS['visiteur_session']['restreint'])
309
+            and is_array($GLOBALS['visiteur_session']['restreint'])
310
+        ) {
311
+            $GLOBALS['connect_id_rubrique'] = $GLOBALS['visiteur_session']['restreint'];
312
+        }
313
+        if ($GLOBALS['connect_statut'] == '0minirezo') {
314
+            $GLOBALS['connect_toutes_rubriques'] = !$GLOBALS['connect_id_rubrique'];
315
+        }
316
+    }
317
+
318
+    // Pour les redacteurs, inc_version a fait l'initialisation minimale
319
+
320
+    return ''; // i.e. pas de pb.
321 321
 }
322 322
 
323 323
 /**
@@ -326,23 +326,23 @@  discard block
 block discarded – undo
326 326
  * @return string
327 327
  */
328 328
 function auth_a_loger() {
329
-	$redirect = generer_url_public('login', 'url=' . rawurlencode(self('&', true)), true);
330
-
331
-	// un echec au "bonjour" (login initial) quand le statut est
332
-	// inconnu signale sans doute un probleme de cookies
333
-	if (isset($_GET['bonjour'])) {
334
-		$redirect = parametre_url(
335
-			$redirect,
336
-			'var_erreur',
337
-			(!isset($GLOBALS['visiteur_session']['statut'])
338
-				? 'cookie'
339
-				: 'statut'
340
-			),
341
-			'&'
342
-		);
343
-	}
344
-
345
-	return $redirect;
329
+    $redirect = generer_url_public('login', 'url=' . rawurlencode(self('&', true)), true);
330
+
331
+    // un echec au "bonjour" (login initial) quand le statut est
332
+    // inconnu signale sans doute un probleme de cookies
333
+    if (isset($_GET['bonjour'])) {
334
+        $redirect = parametre_url(
335
+            $redirect,
336
+            'var_erreur',
337
+            (!isset($GLOBALS['visiteur_session']['statut'])
338
+                ? 'cookie'
339
+                : 'statut'
340
+            ),
341
+            '&'
342
+        );
343
+    }
344
+
345
+    return $redirect;
346 346
 }
347 347
 
348 348
 /**
@@ -354,19 +354,19 @@  discard block
 block discarded – undo
354 354
  * @param null|string $date
355 355
  */
356 356
 function auth_trace($row, $date = null) {
357
-	// Indiquer la connexion. A la minute pres ca suffit.
358
-	if (!is_numeric($connect_quand = $row['quand'] ?? '')) {
359
-		$connect_quand = strtotime($connect_quand);
360
-	}
357
+    // Indiquer la connexion. A la minute pres ca suffit.
358
+    if (!is_numeric($connect_quand = $row['quand'] ?? '')) {
359
+        $connect_quand = strtotime($connect_quand);
360
+    }
361 361
 
362
-	$date ??= date('Y-m-d H:i:s');
362
+    $date ??= date('Y-m-d H:i:s');
363 363
 
364
-	if (abs(strtotime($date) - $connect_quand) >= 60) {
365
-		sql_updateq('spip_auteurs', ['en_ligne' => $date], 'id_auteur=' . intval($row['id_auteur']));
366
-		$row['en_ligne'] = $date;
367
-	}
364
+    if (abs(strtotime($date) - $connect_quand) >= 60) {
365
+        sql_updateq('spip_auteurs', ['en_ligne' => $date], 'id_auteur=' . intval($row['id_auteur']));
366
+        $row['en_ligne'] = $date;
367
+    }
368 368
 
369
-	pipeline('trig_auth_trace', ['args' => ['row' => $row, 'date' => $date]]);
369
+    pipeline('trig_auth_trace', ['args' => ['row' => $row, 'date' => $date]]);
370 370
 }
371 371
 
372 372
 
@@ -392,28 +392,28 @@  discard block
 block discarded – undo
392 392
  * @return mixed
393 393
  */
394 394
 function auth_administrer($fonction, $args, $defaut = false) {
395
-	$auth_methode = array_shift($args);
396
-	$auth_methode = $auth_methode ?: 'spip'; // valeur par defaut au cas ou
397
-	if (
398
-		$auth = charger_fonction($auth_methode, 'auth', true)
399
-		and function_exists($f = "auth_{$auth_methode}_$fonction")
400
-	) {
401
-		$res = $f(...$args);
402
-	} else {
403
-		$res = $defaut;
404
-	}
405
-	$res = pipeline(
406
-		'auth_administrer',
407
-		[
408
-			'args' => [
409
-				'fonction' => $fonction,
410
-				'methode' => $auth_methode,
411
-				'args' => $args
412
-			],
413
-			'data' => $res
414
-		]
415
-	);
416
-	return $res;
395
+    $auth_methode = array_shift($args);
396
+    $auth_methode = $auth_methode ?: 'spip'; // valeur par defaut au cas ou
397
+    if (
398
+        $auth = charger_fonction($auth_methode, 'auth', true)
399
+        and function_exists($f = "auth_{$auth_methode}_$fonction")
400
+    ) {
401
+        $res = $f(...$args);
402
+    } else {
403
+        $res = $defaut;
404
+    }
405
+    $res = pipeline(
406
+        'auth_administrer',
407
+        [
408
+            'args' => [
409
+                'fonction' => $fonction,
410
+                'methode' => $auth_methode,
411
+                'args' => $args
412
+            ],
413
+            'data' => $res
414
+        ]
415
+    );
416
+    return $res;
417 417
 }
418 418
 
419 419
 /**
@@ -423,11 +423,11 @@  discard block
 block discarded – undo
423 423
  * @return array
424 424
  */
425 425
 function auth_formulaire_login($flux) {
426
-	foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
427
-		$flux = auth_administrer('formulaire_login', [$methode, $flux], $flux);
428
-	}
426
+    foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
427
+        $flux = auth_administrer('formulaire_login', [$methode, $flux], $flux);
428
+    }
429 429
 
430
-	return $flux;
430
+    return $flux;
431 431
 }
432 432
 
433 433
 
@@ -441,19 +441,19 @@  discard block
 block discarded – undo
441 441
  * @return string/bool
442 442
  */
443 443
 function auth_retrouver_login($login, $serveur = '') {
444
-	if (!spip_connect($serveur)) {
445
-		include_spip('inc/minipres');
446
-		echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'));
447
-		exit;
448
-	}
449
-
450
-	foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
451
-		if ($auteur = auth_administrer('retrouver_login', [$methode, $login, $serveur])) {
452
-			return $auteur;
453
-		}
454
-	}
455
-
456
-	return false;
444
+    if (!spip_connect($serveur)) {
445
+        include_spip('inc/minipres');
446
+        echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'));
447
+        exit;
448
+    }
449
+
450
+    foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
451
+        if ($auteur = auth_administrer('retrouver_login', [$methode, $login, $serveur])) {
452
+            return $auteur;
453
+        }
454
+    }
455
+
456
+    return false;
457 457
 }
458 458
 
459 459
 /**
@@ -468,34 +468,34 @@  discard block
 block discarded – undo
468 468
  * @return array
469 469
  */
470 470
 function auth_informer_login($login, $serveur = '') {
471
-	if (
472
-		!$login
473
-		or !$login_base = auth_retrouver_login($login, $serveur)
474
-		or !$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur)
475
-	) {
476
-		// generer de fausses infos, mais credibles, pour eviter une attaque
477
-		// https://core.spip.net/issues/1758 + https://core.spip.net/issues/3691
478
-
479
-		$row = [
480
-			'login' => $login,
481
-			'cnx' => '0',
482
-			'logo' => '',
483
-		];
484
-
485
-		return $row;
486
-	}
487
-
488
-	$prefs = @unserialize($row['prefs']);
489
-	$infos = [
490
-		'id_auteur' => $row['id_auteur'],
491
-		'login' => $row['login'],
492
-		'cnx' => (isset($prefs['cnx']) and $prefs['cnx'] === 'perma') ? '1' : '0',
493
-		'logo' => recuperer_fond('formulaires/inc-logo_auteur', $row),
494
-	];
495
-
496
-	verifier_visiteur();
497
-
498
-	return auth_administrer('informer_login', [$row['source'], $infos, $row, $serveur], $infos);
471
+    if (
472
+        !$login
473
+        or !$login_base = auth_retrouver_login($login, $serveur)
474
+        or !$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur)
475
+    ) {
476
+        // generer de fausses infos, mais credibles, pour eviter une attaque
477
+        // https://core.spip.net/issues/1758 + https://core.spip.net/issues/3691
478
+
479
+        $row = [
480
+            'login' => $login,
481
+            'cnx' => '0',
482
+            'logo' => '',
483
+        ];
484
+
485
+        return $row;
486
+    }
487
+
488
+    $prefs = @unserialize($row['prefs']);
489
+    $infos = [
490
+        'id_auteur' => $row['id_auteur'],
491
+        'login' => $row['login'],
492
+        'cnx' => (isset($prefs['cnx']) and $prefs['cnx'] === 'perma') ? '1' : '0',
493
+        'logo' => recuperer_fond('formulaires/inc-logo_auteur', $row),
494
+    ];
495
+
496
+    verifier_visiteur();
497
+
498
+    return auth_administrer('informer_login', [$row['source'], $infos, $row, $serveur], $infos);
499 499
 }
500 500
 
501 501
 
@@ -509,21 +509,21 @@  discard block
 block discarded – undo
509 509
  * @return mixed
510 510
  */
511 511
 function auth_identifier_login($login, #[\SensitiveParameter] $password, $serveur = '', bool $phpauth = false) {
512
-	$erreur = '';
513
-	foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
514
-		if ($auth = charger_fonction($methode, 'auth', true)) {
515
-			$auteur = $auth($login, $password, $serveur, $phpauth);
516
-			if (is_array($auteur) and count($auteur)) {
517
-				spip_log("connexion de $login par methode $methode");
518
-				$auteur['auth'] = $methode;
519
-				return $auteur;
520
-			} elseif (is_string($auteur)) {
521
-				$erreur .= "$auteur ";
522
-			}
523
-		}
524
-	}
525
-
526
-	return $erreur;
512
+    $erreur = '';
513
+    foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
514
+        if ($auth = charger_fonction($methode, 'auth', true)) {
515
+            $auteur = $auth($login, $password, $serveur, $phpauth);
516
+            if (is_array($auteur) and count($auteur)) {
517
+                spip_log("connexion de $login par methode $methode");
518
+                $auteur['auth'] = $methode;
519
+                return $auteur;
520
+            } elseif (is_string($auteur)) {
521
+                $erreur .= "$auteur ";
522
+            }
523
+        }
524
+    }
525
+
526
+    return $erreur;
527 527
 }
528 528
 
529 529
 /**
@@ -537,8 +537,8 @@  discard block
 block discarded – undo
537 537
  * @return string
538 538
  */
539 539
 function auth_url_retour_login($auth_methode, $login, $redirect = '', $serveur = '') {
540
-	$securiser_action = charger_fonction('securiser_action', 'inc');
541
-	return $securiser_action('auth', "$auth_methode/$login", $redirect, true);
540
+    $securiser_action = charger_fonction('securiser_action', 'inc');
541
+    return $securiser_action('auth', "$auth_methode/$login", $redirect, true);
542 542
 }
543 543
 
544 544
 /**
@@ -552,9 +552,9 @@  discard block
 block discarded – undo
552 552
  * @return mixed
553 553
  */
554 554
 function auth_terminer_identifier_login($auth_methode, $login, $serveur = '') {
555
-	$args = func_get_args();
556
-	$auteur = auth_administrer('terminer_identifier_login', $args);
557
-	return $auteur;
555
+    $args = func_get_args();
556
+    $auteur = auth_administrer('terminer_identifier_login', $args);
557
+    return $auteur;
558 558
 }
559 559
 
560 560
 /**
@@ -564,29 +564,29 @@  discard block
 block discarded – undo
564 564
  * @return bool
565 565
  */
566 566
 function auth_loger($auteur) {
567
-	if (!is_array($auteur) or !count($auteur)) {
568
-		return false;
569
-	}
570
-
571
-	// initialiser et poser le cookie de session
572
-	unset($_COOKIE['spip_session']);
573
-	if (auth_init_droits($auteur) === false) {
574
-		return false;
575
-	}
576
-
577
-	// initialiser les prefs
578
-	$p = $GLOBALS['visiteur_session']['prefs'];
579
-	$p['cnx'] = (isset($auteur['cookie']) and $auteur['cookie'] == 'oui') ? 'perma' : '';
580
-
581
-	sql_updateq(
582
-		'spip_auteurs',
583
-		['prefs' => serialize($p)],
584
-		'id_auteur=' . intval($auteur['id_auteur'])
585
-	);
586
-
587
-	//  bloquer ici le visiteur qui tente d'abuser de ses droits
588
-	verifier_visiteur();
589
-	return true;
567
+    if (!is_array($auteur) or !count($auteur)) {
568
+        return false;
569
+    }
570
+
571
+    // initialiser et poser le cookie de session
572
+    unset($_COOKIE['spip_session']);
573
+    if (auth_init_droits($auteur) === false) {
574
+        return false;
575
+    }
576
+
577
+    // initialiser les prefs
578
+    $p = $GLOBALS['visiteur_session']['prefs'];
579
+    $p['cnx'] = (isset($auteur['cookie']) and $auteur['cookie'] == 'oui') ? 'perma' : '';
580
+
581
+    sql_updateq(
582
+        'spip_auteurs',
583
+        ['prefs' => serialize($p)],
584
+        'id_auteur=' . intval($auteur['id_auteur'])
585
+    );
586
+
587
+    //  bloquer ici le visiteur qui tente d'abuser de ses droits
588
+    verifier_visiteur();
589
+    return true;
590 590
 }
591 591
 
592 592
 /**
@@ -596,8 +596,8 @@  discard block
 block discarded – undo
596 596
  * return void
597 597
  **/
598 598
 function auth_deloger() {
599
-	$logout = charger_fonction('logout', 'action');
600
-	$logout();
599
+    $logout = charger_fonction('logout', 'action');
600
+    $logout();
601 601
 }
602 602
 
603 603
 /**
@@ -611,8 +611,8 @@  discard block
 block discarded – undo
611 611
  * @return bool
612 612
  */
613 613
 function auth_autoriser_modifier_login($auth_methode, $serveur = '') {
614
-	$args = func_get_args();
615
-	return auth_administrer('autoriser_modifier_login', $args);
614
+    $args = func_get_args();
615
+    return auth_administrer('autoriser_modifier_login', $args);
616 616
 }
617 617
 
618 618
 /**
@@ -627,8 +627,8 @@  discard block
 block discarded – undo
627 627
  *  message d'erreur ou chaine vide si pas d'erreur
628 628
  */
629 629
 function auth_verifier_login($auth_methode, $new_login, $id_auteur = 0, $serveur = '') {
630
-	$args = func_get_args();
631
-	return auth_administrer('verifier_login', $args, '');
630
+    $args = func_get_args();
631
+    return auth_administrer('verifier_login', $args, '');
632 632
 }
633 633
 
634 634
 /**
@@ -641,8 +641,8 @@  discard block
 block discarded – undo
641 641
  * @return bool
642 642
  */
643 643
 function auth_modifier_login($auth_methode, $new_login, $id_auteur, $serveur = '') {
644
-	$args = func_get_args();
645
-	return auth_administrer('modifier_login', $args);
644
+    $args = func_get_args();
645
+    return auth_administrer('modifier_login', $args);
646 646
 }
647 647
 
648 648
 /**
@@ -657,8 +657,8 @@  discard block
 block discarded – undo
657 657
  *  succès ou échec
658 658
  */
659 659
 function auth_autoriser_modifier_pass($auth_methode, $serveur = '') {
660
-	$args = func_get_args();
661
-	return auth_administrer('autoriser_modifier_pass', $args);
660
+    $args = func_get_args();
661
+    return auth_administrer('autoriser_modifier_pass', $args);
662 662
 }
663 663
 
664 664
 /**
@@ -674,8 +674,8 @@  discard block
 block discarded – undo
674 674
  *  message d'erreur ou chaine vide si pas d'erreur
675 675
  */
676 676
 function auth_verifier_pass($auth_methode, $login, #[\SensitiveParameter] $new_pass, $id_auteur = 0, $serveur = '') {
677
-	$args = func_get_args();
678
-	return auth_administrer('verifier_pass', $args, '');
677
+    $args = func_get_args();
678
+    return auth_administrer('verifier_pass', $args, '');
679 679
 }
680 680
 
681 681
 /**
@@ -691,8 +691,8 @@  discard block
 block discarded – undo
691 691
  *  succes ou echec
692 692
  */
693 693
 function auth_modifier_pass($auth_methode, $login, #[\SensitiveParameter] $new_pass, $id_auteur, $serveur = '') {
694
-	$args = func_get_args();
695
-	return auth_administrer('modifier_pass', $args);
694
+    $args = func_get_args();
695
+    return auth_administrer('modifier_pass', $args);
696 696
 }
697 697
 
698 698
 /**
@@ -708,24 +708,24 @@  discard block
 block discarded – undo
708 708
  * @return void
709 709
  */
710 710
 function auth_synchroniser_distant(
711
-	$auth_methode = true,
712
-	$id_auteur = 0,
713
-	$champs = [],
714
-	$options = [],
715
-	$serveur = ''
711
+    $auth_methode = true,
712
+    $id_auteur = 0,
713
+    $champs = [],
714
+    $options = [],
715
+    $serveur = ''
716 716
 ) {
717
-	$args = func_get_args();
718
-	if ($auth_methode === true or (isset($options['all']) and $options['all'] == true)) {
719
-		$options['all'] = true; // ajouter une option all=>true pour chaque auth
720
-		$args = [true, $id_auteur, $champs, $options, $serveur];
721
-		foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
722
-			array_shift($args);
723
-			array_unshift($args, $methode);
724
-			auth_administrer('synchroniser_distant', $args);
725
-		}
726
-	} else {
727
-		auth_administrer('synchroniser_distant', $args);
728
-	}
717
+    $args = func_get_args();
718
+    if ($auth_methode === true or (isset($options['all']) and $options['all'] == true)) {
719
+        $options['all'] = true; // ajouter une option all=>true pour chaque auth
720
+        $args = [true, $id_auteur, $champs, $options, $serveur];
721
+        foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
722
+            array_shift($args);
723
+            array_unshift($args, $methode);
724
+            auth_administrer('synchroniser_distant', $args);
725
+        }
726
+    } else {
727
+        auth_administrer('synchroniser_distant', $args);
728
+    }
729 729
 }
730 730
 
731 731
 
@@ -738,46 +738,46 @@  discard block
 block discarded – undo
738 738
  * @return array|bool
739 739
  */
740 740
 function lire_php_auth($login, #[\SensitiveParameter] $pw, $serveur = '') {
741
-	if (
742
-		!$login
743
-		or !$login_base = auth_retrouver_login($login, $serveur)
744
-	) {
745
-		return false;
746
-	}
747
-
748
-	$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur);
749
-
750
-	if (!$row) {
751
-		if (
752
-			include_spip('inc/auth')
753
-			and auth_ldap_connect($serveur)
754
-			and $auth_ldap = charger_fonction('ldap', 'auth', true)
755
-		) {
756
-			return $auth_ldap($login_base, $pw, $serveur, true);
757
-		}
758
-
759
-		return false;
760
-	}
761
-
762
-	// si pas de source definie
763
-	// ou auth/xxx introuvable, utiliser 'spip' ou autre et avec le login passé par PHP_AUTH_USER
764
-	if (
765
-		!$auth_methode = $row['source']
766
-		or !$auth = charger_fonction($auth_methode, 'auth', true)
767
-	) {
768
-		$auth = charger_fonction('spip', 'auth', true);
769
-	}
770
-
771
-	$auteur = '';
772
-	if ($auth) {
773
-		$auteur = $auth($login, $pw, $serveur, true);
774
-	}
775
-	// verifier que ce n'est pas un message d'erreur
776
-	if (is_array($auteur) and count($auteur)) {
777
-		return $auteur;
778
-	}
779
-
780
-	return false;
741
+    if (
742
+        !$login
743
+        or !$login_base = auth_retrouver_login($login, $serveur)
744
+    ) {
745
+        return false;
746
+    }
747
+
748
+    $row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur);
749
+
750
+    if (!$row) {
751
+        if (
752
+            include_spip('inc/auth')
753
+            and auth_ldap_connect($serveur)
754
+            and $auth_ldap = charger_fonction('ldap', 'auth', true)
755
+        ) {
756
+            return $auth_ldap($login_base, $pw, $serveur, true);
757
+        }
758
+
759
+        return false;
760
+    }
761
+
762
+    // si pas de source definie
763
+    // ou auth/xxx introuvable, utiliser 'spip' ou autre et avec le login passé par PHP_AUTH_USER
764
+    if (
765
+        !$auth_methode = $row['source']
766
+        or !$auth = charger_fonction($auth_methode, 'auth', true)
767
+    ) {
768
+        $auth = charger_fonction('spip', 'auth', true);
769
+    }
770
+
771
+    $auteur = '';
772
+    if ($auth) {
773
+        $auteur = $auth($login, $pw, $serveur, true);
774
+    }
775
+    // verifier que ce n'est pas un message d'erreur
776
+    if (is_array($auteur) and count($auteur)) {
777
+        return $auteur;
778
+    }
779
+
780
+    return false;
781 781
 }
782 782
 
783 783
 /**
@@ -793,21 +793,21 @@  discard block
 block discarded – undo
793 793
  * @param string $lien
794 794
  */
795 795
 function ask_php_auth($pb, $raison, $retour = '', $url = '', $re = '', $lien = '') {
796
-	@Header('WWW-Authenticate: Basic realm="espace prive"');
797
-	@Header('HTTP/1.0 401 Unauthorized');
798
-	$corps = '';
799
-	$public = generer_url_public();
800
-	$ecrire = generer_url_ecrire();
801
-	$retour = $retour ?: _T('icone_retour');
802
-	$corps .= "<p>$raison</p>[<a href='$public'>$retour</a>] ";
803
-	if ($url) {
804
-		$corps .= "[<a href='" . generer_url_action('cookie', "essai_auth_http=oui&$url") . "'>$re</a>]";
805
-	}
806
-
807
-	if ($lien) {
808
-		$corps .= " [<a href='$ecrire'>" . _T('login_espace_prive') . '</a>]';
809
-	}
810
-	include_spip('inc/minipres');
811
-	echo minipres($pb, $corps);
812
-	exit;
796
+    @Header('WWW-Authenticate: Basic realm="espace prive"');
797
+    @Header('HTTP/1.0 401 Unauthorized');
798
+    $corps = '';
799
+    $public = generer_url_public();
800
+    $ecrire = generer_url_ecrire();
801
+    $retour = $retour ?: _T('icone_retour');
802
+    $corps .= "<p>$raison</p>[<a href='$public'>$retour</a>] ";
803
+    if ($url) {
804
+        $corps .= "[<a href='" . generer_url_action('cookie', "essai_auth_http=oui&$url") . "'>$re</a>]";
805
+    }
806
+
807
+    if ($lien) {
808
+        $corps .= " [<a href='$ecrire'>" . _T('login_espace_prive') . '</a>]';
809
+    }
810
+    include_spip('inc/minipres');
811
+    echo minipres($pb, $corps);
812
+    exit;
813 813
 }
Please login to merge, or discard this patch.
ecrire/inc/acces.php 1 patch
Indentation   +234 added lines, -234 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  **/
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -30,46 +30,46 @@  discard block
 block discarded – undo
30 30
  *     Mot de passe
31 31
  **/
32 32
 function creer_pass_aleatoire($longueur = 16, $sel = '') {
33
-	$seed = (int)round(((float)microtime() + 1) * time());
34
-
35
-	mt_srand($seed);
36
-	$s = '';
37
-	$pass = '';
38
-	for ($i = 0; $i < $longueur; $i++) {
39
-		if (!$s) {
40
-			$s = random_int(0, mt_getrandmax());
41
-			if (!$s) {
42
-				$s = random_int(0, mt_getrandmax());
43
-			}
44
-			$s = substr(md5(uniqid($s) . $sel), 0, 16);
45
-		}
46
-		$r = unpack('Cr', pack('H2', $s . $s));
47
-		$x = $r['r'] & 63;
48
-		if ($x < 10) {
49
-			$x = chr($x + 48);
50
-		} else {
51
-			if ($x < 36) {
52
-				$x = chr($x + 55);
53
-			} else {
54
-				if ($x < 62) {
55
-					$x = chr($x + 61);
56
-				} else {
57
-					if ($x == 63) {
58
-						$x = '/';
59
-					} else {
60
-						$x = '.';
61
-					}
62
-				}
63
-			}
64
-		}
65
-		$pass .= $x;
66
-		$s = substr($s, 2);
67
-	}
68
-	$pass = preg_replace('@[./]@', 'a', $pass);
69
-	$pass = preg_replace('@[I1l]@', 'L', $pass);
70
-	$pass = preg_replace('@[0O]@', 'o', $pass);
71
-
72
-	return $pass;
33
+    $seed = (int)round(((float)microtime() + 1) * time());
34
+
35
+    mt_srand($seed);
36
+    $s = '';
37
+    $pass = '';
38
+    for ($i = 0; $i < $longueur; $i++) {
39
+        if (!$s) {
40
+            $s = random_int(0, mt_getrandmax());
41
+            if (!$s) {
42
+                $s = random_int(0, mt_getrandmax());
43
+            }
44
+            $s = substr(md5(uniqid($s) . $sel), 0, 16);
45
+        }
46
+        $r = unpack('Cr', pack('H2', $s . $s));
47
+        $x = $r['r'] & 63;
48
+        if ($x < 10) {
49
+            $x = chr($x + 48);
50
+        } else {
51
+            if ($x < 36) {
52
+                $x = chr($x + 55);
53
+            } else {
54
+                if ($x < 62) {
55
+                    $x = chr($x + 61);
56
+                } else {
57
+                    if ($x == 63) {
58
+                        $x = '/';
59
+                    } else {
60
+                        $x = '.';
61
+                    }
62
+                }
63
+            }
64
+        }
65
+        $pass .= $x;
66
+        $s = substr($s, 2);
67
+    }
68
+    $pass = preg_replace('@[./]@', 'a', $pass);
69
+    $pass = preg_replace('@[I1l]@', 'L', $pass);
70
+    $pass = preg_replace('@[0O]@', 'o', $pass);
71
+
72
+    return $pass;
73 73
 }
74 74
 
75 75
 /**
@@ -78,20 +78,20 @@  discard block
 block discarded – undo
78 78
  * @return string Identifiant
79 79
  */
80 80
 function creer_uniqid() {
81
-	static $seeded;
81
+    static $seeded;
82 82
 
83
-	if (!$seeded) {
84
-		$seed = (int)round(((float)microtime() + 1) * time());
85
-		mt_srand($seed);
86
-		$seeded = true;
87
-	}
83
+    if (!$seeded) {
84
+        $seed = (int)round(((float)microtime() + 1) * time());
85
+        mt_srand($seed);
86
+        $seeded = true;
87
+    }
88 88
 
89
-	$s = random_int(0, mt_getrandmax());
90
-	if (!$s) {
91
-		$s = random_int(0, mt_getrandmax());
92
-	}
89
+    $s = random_int(0, mt_getrandmax());
90
+    if (!$s) {
91
+        $s = random_int(0, mt_getrandmax());
92
+    }
93 93
 
94
-	return uniqid($s, 1);
94
+    return uniqid($s, 1);
95 95
 }
96 96
 
97 97
 /**
@@ -105,42 +105,42 @@  discard block
 block discarded – undo
105 105
  * @return string Retourne l'alea éphemère actuel au passage
106 106
  */
107 107
 function charger_aleas() {
108
-	if (!isset($GLOBALS['meta']['alea_ephemere'])) {
109
-		include_spip('base/abstract_sql');
110
-		$aleas = sql_allfetsel(
111
-			['nom', 'valeur'],
112
-			'spip_meta',
113
-			sql_in('nom', ['alea_ephemere', 'alea_ephemere_ancien']),
114
-			'',
115
-			'',
116
-			'',
117
-			'',
118
-			'',
119
-			'continue'
120
-		);
121
-		if ($aleas) {
122
-			foreach ($aleas as $a) {
123
-				$GLOBALS['meta'][$a['nom']] = $a['valeur'];
124
-			}
125
-			return $GLOBALS['meta']['alea_ephemere'];
126
-		} else {
127
-			spip_log('aleas indisponibles', 'session');
128
-			return '';
129
-		}
130
-	}
131
-	return $GLOBALS['meta']['alea_ephemere'];
108
+    if (!isset($GLOBALS['meta']['alea_ephemere'])) {
109
+        include_spip('base/abstract_sql');
110
+        $aleas = sql_allfetsel(
111
+            ['nom', 'valeur'],
112
+            'spip_meta',
113
+            sql_in('nom', ['alea_ephemere', 'alea_ephemere_ancien']),
114
+            '',
115
+            '',
116
+            '',
117
+            '',
118
+            '',
119
+            'continue'
120
+        );
121
+        if ($aleas) {
122
+            foreach ($aleas as $a) {
123
+                $GLOBALS['meta'][$a['nom']] = $a['valeur'];
124
+            }
125
+            return $GLOBALS['meta']['alea_ephemere'];
126
+        } else {
127
+            spip_log('aleas indisponibles', 'session');
128
+            return '';
129
+        }
130
+    }
131
+    return $GLOBALS['meta']['alea_ephemere'];
132 132
 }
133 133
 
134 134
 /**
135 135
  * Renouveller l'alea (utilisé pour sécuriser les scripts du répertoire `action/`)
136 136
  **/
137 137
 function renouvelle_alea() {
138
-	charger_aleas();
139
-	ecrire_meta('alea_ephemere_ancien', @$GLOBALS['meta']['alea_ephemere'], 'non');
140
-	$GLOBALS['meta']['alea_ephemere'] = md5(creer_uniqid());
141
-	ecrire_meta('alea_ephemere', $GLOBALS['meta']['alea_ephemere'], 'non');
142
-	ecrire_meta('alea_ephemere_date', time(), 'non');
143
-	spip_log("renouvellement de l'alea_ephemere");
138
+    charger_aleas();
139
+    ecrire_meta('alea_ephemere_ancien', @$GLOBALS['meta']['alea_ephemere'], 'non');
140
+    $GLOBALS['meta']['alea_ephemere'] = md5(creer_uniqid());
141
+    ecrire_meta('alea_ephemere', $GLOBALS['meta']['alea_ephemere'], 'non');
142
+    ecrire_meta('alea_ephemere_date', time(), 'non');
143
+    spip_log("renouvellement de l'alea_ephemere");
144 144
 }
145 145
 
146 146
 
@@ -160,21 +160,21 @@  discard block
 block discarded – undo
160 160
  *     Clé de sécurité.
161 161
  **/
162 162
 function low_sec($id_auteur) {
163
-	// Pas d'id_auteur : low_sec
164
-	if (!$id_auteur = intval($id_auteur)) {
165
-		include_spip('inc/config');
166
-		if (!$low_sec = lire_config('low_sec')) {
167
-			ecrire_meta('low_sec', $low_sec = creer_pass_aleatoire());
168
-		}
169
-	} else {
170
-		$low_sec = sql_getfetsel('low_sec', 'spip_auteurs', 'id_auteur = ' . intval($id_auteur));
171
-		if (!$low_sec) {
172
-			$low_sec = creer_pass_aleatoire();
173
-			sql_updateq('spip_auteurs', ['low_sec' => $low_sec], 'id_auteur = ' . intval($id_auteur));
174
-		}
175
-	}
176
-
177
-	return $low_sec;
163
+    // Pas d'id_auteur : low_sec
164
+    if (!$id_auteur = intval($id_auteur)) {
165
+        include_spip('inc/config');
166
+        if (!$low_sec = lire_config('low_sec')) {
167
+            ecrire_meta('low_sec', $low_sec = creer_pass_aleatoire());
168
+        }
169
+    } else {
170
+        $low_sec = sql_getfetsel('low_sec', 'spip_auteurs', 'id_auteur = ' . intval($id_auteur));
171
+        if (!$low_sec) {
172
+            $low_sec = creer_pass_aleatoire();
173
+            sql_updateq('spip_auteurs', ['low_sec' => $low_sec], 'id_auteur = ' . intval($id_auteur));
174
+        }
175
+    }
176
+
177
+    return $low_sec;
178 178
 }
179 179
 
180 180
 
@@ -207,11 +207,11 @@  discard block
 block discarded – undo
207 207
  * @filtre
208 208
  */
209 209
 function securiser_acces_low_sec($id_auteur, #[\SensitiveParameter] $cle, $dir, $op = '', $args = '') {
210
-	if ($op) {
211
-		$dir .= " $op $args";
212
-	}
210
+    if ($op) {
211
+        $dir .= " $op $args";
212
+    }
213 213
 
214
-	return verifier_low_sec($id_auteur, $cle, $dir);
214
+    return verifier_low_sec($id_auteur, $cle, $dir);
215 215
 }
216 216
 
217 217
 /**
@@ -226,11 +226,11 @@  discard block
 block discarded – undo
226 226
  * @return string
227 227
  */
228 228
 function generer_url_api_low_sec(string $script, string $format, string $fond, string $path, string $args, bool $no_entities = false, ?bool $public = null) {
229
-	$id_auteur = $GLOBALS['visiteur_session']['id_auteur'] ?? 0;
230
-	$cle = afficher_low_sec($id_auteur, "$script/$format $fond $args");
231
-	$path = "$id_auteur/$cle/$format/$fond" . ($path ? "/$path" : '');
229
+    $id_auteur = $GLOBALS['visiteur_session']['id_auteur'] ?? 0;
230
+    $cle = afficher_low_sec($id_auteur, "$script/$format $fond $args");
231
+    $path = "$id_auteur/$cle/$format/$fond" . ($path ? "/$path" : '');
232 232
 
233
-	return generer_url_api($script, $path, $args, $no_entities = false, $public);
233
+    return generer_url_api($script, $path, $args, $no_entities = false, $public);
234 234
 }
235 235
 
236 236
 
@@ -248,27 +248,27 @@  discard block
 block discarded – undo
248 248
  * @deprecated 4.1
249 249
  */
250 250
 function param_low_sec($op, $args = [], $lang = '', $mime = 'rss') {
251
-	$a = $b = '';
252
-	foreach ($args as $val => $var) {
253
-		if ($var) {
254
-			if ($val <> 'statut') {
255
-				$a .= ':' . $val . '-' . $var;
256
-			}
257
-			$b .= $val . '=' . $var . '&';
258
-		}
259
-	}
260
-	$a = substr($a, 1);
261
-	$id = intval(@$GLOBALS['connect_id_auteur']);
262
-
263
-	return $b
264
-	. 'op='
265
-	. $op
266
-	. '&id='
267
-	. $id
268
-	. '&cle='
269
-	. afficher_low_sec($id, "$mime $op $a")
270
-	. (!$a ? '' : "&args=$a")
271
-	. (!$lang ? '' : "&lang=$lang");
251
+    $a = $b = '';
252
+    foreach ($args as $val => $var) {
253
+        if ($var) {
254
+            if ($val <> 'statut') {
255
+                $a .= ':' . $val . '-' . $var;
256
+            }
257
+            $b .= $val . '=' . $var . '&';
258
+        }
259
+    }
260
+    $a = substr($a, 1);
261
+    $id = intval(@$GLOBALS['connect_id_auteur']);
262
+
263
+    return $b
264
+    . 'op='
265
+    . $op
266
+    . '&id='
267
+    . $id
268
+    . '&cle='
269
+    . afficher_low_sec($id, "$mime $op $a")
270
+    . (!$a ? '' : "&args=$a")
271
+    . (!$lang ? '' : "&lang=$lang");
272 272
 }
273 273
 
274 274
 /**
@@ -284,7 +284,7 @@  discard block
 block discarded – undo
284 284
  *     Clé
285 285
  **/
286 286
 function afficher_low_sec($id_auteur, $action = '') {
287
-	return substr(md5($action . low_sec($id_auteur)), 0, 8);
287
+    return substr(md5($action . low_sec($id_auteur)), 0, 8);
288 288
 }
289 289
 
290 290
 /**
@@ -302,7 +302,7 @@  discard block
 block discarded – undo
302 302
  *     true si les clés corresponde, false sinon
303 303
  **/
304 304
 function verifier_low_sec($id_auteur, #[\SensitiveParameter] $cle, $action = '') {
305
-	return ($cle == afficher_low_sec($id_auteur, $action));
305
+    return ($cle == afficher_low_sec($id_auteur, $action));
306 306
 }
307 307
 
308 308
 /**
@@ -312,10 +312,10 @@  discard block
 block discarded – undo
312 312
  *     Identifiant de l'auteur
313 313
  **/
314 314
 function effacer_low_sec($id_auteur) {
315
-	if (!$id_auteur = intval($id_auteur)) {
316
-		return;
317
-	} // jamais trop prudent ;)
318
-	sql_updateq('spip_auteurs', ['low_sec' => ''], 'id_auteur = ' . intval($id_auteur));
315
+    if (!$id_auteur = intval($id_auteur)) {
316
+        return;
317
+    } // jamais trop prudent ;)
318
+    sql_updateq('spip_auteurs', ['low_sec' => ''], 'id_auteur = ' . intval($id_auteur));
319 319
 }
320 320
 
321 321
 
@@ -333,31 +333,31 @@  discard block
 block discarded – undo
333 333
  *     - void sinon.
334 334
  **/
335 335
 function ecrire_acces() {
336
-	$htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
337
-	$htpasswd = _DIR_TMP . _AUTH_USER_FILE;
338
-
339
-	// Cette variable de configuration peut etre posee par un plugin
340
-	// par exemple acces_restreint ;
341
-	// si .htaccess existe, outrepasser spip_meta
342
-	if (
343
-		(!isset($GLOBALS['meta']['creer_htpasswd'])
344
-			or ($GLOBALS['meta']['creer_htpasswd'] != 'oui'))
345
-		and !@file_exists($htaccess)
346
-	) {
347
-		spip_unlink($htpasswd);
348
-		spip_unlink($htpasswd . '-admin');
349
-		return;
350
-	}
351
-
352
-	# remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
353
-	# de devenir redacteur le cas echeant (auth http)... a nettoyer
354
-	// attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
355
-	// TODO: factoriser avec auth/spip qui fait deja ce job et generaliser le test auth_ldap_connect()
356
-	if (include_spip('auth/ldap') and auth_ldap_connect()) {
357
-		return;
358
-	}
359
-
360
-	generer_htpasswd_files($htpasswd, "$htpasswd-admin");
336
+    $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
337
+    $htpasswd = _DIR_TMP . _AUTH_USER_FILE;
338
+
339
+    // Cette variable de configuration peut etre posee par un plugin
340
+    // par exemple acces_restreint ;
341
+    // si .htaccess existe, outrepasser spip_meta
342
+    if (
343
+        (!isset($GLOBALS['meta']['creer_htpasswd'])
344
+            or ($GLOBALS['meta']['creer_htpasswd'] != 'oui'))
345
+        and !@file_exists($htaccess)
346
+    ) {
347
+        spip_unlink($htpasswd);
348
+        spip_unlink($htpasswd . '-admin');
349
+        return;
350
+    }
351
+
352
+    # remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
353
+    # de devenir redacteur le cas echeant (auth http)... a nettoyer
354
+    // attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
355
+    // TODO: factoriser avec auth/spip qui fait deja ce job et generaliser le test auth_ldap_connect()
356
+    if (include_spip('auth/ldap') and auth_ldap_connect()) {
357
+        return;
358
+    }
359
+
360
+    generer_htpasswd_files($htpasswd, "$htpasswd-admin");
361 361
 }
362 362
 
363 363
 /**
@@ -366,29 +366,29 @@  discard block
 block discarded – undo
366 366
  * @param $htpasswd_admin
367 367
  */
368 368
 function generer_htpasswd_files($htpasswd, $htpasswd_admin) {
369
-	if ($generer_htpasswd = charger_fonction('generer_htpasswd_files', 'inc', true)) {
370
-		$generer_htpasswd($htpasswd, $htpasswd_admin);
371
-	}
372
-
373
-	$pwd_all = ''; // login:htpass pour tous
374
-	$pwd_admin = ''; // login:htpass pour les admins
375
-
376
-	$res = sql_select('login, htpass, statut', 'spip_auteurs', "htpass!='' AND login!='' AND " . sql_in('statut', ['1comite', '0minirezo', 'nouveau']));
377
-	while ($row = sql_fetch($res)) {
378
-		if (strlen($row['login']) and strlen($row['htpass'])) {
379
-			$ligne = $row['login'] . ':' . $row['htpass'] . "\n";
380
-			$pwd_all .= $ligne;
381
-			if ($row['statut'] == '0minirezo') {
382
-				$pwd_admin .= $ligne;
383
-			}
384
-		}
385
-	}
386
-
387
-	if ($pwd_all) {
388
-		ecrire_fichier($htpasswd, $pwd_all);
389
-		ecrire_fichier($htpasswd_admin, $pwd_admin);
390
-		spip_log("Ecriture de $htpasswd et $htpasswd_admin", 'htpass');
391
-	}
369
+    if ($generer_htpasswd = charger_fonction('generer_htpasswd_files', 'inc', true)) {
370
+        $generer_htpasswd($htpasswd, $htpasswd_admin);
371
+    }
372
+
373
+    $pwd_all = ''; // login:htpass pour tous
374
+    $pwd_admin = ''; // login:htpass pour les admins
375
+
376
+    $res = sql_select('login, htpass, statut', 'spip_auteurs', "htpass!='' AND login!='' AND " . sql_in('statut', ['1comite', '0minirezo', 'nouveau']));
377
+    while ($row = sql_fetch($res)) {
378
+        if (strlen($row['login']) and strlen($row['htpass'])) {
379
+            $ligne = $row['login'] . ':' . $row['htpass'] . "\n";
380
+            $pwd_all .= $ligne;
381
+            if ($row['statut'] == '0minirezo') {
382
+                $pwd_admin .= $ligne;
383
+            }
384
+        }
385
+    }
386
+
387
+    if ($pwd_all) {
388
+        ecrire_fichier($htpasswd, $pwd_all);
389
+        ecrire_fichier($htpasswd_admin, $pwd_admin);
390
+        spip_log("Ecriture de $htpasswd et $htpasswd_admin", 'htpass');
391
+    }
392 392
 }
393 393
 
394 394
 /**
@@ -402,11 +402,11 @@  discard block
 block discarded – undo
402 402
  *  La chaîne hachée si fonction crypt présente, rien sinon.
403 403
  */
404 404
 function generer_htpass(#[\SensitiveParameter] $pass) {
405
-	if ($generer_htpass = charger_fonction('generer_htpass', 'inc', true)) {
406
-		return $generer_htpass($pass);
407
-	}
405
+    if ($generer_htpass = charger_fonction('generer_htpass', 'inc', true)) {
406
+        return $generer_htpass($pass);
407
+    }
408 408
 
409
-	return '';
409
+    return '';
410 410
 }
411 411
 
412 412
 /**
@@ -419,14 +419,14 @@  discard block
 block discarded – undo
419 419
  * @return boolean
420 420
  */
421 421
 function verifier_htaccess($rep, $force = false) {
422
-	$htaccess = rtrim($rep, '/') . '/' . _ACCESS_FILE_NAME;
423
-	if (((@file_exists($htaccess)) or defined('_TEST_DIRS')) and !$force) {
424
-		return true;
425
-	}
426
-
427
-	// directive deny compatible Apache 2.0+
428
-	$deny =
429
-		'# Deny all requests from Apache 2.4+.
422
+    $htaccess = rtrim($rep, '/') . '/' . _ACCESS_FILE_NAME;
423
+    if (((@file_exists($htaccess)) or defined('_TEST_DIRS')) and !$force) {
424
+        return true;
425
+    }
426
+
427
+    // directive deny compatible Apache 2.0+
428
+    $deny =
429
+        '# Deny all requests from Apache 2.4+.
430 430
 <IfModule mod_authz_core.c>
431 431
   Require all denied
432 432
 </IfModule>
@@ -435,32 +435,32 @@  discard block
 block discarded – undo
435 435
   Deny from all
436 436
 </IfModule>
437 437
 ';
438
-	// support des vieilles versions Apache 1.x mais uniquement si elles l'annoncent (pas en mode PROD)
439
-	if (
440
-		function_exists('apache_get_version')
441
-		and $v = apache_get_version()
442
-		and strncmp($v, 'Apache/1.', 9) == 0
443
-	) {
444
-		$deny = "deny from all\n";
445
-	}
446
-
447
-	if ($ht = @fopen($htaccess, 'w')) {
448
-		fputs($ht, $deny);
449
-		fclose($ht);
450
-		@chmod($htaccess, _SPIP_CHMOD & 0666);
451
-		$t = rtrim($rep, '/') . '/.ok';
452
-		if ($ht = @fopen($t, 'w')) {
453
-			@fclose($ht);
454
-			include_spip('inc/distant');
455
-			$t = substr($t, strlen(_DIR_RACINE));
456
-			$t = url_de_base() . $t;
457
-			$ht = recuperer_url($t, ['methode' => 'HEAD', 'taille_max' => 0, 'follow_location' => false]);
458
-			$ht = ($ht['status'] ?? null) === 403;
459
-		}
460
-	}
461
-	spip_log("Creation de $htaccess " . ($ht ? ' reussie' : ' manquee'));
462
-
463
-	return $ht;
438
+    // support des vieilles versions Apache 1.x mais uniquement si elles l'annoncent (pas en mode PROD)
439
+    if (
440
+        function_exists('apache_get_version')
441
+        and $v = apache_get_version()
442
+        and strncmp($v, 'Apache/1.', 9) == 0
443
+    ) {
444
+        $deny = "deny from all\n";
445
+    }
446
+
447
+    if ($ht = @fopen($htaccess, 'w')) {
448
+        fputs($ht, $deny);
449
+        fclose($ht);
450
+        @chmod($htaccess, _SPIP_CHMOD & 0666);
451
+        $t = rtrim($rep, '/') . '/.ok';
452
+        if ($ht = @fopen($t, 'w')) {
453
+            @fclose($ht);
454
+            include_spip('inc/distant');
455
+            $t = substr($t, strlen(_DIR_RACINE));
456
+            $t = url_de_base() . $t;
457
+            $ht = recuperer_url($t, ['methode' => 'HEAD', 'taille_max' => 0, 'follow_location' => false]);
458
+            $ht = ($ht['status'] ?? null) === 403;
459
+        }
460
+    }
461
+    spip_log("Creation de $htaccess " . ($ht ? ' reussie' : ' manquee'));
462
+
463
+    return $ht;
464 464
 }
465 465
 
466 466
 /**
@@ -478,20 +478,20 @@  discard block
 block discarded – undo
478 478
  *         Valeur de la configuration `creer_htaccess`
479 479
  */
480 480
 function gerer_htaccess() {
481
-	// Cette variable de configuration peut etre posee par un plugin
482
-	// par exemple acces_restreint
483
-	$f = (isset($GLOBALS['meta']['creer_htaccess']) and ($GLOBALS['meta']['creer_htaccess'] === 'oui'));
484
-	$dirs = sql_allfetsel('extension', 'spip_types_documents');
485
-	$dirs[] = ['extension' => 'distant'];
486
-	foreach ($dirs as $e) {
487
-		if (is_dir($dir = _DIR_IMG . $e['extension'])) {
488
-			if ($f) {
489
-				verifier_htaccess($dir);
490
-			} else {
491
-				spip_unlink($dir . '/' . _ACCESS_FILE_NAME);
492
-			}
493
-		}
494
-	}
495
-
496
-	return $GLOBALS['meta']['creer_htaccess'] ?? '';
481
+    // Cette variable de configuration peut etre posee par un plugin
482
+    // par exemple acces_restreint
483
+    $f = (isset($GLOBALS['meta']['creer_htaccess']) and ($GLOBALS['meta']['creer_htaccess'] === 'oui'));
484
+    $dirs = sql_allfetsel('extension', 'spip_types_documents');
485
+    $dirs[] = ['extension' => 'distant'];
486
+    foreach ($dirs as $e) {
487
+        if (is_dir($dir = _DIR_IMG . $e['extension'])) {
488
+            if ($f) {
489
+                verifier_htaccess($dir);
490
+            } else {
491
+                spip_unlink($dir . '/' . _ACCESS_FILE_NAME);
492
+            }
493
+        }
494
+    }
495
+
496
+    return $GLOBALS['meta']['creer_htaccess'] ?? '';
497 497
 }
Please login to merge, or discard this patch.
ecrire/auth/spip.php 1 patch
Indentation   +409 added lines, -409 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
 use Spip\Chiffrer\SpipCles;
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 /**
@@ -33,169 +33,169 @@  discard block
 block discarded – undo
33 33
  */
34 34
 function auth_spip_dist($login, #[\SensitiveParameter] $pass, $serveur = '', $phpauth = false) {
35 35
 
36
-	// retrouver le login
37
-	$login = auth_spip_retrouver_login($login);
38
-	// login inconnu, n'allons pas plus loin
39
-	if (!$login) {
40
-		return [];
41
-	}
42
-
43
-	$md5pass = '';
44
-	$shapass = $shanext = '';
45
-	$auteur_peut_sauver_cles = false;
46
-
47
-	if ($pass) {
48
-		$row = sql_fetsel(
49
-			'*',
50
-			'spip_auteurs',
51
-			'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
52
-			'',
53
-			'',
54
-			'',
55
-			'',
56
-			$serveur
57
-		);
58
-
59
-		// lever un flag si cet auteur peut sauver les cles
60
-		if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) {
61
-			$auteur_peut_sauver_cles = true;
62
-		}
63
-	}
64
-
65
-	// login inexistant ou mot de passe vide
66
-	if (!$pass or !$row) {
67
-		return [];
68
-	}
69
-
70
-	$cles = SpipCles::instance();
71
-	$secret = $cles->getSecretAuth();
72
-
73
-	$hash = null;
74
-	switch (strlen($row['pass'])) {
75
-		// legacy = md5 ou sha256
76
-		case 32:
77
-			// tres anciens mots de passe encodes en md5(alea.pass)
78
-			$hash = md5($row['alea_actuel'] . $pass);
79
-			$methode = 'md5';
80
-		case 64:
81
-			if (empty($hash)) {
82
-				// anciens mots de passe encodes en sha256(alea.pass)
83
-				include_spip('auth/sha256.inc');
84
-				$hash = spip_sha256($row['alea_actuel'] . $pass);
85
-				$methode = 'sha256';
86
-			}
87
-			if ($row['pass'] === $hash) {
88
-				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG);
89
-				// ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth
90
-				if (!empty($row['backup_cles'])) {
91
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
92
-				}
93
-				break;
94
-			}
95
-
96
-		// on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long
97
-
98
-		case 60:
99
-		case 98:
100
-		default:
101
-			// doit-on restaurer un backup des cles ?
102
-			// si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass
103
-			if (
104
-				!$secret
105
-				and $auteur_peut_sauver_cles
106
-				and !empty($row['backup_cles'])
107
-			) {
108
-				if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
109
-					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
110
-					if ($cles->save()) {
111
-						$secret = $cles->getSecretAuth();
112
-					}
113
-					else {
114
-						spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
115
-						// et on echoue car on ne veut pas que la situation reste telle quelle
116
-						raler_fichier(_DIR_ETC . 'cles.php');
117
-					}
118
-				}
119
-				else {
120
-					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);
121
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
122
-				}
123
-			}
124
-
125
-			if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) {
126
-				unset($row);
127
-			}
128
-			else {
129
-				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG);
130
-			}
131
-			break;
132
-	}
133
-
134
-	// Migration depuis ancienne version : si on a pas encore de cle
135
-	// ET si c'est le login d'un auteur qui peut sauver la cle
136
-	// créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php)
137
-	// 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
138
-	if (!$secret and $auteur_peut_sauver_cles) {
139
-		if (auth_spip_initialiser_secret()) {
140
-			$secret = $cles->getSecretAuth();
141
-		}
142
-	}
143
-
144
-	// login/mot de passe incorrect
145
-	if (empty($row)) {
146
-		return [];
147
-	}
148
-
149
-	// fait tourner le codage du pass dans la base
150
-	// sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
151
-	if (!$phpauth and $secret) {
152
-		include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess
153
-		$pass_hash_next = Password::hacher($pass, $secret);
154
-		if ($pass_hash_next) {
155
-			$set = [
156
-				'alea_actuel' => 'alea_futur', // @deprecated 4.1
157
-				'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1
158
-				'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
159
-			];
160
-
161
-			// regenerer un htpass si on a active/desactive le plugin htpasswd
162
-			// et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo
163
-			$htpass = generer_htpass($pass);
164
-			if (strlen($htpass) !== strlen($row['htpass'])) {
165
-				$set['htpass'] = sql_quote($htpass, $serveur, 'text');
166
-			}
167
-
168
-			// a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre)
169
-			if ($auteur_peut_sauver_cles) {
170
-				$set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text');
171
-			}
172
-
173
-			@sql_update(
174
-				'spip_auteurs',
175
-				$set,
176
-				'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote(
177
-					$row['pass'],
178
-					$serveur,
179
-					'text'
180
-				),
181
-				[],
182
-				$serveur
183
-			);
184
-
185
-			// si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd
186
-			if (isset($set['htpass'])) {
187
-				ecrire_acces();
188
-			}
189
-		}
190
-
191
-		// En profiter pour verifier la securite de tmp/
192
-		// Si elle ne fonctionne pas a l'installation, prevenir
193
-		if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) {
194
-			return false;
195
-		}
196
-	}
197
-
198
-	return $row;
36
+    // retrouver le login
37
+    $login = auth_spip_retrouver_login($login);
38
+    // login inconnu, n'allons pas plus loin
39
+    if (!$login) {
40
+        return [];
41
+    }
42
+
43
+    $md5pass = '';
44
+    $shapass = $shanext = '';
45
+    $auteur_peut_sauver_cles = false;
46
+
47
+    if ($pass) {
48
+        $row = sql_fetsel(
49
+            '*',
50
+            'spip_auteurs',
51
+            'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
52
+            '',
53
+            '',
54
+            '',
55
+            '',
56
+            $serveur
57
+        );
58
+
59
+        // lever un flag si cet auteur peut sauver les cles
60
+        if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) {
61
+            $auteur_peut_sauver_cles = true;
62
+        }
63
+    }
64
+
65
+    // login inexistant ou mot de passe vide
66
+    if (!$pass or !$row) {
67
+        return [];
68
+    }
69
+
70
+    $cles = SpipCles::instance();
71
+    $secret = $cles->getSecretAuth();
72
+
73
+    $hash = null;
74
+    switch (strlen($row['pass'])) {
75
+        // legacy = md5 ou sha256
76
+        case 32:
77
+            // tres anciens mots de passe encodes en md5(alea.pass)
78
+            $hash = md5($row['alea_actuel'] . $pass);
79
+            $methode = 'md5';
80
+        case 64:
81
+            if (empty($hash)) {
82
+                // anciens mots de passe encodes en sha256(alea.pass)
83
+                include_spip('auth/sha256.inc');
84
+                $hash = spip_sha256($row['alea_actuel'] . $pass);
85
+                $methode = 'sha256';
86
+            }
87
+            if ($row['pass'] === $hash) {
88
+                spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG);
89
+                // ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth
90
+                if (!empty($row['backup_cles'])) {
91
+                    sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
92
+                }
93
+                break;
94
+            }
95
+
96
+        // on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long
97
+
98
+        case 60:
99
+        case 98:
100
+        default:
101
+            // doit-on restaurer un backup des cles ?
102
+            // si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass
103
+            if (
104
+                !$secret
105
+                and $auteur_peut_sauver_cles
106
+                and !empty($row['backup_cles'])
107
+            ) {
108
+                if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
109
+                    spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
110
+                    if ($cles->save()) {
111
+                        $secret = $cles->getSecretAuth();
112
+                    }
113
+                    else {
114
+                        spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
115
+                        // et on echoue car on ne veut pas que la situation reste telle quelle
116
+                        raler_fichier(_DIR_ETC . 'cles.php');
117
+                    }
118
+                }
119
+                else {
120
+                    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);
121
+                    sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
122
+                }
123
+            }
124
+
125
+            if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) {
126
+                unset($row);
127
+            }
128
+            else {
129
+                spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG);
130
+            }
131
+            break;
132
+    }
133
+
134
+    // Migration depuis ancienne version : si on a pas encore de cle
135
+    // ET si c'est le login d'un auteur qui peut sauver la cle
136
+    // créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php)
137
+    // 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
138
+    if (!$secret and $auteur_peut_sauver_cles) {
139
+        if (auth_spip_initialiser_secret()) {
140
+            $secret = $cles->getSecretAuth();
141
+        }
142
+    }
143
+
144
+    // login/mot de passe incorrect
145
+    if (empty($row)) {
146
+        return [];
147
+    }
148
+
149
+    // fait tourner le codage du pass dans la base
150
+    // sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
151
+    if (!$phpauth and $secret) {
152
+        include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess
153
+        $pass_hash_next = Password::hacher($pass, $secret);
154
+        if ($pass_hash_next) {
155
+            $set = [
156
+                'alea_actuel' => 'alea_futur', // @deprecated 4.1
157
+                'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1
158
+                'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
159
+            ];
160
+
161
+            // regenerer un htpass si on a active/desactive le plugin htpasswd
162
+            // et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo
163
+            $htpass = generer_htpass($pass);
164
+            if (strlen($htpass) !== strlen($row['htpass'])) {
165
+                $set['htpass'] = sql_quote($htpass, $serveur, 'text');
166
+            }
167
+
168
+            // a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre)
169
+            if ($auteur_peut_sauver_cles) {
170
+                $set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text');
171
+            }
172
+
173
+            @sql_update(
174
+                'spip_auteurs',
175
+                $set,
176
+                'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote(
177
+                    $row['pass'],
178
+                    $serveur,
179
+                    'text'
180
+                ),
181
+                [],
182
+                $serveur
183
+            );
184
+
185
+            // si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd
186
+            if (isset($set['htpass'])) {
187
+                ecrire_acces();
188
+            }
189
+        }
190
+
191
+        // En profiter pour verifier la securite de tmp/
192
+        // Si elle ne fonctionne pas a l'installation, prevenir
193
+        if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) {
194
+            return false;
195
+        }
196
+    }
197
+
198
+    return $row;
199 199
 }
200 200
 
201 201
 /**
@@ -210,36 +210,36 @@  discard block
 block discarded – undo
210 210
  * @return bool
211 211
  */
212 212
 function auth_spip_initialiser_secret(bool $force = false): bool {
213
-	$cles = SpipCles::instance();
214
-	$secret = $cles->getSecretAuth();
215
-
216
-	// on ne fait rien si on a un secret dispo
217
-	if ($secret) {
218
-		return false;
219
-	}
220
-
221
-	// si force, on ne verifie pas la presence d'un backup chez un webmestre
222
-	if ($force) {
223
-		spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
224
-		$secret = $cles->getSecretAuth(true);
225
-		return true;
226
-	}
227
-
228
-	$has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
229
-	$has_backup = array_column($has_backup, 'id_auteur');
230
-	if (empty($has_backup)) {
231
-		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);
232
-		if ($secret = $cles->getSecretAuth(true)) {
233
-			return true;
234
-		}
235
-		spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
236
-		// et on echoue car on ne veut pas que la situation reste telle quelle
237
-		raler_fichier(_DIR_ETC . 'cles.php');
238
-	}
239
-	else {
240
-		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);
241
-	}
242
-	return false;
213
+    $cles = SpipCles::instance();
214
+    $secret = $cles->getSecretAuth();
215
+
216
+    // on ne fait rien si on a un secret dispo
217
+    if ($secret) {
218
+        return false;
219
+    }
220
+
221
+    // si force, on ne verifie pas la presence d'un backup chez un webmestre
222
+    if ($force) {
223
+        spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
224
+        $secret = $cles->getSecretAuth(true);
225
+        return true;
226
+    }
227
+
228
+    $has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
229
+    $has_backup = array_column($has_backup, 'id_auteur');
230
+    if (empty($has_backup)) {
231
+        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);
232
+        if ($secret = $cles->getSecretAuth(true)) {
233
+            return true;
234
+        }
235
+        spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
236
+        // et on echoue car on ne veut pas que la situation reste telle quelle
237
+        raler_fichier(_DIR_ETC . 'cles.php');
238
+    }
239
+    else {
240
+        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);
241
+    }
242
+    return false;
243 243
 }
244 244
 
245 245
 /**
@@ -249,19 +249,19 @@  discard block
 block discarded – undo
249 249
  * @return array
250 250
  */
251 251
 function auth_spip_formulaire_login($flux) {
252
-	// javascript qui gere la securite du login en evitant de faire circuler le pass en clair
253
-	$js = file_get_contents(find_in_path('prive/javascript/login.js'));
254
-	$flux['data'] .=
255
-		  '<script type="text/javascript">/*<![CDATA[*/'
256
-		. "$js\n"
257
-		. "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
258
-		. "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
259
-		. "'informe_auteur_en_cours':false,"
260
-		. "'attente_informe':0};"
261
-		. "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
262
-		. '/*]]>*/</script>';
263
-
264
-	return $flux;
252
+    // javascript qui gere la securite du login en evitant de faire circuler le pass en clair
253
+    $js = file_get_contents(find_in_path('prive/javascript/login.js'));
254
+    $flux['data'] .=
255
+            '<script type="text/javascript">/*<![CDATA[*/'
256
+        . "$js\n"
257
+        . "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
258
+        . "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
259
+        . "'informe_auteur_en_cours':false,"
260
+        . "'attente_informe':0};"
261
+        . "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
262
+        . '/*]]>*/</script>';
263
+
264
+    return $flux;
265 265
 }
266 266
 
267 267
 
@@ -273,11 +273,11 @@  discard block
 block discarded – undo
273 273
  *   toujours true pour un auteur cree dans SPIP
274 274
  */
275 275
 function auth_spip_autoriser_modifier_login(string $serveur = ''): bool {
276
-	// les fonctions d'ecriture sur base distante sont encore incompletes
277
-	if (strlen($serveur)) {
278
-		return false;
279
-	}
280
-	return true;
276
+    // les fonctions d'ecriture sur base distante sont encore incompletes
277
+    if (strlen($serveur)) {
278
+        return false;
279
+    }
280
+    return true;
281 281
 }
282 282
 
283 283
 /**
@@ -291,25 +291,25 @@  discard block
 block discarded – undo
291 291
  *  message d'erreur si login non valide, chaine vide sinon
292 292
  */
293 293
 function auth_spip_verifier_login($new_login, $id_auteur = 0, $serveur = '') {
294
-	// login et mot de passe
295
-	if (strlen($new_login)) {
296
-		if (strlen($new_login) < _LOGIN_TROP_COURT) {
297
-			return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]);
298
-		} else {
299
-			$n = sql_countsel(
300
-				'spip_auteurs',
301
-				'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'",
302
-				'',
303
-				'',
304
-				$serveur
305
-			);
306
-			if ($n) {
307
-				return _T('info_login_existant');
308
-			}
309
-		}
310
-	}
311
-
312
-	return '';
294
+    // login et mot de passe
295
+    if (strlen($new_login)) {
296
+        if (strlen($new_login) < _LOGIN_TROP_COURT) {
297
+            return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]);
298
+        } else {
299
+            $n = sql_countsel(
300
+                'spip_auteurs',
301
+                'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'",
302
+                '',
303
+                '',
304
+                $serveur
305
+            );
306
+            if ($n) {
307
+                return _T('info_login_existant');
308
+            }
309
+        }
310
+    }
311
+
312
+    return '';
313 313
 }
314 314
 
315 315
 /**
@@ -321,41 +321,41 @@  discard block
 block discarded – undo
321 321
  * @return bool
322 322
  */
323 323
 function auth_spip_modifier_login($new_login, $id_auteur, $serveur = '') {
324
-	if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') {
325
-		return false;
326
-	}
327
-	if (
328
-		!$id_auteur = intval($id_auteur)
329
-		or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
330
-	) {
331
-		return false;
332
-	}
333
-	if ($new_login == $auteur['login']) {
334
-		return true;
335
-	} // on a rien fait mais c'est bon !
336
-
337
-	include_spip('action/editer_auteur');
338
-
339
-	// vider le login des auteurs a la poubelle qui avaient ce meme login
340
-	if (strlen($new_login)) {
341
-		$anciens = sql_allfetsel(
342
-			'id_auteur',
343
-			'spip_auteurs',
344
-			'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
345
-			'',
346
-			'',
347
-			'',
348
-			'',
349
-			$serveur
350
-		);
351
-		while ($row = array_pop($anciens)) {
352
-			auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur
353
-		}
354
-	}
355
-
356
-	auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur
357
-
358
-	return true;
324
+    if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') {
325
+        return false;
326
+    }
327
+    if (
328
+        !$id_auteur = intval($id_auteur)
329
+        or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
330
+    ) {
331
+        return false;
332
+    }
333
+    if ($new_login == $auteur['login']) {
334
+        return true;
335
+    } // on a rien fait mais c'est bon !
336
+
337
+    include_spip('action/editer_auteur');
338
+
339
+    // vider le login des auteurs a la poubelle qui avaient ce meme login
340
+    if (strlen($new_login)) {
341
+        $anciens = sql_allfetsel(
342
+            'id_auteur',
343
+            'spip_auteurs',
344
+            'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
345
+            '',
346
+            '',
347
+            '',
348
+            '',
349
+            $serveur
350
+        );
351
+        while ($row = array_pop($anciens)) {
352
+            auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur
353
+        }
354
+    }
355
+
356
+    auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur
357
+
358
+    return true;
359 359
 }
360 360
 
361 361
 /**
@@ -367,44 +367,44 @@  discard block
 block discarded – undo
367 367
  * @return string
368 368
  */
369 369
 function auth_spip_retrouver_login($login, $serveur = '') {
370
-	if (!strlen($login)) {
371
-		return null;
372
-	} // pas la peine de requeter
373
-	$l = sql_quote($login, $serveur, 'text');
374
-	if (
375
-		$r = sql_getfetsel(
376
-			'login',
377
-			'spip_auteurs',
378
-			"statut<>'5poubelle'" .
379
-			' AND (length(pass)>0)' .
380
-			" AND (login=$l)",
381
-			'',
382
-			'',
383
-			'',
384
-			'',
385
-			$serveur
386
-		)
387
-	) {
388
-		return $r;
389
-	}
390
-	// Si pas d'auteur avec ce login
391
-	// regarder s'il a saisi son nom ou son mail.
392
-	// Ne pas fusionner avec la requete precedente
393
-	// car un nom peut etre homonyme d'un autre login
394
-	else {
395
-		return sql_getfetsel(
396
-			'login',
397
-			'spip_auteurs',
398
-			"statut<>'5poubelle'" .
399
-			' AND (length(pass)>0)' .
400
-			" AND (login<>'' AND (nom=$l OR email=$l))",
401
-			'',
402
-			'',
403
-			'',
404
-			'',
405
-			$serveur
406
-		);
407
-	}
370
+    if (!strlen($login)) {
371
+        return null;
372
+    } // pas la peine de requeter
373
+    $l = sql_quote($login, $serveur, 'text');
374
+    if (
375
+        $r = sql_getfetsel(
376
+            'login',
377
+            'spip_auteurs',
378
+            "statut<>'5poubelle'" .
379
+            ' AND (length(pass)>0)' .
380
+            " AND (login=$l)",
381
+            '',
382
+            '',
383
+            '',
384
+            '',
385
+            $serveur
386
+        )
387
+    ) {
388
+        return $r;
389
+    }
390
+    // Si pas d'auteur avec ce login
391
+    // regarder s'il a saisi son nom ou son mail.
392
+    // Ne pas fusionner avec la requete precedente
393
+    // car un nom peut etre homonyme d'un autre login
394
+    else {
395
+        return sql_getfetsel(
396
+            'login',
397
+            'spip_auteurs',
398
+            "statut<>'5poubelle'" .
399
+            ' AND (length(pass)>0)' .
400
+            " AND (login<>'' AND (nom=$l OR email=$l))",
401
+            '',
402
+            '',
403
+            '',
404
+            '',
405
+            $serveur
406
+        );
407
+    }
408 408
 }
409 409
 
410 410
 /**
@@ -415,11 +415,11 @@  discard block
 block discarded – undo
415 415
  *  toujours true pour un auteur cree dans SPIP
416 416
  */
417 417
 function auth_spip_autoriser_modifier_pass(string $serveur = ''): bool {
418
-	// les fonctions d'ecriture sur base distante sont encore incompletes
419
-	if (strlen($serveur)) {
420
-		return false;
421
-	}
422
-	return true;
418
+    // les fonctions d'ecriture sur base distante sont encore incompletes
419
+    if (strlen($serveur)) {
420
+        return false;
421
+    }
422
+    return true;
423 423
 }
424 424
 
425 425
 
@@ -440,12 +440,12 @@  discard block
 block discarded – undo
440 440
  *  message d'erreur si login non valide, chaine vide sinon
441 441
  */
442 442
 function auth_spip_verifier_pass($login, #[\SensitiveParameter] $new_pass, $id_auteur = 0, $serveur = '') {
443
-	// login et mot de passe
444
-	if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
445
-		return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]);
446
-	}
443
+    // login et mot de passe
444
+    if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
445
+        return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]);
446
+    }
447 447
 
448
-	return '';
448
+    return '';
449 449
 }
450 450
 
451 451
 /**
@@ -459,47 +459,47 @@  discard block
 block discarded – undo
459 459
  * @return bool
460 460
  */
461 461
 function auth_spip_modifier_pass($login, #[\SensitiveParameter] $new_pass, $id_auteur, $serveur = '') {
462
-	if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
463
-		return false;
464
-	}
465
-
466
-	if (
467
-		!$id_auteur = intval($id_auteur)
468
-		or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
469
-	) {
470
-		return false;
471
-	}
472
-
473
-	$cles = SpipCles::instance();
474
-	$secret = $cles->getSecretAuth();
475
-	if (!$secret) {
476
-		if (auth_spip_initialiser_secret()) {
477
-			$secret = $cles->getSecretAuth();
478
-		}
479
-		else {
480
-			return false;
481
-		}
482
-	}
483
-
484
-
485
-	include_spip('inc/acces');
486
-	$set = [
487
-		'pass' => Password::hacher($new_pass, $secret),
488
-		'htpass' => generer_htpass($new_pass),
489
-		'alea_actuel' => creer_uniqid(), // @deprecated 4.1
490
-		'alea_futur' => creer_uniqid(), // @deprecated 4.1
491
-		'low_sec' => '',
492
-	];
493
-
494
-	// si c'est un webmestre, on met a jour son backup des cles
495
-	if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') {
496
-		$set['backup_cles'] = $cles->backup($new_pass);
497
-	}
498
-
499
-	include_spip('action/editer_auteur');
500
-	auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur
501
-
502
-	return true; // on a bien modifie le pass
462
+    if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
463
+        return false;
464
+    }
465
+
466
+    if (
467
+        !$id_auteur = intval($id_auteur)
468
+        or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
469
+    ) {
470
+        return false;
471
+    }
472
+
473
+    $cles = SpipCles::instance();
474
+    $secret = $cles->getSecretAuth();
475
+    if (!$secret) {
476
+        if (auth_spip_initialiser_secret()) {
477
+            $secret = $cles->getSecretAuth();
478
+        }
479
+        else {
480
+            return false;
481
+        }
482
+    }
483
+
484
+
485
+    include_spip('inc/acces');
486
+    $set = [
487
+        'pass' => Password::hacher($new_pass, $secret),
488
+        'htpass' => generer_htpass($new_pass),
489
+        'alea_actuel' => creer_uniqid(), // @deprecated 4.1
490
+        'alea_futur' => creer_uniqid(), // @deprecated 4.1
491
+        'low_sec' => '',
492
+    ];
493
+
494
+    // si c'est un webmestre, on met a jour son backup des cles
495
+    if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') {
496
+        $set['backup_cles'] = $cles->backup($new_pass);
497
+    }
498
+
499
+    include_spip('action/editer_auteur');
500
+    auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur
501
+
502
+    return true; // on a bien modifie le pass
503 503
 }
504 504
 
505 505
 /**
@@ -513,58 +513,58 @@  discard block
 block discarded – undo
513 513
  * @return void
514 514
  */
515 515
 function auth_spip_synchroniser_distant($id_auteur, $champs, $options = [], string $serveur = ''): void {
516
-	// ne rien faire pour une base distante : on ne sait pas regenerer les htaccess
517
-	if (strlen($serveur)) {
518
-		return;
519
-	}
520
-	// si un login, pass ou statut a ete modifie
521
-	// regenerer les fichier htpass
522
-	if (
523
-		isset($champs['login'])
524
-		or isset($champs['pass'])
525
-		or isset($champs['statut'])
526
-		or (isset($options['all']) and $options['all'])
527
-	) {
528
-		$htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
529
-		$htpasswd = _DIR_TMP . _AUTH_USER_FILE;
530
-
531
-		// Cette variable de configuration peut etre posee par un plugin
532
-		// par exemple acces_restreint ;
533
-		// si .htaccess existe, outrepasser spip_meta
534
-		if (
535
-			(!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui'))
536
-			and !@file_exists($htaccess)
537
-		) {
538
-			spip_unlink($htpasswd);
539
-			spip_unlink($htpasswd . '-admin');
540
-
541
-			return;
542
-		}
543
-
544
-		# remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
545
-		# de devenir redacteur le cas echeant (auth http)... a nettoyer
546
-		// attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
547
-
548
-		$p1 = ''; // login:htpass pour tous
549
-		$p2 = ''; // login:htpass pour les admins
550
-		$s = sql_select(
551
-			'login, htpass, statut',
552
-			'spip_auteurs',
553
-			sql_in('statut', ['1comite', '0minirezo', 'nouveau'])
554
-		);
555
-		while ($t = sql_fetch($s)) {
556
-			if (strlen($t['login']) and strlen($t['htpass'])) {
557
-				$p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
558
-				if ($t['statut'] == '0minirezo') {
559
-					$p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
560
-				}
561
-			}
562
-		}
563
-		sql_free($s);
564
-		if ($p1) {
565
-			ecrire_fichier($htpasswd, $p1);
566
-			ecrire_fichier($htpasswd . '-admin', $p2);
567
-			spip_log("Ecriture de $htpasswd et $htpasswd-admin");
568
-		}
569
-	}
516
+    // ne rien faire pour une base distante : on ne sait pas regenerer les htaccess
517
+    if (strlen($serveur)) {
518
+        return;
519
+    }
520
+    // si un login, pass ou statut a ete modifie
521
+    // regenerer les fichier htpass
522
+    if (
523
+        isset($champs['login'])
524
+        or isset($champs['pass'])
525
+        or isset($champs['statut'])
526
+        or (isset($options['all']) and $options['all'])
527
+    ) {
528
+        $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
529
+        $htpasswd = _DIR_TMP . _AUTH_USER_FILE;
530
+
531
+        // Cette variable de configuration peut etre posee par un plugin
532
+        // par exemple acces_restreint ;
533
+        // si .htaccess existe, outrepasser spip_meta
534
+        if (
535
+            (!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui'))
536
+            and !@file_exists($htaccess)
537
+        ) {
538
+            spip_unlink($htpasswd);
539
+            spip_unlink($htpasswd . '-admin');
540
+
541
+            return;
542
+        }
543
+
544
+        # remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
545
+        # de devenir redacteur le cas echeant (auth http)... a nettoyer
546
+        // attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
547
+
548
+        $p1 = ''; // login:htpass pour tous
549
+        $p2 = ''; // login:htpass pour les admins
550
+        $s = sql_select(
551
+            'login, htpass, statut',
552
+            'spip_auteurs',
553
+            sql_in('statut', ['1comite', '0minirezo', 'nouveau'])
554
+        );
555
+        while ($t = sql_fetch($s)) {
556
+            if (strlen($t['login']) and strlen($t['htpass'])) {
557
+                $p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
558
+                if ($t['statut'] == '0minirezo') {
559
+                    $p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
560
+                }
561
+            }
562
+        }
563
+        sql_free($s);
564
+        if ($p1) {
565
+            ecrire_fichier($htpasswd, $p1);
566
+            ecrire_fichier($htpasswd . '-admin', $p2);
567
+            spip_log("Ecriture de $htpasswd et $htpasswd-admin");
568
+        }
569
+    }
570 570
 }
Please login to merge, or discard this patch.
ecrire/auth/ldap.php 1 patch
Indentation   +176 added lines, -176 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  **/
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 // Authentifie via LDAP et retourne la ligne SQL decrivant l'utilisateur si ok
@@ -24,12 +24,12 @@  discard block
 block discarded – undo
24 24
 // Attributs LDAP correspondants a ceux de SPIP, notamment pour le login
25 25
 // ne pas ecraser une definition perso dans mes_options
26 26
 if (!isset($GLOBALS['ldap_attributes']) or !is_array($GLOBALS['ldap_attributes'])) {
27
-	$GLOBALS['ldap_attributes'] = [
28
-		'login' => ['sAMAccountName', 'uid', 'login', 'userid', 'cn', 'sn'],
29
-		'nom' => 'cn',
30
-		'email' => 'mail',
31
-		'bio' => 'description'
32
-	];
27
+    $GLOBALS['ldap_attributes'] = [
28
+        'login' => ['sAMAccountName', 'uid', 'login', 'userid', 'cn', 'sn'],
29
+        'nom' => 'cn',
30
+        'email' => 'mail',
31
+        'bio' => 'description'
32
+    ];
33 33
 }
34 34
 
35 35
 /**
@@ -55,50 +55,50 @@  discard block
 block discarded – undo
55 55
  */
56 56
 function auth_ldap_dist($login, #[\SensitiveParameter] $pass, $serveur = '', $phpauth = false) {
57 57
 
58
-	#spip_log("ldap $login " . ($pass ? "mdp fourni" : "mdp absent"));
59
-
60
-	// Utilisateur connu ?
61
-	// si http auth, inutile de reauthentifier: cela
62
-	// ne marchera pas avec auth http autre que basic.
63
-	$checkpass = isset($_SERVER['REMOTE_USER']) ? false : true;
64
-	if (!($dn = auth_ldap_search($login, $pass, $checkpass, $serveur))) {
65
-		return [];
66
-	}
67
-	$credentials_ldap = ['ldap_dn' => $dn, 'ldap_password' => $pass];
68
-
69
-	// Si l'utilisateur figure deja dans la base, y recuperer les infos
70
-	$r = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login) . " AND source='ldap'", '', '', '', '', $serveur);
71
-
72
-	if ($r) {
73
-		return array_merge($r, $credentials_ldap);
74
-	}
75
-
76
-	// sinon importer les infos depuis LDAP,
77
-
78
-	if (
79
-		$GLOBALS['meta']['ldap_statut_import']
80
-		and $desc = auth_ldap_retrouver($dn, [], $serveur)
81
-	) {
82
-		// rajouter le statut indique  a l'install
83
-		$desc['statut'] = $GLOBALS['meta']['ldap_statut_import'];
84
-		$desc['login'] = $login;
85
-		$desc['source'] = 'ldap';
86
-		$desc['pass'] = '';
87
-
88
-		$r = sql_insertq('spip_auteurs', $desc, [], $serveur);
89
-	}
90
-
91
-	if ($r) {
92
-		return array_merge(
93
-			$credentials_ldap,
94
-			sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($r), '', '', '', '', $serveur)
95
-		);
96
-	}
97
-
98
-	// sinon echec
99
-	spip_log("Creation de l'auteur '$login' impossible");
100
-
101
-	return [];
58
+    #spip_log("ldap $login " . ($pass ? "mdp fourni" : "mdp absent"));
59
+
60
+    // Utilisateur connu ?
61
+    // si http auth, inutile de reauthentifier: cela
62
+    // ne marchera pas avec auth http autre que basic.
63
+    $checkpass = isset($_SERVER['REMOTE_USER']) ? false : true;
64
+    if (!($dn = auth_ldap_search($login, $pass, $checkpass, $serveur))) {
65
+        return [];
66
+    }
67
+    $credentials_ldap = ['ldap_dn' => $dn, 'ldap_password' => $pass];
68
+
69
+    // Si l'utilisateur figure deja dans la base, y recuperer les infos
70
+    $r = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login) . " AND source='ldap'", '', '', '', '', $serveur);
71
+
72
+    if ($r) {
73
+        return array_merge($r, $credentials_ldap);
74
+    }
75
+
76
+    // sinon importer les infos depuis LDAP,
77
+
78
+    if (
79
+        $GLOBALS['meta']['ldap_statut_import']
80
+        and $desc = auth_ldap_retrouver($dn, [], $serveur)
81
+    ) {
82
+        // rajouter le statut indique  a l'install
83
+        $desc['statut'] = $GLOBALS['meta']['ldap_statut_import'];
84
+        $desc['login'] = $login;
85
+        $desc['source'] = 'ldap';
86
+        $desc['pass'] = '';
87
+
88
+        $r = sql_insertq('spip_auteurs', $desc, [], $serveur);
89
+    }
90
+
91
+    if ($r) {
92
+        return array_merge(
93
+            $credentials_ldap,
94
+            sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($r), '', '', '', '', $serveur)
95
+        );
96
+    }
97
+
98
+    // sinon echec
99
+    spip_log("Creation de l'auteur '$login' impossible");
100
+
101
+    return [];
102 102
 }
103 103
 
104 104
 /**
@@ -112,36 +112,36 @@  discard block
 block discarded – undo
112 112
  * @return array
113 113
  */
114 114
 function auth_ldap_connect($serveur = '') {
115
-	include_spip('base/connect_sql');
116
-	static $connexions_ldap = [];
117
-	if (isset($connexions_ldap[$serveur])) {
118
-		return $connexions_ldap[$serveur];
119
-	}
120
-	$connexion = spip_connect($serveur);
121
-	if (!is_array($connexion['ldap'])) {
122
-		if ($connexion['authentification']['ldap']) {
123
-			$f = _DIR_CONNECT . $connexion['authentification']['ldap'];
124
-			unset($GLOBALS['ldap_link']);
125
-			if (is_readable($f)) {
126
-				include_once($f);
127
-			};
128
-			if (isset($GLOBALS['ldap_link'])) {
129
-				$connexion['ldap'] = [
130
-					'link' => $GLOBALS['ldap_link'],
131
-					'base' => $GLOBALS['ldap_base']
132
-				];
133
-			} else {
134
-				spip_log("connection LDAP $serveur mal definie dans $f");
135
-			}
136
-			if (isset($GLOBALS['ldap_champs'])) {
137
-				$connexion['ldap']['attributes'] = $GLOBALS['ldap_champs'];
138
-			}
139
-		} else {
140
-			spip_log("connection LDAP $serveur inconnue");
141
-		}
142
-	}
143
-
144
-	return $connexions_ldap[$serveur] = $connexion['ldap'];
115
+    include_spip('base/connect_sql');
116
+    static $connexions_ldap = [];
117
+    if (isset($connexions_ldap[$serveur])) {
118
+        return $connexions_ldap[$serveur];
119
+    }
120
+    $connexion = spip_connect($serveur);
121
+    if (!is_array($connexion['ldap'])) {
122
+        if ($connexion['authentification']['ldap']) {
123
+            $f = _DIR_CONNECT . $connexion['authentification']['ldap'];
124
+            unset($GLOBALS['ldap_link']);
125
+            if (is_readable($f)) {
126
+                include_once($f);
127
+            };
128
+            if (isset($GLOBALS['ldap_link'])) {
129
+                $connexion['ldap'] = [
130
+                    'link' => $GLOBALS['ldap_link'],
131
+                    'base' => $GLOBALS['ldap_base']
132
+                ];
133
+            } else {
134
+                spip_log("connection LDAP $serveur mal definie dans $f");
135
+            }
136
+            if (isset($GLOBALS['ldap_champs'])) {
137
+                $connexion['ldap']['attributes'] = $GLOBALS['ldap_champs'];
138
+            }
139
+        } else {
140
+            spip_log("connection LDAP $serveur inconnue");
141
+        }
142
+    }
143
+
144
+    return $connexions_ldap[$serveur] = $connexion['ldap'];
145 145
 }
146 146
 
147 147
 /**
@@ -155,52 +155,52 @@  discard block
 block discarded – undo
155 155
  *    Le login trouvé ou chaine vide si non trouvé
156 156
  */
157 157
 function auth_ldap_search($login, #[\SensitiveParameter] $pass, $checkpass = true, $serveur = '') {
158
-	// Securite anti-injection et contre un serveur LDAP laxiste
159
-	$login_search = preg_replace('/[^-@._\s\d\w]/', '', $login);
160
-	if (!strlen($login_search) or ($checkpass and !strlen($pass))) {
161
-		return '';
162
-	}
163
-
164
-	// verifier la connexion
165
-	if (!$ldap = auth_ldap_connect($serveur)) {
166
-		return '';
167
-	}
168
-
169
-	$ldap_link = $ldap['link'] ?? null;
170
-	$ldap_base = $ldap['base'] ?? null;
171
-	$desc = !empty($ldap['attributes']) ? $ldap['attributes'] : $GLOBALS['ldap_attributes'];
172
-
173
-	$logins = is_array($desc['login']) ? $desc['login'] : [$desc['login']];
174
-
175
-	// Tenter une recherche pour essayer de retrouver le DN
176
-	foreach ($logins as $att) {
177
-		$result = @ldap_search($ldap_link, $ldap_base, "$att=$login_search", ['dn']);
178
-		$info = @ldap_get_entries($ldap_link, $result);
179
-		// Ne pas accepter les resultats si plus d'une entree
180
-		// (on veut un attribut unique)
181
-
182
-		if (is_array($info) and $info['count'] == 1) {
183
-			$dn = $info[0]['dn'];
184
-			if (!$checkpass) {
185
-				return $dn;
186
-			}
187
-			if (@ldap_bind($ldap_link, $dn, $pass)) {
188
-				return $dn;
189
-			}
190
-		}
191
-	}
192
-
193
-	if ($checkpass and !isset($dn)) {
194
-		// Si echec, essayer de deviner le DN
195
-		foreach ($logins as $att) {
196
-			$dn = "$att=$login_search, $ldap_base";
197
-			if (@ldap_bind($ldap_link, $dn, $pass)) {
198
-				return "$att=$login_search, $ldap_base";
199
-			}
200
-		}
201
-	}
202
-
203
-	return '';
158
+    // Securite anti-injection et contre un serveur LDAP laxiste
159
+    $login_search = preg_replace('/[^-@._\s\d\w]/', '', $login);
160
+    if (!strlen($login_search) or ($checkpass and !strlen($pass))) {
161
+        return '';
162
+    }
163
+
164
+    // verifier la connexion
165
+    if (!$ldap = auth_ldap_connect($serveur)) {
166
+        return '';
167
+    }
168
+
169
+    $ldap_link = $ldap['link'] ?? null;
170
+    $ldap_base = $ldap['base'] ?? null;
171
+    $desc = !empty($ldap['attributes']) ? $ldap['attributes'] : $GLOBALS['ldap_attributes'];
172
+
173
+    $logins = is_array($desc['login']) ? $desc['login'] : [$desc['login']];
174
+
175
+    // Tenter une recherche pour essayer de retrouver le DN
176
+    foreach ($logins as $att) {
177
+        $result = @ldap_search($ldap_link, $ldap_base, "$att=$login_search", ['dn']);
178
+        $info = @ldap_get_entries($ldap_link, $result);
179
+        // Ne pas accepter les resultats si plus d'une entree
180
+        // (on veut un attribut unique)
181
+
182
+        if (is_array($info) and $info['count'] == 1) {
183
+            $dn = $info[0]['dn'];
184
+            if (!$checkpass) {
185
+                return $dn;
186
+            }
187
+            if (@ldap_bind($ldap_link, $dn, $pass)) {
188
+                return $dn;
189
+            }
190
+        }
191
+    }
192
+
193
+    if ($checkpass and !isset($dn)) {
194
+        // Si echec, essayer de deviner le DN
195
+        foreach ($logins as $att) {
196
+            $dn = "$att=$login_search, $ldap_base";
197
+            if (@ldap_bind($ldap_link, $dn, $pass)) {
198
+                return "$att=$login_search, $ldap_base";
199
+            }
200
+        }
201
+    }
202
+
203
+    return '';
204 204
 }
205 205
 
206 206
 /**
@@ -212,40 +212,40 @@  discard block
 block discarded – undo
212 212
  * @return array
213 213
  */
214 214
 function auth_ldap_retrouver($dn, $desc = [], $serveur = '') {
215
-	// Lire les infos sur l'utilisateur a partir de son DN depuis LDAP
215
+    // Lire les infos sur l'utilisateur a partir de son DN depuis LDAP
216 216
 
217
-	if (!$ldap = auth_ldap_connect($serveur)) {
218
-		spip_log("ldap $serveur injoignable");
217
+    if (!$ldap = auth_ldap_connect($serveur)) {
218
+        spip_log("ldap $serveur injoignable");
219 219
 
220
-		return [];
221
-	}
220
+        return [];
221
+    }
222 222
 
223
-	$ldap_link = $ldap['link'];
224
-	if (!$desc) {
225
-		$desc = $ldap['attributes'] ?: $GLOBALS['ldap_attributes'];
226
-		unset($desc['login']);
227
-	}
228
-	$result = @ldap_read($ldap_link, $dn, 'objectClass=*', array_values($desc));
223
+    $ldap_link = $ldap['link'];
224
+    if (!$desc) {
225
+        $desc = $ldap['attributes'] ?: $GLOBALS['ldap_attributes'];
226
+        unset($desc['login']);
227
+    }
228
+    $result = @ldap_read($ldap_link, $dn, 'objectClass=*', array_values($desc));
229 229
 
230
-	if (!$result) {
231
-		return [];
232
-	}
230
+    if (!$result) {
231
+        return [];
232
+    }
233 233
 
234
-	// Recuperer les donnees du premier (unique?) compte de l'auteur
235
-	$val = @ldap_get_entries($ldap_link, $result);
236
-	if (!is_array($val) or !is_array($val[0])) {
237
-		return [];
238
-	}
239
-	$val = $val[0];
234
+    // Recuperer les donnees du premier (unique?) compte de l'auteur
235
+    $val = @ldap_get_entries($ldap_link, $result);
236
+    if (!is_array($val) or !is_array($val[0])) {
237
+        return [];
238
+    }
239
+    $val = $val[0];
240 240
 
241
-	// Convertir depuis UTF-8 (jeu de caracteres par defaut)
242
-	include_spip('inc/charsets');
241
+    // Convertir depuis UTF-8 (jeu de caracteres par defaut)
242
+    include_spip('inc/charsets');
243 243
 
244
-	foreach ($desc as $k => $v) {
245
-		$desc[$k] = importer_charset($val[strtolower($v)][0], 'utf-8');
246
-	}
244
+    foreach ($desc as $k => $v) {
245
+        $desc[$k] = importer_charset($val[strtolower($v)][0], 'utf-8');
246
+    }
247 247
 
248
-	return $desc;
248
+    return $desc;
249 249
 }
250 250
 
251 251
 
@@ -257,7 +257,7 @@  discard block
 block discarded – undo
257 257
  * @return string
258 258
  */
259 259
 function auth_ldap_retrouver_login($login, $serveur = '') {
260
-	return auth_ldap_search($login, '', false, $serveur) ? $login : '';
260
+    return auth_ldap_search($login, '', false, $serveur) ? $login : '';
261 261
 }
262 262
 
263 263
 /**
@@ -277,9 +277,9 @@  discard block
 block discarded – undo
277 277
  *   Message d'erreur si login non valide, chaîne vide sinon
278 278
  */
279 279
 function auth_ldap_verifier_pass($login, #[\SensitiveParameter] $new_pass, $id_auteur = 0, $serveur = '') {
280
-	include_spip('auth/spip');
280
+    include_spip('auth/spip');
281 281
 
282
-	return auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur);
282
+    return auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur);
283 283
 }
284 284
 
285 285
 /**
@@ -300,7 +300,7 @@  discard block
 block discarded – undo
300 300
  *   ```
301 301
  */
302 302
 function auth_ldap_autoriser_modifier_pass($serveur = '') {
303
-	return true;
303
+    return true;
304 304
 }
305 305
 
306 306
 /**
@@ -318,23 +318,23 @@  discard block
 block discarded – undo
318 318
  *    Informe du succès ou de l'echec du changement du mot de passe
319 319
  */
320 320
 function auth_ldap_modifier_pass($login, #[\SensitiveParameter] $new_pass, $id_auteur, $serveur = '') {
321
-	if (is_null($new_pass) or auth_ldap_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
322
-		return false;
323
-	}
324
-	if (!$ldap = auth_ldap_connect($serveur)) {
325
-		return false;
326
-	}
327
-	$link = $ldap['link'];
328
-	include_spip('inc/session');
329
-	$dn = session_get('ldap_dn');
330
-	if ('' == $dn) {
331
-		return false;
332
-	}
333
-	if (!ldap_bind($link, $dn, session_get('ldap_password'))) {
334
-		return false;
335
-	}
336
-	$encoded_pass = '{MD5}' . base64_encode(pack('H*', md5($new_pass)));
337
-	$success = ldap_mod_replace($link, $dn, ['userPassword' => $encoded_pass]);
338
-
339
-	return $success;
321
+    if (is_null($new_pass) or auth_ldap_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
322
+        return false;
323
+    }
324
+    if (!$ldap = auth_ldap_connect($serveur)) {
325
+        return false;
326
+    }
327
+    $link = $ldap['link'];
328
+    include_spip('inc/session');
329
+    $dn = session_get('ldap_dn');
330
+    if ('' == $dn) {
331
+        return false;
332
+    }
333
+    if (!ldap_bind($link, $dn, session_get('ldap_password'))) {
334
+        return false;
335
+    }
336
+    $encoded_pass = '{MD5}' . base64_encode(pack('H*', md5($new_pass)));
337
+    $success = ldap_mod_replace($link, $dn, ['userPassword' => $encoded_pass]);
338
+
339
+    return $success;
340 340
 }
Please login to merge, or discard this patch.
ecrire/req/sqlite3.php 1 patch
Indentation   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -10,7 +10,7 @@  discard block
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 
@@ -20,18 +20,18 @@  discard block
 block discarded – undo
20 20
 
21 21
 
22 22
 function req_sqlite3_dist($addr, $port, $login, #[\SensitiveParameter] $pass, $db = '', $prefixe = '') {
23
-	return req_sqlite_dist($addr, $port, $login, $pass, $db, $prefixe, $sqlite_version = 3);
23
+    return req_sqlite_dist($addr, $port, $login, $pass, $db, $prefixe, $sqlite_version = 3);
24 24
 }
25 25
 
26 26
 
27 27
 function spip_sqlite3_constantes() {
28
-	if (!defined('SPIP_SQLITE3_ASSOC')) {
29
-		define('SPIP_SQLITE3_ASSOC', PDO::FETCH_ASSOC);
30
-		define('SPIP_SQLITE3_NUM', PDO::FETCH_NUM);
31
-		define('SPIP_SQLITE3_BOTH', PDO::FETCH_BOTH);
32
-	}
28
+    if (!defined('SPIP_SQLITE3_ASSOC')) {
29
+        define('SPIP_SQLITE3_ASSOC', PDO::FETCH_ASSOC);
30
+        define('SPIP_SQLITE3_NUM', PDO::FETCH_NUM);
31
+        define('SPIP_SQLITE3_BOTH', PDO::FETCH_BOTH);
32
+    }
33 33
 }
34 34
 
35 35
 function spip_versions_sqlite3() {
36
-	return _sqlite_charger_version(3) ? 3 : false;
36
+    return _sqlite_charger_version(3) ? 3 : false;
37 37
 }
Please login to merge, or discard this patch.
ecrire/req/mysql.php 1 patch
Indentation   +884 added lines, -884 removed lines patch added patch discarded remove patch
@@ -19,11 +19,11 @@  discard block
 block discarded – undo
19 19
  */
20 20
 
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 if (!defined('_MYSQL_NOPLANES')) {
26
-	define('_MYSQL_NOPLANES', true);
26
+    define('_MYSQL_NOPLANES', true);
27 27
 }
28 28
 
29 29
 /**
@@ -40,112 +40,112 @@  discard block
 block discarded – undo
40 40
  *     - tableau décrivant la connexion sinon
41 41
  */
42 42
 function req_mysql_dist($host, $port, $login, #[\SensitiveParameter] $pass, $db = '', $prefixe = '') {
43
-	if (!extension_loaded(\mysqli::class)) {
44
-		return false;
45
-	}
46
-
47
-	// si port est fourni mais pas host, c'est un socket -> compat avec vieille syntaxe de mysql_connect() et anciens fichiers connect.php
48
-	try {
49
-		if (
50
-			$port and !is_numeric($socket = $port)
51
-			and (!$host or $host === 'localhost')
52
-		) {
53
-			$link = @mysqli_connect($host, $login, $pass, '', null, $socket);
54
-		} elseif ($port) {
55
-			$link = @mysqli_connect($host, $login, $pass, '', $port);
56
-		} else {
57
-			$link = @mysqli_connect($host, $login, $pass);
58
-		}
59
-	} catch (\mysqli_sql_exception $e) {
60
-		spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
61
-		$link = false;
62
-	}
63
-
64
-	if (!$link) {
65
-		spip_log('Echec mysqli_connect. Erreur : ' . mysqli_connect_error(), 'mysql.' . _LOG_HS);
66
-
67
-		return false;
68
-	}
69
-	$last = '';
70
-	if (!$db) {
71
-		$ok = $link;
72
-		$db = 'spip';
73
-	} else {
74
-		$ok = mysqli_select_db($link, $db);
75
-		if (
76
-			defined('_MYSQL_SET_SQL_MODE')
77
-			or defined('_MYSQL_SQL_MODE_TEXT_NOT_NULL') // compatibilite
78
-		) {
79
-			mysqli_query($link, $last = "set sql_mode=''");
80
-		}
81
-	}
82
-
83
-	spip_log(
84
-		"Connexion MySQLi vers $host, base $db, prefixe $prefixe " . ($ok ? 'operationnelle' : 'impossible'),
85
-		_LOG_DEBUG
86
-	);
87
-
88
-	return !$ok ? false : [
89
-		'db' => $db,
90
-		'last' => $last,
91
-		'prefixe' => $prefixe ?: $db,
92
-		'link' => $link,
93
-		'total_requetes' => 0,
94
-	];
43
+    if (!extension_loaded(\mysqli::class)) {
44
+        return false;
45
+    }
46
+
47
+    // si port est fourni mais pas host, c'est un socket -> compat avec vieille syntaxe de mysql_connect() et anciens fichiers connect.php
48
+    try {
49
+        if (
50
+            $port and !is_numeric($socket = $port)
51
+            and (!$host or $host === 'localhost')
52
+        ) {
53
+            $link = @mysqli_connect($host, $login, $pass, '', null, $socket);
54
+        } elseif ($port) {
55
+            $link = @mysqli_connect($host, $login, $pass, '', $port);
56
+        } else {
57
+            $link = @mysqli_connect($host, $login, $pass);
58
+        }
59
+    } catch (\mysqli_sql_exception $e) {
60
+        spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
61
+        $link = false;
62
+    }
63
+
64
+    if (!$link) {
65
+        spip_log('Echec mysqli_connect. Erreur : ' . mysqli_connect_error(), 'mysql.' . _LOG_HS);
66
+
67
+        return false;
68
+    }
69
+    $last = '';
70
+    if (!$db) {
71
+        $ok = $link;
72
+        $db = 'spip';
73
+    } else {
74
+        $ok = mysqli_select_db($link, $db);
75
+        if (
76
+            defined('_MYSQL_SET_SQL_MODE')
77
+            or defined('_MYSQL_SQL_MODE_TEXT_NOT_NULL') // compatibilite
78
+        ) {
79
+            mysqli_query($link, $last = "set sql_mode=''");
80
+        }
81
+    }
82
+
83
+    spip_log(
84
+        "Connexion MySQLi vers $host, base $db, prefixe $prefixe " . ($ok ? 'operationnelle' : 'impossible'),
85
+        _LOG_DEBUG
86
+    );
87
+
88
+    return !$ok ? false : [
89
+        'db' => $db,
90
+        'last' => $last,
91
+        'prefixe' => $prefixe ?: $db,
92
+        'link' => $link,
93
+        'total_requetes' => 0,
94
+    ];
95 95
 }
96 96
 
97 97
 
98 98
 $GLOBALS['spip_mysql_functions_1'] = [
99
-	'alter' => 'spip_mysql_alter',
100
-	'count' => 'spip_mysql_count',
101
-	'countsel' => 'spip_mysql_countsel',
102
-	'create' => 'spip_mysql_create',
103
-	'create_base' => 'spip_mysql_create_base',
104
-	'create_view' => 'spip_mysql_create_view',
105
-	'date_proche' => 'spip_mysql_date_proche',
106
-	'delete' => 'spip_mysql_delete',
107
-	'drop_table' => 'spip_mysql_drop_table',
108
-	'drop_view' => 'spip_mysql_drop_view',
109
-	'errno' => 'spip_mysql_errno',
110
-	'error' => 'spip_mysql_error',
111
-	'explain' => 'spip_mysql_explain',
112
-	'fetch' => 'spip_mysql_fetch',
113
-	'seek' => 'spip_mysql_seek',
114
-	'free' => 'spip_mysql_free',
115
-	'hex' => 'spip_mysql_hex',
116
-	'in' => 'spip_mysql_in',
117
-	'insert' => 'spip_mysql_insert',
118
-	'insertq' => 'spip_mysql_insertq',
119
-	'insertq_multi' => 'spip_mysql_insertq_multi',
120
-	'listdbs' => 'spip_mysql_listdbs',
121
-	'multi' => 'spip_mysql_multi',
122
-	'optimize' => 'spip_mysql_optimize',
123
-	'query' => 'spip_mysql_query',
124
-	'quote' => 'spip_mysql_quote',
125
-	'replace' => 'spip_mysql_replace',
126
-	'replace_multi' => 'spip_mysql_replace_multi',
127
-	'repair' => 'spip_mysql_repair',
128
-	'select' => 'spip_mysql_select',
129
-	'selectdb' => 'spip_mysql_selectdb',
130
-	'set_charset' => 'spip_mysql_set_charset',
131
-	'get_charset' => 'spip_mysql_get_charset',
132
-	'showbase' => 'spip_mysql_showbase',
133
-	'showtable' => 'spip_mysql_showtable',
134
-	'table_exists' => 'spip_mysql_table_exists',
135
-	'update' => 'spip_mysql_update',
136
-	'updateq' => 'spip_mysql_updateq',
137
-
138
-	// association de chaque nom http d'un charset aux couples MySQL
139
-	'charsets' => [
140
-		'cp1250' => ['charset' => 'cp1250', 'collation' => 'cp1250_general_ci'],
141
-		'cp1251' => ['charset' => 'cp1251', 'collation' => 'cp1251_general_ci'],
142
-		'cp1256' => ['charset' => 'cp1256', 'collation' => 'cp1256_general_ci'],
143
-		'iso-8859-1' => ['charset' => 'latin1', 'collation' => 'latin1_swedish_ci'],
99
+    'alter' => 'spip_mysql_alter',
100
+    'count' => 'spip_mysql_count',
101
+    'countsel' => 'spip_mysql_countsel',
102
+    'create' => 'spip_mysql_create',
103
+    'create_base' => 'spip_mysql_create_base',
104
+    'create_view' => 'spip_mysql_create_view',
105
+    'date_proche' => 'spip_mysql_date_proche',
106
+    'delete' => 'spip_mysql_delete',
107
+    'drop_table' => 'spip_mysql_drop_table',
108
+    'drop_view' => 'spip_mysql_drop_view',
109
+    'errno' => 'spip_mysql_errno',
110
+    'error' => 'spip_mysql_error',
111
+    'explain' => 'spip_mysql_explain',
112
+    'fetch' => 'spip_mysql_fetch',
113
+    'seek' => 'spip_mysql_seek',
114
+    'free' => 'spip_mysql_free',
115
+    'hex' => 'spip_mysql_hex',
116
+    'in' => 'spip_mysql_in',
117
+    'insert' => 'spip_mysql_insert',
118
+    'insertq' => 'spip_mysql_insertq',
119
+    'insertq_multi' => 'spip_mysql_insertq_multi',
120
+    'listdbs' => 'spip_mysql_listdbs',
121
+    'multi' => 'spip_mysql_multi',
122
+    'optimize' => 'spip_mysql_optimize',
123
+    'query' => 'spip_mysql_query',
124
+    'quote' => 'spip_mysql_quote',
125
+    'replace' => 'spip_mysql_replace',
126
+    'replace_multi' => 'spip_mysql_replace_multi',
127
+    'repair' => 'spip_mysql_repair',
128
+    'select' => 'spip_mysql_select',
129
+    'selectdb' => 'spip_mysql_selectdb',
130
+    'set_charset' => 'spip_mysql_set_charset',
131
+    'get_charset' => 'spip_mysql_get_charset',
132
+    'showbase' => 'spip_mysql_showbase',
133
+    'showtable' => 'spip_mysql_showtable',
134
+    'table_exists' => 'spip_mysql_table_exists',
135
+    'update' => 'spip_mysql_update',
136
+    'updateq' => 'spip_mysql_updateq',
137
+
138
+    // association de chaque nom http d'un charset aux couples MySQL
139
+    'charsets' => [
140
+        'cp1250' => ['charset' => 'cp1250', 'collation' => 'cp1250_general_ci'],
141
+        'cp1251' => ['charset' => 'cp1251', 'collation' => 'cp1251_general_ci'],
142
+        'cp1256' => ['charset' => 'cp1256', 'collation' => 'cp1256_general_ci'],
143
+        'iso-8859-1' => ['charset' => 'latin1', 'collation' => 'latin1_swedish_ci'],
144 144
 //'iso-8859-6'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
145
-		'iso-8859-9' => ['charset' => 'latin5', 'collation' => 'latin5_turkish_ci'],
145
+        'iso-8859-9' => ['charset' => 'latin5', 'collation' => 'latin5_turkish_ci'],
146 146
 //'iso-8859-15'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
147
-		'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci']
148
-	]
147
+        'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci']
148
+    ]
149 149
 ];
150 150
 
151 151
 
@@ -156,9 +156,9 @@  discard block
 block discarded – undo
156 156
  * @return Object Information de connexion pour mysqli
157 157
  */
158 158
 function _mysql_link($serveur = '') {
159
-	$link = &$GLOBALS['connexions'][$serveur ?: 0]['link'];
159
+    $link = &$GLOBALS['connexions'][$serveur ?: 0]['link'];
160 160
 
161
-	return $link;
161
+    return $link;
162 162
 }
163 163
 
164 164
 
@@ -171,10 +171,10 @@  discard block
 block discarded – undo
171 171
  * @return mysqli_result|bool Jeu de résultats pour fetch()
172 172
  */
173 173
 function spip_mysql_set_charset($charset, $serveur = '', $requeter = true) {
174
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
175
-	spip_log('changement de charset sql : ' . 'SET NAMES ' . _q($charset), _LOG_DEBUG);
174
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
175
+    spip_log('changement de charset sql : ' . 'SET NAMES ' . _q($charset), _LOG_DEBUG);
176 176
 
177
-	return mysqli_query($connexion['link'], $connexion['last'] = 'SET NAMES ' . _q($charset));
177
+    return mysqli_query($connexion['link'], $connexion['last'] = 'SET NAMES ' . _q($charset));
178 178
 }
179 179
 
180 180
 
@@ -187,11 +187,11 @@  discard block
 block discarded – undo
187 187
  * @return array Description du charset (son nom est dans 'charset')
188 188
  */
189 189
 function spip_mysql_get_charset($charset = [], $serveur = '', $requeter = true) {
190
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
191
-	$connexion['last'] = $c = 'SHOW CHARACTER SET'
192
-		. (!$charset ? '' : (' LIKE ' . _q($charset['charset'])));
190
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
191
+    $connexion['last'] = $c = 'SHOW CHARACTER SET'
192
+        . (!$charset ? '' : (' LIKE ' . _q($charset['charset'])));
193 193
 
194
-	return spip_mysql_fetch(mysqli_query($connexion['link'], $c), null, $serveur);
194
+    return spip_mysql_fetch(mysqli_query($connexion['link'], $c), null, $serveur);
195 195
 }
196 196
 
197 197
 /**
@@ -207,80 +207,80 @@  discard block
 block discarded – undo
207 207
  */
208 208
 function spip_mysql_query($query, $serveur = '', $requeter = true) {
209 209
 
210
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
211
-	$prefixe = $connexion['prefixe'];
212
-	$link = $connexion['link'];
213
-	$db = $connexion['db'];
214
-
215
-	$query = _mysql_traite_query($query, $db, $prefixe);
216
-
217
-	// renvoyer la requete inerte si demandee
218
-	if (!$requeter) {
219
-		return $query;
220
-	}
221
-
222
-	if (isset($_GET['var_profile']) or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) {
223
-		include_spip('public/tracer');
224
-		$t = trace_query_start();
225
-	} else {
226
-		$t = 0;
227
-	}
228
-
229
-	$connexion['last'] = $query;
230
-	$connexion['total_requetes']++;
231
-
232
-	// ajouter un debug utile dans log/mysql-slow.log ?
233
-	$debug = '';
234
-	if (defined('_DEBUG_SLOW_QUERIES') and _DEBUG_SLOW_QUERIES) {
235
-		if (isset($GLOBALS['debug']['aucasou'])) {
236
-			[, $id, , $infos] = $GLOBALS['debug']['aucasou'];
237
-			$debug .= "BOUCLE$id @ " . ($infos[0] ?? '') . ' | ';
238
-		}
239
-		if (isset($_SERVER['REQUEST_URI'])) {
240
-			$debug .= $_SERVER['REQUEST_URI'];
241
-		}
242
-		if (!empty($GLOBALS['ip'])) {
243
-			$debug .= ' + ' . $GLOBALS['ip'];
244
-		}
245
-		$debug = ' /* ' . mysqli_real_escape_string($link, str_replace('*/', '@/', $debug)) . ' */';
246
-	}
247
-	try {
248
-		$r = mysqli_query($link, $query . $debug);
249
-	} catch (\mysqli_sql_exception $e) {
250
-		spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
251
-		$r = false;
252
-		// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
253
-		// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
254
-	}
255
-
256
-	//Eviter de propager le GoneAway sur les autres requetes d'un même processus PHP
257
-	if ($e = spip_mysql_errno($serveur)) {  // Log d'un Gone Away
258
-		if ($e == 2006) { //Si Gone Away on relance une connexion vierge
259
-			//Fermer la connexion defaillante
260
-			mysqli_close($connexion['link']);
261
-			unset($GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]);
262
-			//Relancer une connexion vierge
263
-			spip_connect($serveur);
264
-			$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
265
-			$link = $connexion['link'];
266
-			//On retente au cas où
267
-			try {
268
-				$r = mysqli_query($link, $query . $debug);
269
-			} catch (\mysqli_sql_exception $e) {
270
-				spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
271
-				$r = false;
272
-				// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
273
-				// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
274
-			}
275
-		}
276
-	}
277
-
278
-	// Log de l'erreur eventuelle
279
-	if ($e = spip_mysql_errno($serveur)) {
280
-		// et du fautif
281
-		$e .= spip_mysql_error($query, $serveur);
282
-	}
283
-	return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
210
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
211
+    $prefixe = $connexion['prefixe'];
212
+    $link = $connexion['link'];
213
+    $db = $connexion['db'];
214
+
215
+    $query = _mysql_traite_query($query, $db, $prefixe);
216
+
217
+    // renvoyer la requete inerte si demandee
218
+    if (!$requeter) {
219
+        return $query;
220
+    }
221
+
222
+    if (isset($_GET['var_profile']) or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) {
223
+        include_spip('public/tracer');
224
+        $t = trace_query_start();
225
+    } else {
226
+        $t = 0;
227
+    }
228
+
229
+    $connexion['last'] = $query;
230
+    $connexion['total_requetes']++;
231
+
232
+    // ajouter un debug utile dans log/mysql-slow.log ?
233
+    $debug = '';
234
+    if (defined('_DEBUG_SLOW_QUERIES') and _DEBUG_SLOW_QUERIES) {
235
+        if (isset($GLOBALS['debug']['aucasou'])) {
236
+            [, $id, , $infos] = $GLOBALS['debug']['aucasou'];
237
+            $debug .= "BOUCLE$id @ " . ($infos[0] ?? '') . ' | ';
238
+        }
239
+        if (isset($_SERVER['REQUEST_URI'])) {
240
+            $debug .= $_SERVER['REQUEST_URI'];
241
+        }
242
+        if (!empty($GLOBALS['ip'])) {
243
+            $debug .= ' + ' . $GLOBALS['ip'];
244
+        }
245
+        $debug = ' /* ' . mysqli_real_escape_string($link, str_replace('*/', '@/', $debug)) . ' */';
246
+    }
247
+    try {
248
+        $r = mysqli_query($link, $query . $debug);
249
+    } catch (\mysqli_sql_exception $e) {
250
+        spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
251
+        $r = false;
252
+        // TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
253
+        // mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
254
+    }
255
+
256
+    //Eviter de propager le GoneAway sur les autres requetes d'un même processus PHP
257
+    if ($e = spip_mysql_errno($serveur)) {  // Log d'un Gone Away
258
+        if ($e == 2006) { //Si Gone Away on relance une connexion vierge
259
+            //Fermer la connexion defaillante
260
+            mysqli_close($connexion['link']);
261
+            unset($GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]);
262
+            //Relancer une connexion vierge
263
+            spip_connect($serveur);
264
+            $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
265
+            $link = $connexion['link'];
266
+            //On retente au cas où
267
+            try {
268
+                $r = mysqli_query($link, $query . $debug);
269
+            } catch (\mysqli_sql_exception $e) {
270
+                spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
271
+                $r = false;
272
+                // TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
273
+                // mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
274
+            }
275
+        }
276
+    }
277
+
278
+    // Log de l'erreur eventuelle
279
+    if ($e = spip_mysql_errno($serveur)) {
280
+        // et du fautif
281
+        $e .= spip_mysql_error($query, $serveur);
282
+    }
283
+    return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
284 284
 }
285 285
 
286 286
 /**
@@ -295,12 +295,12 @@  discard block
 block discarded – undo
295 295
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
296 296
  */
297 297
 function spip_mysql_alter($query, $serveur = '', $requeter = true) {
298
-	// ici on supprime les ` entourant le nom de table pour permettre
299
-	// la transposition du prefixe, compte tenu que les plugins ont la mauvaise habitude
300
-	// d'utiliser ceux-ci, copie-colle de phpmyadmin
301
-	$query = preg_replace(',^TABLE\s*`([^`]*)`,i', "TABLE \\1", $query);
298
+    // ici on supprime les ` entourant le nom de table pour permettre
299
+    // la transposition du prefixe, compte tenu que les plugins ont la mauvaise habitude
300
+    // d'utiliser ceux-ci, copie-colle de phpmyadmin
301
+    $query = preg_replace(',^TABLE\s*`([^`]*)`,i', "TABLE \\1", $query);
302 302
 
303
-	return spip_mysql_query('ALTER ' . $query, $serveur, $requeter); # i.e. que PG se debrouille
303
+    return spip_mysql_query('ALTER ' . $query, $serveur, $requeter); # i.e. que PG se debrouille
304 304
 }
305 305
 
306 306
 
@@ -313,9 +313,9 @@  discard block
 block discarded – undo
313 313
  * @return bool            Toujours true
314 314
  */
315 315
 function spip_mysql_optimize($table, $serveur = '', $requeter = true) {
316
-	spip_mysql_query('OPTIMIZE TABLE ' . $table);
316
+    spip_mysql_query('OPTIMIZE TABLE ' . $table);
317 317
 
318
-	return true;
318
+    return true;
319 319
 }
320 320
 
321 321
 
@@ -328,18 +328,18 @@  discard block
 block discarded – undo
328 328
  * @return array           Tableau de l'explication
329 329
  */
330 330
 function spip_mysql_explain($query, $serveur = '', $requeter = true) {
331
-	if (strpos(ltrim($query), 'SELECT') !== 0) {
332
-		return [];
333
-	}
334
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
335
-	$prefixe = $connexion['prefixe'];
336
-	$link = $connexion['link'];
337
-	$db = $connexion['db'];
338
-
339
-	$query = 'EXPLAIN ' . _mysql_traite_query($query, $db, $prefixe);
340
-	$r = mysqli_query($link, $query);
341
-
342
-	return spip_mysql_fetch($r, null, $serveur);
331
+    if (strpos(ltrim($query), 'SELECT') !== 0) {
332
+        return [];
333
+    }
334
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
335
+    $prefixe = $connexion['prefixe'];
336
+    $link = $connexion['link'];
337
+    $db = $connexion['db'];
338
+
339
+    $query = 'EXPLAIN ' . _mysql_traite_query($query, $db, $prefixe);
340
+    $r = mysqli_query($link, $query);
341
+
342
+    return spip_mysql_fetch($r, null, $serveur);
343 343
 }
344 344
 
345 345
 
@@ -368,35 +368,35 @@  discard block
 block discarded – undo
368 368
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
369 369
  */
370 370
 function spip_mysql_select(
371
-	$select,
372
-	$from,
373
-	$where = '',
374
-	$groupby = '',
375
-	$orderby = '',
376
-	$limit = '',
377
-	$having = '',
378
-	$serveur = '',
379
-	$requeter = true
371
+    $select,
372
+    $from,
373
+    $where = '',
374
+    $groupby = '',
375
+    $orderby = '',
376
+    $limit = '',
377
+    $having = '',
378
+    $serveur = '',
379
+    $requeter = true
380 380
 ) {
381 381
 
382 382
 
383
-	$from = (!is_array($from) ? $from : spip_mysql_select_as($from));
384
-	$query =
385
-		calculer_mysql_expression('SELECT', $select, ', ')
386
-		. calculer_mysql_expression('FROM', $from, ', ')
387
-		. calculer_mysql_expression('WHERE', $where)
388
-		. calculer_mysql_expression('GROUP BY', $groupby, ',')
389
-		. calculer_mysql_expression('HAVING', $having)
390
-		. ($orderby ? ("\nORDER BY " . spip_mysql_order($orderby)) : '')
391
-		. ($limit ? "\nLIMIT $limit" : '');
383
+    $from = (!is_array($from) ? $from : spip_mysql_select_as($from));
384
+    $query =
385
+        calculer_mysql_expression('SELECT', $select, ', ')
386
+        . calculer_mysql_expression('FROM', $from, ', ')
387
+        . calculer_mysql_expression('WHERE', $where)
388
+        . calculer_mysql_expression('GROUP BY', $groupby, ',')
389
+        . calculer_mysql_expression('HAVING', $having)
390
+        . ($orderby ? ("\nORDER BY " . spip_mysql_order($orderby)) : '')
391
+        . ($limit ? "\nLIMIT $limit" : '');
392 392
 
393
-	// renvoyer la requete inerte si demandee
394
-	if ($requeter === false) {
395
-		return $query;
396
-	}
397
-	$r = spip_mysql_query($query, $serveur, $requeter);
393
+    // renvoyer la requete inerte si demandee
394
+    if ($requeter === false) {
395
+        return $query;
396
+    }
397
+    $r = spip_mysql_query($query, $serveur, $requeter);
398 398
 
399
-	return $r ?: $query;
399
+    return $r ?: $query;
400 400
 }
401 401
 
402 402
 
@@ -413,7 +413,7 @@  discard block
 block discarded – undo
413 413
  * @return string texte du orderby préparé
414 414
  */
415 415
 function spip_mysql_order($orderby) {
416
-	return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
416
+    return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
417 417
 }
418 418
 
419 419
 
@@ -436,26 +436,26 @@  discard block
 block discarded – undo
436 436
  *     Contrainte pour clause WHERE
437 437
  */
438 438
 function calculer_mysql_where($v) {
439
-	if (!is_array($v)) {
440
-		return $v;
441
-	}
442
-
443
-	$op = array_shift($v);
444
-	if (!($n = count($v))) {
445
-		return $op;
446
-	} else {
447
-		$arg = calculer_mysql_where(array_shift($v));
448
-		if ($n == 1) {
449
-			return "$op($arg)";
450
-		} else {
451
-			$arg2 = calculer_mysql_where(array_shift($v));
452
-			if ($n == 2) {
453
-				return "($arg $op $arg2)";
454
-			} else {
455
-				return "($arg $op ($arg2) : $v[0])";
456
-			}
457
-		}
458
-	}
439
+    if (!is_array($v)) {
440
+        return $v;
441
+    }
442
+
443
+    $op = array_shift($v);
444
+    if (!($n = count($v))) {
445
+        return $op;
446
+    } else {
447
+        $arg = calculer_mysql_where(array_shift($v));
448
+        if ($n == 1) {
449
+            return "$op($arg)";
450
+        } else {
451
+            $arg2 = calculer_mysql_where(array_shift($v));
452
+            if ($n == 2) {
453
+                return "($arg $op $arg2)";
454
+            } else {
455
+                return "($arg $op ($arg2) : $v[0])";
456
+            }
457
+        }
458
+    }
459 459
 }
460 460
 
461 461
 /**
@@ -470,21 +470,21 @@  discard block
 block discarded – undo
470 470
  * @return string            texte de l'expression, une partie donc, du texte la requête.
471 471
  */
472 472
 function calculer_mysql_expression($expression, $v, $join = 'AND') {
473
-	if (empty($v)) {
474
-		return '';
475
-	}
476
-
477
-	$exp = "\n$expression ";
478
-
479
-	if (!is_array($v)) {
480
-		return $exp . $v;
481
-	} else {
482
-		if (strtoupper($join) === 'AND') {
483
-			return $exp . join("\n\t$join ", array_map('calculer_mysql_where', $v));
484
-		} else {
485
-			return $exp . join($join, $v);
486
-		}
487
-	}
473
+    if (empty($v)) {
474
+        return '';
475
+    }
476
+
477
+    $exp = "\n$expression ";
478
+
479
+    if (!is_array($v)) {
480
+        return $exp . $v;
481
+    } else {
482
+        if (strtoupper($join) === 'AND') {
483
+            return $exp . join("\n\t$join ", array_map('calculer_mysql_where', $v));
484
+        } else {
485
+            return $exp . join($join, $v);
486
+        }
487
+    }
488 488
 }
489 489
 
490 490
 
@@ -495,26 +495,26 @@  discard block
 block discarded – undo
495 495
  * @return string Sélection de colonnes pour une clause SELECT
496 496
  */
497 497
 function spip_mysql_select_as($args) {
498
-	$res = '';
499
-	foreach ($args as $k => $v) {
500
-		if (substr($k, -1) == '@') {
501
-			// c'est une jointure qui se refere au from precedent
502
-			// pas de virgule
503
-			$res .= '  ' . $v;
504
-		} else {
505
-			if (!is_numeric($k)) {
506
-				$p = strpos($v, ' ');
507
-				if ($p) {
508
-					$v = substr($v, 0, $p) . " AS `$k`" . substr($v, $p);
509
-				} else {
510
-					$v .= " AS `$k`";
511
-				}
512
-			}
513
-			$res .= ', ' . $v;
514
-		}
515
-	}
516
-
517
-	return substr($res, 2);
498
+    $res = '';
499
+    foreach ($args as $k => $v) {
500
+        if (substr($k, -1) == '@') {
501
+            // c'est une jointure qui se refere au from precedent
502
+            // pas de virgule
503
+            $res .= '  ' . $v;
504
+        } else {
505
+            if (!is_numeric($k)) {
506
+                $p = strpos($v, ' ');
507
+                if ($p) {
508
+                    $v = substr($v, 0, $p) . " AS `$k`" . substr($v, $p);
509
+                } else {
510
+                    $v .= " AS `$k`";
511
+                }
512
+            }
513
+            $res .= ', ' . $v;
514
+        }
515
+    }
516
+
517
+    return substr($res, 2);
518 518
 }
519 519
 
520 520
 
@@ -539,58 +539,58 @@  discard block
 block discarded – undo
539 539
  */
540 540
 function _mysql_traite_query($query, $db = '', $prefixe = '', $echappe_textes = true) {
541 541
 
542
-	if ($GLOBALS['mysql_rappel_nom_base'] and $db) {
543
-		$pref = '`' . $db . '`.';
544
-	} else {
545
-		$pref = '';
546
-	}
547
-
548
-	if ($prefixe) {
549
-		$pref .= $prefixe . '_';
550
-	}
551
-
552
-	if (!preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) {
553
-		$suite = '';
554
-	} else {
555
-		$suite = strstr($query, (string) $regs[0]);
556
-		$query = substr($query, 0, -strlen($suite));
557
-		// propager le prefixe en cas de requete imbriquee
558
-		// il faut alors echapper les chaine avant de le faire, pour ne pas risquer de
559
-		// modifier une requete qui est en fait juste du texte dans un champ
560
-		if (stripos($suite, 'SELECT') !== false) {
561
-			if ($echappe_textes) {
562
-				[$suite_echap, $textes] = query_echappe_textes($suite);
563
-			}
564
-			else {
565
-				$suite_echap = $suite;
566
-			}
567
-			if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite_echap, $r)) {
568
-				$suite_echap = $r[1] . _mysql_traite_query($r[2], $db, $prefixe, false);
569
-				if ($echappe_textes) {
570
-					$suite = query_reinjecte_textes($suite_echap, $textes);
571
-				}
572
-				else {
573
-					$suite = $suite_echap;
574
-				}
575
-			}
576
-		}
577
-	}
578
-	$r = preg_replace(_SQL_PREFIXE_TABLE_MYSQL, '\1' . $pref, $query) . $suite;
579
-
580
-	// en option, remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
581
-	// remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
582
-	if (
583
-		defined('_MYSQL_NOPLANES')
584
-		and _MYSQL_NOPLANES
585
-		and !empty($GLOBALS['meta']['charset_sql_connexion'])
586
-		and $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
587
-	) {
588
-		include_spip('inc/charsets');
589
-		$r = utf8_noplanes($r);
590
-	}
591
-
592
-	#spip_log("_mysql_traite_query: " . substr($r,0, 50) . ".... $db, $prefixe", _LOG_DEBUG);
593
-	return $r;
542
+    if ($GLOBALS['mysql_rappel_nom_base'] and $db) {
543
+        $pref = '`' . $db . '`.';
544
+    } else {
545
+        $pref = '';
546
+    }
547
+
548
+    if ($prefixe) {
549
+        $pref .= $prefixe . '_';
550
+    }
551
+
552
+    if (!preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) {
553
+        $suite = '';
554
+    } else {
555
+        $suite = strstr($query, (string) $regs[0]);
556
+        $query = substr($query, 0, -strlen($suite));
557
+        // propager le prefixe en cas de requete imbriquee
558
+        // il faut alors echapper les chaine avant de le faire, pour ne pas risquer de
559
+        // modifier une requete qui est en fait juste du texte dans un champ
560
+        if (stripos($suite, 'SELECT') !== false) {
561
+            if ($echappe_textes) {
562
+                [$suite_echap, $textes] = query_echappe_textes($suite);
563
+            }
564
+            else {
565
+                $suite_echap = $suite;
566
+            }
567
+            if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite_echap, $r)) {
568
+                $suite_echap = $r[1] . _mysql_traite_query($r[2], $db, $prefixe, false);
569
+                if ($echappe_textes) {
570
+                    $suite = query_reinjecte_textes($suite_echap, $textes);
571
+                }
572
+                else {
573
+                    $suite = $suite_echap;
574
+                }
575
+            }
576
+        }
577
+    }
578
+    $r = preg_replace(_SQL_PREFIXE_TABLE_MYSQL, '\1' . $pref, $query) . $suite;
579
+
580
+    // en option, remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
581
+    // remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
582
+    if (
583
+        defined('_MYSQL_NOPLANES')
584
+        and _MYSQL_NOPLANES
585
+        and !empty($GLOBALS['meta']['charset_sql_connexion'])
586
+        and $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
587
+    ) {
588
+        include_spip('inc/charsets');
589
+        $r = utf8_noplanes($r);
590
+    }
591
+
592
+    #spip_log("_mysql_traite_query: " . substr($r,0, 50) . ".... $db, $prefixe", _LOG_DEBUG);
593
+    return $r;
594 594
 }
595 595
 
596 596
 /**
@@ -608,17 +608,17 @@  discard block
 block discarded – undo
608 608
  *     - False en cas d'erreur.
609 609
  **/
610 610
 function spip_mysql_selectdb($db, $serveur = '', $requeter = true) {
611
-	$link = _mysql_link($serveur);
612
-	try {
613
-		$ok = mysqli_select_db($link, $db);
614
-	} catch (\mysqli_sql_exception $e) {
615
-		$ok = false;
616
-	}
617
-	if (!$ok) {
618
-		spip_log('Echec mysqli_selectdb. Erreur : ' . mysqli_error($link), 'mysql.' . _LOG_CRITIQUE);
619
-	}
620
-
621
-	return $ok;
611
+    $link = _mysql_link($serveur);
612
+    try {
613
+        $ok = mysqli_select_db($link, $db);
614
+    } catch (\mysqli_sql_exception $e) {
615
+        $ok = false;
616
+    }
617
+    if (!$ok) {
618
+        spip_log('Echec mysqli_selectdb. Erreur : ' . mysqli_error($link), 'mysql.' . _LOG_CRITIQUE);
619
+    }
620
+
621
+    return $ok;
622 622
 }
623 623
 
624 624
 
@@ -639,14 +639,14 @@  discard block
 block discarded – undo
639 639
  *     Liste de noms de bases de données
640 640
  **/
641 641
 function spip_mysql_listdbs($serveur = '', $requeter = true) {
642
-	$dbs = [];
643
-	if ($res = spip_mysql_query('SHOW DATABASES', $serveur)) {
644
-		while ($row = mysqli_fetch_assoc($res)) {
645
-			$dbs[] = $row['Database'];
646
-		}
647
-	}
648
-
649
-	return $dbs;
642
+    $dbs = [];
643
+    if ($res = spip_mysql_query('SHOW DATABASES', $serveur)) {
644
+        while ($row = mysqli_fetch_assoc($res)) {
645
+            $dbs[] = $row['Database'];
646
+        }
647
+    }
648
+
649
+    return $dbs;
650 650
 }
651 651
 
652 652
 
@@ -669,73 +669,73 @@  discard block
 block discarded – undo
669 669
  *     - true si la requête réussie, false sinon.
670 670
  */
671 671
 function spip_mysql_create(
672
-	$nom,
673
-	$champs,
674
-	$cles,
675
-	$autoinc = false,
676
-	$temporary = false,
677
-	$serveur = '',
678
-	$requeter = true
672
+    $nom,
673
+    $champs,
674
+    $cles,
675
+    $autoinc = false,
676
+    $temporary = false,
677
+    $serveur = '',
678
+    $requeter = true
679 679
 ) {
680 680
 
681
-	$query = '';
682
-	$keys = '';
683
-	$s = '';
684
-	$p = '';
685
-
686
-	// certains plugins declarent les tables  (permet leur inclusion dans le dump)
687
-	// sans les renseigner (laisse le compilo recuperer la description)
688
-	if (!is_array($champs) || !is_array($cles)) {
689
-		return;
690
-	}
691
-
692
-	$res = spip_mysql_query('SELECT version() as v', $serveur);
693
-	if (($row = mysqli_fetch_array($res)) && (version_compare($row['v'], '5.0', '>='))) {
694
-		spip_mysql_query("SET sql_mode=''", $serveur);
695
-	}
696
-
697
-	foreach ($cles as $k => $v) {
698
-		$keys .= "$s\n\t\t$k ($v)";
699
-		if ($k == 'PRIMARY KEY') {
700
-			$p = $v;
701
-		}
702
-		$s = ',';
703
-	}
704
-	$s = '';
705
-
706
-	$character_set = '';
707
-	if (@$GLOBALS['meta']['charset_sql_base']) {
708
-		$character_set .= ' CHARACTER SET ' . $GLOBALS['meta']['charset_sql_base'];
709
-	}
710
-	if (@$GLOBALS['meta']['charset_collation_sql_base']) {
711
-		$character_set .= ' COLLATE ' . $GLOBALS['meta']['charset_collation_sql_base'];
712
-	}
713
-
714
-	foreach ($champs as $k => $v) {
715
-		$v = _mysql_remplacements_definitions_table($v);
716
-		if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i', $v, $defs)) {
717
-			if (
718
-				preg_match(',(char|text),i', $defs[1])
719
-				and !preg_match(',(binary|CHARACTER|COLLATE),i', $v)
720
-			) {
721
-				$v = $defs[1] . $character_set . ' ' . substr($v, strlen($defs[1]));
722
-			}
723
-		}
724
-
725
-		$query .= "$s\n\t\t$k $v"
726
-			. (($autoinc && ($p == $k) && preg_match(',\b(big|small|medium)?int\b,i', $v))
727
-				? ' auto_increment'
728
-				: ''
729
-			);
730
-		$s = ',';
731
-	}
732
-	$temporary = $temporary ? 'TEMPORARY' : '';
733
-	$q = "CREATE $temporary TABLE IF NOT EXISTS $nom ($query" . ($keys ? ",$keys" : '') . ')'
734
-		. (defined('_MYSQL_ENGINE') ? ' ENGINE=' . _MYSQL_ENGINE : '')
735
-		. ($character_set ? " DEFAULT $character_set" : '')
736
-		. "\n";
737
-
738
-	return spip_mysql_query($q, $serveur);
681
+    $query = '';
682
+    $keys = '';
683
+    $s = '';
684
+    $p = '';
685
+
686
+    // certains plugins declarent les tables  (permet leur inclusion dans le dump)
687
+    // sans les renseigner (laisse le compilo recuperer la description)
688
+    if (!is_array($champs) || !is_array($cles)) {
689
+        return;
690
+    }
691
+
692
+    $res = spip_mysql_query('SELECT version() as v', $serveur);
693
+    if (($row = mysqli_fetch_array($res)) && (version_compare($row['v'], '5.0', '>='))) {
694
+        spip_mysql_query("SET sql_mode=''", $serveur);
695
+    }
696
+
697
+    foreach ($cles as $k => $v) {
698
+        $keys .= "$s\n\t\t$k ($v)";
699
+        if ($k == 'PRIMARY KEY') {
700
+            $p = $v;
701
+        }
702
+        $s = ',';
703
+    }
704
+    $s = '';
705
+
706
+    $character_set = '';
707
+    if (@$GLOBALS['meta']['charset_sql_base']) {
708
+        $character_set .= ' CHARACTER SET ' . $GLOBALS['meta']['charset_sql_base'];
709
+    }
710
+    if (@$GLOBALS['meta']['charset_collation_sql_base']) {
711
+        $character_set .= ' COLLATE ' . $GLOBALS['meta']['charset_collation_sql_base'];
712
+    }
713
+
714
+    foreach ($champs as $k => $v) {
715
+        $v = _mysql_remplacements_definitions_table($v);
716
+        if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i', $v, $defs)) {
717
+            if (
718
+                preg_match(',(char|text),i', $defs[1])
719
+                and !preg_match(',(binary|CHARACTER|COLLATE),i', $v)
720
+            ) {
721
+                $v = $defs[1] . $character_set . ' ' . substr($v, strlen($defs[1]));
722
+            }
723
+        }
724
+
725
+        $query .= "$s\n\t\t$k $v"
726
+            . (($autoinc && ($p == $k) && preg_match(',\b(big|small|medium)?int\b,i', $v))
727
+                ? ' auto_increment'
728
+                : ''
729
+            );
730
+        $s = ',';
731
+    }
732
+    $temporary = $temporary ? 'TEMPORARY' : '';
733
+    $q = "CREATE $temporary TABLE IF NOT EXISTS $nom ($query" . ($keys ? ",$keys" : '') . ')'
734
+        . (defined('_MYSQL_ENGINE') ? ' ENGINE=' . _MYSQL_ENGINE : '')
735
+        . ($character_set ? " DEFAULT $character_set" : '')
736
+        . "\n";
737
+
738
+    return spip_mysql_query($q, $serveur);
739 739
 }
740 740
 
741 741
 
@@ -748,25 +748,25 @@  discard block
 block discarded – undo
748 748
  *     Définition SQL adaptée pour MySQL d'un champ de table
749 749
  */
750 750
 function _mysql_remplacements_definitions_table($query) {
751
-	// quelques remplacements
752
-	$num = '(\s*\([0-9]*\))?';
753
-	$enum = '(\s*\([^\)]*\))?';
754
-
755
-	$remplace = [
756
-		'/VARCHAR(\s*[^\s\(])/is' => 'VARCHAR(255)\\1',
757
-		'/^TIMESTAMP($| NULL DEFAULT NULL)/is' => 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
758
-	];
759
-
760
-	if (is_string($query)) {
761
-		$query = preg_replace(array_keys($remplace), $remplace, $query);
762
-	} elseif (is_array($query)) {
763
-		$keys = array_keys($remplace);
764
-		foreach ($query as $k => $q) {
765
-			$query[$k] = preg_replace($keys, $remplace, $q);
766
-		}
767
-	}
768
-
769
-	return $query;
751
+    // quelques remplacements
752
+    $num = '(\s*\([0-9]*\))?';
753
+    $enum = '(\s*\([^\)]*\))?';
754
+
755
+    $remplace = [
756
+        '/VARCHAR(\s*[^\s\(])/is' => 'VARCHAR(255)\\1',
757
+        '/^TIMESTAMP($| NULL DEFAULT NULL)/is' => 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
758
+    ];
759
+
760
+    if (is_string($query)) {
761
+        $query = preg_replace(array_keys($remplace), $remplace, $query);
762
+    } elseif (is_array($query)) {
763
+        $keys = array_keys($remplace);
764
+        foreach ($query as $k => $q) {
765
+            $query[$k] = preg_replace($keys, $remplace, $q);
766
+        }
767
+    }
768
+
769
+    return $query;
770 770
 }
771 771
 
772 772
 
@@ -779,7 +779,7 @@  discard block
 block discarded – undo
779 779
  * @return bool true si la base est créee.
780 780
  **/
781 781
 function spip_mysql_create_base($nom, $serveur = '', $requeter = true) {
782
-	return spip_mysql_query("CREATE DATABASE `$nom`", $serveur, $requeter);
782
+    return spip_mysql_query("CREATE DATABASE `$nom`", $serveur, $requeter);
783 783
 }
784 784
 
785 785
 
@@ -800,19 +800,19 @@  discard block
 block discarded – undo
800 800
  *     - string texte de la requête si $requeter vaut false
801 801
  */
802 802
 function spip_mysql_create_view($nom, $query_select, $serveur = '', $requeter = true) {
803
-	if (!$query_select) {
804
-		return false;
805
-	}
806
-	// vue deja presente
807
-	if (sql_showtable($nom, false, $serveur)) {
808
-		spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", _LOG_ERREUR);
803
+    if (!$query_select) {
804
+        return false;
805
+    }
806
+    // vue deja presente
807
+    if (sql_showtable($nom, false, $serveur)) {
808
+        spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", _LOG_ERREUR);
809 809
 
810
-		return false;
811
-	}
810
+        return false;
811
+    }
812 812
 
813
-	$query = "CREATE VIEW $nom AS " . $query_select;
813
+    $query = "CREATE VIEW $nom AS " . $query_select;
814 814
 
815
-	return spip_mysql_query($query, $serveur, $requeter);
815
+    return spip_mysql_query($query, $serveur, $requeter);
816 816
 }
817 817
 
818 818
 
@@ -828,11 +828,11 @@  discard block
 block discarded – undo
828 828
  *     - true si la requête a réussie, false sinon
829 829
  */
830 830
 function spip_mysql_drop_table($table, $exist = '', $serveur = '', $requeter = true) {
831
-	if ($exist) {
832
-		$exist = ' IF EXISTS';
833
-	}
831
+    if ($exist) {
832
+        $exist = ' IF EXISTS';
833
+    }
834 834
 
835
-	return spip_mysql_query("DROP TABLE$exist $table", $serveur, $requeter);
835
+    return spip_mysql_query("DROP TABLE$exist $table", $serveur, $requeter);
836 836
 }
837 837
 
838 838
 /**
@@ -847,11 +847,11 @@  discard block
 block discarded – undo
847 847
  *     - true si la requête a réussie, false sinon
848 848
  */
849 849
 function spip_mysql_drop_view($view, $exist = '', $serveur = '', $requeter = true) {
850
-	if ($exist) {
851
-		$exist = ' IF EXISTS';
852
-	}
850
+    if ($exist) {
851
+        $exist = ' IF EXISTS';
852
+    }
853 853
 
854
-	return spip_mysql_query("DROP VIEW$exist $view", $serveur, $requeter);
854
+    return spip_mysql_query("DROP VIEW$exist $view", $serveur, $requeter);
855 855
 }
856 856
 
857 857
 /**
@@ -868,7 +868,7 @@  discard block
 block discarded – undo
868 868
  *     Ressource à utiliser avec sql_fetch()
869 869
  **/
870 870
 function spip_mysql_showbase($match, $serveur = '', $requeter = true) {
871
-	return spip_mysql_query('SHOW TABLES LIKE ' . _q($match), $serveur, $requeter);
871
+    return spip_mysql_query('SHOW TABLES LIKE ' . _q($match), $serveur, $requeter);
872 872
 }
873 873
 
874 874
 /**
@@ -884,18 +884,18 @@  discard block
 block discarded – undo
884 884
  *     - true si la requête a réussie, false sinon
885 885
  */
886 886
 function spip_mysql_repair($table, $serveur = '', $requeter = true) {
887
-	$table_status = spip_mysql_fetch(spip_mysql_query('SHOW TABLE STATUS WHERE Name = ' . _q($table), $serveur, true));
888
-	$engine = $table_status['Engine'];
889
-	if ($engine == 'InnoDB') {
890
-		if (spip_mysql_alter("TABLE $table ENGINE = InnoDB", $serveur, $requeter)) {
891
-			return [' OK '];
892
-		}
893
-	} elseif ($engine == 'MyISAM') {
894
-		return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
895
-	} else {
896
-		spip_log("spip_mysql_repair impossible pour la table $table engine $engine", 'mysql.' . _LOG_DEBUG);
897
-	}
898
-	return false;
887
+    $table_status = spip_mysql_fetch(spip_mysql_query('SHOW TABLE STATUS WHERE Name = ' . _q($table), $serveur, true));
888
+    $engine = $table_status['Engine'];
889
+    if ($engine == 'InnoDB') {
890
+        if (spip_mysql_alter("TABLE $table ENGINE = InnoDB", $serveur, $requeter)) {
891
+            return [' OK '];
892
+        }
893
+    } elseif ($engine == 'MyISAM') {
894
+        return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
895
+    } else {
896
+        spip_log("spip_mysql_repair impossible pour la table $table engine $engine", 'mysql.' . _LOG_DEBUG);
897
+    }
898
+    return false;
899 899
 }
900 900
 
901 901
 /**
@@ -913,12 +913,12 @@  discard block
 block discarded – undo
913 913
  *     - string : requete sql, si $requeter = true
914 914
  **/
915 915
 function spip_mysql_table_exists(string $table, $serveur = '', $requeter = true) {
916
-	$r = spip_mysql_query('SHOW TABLES LIKE ' . _q($table), $serveur, $requeter);
917
-	if (!$requeter) {
918
-		return $r;
919
-	}
920
-	$res = spip_mysql_fetch($r);
921
-	return (bool) $res;
916
+    $r = spip_mysql_query('SHOW TABLES LIKE ' . _q($table), $serveur, $requeter);
917
+    if (!$requeter) {
918
+        return $r;
919
+    }
920
+    $res = spip_mysql_fetch($r);
921
+    return (bool) $res;
922 922
 }
923 923
 
924 924
 define('_MYSQL_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
@@ -941,86 +941,86 @@  discard block
 block discarded – undo
941 941
  *     - array description de la table sinon
942 942
  */
943 943
 function spip_mysql_showtable($nom_table, $serveur = '', $requeter = true) {
944
-	$s = spip_mysql_query("SHOW CREATE TABLE `$nom_table`", $serveur, $requeter);
945
-	if (!$s) {
946
-		return '';
947
-	}
948
-	if (!$requeter) {
949
-		return $s;
950
-	}
951
-
952
-	[, $a] = mysqli_fetch_array($s, MYSQLI_NUM);
953
-	if (preg_match(_MYSQL_RE_SHOW_TABLE, $a, $r)) {
954
-		$desc = $r[1];
955
-		// extraction d'une KEY éventuelle en prenant garde de ne pas
956
-		// relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
957
-		if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
958
-			$namedkeys = $r[2];
959
-			$desc = $r[1];
960
-		} else {
961
-			$namedkeys = '';
962
-		}
963
-
964
-		$fields = [];
965
-		foreach (preg_split('/,\s*`/', $desc) as $v) {
966
-			preg_match('/^\s*`?([^`]*)`\s*(.*)/', $v, $r);
967
-			$fields[strtolower($r[1])] = $r[2];
968
-		}
969
-		$keys = [];
970
-
971
-		foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
972
-			if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
973
-				$k = str_replace('`', '', trim($r[1]));
974
-				$t = strtolower(str_replace('`', '', $r[2]));
975
-				if ($k && !isset($keys[$k])) {
976
-					$keys[$k] = $t;
977
-				} else {
978
-					$keys[] = $t;
979
-				}
980
-			}
981
-		}
982
-		spip_mysql_free($s);
983
-
984
-		return ['field' => $fields, 'key' => $keys];
985
-	}
986
-
987
-	$res = spip_mysql_query("SHOW COLUMNS FROM `$nom_table`", $serveur);
988
-	if ($res) {
989
-		$nfields = [];
990
-		$nkeys = [];
991
-		while ($val = spip_mysql_fetch($res)) {
992
-			$nfields[$val['Field']] = $val['Type'];
993
-			if ($val['Null'] == 'NO') {
994
-				$nfields[$val['Field']] .= ' NOT NULL';
995
-			}
996
-			if ($val['Default'] === '0' || $val['Default']) {
997
-				if (preg_match('/[A-Z_]/', $val['Default'])) {
998
-					$nfields[$val['Field']] .= ' DEFAULT ' . $val['Default'];
999
-				} else {
1000
-					$nfields[$val['Field']] .= " DEFAULT '" . $val['Default'] . "'";
1001
-				}
1002
-			}
1003
-			if ($val['Extra']) {
1004
-				$nfields[$val['Field']] .= ' ' . $val['Extra'];
1005
-			}
1006
-			if ($val['Key'] == 'PRI') {
1007
-				$nkeys['PRIMARY KEY'] = $val['Field'];
1008
-			} else {
1009
-				if ($val['Key'] == 'MUL') {
1010
-					$nkeys['KEY ' . $val['Field']] = $val['Field'];
1011
-				} else {
1012
-					if ($val['Key'] == 'UNI') {
1013
-						$nkeys['UNIQUE KEY ' . $val['Field']] = $val['Field'];
1014
-					}
1015
-				}
1016
-			}
1017
-		}
1018
-		spip_mysql_free($res);
1019
-
1020
-		return ['field' => $nfields, 'key' => $nkeys];
1021
-	}
1022
-
1023
-	return '';
944
+    $s = spip_mysql_query("SHOW CREATE TABLE `$nom_table`", $serveur, $requeter);
945
+    if (!$s) {
946
+        return '';
947
+    }
948
+    if (!$requeter) {
949
+        return $s;
950
+    }
951
+
952
+    [, $a] = mysqli_fetch_array($s, MYSQLI_NUM);
953
+    if (preg_match(_MYSQL_RE_SHOW_TABLE, $a, $r)) {
954
+        $desc = $r[1];
955
+        // extraction d'une KEY éventuelle en prenant garde de ne pas
956
+        // relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
957
+        if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
958
+            $namedkeys = $r[2];
959
+            $desc = $r[1];
960
+        } else {
961
+            $namedkeys = '';
962
+        }
963
+
964
+        $fields = [];
965
+        foreach (preg_split('/,\s*`/', $desc) as $v) {
966
+            preg_match('/^\s*`?([^`]*)`\s*(.*)/', $v, $r);
967
+            $fields[strtolower($r[1])] = $r[2];
968
+        }
969
+        $keys = [];
970
+
971
+        foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
972
+            if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
973
+                $k = str_replace('`', '', trim($r[1]));
974
+                $t = strtolower(str_replace('`', '', $r[2]));
975
+                if ($k && !isset($keys[$k])) {
976
+                    $keys[$k] = $t;
977
+                } else {
978
+                    $keys[] = $t;
979
+                }
980
+            }
981
+        }
982
+        spip_mysql_free($s);
983
+
984
+        return ['field' => $fields, 'key' => $keys];
985
+    }
986
+
987
+    $res = spip_mysql_query("SHOW COLUMNS FROM `$nom_table`", $serveur);
988
+    if ($res) {
989
+        $nfields = [];
990
+        $nkeys = [];
991
+        while ($val = spip_mysql_fetch($res)) {
992
+            $nfields[$val['Field']] = $val['Type'];
993
+            if ($val['Null'] == 'NO') {
994
+                $nfields[$val['Field']] .= ' NOT NULL';
995
+            }
996
+            if ($val['Default'] === '0' || $val['Default']) {
997
+                if (preg_match('/[A-Z_]/', $val['Default'])) {
998
+                    $nfields[$val['Field']] .= ' DEFAULT ' . $val['Default'];
999
+                } else {
1000
+                    $nfields[$val['Field']] .= " DEFAULT '" . $val['Default'] . "'";
1001
+                }
1002
+            }
1003
+            if ($val['Extra']) {
1004
+                $nfields[$val['Field']] .= ' ' . $val['Extra'];
1005
+            }
1006
+            if ($val['Key'] == 'PRI') {
1007
+                $nkeys['PRIMARY KEY'] = $val['Field'];
1008
+            } else {
1009
+                if ($val['Key'] == 'MUL') {
1010
+                    $nkeys['KEY ' . $val['Field']] = $val['Field'];
1011
+                } else {
1012
+                    if ($val['Key'] == 'UNI') {
1013
+                        $nkeys['UNIQUE KEY ' . $val['Field']] = $val['Field'];
1014
+                    }
1015
+                }
1016
+            }
1017
+        }
1018
+        spip_mysql_free($res);
1019
+
1020
+        return ['field' => $nfields, 'key' => $nkeys];
1021
+    }
1022
+
1023
+    return '';
1024 1024
 }
1025 1025
 
1026 1026
 
@@ -1039,13 +1039,13 @@  discard block
 block discarded – undo
1039 1039
  *     - false Erreur
1040 1040
  */
1041 1041
 function spip_mysql_fetch($r, $t = '', $serveur = '', $requeter = true) {
1042
-	if (!$t) {
1043
-		$t = \MYSQLI_ASSOC;
1044
-	}
1045
-	if ($r) {
1046
-		return mysqli_fetch_array($r, $t);
1047
-	}
1048
-	return false;
1042
+    if (!$t) {
1043
+        $t = \MYSQLI_ASSOC;
1044
+    }
1045
+    if ($r) {
1046
+        return mysqli_fetch_array($r, $t);
1047
+    }
1048
+    return false;
1049 1049
 }
1050 1050
 
1051 1051
 /**
@@ -1058,10 +1058,10 @@  discard block
 block discarded – undo
1058 1058
  * @return bool True si déplacement réussi, false sinon.
1059 1059
  **/
1060 1060
 function spip_mysql_seek($r, $row_number, $serveur = '', $requeter = true) {
1061
-	if ($r and mysqli_num_rows($r)) {
1062
-		return mysqli_data_seek($r, $row_number);
1063
-	}
1064
-	return false;
1061
+    if ($r and mysqli_num_rows($r)) {
1062
+        return mysqli_data_seek($r, $row_number);
1063
+    }
1064
+    return false;
1065 1065
 }
1066 1066
 
1067 1067
 
@@ -1079,26 +1079,26 @@  discard block
 block discarded – undo
1079 1079
  *     - int Nombre de lignes (0 si la requête n'a pas réussie)
1080 1080
  **/
1081 1081
 function spip_mysql_countsel(
1082
-	$from = [],
1083
-	$where = [],
1084
-	$groupby = '',
1085
-	$having = [],
1086
-	$serveur = '',
1087
-	$requeter = true
1082
+    $from = [],
1083
+    $where = [],
1084
+    $groupby = '',
1085
+    $having = [],
1086
+    $serveur = '',
1087
+    $requeter = true
1088 1088
 ) {
1089
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
1090
-
1091
-	$r = spip_mysql_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
1092
-	if (!$requeter) {
1093
-		return $r;
1094
-	}
1095
-	if (!$r instanceof mysqli_result) {
1096
-		return 0;
1097
-	}
1098
-	[$c] = mysqli_fetch_array($r, MYSQLI_NUM);
1099
-	mysqli_free_result($r);
1100
-
1101
-	return intval($c);
1089
+    $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
1090
+
1091
+    $r = spip_mysql_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
1092
+    if (!$requeter) {
1093
+        return $r;
1094
+    }
1095
+    if (!$r instanceof mysqli_result) {
1096
+        return 0;
1097
+    }
1098
+    [$c] = mysqli_fetch_array($r, MYSQLI_NUM);
1099
+    mysqli_free_result($r);
1100
+
1101
+    return intval($c);
1102 1102
 }
1103 1103
 
1104 1104
 
@@ -1121,16 +1121,16 @@  discard block
 block discarded – undo
1121 1121
  *     Erreur eventuelle
1122 1122
  **/
1123 1123
 function spip_mysql_error($query = '', $serveur = '', $requeter = true) {
1124
-	$link = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]['link'];
1125
-	$s = mysqli_error($link);
1126
-	if ($s) {
1127
-		$trace = debug_backtrace();
1128
-		if ($trace[0]['function'] != 'spip_mysql_error') {
1129
-			spip_log("$s - $query - " . sql_error_backtrace(), 'mysql.' . _LOG_ERREUR);
1130
-		}
1131
-	}
1132
-
1133
-	return $s;
1124
+    $link = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]['link'];
1125
+    $s = mysqli_error($link);
1126
+    if ($s) {
1127
+        $trace = debug_backtrace();
1128
+        if ($trace[0]['function'] != 'spip_mysql_error') {
1129
+            spip_log("$s - $query - " . sql_error_backtrace(), 'mysql.' . _LOG_ERREUR);
1130
+        }
1131
+    }
1132
+
1133
+    return $s;
1134 1134
 }
1135 1135
 
1136 1136
 
@@ -1145,18 +1145,18 @@  discard block
 block discarded – undo
1145 1145
  *     0, pas d'erreur. Autre, numéro de l'erreur.
1146 1146
  **/
1147 1147
 function spip_mysql_errno($serveur = '', $requeter = true) {
1148
-	$link = $GLOBALS['connexions'][$serveur ?: 0]['link'];
1149
-	$s = mysqli_errno($link);
1150
-	// 2006 MySQL server has gone away
1151
-	// 2013 Lost connection to MySQL server during query
1152
-	if (in_array($s, [2006, 2013])) {
1153
-		define('spip_interdire_cache', true);
1154
-	}
1155
-	if ($s) {
1156
-		spip_log("Erreur mysql $s", _LOG_ERREUR);
1157
-	}
1158
-
1159
-	return $s;
1148
+    $link = $GLOBALS['connexions'][$serveur ?: 0]['link'];
1149
+    $s = mysqli_errno($link);
1150
+    // 2006 MySQL server has gone away
1151
+    // 2013 Lost connection to MySQL server during query
1152
+    if (in_array($s, [2006, 2013])) {
1153
+        define('spip_interdire_cache', true);
1154
+    }
1155
+    if ($s) {
1156
+        spip_log("Erreur mysql $s", _LOG_ERREUR);
1157
+    }
1158
+
1159
+    return $s;
1160 1160
 }
1161 1161
 
1162 1162
 
@@ -1170,9 +1170,9 @@  discard block
 block discarded – undo
1170 1170
  * @return int               Nombre de lignes
1171 1171
  */
1172 1172
 function spip_mysql_count($r, $serveur = '', $requeter = true) {
1173
-	if ($r) {
1174
-		return mysqli_num_rows($r);
1175
-	}
1173
+    if ($r) {
1174
+        return mysqli_num_rows($r);
1175
+    }
1176 1176
 }
1177 1177
 
1178 1178
 
@@ -1188,11 +1188,11 @@  discard block
 block discarded – undo
1188 1188
  * @return bool              True si réussi
1189 1189
  */
1190 1190
 function spip_mysql_free($r, $serveur = '', $requeter = true) {
1191
-	if ($r instanceof mysqli_result) {
1192
-		mysqli_free_result($r);
1193
-		return true;
1194
-	}
1195
-	return false;
1191
+    if ($r instanceof mysqli_result) {
1192
+        mysqli_free_result($r);
1193
+        return true;
1194
+    }
1195
+    return false;
1196 1196
 }
1197 1197
 
1198 1198
 
@@ -1220,59 +1220,59 @@  discard block
 block discarded – undo
1220 1220
  **/
1221 1221
 function spip_mysql_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true) {
1222 1222
 
1223
-	$e = null;
1224
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1225
-	$link = $connexion['link'];
1226
-	$table = prefixer_table_spip($table, $connexion['prefixe']);
1227
-
1228
-	// remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
1229
-	if (
1230
-		defined('_MYSQL_NOPLANES')
1231
-		and _MYSQL_NOPLANES
1232
-		and !empty($GLOBALS['meta']['charset_sql_connexion'])
1233
-		and $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
1234
-	) {
1235
-		include_spip('inc/charsets');
1236
-		$valeurs = utf8_noplanes($valeurs);
1237
-	}
1238
-
1239
-	$query = "INSERT INTO $table $champs VALUES $valeurs";
1240
-	if (!$requeter) {
1241
-		return $query;
1242
-	}
1243
-
1244
-	if (isset($_GET['var_profile'])) {
1245
-		include_spip('public/tracer');
1246
-		$t = trace_query_start();
1247
-		$e = '';
1248
-	} else {
1249
-		$t = 0;
1250
-	}
1251
-
1252
-	$connexion['last'] = $query;
1253
-	#spip_log($query, 'mysql.'._LOG_DEBUG);
1254
-	$r = false;
1255
-	$insert = false;
1256
-	try {
1257
-		$insert = mysqli_query($link, $query);
1258
-	} catch (\mysqli_sql_exception $e) {
1259
-		spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
1260
-		// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
1261
-		// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
1262
-	}
1263
-	if ($insert) {
1264
-		$r = mysqli_insert_id($link);
1265
-	} else {
1266
-		// Log de l'erreur eventuelle
1267
-		if ($e = spip_mysql_errno($serveur)) {
1268
-			// et du fautif
1269
-			$e .= spip_mysql_error($query, $serveur);
1270
-		}
1271
-	}
1272
-
1273
-	return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
1274
-
1275
-	// return $r ? $r : (($r===0) ? -1 : 0); pb avec le multi-base.
1223
+    $e = null;
1224
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1225
+    $link = $connexion['link'];
1226
+    $table = prefixer_table_spip($table, $connexion['prefixe']);
1227
+
1228
+    // remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
1229
+    if (
1230
+        defined('_MYSQL_NOPLANES')
1231
+        and _MYSQL_NOPLANES
1232
+        and !empty($GLOBALS['meta']['charset_sql_connexion'])
1233
+        and $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
1234
+    ) {
1235
+        include_spip('inc/charsets');
1236
+        $valeurs = utf8_noplanes($valeurs);
1237
+    }
1238
+
1239
+    $query = "INSERT INTO $table $champs VALUES $valeurs";
1240
+    if (!$requeter) {
1241
+        return $query;
1242
+    }
1243
+
1244
+    if (isset($_GET['var_profile'])) {
1245
+        include_spip('public/tracer');
1246
+        $t = trace_query_start();
1247
+        $e = '';
1248
+    } else {
1249
+        $t = 0;
1250
+    }
1251
+
1252
+    $connexion['last'] = $query;
1253
+    #spip_log($query, 'mysql.'._LOG_DEBUG);
1254
+    $r = false;
1255
+    $insert = false;
1256
+    try {
1257
+        $insert = mysqli_query($link, $query);
1258
+    } catch (\mysqli_sql_exception $e) {
1259
+        spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
1260
+        // TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
1261
+        // mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
1262
+    }
1263
+    if ($insert) {
1264
+        $r = mysqli_insert_id($link);
1265
+    } else {
1266
+        // Log de l'erreur eventuelle
1267
+        if ($e = spip_mysql_errno($serveur)) {
1268
+            // et du fautif
1269
+            $e .= spip_mysql_error($query, $serveur);
1270
+        }
1271
+    }
1272
+
1273
+    return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
1274
+
1275
+    // return $r ? $r : (($r===0) ? -1 : 0); pb avec le multi-base.
1276 1276
 }
1277 1277
 
1278 1278
 /**
@@ -1297,26 +1297,26 @@  discard block
 block discarded – undo
1297 1297
  **/
1298 1298
 function spip_mysql_insertq($table, $couples = [], $desc = [], $serveur = '', $requeter = true) {
1299 1299
 
1300
-	if (!$desc) {
1301
-		$desc = description_table($table, $serveur);
1302
-	}
1303
-	if (!$desc) {
1304
-		$couples = [];
1305
-	}
1306
-	$fields = $desc['field'] ?? [];
1307
-
1308
-	foreach ($couples as $champ => $val) {
1309
-		$couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1310
-	}
1311
-
1312
-	return spip_mysql_insert(
1313
-		$table,
1314
-		'(' . join(',', array_keys($couples)) . ')',
1315
-		'(' . join(',', $couples) . ')',
1316
-		$desc,
1317
-		$serveur,
1318
-		$requeter
1319
-	);
1300
+    if (!$desc) {
1301
+        $desc = description_table($table, $serveur);
1302
+    }
1303
+    if (!$desc) {
1304
+        $couples = [];
1305
+    }
1306
+    $fields = $desc['field'] ?? [];
1307
+
1308
+    foreach ($couples as $champ => $val) {
1309
+        $couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1310
+    }
1311
+
1312
+    return spip_mysql_insert(
1313
+        $table,
1314
+        '(' . join(',', array_keys($couples)) . ')',
1315
+        '(' . join(',', $couples) . ')',
1316
+        $desc,
1317
+        $serveur,
1318
+        $requeter
1319
+    );
1320 1320
 }
1321 1321
 
1322 1322
 
@@ -1341,34 +1341,34 @@  discard block
 block discarded – undo
1341 1341
  **/
1342 1342
 function spip_mysql_insertq_multi($table, $tab_couples = [], $desc = [], $serveur = '', $requeter = true) {
1343 1343
 
1344
-	if (!$desc) {
1345
-		$desc = description_table($table, $serveur);
1346
-	}
1347
-	if (!$desc) {
1348
-		$tab_couples = [];
1349
-	}
1350
-	$fields = $desc['field'] ?? [];
1351
-
1352
-	$cles = '(' . join(',', array_keys(reset($tab_couples))) . ')';
1353
-	$valeurs = [];
1354
-	$r = false;
1355
-
1356
-	// Quoter et Inserer par groupes de 100 max pour eviter un debordement de pile
1357
-	foreach ($tab_couples as $couples) {
1358
-		foreach ($couples as $champ => $val) {
1359
-			$couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1360
-		}
1361
-		$valeurs[] = '(' . join(',', $couples) . ')';
1362
-		if (count($valeurs) >= 100) {
1363
-			$r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1364
-			$valeurs = [];
1365
-		}
1366
-	}
1367
-	if (count($valeurs)) {
1368
-		$r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1369
-	}
1370
-
1371
-	return $r; // dans le cas d'une table auto_increment, le dernier insert_id
1344
+    if (!$desc) {
1345
+        $desc = description_table($table, $serveur);
1346
+    }
1347
+    if (!$desc) {
1348
+        $tab_couples = [];
1349
+    }
1350
+    $fields = $desc['field'] ?? [];
1351
+
1352
+    $cles = '(' . join(',', array_keys(reset($tab_couples))) . ')';
1353
+    $valeurs = [];
1354
+    $r = false;
1355
+
1356
+    // Quoter et Inserer par groupes de 100 max pour eviter un debordement de pile
1357
+    foreach ($tab_couples as $couples) {
1358
+        foreach ($couples as $champ => $val) {
1359
+            $couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1360
+        }
1361
+        $valeurs[] = '(' . join(',', $couples) . ')';
1362
+        if (count($valeurs) >= 100) {
1363
+            $r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1364
+            $valeurs = [];
1365
+        }
1366
+    }
1367
+    if (count($valeurs)) {
1368
+        $r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1369
+    }
1370
+
1371
+    return $r; // dans le cas d'une table auto_increment, le dernier insert_id
1372 1372
 }
1373 1373
 
1374 1374
 /**
@@ -1393,20 +1393,20 @@  discard block
 block discarded – undo
1393 1393
  *     - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif
1394 1394
  */
1395 1395
 function spip_mysql_update($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) {
1396
-	$set = [];
1397
-	foreach ($champs as $champ => $val) {
1398
-		$set[] = $champ . "=$val";
1399
-	}
1400
-	if (!empty($set)) {
1401
-		return spip_mysql_query(
1402
-			calculer_mysql_expression('UPDATE', $table, ',')
1403
-			. calculer_mysql_expression('SET', $set, ',')
1404
-			. calculer_mysql_expression('WHERE', $where),
1405
-			$serveur,
1406
-			$requeter
1407
-		);
1408
-	}
1409
-	return false;
1396
+    $set = [];
1397
+    foreach ($champs as $champ => $val) {
1398
+        $set[] = $champ . "=$val";
1399
+    }
1400
+    if (!empty($set)) {
1401
+        return spip_mysql_query(
1402
+            calculer_mysql_expression('UPDATE', $table, ',')
1403
+            . calculer_mysql_expression('SET', $set, ',')
1404
+            . calculer_mysql_expression('WHERE', $where),
1405
+            $serveur,
1406
+            $requeter
1407
+        );
1408
+    }
1409
+    return false;
1410 1410
 }
1411 1411
 
1412 1412
 /**
@@ -1439,29 +1439,29 @@  discard block
 block discarded – undo
1439 1439
  */
1440 1440
 function spip_mysql_updateq($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) {
1441 1441
 
1442
-	if (!$champs) {
1443
-		return;
1444
-	}
1445
-	if (!$desc) {
1446
-		$desc = description_table($table, $serveur);
1447
-	}
1448
-	if (!$desc) {
1449
-		$champs = [];
1450
-	} else {
1451
-		$fields = $desc['field'];
1452
-	}
1453
-	$set = [];
1454
-	foreach ($champs as $champ => $val) {
1455
-		$set[] = $champ . '=' . spip_mysql_cite($val, @$fields[$champ]);
1456
-	}
1457
-
1458
-	return spip_mysql_query(
1459
-		calculer_mysql_expression('UPDATE', $table, ',')
1460
-		. calculer_mysql_expression('SET', $set, ',')
1461
-		. calculer_mysql_expression('WHERE', $where),
1462
-		$serveur,
1463
-		$requeter
1464
-	);
1442
+    if (!$champs) {
1443
+        return;
1444
+    }
1445
+    if (!$desc) {
1446
+        $desc = description_table($table, $serveur);
1447
+    }
1448
+    if (!$desc) {
1449
+        $champs = [];
1450
+    } else {
1451
+        $fields = $desc['field'];
1452
+    }
1453
+    $set = [];
1454
+    foreach ($champs as $champ => $val) {
1455
+        $set[] = $champ . '=' . spip_mysql_cite($val, @$fields[$champ]);
1456
+    }
1457
+
1458
+    return spip_mysql_query(
1459
+        calculer_mysql_expression('UPDATE', $table, ',')
1460
+        . calculer_mysql_expression('SET', $set, ',')
1461
+        . calculer_mysql_expression('WHERE', $where),
1462
+        $serveur,
1463
+        $requeter
1464
+    );
1465 1465
 }
1466 1466
 
1467 1467
 /**
@@ -1477,22 +1477,22 @@  discard block
 block discarded – undo
1477 1477
  *     - false en cas d'erreur.
1478 1478
  **/
1479 1479
 function spip_mysql_delete($table, $where = '', $serveur = '', $requeter = true) {
1480
-	$res = spip_mysql_query(
1481
-		calculer_mysql_expression('DELETE FROM', $table, ',')
1482
-		. calculer_mysql_expression('WHERE', $where),
1483
-		$serveur,
1484
-		$requeter
1485
-	);
1486
-	if (!$requeter) {
1487
-		return $res;
1488
-	}
1489
-	if ($res) {
1490
-		$link = _mysql_link($serveur);
1491
-
1492
-		return mysqli_affected_rows($link);
1493
-	} else {
1494
-		return false;
1495
-	}
1480
+    $res = spip_mysql_query(
1481
+        calculer_mysql_expression('DELETE FROM', $table, ',')
1482
+        . calculer_mysql_expression('WHERE', $where),
1483
+        $serveur,
1484
+        $requeter
1485
+    );
1486
+    if (!$requeter) {
1487
+        return $res;
1488
+    }
1489
+    if ($res) {
1490
+        $link = _mysql_link($serveur);
1491
+
1492
+        return mysqli_affected_rows($link);
1493
+    } else {
1494
+        return false;
1495
+    }
1496 1496
 }
1497 1497
 
1498 1498
 
@@ -1521,10 +1521,10 @@  discard block
 block discarded – undo
1521 1521
  *     - false en cas d'erreur.
1522 1522
  **/
1523 1523
 function spip_mysql_replace($table, $couples, $desc = [], $serveur = '', $requeter = true) {
1524
-	return spip_mysql_query("REPLACE $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1525
-		',',
1526
-		array_map('_q', $couples)
1527
-	) . ')', $serveur, $requeter);
1524
+    return spip_mysql_query("REPLACE $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1525
+        ',',
1526
+        array_map('_q', $couples)
1527
+    ) . ')', $serveur, $requeter);
1528 1528
 }
1529 1529
 
1530 1530
 
@@ -1553,14 +1553,14 @@  discard block
 block discarded – undo
1553 1553
  *     - false en cas d'erreur.
1554 1554
  **/
1555 1555
 function spip_mysql_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $requeter = true) {
1556
-	$cles = '(' . join(',', array_keys($tab_couples[0])) . ')';
1557
-	$valeurs = [];
1558
-	foreach ($tab_couples as $couples) {
1559
-		$valeurs[] = '(' . join(',', array_map('_q', $couples)) . ')';
1560
-	}
1561
-	$valeurs = implode(', ', $valeurs);
1562
-
1563
-	return spip_mysql_query("REPLACE $table $cles VALUES $valeurs", $serveur, $requeter);
1556
+    $cles = '(' . join(',', array_keys($tab_couples[0])) . ')';
1557
+    $valeurs = [];
1558
+    foreach ($tab_couples as $couples) {
1559
+        $valeurs[] = '(' . join(',', array_map('_q', $couples)) . ')';
1560
+    }
1561
+    $valeurs = implode(', ', $valeurs);
1562
+
1563
+    return spip_mysql_query("REPLACE $table $cles VALUES $valeurs", $serveur, $requeter);
1564 1564
 }
1565 1565
 
1566 1566
 
@@ -1575,32 +1575,32 @@  discard block
 block discarded – undo
1575 1575
  * @return string       texte de sélection pour la requête
1576 1576
  */
1577 1577
 function spip_mysql_multi($objet, $lang) {
1578
-	$lengthlang = strlen("[$lang]");
1579
-	$posmulti = 'INSTR(' . $objet . ", '<multi>')";
1580
-	$posfinmulti = 'INSTR(' . $objet . ", '</multi>')";
1581
-	$debutchaine = 'LEFT(' . $objet . ", $posmulti-1)";
1582
-	$finchaine = 'RIGHT(' . $objet . ', CHAR_LENGTH(' . $objet . ") -(7+$posfinmulti))";
1583
-	$chainemulti = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7, $posfinmulti -(7+$posmulti)))";
1584
-	$poslang = "INSTR($chainemulti,'[" . $lang . "]')";
1585
-	$poslang = "IF($poslang=0,INSTR($chainemulti,']')+1,$poslang+$lengthlang)";
1586
-	$chainelang = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7+$poslang-1,$posfinmulti -($posmulti+7+$poslang-1) ))";
1587
-	$posfinlang = 'INSTR(' . $chainelang . ", '[')";
1588
-	$chainelang = "IF($posfinlang>0,LEFT($chainelang,$posfinlang-1),$chainelang)";
1589
-	//$chainelang = "LEFT($chainelang,$posfinlang-1)";
1590
-	$retour = "(TRIM(IF($posmulti = 0 , " .
1591
-		'     TRIM(' . $objet . '), ' .
1592
-		'     CONCAT( ' .
1593
-		"          $debutchaine, " .
1594
-		'          IF( ' .
1595
-		"               $poslang = 0, " .
1596
-		"                     $chainemulti, " .
1597
-		"               $chainelang" .
1598
-		'          ), ' .
1599
-		"          $finchaine" .
1600
-		'     ) ' .
1601
-		'))) AS multi';
1602
-
1603
-	return $retour;
1578
+    $lengthlang = strlen("[$lang]");
1579
+    $posmulti = 'INSTR(' . $objet . ", '<multi>')";
1580
+    $posfinmulti = 'INSTR(' . $objet . ", '</multi>')";
1581
+    $debutchaine = 'LEFT(' . $objet . ", $posmulti-1)";
1582
+    $finchaine = 'RIGHT(' . $objet . ', CHAR_LENGTH(' . $objet . ") -(7+$posfinmulti))";
1583
+    $chainemulti = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7, $posfinmulti -(7+$posmulti)))";
1584
+    $poslang = "INSTR($chainemulti,'[" . $lang . "]')";
1585
+    $poslang = "IF($poslang=0,INSTR($chainemulti,']')+1,$poslang+$lengthlang)";
1586
+    $chainelang = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7+$poslang-1,$posfinmulti -($posmulti+7+$poslang-1) ))";
1587
+    $posfinlang = 'INSTR(' . $chainelang . ", '[')";
1588
+    $chainelang = "IF($posfinlang>0,LEFT($chainelang,$posfinlang-1),$chainelang)";
1589
+    //$chainelang = "LEFT($chainelang,$posfinlang-1)";
1590
+    $retour = "(TRIM(IF($posmulti = 0 , " .
1591
+        '     TRIM(' . $objet . '), ' .
1592
+        '     CONCAT( ' .
1593
+        "          $debutchaine, " .
1594
+        '          IF( ' .
1595
+        "               $poslang = 0, " .
1596
+        "                     $chainemulti, " .
1597
+        "               $chainelang" .
1598
+        '          ), ' .
1599
+        "          $finchaine" .
1600
+        '     ) ' .
1601
+        '))) AS multi';
1602
+
1603
+    return $retour;
1604 1604
 }
1605 1605
 
1606 1606
 /**
@@ -1614,7 +1614,7 @@  discard block
 block discarded – undo
1614 1614
  *     Valeur hexadécimale pour MySQL
1615 1615
  **/
1616 1616
 function spip_mysql_hex($v) {
1617
-	return '0x' . $v;
1617
+    return '0x' . $v;
1618 1618
 }
1619 1619
 
1620 1620
 /**
@@ -1630,15 +1630,15 @@  discard block
 block discarded – undo
1630 1630
  *    Donnée prête à être utilisée par le gestionnaire SQL
1631 1631
  */
1632 1632
 function spip_mysql_quote($v, $type = '') {
1633
-	if (!is_array($v)) {
1634
-		return spip_mysql_cite($v, $type);
1635
-	}
1636
-
1637
-	// si c'est un tableau, le parcourir en propageant le type
1638
-	foreach ($v as $k => $r) {
1639
-		$v[$k] = spip_mysql_quote($r, $type);
1640
-	}
1641
-	return implode(',', $v);
1633
+    if (!is_array($v)) {
1634
+        return spip_mysql_cite($v, $type);
1635
+    }
1636
+
1637
+    // si c'est un tableau, le parcourir en propageant le type
1638
+    foreach ($v as $k => $r) {
1639
+        $v[$k] = spip_mysql_quote($r, $type);
1640
+    }
1641
+    return implode(',', $v);
1642 1642
 }
1643 1643
 
1644 1644
 /**
@@ -1654,18 +1654,18 @@  discard block
 block discarded – undo
1654 1654
  *     Expression SQL
1655 1655
  **/
1656 1656
 function spip_mysql_date_proche($champ, $interval, $unite) {
1657
-	$use_now = ( ($champ === 'maj' or strpos($champ, '.maj')) ? true : false );
1658
-	return '('
1659
-	. $champ
1660
-	. (($interval <= 0) ? '>' : '<')
1661
-	. (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
1662
-	. '('
1663
-	. ($use_now ? 'NOW()' : sql_quote(date('Y-m-d H:i:s')))
1664
-	. ', INTERVAL '
1665
-	. (($interval > 0) ? $interval : (0 - $interval))
1666
-	. ' '
1667
-	. $unite
1668
-	. '))';
1657
+    $use_now = ( ($champ === 'maj' or strpos($champ, '.maj')) ? true : false );
1658
+    return '('
1659
+    . $champ
1660
+    . (($interval <= 0) ? '>' : '<')
1661
+    . (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
1662
+    . '('
1663
+    . ($use_now ? 'NOW()' : sql_quote(date('Y-m-d H:i:s')))
1664
+    . ', INTERVAL '
1665
+    . (($interval > 0) ? $interval : (0 - $interval))
1666
+    . ' '
1667
+    . $unite
1668
+    . '))';
1669 1669
 }
1670 1670
 
1671 1671
 
@@ -1689,7 +1689,7 @@  discard block
 block discarded – undo
1689 1689
  *     Expression de requête SQL
1690 1690
  **/
1691 1691
 function spip_mysql_in($val, $valeurs, $not = '', $serveur = '', $requeter = true) {
1692
-	return "($val $not IN ($valeurs))";
1692
+    return "($val $not IN ($valeurs))";
1693 1693
 }
1694 1694
 
1695 1695
 
@@ -1701,39 +1701,39 @@  discard block
 block discarded – undo
1701 1701
  * @return string|number     texte ou nombre échappé
1702 1702
  */
1703 1703
 function spip_mysql_cite($v, $type) {
1704
-	if (!$type) {
1705
-		if (is_bool($v)) {
1706
-			return strval(intval($v));
1707
-		} elseif (is_numeric($v)) {
1708
-			return strval($v);
1709
-		} elseif ($v === null) {
1710
-			return "''";
1711
-		}
1712
-		return "'" . addslashes($v) . "'";
1713
-	}
1714
-
1715
-	if ($v === null) {
1716
-		if (stripos($type, 'NOT NULL') === false) {
1717
-			// null php se traduit en NULL SQL
1718
-			return 'NULL';
1719
-		} else {
1720
-			return "''";
1721
-		}
1722
-	} elseif (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
1723
-		return $v;
1724
-	} elseif (sql_test_int($type)) {
1725
-		if (
1726
-			is_numeric($v)
1727
-			or ($v and ctype_xdigit(substr($v, 2)) and $v[0] === '0' and $v[1] === 'x')
1728
-		) {
1729
-			return $v;
1730
-		} else {
1731
-			// si pas numerique, forcer le intval
1732
-			return intval($v);
1733
-		}
1734
-	}
1735
-
1736
-	return ("'" . addslashes($v) . "'");
1704
+    if (!$type) {
1705
+        if (is_bool($v)) {
1706
+            return strval(intval($v));
1707
+        } elseif (is_numeric($v)) {
1708
+            return strval($v);
1709
+        } elseif ($v === null) {
1710
+            return "''";
1711
+        }
1712
+        return "'" . addslashes($v) . "'";
1713
+    }
1714
+
1715
+    if ($v === null) {
1716
+        if (stripos($type, 'NOT NULL') === false) {
1717
+            // null php se traduit en NULL SQL
1718
+            return 'NULL';
1719
+        } else {
1720
+            return "''";
1721
+        }
1722
+    } elseif (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
1723
+        return $v;
1724
+    } elseif (sql_test_int($type)) {
1725
+        if (
1726
+            is_numeric($v)
1727
+            or ($v and ctype_xdigit(substr($v, 2)) and $v[0] === '0' and $v[1] === 'x')
1728
+        ) {
1729
+            return $v;
1730
+        } else {
1731
+            // si pas numerique, forcer le intval
1732
+            return intval($v);
1733
+        }
1734
+    }
1735
+
1736
+    return ("'" . addslashes($v) . "'");
1737 1737
 }
1738 1738
 
1739 1739
 /**
@@ -1743,7 +1743,7 @@  discard block
 block discarded – undo
1743 1743
  *     True si on a les fonctions, false sinon
1744 1744
  */
1745 1745
 function spip_versions_mysql() {
1746
-	return function_exists('mysqli_query');
1746
+    return function_exists('mysqli_query');
1747 1747
 }
1748 1748
 
1749 1749
 
@@ -1756,20 +1756,20 @@  discard block
 block discarded – undo
1756 1756
  *     - chaîne : code compilé pour le faire désactiver par SPIP sinon
1757 1757
  */
1758 1758
 function test_rappel_nom_base_mysql($server_db) {
1759
-	$GLOBALS['mysql_rappel_nom_base'] = true;
1760
-	sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1761
-	$ok = spip_query("INSERT INTO spip_meta (nom,valeur) VALUES ('mysql_rappel_nom_base', 'test')", $server_db);
1759
+    $GLOBALS['mysql_rappel_nom_base'] = true;
1760
+    sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1761
+    $ok = spip_query("INSERT INTO spip_meta (nom,valeur) VALUES ('mysql_rappel_nom_base', 'test')", $server_db);
1762 1762
 
1763
-	if ($ok) {
1764
-		sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1763
+    if ($ok) {
1764
+        sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1765 1765
 
1766
-		return '';
1767
-	} else {
1768
-		$GLOBALS['mysql_rappel_nom_base'] = false;
1766
+        return '';
1767
+    } else {
1768
+        $GLOBALS['mysql_rappel_nom_base'] = false;
1769 1769
 
1770
-		return "\$GLOBALS['mysql_rappel_nom_base'] = false; " .
1771
-		"/* echec de test_rappel_nom_base_mysql a l'installation. */\n";
1772
-	}
1770
+        return "\$GLOBALS['mysql_rappel_nom_base'] = false; " .
1771
+        "/* echec de test_rappel_nom_base_mysql a l'installation. */\n";
1772
+    }
1773 1773
 }
1774 1774
 
1775 1775
 /**
@@ -1783,13 +1783,13 @@  discard block
 block discarded – undo
1783 1783
  *     - chaîne : code compilé pour l'indiquer le résultat du test à SPIP
1784 1784
  */
1785 1785
 function test_sql_mode_mysql($server_db) {
1786
-	$res = sql_select('version() as v', '', '', '', '', '', '', $server_db);
1787
-	$row = sql_fetch($res, $server_db);
1788
-	if (version_compare($row['v'], '5.0.0', '>=')) {
1789
-		defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE', true);
1786
+    $res = sql_select('version() as v', '', '', '', '', '', '', $server_db);
1787
+    $row = sql_fetch($res, $server_db);
1788
+    if (version_compare($row['v'], '5.0.0', '>=')) {
1789
+        defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE', true);
1790 1790
 
1791
-		return "defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE',true);\n";
1792
-	}
1791
+        return "defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE',true);\n";
1792
+    }
1793 1793
 
1794
-	return '';
1794
+    return '';
1795 1795
 }
Please login to merge, or discard this patch.
ecrire/inc/surligne.php 1 patch
Indentation   +46 added lines, -46 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\Surligne
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 
21 21
 /**
@@ -34,43 +34,43 @@  discard block
 block discarded – undo
34 34
  *     Page HTML
35 35
  **/
36 36
 function surligner_mots($page, $surcharge_surligne = '') {
37
-	$surlignejs_engines = [
38
-		[
39
-			',' . str_replace(['/', '.'], ['\/', '\.'], $GLOBALS['meta']['adresse_site']) . ',i',
40
-			',recherche=([^&]+),i'
41
-		], //SPIP
42
-		[',^http://(www\.)?google\.,i', ',q=([^&]+),i'], // Google
43
-		[',^http://(www\.)?search\.yahoo\.,i', ',p=([^&]+),i'], // Yahoo
44
-		[',^http://(www\.)?search\.msn\.,i', ',q=([^&]+),i'], // MSN
45
-		[',^http://(www\.)?search\.live\.,i', ',query=([^&]+),i'], // MSN Live
46
-		[',^http://(www\.)?search\.aol\.,i', ',userQuery=([^&]+),i'], // AOL
47
-		[',^http://(www\.)?ask\.com,i', ',q=([^&]+),i'], // Ask.com
48
-		[',^http://(www\.)?altavista\.,i', ',q=([^&]+),i'], // AltaVista
49
-		[',^http://(www\.)?feedster\.,i', ',q=([^&]+),i'], // Feedster
50
-		[',^http://(www\.)?search\.lycos\.,i', ',q=([^&]+),i'], // Lycos
51
-		[',^http://(www\.)?alltheweb\.,i', ',q=([^&]+),i'], // AllTheWeb
52
-		[',^http://(www\.)?technorati\.com,i', ',([^\?\/]+)(?:\?.*)$,i'], // Technorati
53
-	];
37
+    $surlignejs_engines = [
38
+        [
39
+            ',' . str_replace(['/', '.'], ['\/', '\.'], $GLOBALS['meta']['adresse_site']) . ',i',
40
+            ',recherche=([^&]+),i'
41
+        ], //SPIP
42
+        [',^http://(www\.)?google\.,i', ',q=([^&]+),i'], // Google
43
+        [',^http://(www\.)?search\.yahoo\.,i', ',p=([^&]+),i'], // Yahoo
44
+        [',^http://(www\.)?search\.msn\.,i', ',q=([^&]+),i'], // MSN
45
+        [',^http://(www\.)?search\.live\.,i', ',query=([^&]+),i'], // MSN Live
46
+        [',^http://(www\.)?search\.aol\.,i', ',userQuery=([^&]+),i'], // AOL
47
+        [',^http://(www\.)?ask\.com,i', ',q=([^&]+),i'], // Ask.com
48
+        [',^http://(www\.)?altavista\.,i', ',q=([^&]+),i'], // AltaVista
49
+        [',^http://(www\.)?feedster\.,i', ',q=([^&]+),i'], // Feedster
50
+        [',^http://(www\.)?search\.lycos\.,i', ',q=([^&]+),i'], // Lycos
51
+        [',^http://(www\.)?alltheweb\.,i', ',q=([^&]+),i'], // AllTheWeb
52
+        [',^http://(www\.)?technorati\.com,i', ',([^\?\/]+)(?:\?.*)$,i'], // Technorati
53
+    ];
54 54
 
55 55
 
56
-	$ref = $_SERVER['HTTP_REFERER'] ?? null;
57
-	//avoid a js injection
58
-	if ($surcharge_surligne) {
59
-		$surcharge_surligne = preg_replace(",(?<!\\\\)((?:(?>\\\\){2})*)('),", '$1\\\$2', $surcharge_surligne);
60
-		$surcharge_surligne = str_replace('\\', '\\\\', $surcharge_surligne);
61
-		if ($GLOBALS['meta']['charset'] == 'utf-8') {
62
-			include_spip('inc/charsets');
63
-			if (!is_utf8($surcharge_surligne)) {
64
-				$surcharge_surligne = mb_convert_encoding($surcharge_surligne, 'UTF-8', 'ISO-8859-1');
65
-			}
66
-		}
67
-		$surcharge_surligne = preg_replace(',\*$,', '', trim($surcharge_surligne)); # supprimer un * final
68
-	}
69
-	foreach ($surlignejs_engines as $engine) {
70
-		if ($surcharge_surligne || (preg_match($engine[0], $ref) && preg_match($engine[1], $ref))) {
71
-			//good referrer found or var_recherche is not null
72
-			include_spip('inc/filtres');
73
-			$script = "
56
+    $ref = $_SERVER['HTTP_REFERER'] ?? null;
57
+    //avoid a js injection
58
+    if ($surcharge_surligne) {
59
+        $surcharge_surligne = preg_replace(",(?<!\\\\)((?:(?>\\\\){2})*)('),", '$1\\\$2', $surcharge_surligne);
60
+        $surcharge_surligne = str_replace('\\', '\\\\', $surcharge_surligne);
61
+        if ($GLOBALS['meta']['charset'] == 'utf-8') {
62
+            include_spip('inc/charsets');
63
+            if (!is_utf8($surcharge_surligne)) {
64
+                $surcharge_surligne = mb_convert_encoding($surcharge_surligne, 'UTF-8', 'ISO-8859-1');
65
+            }
66
+        }
67
+        $surcharge_surligne = preg_replace(',\*$,', '', trim($surcharge_surligne)); # supprimer un * final
68
+    }
69
+    foreach ($surlignejs_engines as $engine) {
70
+        if ($surcharge_surligne || (preg_match($engine[0], $ref) && preg_match($engine[1], $ref))) {
71
+            //good referrer found or var_recherche is not null
72
+            include_spip('inc/filtres');
73
+            $script = "
74 74
       <script type='text/javascript' src='" . url_absolue(find_in_path('javascript/SearchHighlight.js')) . "'></script>
75 75
       <script type='text/javascript'>
76 76
        var highlighter = function() {
@@ -82,7 +82,7 @@  discard block
 block discarded – undo
82 82
             engines:[/^" . str_replace(['/', '.'], ['\/', '\.'], $GLOBALS['meta']['adresse_site']) . "/i,/recherche=([^&]+)/i],
83 83
             highlight:'.surlignable',
84 84
             nohighlight:'.pas_surlignable'" .
85
-				($surcharge_surligne ? ",
85
+                ($surcharge_surligne ? ",
86 86
             keys:'$surcharge_surligne'" : '') . ',
87 87
             min_length: 3
88 88
           });
@@ -93,14 +93,14 @@  discard block
 block discarded – undo
93 93
       };
94 94
       </script>
95 95
       ';
96
-			// on l'insere juste avant </head>, sinon tout en bas
97
-			if (is_null($l = strpos($page, '</head>'))) {
98
-				$l = strlen($page);
99
-			}
100
-			$page = substr_replace($page, $script, $l, 0);
101
-			break;
102
-		}
103
-	}
96
+            // on l'insere juste avant </head>, sinon tout en bas
97
+            if (is_null($l = strpos($page, '</head>'))) {
98
+                $l = strlen($page);
99
+            }
100
+            $page = substr_replace($page, $script, $l, 0);
101
+            break;
102
+        }
103
+    }
104 104
 
105
-	return $page;
105
+    return $page;
106 106
 }
Please login to merge, or discard this patch.
ecrire/install/etape_.php 1 patch
Indentation   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  */
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -25,20 +25,20 @@  discard block
 block discarded – undo
25 25
  * @uses info_copyright()
26 26
  **/
27 27
 function install_etape__dist() {
28
-	utiliser_langue_visiteur();
29
-	$menu_langues = menu_langues('var_lang_ecrire');
30
-	if (!$menu_langues) {
31
-		redirige_url_ecrire('install', 'etape=chmod');
32
-	} else {
33
-		include_spip('inc/presentation'); // pour info_copyright
28
+    utiliser_langue_visiteur();
29
+    $menu_langues = menu_langues('var_lang_ecrire');
30
+    if (!$menu_langues) {
31
+        redirige_url_ecrire('install', 'etape=chmod');
32
+    } else {
33
+        include_spip('inc/presentation'); // pour info_copyright
34 34
 
35
-		$res = "<div class='petit-centre'><img alt='SPIP' class='logo' src='" . chemin_image('logo-spip.png') . "' />\n" .
36
-			"<p class='small'>" . info_copyright() . "</p></div>\n" .
37
-			'<p>' . _T('install_select_langue') . '</p>' .
38
-			'<div>' . $menu_langues . "</div>\n" .
39
-			generer_form_ecrire('install', "<input type='hidden' name='etape' value='chmod' />" . bouton_suivant());
35
+        $res = "<div class='petit-centre'><img alt='SPIP' class='logo' src='" . chemin_image('logo-spip.png') . "' />\n" .
36
+            "<p class='small'>" . info_copyright() . "</p></div>\n" .
37
+            '<p>' . _T('install_select_langue') . '</p>' .
38
+            '<div>' . $menu_langues . "</div>\n" .
39
+            generer_form_ecrire('install', "<input type='hidden' name='etape' value='chmod' />" . bouton_suivant());
40 40
 
41
-		$minipage = new Spip\Afficher\Minipage\Installation();
42
-		echo $minipage->page($res);
43
-	}
41
+        $minipage = new Spip\Afficher\Minipage\Installation();
42
+        echo $minipage->page($res);
43
+    }
44 44
 }
Please login to merge, or discard this patch.