Completed
Push — master ( 37aa61...be7234 )
by cam
01:24
created
ecrire/maj/legacy/v30.php 1 patch
Indentation   +230 added lines, -230 removed lines patch added patch discarded remove patch
@@ -17,18 +17,18 @@  discard block
 block discarded – undo
17 17
  * @package SPIP\Core\SQL\Upgrade
18 18
  **/
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 
24 24
 $GLOBALS['maj'][16428] = [
25
-	['maj_liens', 'auteur'], // creer la table liens
26
-	['maj_liens', 'auteur', 'article'],
27
-	['sql_drop_table', 'spip_auteurs_articles'],
28
-	['maj_liens', 'auteur', 'rubrique'],
29
-	['sql_drop_table', 'spip_auteurs_rubriques'],
30
-	['maj_liens', 'auteur', 'message'],
31
-	['sql_drop_table', 'spip_auteurs_messages'],
25
+    ['maj_liens', 'auteur'], // creer la table liens
26
+    ['maj_liens', 'auteur', 'article'],
27
+    ['sql_drop_table', 'spip_auteurs_articles'],
28
+    ['maj_liens', 'auteur', 'rubrique'],
29
+    ['sql_drop_table', 'spip_auteurs_rubriques'],
30
+    ['maj_liens', 'auteur', 'message'],
31
+    ['sql_drop_table', 'spip_auteurs_messages'],
32 32
 ];
33 33
 
34 34
 /**
@@ -54,89 +54,89 @@  discard block
 block discarded – undo
54 54
  */
55 55
 function maj_liens($pivot, $l = '') {
56 56
 
57
-	@define('_LOG_FILTRE_GRAVITE', 8);
58
-
59
-	$exceptions_pluriel = ['forum' => 'forum', 'syndic' => 'syndic'];
60
-
61
-	$pivot = preg_replace(',[^\w],', '', $pivot); // securite
62
-	$pivots = ($exceptions_pluriel[$pivot] ?? $pivot . 's');
63
-	$liens = 'spip_' . $pivots . '_liens';
64
-	$id_pivot = 'id_' . $pivot;
65
-	// Creer spip_auteurs_liens
66
-	global $tables_auxiliaires;
67
-	if (!$l) {
68
-		include_spip('base/auxiliaires');
69
-		include_spip('base/create');
70
-		creer_ou_upgrader_table($liens, $tables_auxiliaires[$liens], false);
71
-	} else {
72
-		// Preparer
73
-		$l = preg_replace(',[^\w],', '', $l); // securite
74
-		$primary = "id_$l";
75
-		$objet = ($l == 'syndic' ? 'site' : $l);
76
-		$ls = ($exceptions_pluriel[$l] ?? $l . 's');
77
-		$ancienne_table = 'spip_' . $pivots . '_' . $ls;
78
-		$pool = 400;
79
-
80
-		$trouver_table = charger_fonction('trouver_table', 'base');
81
-		if (!$desc = $trouver_table($ancienne_table)) {
82
-			return;
83
-		}
84
-
85
-		// securite pour ne pas perdre de donnees
86
-		if (!$trouver_table($liens)) {
87
-			return;
88
-		}
89
-
90
-		$champs = $desc['field'];
91
-		if (isset($champs['maj'])) {
92
-			unset($champs['maj']);
93
-		}
94
-		if (isset($champs[$primary])) {
95
-			unset($champs[$primary]);
96
-		}
97
-
98
-		$champs = array_keys($champs);
99
-		// ne garder que les champs qui existent sur la table destination
100
-		if ($desc_cible = $trouver_table($liens)) {
101
-			$champs = array_intersect($champs, array_keys($desc_cible['field']));
102
-		}
103
-
104
-		$champs[] = "$primary as id_objet";
105
-		$champs[] = "'$objet' as objet";
106
-		$champs = implode(', ', $champs);
107
-
108
-		// Recopier les donnees
109
-		$sub_pool = 100;
110
-		while ($ids = array_map('reset', sql_allfetsel("$primary", $ancienne_table, '', '', '', "0,$sub_pool"))) {
111
-			$insert = [];
112
-			foreach ($ids as $id) {
113
-				$n = sql_countsel($liens, "objet='$objet' AND id_objet=" . (int) $id);
114
-				while ($t = sql_allfetsel($champs, $ancienne_table, "$primary=" . (int) $id, '', $id_pivot, "$n,$pool")) {
115
-					$n += is_countable($t) ? count($t) : 0;
116
-					// empiler en s'assurant a minima de l'unicite
117
-					while ($r = array_shift($t)) {
118
-						$insert[$r[$id_pivot] . ':' . $r['id_objet']] = $r;
119
-					}
120
-					if (count($insert) >= $sub_pool) {
121
-						maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
122
-						$insert = [];
123
-					}
124
-					// si timeout, sortir, la relance nous ramenera dans cette fonction
125
-					// et on verifiera/repartira de la
126
-					if (time() >= _TIME_OUT) {
127
-						return;
128
-					}
129
-				}
130
-				if (time() >= _TIME_OUT) {
131
-					return;
132
-				}
133
-			}
134
-			if ($insert !== []) {
135
-				maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
136
-			}
137
-			sql_delete($ancienne_table, sql_in($primary, $ids));
138
-		}
139
-	}
57
+    @define('_LOG_FILTRE_GRAVITE', 8);
58
+
59
+    $exceptions_pluriel = ['forum' => 'forum', 'syndic' => 'syndic'];
60
+
61
+    $pivot = preg_replace(',[^\w],', '', $pivot); // securite
62
+    $pivots = ($exceptions_pluriel[$pivot] ?? $pivot . 's');
63
+    $liens = 'spip_' . $pivots . '_liens';
64
+    $id_pivot = 'id_' . $pivot;
65
+    // Creer spip_auteurs_liens
66
+    global $tables_auxiliaires;
67
+    if (!$l) {
68
+        include_spip('base/auxiliaires');
69
+        include_spip('base/create');
70
+        creer_ou_upgrader_table($liens, $tables_auxiliaires[$liens], false);
71
+    } else {
72
+        // Preparer
73
+        $l = preg_replace(',[^\w],', '', $l); // securite
74
+        $primary = "id_$l";
75
+        $objet = ($l == 'syndic' ? 'site' : $l);
76
+        $ls = ($exceptions_pluriel[$l] ?? $l . 's');
77
+        $ancienne_table = 'spip_' . $pivots . '_' . $ls;
78
+        $pool = 400;
79
+
80
+        $trouver_table = charger_fonction('trouver_table', 'base');
81
+        if (!$desc = $trouver_table($ancienne_table)) {
82
+            return;
83
+        }
84
+
85
+        // securite pour ne pas perdre de donnees
86
+        if (!$trouver_table($liens)) {
87
+            return;
88
+        }
89
+
90
+        $champs = $desc['field'];
91
+        if (isset($champs['maj'])) {
92
+            unset($champs['maj']);
93
+        }
94
+        if (isset($champs[$primary])) {
95
+            unset($champs[$primary]);
96
+        }
97
+
98
+        $champs = array_keys($champs);
99
+        // ne garder que les champs qui existent sur la table destination
100
+        if ($desc_cible = $trouver_table($liens)) {
101
+            $champs = array_intersect($champs, array_keys($desc_cible['field']));
102
+        }
103
+
104
+        $champs[] = "$primary as id_objet";
105
+        $champs[] = "'$objet' as objet";
106
+        $champs = implode(', ', $champs);
107
+
108
+        // Recopier les donnees
109
+        $sub_pool = 100;
110
+        while ($ids = array_map('reset', sql_allfetsel("$primary", $ancienne_table, '', '', '', "0,$sub_pool"))) {
111
+            $insert = [];
112
+            foreach ($ids as $id) {
113
+                $n = sql_countsel($liens, "objet='$objet' AND id_objet=" . (int) $id);
114
+                while ($t = sql_allfetsel($champs, $ancienne_table, "$primary=" . (int) $id, '', $id_pivot, "$n,$pool")) {
115
+                    $n += is_countable($t) ? count($t) : 0;
116
+                    // empiler en s'assurant a minima de l'unicite
117
+                    while ($r = array_shift($t)) {
118
+                        $insert[$r[$id_pivot] . ':' . $r['id_objet']] = $r;
119
+                    }
120
+                    if (count($insert) >= $sub_pool) {
121
+                        maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
122
+                        $insert = [];
123
+                    }
124
+                    // si timeout, sortir, la relance nous ramenera dans cette fonction
125
+                    // et on verifiera/repartira de la
126
+                    if (time() >= _TIME_OUT) {
127
+                        return;
128
+                    }
129
+                }
130
+                if (time() >= _TIME_OUT) {
131
+                    return;
132
+                }
133
+            }
134
+            if ($insert !== []) {
135
+                maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
136
+            }
137
+            sql_delete($ancienne_table, sql_in($primary, $ids));
138
+        }
139
+    }
140 140
 }
141 141
 
142 142
 /**
@@ -150,86 +150,86 @@  discard block
 block discarded – undo
150 150
  * @return void
151 151
  **/
152 152
 function maj_liens_insertq_multi_check($table, $couples, $desc = []) {
153
-	$n_before = sql_countsel($table);
154
-	sql_insertq_multi($table, $couples, $desc);
155
-	$n_after = sql_countsel($table);
156
-	if (($n_after - $n_before) == count($couples)) {
157
-		return;
158
-	}
159
-	// si ecart, on recommence l'insertion ligne par ligne...
160
-	// moins rapide mais secure : seul le couple en doublon echouera, et non toute la serie
161
-	foreach ($couples as $c) {
162
-		sql_insertq($table, $c, $desc);
163
-	}
153
+    $n_before = sql_countsel($table);
154
+    sql_insertq_multi($table, $couples, $desc);
155
+    $n_after = sql_countsel($table);
156
+    if (($n_after - $n_before) == count($couples)) {
157
+        return;
158
+    }
159
+    // si ecart, on recommence l'insertion ligne par ligne...
160
+    // moins rapide mais secure : seul le couple en doublon echouera, et non toute la serie
161
+    foreach ($couples as $c) {
162
+        sql_insertq($table, $c, $desc);
163
+    }
164 164
 }
165 165
 
166 166
 $GLOBALS['maj'][17311] = [
167
-	[
168
-		'ecrire_meta',
169
-		'multi_objets',
170
-		implode(
171
-			',',
172
-			array_diff(
173
-				[
174
-					(isset($GLOBALS['meta']['multi_rubriques']) && $GLOBALS['meta']['multi_rubriques'] == 'oui')
175
-						? 'spip_rubriques' : '',
176
-					(isset($GLOBALS['meta']['multi_articles']) && $GLOBALS['meta']['multi_articles'] == 'oui')
177
-						? 'spip_articles' : ''
178
-				],
179
-				['']
180
-			)
181
-		)
182
-	],
183
-	[
184
-		'ecrire_meta',
185
-		'gerer_trad_objets',
186
-		implode(
187
-			',',
188
-			array_diff(
189
-				[
190
-					(isset($GLOBALS['meta']['gerer_trad']) && $GLOBALS['meta']['gerer_trad'] == 'oui')
191
-						? 'spip_articles' : ''
192
-				],
193
-				['']
194
-			)
195
-		)
196
-	],
167
+    [
168
+        'ecrire_meta',
169
+        'multi_objets',
170
+        implode(
171
+            ',',
172
+            array_diff(
173
+                [
174
+                    (isset($GLOBALS['meta']['multi_rubriques']) && $GLOBALS['meta']['multi_rubriques'] == 'oui')
175
+                        ? 'spip_rubriques' : '',
176
+                    (isset($GLOBALS['meta']['multi_articles']) && $GLOBALS['meta']['multi_articles'] == 'oui')
177
+                        ? 'spip_articles' : ''
178
+                ],
179
+                ['']
180
+            )
181
+        )
182
+    ],
183
+    [
184
+        'ecrire_meta',
185
+        'gerer_trad_objets',
186
+        implode(
187
+            ',',
188
+            array_diff(
189
+                [
190
+                    (isset($GLOBALS['meta']['gerer_trad']) && $GLOBALS['meta']['gerer_trad'] == 'oui')
191
+                        ? 'spip_articles' : ''
192
+                ],
193
+                ['']
194
+            )
195
+        )
196
+    ],
197 197
 ];
198 198
 $GLOBALS['maj'][17555] = [
199
-	['sql_alter', "TABLE spip_resultats ADD table_objet varchar(30) DEFAULT '' NOT NULL"],
200
-	['sql_alter', "TABLE spip_resultats ADD serveur char(16) DEFAULT '' NOT NULL"],
199
+    ['sql_alter', "TABLE spip_resultats ADD table_objet varchar(30) DEFAULT '' NOT NULL"],
200
+    ['sql_alter', "TABLE spip_resultats ADD serveur char(16) DEFAULT '' NOT NULL"],
201 201
 ];
202 202
 
203 203
 $GLOBALS['maj'][17563] = [
204
-	['sql_alter', "TABLE spip_articles ADD virtuel VARCHAR(255) DEFAULT '' NOT NULL"],
205
-	['sql_update', 'spip_articles', ['virtuel' => 'SUBSTRING(chapo,2)', 'chapo' => "''"], "chapo LIKE '=_%'"],
204
+    ['sql_alter', "TABLE spip_articles ADD virtuel VARCHAR(255) DEFAULT '' NOT NULL"],
205
+    ['sql_update', 'spip_articles', ['virtuel' => 'SUBSTRING(chapo,2)', 'chapo' => "''"], "chapo LIKE '=_%'"],
206 206
 ];
207 207
 
208 208
 $GLOBALS['maj'][17577] = [
209
-	['maj_tables', ['spip_jobs', 'spip_jobs_liens']],
209
+    ['maj_tables', ['spip_jobs', 'spip_jobs_liens']],
210 210
 ];
211 211
 
212 212
 $GLOBALS['maj'][17743] = [
213
-	['sql_update', 'spip_auteurs', ['prefs' => 'bio', 'bio' => "''"], "statut='nouveau' AND bio<>''"],
213
+    ['sql_update', 'spip_auteurs', ['prefs' => 'bio', 'bio' => "''"], "statut='nouveau' AND bio<>''"],
214 214
 ];
215 215
 
216 216
 $GLOBALS['maj'][18219] = [
217
-	['sql_alter', 'TABLE spip_rubriques DROP id_import'],
218
-	['sql_alter', 'TABLE spip_rubriques DROP export'],
217
+    ['sql_alter', 'TABLE spip_rubriques DROP id_import'],
218
+    ['sql_alter', 'TABLE spip_rubriques DROP export'],
219 219
 ];
220 220
 
221 221
 $GLOBALS['maj'][18310] = [
222
-	['sql_alter', "TABLE spip_auteurs_liens CHANGE vu vu VARCHAR(6) DEFAULT 'non' NOT NULL"],
222
+    ['sql_alter', "TABLE spip_auteurs_liens CHANGE vu vu VARCHAR(6) DEFAULT 'non' NOT NULL"],
223 223
 ];
224 224
 
225 225
 $GLOBALS['maj'][18597] = [
226
-	['sql_alter', "TABLE spip_rubriques ADD profondeur smallint(5) DEFAULT '0' NOT NULL"],
227
-	['maj_propager_les_secteurs'],
226
+    ['sql_alter', "TABLE spip_rubriques ADD profondeur smallint(5) DEFAULT '0' NOT NULL"],
227
+    ['maj_propager_les_secteurs'],
228 228
 ];
229 229
 
230 230
 $GLOBALS['maj'][18955] = [
231
-	['sql_alter', 'TABLE spip_auteurs_liens ADD INDEX id_objet (id_objet)'],
232
-	['sql_alter', 'TABLE spip_auteurs_liens ADD INDEX objet (objet)'],
231
+    ['sql_alter', 'TABLE spip_auteurs_liens ADD INDEX id_objet (id_objet)'],
232
+    ['sql_alter', 'TABLE spip_auteurs_liens ADD INDEX objet (objet)'],
233 233
 ];
234 234
 
235 235
 /**
@@ -238,8 +238,8 @@  discard block
 block discarded – undo
238 238
  * @uses propager_les_secteurs()
239 239
  **/
240 240
 function maj_propager_les_secteurs() {
241
-	include_spip('inc/rubriques');
242
-	propager_les_secteurs();
241
+    include_spip('inc/rubriques');
242
+    propager_les_secteurs();
243 243
 }
244 244
 
245 245
 /**
@@ -252,87 +252,87 @@  discard block
 block discarded – undo
252 252
 function maj_collation_sqlite() {
253 253
 
254 254
 
255
-	include_spip('base/dump');
256
-	$tables = base_lister_toutes_tables();
257
-
258
-	// rien a faire si base non sqlite
259
-	if (!str_starts_with((string) $GLOBALS['connexions'][0]['type'], 'sqlite')) {
260
-		return;
261
-	}
262
-
263
-	$trouver_table = charger_fonction('trouver_table', 'base');
264
-	// forcer le vidage de cache
265
-	$trouver_table('');
266
-
267
-	// cas particulier spip_auteurs : retablir le collate binary sur le login
268
-	$desc = $trouver_table('spip_auteurs');
269
-	spip_log('spip_auteurs : ' . var_export($desc['field'], true), 'maj.' . _LOG_INFO_IMPORTANTE);
270
-	if (stripos((string) $desc['field']['login'], 'BINARY') === false) {
271
-		spip_log('Retablir champ login BINARY sur table spip_auteurs', 'maj');
272
-		sql_alter('table spip_auteurs change login login VARCHAR(255) BINARY');
273
-		$trouver_table('');
274
-		$new_desc = $trouver_table('spip_auteurs');
275
-		spip_log('Apres conversion spip_auteurs : ' . var_export($new_desc['field'], true), 'maj.' . _LOG_INFO_IMPORTANTE);
276
-	}
277
-
278
-	foreach ($tables as $table) {
279
-		if (time() >= _TIME_OUT) {
280
-			return;
281
-		}
282
-		if ($desc = $trouver_table($table)) {
283
-			$desc_collate = _sqlite_remplacements_definitions_table($desc['field']);
284
-			if ($d = array_diff($desc['field'], $desc_collate)) {
285
-				spip_log("Table $table COLLATE incorrects", 'maj');
286
-
287
-				// cas particulier spip_urls :
288
-				// supprimer les doublons avant conversion sinon echec (on garde les urls les plus recentes)
289
-				if ($table == 'spip_urls') {
290
-					// par date DESC pour conserver les urls les plus recentes
291
-					$data = sql_allfetsel('*', 'spip_urls', '', '', 'date DESC');
292
-					$urls = [];
293
-					foreach ($data as $d) {
294
-						$key = $d['id_parent'] . '::' . strtolower((string) $d['url']);
295
-						if (!isset($urls[$key])) {
296
-							$urls[$key] = true;
297
-						} else {
298
-							spip_log(
299
-								'Suppression doublon dans spip_urls avant conversion : ' . serialize($d),
300
-								'maj.' . _LOG_INFO_IMPORTANTE
301
-							);
302
-							sql_delete('spip_urls', 'id_parent=' . sql_quote($d['id_parent']) . ' AND url=' . sql_quote($d['url']));
303
-						}
304
-					}
305
-				}
306
-				foreach ($desc['field'] as $field => $type) {
307
-					if ($desc['field'][$field] !== $desc_collate[$field]) {
308
-						spip_log("Conversion COLLATE table $table", 'maj.' . _LOG_INFO_IMPORTANTE);
309
-						sql_alter("table $table change $field $field " . $desc_collate[$field]);
310
-						$trouver_table('');
311
-						$new_desc = $trouver_table($table);
312
-						spip_log(
313
-							"Apres conversion $table : " . var_export($new_desc['field'], true),
314
-							'maj.' . _LOG_INFO_IMPORTANTE
315
-						);
316
-						continue 2; // inutile de continuer pour cette table : un seul alter remet tout a jour en sqlite
317
-					}
318
-				}
319
-			}
320
-		}
321
-	}
322
-
323
-	// forcer le vidage de cache
324
-	$trouver_table('');
255
+    include_spip('base/dump');
256
+    $tables = base_lister_toutes_tables();
257
+
258
+    // rien a faire si base non sqlite
259
+    if (!str_starts_with((string) $GLOBALS['connexions'][0]['type'], 'sqlite')) {
260
+        return;
261
+    }
262
+
263
+    $trouver_table = charger_fonction('trouver_table', 'base');
264
+    // forcer le vidage de cache
265
+    $trouver_table('');
266
+
267
+    // cas particulier spip_auteurs : retablir le collate binary sur le login
268
+    $desc = $trouver_table('spip_auteurs');
269
+    spip_log('spip_auteurs : ' . var_export($desc['field'], true), 'maj.' . _LOG_INFO_IMPORTANTE);
270
+    if (stripos((string) $desc['field']['login'], 'BINARY') === false) {
271
+        spip_log('Retablir champ login BINARY sur table spip_auteurs', 'maj');
272
+        sql_alter('table spip_auteurs change login login VARCHAR(255) BINARY');
273
+        $trouver_table('');
274
+        $new_desc = $trouver_table('spip_auteurs');
275
+        spip_log('Apres conversion spip_auteurs : ' . var_export($new_desc['field'], true), 'maj.' . _LOG_INFO_IMPORTANTE);
276
+    }
277
+
278
+    foreach ($tables as $table) {
279
+        if (time() >= _TIME_OUT) {
280
+            return;
281
+        }
282
+        if ($desc = $trouver_table($table)) {
283
+            $desc_collate = _sqlite_remplacements_definitions_table($desc['field']);
284
+            if ($d = array_diff($desc['field'], $desc_collate)) {
285
+                spip_log("Table $table COLLATE incorrects", 'maj');
286
+
287
+                // cas particulier spip_urls :
288
+                // supprimer les doublons avant conversion sinon echec (on garde les urls les plus recentes)
289
+                if ($table == 'spip_urls') {
290
+                    // par date DESC pour conserver les urls les plus recentes
291
+                    $data = sql_allfetsel('*', 'spip_urls', '', '', 'date DESC');
292
+                    $urls = [];
293
+                    foreach ($data as $d) {
294
+                        $key = $d['id_parent'] . '::' . strtolower((string) $d['url']);
295
+                        if (!isset($urls[$key])) {
296
+                            $urls[$key] = true;
297
+                        } else {
298
+                            spip_log(
299
+                                'Suppression doublon dans spip_urls avant conversion : ' . serialize($d),
300
+                                'maj.' . _LOG_INFO_IMPORTANTE
301
+                            );
302
+                            sql_delete('spip_urls', 'id_parent=' . sql_quote($d['id_parent']) . ' AND url=' . sql_quote($d['url']));
303
+                        }
304
+                    }
305
+                }
306
+                foreach ($desc['field'] as $field => $type) {
307
+                    if ($desc['field'][$field] !== $desc_collate[$field]) {
308
+                        spip_log("Conversion COLLATE table $table", 'maj.' . _LOG_INFO_IMPORTANTE);
309
+                        sql_alter("table $table change $field $field " . $desc_collate[$field]);
310
+                        $trouver_table('');
311
+                        $new_desc = $trouver_table($table);
312
+                        spip_log(
313
+                            "Apres conversion $table : " . var_export($new_desc['field'], true),
314
+                            'maj.' . _LOG_INFO_IMPORTANTE
315
+                        );
316
+                        continue 2; // inutile de continuer pour cette table : un seul alter remet tout a jour en sqlite
317
+                    }
318
+                }
319
+            }
320
+        }
321
+    }
322
+
323
+    // forcer le vidage de cache
324
+    $trouver_table('');
325 325
 }
326 326
 
327 327
 
328 328
 $GLOBALS['maj'][19236] = [
329
-	['sql_updateq', 'spip_meta', ['impt' => 'oui'], "nom='version_installee'"], // version base principale
330
-	['sql_updateq', 'spip_meta', ['impt' => 'oui'], "nom LIKE '%_base_version'"],  // version base plugins
331
-	['maj_collation_sqlite'],
329
+    ['sql_updateq', 'spip_meta', ['impt' => 'oui'], "nom='version_installee'"], // version base principale
330
+    ['sql_updateq', 'spip_meta', ['impt' => 'oui'], "nom LIKE '%_base_version'"],  // version base plugins
331
+    ['maj_collation_sqlite'],
332 332
 ];
333 333
 
334 334
 $GLOBALS['maj'][19268] = [
335
-	['supprimer_toutes_sessions'],
335
+    ['supprimer_toutes_sessions'],
336 336
 ];
337 337
 
338 338
 /**
@@ -341,13 +341,13 @@  discard block
 block discarded – undo
341 341
  * Obligera tous les auteurs à se reconnecter !
342 342
  **/
343 343
 function supprimer_toutes_sessions() {
344
-	spip_log('supprimer sessions auteur');
345
-	if ($dir = opendir(_DIR_SESSIONS)) {
346
-		while (($f = readdir($dir)) !== false) {
347
-			spip_unlink(_DIR_SESSIONS . $f);
348
-			if (time() >= _TIME_OUT) {
349
-				return;
350
-			}
351
-		}
352
-	}
344
+    spip_log('supprimer sessions auteur');
345
+    if ($dir = opendir(_DIR_SESSIONS)) {
346
+        while (($f = readdir($dir)) !== false) {
347
+            spip_unlink(_DIR_SESSIONS . $f);
348
+            if (time() >= _TIME_OUT) {
349
+                return;
350
+            }
351
+        }
352
+    }
353 353
 }
Please login to merge, or discard this patch.
ecrire/auth/ldap.php 1 patch
Indentation   +174 added lines, -174 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']) || !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,49 +55,49 @@  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']);
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'] && ($desc = auth_ldap_retrouver($dn, [], $serveur))
80
-	) {
81
-		// rajouter le statut indique  a l'install
82
-		$desc['statut'] = $GLOBALS['meta']['ldap_statut_import'];
83
-		$desc['login'] = $login;
84
-		$desc['source'] = 'ldap';
85
-		$desc['pass'] = '';
86
-
87
-		$r = sql_insertq('spip_auteurs', $desc, [], $serveur);
88
-	}
89
-
90
-	if ($r) {
91
-		return array_merge(
92
-			$credentials_ldap,
93
-			sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . (int) $r, '', '', '', '', $serveur)
94
-		);
95
-	}
96
-
97
-	// sinon echec
98
-	spip_log("Creation de l'auteur '$login' impossible");
99
-
100
-	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']);
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'] && ($desc = auth_ldap_retrouver($dn, [], $serveur))
80
+    ) {
81
+        // rajouter le statut indique  a l'install
82
+        $desc['statut'] = $GLOBALS['meta']['ldap_statut_import'];
83
+        $desc['login'] = $login;
84
+        $desc['source'] = 'ldap';
85
+        $desc['pass'] = '';
86
+
87
+        $r = sql_insertq('spip_auteurs', $desc, [], $serveur);
88
+    }
89
+
90
+    if ($r) {
91
+        return array_merge(
92
+            $credentials_ldap,
93
+            sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . (int) $r, '', '', '', '', $serveur)
94
+        );
95
+    }
96
+
97
+    // sinon echec
98
+    spip_log("Creation de l'auteur '$login' impossible");
99
+
100
+    return [];
101 101
 }
102 102
 
103 103
 /**
@@ -111,36 +111,36 @@  discard block
 block discarded – undo
111 111
  * @return array
112 112
  */
113 113
 function auth_ldap_connect($serveur = '') {
114
-	include_spip('base/connect_sql');
115
-	static $connexions_ldap = [];
116
-	if (isset($connexions_ldap[$serveur])) {
117
-		return $connexions_ldap[$serveur];
118
-	}
119
-	$connexion = spip_connect($serveur);
120
-	if (!is_array($connexion['ldap'])) {
121
-		if ($connexion['authentification']['ldap']) {
122
-			$f = _DIR_CONNECT . $connexion['authentification']['ldap'];
123
-			unset($GLOBALS['ldap_link']);
124
-			if (is_readable($f)) {
125
-				include_once($f);
126
-			};
127
-			if (isset($GLOBALS['ldap_link'])) {
128
-				$connexion['ldap'] = [
129
-					'link' => $GLOBALS['ldap_link'],
130
-					'base' => $GLOBALS['ldap_base']
131
-				];
132
-			} else {
133
-				spip_log("connection LDAP $serveur mal definie dans $f");
134
-			}
135
-			if (isset($GLOBALS['ldap_champs'])) {
136
-				$connexion['ldap']['attributes'] = $GLOBALS['ldap_champs'];
137
-			}
138
-		} else {
139
-			spip_log("connection LDAP $serveur inconnue");
140
-		}
141
-	}
142
-
143
-	return $connexions_ldap[$serveur] = $connexion['ldap'];
114
+    include_spip('base/connect_sql');
115
+    static $connexions_ldap = [];
116
+    if (isset($connexions_ldap[$serveur])) {
117
+        return $connexions_ldap[$serveur];
118
+    }
119
+    $connexion = spip_connect($serveur);
120
+    if (!is_array($connexion['ldap'])) {
121
+        if ($connexion['authentification']['ldap']) {
122
+            $f = _DIR_CONNECT . $connexion['authentification']['ldap'];
123
+            unset($GLOBALS['ldap_link']);
124
+            if (is_readable($f)) {
125
+                include_once($f);
126
+            };
127
+            if (isset($GLOBALS['ldap_link'])) {
128
+                $connexion['ldap'] = [
129
+                    'link' => $GLOBALS['ldap_link'],
130
+                    'base' => $GLOBALS['ldap_base']
131
+                ];
132
+            } else {
133
+                spip_log("connection LDAP $serveur mal definie dans $f");
134
+            }
135
+            if (isset($GLOBALS['ldap_champs'])) {
136
+                $connexion['ldap']['attributes'] = $GLOBALS['ldap_champs'];
137
+            }
138
+        } else {
139
+            spip_log("connection LDAP $serveur inconnue");
140
+        }
141
+    }
142
+
143
+    return $connexions_ldap[$serveur] = $connexion['ldap'];
144 144
 }
145 145
 
146 146
 /**
@@ -154,52 +154,52 @@  discard block
 block discarded – undo
154 154
  *    Le login trouvé ou chaine vide si non trouvé
155 155
  */
156 156
 function auth_ldap_search($login, #[\SensitiveParameter] $pass, $checkpass = true, $serveur = '') {
157
-	// Securite anti-injection et contre un serveur LDAP laxiste
158
-	$login_search = preg_replace('/[^-@._\s\d\w]/', '', $login);
159
-	if (!strlen($login_search) || $checkpass && !strlen($pass)) {
160
-		return '';
161
-	}
162
-
163
-	// verifier la connexion
164
-	if (!$ldap = auth_ldap_connect($serveur)) {
165
-		return '';
166
-	}
167
-
168
-	$ldap_link = $ldap['link'] ?? null;
169
-	$ldap_base = $ldap['base'] ?? null;
170
-	$desc = empty($ldap['attributes']) ? $GLOBALS['ldap_attributes'] : $ldap['attributes'];
171
-
172
-	$logins = is_array($desc['login']) ? $desc['login'] : [$desc['login']];
173
-
174
-	// Tenter une recherche pour essayer de retrouver le DN
175
-	foreach ($logins as $att) {
176
-		$result = @ldap_search($ldap_link, $ldap_base, "$att=$login_search", ['dn']);
177
-		$info = @ldap_get_entries($ldap_link, $result);
178
-		// Ne pas accepter les resultats si plus d'une entree
179
-		// (on veut un attribut unique)
180
-
181
-		if (is_array($info) && $info['count'] == 1) {
182
-			$dn = $info[0]['dn'];
183
-			if (!$checkpass) {
184
-				return $dn;
185
-			}
186
-			if (@ldap_bind($ldap_link, $dn, $pass)) {
187
-				return $dn;
188
-			}
189
-		}
190
-	}
191
-
192
-	if ($checkpass && !isset($dn)) {
193
-		// Si echec, essayer de deviner le DN
194
-		foreach ($logins as $att) {
195
-			$dn = "$att=$login_search, $ldap_base";
196
-			if (@ldap_bind($ldap_link, $dn, $pass)) {
197
-				return "$att=$login_search, $ldap_base";
198
-			}
199
-		}
200
-	}
201
-
202
-	return '';
157
+    // Securite anti-injection et contre un serveur LDAP laxiste
158
+    $login_search = preg_replace('/[^-@._\s\d\w]/', '', $login);
159
+    if (!strlen($login_search) || $checkpass && !strlen($pass)) {
160
+        return '';
161
+    }
162
+
163
+    // verifier la connexion
164
+    if (!$ldap = auth_ldap_connect($serveur)) {
165
+        return '';
166
+    }
167
+
168
+    $ldap_link = $ldap['link'] ?? null;
169
+    $ldap_base = $ldap['base'] ?? null;
170
+    $desc = empty($ldap['attributes']) ? $GLOBALS['ldap_attributes'] : $ldap['attributes'];
171
+
172
+    $logins = is_array($desc['login']) ? $desc['login'] : [$desc['login']];
173
+
174
+    // Tenter une recherche pour essayer de retrouver le DN
175
+    foreach ($logins as $att) {
176
+        $result = @ldap_search($ldap_link, $ldap_base, "$att=$login_search", ['dn']);
177
+        $info = @ldap_get_entries($ldap_link, $result);
178
+        // Ne pas accepter les resultats si plus d'une entree
179
+        // (on veut un attribut unique)
180
+
181
+        if (is_array($info) && $info['count'] == 1) {
182
+            $dn = $info[0]['dn'];
183
+            if (!$checkpass) {
184
+                return $dn;
185
+            }
186
+            if (@ldap_bind($ldap_link, $dn, $pass)) {
187
+                return $dn;
188
+            }
189
+        }
190
+    }
191
+
192
+    if ($checkpass && !isset($dn)) {
193
+        // Si echec, essayer de deviner le DN
194
+        foreach ($logins as $att) {
195
+            $dn = "$att=$login_search, $ldap_base";
196
+            if (@ldap_bind($ldap_link, $dn, $pass)) {
197
+                return "$att=$login_search, $ldap_base";
198
+            }
199
+        }
200
+    }
201
+
202
+    return '';
203 203
 }
204 204
 
205 205
 /**
@@ -211,40 +211,40 @@  discard block
 block discarded – undo
211 211
  * @return array
212 212
  */
213 213
 function auth_ldap_retrouver($dn, $desc = [], $serveur = '') {
214
-	// Lire les infos sur l'utilisateur a partir de son DN depuis LDAP
214
+    // Lire les infos sur l'utilisateur a partir de son DN depuis LDAP
215 215
 
216
-	if (!$ldap = auth_ldap_connect($serveur)) {
217
-		spip_log("ldap $serveur injoignable");
216
+    if (!$ldap = auth_ldap_connect($serveur)) {
217
+        spip_log("ldap $serveur injoignable");
218 218
 
219
-		return [];
220
-	}
219
+        return [];
220
+    }
221 221
 
222
-	$ldap_link = $ldap['link'];
223
-	if (!$desc) {
224
-		$desc = $ldap['attributes'] ?: $GLOBALS['ldap_attributes'];
225
-		unset($desc['login']);
226
-	}
227
-	$result = @ldap_read($ldap_link, $dn, 'objectClass=*', array_values($desc));
222
+    $ldap_link = $ldap['link'];
223
+    if (!$desc) {
224
+        $desc = $ldap['attributes'] ?: $GLOBALS['ldap_attributes'];
225
+        unset($desc['login']);
226
+    }
227
+    $result = @ldap_read($ldap_link, $dn, 'objectClass=*', array_values($desc));
228 228
 
229
-	if (!$result) {
230
-		return [];
231
-	}
229
+    if (!$result) {
230
+        return [];
231
+    }
232 232
 
233
-	// Recuperer les donnees du premier (unique?) compte de l'auteur
234
-	$val = @ldap_get_entries($ldap_link, $result);
235
-	if (!is_array($val) || !is_array($val[0])) {
236
-		return [];
237
-	}
238
-	$val = $val[0];
233
+    // Recuperer les donnees du premier (unique?) compte de l'auteur
234
+    $val = @ldap_get_entries($ldap_link, $result);
235
+    if (!is_array($val) || !is_array($val[0])) {
236
+        return [];
237
+    }
238
+    $val = $val[0];
239 239
 
240
-	// Convertir depuis UTF-8 (jeu de caracteres par defaut)
241
-	include_spip('inc/charsets');
240
+    // Convertir depuis UTF-8 (jeu de caracteres par defaut)
241
+    include_spip('inc/charsets');
242 242
 
243
-	foreach ($desc as $k => $v) {
244
-		$desc[$k] = importer_charset($val[strtolower((string) $v)][0], 'utf-8');
245
-	}
243
+    foreach ($desc as $k => $v) {
244
+        $desc[$k] = importer_charset($val[strtolower((string) $v)][0], 'utf-8');
245
+    }
246 246
 
247
-	return $desc;
247
+    return $desc;
248 248
 }
249 249
 
250 250
 
@@ -256,7 +256,7 @@  discard block
 block discarded – undo
256 256
  * @return string
257 257
  */
258 258
 function auth_ldap_retrouver_login($login, $serveur = '') {
259
-	return auth_ldap_search($login, '', false, $serveur) ? $login : '';
259
+    return auth_ldap_search($login, '', false, $serveur) ? $login : '';
260 260
 }
261 261
 
262 262
 /**
@@ -276,9 +276,9 @@  discard block
 block discarded – undo
276 276
  *   Message d'erreur si login non valide, chaîne vide sinon
277 277
  */
278 278
 function auth_ldap_verifier_pass($login, #[\SensitiveParameter] $new_pass, $id_auteur = 0, $serveur = '') {
279
-	include_spip('auth/spip');
279
+    include_spip('auth/spip');
280 280
 
281
-	return auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur);
281
+    return auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur);
282 282
 }
283 283
 
284 284
 /**
@@ -299,7 +299,7 @@  discard block
 block discarded – undo
299 299
  *   ```
300 300
  */
301 301
 function auth_ldap_autoriser_modifier_pass($serveur = '') {
302
-	return true;
302
+    return true;
303 303
 }
304 304
 
305 305
 /**
@@ -317,22 +317,22 @@  discard block
 block discarded – undo
317 317
  *    Informe du succès ou de l'echec du changement du mot de passe
318 318
  */
319 319
 function auth_ldap_modifier_pass($login, #[\SensitiveParameter] $new_pass, $id_auteur, $serveur = '') {
320
-	if (is_null($new_pass) || auth_ldap_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
321
-		return false;
322
-	}
323
-	if (!$ldap = auth_ldap_connect($serveur)) {
324
-		return false;
325
-	}
326
-	$link = $ldap['link'];
327
-	include_spip('inc/session');
328
-	$dn = session_get('ldap_dn');
329
-	if ('' == $dn) {
330
-		return false;
331
-	}
332
-	if (!ldap_bind($link, $dn, session_get('ldap_password'))) {
333
-		return false;
334
-	}
335
-	$encoded_pass = '{MD5}' . base64_encode(pack('H*', md5((string) $new_pass)));
336
-
337
-	return ldap_mod_replace($link, $dn, ['userPassword' => $encoded_pass]);
320
+    if (is_null($new_pass) || auth_ldap_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
321
+        return false;
322
+    }
323
+    if (!$ldap = auth_ldap_connect($serveur)) {
324
+        return false;
325
+    }
326
+    $link = $ldap['link'];
327
+    include_spip('inc/session');
328
+    $dn = session_get('ldap_dn');
329
+    if ('' == $dn) {
330
+        return false;
331
+    }
332
+    if (!ldap_bind($link, $dn, session_get('ldap_password'))) {
333
+        return false;
334
+    }
335
+    $encoded_pass = '{MD5}' . base64_encode(pack('H*', md5((string) $new_pass)));
336
+
337
+    return ldap_mod_replace($link, $dn, ['userPassword' => $encoded_pass]);
338 338
 }
Please login to merge, or discard this patch.
ecrire/auth/spip.php 1 patch
Indentation   +398 added lines, -398 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,168 +33,168 @@  discard block
 block discarded – undo
33 33
  */
34 34
 function auth_spip_dist($login, #[\SensitiveParameter] $pass, $serveur = '', $phpauth = false) {
35 35
 
36
-	$methode = null;
37
-	// retrouver le login
38
-	$login = auth_spip_retrouver_login($login);
39
-	// login inconnu, n'allons pas plus loin
40
-	if (!$login) {
41
-		return [];
42
-	}
43
-
44
-	$md5pass = '';
45
-	$shapass = $shanext = '';
46
-	$auteur_peut_sauver_cles = false;
47
-
48
-	if ($pass) {
49
-		$row = sql_fetsel(
50
-			'*',
51
-			'spip_auteurs',
52
-			'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
53
-			'',
54
-			'',
55
-			'',
56
-			'',
57
-			$serveur
58
-		);
59
-
60
-		// lever un flag si cet auteur peut sauver les cles
61
-		if ($row['statut'] === '0minirezo' && $row['webmestre'] === 'oui' && isset($row['backup_cles'])) {
62
-			$auteur_peut_sauver_cles = true;
63
-		}
64
-	}
65
-
66
-	// login inexistant ou mot de passe vide
67
-	if (!$pass || !$row) {
68
-		return [];
69
-	}
70
-
71
-	$cles = SpipCles::instance();
72
-	$secret = $cles->getSecretAuth();
73
-
74
-	$hash = null;
75
-	switch (strlen((string) $row['pass'])) {
76
-		// legacy = md5 ou sha256
77
-		case 32:
78
-			// tres anciens mots de passe encodes en md5(alea.pass)
79
-			$hash = md5($row['alea_actuel'] . $pass);
80
-			$methode = 'md5';
81
-		case 64:
82
-			if (empty($hash)) {
83
-				// anciens mots de passe encodes en sha256(alea.pass)
84
-				include_spip('auth/sha256.inc');
85
-				$hash = spip_sha256($row['alea_actuel'] . $pass);
86
-				$methode = 'sha256';
87
-			}
88
-			if ($row['pass'] === $hash) {
89
-				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG);
90
-				// 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
91
-				if (!empty($row['backup_cles'])) {
92
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . (int) $row['id_auteur']);
93
-				}
94
-				break;
95
-			}
96
-
97
-		// on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long
98
-
99
-		case 60:
100
-		case 98:
101
-		default:
102
-			// doit-on restaurer un backup des cles ?
103
-			// si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass
104
-			if (
105
-				!$secret
106
-				&& $auteur_peut_sauver_cles
107
-				&& !empty($row['backup_cles'])
108
-			) {
109
-				if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
110
-					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
111
-					if ($cles->save()) {
112
-						$secret = $cles->getSecretAuth();
113
-					}
114
-					else {
115
-						spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
116
-						// et on echoue car on ne veut pas que la situation reste telle quelle
117
-						raler_fichier(_DIR_ETC . 'cles.php');
118
-					}
119
-				}
120
-				else {
121
-					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);
122
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . (int) $row['id_auteur']);
123
-				}
124
-			}
125
-
126
-			if (!$secret || !Password::verifier($pass, $row['pass'], $secret)) {
127
-				unset($row);
128
-			}
129
-			else {
130
-				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG);
131
-			}
132
-			break;
133
-	}
134
-
135
-	// Migration depuis ancienne version : si on a pas encore de cle
136
-	// ET si c'est le login d'un auteur qui peut sauver la cle
137
-	// créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php)
138
-	// 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
139
-	if (!$secret && $auteur_peut_sauver_cles && auth_spip_initialiser_secret()) {
140
-		$secret = $cles->getSecretAuth();
141
-	}
142
-
143
-	// login/mot de passe incorrect
144
-	if (empty($row)) {
145
-		return [];
146
-	}
147
-
148
-	// fait tourner le codage du pass dans la base
149
-	// sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
150
-	if (!$phpauth && $secret) {
151
-		include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess
152
-		$pass_hash_next = Password::hacher($pass, $secret);
153
-		if ($pass_hash_next) {
154
-			$set = [
155
-				'alea_actuel' => 'alea_futur', // @deprecated 4.1
156
-				'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1
157
-				'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
158
-			];
159
-
160
-			// regenerer un htpass si on a active/desactive le plugin htpasswd
161
-			// et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo
162
-			$htpass = generer_htpass($pass);
163
-			if (strlen((string) $htpass) !== strlen((string) $row['htpass'])) {
164
-				$set['htpass'] = sql_quote($htpass, $serveur, 'text');
165
-			}
166
-
167
-			// a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre)
168
-			if ($auteur_peut_sauver_cles) {
169
-				$set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text');
170
-			}
171
-
172
-			@sql_update(
173
-				'spip_auteurs',
174
-				$set,
175
-				'id_auteur=' . (int) $row['id_auteur'] . ' AND pass=' . sql_quote(
176
-					$row['pass'],
177
-					$serveur,
178
-					'text'
179
-				),
180
-				[],
181
-				$serveur
182
-			);
183
-
184
-			// si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd
185
-			if (isset($set['htpass'])) {
186
-				ecrire_acces();
187
-			}
188
-		}
189
-
190
-		// En profiter pour verifier la securite de tmp/
191
-		// Si elle ne fonctionne pas a l'installation, prevenir
192
-		if (!verifier_htaccess(_DIR_TMP) && defined('_ECRIRE_INSTALL')) {
193
-			return false;
194
-		}
195
-	}
196
-
197
-	return $row;
36
+    $methode = null;
37
+    // retrouver le login
38
+    $login = auth_spip_retrouver_login($login);
39
+    // login inconnu, n'allons pas plus loin
40
+    if (!$login) {
41
+        return [];
42
+    }
43
+
44
+    $md5pass = '';
45
+    $shapass = $shanext = '';
46
+    $auteur_peut_sauver_cles = false;
47
+
48
+    if ($pass) {
49
+        $row = sql_fetsel(
50
+            '*',
51
+            'spip_auteurs',
52
+            'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
53
+            '',
54
+            '',
55
+            '',
56
+            '',
57
+            $serveur
58
+        );
59
+
60
+        // lever un flag si cet auteur peut sauver les cles
61
+        if ($row['statut'] === '0minirezo' && $row['webmestre'] === 'oui' && isset($row['backup_cles'])) {
62
+            $auteur_peut_sauver_cles = true;
63
+        }
64
+    }
65
+
66
+    // login inexistant ou mot de passe vide
67
+    if (!$pass || !$row) {
68
+        return [];
69
+    }
70
+
71
+    $cles = SpipCles::instance();
72
+    $secret = $cles->getSecretAuth();
73
+
74
+    $hash = null;
75
+    switch (strlen((string) $row['pass'])) {
76
+        // legacy = md5 ou sha256
77
+        case 32:
78
+            // tres anciens mots de passe encodes en md5(alea.pass)
79
+            $hash = md5($row['alea_actuel'] . $pass);
80
+            $methode = 'md5';
81
+        case 64:
82
+            if (empty($hash)) {
83
+                // anciens mots de passe encodes en sha256(alea.pass)
84
+                include_spip('auth/sha256.inc');
85
+                $hash = spip_sha256($row['alea_actuel'] . $pass);
86
+                $methode = 'sha256';
87
+            }
88
+            if ($row['pass'] === $hash) {
89
+                spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG);
90
+                // 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
91
+                if (!empty($row['backup_cles'])) {
92
+                    sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . (int) $row['id_auteur']);
93
+                }
94
+                break;
95
+            }
96
+
97
+        // on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long
98
+
99
+        case 60:
100
+        case 98:
101
+        default:
102
+            // doit-on restaurer un backup des cles ?
103
+            // si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass
104
+            if (
105
+                !$secret
106
+                && $auteur_peut_sauver_cles
107
+                && !empty($row['backup_cles'])
108
+            ) {
109
+                if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
110
+                    spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
111
+                    if ($cles->save()) {
112
+                        $secret = $cles->getSecretAuth();
113
+                    }
114
+                    else {
115
+                        spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
116
+                        // et on echoue car on ne veut pas que la situation reste telle quelle
117
+                        raler_fichier(_DIR_ETC . 'cles.php');
118
+                    }
119
+                }
120
+                else {
121
+                    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);
122
+                    sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . (int) $row['id_auteur']);
123
+                }
124
+            }
125
+
126
+            if (!$secret || !Password::verifier($pass, $row['pass'], $secret)) {
127
+                unset($row);
128
+            }
129
+            else {
130
+                spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG);
131
+            }
132
+            break;
133
+    }
134
+
135
+    // Migration depuis ancienne version : si on a pas encore de cle
136
+    // ET si c'est le login d'un auteur qui peut sauver la cle
137
+    // créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php)
138
+    // 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
139
+    if (!$secret && $auteur_peut_sauver_cles && auth_spip_initialiser_secret()) {
140
+        $secret = $cles->getSecretAuth();
141
+    }
142
+
143
+    // login/mot de passe incorrect
144
+    if (empty($row)) {
145
+        return [];
146
+    }
147
+
148
+    // fait tourner le codage du pass dans la base
149
+    // sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
150
+    if (!$phpauth && $secret) {
151
+        include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess
152
+        $pass_hash_next = Password::hacher($pass, $secret);
153
+        if ($pass_hash_next) {
154
+            $set = [
155
+                'alea_actuel' => 'alea_futur', // @deprecated 4.1
156
+                'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1
157
+                'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
158
+            ];
159
+
160
+            // regenerer un htpass si on a active/desactive le plugin htpasswd
161
+            // et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo
162
+            $htpass = generer_htpass($pass);
163
+            if (strlen((string) $htpass) !== strlen((string) $row['htpass'])) {
164
+                $set['htpass'] = sql_quote($htpass, $serveur, 'text');
165
+            }
166
+
167
+            // a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre)
168
+            if ($auteur_peut_sauver_cles) {
169
+                $set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text');
170
+            }
171
+
172
+            @sql_update(
173
+                'spip_auteurs',
174
+                $set,
175
+                'id_auteur=' . (int) $row['id_auteur'] . ' AND pass=' . sql_quote(
176
+                    $row['pass'],
177
+                    $serveur,
178
+                    'text'
179
+                ),
180
+                [],
181
+                $serveur
182
+            );
183
+
184
+            // si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd
185
+            if (isset($set['htpass'])) {
186
+                ecrire_acces();
187
+            }
188
+        }
189
+
190
+        // En profiter pour verifier la securite de tmp/
191
+        // Si elle ne fonctionne pas a l'installation, prevenir
192
+        if (!verifier_htaccess(_DIR_TMP) && defined('_ECRIRE_INSTALL')) {
193
+            return false;
194
+        }
195
+    }
196
+
197
+    return $row;
198 198
 }
199 199
 
200 200
 /**
@@ -209,36 +209,36 @@  discard block
 block discarded – undo
209 209
  * @return bool
210 210
  */
211 211
 function auth_spip_initialiser_secret(bool $force = false): bool {
212
-	$cles = SpipCles::instance();
213
-	$secret = $cles->getSecretAuth();
214
-
215
-	// on ne fait rien si on a un secret dispo
216
-	if ($secret) {
217
-		return false;
218
-	}
219
-
220
-	// si force, on ne verifie pas la presence d'un backup chez un webmestre
221
-	if ($force) {
222
-		spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
223
-		$secret = $cles->getSecretAuth(true);
224
-		return true;
225
-	}
226
-
227
-	$has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
228
-	$has_backup = array_column($has_backup, 'id_auteur');
229
-	if ($has_backup === []) {
230
-		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);
231
-		if ($secret = $cles->getSecretAuth(true)) {
232
-			return true;
233
-		}
234
-		spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
235
-		// et on echoue car on ne veut pas que la situation reste telle quelle
236
-		raler_fichier(_DIR_ETC . 'cles.php');
237
-	}
238
-	else {
239
-		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);
240
-	}
241
-	return false;
212
+    $cles = SpipCles::instance();
213
+    $secret = $cles->getSecretAuth();
214
+
215
+    // on ne fait rien si on a un secret dispo
216
+    if ($secret) {
217
+        return false;
218
+    }
219
+
220
+    // si force, on ne verifie pas la presence d'un backup chez un webmestre
221
+    if ($force) {
222
+        spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
223
+        $secret = $cles->getSecretAuth(true);
224
+        return true;
225
+    }
226
+
227
+    $has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
228
+    $has_backup = array_column($has_backup, 'id_auteur');
229
+    if ($has_backup === []) {
230
+        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);
231
+        if ($secret = $cles->getSecretAuth(true)) {
232
+            return true;
233
+        }
234
+        spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
235
+        // et on echoue car on ne veut pas que la situation reste telle quelle
236
+        raler_fichier(_DIR_ETC . 'cles.php');
237
+    }
238
+    else {
239
+        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);
240
+    }
241
+    return false;
242 242
 }
243 243
 
244 244
 /**
@@ -248,19 +248,19 @@  discard block
 block discarded – undo
248 248
  * @return array
249 249
  */
250 250
 function auth_spip_formulaire_login($flux) {
251
-	// javascript qui gere la securite du login en evitant de faire circuler le pass en clair
252
-	$js = file_get_contents(find_in_path('prive/javascript/login.js'));
253
-	$flux['data'] .=
254
-		  '<script type="text/javascript">/*<![CDATA[*/'
255
-		. "$js\n"
256
-		. "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
257
-		. "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
258
-		. "'informe_auteur_en_cours':false,"
259
-		. "'attente_informe':0};"
260
-		. "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
261
-		. '/*]]>*/</script>';
262
-
263
-	return $flux;
251
+    // javascript qui gere la securite du login en evitant de faire circuler le pass en clair
252
+    $js = file_get_contents(find_in_path('prive/javascript/login.js'));
253
+    $flux['data'] .=
254
+            '<script type="text/javascript">/*<![CDATA[*/'
255
+        . "$js\n"
256
+        . "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
257
+        . "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
258
+        . "'informe_auteur_en_cours':false,"
259
+        . "'attente_informe':0};"
260
+        . "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
261
+        . '/*]]>*/</script>';
262
+
263
+    return $flux;
264 264
 }
265 265
 
266 266
 
@@ -272,8 +272,8 @@  discard block
 block discarded – undo
272 272
  *   toujours true pour un auteur cree dans SPIP
273 273
  */
274 274
 function auth_spip_autoriser_modifier_login(string $serveur = ''): bool {
275
-	// les fonctions d'ecriture sur base distante sont encore incompletes
276
-	return !strlen($serveur);
275
+    // les fonctions d'ecriture sur base distante sont encore incompletes
276
+    return !strlen($serveur);
277 277
 }
278 278
 
279 279
 /**
@@ -287,25 +287,25 @@  discard block
 block discarded – undo
287 287
  *  message d'erreur si login non valide, chaine vide sinon
288 288
  */
289 289
 function auth_spip_verifier_login($new_login, $id_auteur = 0, $serveur = '') {
290
-	// login et mot de passe
291
-	if (strlen($new_login)) {
292
-		if (strlen($new_login) < _LOGIN_TROP_COURT) {
293
-			return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]);
294
-		} else {
295
-			$n = sql_countsel(
296
-				'spip_auteurs',
297
-				'login=' . sql_quote($new_login) . ' AND id_auteur!=' . (int) $id_auteur . " AND statut!='5poubelle'",
298
-				'',
299
-				'',
300
-				$serveur
301
-			);
302
-			if ($n) {
303
-				return _T('info_login_existant');
304
-			}
305
-		}
306
-	}
307
-
308
-	return '';
290
+    // login et mot de passe
291
+    if (strlen($new_login)) {
292
+        if (strlen($new_login) < _LOGIN_TROP_COURT) {
293
+            return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]);
294
+        } else {
295
+            $n = sql_countsel(
296
+                'spip_auteurs',
297
+                'login=' . sql_quote($new_login) . ' AND id_auteur!=' . (int) $id_auteur . " AND statut!='5poubelle'",
298
+                '',
299
+                '',
300
+                $serveur
301
+            );
302
+            if ($n) {
303
+                return _T('info_login_existant');
304
+            }
305
+        }
306
+    }
307
+
308
+    return '';
309 309
 }
310 310
 
311 311
 /**
@@ -317,41 +317,41 @@  discard block
 block discarded – undo
317 317
  * @return bool
318 318
  */
319 319
 function auth_spip_modifier_login($new_login, $id_auteur, $serveur = '') {
320
-	if (is_null($new_login) || auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') {
321
-		return false;
322
-	}
323
-	if (
324
-		!($id_auteur = (int) $id_auteur)
325
-		|| !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur, '', '', '', '', $serveur)
326
-	) {
327
-		return false;
328
-	}
329
-	if ($new_login == $auteur['login']) {
330
-		return true;
331
-	} // on a rien fait mais c'est bon !
332
-
333
-	include_spip('action/editer_auteur');
334
-
335
-	// vider le login des auteurs a la poubelle qui avaient ce meme login
336
-	if (strlen($new_login)) {
337
-		$anciens = sql_allfetsel(
338
-			'id_auteur',
339
-			'spip_auteurs',
340
-			'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
341
-			'',
342
-			'',
343
-			'',
344
-			'',
345
-			$serveur
346
-		);
347
-		while ($row = array_pop($anciens)) {
348
-			auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur
349
-		}
350
-	}
351
-
352
-	auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur
353
-
354
-	return true;
320
+    if (is_null($new_login) || auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') {
321
+        return false;
322
+    }
323
+    if (
324
+        !($id_auteur = (int) $id_auteur)
325
+        || !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur, '', '', '', '', $serveur)
326
+    ) {
327
+        return false;
328
+    }
329
+    if ($new_login == $auteur['login']) {
330
+        return true;
331
+    } // on a rien fait mais c'est bon !
332
+
333
+    include_spip('action/editer_auteur');
334
+
335
+    // vider le login des auteurs a la poubelle qui avaient ce meme login
336
+    if (strlen($new_login)) {
337
+        $anciens = sql_allfetsel(
338
+            'id_auteur',
339
+            'spip_auteurs',
340
+            'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
341
+            '',
342
+            '',
343
+            '',
344
+            '',
345
+            $serveur
346
+        );
347
+        while ($row = array_pop($anciens)) {
348
+            auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur
349
+        }
350
+    }
351
+
352
+    auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur
353
+
354
+    return true;
355 355
 }
356 356
 
357 357
 /**
@@ -363,44 +363,44 @@  discard block
 block discarded – undo
363 363
  * @return string
364 364
  */
365 365
 function auth_spip_retrouver_login($login, $serveur = '') {
366
-	if (!strlen($login)) {
367
-		return null;
368
-	} // pas la peine de requeter
369
-	$l = sql_quote($login, $serveur, 'text');
370
-	if (
371
-		$r = sql_getfetsel(
372
-			'login',
373
-			'spip_auteurs',
374
-			"statut<>'5poubelle'" .
375
-			' AND (length(pass)>0)' .
376
-			" AND (login=$l)",
377
-			'',
378
-			'',
379
-			'',
380
-			'',
381
-			$serveur
382
-		)
383
-	) {
384
-		return $r;
385
-	}
386
-	// Si pas d'auteur avec ce login
387
-	// regarder s'il a saisi son nom ou son mail.
388
-	// Ne pas fusionner avec la requete precedente
389
-	// car un nom peut etre homonyme d'un autre login
390
-	else {
391
-		return sql_getfetsel(
392
-			'login',
393
-			'spip_auteurs',
394
-			"statut<>'5poubelle'" .
395
-			' AND (length(pass)>0)' .
396
-			" AND (login<>'' AND (nom=$l OR email=$l))",
397
-			'',
398
-			'',
399
-			'',
400
-			'',
401
-			$serveur
402
-		);
403
-	}
366
+    if (!strlen($login)) {
367
+        return null;
368
+    } // pas la peine de requeter
369
+    $l = sql_quote($login, $serveur, 'text');
370
+    if (
371
+        $r = sql_getfetsel(
372
+            'login',
373
+            'spip_auteurs',
374
+            "statut<>'5poubelle'" .
375
+            ' AND (length(pass)>0)' .
376
+            " AND (login=$l)",
377
+            '',
378
+            '',
379
+            '',
380
+            '',
381
+            $serveur
382
+        )
383
+    ) {
384
+        return $r;
385
+    }
386
+    // Si pas d'auteur avec ce login
387
+    // regarder s'il a saisi son nom ou son mail.
388
+    // Ne pas fusionner avec la requete precedente
389
+    // car un nom peut etre homonyme d'un autre login
390
+    else {
391
+        return sql_getfetsel(
392
+            'login',
393
+            'spip_auteurs',
394
+            "statut<>'5poubelle'" .
395
+            ' AND (length(pass)>0)' .
396
+            " AND (login<>'' AND (nom=$l OR email=$l))",
397
+            '',
398
+            '',
399
+            '',
400
+            '',
401
+            $serveur
402
+        );
403
+    }
404 404
 }
405 405
 
406 406
 /**
@@ -411,8 +411,8 @@  discard block
 block discarded – undo
411 411
  *  toujours true pour un auteur cree dans SPIP
412 412
  */
413 413
 function auth_spip_autoriser_modifier_pass(string $serveur = ''): bool {
414
-	// les fonctions d'ecriture sur base distante sont encore incompletes
415
-	return !strlen($serveur);
414
+    // les fonctions d'ecriture sur base distante sont encore incompletes
415
+    return !strlen($serveur);
416 416
 }
417 417
 
418 418
 
@@ -433,12 +433,12 @@  discard block
 block discarded – undo
433 433
  *  message d'erreur si login non valide, chaine vide sinon
434 434
  */
435 435
 function auth_spip_verifier_pass($login, #[\SensitiveParameter] $new_pass, $id_auteur = 0, $serveur = '') {
436
-	// login et mot de passe
437
-	if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
438
-		return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]);
439
-	}
436
+    // login et mot de passe
437
+    if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
438
+        return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]);
439
+    }
440 440
 
441
-	return '';
441
+    return '';
442 442
 }
443 443
 
444 444
 /**
@@ -452,47 +452,47 @@  discard block
 block discarded – undo
452 452
  * @return bool
453 453
  */
454 454
 function auth_spip_modifier_pass($login, #[\SensitiveParameter] $new_pass, $id_auteur, $serveur = '') {
455
-	if (is_null($new_pass) || auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
456
-		return false;
457
-	}
458
-
459
-	if (
460
-		!($id_auteur = (int) $id_auteur)
461
-		|| !($auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur, '', '', '', '', $serveur))
462
-	) {
463
-		return false;
464
-	}
465
-
466
-	$cles = SpipCles::instance();
467
-	$secret = $cles->getSecretAuth();
468
-	if (!$secret) {
469
-		if (auth_spip_initialiser_secret()) {
470
-			$secret = $cles->getSecretAuth();
471
-		}
472
-		else {
473
-			return false;
474
-		}
475
-	}
476
-
477
-
478
-	include_spip('inc/acces');
479
-	$set = [
480
-		'pass' => Password::hacher($new_pass, $secret),
481
-		'htpass' => generer_htpass($new_pass),
482
-		'alea_actuel' => creer_uniqid(), // @deprecated 4.1
483
-		'alea_futur' => creer_uniqid(), // @deprecated 4.1
484
-		'low_sec' => '',
485
-	];
486
-
487
-	// si c'est un webmestre, on met a jour son backup des cles
488
-	if ($auteur['statut'] === '0minirezo' && $auteur['webmestre'] === 'oui') {
489
-		$set['backup_cles'] = $cles->backup($new_pass);
490
-	}
491
-
492
-	include_spip('action/editer_auteur');
493
-	auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur
494
-
495
-	return true; // on a bien modifie le pass
455
+    if (is_null($new_pass) || auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
456
+        return false;
457
+    }
458
+
459
+    if (
460
+        !($id_auteur = (int) $id_auteur)
461
+        || !($auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur, '', '', '', '', $serveur))
462
+    ) {
463
+        return false;
464
+    }
465
+
466
+    $cles = SpipCles::instance();
467
+    $secret = $cles->getSecretAuth();
468
+    if (!$secret) {
469
+        if (auth_spip_initialiser_secret()) {
470
+            $secret = $cles->getSecretAuth();
471
+        }
472
+        else {
473
+            return false;
474
+        }
475
+    }
476
+
477
+
478
+    include_spip('inc/acces');
479
+    $set = [
480
+        'pass' => Password::hacher($new_pass, $secret),
481
+        'htpass' => generer_htpass($new_pass),
482
+        'alea_actuel' => creer_uniqid(), // @deprecated 4.1
483
+        'alea_futur' => creer_uniqid(), // @deprecated 4.1
484
+        'low_sec' => '',
485
+    ];
486
+
487
+    // si c'est un webmestre, on met a jour son backup des cles
488
+    if ($auteur['statut'] === '0minirezo' && $auteur['webmestre'] === 'oui') {
489
+        $set['backup_cles'] = $cles->backup($new_pass);
490
+    }
491
+
492
+    include_spip('action/editer_auteur');
493
+    auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur
494
+
495
+    return true; // on a bien modifie le pass
496 496
 }
497 497
 
498 498
 /**
@@ -506,54 +506,54 @@  discard block
 block discarded – undo
506 506
  * @return void
507 507
  */
508 508
 function auth_spip_synchroniser_distant($id_auteur, $champs, $options = [], string $serveur = ''): void {
509
-	// ne rien faire pour une base distante : on ne sait pas regenerer les htaccess
510
-	if (strlen($serveur)) {
511
-		return;
512
-	}
513
-	// si un login, pass ou statut a ete modifie
514
-	// regenerer les fichier htpass
515
-	if (
516
-		isset($champs['login']) || isset($champs['pass']) || isset($champs['statut']) || isset($options['all']) && $options['all']
517
-	) {
518
-		$htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
519
-		$htpasswd = _DIR_TMP . _AUTH_USER_FILE;
520
-
521
-		// Cette variable de configuration peut etre posee par un plugin
522
-		// par exemple acces_restreint ;
523
-		// si .htaccess existe, outrepasser spip_meta
524
-		if (
525
-			(!isset($GLOBALS['meta']['creer_htpasswd']) || $GLOBALS['meta']['creer_htpasswd'] != 'oui') && !@file_exists($htaccess)
526
-		) {
527
-			spip_unlink($htpasswd);
528
-			spip_unlink($htpasswd . '-admin');
529
-
530
-			return;
531
-		}
532
-
533
-		# remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
534
-		# de devenir redacteur le cas echeant (auth http)... a nettoyer
535
-		// attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
536
-
537
-		$p1 = ''; // login:htpass pour tous
538
-		$p2 = ''; // login:htpass pour les admins
539
-		$s = sql_select(
540
-			'login, htpass, statut',
541
-			'spip_auteurs',
542
-			sql_in('statut', ['1comite', '0minirezo', 'nouveau'])
543
-		);
544
-		while ($t = sql_fetch($s)) {
545
-			if (strlen((string) $t['login']) && strlen((string) $t['htpass'])) {
546
-				$p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
547
-				if ($t['statut'] == '0minirezo') {
548
-					$p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
549
-				}
550
-			}
551
-		}
552
-		sql_free($s);
553
-		if ($p1) {
554
-			ecrire_fichier($htpasswd, $p1);
555
-			ecrire_fichier($htpasswd . '-admin', $p2);
556
-			spip_log("Ecriture de $htpasswd et $htpasswd-admin");
557
-		}
558
-	}
509
+    // ne rien faire pour une base distante : on ne sait pas regenerer les htaccess
510
+    if (strlen($serveur)) {
511
+        return;
512
+    }
513
+    // si un login, pass ou statut a ete modifie
514
+    // regenerer les fichier htpass
515
+    if (
516
+        isset($champs['login']) || isset($champs['pass']) || isset($champs['statut']) || isset($options['all']) && $options['all']
517
+    ) {
518
+        $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
519
+        $htpasswd = _DIR_TMP . _AUTH_USER_FILE;
520
+
521
+        // Cette variable de configuration peut etre posee par un plugin
522
+        // par exemple acces_restreint ;
523
+        // si .htaccess existe, outrepasser spip_meta
524
+        if (
525
+            (!isset($GLOBALS['meta']['creer_htpasswd']) || $GLOBALS['meta']['creer_htpasswd'] != 'oui') && !@file_exists($htaccess)
526
+        ) {
527
+            spip_unlink($htpasswd);
528
+            spip_unlink($htpasswd . '-admin');
529
+
530
+            return;
531
+        }
532
+
533
+        # remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
534
+        # de devenir redacteur le cas echeant (auth http)... a nettoyer
535
+        // attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
536
+
537
+        $p1 = ''; // login:htpass pour tous
538
+        $p2 = ''; // login:htpass pour les admins
539
+        $s = sql_select(
540
+            'login, htpass, statut',
541
+            'spip_auteurs',
542
+            sql_in('statut', ['1comite', '0minirezo', 'nouveau'])
543
+        );
544
+        while ($t = sql_fetch($s)) {
545
+            if (strlen((string) $t['login']) && strlen((string) $t['htpass'])) {
546
+                $p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
547
+                if ($t['statut'] == '0minirezo') {
548
+                    $p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
549
+                }
550
+            }
551
+        }
552
+        sql_free($s);
553
+        if ($p1) {
554
+            ecrire_fichier($htpasswd, $p1);
555
+            ecrire_fichier($htpasswd . '-admin', $p2);
556
+            spip_log("Ecriture de $htpasswd et $htpasswd-admin");
557
+        }
558
+    }
559 559
 }
Please login to merge, or discard this patch.
ecrire/iterateur/data.php 1 patch
Indentation   +124 added lines, -124 removed lines patch added patch discarded remove patch
@@ -18,11 +18,11 @@  discard block
 block discarded – undo
18 18
  **/
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 if (!defined('_DATA_SOURCE_MAX_SIZE')) {
25
-	define('_DATA_SOURCE_MAX_SIZE', 2 * 1_048_576);
25
+    define('_DATA_SOURCE_MAX_SIZE', 2 * 1_048_576);
26 26
 }
27 27
 
28 28
 
@@ -43,17 +43,17 @@  discard block
 block discarded – undo
43 43
  *     Description de la boucle complétée des champs
44 44
  */
45 45
 function iterateur_DATA_dist($b) {
46
-	$b->iterateur = 'DATA'; # designe la classe d'iterateur
47
-	$b->show = [
48
-		'field' => [
49
-			'cle' => 'STRING',
50
-			'valeur' => 'STRING',
51
-			'*' => 'ALL' // Champ joker *
52
-		]
53
-	];
54
-	$b->select[] = '.valeur';
55
-
56
-	return $b;
46
+    $b->iterateur = 'DATA'; # designe la classe d'iterateur
47
+    $b->show = [
48
+        'field' => [
49
+            'cle' => 'STRING',
50
+            'valeur' => 'STRING',
51
+            '*' => 'ALL' // Champ joker *
52
+        ]
53
+    ];
54
+    $b->select[] = '.valeur';
55
+
56
+    return $b;
57 57
 }
58 58
 
59 59
 
@@ -68,7 +68,7 @@  discard block
 block discarded – undo
68 68
  * @return array
69 69
  */
70 70
 function inc_file_to_array_dist($data) {
71
-	return preg_split('/\r?\n/', $data);
71
+    return preg_split('/\r?\n/', $data);
72 72
 }
73 73
 
74 74
 /**
@@ -77,9 +77,9 @@  discard block
 block discarded – undo
77 77
  * @return array
78 78
  */
79 79
 function inc_plugins_to_array_dist() {
80
-	include_spip('inc/plugin');
80
+    include_spip('inc/plugin');
81 81
 
82
-	return liste_chemin_plugin_actifs();
82
+    return liste_chemin_plugin_actifs();
83 83
 }
84 84
 
85 85
 /**
@@ -89,7 +89,7 @@  discard block
 block discarded – undo
89 89
  * @return array
90 90
  */
91 91
 function inc_xml_to_array_dist($data) {
92
-	return @XMLObjectToArray(new SimpleXmlIterator($data));
92
+    return @XMLObjectToArray(new SimpleXmlIterator($data));
93 93
 }
94 94
 
95 95
 /**
@@ -101,14 +101,14 @@  discard block
 block discarded – undo
101 101
  *
102 102
  */
103 103
 function inc_object_to_array($object) {
104
-	if (!is_object($object) && !is_array($object)) {
105
-		return $object;
106
-	}
107
-	if (is_object($object)) {
108
-		$object = get_object_vars($object);
109
-	}
110
-
111
-	return array_map('inc_object_to_array', $object);
104
+    if (!is_object($object) && !is_array($object)) {
105
+        return $object;
106
+    }
107
+    if (is_object($object)) {
108
+        $object = get_object_vars($object);
109
+    }
110
+
111
+    return array_map('inc_object_to_array', $object);
112 112
 }
113 113
 
114 114
 /**
@@ -118,20 +118,20 @@  discard block
 block discarded – undo
118 118
  * @return array|bool
119 119
  */
120 120
 function inc_sql_to_array_dist($data) {
121
-	# sortir le connecteur de $data
122
-	preg_match(',^(?:(\w+):)?(.*)$,Sm', $data, $v);
123
-	$serveur = (string)$v[1];
124
-	$req = trim($v[2]);
125
-	if ($s = sql_query($req, $serveur)) {
126
-		$r = [];
127
-		while ($t = sql_fetch($s)) {
128
-			$r[] = $t;
129
-		}
130
-
131
-		return $r;
132
-	}
133
-
134
-	return false;
121
+    # sortir le connecteur de $data
122
+    preg_match(',^(?:(\w+):)?(.*)$,Sm', $data, $v);
123
+    $serveur = (string)$v[1];
124
+    $req = trim($v[2]);
125
+    if ($s = sql_query($req, $serveur)) {
126
+        $r = [];
127
+        while ($t = sql_fetch($s)) {
128
+            $r[] = $t;
129
+        }
130
+
131
+        return $r;
132
+    }
133
+
134
+    return false;
135 135
 }
136 136
 
137 137
 /**
@@ -141,13 +141,13 @@  discard block
 block discarded – undo
141 141
  * @return array|bool
142 142
  */
143 143
 function inc_json_to_array_dist($data) {
144
-	try {
145
-		$json = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
146
-	} catch (JsonException $e) {
147
-		$json = null;
148
-		spip_log('Failed to parse Json data : ' . $e->getMessage(), _LOG_INFO);
149
-	}
150
-	return is_array($json) ? (array) $json : [];
144
+    try {
145
+        $json = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
146
+    } catch (JsonException $e) {
147
+        $json = null;
148
+        spip_log('Failed to parse Json data : ' . $e->getMessage(), _LOG_INFO);
149
+    }
150
+    return is_array($json) ? (array) $json : [];
151 151
 }
152 152
 
153 153
 /**
@@ -157,30 +157,30 @@  discard block
 block discarded – undo
157 157
  * @return array|bool
158 158
  */
159 159
 function inc_csv_to_array_dist($data) {
160
-	include_spip('inc/csv');
161
-	[$entete, $csv] = analyse_csv($data);
162
-	array_unshift($csv, $entete);
163
-
164
-	include_spip('inc/charsets');
165
-	$i = 1;
166
-	foreach ($entete as $k => $v) {
167
-		if (trim((string) $v) == '') {
168
-			$v = 'col' . $i;
169
-		} // reperer des eventuelles cases vides
170
-		if (is_numeric($v) && $v < 0) {
171
-			$v = '__' . $v;
172
-		} // ne pas risquer d'ecraser une cle numerique
173
-		if (is_numeric($v)) {
174
-			$v = '_' . $v;
175
-		} // ne pas risquer d'ecraser une cle numerique
176
-		$v = strtolower(preg_replace(',\W+,', '_', (string) translitteration($v)));
177
-		foreach ($csv as &$item) {
178
-			$item[$v] = &$item[$k];
179
-		}
180
-		$i++;
181
-	}
182
-
183
-	return $csv;
160
+    include_spip('inc/csv');
161
+    [$entete, $csv] = analyse_csv($data);
162
+    array_unshift($csv, $entete);
163
+
164
+    include_spip('inc/charsets');
165
+    $i = 1;
166
+    foreach ($entete as $k => $v) {
167
+        if (trim((string) $v) == '') {
168
+            $v = 'col' . $i;
169
+        } // reperer des eventuelles cases vides
170
+        if (is_numeric($v) && $v < 0) {
171
+            $v = '__' . $v;
172
+        } // ne pas risquer d'ecraser une cle numerique
173
+        if (is_numeric($v)) {
174
+            $v = '_' . $v;
175
+        } // ne pas risquer d'ecraser une cle numerique
176
+        $v = strtolower(preg_replace(',\W+,', '_', (string) translitteration($v)));
177
+        foreach ($csv as &$item) {
178
+            $item[$v] = &$item[$k];
179
+        }
180
+        $i++;
181
+    }
182
+
183
+    return $csv;
184 184
 }
185 185
 
186 186
 /**
@@ -190,13 +190,13 @@  discard block
 block discarded – undo
190 190
  * @return array|bool
191 191
  */
192 192
 function inc_rss_to_array_dist($data) {
193
-	$tableau = null;
194
-	include_spip('inc/syndic');
195
-	if (is_array($rss = analyser_backend($data))) {
196
-		$tableau = $rss;
197
-	}
193
+    $tableau = null;
194
+    include_spip('inc/syndic');
195
+    if (is_array($rss = analyser_backend($data))) {
196
+        $tableau = $rss;
197
+    }
198 198
 
199
-	return $tableau;
199
+    return $tableau;
200 200
 }
201 201
 
202 202
 /**
@@ -206,9 +206,9 @@  discard block
 block discarded – undo
206 206
  * @return array|bool
207 207
  */
208 208
 function inc_atom_to_array_dist($data) {
209
-	$rss_to_array = charger_fonction('rss_to_array', 'inc');
209
+    $rss_to_array = charger_fonction('rss_to_array', 'inc');
210 210
 
211
-	return $rss_to_array($data);
211
+    return $rss_to_array($data);
212 212
 }
213 213
 
214 214
 /**
@@ -219,12 +219,12 @@  discard block
 block discarded – undo
219 219
  * @return array|bool
220 220
  */
221 221
 function inc_glob_to_array_dist($data) {
222
-	$a = glob(
223
-		$data,
224
-		GLOB_MARK | GLOB_NOSORT | GLOB_BRACE
225
-	);
222
+    $a = glob(
223
+        $data,
224
+        GLOB_MARK | GLOB_NOSORT | GLOB_BRACE
225
+    );
226 226
 
227
-	return $a ?: [];
227
+    return $a ?: [];
228 228
 }
229 229
 
230 230
 /**
@@ -235,14 +235,14 @@  discard block
 block discarded – undo
235 235
  * @throws Exception
236 236
  */
237 237
 function inc_yaml_to_array_dist($data) {
238
-	include_spip('inc/yaml-mini');
239
-	if (!function_exists('yaml_decode')) {
240
-		throw new Exception('YAML: impossible de trouver la fonction yaml_decode');
238
+    include_spip('inc/yaml-mini');
239
+    if (!function_exists('yaml_decode')) {
240
+        throw new Exception('YAML: impossible de trouver la fonction yaml_decode');
241 241
 
242
-		return false;
243
-	}
242
+        return false;
243
+    }
244 244
 
245
-	return yaml_decode($data);
245
+    return yaml_decode($data);
246 246
 }
247 247
 
248 248
 
@@ -257,7 +257,7 @@  discard block
 block discarded – undo
257 257
  * @return array|bool
258 258
  */
259 259
 function inc_pregfiles_to_array_dist($dir, $regexp = -1, $limit = 10000) {
260
-	return (array)preg_files($dir, $regexp, $limit);
260
+    return (array)preg_files($dir, $regexp, $limit);
261 261
 }
262 262
 
263 263
 /**
@@ -269,23 +269,23 @@  discard block
 block discarded – undo
269 269
  * @return array|bool
270 270
  */
271 271
 function inc_ls_to_array_dist($data) {
272
-	$glob_to_array = charger_fonction('glob_to_array', 'inc');
273
-	$a = $glob_to_array($data);
274
-	foreach ($a as &$v) {
275
-		$b = (array)@stat($v);
276
-		foreach (array_keys($b) as $k) {
277
-			if (is_numeric($k)) {
278
-				unset($b[$k]);
279
-			}
280
-		}
281
-		$b['file'] = preg_replace('`/$`', '', (string) $v) ;
282
-		$v = array_merge(
283
-			pathinfo((string) $v),
284
-			$b
285
-		);
286
-	}
287
-
288
-	return $a;
272
+    $glob_to_array = charger_fonction('glob_to_array', 'inc');
273
+    $a = $glob_to_array($data);
274
+    foreach ($a as &$v) {
275
+        $b = (array)@stat($v);
276
+        foreach (array_keys($b) as $k) {
277
+            if (is_numeric($k)) {
278
+                unset($b[$k]);
279
+            }
280
+        }
281
+        $b['file'] = preg_replace('`/$`', '', (string) $v) ;
282
+        $v = array_merge(
283
+            pathinfo((string) $v),
284
+            $b
285
+        );
286
+    }
287
+
288
+    return $a;
289 289
 }
290 290
 
291 291
 /**
@@ -295,21 +295,21 @@  discard block
 block discarded – undo
295 295
  * @return array|bool
296 296
  */
297 297
 function XMLObjectToArray($object) {
298
-	$xml_array = [];
299
-	for ($object->rewind(); $object->valid(); $object->next()) {
300
-		if (array_key_exists($key = $object->key(), $xml_array)) {
301
-			$key .= '-' . uniqid();
302
-		}
303
-		$vars = get_object_vars($object->current());
304
-		if (isset($vars['@attributes'])) {
305
-			foreach ($vars['@attributes'] as $k => $v) {
306
-				$xml_array[$key][$k] = $v;
307
-			}
308
-		}
309
-		$xml_array[$key][] = $object->hasChildren()
310
-			? XMLObjectToArray($object->current())
311
-			: (string) $object->current();
312
-	}
313
-
314
-	return $xml_array;
298
+    $xml_array = [];
299
+    for ($object->rewind(); $object->valid(); $object->next()) {
300
+        if (array_key_exists($key = $object->key(), $xml_array)) {
301
+            $key .= '-' . uniqid();
302
+        }
303
+        $vars = get_object_vars($object->current());
304
+        if (isset($vars['@attributes'])) {
305
+            foreach ($vars['@attributes'] as $k => $v) {
306
+                $xml_array[$key][$k] = $v;
307
+            }
308
+        }
309
+        $xml_array[$key][] = $object->hasChildren()
310
+            ? XMLObjectToArray($object->current())
311
+            : (string) $object->current();
312
+    }
313
+
314
+    return $xml_array;
315 315
 }
Please login to merge, or discard this patch.
ecrire/inc/pipelines.php 1 patch
Indentation   +129 added lines, -129 removed lines patch added patch discarded remove patch
@@ -15,10 +15,10 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\Pipelines
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 if (test_espace_prive()) {
21
-	include_spip('inc/pipelines_ecrire');
21
+    include_spip('inc/pipelines_ecrire');
22 22
 }
23 23
 
24 24
 
@@ -44,26 +44,26 @@  discard block
 block discarded – undo
44 44
  * @return string          Contenu qui sera inséré dans le head HTML
45 45
  **/
46 46
 function f_jQuery($texte) {
47
-	$x = '';
48
-	$jquery_plugins = pipeline(
49
-		'jquery_plugins',
50
-		[
51
-			'javascript/jquery.js',
52
-			'javascript/jquery.form.js',
53
-			'javascript/jquery.autosave.js',
54
-			'javascript/jquery.placeholder-label.js',
55
-			'javascript/ajaxCallback.js',
56
-			'javascript/js.cookie.js',
57
-		]
58
-	);
59
-	foreach (array_unique($jquery_plugins) as $script) {
60
-		if ($script = find_in_path(supprimer_timestamp($script))) {
61
-			$script = timestamp($script);
62
-			$x .= "\n<script src=\"$script\" type=\"text/javascript\"></script>\n";
63
-		}
64
-	}
47
+    $x = '';
48
+    $jquery_plugins = pipeline(
49
+        'jquery_plugins',
50
+        [
51
+            'javascript/jquery.js',
52
+            'javascript/jquery.form.js',
53
+            'javascript/jquery.autosave.js',
54
+            'javascript/jquery.placeholder-label.js',
55
+            'javascript/ajaxCallback.js',
56
+            'javascript/js.cookie.js',
57
+        ]
58
+    );
59
+    foreach (array_unique($jquery_plugins) as $script) {
60
+        if ($script = find_in_path(supprimer_timestamp($script))) {
61
+            $script = timestamp($script);
62
+            $x .= "\n<script src=\"$script\" type=\"text/javascript\"></script>\n";
63
+        }
64
+    }
65 65
 
66
-	return $x . $texte;
66
+    return $x . $texte;
67 67
 }
68 68
 
69 69
 
@@ -82,26 +82,26 @@  discard block
 block discarded – undo
82 82
  * @return string         Contenu de la page envoyée au navigateur
83 83
  **/
84 84
 function f_surligne($texte) {
85
-	if (!$GLOBALS['html']) {
86
-		return $texte;
87
-	}
88
-	$rech = _request('var_recherche');
89
-	if (
90
-		!$rech
91
-		&& (!defined('_SURLIGNE_RECHERCHE_REFERERS') || !_SURLIGNE_RECHERCHE_REFERERS || !isset($_SERVER['HTTP_REFERER']))
92
-	) {
93
-		return $texte;
94
-	}
95
-	include_spip('inc/surligne');
85
+    if (!$GLOBALS['html']) {
86
+        return $texte;
87
+    }
88
+    $rech = _request('var_recherche');
89
+    if (
90
+        !$rech
91
+        && (!defined('_SURLIGNE_RECHERCHE_REFERERS') || !_SURLIGNE_RECHERCHE_REFERERS || !isset($_SERVER['HTTP_REFERER']))
92
+    ) {
93
+        return $texte;
94
+    }
95
+    include_spip('inc/surligne');
96 96
 
97
-	if (isset($_SERVER['HTTP_REFERER'])) {
98
-		$_SERVER['HTTP_REFERER'] = preg_replace(',[^\w\,/#&;:-]+,', ' ', (string) $_SERVER['HTTP_REFERER']);
99
-	}
100
-	if ($rech) {
101
-		$rech = preg_replace(',[^\w\,/#&;:-]+,', ' ', (string) $rech);
102
-	}
97
+    if (isset($_SERVER['HTTP_REFERER'])) {
98
+        $_SERVER['HTTP_REFERER'] = preg_replace(',[^\w\,/#&;:-]+,', ' ', (string) $_SERVER['HTTP_REFERER']);
99
+    }
100
+    if ($rech) {
101
+        $rech = preg_replace(',[^\w\,/#&;:-]+,', ' ', (string) $rech);
102
+    }
103 103
 
104
-	return surligner_mots($texte, $rech);
104
+    return surligner_mots($texte, $rech);
105 105
 }
106 106
 
107 107
 /**
@@ -118,33 +118,33 @@  discard block
 block discarded – undo
118 118
  * @return string         Contenu de la page envoyée au navigateur
119 119
  **/
120 120
 function f_tidy($texte) {
121
-	/**
122
-	 * Indentation à faire ?
123
-	 *
124
-	 * - true : actif.
125
-	 * - false par défaut.
126
-	 */
121
+    /**
122
+     * Indentation à faire ?
123
+     *
124
+     * - true : actif.
125
+     * - false par défaut.
126
+     */
127 127
 
128
-	if (
129
-		$GLOBALS['xhtml']
130
-		&& $GLOBALS['html']
131
-		&& strlen($texte)
132
-		&& !headers_sent()
133
-	) {
134
-		# Compatibilite ascendante
135
-		if (!is_string($GLOBALS['xhtml'])) {
136
-			$GLOBALS['xhtml'] = 'tidy';
137
-		}
128
+    if (
129
+        $GLOBALS['xhtml']
130
+        && $GLOBALS['html']
131
+        && strlen($texte)
132
+        && !headers_sent()
133
+    ) {
134
+        # Compatibilite ascendante
135
+        if (!is_string($GLOBALS['xhtml'])) {
136
+            $GLOBALS['xhtml'] = 'tidy';
137
+        }
138 138
 
139
-		if (!$f = charger_fonction($GLOBALS['xhtml'], 'inc', true)) {
140
-			spip_log("tidy absent, l'indenteur SPIP le remplace");
141
-			$f = charger_fonction('sax', 'xml');
142
-		}
139
+        if (!$f = charger_fonction($GLOBALS['xhtml'], 'inc', true)) {
140
+            spip_log("tidy absent, l'indenteur SPIP le remplace");
141
+            $f = charger_fonction('sax', 'xml');
142
+        }
143 143
 
144
-		return $f($texte);
145
-	}
144
+        return $f($texte);
145
+    }
146 146
 
147
-	return $texte;
147
+    return $texte;
148 148
 }
149 149
 
150 150
 
@@ -163,24 +163,24 @@  discard block
 block discarded – undo
163 163
  * @return string         Contenu de la page envoyée au navigateur
164 164
  **/
165 165
 function f_insert_head($texte) {
166
-	if (!$GLOBALS['html']) {
167
-		return $texte;
168
-	}
169
-	include_spip('public/admin'); // pour strripos
166
+    if (!$GLOBALS['html']) {
167
+        return $texte;
168
+    }
169
+    include_spip('public/admin'); // pour strripos
170 170
 
171
-	if (
172
-		!($pos = stripos($texte, '</head>'))
173
-		&& !($pos = stripos($texte, '<body>'))
174
-	) {
175
-		$pos = 0;
176
-	}
171
+    if (
172
+        !($pos = stripos($texte, '</head>'))
173
+        && !($pos = stripos($texte, '<body>'))
174
+    ) {
175
+        $pos = 0;
176
+    }
177 177
 
178
-	if (!str_contains(substr($texte, 0, $pos), '<!-- insert_head -->')) {
179
-		$insert = "\n" . pipeline('insert_head', '<!-- f_insert_head -->') . "\n";
180
-		$texte = substr_replace($texte, $insert, $pos, 0);
181
-	}
178
+    if (!str_contains(substr($texte, 0, $pos), '<!-- insert_head -->')) {
179
+        $insert = "\n" . pipeline('insert_head', '<!-- f_insert_head -->') . "\n";
180
+        $texte = substr_replace($texte, $insert, $pos, 0);
181
+    }
182 182
 
183
-	return $texte;
183
+    return $texte;
184 184
 }
185 185
 
186 186
 
@@ -196,34 +196,34 @@  discard block
 block discarded – undo
196 196
  * @return string         Contenu de la page envoyée au navigateur
197 197
  **/
198 198
 function f_admin($texte) {
199
-	if (defined('_VAR_PREVIEW') && _VAR_PREVIEW && $GLOBALS['html']) {
200
-		include_spip('inc/filtres'); // pour http_img_pack
201
-		$x = "<div class='spip-previsu' "
202
-			. http_style_background('preview-32.png', '', 32)
203
-			. '>'
204
-			. _T('previsualisation')
205
-			. '</div>';
206
-		if (!$pos = stripos($texte, '</body>')) {
207
-			$pos = strlen($texte);
208
-		}
209
-		$texte = substr_replace($texte, $x, $pos, 0);
210
-		// pas de preview en fenetre enfant
211
-		$x = "<script type='text/javascript'>const frameEl = window.frameElement;if (frameEl) {frameEl.sandbox='sandbox';window.location.href='" . addslashes((string) $GLOBALS['meta']['adresse_site']) . "';}</script>";
212
-		if (!$pos = stripos($texte, '<head') || !$pos = strpos($texte, '>', $pos)) {
213
-			$pos = -1;
214
-		}
215
-		$texte = substr_replace($texte, $x, $pos + 1, 0);
216
-	}
199
+    if (defined('_VAR_PREVIEW') && _VAR_PREVIEW && $GLOBALS['html']) {
200
+        include_spip('inc/filtres'); // pour http_img_pack
201
+        $x = "<div class='spip-previsu' "
202
+            . http_style_background('preview-32.png', '', 32)
203
+            . '>'
204
+            . _T('previsualisation')
205
+            . '</div>';
206
+        if (!$pos = stripos($texte, '</body>')) {
207
+            $pos = strlen($texte);
208
+        }
209
+        $texte = substr_replace($texte, $x, $pos, 0);
210
+        // pas de preview en fenetre enfant
211
+        $x = "<script type='text/javascript'>const frameEl = window.frameElement;if (frameEl) {frameEl.sandbox='sandbox';window.location.href='" . addslashes((string) $GLOBALS['meta']['adresse_site']) . "';}</script>";
212
+        if (!$pos = stripos($texte, '<head') || !$pos = strpos($texte, '>', $pos)) {
213
+            $pos = -1;
214
+        }
215
+        $texte = substr_replace($texte, $x, $pos + 1, 0);
216
+    }
217 217
 
218
-	if (isset($GLOBALS['affiche_boutons_admin']) && $GLOBALS['affiche_boutons_admin']) {
219
-		include_spip('public/admin');
220
-		$texte = affiche_boutons_admin($texte);
221
-	}
222
-	if (_request('var_mode') == 'noajax') {
223
-		$texte = preg_replace(',(class=[\'"][^\'"]*)ajax([^\'"]*[\'"]),Uims', "\\1\\2", $texte);
224
-	}
218
+    if (isset($GLOBALS['affiche_boutons_admin']) && $GLOBALS['affiche_boutons_admin']) {
219
+        include_spip('public/admin');
220
+        $texte = affiche_boutons_admin($texte);
221
+    }
222
+    if (_request('var_mode') == 'noajax') {
223
+        $texte = preg_replace(',(class=[\'"][^\'"]*)ajax([^\'"]*[\'"]),Uims', "\\1\\2", $texte);
224
+    }
225 225
 
226
-	return $texte;
226
+    return $texte;
227 227
 }
228 228
 
229 229
 /**
@@ -241,11 +241,11 @@  discard block
 block discarded – undo
241 241
  * @return array $flux  Description et contenu de l'inclusion
242 242
  **/
243 243
 function f_recuperer_fond($flux) {
244
-	if (!test_espace_prive()) {
245
-		return $flux;
246
-	}
244
+    if (!test_espace_prive()) {
245
+        return $flux;
246
+    }
247 247
 
248
-	return f_afficher_blocs_ecrire($flux);
248
+    return f_afficher_blocs_ecrire($flux);
249 249
 }
250 250
 
251 251
 /**
@@ -259,30 +259,30 @@  discard block
 block discarded – undo
259 259
  * @return string         Contenu de la page envoyée au navigateur
260 260
  */
261 261
 function f_queue($texte) {
262
-	// eviter une inclusion si rien a faire
263
-	if (
264
-		_request('action') == 'cron'
265
-		|| queue_sleep_time_to_next_job() > 0
266
-		|| defined('_DEBUG_BLOCK_QUEUE')
267
-	) {
268
-		return $texte;
269
-	}
262
+    // eviter une inclusion si rien a faire
263
+    if (
264
+        _request('action') == 'cron'
265
+        || queue_sleep_time_to_next_job() > 0
266
+        || defined('_DEBUG_BLOCK_QUEUE')
267
+    ) {
268
+        return $texte;
269
+    }
270 270
 
271
-	include_spip('inc/queue');
272
-	$code = queue_affichage_cron();
271
+    include_spip('inc/queue');
272
+    $code = queue_affichage_cron();
273 273
 
274
-	// si rien a afficher
275
-	// ou si on est pas dans une page html, on ne sait rien faire de mieux
276
-	if (!$code || !isset($GLOBALS['html']) || !$GLOBALS['html']) {
277
-		return $texte;
278
-	}
274
+    // si rien a afficher
275
+    // ou si on est pas dans une page html, on ne sait rien faire de mieux
276
+    if (!$code || !isset($GLOBALS['html']) || !$GLOBALS['html']) {
277
+        return $texte;
278
+    }
279 279
 
280
-	// inserer avant le </body> fermant si on peut, a la fin de la page sinon
281
-	if (($p = strpos($texte, '</body>')) !== false) {
282
-		$texte = substr($texte, 0, $p) . $code . substr($texte, $p);
283
-	} else {
284
-		$texte .= $code;
285
-	}
280
+    // inserer avant le </body> fermant si on peut, a la fin de la page sinon
281
+    if (($p = strpos($texte, '</body>')) !== false) {
282
+        $texte = substr($texte, 0, $p) . $code . substr($texte, $p);
283
+    } else {
284
+        $texte .= $code;
285
+    }
286 286
 
287
-	return $texte;
287
+    return $texte;
288 288
 }
Please login to merge, or discard this patch.
ecrire/inc/exporter_csv.php 1 patch
Indentation   +120 added lines, -120 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('inc/charsets');
@@ -31,13 +31,13 @@  discard block
 block discarded – undo
31 31
  * @return string
32 32
  */
33 33
 function exporter_csv_champ($champ) {
34
-	#$champ = str_replace("\r", "\n", $champ);
35
-	#$champ = preg_replace(",[\n]+,ms", "\n", $champ);
36
-	#$champ = str_replace("\n", ", ", $champ);
37
-	$champ = preg_replace(',[\s]+,ms', ' ', $champ);
38
-	$champ = str_replace('"', '""', $champ);
34
+    #$champ = str_replace("\r", "\n", $champ);
35
+    #$champ = preg_replace(",[\n]+,ms", "\n", $champ);
36
+    #$champ = str_replace("\n", ", ", $champ);
37
+    $champ = preg_replace(',[\s]+,ms', ' ', $champ);
38
+    $champ = str_replace('"', '""', $champ);
39 39
 
40
-	return '"' . $champ . '"';
40
+    return '"' . $champ . '"';
41 41
 }
42 42
 
43 43
 /**
@@ -54,15 +54,15 @@  discard block
 block discarded – undo
54 54
  * @return string
55 55
  */
56 56
 function exporter_csv_ligne_numerotee($nb, $ligne, $delim = ',', $importer_charset = null, ?callable $callback = null) {
57
-	if ($callback) {
58
-		$ligne = $callback($nb, $ligne, $delim, $importer_charset);
59
-	}
60
-	$output = implode($delim, array_map('exporter_csv_champ', $ligne)) . "\r\n";
61
-	if ($importer_charset) {
62
-		$output = str_replace('’', '\'', $output);
63
-		$output = unicode2charset(html2unicode(charset2unicode($output)), $importer_charset);
64
-	}
65
-	return $output;
57
+    if ($callback) {
58
+        $ligne = $callback($nb, $ligne, $delim, $importer_charset);
59
+    }
60
+    $output = implode($delim, array_map('exporter_csv_champ', $ligne)) . "\r\n";
61
+    if ($importer_charset) {
62
+        $output = str_replace('’', '\'', $output);
63
+        $output = unicode2charset(html2unicode(charset2unicode($output)), $importer_charset);
64
+    }
65
+    return $output;
66 66
 }
67 67
 
68 68
 /**
@@ -74,7 +74,7 @@  discard block
 block discarded – undo
74 74
  * @return string
75 75
  */
76 76
 function exporter_csv_ligne($ligne, $delim = ',', $importer_charset = null) {
77
-	return exporter_csv_ligne_numerotee(null, $ligne, $delim, $importer_charset);
77
+    return exporter_csv_ligne_numerotee(null, $ligne, $delim, $importer_charset);
78 78
 }
79 79
 
80 80
 /**
@@ -104,107 +104,107 @@  discard block
 block discarded – undo
104 104
  */
105 105
 function inc_exporter_csv_dist($titre, $resource, $options = []) {
106 106
 
107
-	// support ancienne syntaxe
108
-	// inc_exporter_csv_dist($titre, $resource, $delim = ', ', $entetes = null, $envoyer = true)
109
-	if (is_string($options)) {
110
-		$args = func_get_args();
111
-		$options = [];
112
-		foreach ([2 => 'delim', 3 => 'entetes', 4 => 'envoyer'] as $k => $option) {
113
-			if (!empty($args[$k])) {
114
-				$options[$option] = $args[$k];
115
-			}
116
-		}
117
-	}
118
-
119
-	$default_options = [
120
-		'fichier' => null, // par défaut = $titre
121
-		'extension' => null, // par défaut = choix auto
122
-		'delim' => ',',
123
-		'entetes' => null,
124
-		'envoyer' => true,
125
-		'charset' => null,
126
-		'callback' => null,
127
-	];
128
-	$options = array_merge($default_options, $options);
129
-
130
-	// Délimiteur
131
-	if ($options['delim'] == 'TAB') {
132
-		$options['delim'] = "\t";
133
-	}
134
-	if (!in_array($options['delim'], [',', ';', "\t"])) {
135
-		$options['delim'] = ',';
136
-	}
137
-
138
-	// Nom du fichier : celui indiqué dans les options, sinon le titre
139
-	// Normalisation : uniquement les caractères non spéciaux, tirets, underscore et point + remplacer espaces par underscores
140
-	$filename = $options['fichier'] ?? translitteration(textebrut(typo($titre)));
141
-	$filename = preg_replace([',[^\w\-_\.\s]+,', ',\s+,'], ['', '_'], trim((string) $filename));
142
-	$filename = rtrim($filename, '.');
143
-
144
-	// Extension : celle indiquée en option, sinon choisie selon le délimiteur
145
-	// Normalisation : uniquement les charactères non spéciaux
146
-	if (!empty($options['extension'])) {
147
-		$options['extension'] = preg_replace(',[^\w]+,', '', trim((string) $options['extension']));
148
-	}
149
-	$extension = $options['extension'] ?? ($options['delim'] === ',' ? 'csv' : 'xls');
150
-
151
-	// Fichier
152
-	$basename = "$filename.$extension";
153
-
154
-	// Charset : celui indiqué en option, sinon celui compatible excel si nécessaire, sinon celui du site
155
-	// Excel n'accepte pas l'utf-8 ni les entites html... on transcode tout ce qu'on peut
156
-	$charset_site = $GLOBALS['meta']['charset'];
157
-	$charset_excel = ($extension === 'xls' ? 'iso-8859-1' : null);
158
-	$charset = $options['charset'] ?? $charset_excel ?? $charset_site;
159
-	$importer_charset = (($charset === $charset_site) ? null : $charset);
160
-
161
-	$output = '';
162
-	$nb = 0;
163
-	if (!empty($options['entetes']) && is_array($options['entetes'])) {
164
-		$output = exporter_csv_ligne_numerotee($nb, $options['entetes'], $options['delim'], $importer_charset, $options['callback']);
165
-	}
166
-	// les donnees commencent toujours a la ligne 1, qu'il y ait ou non des entetes
167
-	$nb++;
168
-
169
-	if ($options['envoyer']) {
170
-		$disposition = ($options['envoyer'] === 'attachment' ? 'attachment' : 'inline');
171
-		header("Content-Type: text/comma-separated-values; charset=$charset");
172
-		header("Content-Disposition: $disposition; filename=$basename");
173
-
174
-		// Vider tous les tampons
175
-		$level = @ob_get_level();
176
-		while ($level--) {
177
-			@ob_end_flush();
178
-		}
179
-	}
180
-
181
-	// si envoyer=='attachment' on passe par un fichier temporaire
182
-	// sinon on ecrit directement sur stdout
183
-	if ($options['envoyer'] && $options['envoyer'] !== 'attachment') {
184
-		$fichier = 'php://output';
185
-	}
186
-	else {
187
-		$fichier = sous_repertoire(_DIR_CACHE, 'export') . $basename;
188
-	}
189
-
190
-	$fp = fopen($fichier, 'w');
191
-	$length = fwrite($fp, $output);
192
-
193
-	while ($row = is_array($resource) ? array_shift($resource) : sql_fetch($resource)) {
194
-		$output = exporter_csv_ligne_numerotee($nb, $row, $options['delim'], $importer_charset, $options['callback']);
195
-		$length += fwrite($fp, $output);
196
-		$nb++;
197
-	}
198
-	fclose($fp);
199
-
200
-	if ($options['envoyer']) {
201
-		if ($options['envoyer'] === 'attachment') {
202
-			header("Content-Length: $length");
203
-			readfile($fichier);
204
-		}
205
-		// si on a envoye inline, c'est deja tout bon
206
-		exit;
207
-	}
208
-
209
-	return $fichier;
107
+    // support ancienne syntaxe
108
+    // inc_exporter_csv_dist($titre, $resource, $delim = ', ', $entetes = null, $envoyer = true)
109
+    if (is_string($options)) {
110
+        $args = func_get_args();
111
+        $options = [];
112
+        foreach ([2 => 'delim', 3 => 'entetes', 4 => 'envoyer'] as $k => $option) {
113
+            if (!empty($args[$k])) {
114
+                $options[$option] = $args[$k];
115
+            }
116
+        }
117
+    }
118
+
119
+    $default_options = [
120
+        'fichier' => null, // par défaut = $titre
121
+        'extension' => null, // par défaut = choix auto
122
+        'delim' => ',',
123
+        'entetes' => null,
124
+        'envoyer' => true,
125
+        'charset' => null,
126
+        'callback' => null,
127
+    ];
128
+    $options = array_merge($default_options, $options);
129
+
130
+    // Délimiteur
131
+    if ($options['delim'] == 'TAB') {
132
+        $options['delim'] = "\t";
133
+    }
134
+    if (!in_array($options['delim'], [',', ';', "\t"])) {
135
+        $options['delim'] = ',';
136
+    }
137
+
138
+    // Nom du fichier : celui indiqué dans les options, sinon le titre
139
+    // Normalisation : uniquement les caractères non spéciaux, tirets, underscore et point + remplacer espaces par underscores
140
+    $filename = $options['fichier'] ?? translitteration(textebrut(typo($titre)));
141
+    $filename = preg_replace([',[^\w\-_\.\s]+,', ',\s+,'], ['', '_'], trim((string) $filename));
142
+    $filename = rtrim($filename, '.');
143
+
144
+    // Extension : celle indiquée en option, sinon choisie selon le délimiteur
145
+    // Normalisation : uniquement les charactères non spéciaux
146
+    if (!empty($options['extension'])) {
147
+        $options['extension'] = preg_replace(',[^\w]+,', '', trim((string) $options['extension']));
148
+    }
149
+    $extension = $options['extension'] ?? ($options['delim'] === ',' ? 'csv' : 'xls');
150
+
151
+    // Fichier
152
+    $basename = "$filename.$extension";
153
+
154
+    // Charset : celui indiqué en option, sinon celui compatible excel si nécessaire, sinon celui du site
155
+    // Excel n'accepte pas l'utf-8 ni les entites html... on transcode tout ce qu'on peut
156
+    $charset_site = $GLOBALS['meta']['charset'];
157
+    $charset_excel = ($extension === 'xls' ? 'iso-8859-1' : null);
158
+    $charset = $options['charset'] ?? $charset_excel ?? $charset_site;
159
+    $importer_charset = (($charset === $charset_site) ? null : $charset);
160
+
161
+    $output = '';
162
+    $nb = 0;
163
+    if (!empty($options['entetes']) && is_array($options['entetes'])) {
164
+        $output = exporter_csv_ligne_numerotee($nb, $options['entetes'], $options['delim'], $importer_charset, $options['callback']);
165
+    }
166
+    // les donnees commencent toujours a la ligne 1, qu'il y ait ou non des entetes
167
+    $nb++;
168
+
169
+    if ($options['envoyer']) {
170
+        $disposition = ($options['envoyer'] === 'attachment' ? 'attachment' : 'inline');
171
+        header("Content-Type: text/comma-separated-values; charset=$charset");
172
+        header("Content-Disposition: $disposition; filename=$basename");
173
+
174
+        // Vider tous les tampons
175
+        $level = @ob_get_level();
176
+        while ($level--) {
177
+            @ob_end_flush();
178
+        }
179
+    }
180
+
181
+    // si envoyer=='attachment' on passe par un fichier temporaire
182
+    // sinon on ecrit directement sur stdout
183
+    if ($options['envoyer'] && $options['envoyer'] !== 'attachment') {
184
+        $fichier = 'php://output';
185
+    }
186
+    else {
187
+        $fichier = sous_repertoire(_DIR_CACHE, 'export') . $basename;
188
+    }
189
+
190
+    $fp = fopen($fichier, 'w');
191
+    $length = fwrite($fp, $output);
192
+
193
+    while ($row = is_array($resource) ? array_shift($resource) : sql_fetch($resource)) {
194
+        $output = exporter_csv_ligne_numerotee($nb, $row, $options['delim'], $importer_charset, $options['callback']);
195
+        $length += fwrite($fp, $output);
196
+        $nb++;
197
+    }
198
+    fclose($fp);
199
+
200
+    if ($options['envoyer']) {
201
+        if ($options['envoyer'] === 'attachment') {
202
+            header("Content-Length: $length");
203
+            readfile($fichier);
204
+        }
205
+        // si on a envoye inline, c'est deja tout bon
206
+        exit;
207
+    }
208
+
209
+    return $fichier;
210 210
 }
Please login to merge, or discard this patch.
ecrire/inc/filtres_images_mini.php 1 patch
Indentation   +313 added lines, -313 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  */
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 include_spip('inc/filtres_images_lib_mini'); // par precaution
23 23
 
@@ -30,161 +30,161 @@  discard block
 block discarded – undo
30 30
  *    Le code hexadécimal de la couleur (sans le #) ou le code couleur textuel si non trouvé
31 31
  */
32 32
 function couleur_html_to_hex($couleur) {
33
-	$couleurs_html = [
34
-		'aliceblue' => 'F0F8FF',
35
-		'antiquewhite' => 'FAEBD7',
36
-		'aqua' => '00FFFF',
37
-		'aquamarine' => '7FFFD4',
38
-		'azure' => 'F0FFFF',
39
-		'beige' => 'F5F5DC',
40
-		'bisque' => 'FFE4C4',
41
-		'black' => '000000',
42
-		'blanchedalmond' => 'FFEBCD',
43
-		'blue' => '0000FF',
44
-		'blueviolet' => '8A2BE2',
45
-		'brown' => 'A52A2A',
46
-		'burlywood' => 'DEB887',
47
-		'cadetblue' => '5F9EA0',
48
-		'chartreuse' => '7FFF00',
49
-		'chocolate' => 'D2691E',
50
-		'coral' => 'FF7F50',
51
-		'cornflowerblue' => '6495ED',
52
-		'cornsilk' => 'FFF8DC',
53
-		'crimson' => 'DC143C',
54
-		'cyan' => '00FFFF',
55
-		'darkblue' => '00008B',
56
-		'darkcyan' => '008B8B',
57
-		'darkgoldenrod' => 'B8860B',
58
-		'darkgray' => 'A9A9A9',
59
-		'darkgreen' => '006400',
60
-		'darkgrey' => 'A9A9A9',
61
-		'darkkhaki' => 'BDB76B',
62
-		'darkmagenta' => '8B008B',
63
-		'darkolivegreen' => '556B2F',
64
-		'darkorange' => 'FF8C00',
65
-		'darkorchid' => '9932CC',
66
-		'darkred' => '8B0000',
67
-		'darksalmon' => 'E9967A',
68
-		'darkseagreen' => '8FBC8F',
69
-		'darkslateblue' => '483D8B',
70
-		'darkslategray' => '2F4F4F',
71
-		'darkslategrey' => '2F4F4F',
72
-		'darkturquoise' => '00CED1',
73
-		'darkviolet' => '9400D3',
74
-		'deeppink' => 'FF1493',
75
-		'deepskyblue' => '00BFFF',
76
-		'dimgray' => '696969',
77
-		'dimgrey' => '696969',
78
-		'dodgerblue' => '1E90FF',
79
-		'firebrick' => 'B22222',
80
-		'floralwhite' => 'FFFAF0',
81
-		'forestgreen' => '228B22',
82
-		'fuchsia' => 'FF00FF',
83
-		'gainsboro' => 'DCDCDC',
84
-		'ghostwhite' => 'F8F8FF',
85
-		'gold' => 'FFD700',
86
-		'goldenrod' => 'DAA520',
87
-		'gray' => '808080',
88
-		'green' => '008000',
89
-		'greenyellow' => 'ADFF2F',
90
-		'grey' => '808080',
91
-		'honeydew' => 'F0FFF0',
92
-		'hotpink' => 'FF69B4',
93
-		'indianred' => 'CD5C5C',
94
-		'indigo' => '4B0082',
95
-		'ivory' => 'FFFFF0',
96
-		'khaki' => 'F0E68C',
97
-		'lavender' => 'E6E6FA',
98
-		'lavenderblush' => 'FFF0F5',
99
-		'lawngreen' => '7CFC00',
100
-		'lemonchiffon' => 'FFFACD',
101
-		'lightblue' => 'ADD8E6',
102
-		'lightcoral' => 'F08080',
103
-		'lightcyan' => 'E0FFFF',
104
-		'lightgoldenrodyellow' => 'FAFAD2',
105
-		'lightgray' => 'D3D3D3',
106
-		'lightgreen' => '90EE90',
107
-		'lightgrey' => 'D3D3D3',
108
-		'lightpink' => 'FFB6C1',
109
-		'lightsalmon' => 'FFA07A',
110
-		'lightseagreen' => '20B2AA',
111
-		'lightskyblue' => '87CEFA',
112
-		'lightslategray' => '778899',
113
-		'lightslategrey' => '778899',
114
-		'lightsteelblue' => 'B0C4DE',
115
-		'lightyellow' => 'FFFFE0',
116
-		'lime' => '00FF00',
117
-		'limegreen' => '32CD32',
118
-		'linen' => 'FAF0E6',
119
-		'magenta' => 'FF00FF',
120
-		'maroon' => '800000',
121
-		'mediumaquamarine' => '66CDAA',
122
-		'mediumblue' => '0000CD',
123
-		'mediumorchid' => 'BA55D3',
124
-		'mediumpurple' => '9370DB',
125
-		'mediumseagreen' => '3CB371',
126
-		'mediumslateblue' => '7B68EE',
127
-		'mediumspringgreen' => '00FA9A',
128
-		'mediumturquoise' => '48D1CC',
129
-		'mediumvioletred' => 'C71585',
130
-		'midnightblue' => '191970',
131
-		'mintcream' => 'F5FFFA',
132
-		'mistyrose' => 'FFE4E1',
133
-		'moccasin' => 'FFE4B5',
134
-		'navajowhite' => 'FFDEAD',
135
-		'navy' => '000080',
136
-		'oldlace' => 'FDF5E6',
137
-		'olive' => '808000',
138
-		'olivedrab' => '6B8E23',
139
-		'orange' => 'FFA500',
140
-		'orangered' => 'FF4500',
141
-		'orchid' => 'DA70D6',
142
-		'palegoldenrod' => 'EEE8AA',
143
-		'palegreen' => '98FB98',
144
-		'paleturquoise' => 'AFEEEE',
145
-		'palevioletred' => 'DB7093',
146
-		'papayawhip' => 'FFEFD5',
147
-		'peachpuff' => 'FFDAB9',
148
-		'peru' => 'CD853F',
149
-		'pink' => 'FFC0CB',
150
-		'plum' => 'DDA0DD',
151
-		'powderblue' => 'B0E0E6',
152
-		'purple' => '800080',
153
-		'rebeccapurple' => '663399',
154
-		'red' => 'FF0000',
155
-		'rosybrown' => 'BC8F8F',
156
-		'royalblue' => '4169E1',
157
-		'saddlebrown' => '8B4513',
158
-		'salmon' => 'FA8072',
159
-		'sandybrown' => 'F4A460',
160
-		'seagreen' => '2E8B57',
161
-		'seashell' => 'FFF5EE',
162
-		'sienna' => 'A0522D',
163
-		'silver' => 'C0C0C0',
164
-		'skyblue' => '87CEEB',
165
-		'slateblue' => '6A5ACD',
166
-		'slategray' => '708090',
167
-		'slategrey' => '708090',
168
-		'snow' => 'FFFAFA',
169
-		'springgreen' => '00FF7F',
170
-		'steelblue' => '4682B4',
171
-		'tan' => 'D2B48C',
172
-		'teal' => '008080',
173
-		'thistle' => 'D8BFD8',
174
-		'tomato' => 'FF6347',
175
-		'turquoise' => '40E0D0',
176
-		'violet' => 'EE82EE',
177
-		'wheat' => 'F5DEB3',
178
-		'white' => 'FFFFFF',
179
-		'whitesmoke' => 'F5F5F5',
180
-		'yellow' => 'FFFF00',
181
-		'yellowgreen' => '9ACD32',
182
-	];
183
-	if (isset($couleurs_html[$lc = strtolower($couleur ?? '')])) {
184
-		return $couleurs_html[$lc];
185
-	}
186
-
187
-	return $couleur;
33
+    $couleurs_html = [
34
+        'aliceblue' => 'F0F8FF',
35
+        'antiquewhite' => 'FAEBD7',
36
+        'aqua' => '00FFFF',
37
+        'aquamarine' => '7FFFD4',
38
+        'azure' => 'F0FFFF',
39
+        'beige' => 'F5F5DC',
40
+        'bisque' => 'FFE4C4',
41
+        'black' => '000000',
42
+        'blanchedalmond' => 'FFEBCD',
43
+        'blue' => '0000FF',
44
+        'blueviolet' => '8A2BE2',
45
+        'brown' => 'A52A2A',
46
+        'burlywood' => 'DEB887',
47
+        'cadetblue' => '5F9EA0',
48
+        'chartreuse' => '7FFF00',
49
+        'chocolate' => 'D2691E',
50
+        'coral' => 'FF7F50',
51
+        'cornflowerblue' => '6495ED',
52
+        'cornsilk' => 'FFF8DC',
53
+        'crimson' => 'DC143C',
54
+        'cyan' => '00FFFF',
55
+        'darkblue' => '00008B',
56
+        'darkcyan' => '008B8B',
57
+        'darkgoldenrod' => 'B8860B',
58
+        'darkgray' => 'A9A9A9',
59
+        'darkgreen' => '006400',
60
+        'darkgrey' => 'A9A9A9',
61
+        'darkkhaki' => 'BDB76B',
62
+        'darkmagenta' => '8B008B',
63
+        'darkolivegreen' => '556B2F',
64
+        'darkorange' => 'FF8C00',
65
+        'darkorchid' => '9932CC',
66
+        'darkred' => '8B0000',
67
+        'darksalmon' => 'E9967A',
68
+        'darkseagreen' => '8FBC8F',
69
+        'darkslateblue' => '483D8B',
70
+        'darkslategray' => '2F4F4F',
71
+        'darkslategrey' => '2F4F4F',
72
+        'darkturquoise' => '00CED1',
73
+        'darkviolet' => '9400D3',
74
+        'deeppink' => 'FF1493',
75
+        'deepskyblue' => '00BFFF',
76
+        'dimgray' => '696969',
77
+        'dimgrey' => '696969',
78
+        'dodgerblue' => '1E90FF',
79
+        'firebrick' => 'B22222',
80
+        'floralwhite' => 'FFFAF0',
81
+        'forestgreen' => '228B22',
82
+        'fuchsia' => 'FF00FF',
83
+        'gainsboro' => 'DCDCDC',
84
+        'ghostwhite' => 'F8F8FF',
85
+        'gold' => 'FFD700',
86
+        'goldenrod' => 'DAA520',
87
+        'gray' => '808080',
88
+        'green' => '008000',
89
+        'greenyellow' => 'ADFF2F',
90
+        'grey' => '808080',
91
+        'honeydew' => 'F0FFF0',
92
+        'hotpink' => 'FF69B4',
93
+        'indianred' => 'CD5C5C',
94
+        'indigo' => '4B0082',
95
+        'ivory' => 'FFFFF0',
96
+        'khaki' => 'F0E68C',
97
+        'lavender' => 'E6E6FA',
98
+        'lavenderblush' => 'FFF0F5',
99
+        'lawngreen' => '7CFC00',
100
+        'lemonchiffon' => 'FFFACD',
101
+        'lightblue' => 'ADD8E6',
102
+        'lightcoral' => 'F08080',
103
+        'lightcyan' => 'E0FFFF',
104
+        'lightgoldenrodyellow' => 'FAFAD2',
105
+        'lightgray' => 'D3D3D3',
106
+        'lightgreen' => '90EE90',
107
+        'lightgrey' => 'D3D3D3',
108
+        'lightpink' => 'FFB6C1',
109
+        'lightsalmon' => 'FFA07A',
110
+        'lightseagreen' => '20B2AA',
111
+        'lightskyblue' => '87CEFA',
112
+        'lightslategray' => '778899',
113
+        'lightslategrey' => '778899',
114
+        'lightsteelblue' => 'B0C4DE',
115
+        'lightyellow' => 'FFFFE0',
116
+        'lime' => '00FF00',
117
+        'limegreen' => '32CD32',
118
+        'linen' => 'FAF0E6',
119
+        'magenta' => 'FF00FF',
120
+        'maroon' => '800000',
121
+        'mediumaquamarine' => '66CDAA',
122
+        'mediumblue' => '0000CD',
123
+        'mediumorchid' => 'BA55D3',
124
+        'mediumpurple' => '9370DB',
125
+        'mediumseagreen' => '3CB371',
126
+        'mediumslateblue' => '7B68EE',
127
+        'mediumspringgreen' => '00FA9A',
128
+        'mediumturquoise' => '48D1CC',
129
+        'mediumvioletred' => 'C71585',
130
+        'midnightblue' => '191970',
131
+        'mintcream' => 'F5FFFA',
132
+        'mistyrose' => 'FFE4E1',
133
+        'moccasin' => 'FFE4B5',
134
+        'navajowhite' => 'FFDEAD',
135
+        'navy' => '000080',
136
+        'oldlace' => 'FDF5E6',
137
+        'olive' => '808000',
138
+        'olivedrab' => '6B8E23',
139
+        'orange' => 'FFA500',
140
+        'orangered' => 'FF4500',
141
+        'orchid' => 'DA70D6',
142
+        'palegoldenrod' => 'EEE8AA',
143
+        'palegreen' => '98FB98',
144
+        'paleturquoise' => 'AFEEEE',
145
+        'palevioletred' => 'DB7093',
146
+        'papayawhip' => 'FFEFD5',
147
+        'peachpuff' => 'FFDAB9',
148
+        'peru' => 'CD853F',
149
+        'pink' => 'FFC0CB',
150
+        'plum' => 'DDA0DD',
151
+        'powderblue' => 'B0E0E6',
152
+        'purple' => '800080',
153
+        'rebeccapurple' => '663399',
154
+        'red' => 'FF0000',
155
+        'rosybrown' => 'BC8F8F',
156
+        'royalblue' => '4169E1',
157
+        'saddlebrown' => '8B4513',
158
+        'salmon' => 'FA8072',
159
+        'sandybrown' => 'F4A460',
160
+        'seagreen' => '2E8B57',
161
+        'seashell' => 'FFF5EE',
162
+        'sienna' => 'A0522D',
163
+        'silver' => 'C0C0C0',
164
+        'skyblue' => '87CEEB',
165
+        'slateblue' => '6A5ACD',
166
+        'slategray' => '708090',
167
+        'slategrey' => '708090',
168
+        'snow' => 'FFFAFA',
169
+        'springgreen' => '00FF7F',
170
+        'steelblue' => '4682B4',
171
+        'tan' => 'D2B48C',
172
+        'teal' => '008080',
173
+        'thistle' => 'D8BFD8',
174
+        'tomato' => 'FF6347',
175
+        'turquoise' => '40E0D0',
176
+        'violet' => 'EE82EE',
177
+        'wheat' => 'F5DEB3',
178
+        'white' => 'FFFFFF',
179
+        'whitesmoke' => 'F5F5F5',
180
+        'yellow' => 'FFFF00',
181
+        'yellowgreen' => '9ACD32',
182
+    ];
183
+    if (isset($couleurs_html[$lc = strtolower($couleur ?? '')])) {
184
+        return $couleurs_html[$lc];
185
+    }
186
+
187
+    return $couleur;
188 188
 }
189 189
 
190 190
 /**
@@ -200,16 +200,16 @@  discard block
 block discarded – undo
200 200
  * @return string Couleur tel que "hsl(200, 40%, 34%)" ou valeur formattée
201 201
  */
202 202
 function couleur_hex_to_hsl($couleur, $format = null) {
203
-	$hsl = _couleur_hex_to_hsl($couleur);
204
-	$hsl = [
205
-		'h' => round($hsl['h'] * 360),
206
-		's' => round($hsl['s'] * 100) . '%',
207
-		'l' => round($hsl['l'] * 100) . '%'
208
-	];
209
-	if ($format === null) {
210
-		return "hsl({$hsl['h']}, {$hsl['s']}, {$hsl['l']})";
211
-	}
212
-	return str_replace(array_keys($hsl), $hsl, $format);
203
+    $hsl = _couleur_hex_to_hsl($couleur);
204
+    $hsl = [
205
+        'h' => round($hsl['h'] * 360),
206
+        's' => round($hsl['s'] * 100) . '%',
207
+        'l' => round($hsl['l'] * 100) . '%'
208
+    ];
209
+    if ($format === null) {
210
+        return "hsl({$hsl['h']}, {$hsl['s']}, {$hsl['l']})";
211
+    }
212
+    return str_replace(array_keys($hsl), $hsl, $format);
213 213
 }
214 214
 
215 215
 
@@ -226,16 +226,16 @@  discard block
 block discarded – undo
226 226
  * @return string Couleur tel que "rgb(200, 40, 84)" ou valeur formattée
227 227
  */
228 228
 function couleur_hex_to_rgb($couleur, $format = null) {
229
-	$rgb = _couleur_hex_to_dec($couleur);
230
-	$rgb = [
231
-		'r' => $rgb['red'],
232
-		'g' => $rgb['green'],
233
-		'b' => $rgb['blue'],
234
-	];
235
-	if ($format === null) {
236
-		return "rgb({$rgb['r']}, {$rgb['g']}, {$rgb['b']})";
237
-	}
238
-	return str_replace(array_keys($rgb), $rgb, $format);
229
+    $rgb = _couleur_hex_to_dec($couleur);
230
+    $rgb = [
231
+        'r' => $rgb['red'],
232
+        'g' => $rgb['green'],
233
+        'b' => $rgb['blue'],
234
+    ];
235
+    if ($format === null) {
236
+        return "rgb({$rgb['r']}, {$rgb['g']}, {$rgb['b']})";
237
+    }
238
+    return str_replace(array_keys($rgb), $rgb, $format);
239 239
 }
240 240
 
241 241
 /**
@@ -251,13 +251,13 @@  discard block
 block discarded – undo
251 251
  *    Code hexadécimal de la couleur plus foncée
252 252
  */
253 253
 function couleur_foncer($couleur, $coeff = 0.5) {
254
-	$couleurs = _couleur_hex_to_dec($couleur);
254
+    $couleurs = _couleur_hex_to_dec($couleur);
255 255
 
256
-	$red = $couleurs['red'] - round(($couleurs['red']) * $coeff);
257
-	$green = $couleurs['green'] - round(($couleurs['green']) * $coeff);
258
-	$blue = $couleurs['blue'] - round(($couleurs['blue']) * $coeff);
256
+    $red = $couleurs['red'] - round(($couleurs['red']) * $coeff);
257
+    $green = $couleurs['green'] - round(($couleurs['green']) * $coeff);
258
+    $blue = $couleurs['blue'] - round(($couleurs['blue']) * $coeff);
259 259
 
260
-	return _couleur_dec_to_hex($red, $green, $blue);
260
+    return _couleur_dec_to_hex($red, $green, $blue);
261 261
 }
262 262
 
263 263
 /**
@@ -273,13 +273,13 @@  discard block
 block discarded – undo
273 273
  *    Code hexadécimal de la couleur éclaircie
274 274
  */
275 275
 function couleur_eclaircir($couleur, $coeff = 0.5) {
276
-	$couleurs = _couleur_hex_to_dec($couleur);
276
+    $couleurs = _couleur_hex_to_dec($couleur);
277 277
 
278
-	$red = $couleurs['red'] + round((255 - $couleurs['red']) * $coeff);
279
-	$green = $couleurs['green'] + round((255 - $couleurs['green']) * $coeff);
280
-	$blue = $couleurs['blue'] + round((255 - $couleurs['blue']) * $coeff);
278
+    $red = $couleurs['red'] + round((255 - $couleurs['red']) * $coeff);
279
+    $green = $couleurs['green'] + round((255 - $couleurs['green']) * $coeff);
280
+    $blue = $couleurs['blue'] + round((255 - $couleurs['blue']) * $coeff);
281 281
 
282
-	return _couleur_dec_to_hex($red, $green, $blue);
282
+    return _couleur_dec_to_hex($red, $green, $blue);
283 283
 }
284 284
 
285 285
 /**
@@ -302,28 +302,28 @@  discard block
 block discarded – undo
302 302
  *    Le tag html `<img src=... />` avec une class `filtre_inactif` ou pas
303 303
  */
304 304
 function image_select($img, $width_min = 0, $height_min = 0, $width_max = 10000, $height_max = 1000) {
305
-	if (!$img) {
306
-		return $img;
307
-	}
308
-	[$h, $l] = taille_image($img);
309
-	$select = true;
310
-	if ($l < $width_min || $l > $width_max || $h < $height_min || $h > $height_max) {
311
-		$select = false;
312
-	}
313
-
314
-	$class = extraire_attribut($img, 'class');
315
-	$p = strpos((string) $class, 'filtre_inactif');
316
-	if ($select == false && $p === false) {
317
-		$class .= ' filtre_inactif';
318
-		$img = inserer_attribut($img, 'class', $class);
319
-	}
320
-	if ($select == true && $p !== false) {
321
-		// no_image_filtrer : historique, a virer
322
-		$class = preg_replace(',\s*(filtre_inactif|no_image_filtrer),', '', (string) $class);
323
-		$img = inserer_attribut($img, 'class', $class);
324
-	}
325
-
326
-	return $img;
305
+    if (!$img) {
306
+        return $img;
307
+    }
308
+    [$h, $l] = taille_image($img);
309
+    $select = true;
310
+    if ($l < $width_min || $l > $width_max || $h < $height_min || $h > $height_max) {
311
+        $select = false;
312
+    }
313
+
314
+    $class = extraire_attribut($img, 'class');
315
+    $p = strpos((string) $class, 'filtre_inactif');
316
+    if ($select == false && $p === false) {
317
+        $class .= ' filtre_inactif';
318
+        $img = inserer_attribut($img, 'class', $class);
319
+    }
320
+    if ($select == true && $p !== false) {
321
+        // no_image_filtrer : historique, a virer
322
+        $class = preg_replace(',\s*(filtre_inactif|no_image_filtrer),', '', (string) $class);
323
+        $img = inserer_attribut($img, 'class', $class);
324
+    }
325
+
326
+    return $img;
327 327
 }
328 328
 
329 329
 /**
@@ -371,45 +371,45 @@  discard block
 block discarded – undo
371 371
  *     Code HTML de l'image ou du texte.
372 372
  **/
373 373
 function image_passe_partout(
374
-	$img,
375
-	$taille_x = -1,
376
-	$taille_y = -1,
377
-	$force = false,
378
-	$cherche_image = false,
379
-	$process = 'AUTO'
374
+    $img,
375
+    $taille_x = -1,
376
+    $taille_y = -1,
377
+    $force = false,
378
+    $cherche_image = false,
379
+    $process = 'AUTO'
380 380
 ) {
381
-	// PHP 7+ type hint
382
-	$img = (string)$img;
383
-	$taille_x = (int)$taille_x;
384
-	$taille_y = (int)$taille_y;
385
-	$force = (bool)$force;
386
-	$process = (string)$process;
387
-
388
-	if (!$img) {
389
-		return '';
390
-	}
391
-	[$hauteur, $largeur] = taille_image($img);
392
-	if ($taille_x === -1) {
393
-		$taille_x = $GLOBALS['meta']['taille_preview'] ?? 150;
394
-	}
395
-	if ($taille_y === -1) {
396
-		$taille_y = $taille_x;
397
-	}
398
-
399
-	if ($taille_x === 0 && $taille_y > 0) {
400
-		$taille_x = 1;
401
-	} # {0,300} -> c'est 300 qui compte
402
-	elseif ($taille_x > 0 && $taille_y === 0) {
403
-		$taille_y = 1;
404
-	} # {300,0} -> c'est 300 qui compte
405
-	elseif ($taille_x == 0 && $taille_y === 0) {
406
-		return '';
407
-	}
408
-
409
-	[$destWidth, $destHeight, $ratio] = ratio_passe_partout($largeur ?? 0, $hauteur ?? 0, $taille_x, $taille_y);
410
-	$fonction = ['image_passe_partout', func_get_args()];
411
-
412
-	return process_image_reduire($fonction, $img, $destWidth, $destHeight, $force, $process);
381
+    // PHP 7+ type hint
382
+    $img = (string)$img;
383
+    $taille_x = (int)$taille_x;
384
+    $taille_y = (int)$taille_y;
385
+    $force = (bool)$force;
386
+    $process = (string)$process;
387
+
388
+    if (!$img) {
389
+        return '';
390
+    }
391
+    [$hauteur, $largeur] = taille_image($img);
392
+    if ($taille_x === -1) {
393
+        $taille_x = $GLOBALS['meta']['taille_preview'] ?? 150;
394
+    }
395
+    if ($taille_y === -1) {
396
+        $taille_y = $taille_x;
397
+    }
398
+
399
+    if ($taille_x === 0 && $taille_y > 0) {
400
+        $taille_x = 1;
401
+    } # {0,300} -> c'est 300 qui compte
402
+    elseif ($taille_x > 0 && $taille_y === 0) {
403
+        $taille_y = 1;
404
+    } # {300,0} -> c'est 300 qui compte
405
+    elseif ($taille_x == 0 && $taille_y === 0) {
406
+        return '';
407
+    }
408
+
409
+    [$destWidth, $destHeight, $ratio] = ratio_passe_partout($largeur ?? 0, $hauteur ?? 0, $taille_x, $taille_y);
410
+    $fonction = ['image_passe_partout', func_get_args()];
411
+
412
+    return process_image_reduire($fonction, $img, $destWidth, $destHeight, $force, $process);
413 413
 }
414 414
 
415 415
 /**
@@ -452,44 +452,44 @@  discard block
 block discarded – undo
452 452
  *     Code HTML de l'image ou du texte.
453 453
  **/
454 454
 function image_reduire(
455
-	$img,
456
-	$taille = -1,
457
-	$taille_y = -1,
458
-	$force = false,
459
-	$cherche_image = false,
460
-	$process = 'AUTO'
455
+    $img,
456
+    $taille = -1,
457
+    $taille_y = -1,
458
+    $force = false,
459
+    $cherche_image = false,
460
+    $process = 'AUTO'
461 461
 ) {
462
-	// PHP 7+ type hint
463
-	$img = (string)$img;
464
-	$taille = (int)$taille;
465
-	$taille_y = (int)$taille_y;
466
-	$force = (bool)$force;
467
-	$process = (string)$process;
468
-
469
-	// Determiner la taille x,y maxi
470
-	// prendre le reglage de previsu par defaut
471
-	if ($taille === -1) {
472
-		$taille = (isset($GLOBALS['meta']['taille_preview']) && (int) $GLOBALS['meta']['taille_preview'])
473
-			? (int) $GLOBALS['meta']['taille_preview']
474
-			: 150;
475
-	}
476
-	if ($taille_y === -1) {
477
-		$taille_y = $taille;
478
-	}
479
-
480
-	if ($taille === 0 && $taille_y > 0) {
481
-		$taille = 10000;
482
-	} # {0,300} -> c'est 300 qui compte
483
-	elseif ($taille > 0 && $taille_y === 0) {
484
-		$taille_y = 10000;
485
-	} # {300,0} -> c'est 300 qui compte
486
-	elseif ($taille == 0 && $taille_y === 0) {
487
-		return '';
488
-	}
489
-
490
-	$fonction = ['image_reduire', func_get_args()];
491
-
492
-	return process_image_reduire($fonction, $img, $taille, $taille_y, $force, $process);
462
+    // PHP 7+ type hint
463
+    $img = (string)$img;
464
+    $taille = (int)$taille;
465
+    $taille_y = (int)$taille_y;
466
+    $force = (bool)$force;
467
+    $process = (string)$process;
468
+
469
+    // Determiner la taille x,y maxi
470
+    // prendre le reglage de previsu par defaut
471
+    if ($taille === -1) {
472
+        $taille = (isset($GLOBALS['meta']['taille_preview']) && (int) $GLOBALS['meta']['taille_preview'])
473
+            ? (int) $GLOBALS['meta']['taille_preview']
474
+            : 150;
475
+    }
476
+    if ($taille_y === -1) {
477
+        $taille_y = $taille;
478
+    }
479
+
480
+    if ($taille === 0 && $taille_y > 0) {
481
+        $taille = 10000;
482
+    } # {0,300} -> c'est 300 qui compte
483
+    elseif ($taille > 0 && $taille_y === 0) {
484
+        $taille_y = 10000;
485
+    } # {300,0} -> c'est 300 qui compte
486
+    elseif ($taille == 0 && $taille_y === 0) {
487
+        return '';
488
+    }
489
+
490
+    $fonction = ['image_reduire', func_get_args()];
491
+
492
+    return process_image_reduire($fonction, $img, $taille, $taille_y, $force, $process);
493 493
 }
494 494
 
495 495
 /**
@@ -500,16 +500,16 @@  discard block
 block discarded – undo
500 500
  *
501 501
  **/
502 502
 function image_recadre_avec_fallback(
503
-	$im,
504
-	$width,
505
-	$height = '-',
506
-	$position = 'focus',
507
-	$background_color = 'white'
503
+    $im,
504
+    $width,
505
+    $height = '-',
506
+    $position = 'focus',
507
+    $background_color = 'white'
508 508
 ) {
509
-	if (function_exists('image_recadre') && ($GLOBALS['meta']['image_process'] ?? '') === 'gd2') {
510
-		return image_reduire(image_recadre($im, $width . ':' . $height, '-', $position, $background_color), $width, $height);
511
-	} else { return image_passe_partout($im, $width, $height);
512
-	}
509
+    if (function_exists('image_recadre') && ($GLOBALS['meta']['image_process'] ?? '') === 'gd2') {
510
+        return image_reduire(image_recadre($im, $width . ':' . $height, '-', $position, $background_color), $width, $height);
511
+    } else { return image_passe_partout($im, $width, $height);
512
+    }
513 513
 }
514 514
 
515 515
 /**
@@ -527,23 +527,23 @@  discard block
 block discarded – undo
527 527
  *     Code HTML de l'image ou du texte.
528 528
  **/
529 529
 function image_reduire_par($img, $val = 1, $force = false) {
530
-	// PHP 7+ type hint
531
-	$img = (string)$img;
532
-	$val = (int)$val;
533
-	$force = (bool)$force;
530
+    // PHP 7+ type hint
531
+    $img = (string)$img;
532
+    $val = (int)$val;
533
+    $force = (bool)$force;
534 534
 
535
-	[$hauteur, $largeur] = taille_image($img);
535
+    [$hauteur, $largeur] = taille_image($img);
536 536
 
537
-	$l = round($largeur / $val);
538
-	$h = round($hauteur / $val);
537
+    $l = round($largeur / $val);
538
+    $h = round($hauteur / $val);
539 539
 
540
-	if ($l > $h) {
541
-		$h = 0;
542
-	} else {
543
-		$l = 0;
544
-	}
540
+    if ($l > $h) {
541
+        $h = 0;
542
+    } else {
543
+        $l = 0;
544
+    }
545 545
 
546
-	return image_reduire($img, $l, $h, $force);
546
+    return image_reduire($img, $l, $h, $force);
547 547
 }
548 548
 
549 549
 /**
@@ -566,10 +566,10 @@  discard block
 block discarded – undo
566 566
  *      Couleur en écriture hexadécimale.
567 567
 **/
568 568
 function filtre_couleur_saturation_dist($couleur, $val, $strict = false) {
569
-	if (function_exists('couleur_saturation')) {
570
-		return couleur_saturation($couleur, $val, $strict);
571
-	}
572
-	return $couleur;
569
+    if (function_exists('couleur_saturation')) {
570
+        return couleur_saturation($couleur, $val, $strict);
571
+    }
572
+    return $couleur;
573 573
 }
574 574
 
575 575
 /**
@@ -590,8 +590,8 @@  discard block
 block discarded – undo
590 590
  *      Couleur en écriture hexadécimale.
591 591
 **/
592 592
 function filtre_couleur_luminance_dist($couleur, $val) {
593
-	if (function_exists('couleur_luminance')) {
594
-		return couleur_luminance($couleur, $val);
595
-	}
596
-	return $couleur;
593
+    if (function_exists('couleur_luminance')) {
594
+        return couleur_luminance($couleur, $val);
595
+    }
596
+    return $couleur;
597 597
 }
Please login to merge, or discard this patch.
ecrire/inc/headers.php 1 patch
Indentation   +136 added lines, -136 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
 
@@ -37,133 +37,133 @@  discard block
 block discarded – undo
37 37
  * @param int $status Code de redirection (301 ou 302)
38 38
  **/
39 39
 function redirige_par_entete($url, $equiv = '', $status = 302) {
40
-	if (!in_array($status, [301, 302])) {
41
-		$status = 302;
42
-	}
43
-
44
-	$url = trim(strtr($url, "\n\r", '  '));
45
-	# si l'url de redirection est relative, on la passe en absolue
46
-	if (!preg_match(',^(\w+:)?//,', $url)) {
47
-		include_spip('inc/filtres_mini');
48
-		$url = url_absolue($url);
49
-	}
50
-
51
-	if (defined('_AJAX') && _AJAX) {
52
-		$url = parametre_url($url, 'var_ajax_redir', 1, '&');
53
-	}
54
-
55
-	// ne pas laisser passer n'importe quoi dans l'url
56
-	$url = str_replace(['<', '"'], ['&lt;', '&quot;'], (string) $url);
57
-	$url = str_replace(["\r", "\n", ' '], ['%0D', '%0A', '%20'], $url);
58
-	while (str_contains($url, '%0A')) {
59
-		$url = str_replace('%0A', '', $url);
60
-	}
61
-	// interdire les url inline avec des pseudo-protocoles :
62
-	if (
63
-		preg_match(',data:,i', $url) && preg_match('/base64\s*,/i', $url) || preg_match(',(javascript|mailto):,i', $url)
64
-	) {
65
-		$url = './';
66
-	}
67
-
68
-	// Il n'y a que sous Apache que setcookie puis redirection fonctionne
69
-	include_spip('inc/cookie');
70
-	if (!defined('_SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE')) {
71
-		define('_SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE', '^(Apache|Cherokee|nginx)');
72
-	}
73
-	if (!defined('_SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE')) {
74
-		define('_SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE', 'Apache|Cherokee|nginx');
75
-	}
76
-	if (
77
-		!$equiv && !spip_cookie_envoye()
78
-		|| (
79
-			!empty($_SERVER['SERVER_SOFTWARE'])
80
-				&& _SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE
81
-				&& preg_match('/' . _SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE . '/i', (string) $_SERVER['SERVER_SOFTWARE'])
82
-			|| !empty($_SERVER['SERVER_SIGNATURE'])
83
-				&& _SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE
84
-				&& preg_match('/' . _SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE . '/i', (string) $_SERVER['SERVER_SIGNATURE'])
85
-			|| function_exists('apache_getenv')
86
-			|| defined('_SERVER_APACHE')
87
-		)
88
-	) {
89
-		@header('Location: ' . $url);
90
-		$equiv = '';
91
-	} else {
92
-		@header('Refresh: 0; url=' . $url);
93
-		if (isset($GLOBALS['meta']['charset'])) {
94
-			@header('Content-Type: text/html; charset=' . $GLOBALS['meta']['charset']);
95
-		}
96
-		$equiv = "<meta http-equiv='Refresh' content='0; url=$url'>";
97
-	}
98
-	include_spip('inc/lang');
99
-	if ($status != 302) {
100
-		http_response_code($status);
101
-	}
102
-	echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">', "\n",
103
-	html_lang_attributes(), '
40
+    if (!in_array($status, [301, 302])) {
41
+        $status = 302;
42
+    }
43
+
44
+    $url = trim(strtr($url, "\n\r", '  '));
45
+    # si l'url de redirection est relative, on la passe en absolue
46
+    if (!preg_match(',^(\w+:)?//,', $url)) {
47
+        include_spip('inc/filtres_mini');
48
+        $url = url_absolue($url);
49
+    }
50
+
51
+    if (defined('_AJAX') && _AJAX) {
52
+        $url = parametre_url($url, 'var_ajax_redir', 1, '&');
53
+    }
54
+
55
+    // ne pas laisser passer n'importe quoi dans l'url
56
+    $url = str_replace(['<', '"'], ['&lt;', '&quot;'], (string) $url);
57
+    $url = str_replace(["\r", "\n", ' '], ['%0D', '%0A', '%20'], $url);
58
+    while (str_contains($url, '%0A')) {
59
+        $url = str_replace('%0A', '', $url);
60
+    }
61
+    // interdire les url inline avec des pseudo-protocoles :
62
+    if (
63
+        preg_match(',data:,i', $url) && preg_match('/base64\s*,/i', $url) || preg_match(',(javascript|mailto):,i', $url)
64
+    ) {
65
+        $url = './';
66
+    }
67
+
68
+    // Il n'y a que sous Apache que setcookie puis redirection fonctionne
69
+    include_spip('inc/cookie');
70
+    if (!defined('_SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE')) {
71
+        define('_SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE', '^(Apache|Cherokee|nginx)');
72
+    }
73
+    if (!defined('_SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE')) {
74
+        define('_SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE', 'Apache|Cherokee|nginx');
75
+    }
76
+    if (
77
+        !$equiv && !spip_cookie_envoye()
78
+        || (
79
+            !empty($_SERVER['SERVER_SOFTWARE'])
80
+                && _SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE
81
+                && preg_match('/' . _SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE . '/i', (string) $_SERVER['SERVER_SOFTWARE'])
82
+            || !empty($_SERVER['SERVER_SIGNATURE'])
83
+                && _SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE
84
+                && preg_match('/' . _SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE . '/i', (string) $_SERVER['SERVER_SIGNATURE'])
85
+            || function_exists('apache_getenv')
86
+            || defined('_SERVER_APACHE')
87
+        )
88
+    ) {
89
+        @header('Location: ' . $url);
90
+        $equiv = '';
91
+    } else {
92
+        @header('Refresh: 0; url=' . $url);
93
+        if (isset($GLOBALS['meta']['charset'])) {
94
+            @header('Content-Type: text/html; charset=' . $GLOBALS['meta']['charset']);
95
+        }
96
+        $equiv = "<meta http-equiv='Refresh' content='0; url=$url'>";
97
+    }
98
+    include_spip('inc/lang');
99
+    if ($status != 302) {
100
+        http_response_code($status);
101
+    }
102
+    echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">', "\n",
103
+    html_lang_attributes(), '
104 104
 <head>',
105
-	$equiv, '
105
+    $equiv, '
106 106
 <title>HTTP ' . $status . '</title>
107 107
 ' . ((isset($GLOBALS['meta']['charset'])) ? '<meta http-equiv="Content-Type" content="text/html;charset=' . $GLOBALS['meta']['charset'] . '">' : '') . '
108 108
 </head>
109 109
 <body>
110 110
 <h1>HTTP ' . $status . '</h1>
111 111
 <a href="',
112
-	quote_amp($url),
113
-	'">',
114
-	_T('navigateur_pas_redirige'),
115
-	'</a></body></html>';
112
+    quote_amp($url),
113
+    '">',
114
+    _T('navigateur_pas_redirige'),
115
+    '</a></body></html>';
116 116
 
117
-	spip_log("redirige $status: $url");
117
+    spip_log("redirige $status: $url");
118 118
 
119
-	exit;
119
+    exit;
120 120
 }
121 121
 
122 122
 function redirige_formulaire($url, $equiv = '', $format = 'message') {
123
-	if (
124
-		!_AJAX
125
-		&& !headers_sent()
126
-		&& !_request('var_ajax')
127
-	) {
128
-		redirige_par_entete(str_replace('&amp;', '&', (string) $url), $equiv);
129
-	} // si c'est une ancre, fixer simplement le window.location.hash
130
-	elseif ($format == 'ajaxform' && preg_match(',^#[0-9a-z\-_]+$,i', (string) $url)) {
131
-		return [
132
-			// on renvoie un lien masque qui sera traite par ajaxCallback.js
133
-			"<a href='$url' name='ajax_ancre' style='display:none;'>anchor</a>",
134
-			// et rien dans le message ok
135
-			''
136
-		];
137
-	} else {
138
-		// ne pas laisser passer n'importe quoi dans l'url
139
-		$url = str_replace(['<', '"'], ['&lt;', '&quot;'], (string) $url);
140
-
141
-		$url = strtr($url, "\n\r", '  ');
142
-		# en theorie on devrait faire ca tout le temps, mais quand la chaine
143
-		# commence par ? c'est imperatif, sinon l'url finale n'est pas la bonne
144
-		if ($url[0] == '?') {
145
-			$url = url_de_base() . $url;
146
-		}
147
-		$url = str_replace('&amp;', '&', (string) $url);
148
-		spip_log("redirige formulaire ajax: $url");
149
-		include_spip('inc/filtres');
150
-		if ($format == 'ajaxform') {
151
-			return [
152
-				// on renvoie un lien masque qui sera traite par ajaxCallback.js
153
-				'<a href="' . quote_amp($url) . '" name="ajax_redirect"  style="display:none;">' . _T('navigateur_pas_redirige') . '</a>',
154
-				// et un message au cas ou
155
-				'<br /><a href="' . quote_amp($url) . '">' . _T('navigateur_pas_redirige') . '</a>'
156
-			];
157
-		} else // format message texte, tout en js inline
158
-		{
159
-			return
160
-				// ie poste les formulaires dans une iframe, il faut donc rediriger son parent
161
-				"<script type='text/javascript'>if (parent.window){parent.window.document.location.replace(\"$url\");} else {document.location.replace(\"$url\");}</script>"
162
-				. http_img_pack('loader.svg', '', " class='loader'")
163
-				. '<br />'
164
-				. '<a href="' . quote_amp($url) . '">' . _T('navigateur_pas_redirige') . '</a>';
165
-		}
166
-	}
123
+    if (
124
+        !_AJAX
125
+        && !headers_sent()
126
+        && !_request('var_ajax')
127
+    ) {
128
+        redirige_par_entete(str_replace('&amp;', '&', (string) $url), $equiv);
129
+    } // si c'est une ancre, fixer simplement le window.location.hash
130
+    elseif ($format == 'ajaxform' && preg_match(',^#[0-9a-z\-_]+$,i', (string) $url)) {
131
+        return [
132
+            // on renvoie un lien masque qui sera traite par ajaxCallback.js
133
+            "<a href='$url' name='ajax_ancre' style='display:none;'>anchor</a>",
134
+            // et rien dans le message ok
135
+            ''
136
+        ];
137
+    } else {
138
+        // ne pas laisser passer n'importe quoi dans l'url
139
+        $url = str_replace(['<', '"'], ['&lt;', '&quot;'], (string) $url);
140
+
141
+        $url = strtr($url, "\n\r", '  ');
142
+        # en theorie on devrait faire ca tout le temps, mais quand la chaine
143
+        # commence par ? c'est imperatif, sinon l'url finale n'est pas la bonne
144
+        if ($url[0] == '?') {
145
+            $url = url_de_base() . $url;
146
+        }
147
+        $url = str_replace('&amp;', '&', (string) $url);
148
+        spip_log("redirige formulaire ajax: $url");
149
+        include_spip('inc/filtres');
150
+        if ($format == 'ajaxform') {
151
+            return [
152
+                // on renvoie un lien masque qui sera traite par ajaxCallback.js
153
+                '<a href="' . quote_amp($url) . '" name="ajax_redirect"  style="display:none;">' . _T('navigateur_pas_redirige') . '</a>',
154
+                // et un message au cas ou
155
+                '<br /><a href="' . quote_amp($url) . '">' . _T('navigateur_pas_redirige') . '</a>'
156
+            ];
157
+        } else // format message texte, tout en js inline
158
+        {
159
+            return
160
+                // ie poste les formulaires dans une iframe, il faut donc rediriger son parent
161
+                "<script type='text/javascript'>if (parent.window){parent.window.document.location.replace(\"$url\");} else {document.location.replace(\"$url\");}</script>"
162
+                . http_img_pack('loader.svg', '', " class='loader'")
163
+                . '<br />'
164
+                . '<a href="' . quote_amp($url) . '">' . _T('navigateur_pas_redirige') . '</a>';
165
+        }
166
+    }
167 167
 }
168 168
 
169 169
 /**
@@ -184,7 +184,7 @@  discard block
 block discarded – undo
184 184
  * @return void
185 185
  **/
186 186
 function redirige_url_ecrire($script = '', $args = '', $equiv = '') {
187
-	return redirige_par_entete(generer_url_ecrire($script, $args, true), $equiv);
187
+    return redirige_par_entete(generer_url_ecrire($script, $args, true), $equiv);
188 188
 }
189 189
 /**
190 190
  * Renvoie au client le header HTTP avec le message correspondant au code indiqué.
@@ -199,27 +199,27 @@  discard block
 block discarded – undo
199 199
  *     Code d'erreur
200 200
  **/
201 201
 function http_status($status) {
202
-	http_response_code($status);
202
+    http_response_code($status);
203 203
 }
204 204
 
205 205
 // Retourne ce qui va bien pour que le navigateur ne mette pas la page en cache
206 206
 function http_no_cache() {
207
-	if (headers_sent()) {
208
-		spip_log('http_no_cache arrive trop tard');
209
-
210
-		return;
211
-	}
212
-	$charset = empty($GLOBALS['meta']['charset']) ? 'utf-8' : $GLOBALS['meta']['charset'];
213
-
214
-	// selon http://developer.apple.com/internet/safari/faq.html#anchor5
215
-	// il faudrait aussi pour Safari
216
-	// header("Cache-Control: post-check=0, pre-check=0", false)
217
-	// mais ca ne respecte pas
218
-	// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
219
-
220
-	header("Content-Type: text/html; charset=$charset");
221
-	header('Expires: 0');
222
-	header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
223
-	header('Cache-Control: no-cache, must-revalidate');
224
-	header('Pragma: no-cache');
207
+    if (headers_sent()) {
208
+        spip_log('http_no_cache arrive trop tard');
209
+
210
+        return;
211
+    }
212
+    $charset = empty($GLOBALS['meta']['charset']) ? 'utf-8' : $GLOBALS['meta']['charset'];
213
+
214
+    // selon http://developer.apple.com/internet/safari/faq.html#anchor5
215
+    // il faudrait aussi pour Safari
216
+    // header("Cache-Control: post-check=0, pre-check=0", false)
217
+    // mais ca ne respecte pas
218
+    // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
219
+
220
+    header("Content-Type: text/html; charset=$charset");
221
+    header('Expires: 0');
222
+    header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
223
+    header('Cache-Control: no-cache, must-revalidate');
224
+    header('Pragma: no-cache');
225 225
 }
Please login to merge, or discard this patch.
ecrire/inc/csv.php 1 patch
Indentation   +107 added lines, -107 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
 /**
@@ -32,117 +32,117 @@  discard block
 block discarded – undo
32 32
  **/
33 33
 function analyse_csv($t) {
34 34
 
35
-	// Quel est le séparateur ?
36
-	$virg = substr_count($t, ',');
37
-	$pvirg = substr_count($t, ';');
38
-	$tab = substr_count($t, "\t");
39
-	if ($virg > $pvirg) {
40
-		$sep = ',';
41
-		$hs = '&#44;';
42
-	} else {
43
-		$sep = ';';
44
-		$hs = '&#59;';
45
-		$virg = $pvirg;
46
-	}
47
-	// un certain nombre de tab => le séparateur est tab
48
-	if ($tab > $virg / 10) {
49
-		$sep = "\t";
50
-		$hs = "\t";
51
-	}
35
+    // Quel est le séparateur ?
36
+    $virg = substr_count($t, ',');
37
+    $pvirg = substr_count($t, ';');
38
+    $tab = substr_count($t, "\t");
39
+    if ($virg > $pvirg) {
40
+        $sep = ',';
41
+        $hs = '&#44;';
42
+    } else {
43
+        $sep = ';';
44
+        $hs = '&#59;';
45
+        $virg = $pvirg;
46
+    }
47
+    // un certain nombre de tab => le séparateur est tab
48
+    if ($tab > $virg / 10) {
49
+        $sep = "\t";
50
+        $hs = "\t";
51
+    }
52 52
 
53
-	// un separateur suivi de 3 guillemets attention !
54
-	// attention au ; ou , suceptible d'etre confondu avec un separateur
55
-	// on substitue un # et on remplacera a la fin
56
-	$t = preg_replace("/([\n$sep])\"\"\"/", '\\1"&#34#', $t);
57
-	$t = str_replace('""', '&#34#', $t);
58
-	preg_match_all('/"[^"]*"/', $t, $r);
59
-	foreach ($r[0] as $cell) {
60
-		$t = str_replace(
61
-			$cell,
62
-			str_replace(
63
-				$sep,
64
-				$hs,
65
-				str_replace(
66
-					"\n",
67
-					'``**``', // échapper les saut de lignes, on les remettra après.
68
-					substr((string) $cell, 1, -1)
69
-				)
70
-			),
71
-			$t
72
-		);
73
-	}
53
+    // un separateur suivi de 3 guillemets attention !
54
+    // attention au ; ou , suceptible d'etre confondu avec un separateur
55
+    // on substitue un # et on remplacera a la fin
56
+    $t = preg_replace("/([\n$sep])\"\"\"/", '\\1"&#34#', $t);
57
+    $t = str_replace('""', '&#34#', $t);
58
+    preg_match_all('/"[^"]*"/', $t, $r);
59
+    foreach ($r[0] as $cell) {
60
+        $t = str_replace(
61
+            $cell,
62
+            str_replace(
63
+                $sep,
64
+                $hs,
65
+                str_replace(
66
+                    "\n",
67
+                    '``**``', // échapper les saut de lignes, on les remettra après.
68
+                    substr((string) $cell, 1, -1)
69
+                )
70
+            ),
71
+            $t
72
+        );
73
+    }
74 74
 
75
-	$t = preg_replace(
76
-		'/\r?\n/',
77
-		"\n",
78
-		preg_replace('/[\r\n]+/', "\n", $t)
79
-	);
75
+    $t = preg_replace(
76
+        '/\r?\n/',
77
+        "\n",
78
+        preg_replace('/[\r\n]+/', "\n", $t)
79
+    );
80 80
 
81
-	[$entete, $corps] = explode("\n", $t, 2);
82
-	$caption = '';
83
-	// sauter la ligne de tete formee seulement de separateurs
84
-	if (substr_count($entete, $sep) === strlen($entete)) {
85
-		[$entete, $corps] = explode("\n", $corps, 2);
86
-	}
87
-	// si une seule colonne, en faire le titre
88
-	if (preg_match("/^([^$sep]+)$sep+\$/", $entete, $l)) {
89
-		$caption = "\n||" . $l[1] . '|';
90
-		[$entete, $corps] = explode("\n", $corps, 2);
91
-	}
92
-	// si premiere colonne vide, le raccourci doit quand meme produire <th...
93
-	if ($entete[0] == $sep) {
94
-		$entete = ' ' . $entete;
95
-	}
81
+    [$entete, $corps] = explode("\n", $t, 2);
82
+    $caption = '';
83
+    // sauter la ligne de tete formee seulement de separateurs
84
+    if (substr_count($entete, $sep) === strlen($entete)) {
85
+        [$entete, $corps] = explode("\n", $corps, 2);
86
+    }
87
+    // si une seule colonne, en faire le titre
88
+    if (preg_match("/^([^$sep]+)$sep+\$/", $entete, $l)) {
89
+        $caption = "\n||" . $l[1] . '|';
90
+        [$entete, $corps] = explode("\n", $corps, 2);
91
+    }
92
+    // si premiere colonne vide, le raccourci doit quand meme produire <th...
93
+    if ($entete[0] == $sep) {
94
+        $entete = ' ' . $entete;
95
+    }
96 96
 
97
-	$lignes = explode("\n", $corps);
97
+    $lignes = explode("\n", $corps);
98 98
 
99
-	// retrait des lignes vides finales
100
-	while (
101
-		$lignes !== [] && preg_match("/^$sep*$/", $lignes[count($lignes) - 1])
102
-	) {
103
-		unset($lignes[count($lignes) - 1]);
104
-	}
105
-	//  calcul du  nombre de colonne a chaque ligne
106
-	$nbcols = [];
107
-	$max = $mil = substr_count($entete, $sep);
108
-	foreach ($lignes as $k => $v) {
109
-		if ($max !== ($nbcols[$k] = substr_count($v, $sep))) {
110
-			if ($max > $nbcols[$k]) {
111
-				$mil = $nbcols[$k];
112
-			} else {
113
-				$mil = $max;
114
-				$max = $nbcols[$k];
115
-			}
116
-		}
117
-	}
118
-	// Si pas le meme nombre, cadrer au nombre max
119
-	if ($mil !== $max) {
120
-		foreach ($nbcols as $k => $v) {
121
-			if ($v < $max) {
122
-				$lignes[$k] .= str_repeat($sep, $max - $v);
123
-			}
124
-		}
125
-	}
126
-	// et retirer les colonnes integralement vides
127
-	while (true) {
128
-		$nbcols = ($entete[strlen($entete) - 1] === $sep);
129
-		foreach ($lignes as $v) {
130
-			$nbcols &= ($v[strlen($v) - 1] === $sep);
131
-		}
132
-		if (!$nbcols) {
133
-			break;
134
-		}
135
-		$entete = substr($entete, 0, -1);
136
-		foreach ($lignes as $k => $v) {
137
-			$lignes[$k] = substr($v, 0, -1);
138
-		}
139
-	}
99
+    // retrait des lignes vides finales
100
+    while (
101
+        $lignes !== [] && preg_match("/^$sep*$/", $lignes[count($lignes) - 1])
102
+    ) {
103
+        unset($lignes[count($lignes) - 1]);
104
+    }
105
+    //  calcul du  nombre de colonne a chaque ligne
106
+    $nbcols = [];
107
+    $max = $mil = substr_count($entete, $sep);
108
+    foreach ($lignes as $k => $v) {
109
+        if ($max !== ($nbcols[$k] = substr_count($v, $sep))) {
110
+            if ($max > $nbcols[$k]) {
111
+                $mil = $nbcols[$k];
112
+            } else {
113
+                $mil = $max;
114
+                $max = $nbcols[$k];
115
+            }
116
+        }
117
+    }
118
+    // Si pas le meme nombre, cadrer au nombre max
119
+    if ($mil !== $max) {
120
+        foreach ($nbcols as $k => $v) {
121
+            if ($v < $max) {
122
+                $lignes[$k] .= str_repeat($sep, $max - $v);
123
+            }
124
+        }
125
+    }
126
+    // et retirer les colonnes integralement vides
127
+    while (true) {
128
+        $nbcols = ($entete[strlen($entete) - 1] === $sep);
129
+        foreach ($lignes as $v) {
130
+            $nbcols &= ($v[strlen($v) - 1] === $sep);
131
+        }
132
+        if (!$nbcols) {
133
+            break;
134
+        }
135
+        $entete = substr($entete, 0, -1);
136
+        foreach ($lignes as $k => $v) {
137
+            $lignes[$k] = substr($v, 0, -1);
138
+        }
139
+    }
140 140
 
141
-	foreach ($lignes as &$l) {
142
-		$l = str_replace('&#34#', '"', $l);
143
-		$l = str_replace('``**``', "\n", $l);
144
-		$l = explode($sep, $l);
145
-	}
141
+    foreach ($lignes as &$l) {
142
+        $l = str_replace('&#34#', '"', $l);
143
+        $l = str_replace('``**``', "\n", $l);
144
+        $l = explode($sep, $l);
145
+    }
146 146
 
147
-	return [explode($sep, $entete), $lignes, $caption];
147
+    return [explode($sep, $entete), $lignes, $caption];
148 148
 }
Please login to merge, or discard this patch.