Completed
Push — master ( 238d74...1c4dd4 )
by cam
01:23
created
ecrire/base/connect_sql.php 1 patch
Indentation   +319 added lines, -319 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\SQL
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 require_once _ROOT_RESTREINT . 'base/objets.php';
21 21
 
@@ -41,125 +41,125 @@  discard block
 block discarded – undo
41 41
  **/
42 42
 function spip_connect($serveur = '', $version = '') {
43 43
 
44
-	$serveur = is_string($serveur) ? strtolower($serveur) : '';
45
-	$index = $serveur ?: 0;
46
-	if (!$version) {
47
-		$version = $GLOBALS['spip_sql_version'];
48
-	}
49
-	if (isset($GLOBALS['connexions'][$index][$version])) {
50
-		return $GLOBALS['connexions'][$index];
51
-	}
52
-
53
-	include_spip('base/abstract_sql');
54
-	$install = (_request('exec') == 'install');
55
-
56
-	// Premiere connexion ?
57
-	if (!($old = isset($GLOBALS['connexions'][$index]))) {
58
-		$f = '';
59
-		if ($serveur) {
60
-			// serveur externe et nom de serveur bien ecrit ?
61
-			if (
62
-				defined('_DIR_CONNECT')
63
-				&& preg_match('/^[\w\.]*$/', $serveur)
64
-			) {
65
-				$f = _DIR_CONNECT . $serveur . '.php';
66
-				if (!is_readable($f) && !$install) {
67
-					// chercher une declaration de serveur dans le path
68
-					// qui peut servir à des plugins à declarer des connexions à une base sqlite
69
-					// Ex: sert aux boucles POUR et au plugin-dist dump pour se connecter sur le sqlite du dump
70
-					$f = find_in_path("$serveur.php", 'connect/');
71
-				}
72
-			}
73
-		} else {
74
-			if (defined('_FILE_CONNECT') && _FILE_CONNECT) {
75
-				// init du serveur principal
76
-				$f = _FILE_CONNECT;
77
-			} elseif ($install && defined('_FILE_CONNECT_TMP')) {
78
-				// installation en cours
79
-				$f = _FILE_CONNECT_TMP;
80
-			}
81
-		}
82
-
83
-		unset($GLOBALS['db_ok']);
84
-		unset($GLOBALS['spip_connect_version']);
85
-		if ($f && is_readable($f)) {
86
-			include($f);
87
-			if (!isset($GLOBALS['db_ok'])) {
88
-				spip_log("spip_connect: fichier de connexion '$f' OK mais echec connexion au serveur", _LOG_HS);
89
-			}
90
-		}
91
-		else {
92
-			spip_log("spip_connect: fichier de connexion '$f' non trouve, pas de connexion serveur", _LOG_HS);
93
-		}
94
-		if (!isset($GLOBALS['db_ok'])) {
95
-			// fera mieux la prochaine fois
96
-			if ($install) {
97
-				return false;
98
-			}
99
-			// ne plus reessayer si ce n'est pas l'install
100
-			return $GLOBALS['connexions'][$index] = false;
101
-		}
102
-		$GLOBALS['connexions'][$index] = $GLOBALS['db_ok'];
103
-	}
104
-	// si la connexion a deja ete tentee mais a echoue, le dire!
105
-	if (!$GLOBALS['connexions'][$index]) {
106
-		return false;
107
-	}
108
-
109
-	// la connexion a reussi ou etait deja faite.
110
-	// chargement de la version du jeu de fonctions
111
-	// si pas dans le fichier par defaut
112
-	$type = $GLOBALS['db_ok']['type'];
113
-	$jeu = 'spip_' . $type . '_functions_' . $version;
114
-	if (!isset($GLOBALS[$jeu]) && !find_in_path($type . '_' . $version . '.php', 'req/', true)) {
115
-		spip_log("spip_connect: serveur $index version '$version' non defini pour '$type'", _LOG_HS);
116
-		// ne plus reessayer
117
-		return $GLOBALS['connexions'][$index][$version] = [];
118
-	}
119
-	$GLOBALS['connexions'][$index][$version] = $GLOBALS[$jeu];
120
-	if ($old) {
121
-		return $GLOBALS['connexions'][$index];
122
-	}
123
-
124
-	$GLOBALS['connexions'][$index]['spip_connect_version'] = $GLOBALS['spip_connect_version'] ?? 0;
125
-
126
-	// initialisation de l'alphabet utilise dans les connexions SQL
127
-	// si l'installation l'a determine.
128
-	// Celui du serveur principal l'impose aux serveurs secondaires
129
-	// s'ils le connaissent
130
-
131
-	if (!$serveur) {
132
-		$charset = spip_connect_main($GLOBALS[$jeu], $GLOBALS['db_ok']['charset']);
133
-		if (!$charset) {
134
-			unset($GLOBALS['connexions'][$index]);
135
-			spip_log('spip_connect: absence de charset', _LOG_AVERTISSEMENT);
136
-
137
-			return false;
138
-		}
139
-	} else {
140
-		if ($GLOBALS['db_ok']['charset']) {
141
-			$charset = $GLOBALS['db_ok']['charset'];
142
-		}
143
-		// spip_meta n'existe pas toujours dans la base
144
-		// C'est le cas d'un dump sqlite par exemple
145
-		elseif (
146
-			$GLOBALS['connexions'][$index]['spip_connect_version']
147
-			&& sql_showtable('spip_meta', true, $serveur)
148
-			&& ($r = sql_getfetsel('valeur', 'spip_meta', "nom='charset_sql_connexion'", '', '', '', '', $serveur))
149
-		) {
150
-			$charset = $r;
151
-		} else {
152
-			$charset = -1;
153
-		}
154
-	}
155
-	if ($charset != -1) {
156
-		$f = $GLOBALS[$jeu]['set_charset'];
157
-		if (function_exists($f)) {
158
-			$f($charset, $serveur);
159
-		}
160
-	}
161
-
162
-	return $GLOBALS['connexions'][$index];
44
+    $serveur = is_string($serveur) ? strtolower($serveur) : '';
45
+    $index = $serveur ?: 0;
46
+    if (!$version) {
47
+        $version = $GLOBALS['spip_sql_version'];
48
+    }
49
+    if (isset($GLOBALS['connexions'][$index][$version])) {
50
+        return $GLOBALS['connexions'][$index];
51
+    }
52
+
53
+    include_spip('base/abstract_sql');
54
+    $install = (_request('exec') == 'install');
55
+
56
+    // Premiere connexion ?
57
+    if (!($old = isset($GLOBALS['connexions'][$index]))) {
58
+        $f = '';
59
+        if ($serveur) {
60
+            // serveur externe et nom de serveur bien ecrit ?
61
+            if (
62
+                defined('_DIR_CONNECT')
63
+                && preg_match('/^[\w\.]*$/', $serveur)
64
+            ) {
65
+                $f = _DIR_CONNECT . $serveur . '.php';
66
+                if (!is_readable($f) && !$install) {
67
+                    // chercher une declaration de serveur dans le path
68
+                    // qui peut servir à des plugins à declarer des connexions à une base sqlite
69
+                    // Ex: sert aux boucles POUR et au plugin-dist dump pour se connecter sur le sqlite du dump
70
+                    $f = find_in_path("$serveur.php", 'connect/');
71
+                }
72
+            }
73
+        } else {
74
+            if (defined('_FILE_CONNECT') && _FILE_CONNECT) {
75
+                // init du serveur principal
76
+                $f = _FILE_CONNECT;
77
+            } elseif ($install && defined('_FILE_CONNECT_TMP')) {
78
+                // installation en cours
79
+                $f = _FILE_CONNECT_TMP;
80
+            }
81
+        }
82
+
83
+        unset($GLOBALS['db_ok']);
84
+        unset($GLOBALS['spip_connect_version']);
85
+        if ($f && is_readable($f)) {
86
+            include($f);
87
+            if (!isset($GLOBALS['db_ok'])) {
88
+                spip_log("spip_connect: fichier de connexion '$f' OK mais echec connexion au serveur", _LOG_HS);
89
+            }
90
+        }
91
+        else {
92
+            spip_log("spip_connect: fichier de connexion '$f' non trouve, pas de connexion serveur", _LOG_HS);
93
+        }
94
+        if (!isset($GLOBALS['db_ok'])) {
95
+            // fera mieux la prochaine fois
96
+            if ($install) {
97
+                return false;
98
+            }
99
+            // ne plus reessayer si ce n'est pas l'install
100
+            return $GLOBALS['connexions'][$index] = false;
101
+        }
102
+        $GLOBALS['connexions'][$index] = $GLOBALS['db_ok'];
103
+    }
104
+    // si la connexion a deja ete tentee mais a echoue, le dire!
105
+    if (!$GLOBALS['connexions'][$index]) {
106
+        return false;
107
+    }
108
+
109
+    // la connexion a reussi ou etait deja faite.
110
+    // chargement de la version du jeu de fonctions
111
+    // si pas dans le fichier par defaut
112
+    $type = $GLOBALS['db_ok']['type'];
113
+    $jeu = 'spip_' . $type . '_functions_' . $version;
114
+    if (!isset($GLOBALS[$jeu]) && !find_in_path($type . '_' . $version . '.php', 'req/', true)) {
115
+        spip_log("spip_connect: serveur $index version '$version' non defini pour '$type'", _LOG_HS);
116
+        // ne plus reessayer
117
+        return $GLOBALS['connexions'][$index][$version] = [];
118
+    }
119
+    $GLOBALS['connexions'][$index][$version] = $GLOBALS[$jeu];
120
+    if ($old) {
121
+        return $GLOBALS['connexions'][$index];
122
+    }
123
+
124
+    $GLOBALS['connexions'][$index]['spip_connect_version'] = $GLOBALS['spip_connect_version'] ?? 0;
125
+
126
+    // initialisation de l'alphabet utilise dans les connexions SQL
127
+    // si l'installation l'a determine.
128
+    // Celui du serveur principal l'impose aux serveurs secondaires
129
+    // s'ils le connaissent
130
+
131
+    if (!$serveur) {
132
+        $charset = spip_connect_main($GLOBALS[$jeu], $GLOBALS['db_ok']['charset']);
133
+        if (!$charset) {
134
+            unset($GLOBALS['connexions'][$index]);
135
+            spip_log('spip_connect: absence de charset', _LOG_AVERTISSEMENT);
136
+
137
+            return false;
138
+        }
139
+    } else {
140
+        if ($GLOBALS['db_ok']['charset']) {
141
+            $charset = $GLOBALS['db_ok']['charset'];
142
+        }
143
+        // spip_meta n'existe pas toujours dans la base
144
+        // C'est le cas d'un dump sqlite par exemple
145
+        elseif (
146
+            $GLOBALS['connexions'][$index]['spip_connect_version']
147
+            && sql_showtable('spip_meta', true, $serveur)
148
+            && ($r = sql_getfetsel('valeur', 'spip_meta', "nom='charset_sql_connexion'", '', '', '', '', $serveur))
149
+        ) {
150
+            $charset = $r;
151
+        } else {
152
+            $charset = -1;
153
+        }
154
+    }
155
+    if ($charset != -1) {
156
+        $f = $GLOBALS[$jeu]['set_charset'];
157
+        if (function_exists($f)) {
158
+            $f($charset, $serveur);
159
+        }
160
+    }
161
+
162
+    return $GLOBALS['connexions'][$index];
163 163
 }
164 164
 
165 165
 /**
@@ -168,12 +168,12 @@  discard block
 block discarded – undo
168 168
  * @param string $serveur Nom du connecteur de bdd utilisé
169 169
  **/
170 170
 function spip_sql_erreur($serveur = '') {
171
-	$connexion = spip_connect($serveur);
172
-	$e = sql_errno($serveur);
173
-	$t = ($connexion['type'] ?? 'sql');
174
-	$m = "Erreur $e de $t: " . sql_error($serveur) . "\nin " . sql_error_backtrace() . "\n" . trim((string) $connexion['last']);
175
-	$f = $t . $serveur;
176
-	spip_log($m, $f . '.' . _LOG_ERREUR);
171
+    $connexion = spip_connect($serveur);
172
+    $e = sql_errno($serveur);
173
+    $t = ($connexion['type'] ?? 'sql');
174
+    $m = "Erreur $e de $t: " . sql_error($serveur) . "\nin " . sql_error_backtrace() . "\n" . trim((string) $connexion['last']);
175
+    $f = $t . $serveur;
176
+    spip_log($m, $f . '.' . _LOG_ERREUR);
177 177
 }
178 178
 
179 179
 /**
@@ -195,23 +195,23 @@  discard block
 block discarded – undo
195 195
  *     - array : description de la connexion, si l'instruction sql est indisponible pour cette connexion
196 196
  **/
197 197
 function spip_connect_sql($version, $ins = '', $serveur = '', $continue = false) {
198
-	$desc = spip_connect($serveur, $version);
199
-	if (
200
-		$desc
201
-		&& ($f = ($desc[$version][$ins] ?? ''))
202
-		&& function_exists($f)
203
-	) {
204
-		return $f;
205
-	}
206
-	if ($continue) {
207
-		return $desc;
208
-	}
209
-	if ($ins) {
210
-		spip_log("Le serveur '$serveur' version $version n'a pas '$ins'", _LOG_ERREUR);
211
-	}
212
-	include_spip('inc/minipres');
213
-	echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
214
-	exit;
198
+    $desc = spip_connect($serveur, $version);
199
+    if (
200
+        $desc
201
+        && ($f = ($desc[$version][$ins] ?? ''))
202
+        && function_exists($f)
203
+    ) {
204
+        return $f;
205
+    }
206
+    if ($continue) {
207
+        return $desc;
208
+    }
209
+    if ($ins) {
210
+        spip_log("Le serveur '$serveur' version $version n'a pas '$ins'", _LOG_ERREUR);
211
+    }
212
+    include_spip('inc/minipres');
213
+    echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
214
+    exit;
215 215
 }
216 216
 
217 217
 /**
@@ -237,70 +237,70 @@  discard block
 block discarded – undo
237 237
  * @return array|null Description de la connexion
238 238
  */
239 239
 function spip_connect_db(
240
-	$host,
241
-	$port,
242
-	$login,
243
-	#[\SensitiveParameter] $pass,
244
-	$db = '',
245
-	$type = 'mysql',
246
-	$prefixe = '',
247
-	$auth = '',
248
-	$charset = ''
240
+    $host,
241
+    $port,
242
+    $login,
243
+    #[\SensitiveParameter] $pass,
244
+    $db = '',
245
+    $type = 'mysql',
246
+    $prefixe = '',
247
+    $auth = '',
248
+    $charset = ''
249 249
 ) {
250
-	// temps avant nouvelle tentative de connexion
251
-	// suite a une connection echouee
252
-	if (!defined('_CONNECT_RETRY_DELAY')) {
253
-		define('_CONNECT_RETRY_DELAY', 30);
254
-	}
255
-
256
-	$f = '';
257
-	// un fichier de identifiant par combinaison (type,host,port,db)
258
-	// pour ne pas declarer tout indisponible d'un coup
259
-	// si en cours d'installation ou si db=@test@ on ne pose rien
260
-	// car c'est un test de connexion
261
-	if (!defined('_ECRIRE_INSTALL') && $db !== '@test@') {
262
-		$f = _DIR_TMP . $type . '.' . substr(md5($host . $port . $db), 0, 8) . '.out';
263
-	} elseif ($db == '@test@') {
264
-		$db = '';
265
-	}
266
-
267
-	if (
268
-		$f
269
-		&& @file_exists($f)
270
-		&& (time() - @filemtime($f) < _CONNECT_RETRY_DELAY)
271
-	) {
272
-		spip_log("Echec : $f recent. Pas de tentative de connexion", _LOG_HS);
273
-
274
-		return null;
275
-	}
276
-
277
-	if (!$prefixe) {
278
-		$prefixe = $GLOBALS['table_prefix'] ?? $db;
279
-	}
280
-	$h = charger_fonction($type, 'req', true);
281
-	if (!$h) {
282
-		spip_log("les requetes $type ne sont pas fournies", _LOG_HS);
283
-
284
-		return null;
285
-	}
286
-	if ($g = $h($host, $port, $login, $pass, $db, $prefixe)) {
287
-		if (!is_array($auth)) {
288
-			// compatibilite version 0.7 initiale
289
-			$g['ldap'] = $auth;
290
-			$auth = ['ldap' => $auth];
291
-		}
292
-		$g['authentification'] = $auth;
293
-		$g['type'] = $type;
294
-		$g['charset'] = $charset;
295
-
296
-		return $GLOBALS['db_ok'] = $g;
297
-	}
298
-	// En cas d'indisponibilite du serveur, eviter de le bombarder
299
-	if ($f) {
300
-		@touch($f);
301
-		spip_log("Echec connexion serveur $type : host[$host] port[$port] login[$login] base[$db]", $type . '.' . _LOG_HS);
302
-	}
303
-	return null;
250
+    // temps avant nouvelle tentative de connexion
251
+    // suite a une connection echouee
252
+    if (!defined('_CONNECT_RETRY_DELAY')) {
253
+        define('_CONNECT_RETRY_DELAY', 30);
254
+    }
255
+
256
+    $f = '';
257
+    // un fichier de identifiant par combinaison (type,host,port,db)
258
+    // pour ne pas declarer tout indisponible d'un coup
259
+    // si en cours d'installation ou si db=@test@ on ne pose rien
260
+    // car c'est un test de connexion
261
+    if (!defined('_ECRIRE_INSTALL') && $db !== '@test@') {
262
+        $f = _DIR_TMP . $type . '.' . substr(md5($host . $port . $db), 0, 8) . '.out';
263
+    } elseif ($db == '@test@') {
264
+        $db = '';
265
+    }
266
+
267
+    if (
268
+        $f
269
+        && @file_exists($f)
270
+        && (time() - @filemtime($f) < _CONNECT_RETRY_DELAY)
271
+    ) {
272
+        spip_log("Echec : $f recent. Pas de tentative de connexion", _LOG_HS);
273
+
274
+        return null;
275
+    }
276
+
277
+    if (!$prefixe) {
278
+        $prefixe = $GLOBALS['table_prefix'] ?? $db;
279
+    }
280
+    $h = charger_fonction($type, 'req', true);
281
+    if (!$h) {
282
+        spip_log("les requetes $type ne sont pas fournies", _LOG_HS);
283
+
284
+        return null;
285
+    }
286
+    if ($g = $h($host, $port, $login, $pass, $db, $prefixe)) {
287
+        if (!is_array($auth)) {
288
+            // compatibilite version 0.7 initiale
289
+            $g['ldap'] = $auth;
290
+            $auth = ['ldap' => $auth];
291
+        }
292
+        $g['authentification'] = $auth;
293
+        $g['type'] = $type;
294
+        $g['charset'] = $charset;
295
+
296
+        return $GLOBALS['db_ok'] = $g;
297
+    }
298
+    // En cas d'indisponibilite du serveur, eviter de le bombarder
299
+    if ($f) {
300
+        @touch($f);
301
+        spip_log("Echec connexion serveur $type : host[$host] port[$port] login[$login] base[$db]", $type . '.' . _LOG_HS);
302
+    }
303
+    return null;
304 304
 }
305 305
 
306 306
 
@@ -332,32 +332,32 @@  discard block
 block discarded – undo
332 332
  *     - nom du charset sinon
333 333
  **/
334 334
 function spip_connect_main($connexion, $charset_sql_connexion = '') {
335
-	if ($GLOBALS['spip_connect_version'] < 0.1 && _DIR_RESTREINT) {
336
-		include_spip('inc/headers');
337
-		redirige_url_ecrire('upgrade', 'reinstall=oui');
338
-	}
339
-
340
-	if (!($f = $connexion['select'])) {
341
-		return false;
342
-	}
343
-	// si le charset est fourni, l'utiliser
344
-	if ($charset_sql_connexion) {
345
-		return $charset_sql_connexion;
346
-	}
347
-	// sinon on regarde la table spip_meta
348
-	// en cas d'erreur select retourne la requette (is_string=true donc)
349
-	if (
350
-		!($r = $f('valeur', 'spip_meta', "nom='charset_sql_connexion'"))
351
-		|| is_string($r)
352
-	) {
353
-		return false;
354
-	}
355
-	if (!($f = $connexion['fetch'])) {
356
-		return false;
357
-	}
358
-	$r = $f($r);
359
-
360
-	return (isset($r['valeur']) && $r['valeur']) ? $r['valeur'] : -1;
335
+    if ($GLOBALS['spip_connect_version'] < 0.1 && _DIR_RESTREINT) {
336
+        include_spip('inc/headers');
337
+        redirige_url_ecrire('upgrade', 'reinstall=oui');
338
+    }
339
+
340
+    if (!($f = $connexion['select'])) {
341
+        return false;
342
+    }
343
+    // si le charset est fourni, l'utiliser
344
+    if ($charset_sql_connexion) {
345
+        return $charset_sql_connexion;
346
+    }
347
+    // sinon on regarde la table spip_meta
348
+    // en cas d'erreur select retourne la requette (is_string=true donc)
349
+    if (
350
+        !($r = $f('valeur', 'spip_meta', "nom='charset_sql_connexion'"))
351
+        || is_string($r)
352
+    ) {
353
+        return false;
354
+    }
355
+    if (!($f = $connexion['fetch'])) {
356
+        return false;
357
+    }
358
+    $r = $f($r);
359
+
360
+    return (isset($r['valeur']) && $r['valeur']) ? $r['valeur'] : -1;
361 361
 }
362 362
 
363 363
 /**
@@ -373,16 +373,16 @@  discard block
 block discarded – undo
373 373
  * @return string Valeur échappée.
374 374
  **/
375 375
 function _q($a): string {
376
-	if (is_numeric($a)) {
377
-		return (string) $a;
378
-	} elseif (is_array($a)) {
379
-		return implode(',', array_map('_q', $a));
380
-	} elseif (is_scalar($a)) {
381
-		return ("'" . addslashes($a) . "'");
382
-	} elseif ($a === null) {
383
-		return "''";
384
-	}
385
-	throw new \RuntimeException('Can’t use _q with ' . gettype($a));
376
+    if (is_numeric($a)) {
377
+        return (string) $a;
378
+    } elseif (is_array($a)) {
379
+        return implode(',', array_map('_q', $a));
380
+    } elseif (is_scalar($a)) {
381
+        return ("'" . addslashes($a) . "'");
382
+    } elseif ($a === null) {
383
+        return "''";
384
+    }
385
+    throw new \RuntimeException('Can’t use _q with ' . gettype($a));
386 386
 }
387 387
 
388 388
 /**
@@ -398,75 +398,75 @@  discard block
 block discarded – undo
398 398
  * @return array
399 399
  */
400 400
 function query_echappe_textes($query, $uniqid = null) {
401
-	static $codeEchappements = null;
402
-	if (is_null($codeEchappements) || $uniqid) {
403
-		if (is_null($uniqid)) {
404
-			$uniqid = uniqid();
405
-		}
406
-		$uniqid = substr(md5((string) $uniqid), 0, 4);
407
-		$codeEchappements = ['\\\\' => "\x1@#{$uniqid}#@\x1", "\\'" => "\x2@#{$uniqid}#@\x2", '\\"' => "\x3@#{$uniqid}#@\x3", '%' => "\x4@#{$uniqid}#@\x4"];
408
-	}
409
-	if ($query === null) {
410
-		return $codeEchappements;
411
-	}
412
-
413
-	// si la query contient deja des codes d'echappement on va s'emmeler les pinceaux et donc on ne touche a rien
414
-	// ce n'est pas un cas legitime
415
-	foreach ($codeEchappements as $codeEchappement) {
416
-		if (str_contains($query, (string) $codeEchappement)) {
417
-			return [$query, []];
418
-		}
419
-	}
420
-
421
-	$query_echappees = str_replace(array_keys($codeEchappements), array_values($codeEchappements), $query);
422
-	if (preg_match_all("/('[^']*')|(\"[^\"]*\")/S", $query_echappees, $textes)) {
423
-		$textes = reset($textes);
424
-
425
-		$parts = [];
426
-		$currentpos = 0;
427
-		$k = 0;
428
-		while (count($textes)) {
429
-			$part = array_shift($textes);
430
-			$nextpos = strpos($query_echappees, (string) $part, $currentpos);
431
-			// si besoin recoller ensemble les doubles '' de sqlite (echappement des ')
432
-			while (count($textes) && str_ends_with((string) $part, "'")) {
433
-				$next = reset($textes);
434
-				if (
435
-					str_starts_with((string) $next, "'")
436
-					&& strpos($query_echappees, $part . $next, $currentpos) === $nextpos
437
-				) {
438
-					$part .= array_shift($textes);
439
-				}
440
-				else {
441
-					break;
442
-				}
443
-			}
444
-			$k++;
445
-			$parts[$k] = [
446
-				'texte' => $part,
447
-				'position' => $nextpos,
448
-				'placeholder' => '%' . $k . '$s',
449
-			];
450
-			$currentpos = $nextpos + strlen((string) $part);
451
-		}
452
-
453
-		// et on replace les parts une par une en commencant par la fin
454
-		while ($k > 0) {
455
-			$query_echappees = substr_replace($query_echappees, $parts[$k]['placeholder'], $parts[$k]['position'], strlen((string) $parts[$k]['texte']));
456
-			$k--;
457
-		}
458
-		$textes = array_column($parts, 'texte');
459
-	} else {
460
-		$textes = [];
461
-	}
462
-
463
-	// si il reste des quotes simples ou doubles, c'est qu'on s'est emmelle les pinceaux
464
-	// dans le doute on ne touche a rien
465
-	if (strpbrk($query_echappees, "'\"") !== false) {
466
-		return [$query, []];
467
-	}
468
-
469
-	return [$query_echappees, $textes];
401
+    static $codeEchappements = null;
402
+    if (is_null($codeEchappements) || $uniqid) {
403
+        if (is_null($uniqid)) {
404
+            $uniqid = uniqid();
405
+        }
406
+        $uniqid = substr(md5((string) $uniqid), 0, 4);
407
+        $codeEchappements = ['\\\\' => "\x1@#{$uniqid}#@\x1", "\\'" => "\x2@#{$uniqid}#@\x2", '\\"' => "\x3@#{$uniqid}#@\x3", '%' => "\x4@#{$uniqid}#@\x4"];
408
+    }
409
+    if ($query === null) {
410
+        return $codeEchappements;
411
+    }
412
+
413
+    // si la query contient deja des codes d'echappement on va s'emmeler les pinceaux et donc on ne touche a rien
414
+    // ce n'est pas un cas legitime
415
+    foreach ($codeEchappements as $codeEchappement) {
416
+        if (str_contains($query, (string) $codeEchappement)) {
417
+            return [$query, []];
418
+        }
419
+    }
420
+
421
+    $query_echappees = str_replace(array_keys($codeEchappements), array_values($codeEchappements), $query);
422
+    if (preg_match_all("/('[^']*')|(\"[^\"]*\")/S", $query_echappees, $textes)) {
423
+        $textes = reset($textes);
424
+
425
+        $parts = [];
426
+        $currentpos = 0;
427
+        $k = 0;
428
+        while (count($textes)) {
429
+            $part = array_shift($textes);
430
+            $nextpos = strpos($query_echappees, (string) $part, $currentpos);
431
+            // si besoin recoller ensemble les doubles '' de sqlite (echappement des ')
432
+            while (count($textes) && str_ends_with((string) $part, "'")) {
433
+                $next = reset($textes);
434
+                if (
435
+                    str_starts_with((string) $next, "'")
436
+                    && strpos($query_echappees, $part . $next, $currentpos) === $nextpos
437
+                ) {
438
+                    $part .= array_shift($textes);
439
+                }
440
+                else {
441
+                    break;
442
+                }
443
+            }
444
+            $k++;
445
+            $parts[$k] = [
446
+                'texte' => $part,
447
+                'position' => $nextpos,
448
+                'placeholder' => '%' . $k . '$s',
449
+            ];
450
+            $currentpos = $nextpos + strlen((string) $part);
451
+        }
452
+
453
+        // et on replace les parts une par une en commencant par la fin
454
+        while ($k > 0) {
455
+            $query_echappees = substr_replace($query_echappees, $parts[$k]['placeholder'], $parts[$k]['position'], strlen((string) $parts[$k]['texte']));
456
+            $k--;
457
+        }
458
+        $textes = array_column($parts, 'texte');
459
+    } else {
460
+        $textes = [];
461
+    }
462
+
463
+    // si il reste des quotes simples ou doubles, c'est qu'on s'est emmelle les pinceaux
464
+    // dans le doute on ne touche a rien
465
+    if (strpbrk($query_echappees, "'\"") !== false) {
466
+        return [$query, []];
467
+    }
468
+
469
+    return [$query_echappees, $textes];
470 470
 }
471 471
 
472 472
 /**
@@ -480,14 +480,14 @@  discard block
 block discarded – undo
480 480
  * @return string
481 481
  */
482 482
 function query_reinjecte_textes($query, $textes) {
483
-	// recuperer les codes echappements
484
-	$codeEchappements = query_echappe_textes(null);
483
+    // recuperer les codes echappements
484
+    $codeEchappements = query_echappe_textes(null);
485 485
 
486
-	if (!empty($textes)) {
487
-		$query = sprintf($query, ...$textes);
488
-	}
486
+    if (!empty($textes)) {
487
+        $query = sprintf($query, ...$textes);
488
+    }
489 489
 
490
-	return str_replace(array_values($codeEchappements), array_keys($codeEchappements), $query);
490
+    return str_replace(array_values($codeEchappements), array_keys($codeEchappements), $query);
491 491
 }
492 492
 
493 493
 
@@ -506,7 +506,7 @@  discard block
 block discarded – undo
506 506
  **/
507 507
 function spip_query($query, $serveur = '') {
508 508
 
509
-	$f = spip_connect_sql($GLOBALS['spip_sql_version'], 'query', $serveur, true);
509
+    $f = spip_connect_sql($GLOBALS['spip_sql_version'], 'query', $serveur, true);
510 510
 
511
-	return function_exists($f) ? $f($query, $serveur) : false;
511
+    return function_exists($f) ? $f($query, $serveur) : false;
512 512
 }
Please login to merge, or discard this patch.
ecrire/auth/spip.php 1 patch
Indentation   +397 added lines, -397 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,167 +33,167 @@  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
-				$hash =  hash('sha256', $row['alea_actuel'] . $pass);
85
-				$methode = 'sha256';
86
-			}
87
-			if ($row['pass'] === $hash) {
88
-				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG);
89
-				// ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth
90
-				if (!empty($row['backup_cles'])) {
91
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . (int) $row['id_auteur']);
92
-				}
93
-				break;
94
-			}
95
-
96
-		// on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long
97
-
98
-		case 60:
99
-		case 98:
100
-		default:
101
-			// doit-on restaurer un backup des cles ?
102
-			// si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass
103
-			if (
104
-				!$secret
105
-				&& $auteur_peut_sauver_cles
106
-				&& !empty($row['backup_cles'])
107
-			) {
108
-				if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
109
-					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
110
-					if ($cles->save()) {
111
-						$secret = $cles->getSecretAuth();
112
-					}
113
-					else {
114
-						spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
115
-						// et on echoue car on ne veut pas que la situation reste telle quelle
116
-						raler_fichier(_DIR_ETC . 'cles.php');
117
-					}
118
-				}
119
-				else {
120
-					spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
121
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . (int) $row['id_auteur']);
122
-				}
123
-			}
124
-
125
-			if (!$secret || !Password::verifier($pass, $row['pass'], $secret)) {
126
-				unset($row);
127
-			}
128
-			else {
129
-				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG);
130
-			}
131
-			break;
132
-	}
133
-
134
-	// Migration depuis ancienne version : si on a pas encore de cle
135
-	// ET si c'est le login d'un auteur qui peut sauver la cle
136
-	// créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php)
137
-	// si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre
138
-	if (!$secret && $auteur_peut_sauver_cles && auth_spip_initialiser_secret()) {
139
-		$secret = $cles->getSecretAuth();
140
-	}
141
-
142
-	// login/mot de passe incorrect
143
-	if (empty($row)) {
144
-		return [];
145
-	}
146
-
147
-	// fait tourner le codage du pass dans la base
148
-	// sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
149
-	if (!$phpauth && $secret) {
150
-		include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess
151
-		$pass_hash_next = Password::hacher($pass, $secret);
152
-		if ($pass_hash_next) {
153
-			$set = [
154
-				'alea_actuel' => 'alea_futur', // @deprecated 4.1
155
-				'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1
156
-				'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
157
-			];
158
-
159
-			// regenerer un htpass si on a active/desactive le plugin htpasswd
160
-			// et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo
161
-			$htpass = generer_htpass($pass);
162
-			if (strlen((string) $htpass) !== strlen((string) $row['htpass'])) {
163
-				$set['htpass'] = sql_quote($htpass, $serveur, 'text');
164
-			}
165
-
166
-			// a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre)
167
-			if ($auteur_peut_sauver_cles) {
168
-				$set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text');
169
-			}
170
-
171
-			@sql_update(
172
-				'spip_auteurs',
173
-				$set,
174
-				'id_auteur=' . (int) $row['id_auteur'] . ' AND pass=' . sql_quote(
175
-					$row['pass'],
176
-					$serveur,
177
-					'text'
178
-				),
179
-				[],
180
-				$serveur
181
-			);
182
-
183
-			// si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd
184
-			if (isset($set['htpass'])) {
185
-				ecrire_acces();
186
-			}
187
-		}
188
-
189
-		// En profiter pour verifier la securite de tmp/
190
-		// Si elle ne fonctionne pas a l'installation, prevenir
191
-		if (!verifier_htaccess(_DIR_TMP) && defined('_ECRIRE_INSTALL')) {
192
-			return false;
193
-		}
194
-	}
195
-
196
-	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
+                $hash =  hash('sha256', $row['alea_actuel'] . $pass);
85
+                $methode = 'sha256';
86
+            }
87
+            if ($row['pass'] === $hash) {
88
+                spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG);
89
+                // ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth
90
+                if (!empty($row['backup_cles'])) {
91
+                    sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . (int) $row['id_auteur']);
92
+                }
93
+                break;
94
+            }
95
+
96
+        // on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long
97
+
98
+        case 60:
99
+        case 98:
100
+        default:
101
+            // doit-on restaurer un backup des cles ?
102
+            // si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass
103
+            if (
104
+                !$secret
105
+                && $auteur_peut_sauver_cles
106
+                && !empty($row['backup_cles'])
107
+            ) {
108
+                if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
109
+                    spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
110
+                    if ($cles->save()) {
111
+                        $secret = $cles->getSecretAuth();
112
+                    }
113
+                    else {
114
+                        spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
115
+                        // et on echoue car on ne veut pas que la situation reste telle quelle
116
+                        raler_fichier(_DIR_ETC . 'cles.php');
117
+                    }
118
+                }
119
+                else {
120
+                    spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
121
+                    sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . (int) $row['id_auteur']);
122
+                }
123
+            }
124
+
125
+            if (!$secret || !Password::verifier($pass, $row['pass'], $secret)) {
126
+                unset($row);
127
+            }
128
+            else {
129
+                spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG);
130
+            }
131
+            break;
132
+    }
133
+
134
+    // Migration depuis ancienne version : si on a pas encore de cle
135
+    // ET si c'est le login d'un auteur qui peut sauver la cle
136
+    // créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php)
137
+    // si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre
138
+    if (!$secret && $auteur_peut_sauver_cles && auth_spip_initialiser_secret()) {
139
+        $secret = $cles->getSecretAuth();
140
+    }
141
+
142
+    // login/mot de passe incorrect
143
+    if (empty($row)) {
144
+        return [];
145
+    }
146
+
147
+    // fait tourner le codage du pass dans la base
148
+    // sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
149
+    if (!$phpauth && $secret) {
150
+        include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess
151
+        $pass_hash_next = Password::hacher($pass, $secret);
152
+        if ($pass_hash_next) {
153
+            $set = [
154
+                'alea_actuel' => 'alea_futur', // @deprecated 4.1
155
+                'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1
156
+                'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
157
+            ];
158
+
159
+            // regenerer un htpass si on a active/desactive le plugin htpasswd
160
+            // et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo
161
+            $htpass = generer_htpass($pass);
162
+            if (strlen((string) $htpass) !== strlen((string) $row['htpass'])) {
163
+                $set['htpass'] = sql_quote($htpass, $serveur, 'text');
164
+            }
165
+
166
+            // a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre)
167
+            if ($auteur_peut_sauver_cles) {
168
+                $set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text');
169
+            }
170
+
171
+            @sql_update(
172
+                'spip_auteurs',
173
+                $set,
174
+                'id_auteur=' . (int) $row['id_auteur'] . ' AND pass=' . sql_quote(
175
+                    $row['pass'],
176
+                    $serveur,
177
+                    'text'
178
+                ),
179
+                [],
180
+                $serveur
181
+            );
182
+
183
+            // si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd
184
+            if (isset($set['htpass'])) {
185
+                ecrire_acces();
186
+            }
187
+        }
188
+
189
+        // En profiter pour verifier la securite de tmp/
190
+        // Si elle ne fonctionne pas a l'installation, prevenir
191
+        if (!verifier_htaccess(_DIR_TMP) && defined('_ECRIRE_INSTALL')) {
192
+            return false;
193
+        }
194
+    }
195
+
196
+    return $row;
197 197
 }
198 198
 
199 199
 /**
@@ -208,36 +208,36 @@  discard block
 block discarded – undo
208 208
  * @return bool
209 209
  */
210 210
 function auth_spip_initialiser_secret(bool $force = false): bool {
211
-	$cles = SpipCles::instance();
212
-	$secret = $cles->getSecretAuth();
213
-
214
-	// on ne fait rien si on a un secret dispo
215
-	if ($secret) {
216
-		return false;
217
-	}
218
-
219
-	// si force, on ne verifie pas la presence d'un backup chez un webmestre
220
-	if ($force) {
221
-		spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
222
-		$secret = $cles->getSecretAuth(true);
223
-		return true;
224
-	}
225
-
226
-	$has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
227
-	$has_backup = array_column($has_backup, 'id_auteur');
228
-	if ($has_backup === []) {
229
-		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);
230
-		if ($secret = $cles->getSecretAuth(true)) {
231
-			return true;
232
-		}
233
-		spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
234
-		// et on echoue car on ne veut pas que la situation reste telle quelle
235
-		raler_fichier(_DIR_ETC . 'cles.php');
236
-	}
237
-	else {
238
-		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);
239
-	}
240
-	return false;
211
+    $cles = SpipCles::instance();
212
+    $secret = $cles->getSecretAuth();
213
+
214
+    // on ne fait rien si on a un secret dispo
215
+    if ($secret) {
216
+        return false;
217
+    }
218
+
219
+    // si force, on ne verifie pas la presence d'un backup chez un webmestre
220
+    if ($force) {
221
+        spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
222
+        $secret = $cles->getSecretAuth(true);
223
+        return true;
224
+    }
225
+
226
+    $has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
227
+    $has_backup = array_column($has_backup, 'id_auteur');
228
+    if ($has_backup === []) {
229
+        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);
230
+        if ($secret = $cles->getSecretAuth(true)) {
231
+            return true;
232
+        }
233
+        spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
234
+        // et on echoue car on ne veut pas que la situation reste telle quelle
235
+        raler_fichier(_DIR_ETC . 'cles.php');
236
+    }
237
+    else {
238
+        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);
239
+    }
240
+    return false;
241 241
 }
242 242
 
243 243
 /**
@@ -247,19 +247,19 @@  discard block
 block discarded – undo
247 247
  * @return array
248 248
  */
249 249
 function auth_spip_formulaire_login($flux) {
250
-	// javascript qui gere la securite du login en evitant de faire circuler le pass en clair
251
-	$js = file_get_contents(find_in_path('prive/javascript/login.js'));
252
-	$flux['data'] .=
253
-		  '<script type="text/javascript">/*<![CDATA[*/'
254
-		. "$js\n"
255
-		. "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
256
-		. "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
257
-		. "'informe_auteur_en_cours':false,"
258
-		. "'attente_informe':0};"
259
-		. "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
260
-		. '/*]]>*/</script>';
261
-
262
-	return $flux;
250
+    // javascript qui gere la securite du login en evitant de faire circuler le pass en clair
251
+    $js = file_get_contents(find_in_path('prive/javascript/login.js'));
252
+    $flux['data'] .=
253
+            '<script type="text/javascript">/*<![CDATA[*/'
254
+        . "$js\n"
255
+        . "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
256
+        . "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
257
+        . "'informe_auteur_en_cours':false,"
258
+        . "'attente_informe':0};"
259
+        . "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
260
+        . '/*]]>*/</script>';
261
+
262
+    return $flux;
263 263
 }
264 264
 
265 265
 
@@ -271,8 +271,8 @@  discard block
 block discarded – undo
271 271
  *   toujours true pour un auteur cree dans SPIP
272 272
  */
273 273
 function auth_spip_autoriser_modifier_login(string $serveur = ''): bool {
274
-	// les fonctions d'ecriture sur base distante sont encore incompletes
275
-	return !strlen($serveur);
274
+    // les fonctions d'ecriture sur base distante sont encore incompletes
275
+    return !strlen($serveur);
276 276
 }
277 277
 
278 278
 /**
@@ -286,25 +286,25 @@  discard block
 block discarded – undo
286 286
  *  message d'erreur si login non valide, chaine vide sinon
287 287
  */
288 288
 function auth_spip_verifier_login($new_login, $id_auteur = 0, $serveur = '') {
289
-	// login et mot de passe
290
-	if (strlen($new_login)) {
291
-		if (strlen($new_login) < _LOGIN_TROP_COURT) {
292
-			return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]);
293
-		} else {
294
-			$n = sql_countsel(
295
-				'spip_auteurs',
296
-				'login=' . sql_quote($new_login) . ' AND id_auteur!=' . (int) $id_auteur . " AND statut!='5poubelle'",
297
-				'',
298
-				'',
299
-				$serveur
300
-			);
301
-			if ($n) {
302
-				return _T('info_login_existant');
303
-			}
304
-		}
305
-	}
306
-
307
-	return '';
289
+    // login et mot de passe
290
+    if (strlen($new_login)) {
291
+        if (strlen($new_login) < _LOGIN_TROP_COURT) {
292
+            return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]);
293
+        } else {
294
+            $n = sql_countsel(
295
+                'spip_auteurs',
296
+                'login=' . sql_quote($new_login) . ' AND id_auteur!=' . (int) $id_auteur . " AND statut!='5poubelle'",
297
+                '',
298
+                '',
299
+                $serveur
300
+            );
301
+            if ($n) {
302
+                return _T('info_login_existant');
303
+            }
304
+        }
305
+    }
306
+
307
+    return '';
308 308
 }
309 309
 
310 310
 /**
@@ -316,41 +316,41 @@  discard block
 block discarded – undo
316 316
  * @return bool
317 317
  */
318 318
 function auth_spip_modifier_login($new_login, $id_auteur, $serveur = '') {
319
-	if (is_null($new_login) || auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') {
320
-		return false;
321
-	}
322
-	if (
323
-		!($id_auteur = (int) $id_auteur)
324
-		|| !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur, '', '', '', '', $serveur)
325
-	) {
326
-		return false;
327
-	}
328
-	if ($new_login == $auteur['login']) {
329
-		return true;
330
-	} // on a rien fait mais c'est bon !
331
-
332
-	include_spip('action/editer_auteur');
333
-
334
-	// vider le login des auteurs a la poubelle qui avaient ce meme login
335
-	if (strlen($new_login)) {
336
-		$anciens = sql_allfetsel(
337
-			'id_auteur',
338
-			'spip_auteurs',
339
-			'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
340
-			'',
341
-			'',
342
-			'',
343
-			'',
344
-			$serveur
345
-		);
346
-		while ($row = array_pop($anciens)) {
347
-			auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur
348
-		}
349
-	}
350
-
351
-	auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur
352
-
353
-	return true;
319
+    if (is_null($new_login) || auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') {
320
+        return false;
321
+    }
322
+    if (
323
+        !($id_auteur = (int) $id_auteur)
324
+        || !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur, '', '', '', '', $serveur)
325
+    ) {
326
+        return false;
327
+    }
328
+    if ($new_login == $auteur['login']) {
329
+        return true;
330
+    } // on a rien fait mais c'est bon !
331
+
332
+    include_spip('action/editer_auteur');
333
+
334
+    // vider le login des auteurs a la poubelle qui avaient ce meme login
335
+    if (strlen($new_login)) {
336
+        $anciens = sql_allfetsel(
337
+            'id_auteur',
338
+            'spip_auteurs',
339
+            'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
340
+            '',
341
+            '',
342
+            '',
343
+            '',
344
+            $serveur
345
+        );
346
+        while ($row = array_pop($anciens)) {
347
+            auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur
348
+        }
349
+    }
350
+
351
+    auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur
352
+
353
+    return true;
354 354
 }
355 355
 
356 356
 /**
@@ -362,44 +362,44 @@  discard block
 block discarded – undo
362 362
  * @return string
363 363
  */
364 364
 function auth_spip_retrouver_login($login, $serveur = '') {
365
-	if (!strlen($login)) {
366
-		return null;
367
-	} // pas la peine de requeter
368
-	$l = sql_quote($login, $serveur, 'text');
369
-	if (
370
-		$r = sql_getfetsel(
371
-			'login',
372
-			'spip_auteurs',
373
-			"statut<>'5poubelle'" .
374
-			' AND (length(pass)>0)' .
375
-			" AND (login=$l)",
376
-			'',
377
-			'',
378
-			'',
379
-			'',
380
-			$serveur
381
-		)
382
-	) {
383
-		return $r;
384
-	}
385
-	// Si pas d'auteur avec ce login
386
-	// regarder s'il a saisi son nom ou son mail.
387
-	// Ne pas fusionner avec la requete precedente
388
-	// car un nom peut etre homonyme d'un autre login
389
-	else {
390
-		return sql_getfetsel(
391
-			'login',
392
-			'spip_auteurs',
393
-			"statut<>'5poubelle'" .
394
-			' AND (length(pass)>0)' .
395
-			" AND (login<>'' AND (nom=$l OR email=$l))",
396
-			'',
397
-			'',
398
-			'',
399
-			'',
400
-			$serveur
401
-		);
402
-	}
365
+    if (!strlen($login)) {
366
+        return null;
367
+    } // pas la peine de requeter
368
+    $l = sql_quote($login, $serveur, 'text');
369
+    if (
370
+        $r = sql_getfetsel(
371
+            'login',
372
+            'spip_auteurs',
373
+            "statut<>'5poubelle'" .
374
+            ' AND (length(pass)>0)' .
375
+            " AND (login=$l)",
376
+            '',
377
+            '',
378
+            '',
379
+            '',
380
+            $serveur
381
+        )
382
+    ) {
383
+        return $r;
384
+    }
385
+    // Si pas d'auteur avec ce login
386
+    // regarder s'il a saisi son nom ou son mail.
387
+    // Ne pas fusionner avec la requete precedente
388
+    // car un nom peut etre homonyme d'un autre login
389
+    else {
390
+        return sql_getfetsel(
391
+            'login',
392
+            'spip_auteurs',
393
+            "statut<>'5poubelle'" .
394
+            ' AND (length(pass)>0)' .
395
+            " AND (login<>'' AND (nom=$l OR email=$l))",
396
+            '',
397
+            '',
398
+            '',
399
+            '',
400
+            $serveur
401
+        );
402
+    }
403 403
 }
404 404
 
405 405
 /**
@@ -410,8 +410,8 @@  discard block
 block discarded – undo
410 410
  *  toujours true pour un auteur cree dans SPIP
411 411
  */
412 412
 function auth_spip_autoriser_modifier_pass(string $serveur = ''): bool {
413
-	// les fonctions d'ecriture sur base distante sont encore incompletes
414
-	return !strlen($serveur);
413
+    // les fonctions d'ecriture sur base distante sont encore incompletes
414
+    return !strlen($serveur);
415 415
 }
416 416
 
417 417
 
@@ -432,12 +432,12 @@  discard block
 block discarded – undo
432 432
  *  message d'erreur si login non valide, chaine vide sinon
433 433
  */
434 434
 function auth_spip_verifier_pass($login, #[\SensitiveParameter] $new_pass, $id_auteur = 0, $serveur = '') {
435
-	// login et mot de passe
436
-	if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
437
-		return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]);
438
-	}
435
+    // login et mot de passe
436
+    if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
437
+        return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]);
438
+    }
439 439
 
440
-	return '';
440
+    return '';
441 441
 }
442 442
 
443 443
 /**
@@ -451,47 +451,47 @@  discard block
 block discarded – undo
451 451
  * @return bool
452 452
  */
453 453
 function auth_spip_modifier_pass($login, #[\SensitiveParameter] $new_pass, $id_auteur, $serveur = '') {
454
-	if (is_null($new_pass) || auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
455
-		return false;
456
-	}
457
-
458
-	if (
459
-		!($id_auteur = (int) $id_auteur)
460
-		|| !($auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur, '', '', '', '', $serveur))
461
-	) {
462
-		return false;
463
-	}
464
-
465
-	$cles = SpipCles::instance();
466
-	$secret = $cles->getSecretAuth();
467
-	if (!$secret) {
468
-		if (auth_spip_initialiser_secret()) {
469
-			$secret = $cles->getSecretAuth();
470
-		}
471
-		else {
472
-			return false;
473
-		}
474
-	}
475
-
476
-
477
-	include_spip('inc/acces');
478
-	$set = [
479
-		'pass' => Password::hacher($new_pass, $secret),
480
-		'htpass' => generer_htpass($new_pass),
481
-		'alea_actuel' => creer_uniqid(), // @deprecated 4.1
482
-		'alea_futur' => creer_uniqid(), // @deprecated 4.1
483
-		'low_sec' => '',
484
-	];
485
-
486
-	// si c'est un webmestre, on met a jour son backup des cles
487
-	if ($auteur['statut'] === '0minirezo' && $auteur['webmestre'] === 'oui') {
488
-		$set['backup_cles'] = $cles->backup($new_pass);
489
-	}
490
-
491
-	include_spip('action/editer_auteur');
492
-	auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur
493
-
494
-	return true; // on a bien modifie le pass
454
+    if (is_null($new_pass) || auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
455
+        return false;
456
+    }
457
+
458
+    if (
459
+        !($id_auteur = (int) $id_auteur)
460
+        || !($auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur, '', '', '', '', $serveur))
461
+    ) {
462
+        return false;
463
+    }
464
+
465
+    $cles = SpipCles::instance();
466
+    $secret = $cles->getSecretAuth();
467
+    if (!$secret) {
468
+        if (auth_spip_initialiser_secret()) {
469
+            $secret = $cles->getSecretAuth();
470
+        }
471
+        else {
472
+            return false;
473
+        }
474
+    }
475
+
476
+
477
+    include_spip('inc/acces');
478
+    $set = [
479
+        'pass' => Password::hacher($new_pass, $secret),
480
+        'htpass' => generer_htpass($new_pass),
481
+        'alea_actuel' => creer_uniqid(), // @deprecated 4.1
482
+        'alea_futur' => creer_uniqid(), // @deprecated 4.1
483
+        'low_sec' => '',
484
+    ];
485
+
486
+    // si c'est un webmestre, on met a jour son backup des cles
487
+    if ($auteur['statut'] === '0minirezo' && $auteur['webmestre'] === 'oui') {
488
+        $set['backup_cles'] = $cles->backup($new_pass);
489
+    }
490
+
491
+    include_spip('action/editer_auteur');
492
+    auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur
493
+
494
+    return true; // on a bien modifie le pass
495 495
 }
496 496
 
497 497
 /**
@@ -505,54 +505,54 @@  discard block
 block discarded – undo
505 505
  * @return void
506 506
  */
507 507
 function auth_spip_synchroniser_distant($id_auteur, $champs, $options = [], string $serveur = ''): void {
508
-	// ne rien faire pour une base distante : on ne sait pas regenerer les htaccess
509
-	if (strlen($serveur)) {
510
-		return;
511
-	}
512
-	// si un login, pass ou statut a ete modifie
513
-	// regenerer les fichier htpass
514
-	if (
515
-		isset($champs['login']) || isset($champs['pass']) || isset($champs['statut']) || isset($options['all']) && $options['all']
516
-	) {
517
-		$htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
518
-		$htpasswd = _DIR_TMP . _AUTH_USER_FILE;
519
-
520
-		// Cette variable de configuration peut etre posee par un plugin
521
-		// par exemple acces_restreint ;
522
-		// si .htaccess existe, outrepasser spip_meta
523
-		if (
524
-			(!isset($GLOBALS['meta']['creer_htpasswd']) || $GLOBALS['meta']['creer_htpasswd'] != 'oui') && !@file_exists($htaccess)
525
-		) {
526
-			spip_unlink($htpasswd);
527
-			spip_unlink($htpasswd . '-admin');
528
-
529
-			return;
530
-		}
531
-
532
-		# remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
533
-		# de devenir redacteur le cas echeant (auth http)... a nettoyer
534
-		// attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
535
-
536
-		$p1 = ''; // login:htpass pour tous
537
-		$p2 = ''; // login:htpass pour les admins
538
-		$s = sql_select(
539
-			'login, htpass, statut',
540
-			'spip_auteurs',
541
-			sql_in('statut', ['1comite', '0minirezo', 'nouveau'])
542
-		);
543
-		while ($t = sql_fetch($s)) {
544
-			if (strlen((string) $t['login']) && strlen((string) $t['htpass'])) {
545
-				$p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
546
-				if ($t['statut'] == '0minirezo') {
547
-					$p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
548
-				}
549
-			}
550
-		}
551
-		sql_free($s);
552
-		if ($p1) {
553
-			ecrire_fichier($htpasswd, $p1);
554
-			ecrire_fichier($htpasswd . '-admin', $p2);
555
-			spip_log("Ecriture de $htpasswd et $htpasswd-admin");
556
-		}
557
-	}
508
+    // ne rien faire pour une base distante : on ne sait pas regenerer les htaccess
509
+    if (strlen($serveur)) {
510
+        return;
511
+    }
512
+    // si un login, pass ou statut a ete modifie
513
+    // regenerer les fichier htpass
514
+    if (
515
+        isset($champs['login']) || isset($champs['pass']) || isset($champs['statut']) || isset($options['all']) && $options['all']
516
+    ) {
517
+        $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
518
+        $htpasswd = _DIR_TMP . _AUTH_USER_FILE;
519
+
520
+        // Cette variable de configuration peut etre posee par un plugin
521
+        // par exemple acces_restreint ;
522
+        // si .htaccess existe, outrepasser spip_meta
523
+        if (
524
+            (!isset($GLOBALS['meta']['creer_htpasswd']) || $GLOBALS['meta']['creer_htpasswd'] != 'oui') && !@file_exists($htaccess)
525
+        ) {
526
+            spip_unlink($htpasswd);
527
+            spip_unlink($htpasswd . '-admin');
528
+
529
+            return;
530
+        }
531
+
532
+        # remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
533
+        # de devenir redacteur le cas echeant (auth http)... a nettoyer
534
+        // attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
535
+
536
+        $p1 = ''; // login:htpass pour tous
537
+        $p2 = ''; // login:htpass pour les admins
538
+        $s = sql_select(
539
+            'login, htpass, statut',
540
+            'spip_auteurs',
541
+            sql_in('statut', ['1comite', '0minirezo', 'nouveau'])
542
+        );
543
+        while ($t = sql_fetch($s)) {
544
+            if (strlen((string) $t['login']) && strlen((string) $t['htpass'])) {
545
+                $p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
546
+                if ($t['statut'] == '0minirezo') {
547
+                    $p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
548
+                }
549
+            }
550
+        }
551
+        sql_free($s);
552
+        if ($p1) {
553
+            ecrire_fichier($htpasswd, $p1);
554
+            ecrire_fichier($htpasswd . '-admin', $p2);
555
+            spip_log("Ecriture de $htpasswd et $htpasswd-admin");
556
+        }
557
+    }
558 558
 }
Please login to merge, or discard this patch.
ecrire/auth/sha256.inc.php 1 patch
Indentation   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -12,6 +12,6 @@
 block discarded – undo
12 12
  * @return string Le SHA de la chaîne
13 13
  */
14 14
 function spip_sha256($str) {
15
-	trigger_deprecation('spip', '5.0', 'Using "%s" is deprecated, use "%s" instead.', 'spip_sha256($str)', 'hash(\'sha256\', $str)');
16
-	return hash('sha256', $str);
15
+    trigger_deprecation('spip', '5.0', 'Using "%s" is deprecated, use "%s" instead.', 'spip_sha256($str)', 'hash(\'sha256\', $str)');
16
+    return hash('sha256', $str);
17 17
 }
Please login to merge, or discard this patch.
ecrire/inc/headers.php 1 patch
Indentation   +135 added lines, -135 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,27 +184,27 @@  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
 // Retourne ce qui va bien pour que le navigateur ne mette pas la page en cache
191 191
 function http_no_cache() {
192
-	if (headers_sent()) {
193
-		spip_log('http_no_cache arrive trop tard');
194
-
195
-		return;
196
-	}
197
-	$charset = empty($GLOBALS['meta']['charset']) ? 'utf-8' : $GLOBALS['meta']['charset'];
198
-
199
-	// selon http://developer.apple.com/internet/safari/faq.html#anchor5
200
-	// il faudrait aussi pour Safari
201
-	// header("Cache-Control: post-check=0, pre-check=0", false)
202
-	// mais ca ne respecte pas
203
-	// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
204
-
205
-	header("Content-Type: text/html; charset=$charset");
206
-	header('Expires: 0');
207
-	header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
208
-	header('Cache-Control: no-cache, must-revalidate');
209
-	header('Pragma: no-cache');
192
+    if (headers_sent()) {
193
+        spip_log('http_no_cache arrive trop tard');
194
+
195
+        return;
196
+    }
197
+    $charset = empty($GLOBALS['meta']['charset']) ? 'utf-8' : $GLOBALS['meta']['charset'];
198
+
199
+    // selon http://developer.apple.com/internet/safari/faq.html#anchor5
200
+    // il faudrait aussi pour Safari
201
+    // header("Cache-Control: post-check=0, pre-check=0", false)
202
+    // mais ca ne respecte pas
203
+    // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
204
+
205
+    header("Content-Type: text/html; charset=$charset");
206
+    header('Expires: 0');
207
+    header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
208
+    header('Cache-Control: no-cache, must-revalidate');
209
+    header('Pragma: no-cache');
210 210
 }
Please login to merge, or discard this patch.
ecrire/inc/filtres_dates.php 1 patch
Indentation   +562 added lines, -562 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\Filtres
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 
21 21
 /**
@@ -36,29 +36,29 @@  discard block
 block discarded – undo
36 36
  *     - une chaîne vide si la date est considérée nulle
37 37
  **/
38 38
 function normaliser_date($date, $forcer_jour = false): string {
39
-	$date = vider_date($date);
40
-	if ($date) {
41
-		if (preg_match('/^\d{8,10}$/', $date)) {
42
-			$date = date('Y-m-d H:i:s', $date);
43
-		}
44
-		if (preg_match('#^([12]\d{3})([-/]00)?( [-0-9:]+)?$#', $date, $regs)) {
45
-			$regs = array_pad($regs, 4, null); // eviter notice php
46
-			$date = $regs[1] . '-00-00' . $regs[3];
47
-		} else {
48
-			if (preg_match('#^([12]\d{3}[-/][01]?\d)([-/]00)?( [-0-9:]+)?$#', $date, $regs)) {
49
-				$regs = array_pad($regs, 4, null); // eviter notice php
50
-				$date = preg_replace('@/@', '-', (string) $regs[1]) . '-00' . $regs[3];
51
-			} else {
52
-				$date = date('Y-m-d H:i:s', strtotime($date));
53
-			}
54
-		}
55
-
56
-		if ($forcer_jour) {
57
-			$date = str_replace('-00', '-01', $date);
58
-		}
59
-	}
60
-
61
-	return $date;
39
+    $date = vider_date($date);
40
+    if ($date) {
41
+        if (preg_match('/^\d{8,10}$/', $date)) {
42
+            $date = date('Y-m-d H:i:s', $date);
43
+        }
44
+        if (preg_match('#^([12]\d{3})([-/]00)?( [-0-9:]+)?$#', $date, $regs)) {
45
+            $regs = array_pad($regs, 4, null); // eviter notice php
46
+            $date = $regs[1] . '-00-00' . $regs[3];
47
+        } else {
48
+            if (preg_match('#^([12]\d{3}[-/][01]?\d)([-/]00)?( [-0-9:]+)?$#', $date, $regs)) {
49
+                $regs = array_pad($regs, 4, null); // eviter notice php
50
+                $date = preg_replace('@/@', '-', (string) $regs[1]) . '-00' . $regs[3];
51
+            } else {
52
+                $date = date('Y-m-d H:i:s', strtotime($date));
53
+            }
54
+        }
55
+
56
+        if ($forcer_jour) {
57
+            $date = str_replace('-00', '-01', $date);
58
+        }
59
+    }
60
+
61
+    return $date;
62 62
 }
63 63
 
64 64
 /**
@@ -71,22 +71,22 @@  discard block
 block discarded – undo
71 71
  *     - Une chaine vide
72 72
  **/
73 73
 function vider_date($letexte, $verif_format_date = false): string {
74
-	$letexte ??= '';
75
-	if (
76
-		!$verif_format_date
77
-		|| in_array(strlen($letexte), [10,19]) && preg_match('/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}:\d{2})?$/', $letexte)
78
-	) {
79
-		if (strncmp('0000-00-00', $letexte, 10) == 0) {
80
-			return '';
81
-		}
82
-		if (strncmp('0001-01-01', $letexte, 10) == 0) {
83
-			return '';
84
-		}
85
-		if (strncmp('1970-01-01', $letexte, 10) == 0) {
86
-			return '';
87
-		}  // eviter le bug GMT-1
88
-	}
89
-	return $letexte;
74
+    $letexte ??= '';
75
+    if (
76
+        !$verif_format_date
77
+        || in_array(strlen($letexte), [10,19]) && preg_match('/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}:\d{2})?$/', $letexte)
78
+    ) {
79
+        if (strncmp('0000-00-00', $letexte, 10) == 0) {
80
+            return '';
81
+        }
82
+        if (strncmp('0001-01-01', $letexte, 10) == 0) {
83
+            return '';
84
+        }
85
+        if (strncmp('1970-01-01', $letexte, 10) == 0) {
86
+            return '';
87
+        }  // eviter le bug GMT-1
88
+    }
89
+    return $letexte;
90 90
 }
91 91
 
92 92
 /**
@@ -102,17 +102,17 @@  discard block
 block discarded – undo
102 102
  **/
103 103
 function recup_heure($date): array {
104 104
 
105
-	if (preg_match('#(\d{1,2}):(\d{1,2})(?::(\d{1,2}))?#', $date, $elements)) {
106
-		array_shift($elements);
107
-		if (!isset($elements[2])) {
108
-			$elements[2] = 0;
109
-		}
110
-		$heure = $elements;
111
-	} else {
112
-		$heure = [0, 0, 0];
113
-	}
114
-
115
-	return $heure;
105
+    if (preg_match('#(\d{1,2}):(\d{1,2})(?::(\d{1,2}))?#', $date, $elements)) {
106
+        array_shift($elements);
107
+        if (!isset($elements[2])) {
108
+            $elements[2] = 0;
109
+        }
110
+        $heure = $elements;
111
+    } else {
112
+        $heure = [0, 0, 0];
113
+    }
114
+
115
+    return $heure;
116 116
 }
117 117
 
118 118
 /**
@@ -126,13 +126,13 @@  discard block
 block discarded – undo
126 126
  * @return string heures, sinon 0
127 127
  **/
128 128
 function heures($numdate): string {
129
-	$heures = null;
130
-	$date_array = recup_heure($numdate);
131
-	if ($date_array) {
132
-		[$heures, $minutes, $secondes] = $date_array;
133
-	}
129
+    $heures = null;
130
+    $date_array = recup_heure($numdate);
131
+    if ($date_array) {
132
+        [$heures, $minutes, $secondes] = $date_array;
133
+    }
134 134
 
135
-	return $heures;
135
+    return $heures;
136 136
 }
137 137
 
138 138
 /**
@@ -146,13 +146,13 @@  discard block
 block discarded – undo
146 146
  * @return string minutes, sinon 0
147 147
  **/
148 148
 function minutes($numdate): string {
149
-	$minutes = null;
150
-	$date_array = recup_heure($numdate);
151
-	if ($date_array) {
152
-		[$heures, $minutes, $secondes] = $date_array;
153
-	}
149
+    $minutes = null;
150
+    $date_array = recup_heure($numdate);
151
+    if ($date_array) {
152
+        [$heures, $minutes, $secondes] = $date_array;
153
+    }
154 154
 
155
-	return $minutes;
155
+    return $minutes;
156 156
 }
157 157
 
158 158
 /**
@@ -166,13 +166,13 @@  discard block
 block discarded – undo
166 166
  * @return string secondes, sinon 0
167 167
  **/
168 168
 function secondes($numdate): string {
169
-	$secondes = null;
170
-	$date_array = recup_heure($numdate);
171
-	if ($date_array) {
172
-		[$heures, $minutes, $secondes] = $date_array;
173
-	}
169
+    $secondes = null;
170
+    $date_array = recup_heure($numdate);
171
+    if ($date_array) {
172
+        [$heures, $minutes, $secondes] = $date_array;
173
+    }
174 174
 
175
-	return $secondes;
175
+    return $secondes;
176 176
 }
177 177
 
178 178
 /**
@@ -191,11 +191,11 @@  discard block
 block discarded – undo
191 191
  * @return string L'heure formatée dans la langue en cours.
192 192
  **/
193 193
 function heures_minutes($numdate, $forme = ''): string {
194
-	if ($forme !== 'abbr') {
195
-		return _T('date_fmt_heures_minutes', ['h' => heures($numdate), 'm' => minutes($numdate)]);
196
-	} else {
197
-		return _T('date_fmt_heures_minutes_court', ['h' => heures($numdate), 'm' => minutes($numdate)]);
198
-	}
194
+    if ($forme !== 'abbr') {
195
+        return _T('date_fmt_heures_minutes', ['h' => heures($numdate), 'm' => minutes($numdate)]);
196
+    } else {
197
+        return _T('date_fmt_heures_minutes_court', ['h' => heures($numdate), 'm' => minutes($numdate)]);
198
+    }
199 199
 }
200 200
 
201 201
 /**
@@ -220,57 +220,57 @@  discard block
 block discarded – undo
220 220
  * @return array [année, mois, jour, heures, minutes, secondes] ou []
221 221
  **/
222 222
 function recup_date($numdate, $forcer_jour = true): array {
223
-	if (!$numdate) {
224
-		return [];
225
-	}
226
-	$heures = $minutes = $secondes = 0;
227
-	if (preg_match('#(\d{1,2})/(\d{1,2})/(\d{4}|\d{1,2})#', $numdate, $regs)) {
228
-		$jour = $regs[1];
229
-		$mois = $regs[2];
230
-		$annee = $regs[3];
231
-		if ($annee < 90) {
232
-			$annee = 2000 + $annee;
233
-		} elseif ($annee < 100) {
234
-			$annee = 1900 + $annee;
235
-		}
236
-		[$heures, $minutes, $secondes] = recup_heure($numdate);
237
-	} elseif (preg_match('#(\d{4})-(\d{1,2})-(\d{1,2})#', $numdate, $regs)) {
238
-		$annee = $regs[1];
239
-		$mois = $regs[2];
240
-		$jour = $regs[3];
241
-		[$heures, $minutes, $secondes] = recup_heure($numdate);
242
-	} elseif (preg_match('#(\d{4})-(\d{2})#', $numdate, $regs)) {
243
-		$annee = $regs[1];
244
-		$mois = $regs[2];
245
-		$jour = '';
246
-		[$heures, $minutes, $secondes] = recup_heure($numdate);
247
-	} elseif (preg_match('#^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$#', $numdate, $regs)) {
248
-		$annee = $regs[1];
249
-		$mois = $regs[2];
250
-		$jour = $regs[3];
251
-		$heures = $regs[4];
252
-		$minutes = $regs[5];
253
-		$secondes = $regs[6];
254
-	} else {
255
-		$annee = $mois = $jour = '';
256
-	}
257
-	if ($annee > 4000) {
258
-		$annee -= 9000;
259
-	}
260
-	if (strlen($jour) && str_starts_with($jour, '0')) {
261
-		$jour = substr($jour, 1);
262
-	}
263
-
264
-	if ($forcer_jour && $jour == '0') {
265
-		$jour = '1';
266
-	}
267
-	if ($forcer_jour && $mois == '0') {
268
-		$mois = '1';
269
-	}
270
-	if ($annee || $mois || $jour || $heures || $minutes || $secondes) {
271
-		return [$annee, $mois, $jour, $heures, $minutes, $secondes];
272
-	}
273
-	return [];
223
+    if (!$numdate) {
224
+        return [];
225
+    }
226
+    $heures = $minutes = $secondes = 0;
227
+    if (preg_match('#(\d{1,2})/(\d{1,2})/(\d{4}|\d{1,2})#', $numdate, $regs)) {
228
+        $jour = $regs[1];
229
+        $mois = $regs[2];
230
+        $annee = $regs[3];
231
+        if ($annee < 90) {
232
+            $annee = 2000 + $annee;
233
+        } elseif ($annee < 100) {
234
+            $annee = 1900 + $annee;
235
+        }
236
+        [$heures, $minutes, $secondes] = recup_heure($numdate);
237
+    } elseif (preg_match('#(\d{4})-(\d{1,2})-(\d{1,2})#', $numdate, $regs)) {
238
+        $annee = $regs[1];
239
+        $mois = $regs[2];
240
+        $jour = $regs[3];
241
+        [$heures, $minutes, $secondes] = recup_heure($numdate);
242
+    } elseif (preg_match('#(\d{4})-(\d{2})#', $numdate, $regs)) {
243
+        $annee = $regs[1];
244
+        $mois = $regs[2];
245
+        $jour = '';
246
+        [$heures, $minutes, $secondes] = recup_heure($numdate);
247
+    } elseif (preg_match('#^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$#', $numdate, $regs)) {
248
+        $annee = $regs[1];
249
+        $mois = $regs[2];
250
+        $jour = $regs[3];
251
+        $heures = $regs[4];
252
+        $minutes = $regs[5];
253
+        $secondes = $regs[6];
254
+    } else {
255
+        $annee = $mois = $jour = '';
256
+    }
257
+    if ($annee > 4000) {
258
+        $annee -= 9000;
259
+    }
260
+    if (strlen($jour) && str_starts_with($jour, '0')) {
261
+        $jour = substr($jour, 1);
262
+    }
263
+
264
+    if ($forcer_jour && $jour == '0') {
265
+        $jour = '1';
266
+    }
267
+    if ($forcer_jour && $mois == '0') {
268
+        $mois = '1';
269
+    }
270
+    if ($annee || $mois || $jour || $heures || $minutes || $secondes) {
271
+        return [$annee, $mois, $jour, $heures, $minutes, $secondes];
272
+    }
273
+    return [];
274 274
 }
275 275
 
276 276
 /**
@@ -297,10 +297,10 @@  discard block
 block discarded – undo
297 297
  *     La date relative ou complète
298 298
  **/
299 299
 function date_interface($date, $decalage_maxi = 43200 /* 12*3600 */): string {
300
-	return sinon(
301
-		date_relative($date, $decalage_maxi),
302
-		affdate_heure($date)
303
-	);
300
+    return sinon(
301
+        date_relative($date, $decalage_maxi),
302
+        affdate_heure($date)
303
+    );
304 304
 }
305 305
 
306 306
 /**
@@ -333,72 +333,72 @@  discard block
 block discarded – undo
333 333
  **/
334 334
 function date_relative($date, $decalage_maxi = 0, $ref_date = null): string {
335 335
 
336
-	if (!$date) {
337
-		return '';
338
-	}
339
-
340
-	$ref_time = is_null($ref_date) ? time() : strtotime($ref_date);
341
-
342
-	$decal = date('U', $ref_time) - date('U', strtotime($date));
343
-
344
-	if ($decalage_maxi && ($decal > $decalage_maxi || $decal < 0)) {
345
-		return '';
346
-	}
347
-
348
-	if ($decal < 0) {
349
-		$il_y_a = 'date_dans';
350
-		$decal = -1 * $decal;
351
-	} else {
352
-		$il_y_a = 'date_il_y_a';
353
-	}
354
-
355
-	if ($decal > 3600 * 24 * 30 * 6) {
356
-		return affdate_court($date);
357
-	}
358
-
359
-	if ($decal > 3600 * 24 * 30) {
360
-		$mois = floor($decal / (3600 * 24 * 30));
361
-		$delai = $mois < 2
362
-			? "$mois " . _T('date_un_mois')
363
-			: "$mois " . _T('date_mois');
364
-	} else {
365
-		if ($decal > 3600 * 24 * 7) {
366
-			$semaines = floor($decal / (3600 * 24 * 7));
367
-			$delai = $semaines < 2
368
-				? "$semaines " . _T('date_une_semaine')
369
-				: "$semaines " . _T('date_semaines');
370
-		} else {
371
-			if ($decal > 3600 * 24) {
372
-				$jours = floor($decal / (3600 * 24));
373
-				if ($jours < 2) {
374
-					return $il_y_a == 'date_dans' ? _T('date_demain') : _T('date_hier');
375
-				} else {
376
-					$delai = "$jours " . _T('date_jours');
377
-				}
378
-			} else {
379
-				if ($decal >= 3600) {
380
-					$heures = floor($decal / 3600);
381
-					$delai = $heures < 2
382
-						? "$heures " . _T('date_une_heure')
383
-						: "$heures " . _T('date_heures');
384
-				} else {
385
-					if ($decal >= 60) {
386
-						$minutes = floor($decal / 60);
387
-						$delai = $minutes < 2
388
-							? "$minutes " . _T('date_une_minute')
389
-							: "$minutes " . _T('date_minutes');
390
-					} else {
391
-						$secondes = ceil($decal);
392
-						$delai = $secondes < 2
393
-							? "$secondes " . _T('date_une_seconde')
394
-							: "$secondes " . _T('date_secondes');
395
-					}
396
-				}
397
-			}
398
-		}
399
-	}
400
-
401
-	return _T($il_y_a, ['delai' => $delai]);
336
+    if (!$date) {
337
+        return '';
338
+    }
339
+
340
+    $ref_time = is_null($ref_date) ? time() : strtotime($ref_date);
341
+
342
+    $decal = date('U', $ref_time) - date('U', strtotime($date));
343
+
344
+    if ($decalage_maxi && ($decal > $decalage_maxi || $decal < 0)) {
345
+        return '';
346
+    }
347
+
348
+    if ($decal < 0) {
349
+        $il_y_a = 'date_dans';
350
+        $decal = -1 * $decal;
351
+    } else {
352
+        $il_y_a = 'date_il_y_a';
353
+    }
354
+
355
+    if ($decal > 3600 * 24 * 30 * 6) {
356
+        return affdate_court($date);
357
+    }
358
+
359
+    if ($decal > 3600 * 24 * 30) {
360
+        $mois = floor($decal / (3600 * 24 * 30));
361
+        $delai = $mois < 2
362
+            ? "$mois " . _T('date_un_mois')
363
+            : "$mois " . _T('date_mois');
364
+    } else {
365
+        if ($decal > 3600 * 24 * 7) {
366
+            $semaines = floor($decal / (3600 * 24 * 7));
367
+            $delai = $semaines < 2
368
+                ? "$semaines " . _T('date_une_semaine')
369
+                : "$semaines " . _T('date_semaines');
370
+        } else {
371
+            if ($decal > 3600 * 24) {
372
+                $jours = floor($decal / (3600 * 24));
373
+                if ($jours < 2) {
374
+                    return $il_y_a == 'date_dans' ? _T('date_demain') : _T('date_hier');
375
+                } else {
376
+                    $delai = "$jours " . _T('date_jours');
377
+                }
378
+            } else {
379
+                if ($decal >= 3600) {
380
+                    $heures = floor($decal / 3600);
381
+                    $delai = $heures < 2
382
+                        ? "$heures " . _T('date_une_heure')
383
+                        : "$heures " . _T('date_heures');
384
+                } else {
385
+                    if ($decal >= 60) {
386
+                        $minutes = floor($decal / 60);
387
+                        $delai = $minutes < 2
388
+                            ? "$minutes " . _T('date_une_minute')
389
+                            : "$minutes " . _T('date_minutes');
390
+                    } else {
391
+                        $secondes = ceil($decal);
392
+                        $delai = $secondes < 2
393
+                            ? "$secondes " . _T('date_une_seconde')
394
+                            : "$secondes " . _T('date_secondes');
395
+                    }
396
+                }
397
+            }
398
+        }
399
+    }
400
+
401
+    return _T($il_y_a, ['delai' => $delai]);
402 402
 }
403 403
 
404 404
 
@@ -424,30 +424,30 @@  discard block
 block discarded – undo
424 424
  **/
425 425
 function date_relativecourt($date, $decalage_maxi = 0): string {
426 426
 
427
-	if (!$date) {
428
-		return '';
429
-	}
430
-	$decal = date('U', strtotime(date('Y-m-d')) - strtotime(date('Y-m-d', strtotime($date))));
431
-
432
-	if ($decalage_maxi && ($decal > $decalage_maxi || $decal < 0)) {
433
-		return '';
434
-	}
435
-
436
-	if ($decal < -24 * 3600) {
437
-		$retour = date_relative($date, $decalage_maxi);
438
-	} elseif ($decal < 0) {
439
-		$retour = _T('date_demain');
440
-	} else {
441
-		if ($decal < (3600 * 24)) {
442
-			$retour = _T('date_aujourdhui');
443
-		} else {
444
-			$retour = $decal < (3600 * 24 * 2)
445
-				? _T('date_hier')
446
-				: date_relative($date, $decalage_maxi);
447
-		}
448
-	}
449
-
450
-	return $retour;
427
+    if (!$date) {
428
+        return '';
429
+    }
430
+    $decal = date('U', strtotime(date('Y-m-d')) - strtotime(date('Y-m-d', strtotime($date))));
431
+
432
+    if ($decalage_maxi && ($decal > $decalage_maxi || $decal < 0)) {
433
+        return '';
434
+    }
435
+
436
+    if ($decal < -24 * 3600) {
437
+        $retour = date_relative($date, $decalage_maxi);
438
+    } elseif ($decal < 0) {
439
+        $retour = _T('date_demain');
440
+    } else {
441
+        if ($decal < (3600 * 24)) {
442
+            $retour = _T('date_aujourdhui');
443
+        } else {
444
+            $retour = $decal < (3600 * 24 * 2)
445
+                ? _T('date_hier')
446
+                : date_relative($date, $decalage_maxi);
447
+        }
448
+    }
449
+
450
+    return $retour;
451 451
 }
452 452
 
453 453
 /**
@@ -464,173 +464,173 @@  discard block
 block discarded – undo
464 464
  * @return string
465 465
  */
466 466
 function affdate_base($numdate, $vue, $options = []): string {
467
-	if (is_string($options)) {
468
-		$options = ['param' => $options];
469
-	}
470
-	$date_array = recup_date($numdate, false);
471
-	if (!$date_array) {
472
-		return '';
473
-	}
474
-	[$annee, $mois, $jour, $heures, $minutes, $secondes] = $date_array;
475
-
476
-	// 1er, 21st, etc.
477
-	$journum = $jour;
478
-
479
-	if ($jour == 0) {
480
-		$jour = '';
481
-		$njour = 0;
482
-	} else {
483
-		$njour = (int) $jour;
484
-		if ($jourth = _T('date_jnum' . $jour)) {
485
-			$jour = $jourth;
486
-		}
487
-	}
488
-
489
-	$mois = (int) $mois;
490
-	if ($mois > 0 && $mois < 13) {
491
-		/* Traiter le cas "abbr" pour les noms de mois */
492
-		$param = ((isset($options['param']) && $options['param'] === 'abbr') ? '_' . $options['param'] : '');
493
-		$nommois = _T('date_mois_' . $mois . $param);
494
-		$jourmois = $jour
495
-			? _T('date_de_mois_' . $mois, ['j' => $jour, 'nommois' => $nommois])
496
-			: $nommois;
497
-	} else {
498
-		$nommois = '';
499
-		$jourmois = '';
500
-	}
501
-
502
-	if ($annee < 0) {
503
-		$annee = -$annee . ' ' . _T('date_avant_jc');
504
-		$avjc = true;
505
-	} else {
506
-		$avjc = false;
507
-	}
508
-
509
-	switch ($vue) {
510
-		case 'saison':
511
-		case 'saison_annee':
512
-			$saison = '';
513
-			if ($mois > 0) {
514
-				$saison = ($options['param'] == 'sud') ? 3 : 1;
515
-				if ($mois == 3 && $jour >= 21 || $mois > 3) {
516
-					$saison = ($options['param'] == 'sud') ? 4 : 2;
517
-				}
518
-				if ($mois == 6 && $jour >= 21 || $mois > 6) {
519
-					$saison = ($options['param'] == 'sud') ? 1 : 3;
520
-				}
521
-				if ($mois == 9 && $jour >= 21 || $mois > 9) {
522
-					$saison = ($options['param'] == 'sud') ? 2 : 4;
523
-				}
524
-				if ($mois == 12 && $jour >= 21 || $mois > 12) {
525
-					$saison = ($options['param'] == 'sud') ? 3 : 1;
526
-				}
527
-			}
528
-			if ($vue == 'saison') {
529
-				return $saison ? _T('date_saison_' . $saison) : '';
530
-			} else {
531
-				return $saison ? trim((string) _T(
532
-					'date_fmt_saison_annee',
533
-					['saison' => _T('date_saison_' . $saison), 'annee' => $annee]
534
-				)) : '';
535
-			}
536
-
537
-		case 'court':
538
-			if ($avjc) {
539
-				return $annee;
540
-			}
541
-			$a = ((isset($options['annee_courante']) && $options['annee_courante']) ? $options['annee_courante'] : date('Y'));
542
-			if ($annee < ($a - 100) || $annee > ($a + 100)) {
543
-				return $annee;
544
-			}
545
-			if ($annee != $a) {
546
-				return _T(
547
-					'date_fmt_mois_annee',
548
-					['mois' => $mois, 'nommois' => spip_ucfirst($nommois), 'annee' => $annee]
549
-				);
550
-			}
551
-
552
-			return _T(
553
-				'date_fmt_jour_mois',
554
-				['jourmois' => $jourmois, 'jour' => $jour, 'mois' => $mois, 'nommois' => $nommois, 'annee' => $annee]
555
-			);
556
-
557
-		case 'jourcourt':
558
-			if ($avjc) {
559
-				return $annee;
560
-			}
561
-			$a = ((isset($options['annee_courante']) && $options['annee_courante']) ? $options['annee_courante'] : date('Y'));
562
-			if ($annee < ($a - 100) || $annee > ($a + 100)) {
563
-				return $annee;
564
-			}
565
-			if ($annee != $a) {
566
-				return _T(
567
-					'date_fmt_jour_mois_annee',
568
-					['jourmois' => $jourmois, 'jour' => $jour, 'mois' => $mois, 'nommois' => $nommois, 'annee' => $annee]
569
-				);
570
-			}
571
-
572
-			return _T(
573
-				'date_fmt_jour_mois',
574
-				['jourmois' => $jourmois, 'jour' => $jour, 'mois' => $mois, 'nommois' => $nommois, 'annee' => $annee]
575
-			);
576
-
577
-		case 'entier':
578
-			if ($avjc) {
579
-				return $annee;
580
-			}
581
-			if ($jour) {
582
-				return _T(
583
-					'date_fmt_jour_mois_annee',
584
-					['jourmois' => $jourmois, 'jour' => $jour, 'mois' => $mois, 'nommois' => $nommois, 'annee' => $annee]
585
-				);
586
-			} elseif ($mois) {
587
-				return trim((string) _T('date_fmt_mois_annee', ['mois' => $mois, 'nommois' => $nommois, 'annee' => $annee]));
588
-			} else {
589
-				return $annee;
590
-			}
591
-
592
-		case 'nom_mois':
593
-			return $nommois;
594
-
595
-		case 'mois':
596
-			return sprintf('%02s', $mois);
597
-
598
-		case 'jour':
599
-			return $jour;
600
-
601
-		case 'journum':
602
-			return $journum;
603
-
604
-		case 'nom_jour':
605
-			if (!$mois || !$njour) {
606
-				return '';
607
-			}
608
-			$nom = mktime(1, 1, 1, $mois, $njour, $annee);
609
-			$nom = 1 + (int) date('w', $nom);
610
-			$param = ((isset($options['param']) && $options['param']) ? '_' . $options['param'] : '');
611
-
612
-			return _T('date_jour_' . $nom . $param);
613
-
614
-		case 'mois_annee':
615
-			if ($avjc) {
616
-				return $annee;
617
-			}
618
-
619
-			return trim((string) _T('date_fmt_mois_annee', ['mois' => $mois, 'nommois' => $nommois, 'annee' => $annee]));
620
-
621
-		case 'annee':
622
-			return $annee;
623
-
624
-		// Cas d'une vue non definie : retomber sur le format
625
-		// de date propose par http://www.php.net/date
626
-		default:
627
-			[$annee, $mois, $jour, $heures, $minutes, $secondes] = $date_array;
628
-			// il faut envoyer jour = 1 si jour pas défini, c'est le comportement qu'on avait historiquement en envoyant ''
629
-			if (!$time = mktime($heures, $minutes, $secondes, $mois, is_numeric($jour) ? $jour : 1, $annee)) {
630
-				$time = strtotime($numdate);
631
-			}
632
-			return date($vue, $time);
633
-	}
467
+    if (is_string($options)) {
468
+        $options = ['param' => $options];
469
+    }
470
+    $date_array = recup_date($numdate, false);
471
+    if (!$date_array) {
472
+        return '';
473
+    }
474
+    [$annee, $mois, $jour, $heures, $minutes, $secondes] = $date_array;
475
+
476
+    // 1er, 21st, etc.
477
+    $journum = $jour;
478
+
479
+    if ($jour == 0) {
480
+        $jour = '';
481
+        $njour = 0;
482
+    } else {
483
+        $njour = (int) $jour;
484
+        if ($jourth = _T('date_jnum' . $jour)) {
485
+            $jour = $jourth;
486
+        }
487
+    }
488
+
489
+    $mois = (int) $mois;
490
+    if ($mois > 0 && $mois < 13) {
491
+        /* Traiter le cas "abbr" pour les noms de mois */
492
+        $param = ((isset($options['param']) && $options['param'] === 'abbr') ? '_' . $options['param'] : '');
493
+        $nommois = _T('date_mois_' . $mois . $param);
494
+        $jourmois = $jour
495
+            ? _T('date_de_mois_' . $mois, ['j' => $jour, 'nommois' => $nommois])
496
+            : $nommois;
497
+    } else {
498
+        $nommois = '';
499
+        $jourmois = '';
500
+    }
501
+
502
+    if ($annee < 0) {
503
+        $annee = -$annee . ' ' . _T('date_avant_jc');
504
+        $avjc = true;
505
+    } else {
506
+        $avjc = false;
507
+    }
508
+
509
+    switch ($vue) {
510
+        case 'saison':
511
+        case 'saison_annee':
512
+            $saison = '';
513
+            if ($mois > 0) {
514
+                $saison = ($options['param'] == 'sud') ? 3 : 1;
515
+                if ($mois == 3 && $jour >= 21 || $mois > 3) {
516
+                    $saison = ($options['param'] == 'sud') ? 4 : 2;
517
+                }
518
+                if ($mois == 6 && $jour >= 21 || $mois > 6) {
519
+                    $saison = ($options['param'] == 'sud') ? 1 : 3;
520
+                }
521
+                if ($mois == 9 && $jour >= 21 || $mois > 9) {
522
+                    $saison = ($options['param'] == 'sud') ? 2 : 4;
523
+                }
524
+                if ($mois == 12 && $jour >= 21 || $mois > 12) {
525
+                    $saison = ($options['param'] == 'sud') ? 3 : 1;
526
+                }
527
+            }
528
+            if ($vue == 'saison') {
529
+                return $saison ? _T('date_saison_' . $saison) : '';
530
+            } else {
531
+                return $saison ? trim((string) _T(
532
+                    'date_fmt_saison_annee',
533
+                    ['saison' => _T('date_saison_' . $saison), 'annee' => $annee]
534
+                )) : '';
535
+            }
536
+
537
+        case 'court':
538
+            if ($avjc) {
539
+                return $annee;
540
+            }
541
+            $a = ((isset($options['annee_courante']) && $options['annee_courante']) ? $options['annee_courante'] : date('Y'));
542
+            if ($annee < ($a - 100) || $annee > ($a + 100)) {
543
+                return $annee;
544
+            }
545
+            if ($annee != $a) {
546
+                return _T(
547
+                    'date_fmt_mois_annee',
548
+                    ['mois' => $mois, 'nommois' => spip_ucfirst($nommois), 'annee' => $annee]
549
+                );
550
+            }
551
+
552
+            return _T(
553
+                'date_fmt_jour_mois',
554
+                ['jourmois' => $jourmois, 'jour' => $jour, 'mois' => $mois, 'nommois' => $nommois, 'annee' => $annee]
555
+            );
556
+
557
+        case 'jourcourt':
558
+            if ($avjc) {
559
+                return $annee;
560
+            }
561
+            $a = ((isset($options['annee_courante']) && $options['annee_courante']) ? $options['annee_courante'] : date('Y'));
562
+            if ($annee < ($a - 100) || $annee > ($a + 100)) {
563
+                return $annee;
564
+            }
565
+            if ($annee != $a) {
566
+                return _T(
567
+                    'date_fmt_jour_mois_annee',
568
+                    ['jourmois' => $jourmois, 'jour' => $jour, 'mois' => $mois, 'nommois' => $nommois, 'annee' => $annee]
569
+                );
570
+            }
571
+
572
+            return _T(
573
+                'date_fmt_jour_mois',
574
+                ['jourmois' => $jourmois, 'jour' => $jour, 'mois' => $mois, 'nommois' => $nommois, 'annee' => $annee]
575
+            );
576
+
577
+        case 'entier':
578
+            if ($avjc) {
579
+                return $annee;
580
+            }
581
+            if ($jour) {
582
+                return _T(
583
+                    'date_fmt_jour_mois_annee',
584
+                    ['jourmois' => $jourmois, 'jour' => $jour, 'mois' => $mois, 'nommois' => $nommois, 'annee' => $annee]
585
+                );
586
+            } elseif ($mois) {
587
+                return trim((string) _T('date_fmt_mois_annee', ['mois' => $mois, 'nommois' => $nommois, 'annee' => $annee]));
588
+            } else {
589
+                return $annee;
590
+            }
591
+
592
+        case 'nom_mois':
593
+            return $nommois;
594
+
595
+        case 'mois':
596
+            return sprintf('%02s', $mois);
597
+
598
+        case 'jour':
599
+            return $jour;
600
+
601
+        case 'journum':
602
+            return $journum;
603
+
604
+        case 'nom_jour':
605
+            if (!$mois || !$njour) {
606
+                return '';
607
+            }
608
+            $nom = mktime(1, 1, 1, $mois, $njour, $annee);
609
+            $nom = 1 + (int) date('w', $nom);
610
+            $param = ((isset($options['param']) && $options['param']) ? '_' . $options['param'] : '');
611
+
612
+            return _T('date_jour_' . $nom . $param);
613
+
614
+        case 'mois_annee':
615
+            if ($avjc) {
616
+                return $annee;
617
+            }
618
+
619
+            return trim((string) _T('date_fmt_mois_annee', ['mois' => $mois, 'nommois' => $nommois, 'annee' => $annee]));
620
+
621
+        case 'annee':
622
+            return $annee;
623
+
624
+        // Cas d'une vue non definie : retomber sur le format
625
+        // de date propose par http://www.php.net/date
626
+        default:
627
+            [$annee, $mois, $jour, $heures, $minutes, $secondes] = $date_array;
628
+            // il faut envoyer jour = 1 si jour pas défini, c'est le comportement qu'on avait historiquement en envoyant ''
629
+            if (!$time = mktime($heures, $minutes, $secondes, $mois, is_numeric($jour) ? $jour : 1, $annee)) {
630
+                $time = strtotime($numdate);
631
+            }
632
+            return date($vue, $time);
633
+    }
634 634
 }
635 635
 
636 636
 
@@ -657,11 +657,11 @@  discard block
 block discarded – undo
657 657
  *     Nom du jour
658 658
  **/
659 659
 function nom_jour($numdate, $forme = ''): string {
660
-	if ($forme !== 'abbr' && $forme !== 'initiale') {
661
-		$forme = '';
662
-	}
660
+    if ($forme !== 'abbr' && $forme !== 'initiale') {
661
+        $forme = '';
662
+    }
663 663
 
664
-	return affdate_base($numdate, 'nom_jour', ['param' => $forme]);
664
+    return affdate_base($numdate, 'nom_jour', ['param' => $forme]);
665 665
 }
666 666
 
667 667
 /**
@@ -683,7 +683,7 @@  discard block
 block discarded – undo
683 683
  *     Numéro du jour
684 684
  **/
685 685
 function jour($numdate): string {
686
-	return affdate_base($numdate, 'jour');
686
+    return affdate_base($numdate, 'jour');
687 687
 }
688 688
 
689 689
 /**
@@ -701,7 +701,7 @@  discard block
 block discarded – undo
701 701
  *     Numéro du jour
702 702
  **/
703 703
 function journum($numdate): string {
704
-	return affdate_base($numdate, 'journum');
704
+    return affdate_base($numdate, 'journum');
705 705
 }
706 706
 
707 707
 /**
@@ -719,7 +719,7 @@  discard block
 block discarded – undo
719 719
  *     Numéro du mois (sur 2 chiffres)
720 720
  **/
721 721
 function mois($numdate): string {
722
-	return  affdate_base($numdate, 'mois');
722
+    return  affdate_base($numdate, 'mois');
723 723
 }
724 724
 
725 725
 /**
@@ -743,11 +743,11 @@  discard block
 block discarded – undo
743 743
  *     Nom du mois
744 744
  **/
745 745
 function nom_mois($numdate, $forme = ''): string {
746
-	if ($forme !== 'abbr') {
747
-		$forme = '';
748
-	}
746
+    if ($forme !== 'abbr') {
747
+        $forme = '';
748
+    }
749 749
 
750
-	return affdate_base($numdate, 'nom_mois', ['param' => $forme]);
750
+    return affdate_base($numdate, 'nom_mois', ['param' => $forme]);
751 751
 }
752 752
 
753 753
 /**
@@ -765,7 +765,7 @@  discard block
 block discarded – undo
765 765
  *     Année (sur 4 chiffres)
766 766
  **/
767 767
 function annee($numdate): string {
768
-	return affdate_base($numdate, 'annee');
768
+    return affdate_base($numdate, 'annee');
769 769
 }
770 770
 
771 771
 
@@ -795,11 +795,11 @@  discard block
 block discarded – undo
795 795
  *     La date formatée
796 796
  **/
797 797
 function saison($numdate, $hemisphere = 'nord'): string {
798
-	if ($hemisphere !== 'sud') {
799
-		$hemisphere = 'nord';
800
-	}
798
+    if ($hemisphere !== 'sud') {
799
+        $hemisphere = 'nord';
800
+    }
801 801
 
802
-	return affdate_base($numdate, 'saison', ['param' => $hemisphere]);
802
+    return affdate_base($numdate, 'saison', ['param' => $hemisphere]);
803 803
 }
804 804
 
805 805
 
@@ -828,11 +828,11 @@  discard block
 block discarded – undo
828 828
  *     La date formatée
829 829
  **/
830 830
 function saison_annee($numdate, $hemisphere = 'nord'): string {
831
-	if ($hemisphere !== 'sud') {
832
-		$hemisphere = 'nord';
833
-	}
831
+    if ($hemisphere !== 'sud') {
832
+        $hemisphere = 'nord';
833
+    }
834 834
 
835
-	return affdate_base($numdate, 'saison_annee', ['param' => $hemisphere]);
835
+    return affdate_base($numdate, 'saison_annee', ['param' => $hemisphere]);
836 836
 }
837 837
 
838 838
 /**
@@ -860,7 +860,7 @@  discard block
 block discarded – undo
860 860
  *     La date formatée
861 861
  **/
862 862
 function affdate($numdate, $format = 'entier'): string {
863
-	return affdate_base($numdate, $format);
863
+    return affdate_base($numdate, $format);
864 864
 }
865 865
 
866 866
 
@@ -887,7 +887,7 @@  discard block
 block discarded – undo
887 887
  *     La date formatée
888 888
  **/
889 889
 function affdate_court($numdate, $annee_courante = null): string {
890
-	return affdate_base($numdate, 'court', ['annee_courante' => $annee_courante]);
890
+    return affdate_base($numdate, 'court', ['annee_courante' => $annee_courante]);
891 891
 }
892 892
 
893 893
 
@@ -914,7 +914,7 @@  discard block
 block discarded – undo
914 914
  *     La date formatée
915 915
  **/
916 916
 function affdate_jourcourt($numdate, $annee_courante = null): string {
917
-	return affdate_base($numdate, 'jourcourt', ['annee_courante' => $annee_courante]);
917
+    return affdate_base($numdate, 'jourcourt', ['annee_courante' => $annee_courante]);
918 918
 }
919 919
 
920 920
 /**
@@ -932,7 +932,7 @@  discard block
 block discarded – undo
932 932
  *     La date formatée
933 933
  **/
934 934
 function affdate_mois_annee($numdate): string {
935
-	return affdate_base($numdate, 'mois_annee');
935
+    return affdate_base($numdate, 'mois_annee');
936 936
 }
937 937
 
938 938
 /**
@@ -950,16 +950,16 @@  discard block
 block discarded – undo
950 950
  *     La date formatée, sinon ''
951 951
  **/
952 952
 function affdate_heure($numdate): string {
953
-	$date_array = recup_date($numdate);
954
-	if (!$date_array) {
955
-		return '';
956
-	}
957
-	[$annee, $mois, $jour, $heures, $minutes, $sec] = $date_array;
958
-
959
-	return _T('date_fmt_jour_heure', [
960
-		'jour' => affdate($numdate),
961
-		'heure' => _T('date_fmt_heures_minutes', ['h' => $heures, 'm' => $minutes])
962
-	]);
953
+    $date_array = recup_date($numdate);
954
+    if (!$date_array) {
955
+        return '';
956
+    }
957
+    [$annee, $mois, $jour, $heures, $minutes, $sec] = $date_array;
958
+
959
+    return _T('date_fmt_jour_heure', [
960
+        'jour' => affdate($numdate),
961
+        'heure' => _T('date_fmt_heures_minutes', ['h' => $heures, 'm' => $minutes])
962
+    ]);
963 963
 }
964 964
 
965 965
 /**
@@ -991,113 +991,113 @@  discard block
 block discarded – undo
991 991
  *     texte de la date
992 992
  */
993 993
 function affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme = ''): string {
994
-	$abbr = $jour = '';
995
-	$affdate = 'affdate_jourcourt';
996
-	if (str_contains($forme, 'abbr')) {
997
-		$abbr = 'abbr';
998
-	}
999
-	if (str_contains($forme, 'annee')) {
1000
-		$affdate = 'affdate';
1001
-	}
1002
-	if (str_contains($forme, 'jour')) {
1003
-		$jour = 'jour';
1004
-	}
1005
-
1006
-	$dtstart = $dtend = $dtabbr = '';
1007
-	if (str_contains($forme, 'hcal')) {
1008
-		$dtstart = "<abbr class='dtstart' title='" . date_iso($date_debut) . "'>";
1009
-		$dtend = "<abbr class='dtend' title='" . date_iso($date_fin) . "'>";
1010
-		$dtabbr = '</abbr>';
1011
-	}
1012
-
1013
-	$date_debut = strtotime($date_debut);
1014
-	$date_fin = strtotime($date_fin);
1015
-	$d = date('Y-m-d', $date_debut);
1016
-	$f = date('Y-m-d', $date_fin);
1017
-	$h = ($horaire === 'oui' || $horaire === true);
1018
-	$hd = _T('date_fmt_heures_minutes_court', ['h' => date('H', $date_debut), 'm' => date('i', $date_debut)]);
1019
-	$hf = _T('date_fmt_heures_minutes_court', ['h' => date('H', $date_fin), 'm' => date('i', $date_fin)]);
1020
-
1021
-	if ($d === $f) { // meme jour
1022
-		$nomjour = nom_jour($d, $abbr);
1023
-		$s = $affdate($d);
1024
-		$s = _T('date_fmt_jour', ['nomjour' => $nomjour, 'jour' => $s]);
1025
-		if ($h) {
1026
-			if ($hd === $hf) {
1027
-				// Lundi 20 fevrier a 18h25
1028
-				$s = spip_ucfirst(_T('date_fmt_jour_heure', ['jour' => $s, 'heure' => $hd]));
1029
-				$s = "$dtstart$s$dtabbr";
1030
-			} else {
1031
-				// Le <abbr...>lundi 20 fevrier de 18h00</abbr> a <abbr...>20h00</abbr>
1032
-				if ($dtabbr && $dtstart && $dtend) {
1033
-					$s = _T(
1034
-						'date_fmt_jour_heure_debut_fin_abbr',
1035
-						[
1036
-						'jour' => spip_ucfirst($s),
1037
-						'heure_debut' => $hd,
1038
-						'heure_fin' => $hf,
1039
-						'dtstart' => $dtstart,
1040
-						'dtend' => $dtend,
1041
-						'dtabbr' => $dtabbr
1042
-						],
1043
-						[
1044
-							'sanitize' => false
1045
-						]
1046
-					);
1047
-				} // Le lundi 20 fevrier de 18h00 a 20h00
1048
-				else {
1049
-					$s = spip_ucfirst(_T(
1050
-						'date_fmt_jour_heure_debut_fin',
1051
-						['jour' => $s, 'heure_debut' => $hd, 'heure_fin' => $hf]
1052
-					));
1053
-				}
1054
-			}
1055
-		} else {
1056
-			$s = $dtabbr && $dtstart
1057
-				? $dtstart . spip_ucfirst($s) . $dtabbr
1058
-				: spip_ucfirst($s);
1059
-		}
1060
-	} else {
1061
-		if (date('Y-m', $date_debut) === date('Y-m', $date_fin)) { // meme annee et mois, jours differents
1062
-			$date_debut = $h
1063
-				? affdate_jourcourt($d, date('Y', $date_fin))
1064
-				: jour($d);
1065
-			$date_fin = $affdate($f);
1066
-			if ($jour) {
1067
-				$nomjour_debut = nom_jour($d, $abbr);
1068
-				$date_debut = _T('date_fmt_jour', ['nomjour' => $nomjour_debut, 'jour' => $date_debut]);
1069
-				$nomjour_fin = nom_jour($f, $abbr);
1070
-				$date_fin = _T('date_fmt_jour', ['nomjour' => $nomjour_fin, 'jour' => $date_fin]);
1071
-			}
1072
-			if ($h) {
1073
-				$date_debut = _T('date_fmt_jour_heure', ['jour' => $date_debut, 'heure' => $hd]);
1074
-				$date_fin = _T('date_fmt_jour_heure', ['jour' => $date_fin, 'heure' => $hf]);
1075
-			}
1076
-			$date_debut = $dtstart . $date_debut . $dtabbr;
1077
-			$date_fin = $dtend . $date_fin . $dtabbr;
1078
-
1079
-			$s = _T('date_fmt_periode', ['date_debut' => $date_debut, 'date_fin' => $date_fin]);
1080
-		} else {
1081
-			$date_debut = affdate_jourcourt($d, date('Y', $date_fin));
1082
-			$date_fin = $affdate($f);
1083
-			if ($jour) {
1084
-				$nomjour_debut = nom_jour($d, $abbr);
1085
-				$date_debut = _T('date_fmt_jour', ['nomjour' => $nomjour_debut, 'jour' => $date_debut]);
1086
-				$nomjour_fin = nom_jour($f, $abbr);
1087
-				$date_fin = _T('date_fmt_jour', ['nomjour' => $nomjour_fin, 'jour' => $date_fin]);
1088
-			}
1089
-			if ($h) {
1090
-				$date_debut = _T('date_fmt_jour_heure', ['jour' => $date_debut, 'heure' => $hd]);
1091
-				$date_fin = _T('date_fmt_jour_heure', ['jour' => $date_fin, 'heure' => $hf]);
1092
-			}
1093
-
1094
-			$date_debut = $dtstart . $date_debut . $dtabbr;
1095
-			$date_fin = $dtend . $date_fin . $dtabbr;
1096
-			$s = _T('date_fmt_periode', ['date_debut' => $date_debut, 'date_fin' => $date_fin]);
1097
-		}
1098
-	}
1099
-
1100
-	return $s;
994
+    $abbr = $jour = '';
995
+    $affdate = 'affdate_jourcourt';
996
+    if (str_contains($forme, 'abbr')) {
997
+        $abbr = 'abbr';
998
+    }
999
+    if (str_contains($forme, 'annee')) {
1000
+        $affdate = 'affdate';
1001
+    }
1002
+    if (str_contains($forme, 'jour')) {
1003
+        $jour = 'jour';
1004
+    }
1005
+
1006
+    $dtstart = $dtend = $dtabbr = '';
1007
+    if (str_contains($forme, 'hcal')) {
1008
+        $dtstart = "<abbr class='dtstart' title='" . date_iso($date_debut) . "'>";
1009
+        $dtend = "<abbr class='dtend' title='" . date_iso($date_fin) . "'>";
1010
+        $dtabbr = '</abbr>';
1011
+    }
1012
+
1013
+    $date_debut = strtotime($date_debut);
1014
+    $date_fin = strtotime($date_fin);
1015
+    $d = date('Y-m-d', $date_debut);
1016
+    $f = date('Y-m-d', $date_fin);
1017
+    $h = ($horaire === 'oui' || $horaire === true);
1018
+    $hd = _T('date_fmt_heures_minutes_court', ['h' => date('H', $date_debut), 'm' => date('i', $date_debut)]);
1019
+    $hf = _T('date_fmt_heures_minutes_court', ['h' => date('H', $date_fin), 'm' => date('i', $date_fin)]);
1020
+
1021
+    if ($d === $f) { // meme jour
1022
+        $nomjour = nom_jour($d, $abbr);
1023
+        $s = $affdate($d);
1024
+        $s = _T('date_fmt_jour', ['nomjour' => $nomjour, 'jour' => $s]);
1025
+        if ($h) {
1026
+            if ($hd === $hf) {
1027
+                // Lundi 20 fevrier a 18h25
1028
+                $s = spip_ucfirst(_T('date_fmt_jour_heure', ['jour' => $s, 'heure' => $hd]));
1029
+                $s = "$dtstart$s$dtabbr";
1030
+            } else {
1031
+                // Le <abbr...>lundi 20 fevrier de 18h00</abbr> a <abbr...>20h00</abbr>
1032
+                if ($dtabbr && $dtstart && $dtend) {
1033
+                    $s = _T(
1034
+                        'date_fmt_jour_heure_debut_fin_abbr',
1035
+                        [
1036
+                        'jour' => spip_ucfirst($s),
1037
+                        'heure_debut' => $hd,
1038
+                        'heure_fin' => $hf,
1039
+                        'dtstart' => $dtstart,
1040
+                        'dtend' => $dtend,
1041
+                        'dtabbr' => $dtabbr
1042
+                        ],
1043
+                        [
1044
+                            'sanitize' => false
1045
+                        ]
1046
+                    );
1047
+                } // Le lundi 20 fevrier de 18h00 a 20h00
1048
+                else {
1049
+                    $s = spip_ucfirst(_T(
1050
+                        'date_fmt_jour_heure_debut_fin',
1051
+                        ['jour' => $s, 'heure_debut' => $hd, 'heure_fin' => $hf]
1052
+                    ));
1053
+                }
1054
+            }
1055
+        } else {
1056
+            $s = $dtabbr && $dtstart
1057
+                ? $dtstart . spip_ucfirst($s) . $dtabbr
1058
+                : spip_ucfirst($s);
1059
+        }
1060
+    } else {
1061
+        if (date('Y-m', $date_debut) === date('Y-m', $date_fin)) { // meme annee et mois, jours differents
1062
+            $date_debut = $h
1063
+                ? affdate_jourcourt($d, date('Y', $date_fin))
1064
+                : jour($d);
1065
+            $date_fin = $affdate($f);
1066
+            if ($jour) {
1067
+                $nomjour_debut = nom_jour($d, $abbr);
1068
+                $date_debut = _T('date_fmt_jour', ['nomjour' => $nomjour_debut, 'jour' => $date_debut]);
1069
+                $nomjour_fin = nom_jour($f, $abbr);
1070
+                $date_fin = _T('date_fmt_jour', ['nomjour' => $nomjour_fin, 'jour' => $date_fin]);
1071
+            }
1072
+            if ($h) {
1073
+                $date_debut = _T('date_fmt_jour_heure', ['jour' => $date_debut, 'heure' => $hd]);
1074
+                $date_fin = _T('date_fmt_jour_heure', ['jour' => $date_fin, 'heure' => $hf]);
1075
+            }
1076
+            $date_debut = $dtstart . $date_debut . $dtabbr;
1077
+            $date_fin = $dtend . $date_fin . $dtabbr;
1078
+
1079
+            $s = _T('date_fmt_periode', ['date_debut' => $date_debut, 'date_fin' => $date_fin]);
1080
+        } else {
1081
+            $date_debut = affdate_jourcourt($d, date('Y', $date_fin));
1082
+            $date_fin = $affdate($f);
1083
+            if ($jour) {
1084
+                $nomjour_debut = nom_jour($d, $abbr);
1085
+                $date_debut = _T('date_fmt_jour', ['nomjour' => $nomjour_debut, 'jour' => $date_debut]);
1086
+                $nomjour_fin = nom_jour($f, $abbr);
1087
+                $date_fin = _T('date_fmt_jour', ['nomjour' => $nomjour_fin, 'jour' => $date_fin]);
1088
+            }
1089
+            if ($h) {
1090
+                $date_debut = _T('date_fmt_jour_heure', ['jour' => $date_debut, 'heure' => $hd]);
1091
+                $date_fin = _T('date_fmt_jour_heure', ['jour' => $date_fin, 'heure' => $hf]);
1092
+            }
1093
+
1094
+            $date_debut = $dtstart . $date_debut . $dtabbr;
1095
+            $date_fin = $dtend . $date_fin . $dtabbr;
1096
+            $s = _T('date_fmt_periode', ['date_debut' => $date_debut, 'date_fin' => $date_fin]);
1097
+        }
1098
+    }
1099
+
1100
+    return $s;
1101 1101
 }
1102 1102
 
1103 1103
 /**
@@ -1118,10 +1118,10 @@  discard block
 block discarded – undo
1118 1118
  *     Date au format ical
1119 1119
  **/
1120 1120
 function date_ical($date, $addminutes = 0): string {
1121
-	[$heures, $minutes, $secondes] = recup_heure($date);
1122
-	[$annee, $mois, $jour] = recup_date($date);
1121
+    [$heures, $minutes, $secondes] = recup_heure($date);
1122
+    [$annee, $mois, $jour] = recup_date($date);
1123 1123
 
1124
-	return gmdate('Ymd\THis\Z', mktime($heures, $minutes + $addminutes, $secondes, $mois, $jour, $annee));
1124
+    return gmdate('Ymd\THis\Z', mktime($heures, $minutes + $addminutes, $secondes, $mois, $jour, $annee));
1125 1125
 }
1126 1126
 
1127 1127
 
@@ -1145,14 +1145,14 @@  discard block
 block discarded – undo
1145 1145
  *     La date formatée
1146 1146
  **/
1147 1147
 function date_iso($date_heure): string {
1148
-	$date = recup_date($date_heure);
1149
-	$annee = $date[0] ?? null;
1150
-	$mois = $date[1] ?? null;
1151
-	$jour = $date[2] ?? null;
1152
-	[$heures, $minutes, $secondes] = recup_heure($date_heure);
1153
-	$time = @mktime($heures, $minutes, $secondes, $mois, $jour, $annee);
1154
-
1155
-	return gmdate('Y-m-d\TH:i:s\Z', $time);
1148
+    $date = recup_date($date_heure);
1149
+    $annee = $date[0] ?? null;
1150
+    $mois = $date[1] ?? null;
1151
+    $jour = $date[2] ?? null;
1152
+    [$heures, $minutes, $secondes] = recup_heure($date_heure);
1153
+    $time = @mktime($heures, $minutes, $secondes, $mois, $jour, $annee);
1154
+
1155
+    return gmdate('Y-m-d\TH:i:s\Z', $time);
1156 1156
 }
1157 1157
 
1158 1158
 /**
@@ -1175,11 +1175,11 @@  discard block
 block discarded – undo
1175 1175
  *     La date formatée
1176 1176
  **/
1177 1177
 function date_822($date_heure): string {
1178
-	[$annee, $mois, $jour] = recup_date($date_heure);
1179
-	[$heures, $minutes, $secondes] = recup_heure($date_heure);
1180
-	$time = mktime($heures, $minutes, $secondes, $mois, $jour, $annee);
1178
+    [$annee, $mois, $jour] = recup_date($date_heure);
1179
+    [$heures, $minutes, $secondes] = recup_heure($date_heure);
1180
+    $time = mktime($heures, $minutes, $secondes, $mois, $jour, $annee);
1181 1181
 
1182
-	return date('r', $time);
1182
+    return date('r', $time);
1183 1183
 }
1184 1184
 
1185 1185
 /**
@@ -1195,11 +1195,11 @@  discard block
 block discarded – undo
1195 1195
  *     Date au format `Ymd`
1196 1196
  **/
1197 1197
 function date_anneemoisjour($d): string {
1198
-	if (!$d) {
1199
-		$d = date('Y-m-d');
1200
-	}
1198
+    if (!$d) {
1199
+        $d = date('Y-m-d');
1200
+    }
1201 1201
 
1202
-	return substr($d, 0, 4) . substr($d, 5, 2) . substr($d, 8, 2);
1202
+    return substr($d, 0, 4) . substr($d, 5, 2) . substr($d, 8, 2);
1203 1203
 }
1204 1204
 
1205 1205
 /**
@@ -1215,11 +1215,11 @@  discard block
 block discarded – undo
1215 1215
  *     Date au format `Ym`
1216 1216
  **/
1217 1217
 function date_anneemois($d): string {
1218
-	if (!$d) {
1219
-		$d = date('Y-m-d');
1220
-	}
1218
+    if (!$d) {
1219
+        $d = date('Y-m-d');
1220
+    }
1221 1221
 
1222
-	return substr($d, 0, 4) . substr($d, 5, 2);
1222
+    return substr($d, 0, 4) . substr($d, 5, 2);
1223 1223
 }
1224 1224
 
1225 1225
 /**
@@ -1235,13 +1235,13 @@  discard block
 block discarded – undo
1235 1235
  *     Date au lundi de la même semaine au format `Ymd`
1236 1236
  **/
1237 1237
 function date_debut_semaine($annee, $mois, $jour): string {
1238
-	$w_day = date('w', mktime(0, 0, 0, $mois, $jour, $annee));
1239
-	if ($w_day == 0) {
1240
-		$w_day = 7;
1241
-	} // Gaffe: le dimanche est zero
1242
-	$debut = $jour - $w_day + 1;
1238
+    $w_day = date('w', mktime(0, 0, 0, $mois, $jour, $annee));
1239
+    if ($w_day == 0) {
1240
+        $w_day = 7;
1241
+    } // Gaffe: le dimanche est zero
1242
+    $debut = $jour - $w_day + 1;
1243 1243
 
1244
-	return date('Ymd', mktime(0, 0, 0, $mois, $debut, $annee));
1244
+    return date('Ymd', mktime(0, 0, 0, $mois, $debut, $annee));
1245 1245
 }
1246 1246
 
1247 1247
 /**
@@ -1257,11 +1257,11 @@  discard block
 block discarded – undo
1257 1257
  *     Date au dimanche de la même semaine au format `Ymd`
1258 1258
  **/
1259 1259
 function date_fin_semaine($annee, $mois, $jour): string {
1260
-	$w_day = date('w', mktime(0, 0, 0, $mois, $jour, $annee));
1261
-	if ($w_day == 0) {
1262
-		$w_day = 7;
1263
-	} // Gaffe: le dimanche est zero
1264
-	$debut = $jour - $w_day + 1;
1260
+    $w_day = date('w', mktime(0, 0, 0, $mois, $jour, $annee));
1261
+    if ($w_day == 0) {
1262
+        $w_day = 7;
1263
+    } // Gaffe: le dimanche est zero
1264
+    $debut = $jour - $w_day + 1;
1265 1265
 
1266
-	return date('Ymd', mktime(0, 0, 0, $mois, $debut + 6, $annee));
1266
+    return date('Ymd', mktime(0, 0, 0, $mois, $debut + 6, $annee));
1267 1267
 }
Please login to merge, or discard this patch.
ecrire/inc/cvt_multietapes.php 1 patch
Indentation   +156 added lines, -156 removed lines patch added patch discarded remove patch
@@ -65,7 +65,7 @@  discard block
 block discarded – undo
65 65
  */
66 66
 
67 67
 if (!defined('_ECRIRE_INC_VERSION')) {
68
-	return;
68
+    return;
69 69
 }
70 70
 
71 71
 /**
@@ -76,46 +76,46 @@  discard block
 block discarded – undo
76 76
  * @return array|false
77 77
  */
78 78
 function cvtmulti_recuperer_post_precedents($form) {
79
-	include_spip('inc/filtres');
80
-	if (
81
-		$form
82
-		&& ($c = _request('cvtm_prev_post'))
83
-		&& ($c = decoder_contexte_ajax($c, $form))
84
-	) {
85
-		#var_dump($c);
79
+    include_spip('inc/filtres');
80
+    if (
81
+        $form
82
+        && ($c = _request('cvtm_prev_post'))
83
+        && ($c = decoder_contexte_ajax($c, $form))
84
+    ) {
85
+        #var_dump($c);
86 86
 
87
-		# reinjecter dans la bonne variable pour permettre de retrouver
88
-		# toutes les saisies dans un seul tableau
89
-		if ($_SERVER['REQUEST_METHOD'] == 'POST') {
90
-			$store = &$_POST;
91
-		} else {
92
-			$store = &$_GET;
93
-		}
87
+        # reinjecter dans la bonne variable pour permettre de retrouver
88
+        # toutes les saisies dans un seul tableau
89
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
90
+            $store = &$_POST;
91
+        } else {
92
+            $store = &$_GET;
93
+        }
94 94
 
95
-		foreach ($c as $k => $v) { // on ecrase pas si saisi a nouveau !
96
-		if (!isset($store[$k])) {
97
-				$_REQUEST[$k] = $store[$k] = $v;
98
-		} // mais si tableau des deux cotes, on merge avec priorite a la derniere saisie
99
-			elseif (
100
-				is_array($store[$k])
101
-				&& is_array($v)
102
-				&& ($z = array_keys($v))
103
-				&& !is_numeric(reset($z))
104
-				&& ($z = array_keys($store[$k]))
105
-				&& !is_numeric(reset($z))
106
-			) {
107
-				$_REQUEST[$k] = $store[$k] = array_merge($v, $store[$k]);
108
-			}
109
-		}
95
+        foreach ($c as $k => $v) { // on ecrase pas si saisi a nouveau !
96
+        if (!isset($store[$k])) {
97
+                $_REQUEST[$k] = $store[$k] = $v;
98
+        } // mais si tableau des deux cotes, on merge avec priorite a la derniere saisie
99
+            elseif (
100
+                is_array($store[$k])
101
+                && is_array($v)
102
+                && ($z = array_keys($v))
103
+                && !is_numeric(reset($z))
104
+                && ($z = array_keys($store[$k]))
105
+                && !is_numeric(reset($z))
106
+            ) {
107
+                $_REQUEST[$k] = $store[$k] = array_merge($v, $store[$k]);
108
+            }
109
+        }
110 110
 
111
-		// vider pour eviter un second appel a verifier_n
112
-		// en cas de double implementation (unipotence)
113
-		set_request('cvtm_prev_post');
111
+        // vider pour eviter un second appel a verifier_n
112
+        // en cas de double implementation (unipotence)
113
+        set_request('cvtm_prev_post');
114 114
 
115
-		return [$c['_etape'], $c['_etapes']];
116
-	}
115
+        return [$c['_etape'], $c['_etapes']];
116
+    }
117 117
 
118
-	return false;
118
+    return false;
119 119
 }
120 120
 
121 121
 /**
@@ -128,28 +128,28 @@  discard block
 block discarded – undo
128 128
  * @return array
129 129
  */
130 130
 function cvtmulti_sauver_post($form, $je_suis_poste, &$valeurs) {
131
-	if (!isset($valeurs['_cvtm_prev_post'])) {
132
-		$post = ['_etape' => $valeurs['_etape'], '_etapes' => $valeurs['_etapes']];
133
-		foreach (array_keys($valeurs) as $champ) {
134
-			if (
135
-				!str_starts_with($champ, '_')
136
-				&& ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']))
137
-				&& ($v = _request($champ)) !== null
138
-			) {
139
-				$post[$champ] = $v;
140
-			}
141
-		}
142
-		include_spip('inc/filtres');
143
-		$c = encoder_contexte_ajax($post, $form);
144
-		if (!isset($valeurs['_hidden'])) {
145
-			$valeurs['_hidden'] = '';
146
-		}
147
-		$valeurs['_hidden'] .= "<input type='hidden' name='cvtm_prev_post' value='$c' />";
148
-		// marquer comme fait, pour eviter double encodage (unipotence)
149
-		$valeurs['_cvtm_prev_post'] = true;
150
-	}
131
+    if (!isset($valeurs['_cvtm_prev_post'])) {
132
+        $post = ['_etape' => $valeurs['_etape'], '_etapes' => $valeurs['_etapes']];
133
+        foreach (array_keys($valeurs) as $champ) {
134
+            if (
135
+                !str_starts_with($champ, '_')
136
+                && ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']))
137
+                && ($v = _request($champ)) !== null
138
+            ) {
139
+                $post[$champ] = $v;
140
+            }
141
+        }
142
+        include_spip('inc/filtres');
143
+        $c = encoder_contexte_ajax($post, $form);
144
+        if (!isset($valeurs['_hidden'])) {
145
+            $valeurs['_hidden'] = '';
146
+        }
147
+        $valeurs['_hidden'] .= "<input type='hidden' name='cvtm_prev_post' value='$c' />";
148
+        // marquer comme fait, pour eviter double encodage (unipotence)
149
+        $valeurs['_cvtm_prev_post'] = true;
150
+    }
151 151
 
152
-	return $valeurs;
152
+    return $valeurs;
153 153
 }
154 154
 
155 155
 /**
@@ -159,19 +159,19 @@  discard block
 block discarded – undo
159 159
  * @return array
160 160
  */
161 161
 function cvtmulti_formulaire_charger_etapes($args, $valeurs) {
162
-	if (!isset($valeurs['_etape'])) {
163
-		$form = $args['form'];
164
-		$je_suis_poste = $args['je_suis_poste'];
165
-		$nb_etapes = $valeurs['_etapes'];
166
-		$etape = _request('_etape');
167
-		$etape = min(max($etape, 1), $nb_etapes);
168
-		set_request('_etape', $etape);
169
-		$valeurs['_etape'] = $etape;
162
+    if (!isset($valeurs['_etape'])) {
163
+        $form = $args['form'];
164
+        $je_suis_poste = $args['je_suis_poste'];
165
+        $nb_etapes = $valeurs['_etapes'];
166
+        $etape = _request('_etape');
167
+        $etape = min(max($etape, 1), $nb_etapes);
168
+        set_request('_etape', $etape);
169
+        $valeurs['_etape'] = $etape;
170 170
 
171
-		// sauver les posts de cette etape pour les avoir a la prochaine etape
172
-		$valeurs = cvtmulti_sauver_post($form, $je_suis_poste, $valeurs);
173
-	}
174
-	return $valeurs;
171
+        // sauver les posts de cette etape pour les avoir a la prochaine etape
172
+        $valeurs = cvtmulti_sauver_post($form, $je_suis_poste, $valeurs);
173
+    }
174
+    return $valeurs;
175 175
 }
176 176
 
177 177
 /**
@@ -182,87 +182,87 @@  discard block
 block discarded – undo
182 182
  * @return array
183 183
  */
184 184
 function cvtmulti_formulaire_verifier_etapes($args, $erreurs) {
185
-	#var_dump('Pipe verifier');
185
+    #var_dump('Pipe verifier');
186 186
 
187
-	if (
188
-		($form = $args['form'])
189
-		&& ($e = cvtmulti_recuperer_post_precedents($form)) !== false
190
-	) {
191
-		// recuperer l'etape saisie et le nombre d'etapes total
192
-		[$etape, $etapes] = $e;
193
-		$etape_demandee = (int) _request('aller_a_etape'); // possibilite de poster un entier dans aller_a_etape
187
+    if (
188
+        ($form = $args['form'])
189
+        && ($e = cvtmulti_recuperer_post_precedents($form)) !== false
190
+    ) {
191
+        // recuperer l'etape saisie et le nombre d'etapes total
192
+        [$etape, $etapes] = $e;
193
+        $etape_demandee = (int) _request('aller_a_etape'); // possibilite de poster un entier dans aller_a_etape
194 194
 
195
-		$args['etape_saisie'] = $etape;
196
-		$args['etapes'] = $etapes;
197
-		// lancer les verifs pour chaque etape deja saisie de 1 a $etape
198
-		$erreurs_etapes = [];
199
-		$derniere_etape_ok = 0;
200
-		$e = 0;
201
-		while ($e < max($etape, $etape_demandee - 1) && $e < $etapes) {
202
-			$e++;
203
-			$erreurs_etapes[$e] = [];
204
-			if ($verifier = charger_fonction("verifier_$e", "formulaires/$form/", true)) {
205
-				$erreurs_etapes[$e] = $verifier(...$args['args']);
206
-			} elseif ($verifier = charger_fonction('verifier_etape', "formulaires/$form/", true)) {
207
-				$a = $args['args'];
208
-				array_unshift($a, $e);
209
-				$erreurs_etapes[$e] = $verifier(...$a);
210
-			}
211
-			// et on appelle un pipeline dedie aux etapes, plus easy
212
-			$args['etape'] = $e;
213
-			$args['etape_demandee'] = $etape_demandee;
214
-			$erreurs_etapes[$e] = pipeline(
215
-				'formulaire_verifier_etape',
216
-				[
217
-					'args' => $args,
218
-					'data' => $erreurs_etapes[$e]
219
-				]
220
-			);
195
+        $args['etape_saisie'] = $etape;
196
+        $args['etapes'] = $etapes;
197
+        // lancer les verifs pour chaque etape deja saisie de 1 a $etape
198
+        $erreurs_etapes = [];
199
+        $derniere_etape_ok = 0;
200
+        $e = 0;
201
+        while ($e < max($etape, $etape_demandee - 1) && $e < $etapes) {
202
+            $e++;
203
+            $erreurs_etapes[$e] = [];
204
+            if ($verifier = charger_fonction("verifier_$e", "formulaires/$form/", true)) {
205
+                $erreurs_etapes[$e] = $verifier(...$args['args']);
206
+            } elseif ($verifier = charger_fonction('verifier_etape', "formulaires/$form/", true)) {
207
+                $a = $args['args'];
208
+                array_unshift($a, $e);
209
+                $erreurs_etapes[$e] = $verifier(...$a);
210
+            }
211
+            // et on appelle un pipeline dedie aux etapes, plus easy
212
+            $args['etape'] = $e;
213
+            $args['etape_demandee'] = $etape_demandee;
214
+            $erreurs_etapes[$e] = pipeline(
215
+                'formulaire_verifier_etape',
216
+                [
217
+                    'args' => $args,
218
+                    'data' => $erreurs_etapes[$e]
219
+                ]
220
+            );
221 221
 
222
-			if ($derniere_etape_ok === $e - 1 && !(is_countable($erreurs_etapes[$e]) ? count($erreurs_etapes[$e]) : 0)) {
223
-				$derniere_etape_ok = $e;
224
-			}
225
-			// possibilite de poster dans _retour_etape_x ou aller_a_etape
226
-			if (!is_null(_request("_retour_etape_$e"))) {
227
-				$etape_demandee = $e;
228
-			}
229
-			// Il se peut que les verifications ait décidé de faire sauter des étapes
230
-			if ($aller_a_etape = (int) _request('aller_a_etape')) {
231
-				$etape_demandee = $aller_a_etape; // possibilite de poster un entier dans aller_a_etape
232
-			}
233
-		}
222
+            if ($derniere_etape_ok === $e - 1 && !(is_countable($erreurs_etapes[$e]) ? count($erreurs_etapes[$e]) : 0)) {
223
+                $derniere_etape_ok = $e;
224
+            }
225
+            // possibilite de poster dans _retour_etape_x ou aller_a_etape
226
+            if (!is_null(_request("_retour_etape_$e"))) {
227
+                $etape_demandee = $e;
228
+            }
229
+            // Il se peut que les verifications ait décidé de faire sauter des étapes
230
+            if ($aller_a_etape = (int) _request('aller_a_etape')) {
231
+                $etape_demandee = $aller_a_etape; // possibilite de poster un entier dans aller_a_etape
232
+            }
233
+        }
234 234
 
235 235
 
236
-		// si la derniere etape OK etait la derniere
237
-		// on renvoie le flux inchange et ca declenche traiter
238
-		if (
239
-			$derniere_etape_ok == $etapes
240
-			&& (!$etape_demandee || $etape_demandee >= $etapes)
241
-		) {
242
-			return $erreurs;
243
-		} else {
244
-			$etape = $derniere_etape_ok + 1;
245
-			if ($etape_demandee > 0 && $etape_demandee < $etape) {
246
-				$etape = $etape_demandee;
247
-			}
248
-			$etape = min($etape, $etapes);
249
-			#var_dump("prochaine etape $etape");
250
-			// retourner les erreurs de l'etape ciblee
251
-			$erreurs = $erreurs_etapes[$etape] ?? [];
252
-			// Ne pas se tromper dans le texte du message d'erreur : la clé '_etapes' n'est pas une erreur !
253
-			if ($erreurs) {
254
-				if (!isset($erreurs['message_erreur'])) {
255
-					$erreurs['message_erreur'] = singulier_ou_pluriel(is_countable($erreurs) ? count($erreurs) : 0, 'avis_1_erreur_saisie', 'avis_nb_erreurs_saisie');
256
-				}
257
-			} else {
258
-				$erreurs['message_erreur'] = '';
259
-			}
260
-			$erreurs['_etapes'] = "etape suivante $etape";
261
-			set_request('_etape', $etape);
262
-		}
263
-	}
236
+        // si la derniere etape OK etait la derniere
237
+        // on renvoie le flux inchange et ca declenche traiter
238
+        if (
239
+            $derniere_etape_ok == $etapes
240
+            && (!$etape_demandee || $etape_demandee >= $etapes)
241
+        ) {
242
+            return $erreurs;
243
+        } else {
244
+            $etape = $derniere_etape_ok + 1;
245
+            if ($etape_demandee > 0 && $etape_demandee < $etape) {
246
+                $etape = $etape_demandee;
247
+            }
248
+            $etape = min($etape, $etapes);
249
+            #var_dump("prochaine etape $etape");
250
+            // retourner les erreurs de l'etape ciblee
251
+            $erreurs = $erreurs_etapes[$etape] ?? [];
252
+            // Ne pas se tromper dans le texte du message d'erreur : la clé '_etapes' n'est pas une erreur !
253
+            if ($erreurs) {
254
+                if (!isset($erreurs['message_erreur'])) {
255
+                    $erreurs['message_erreur'] = singulier_ou_pluriel(is_countable($erreurs) ? count($erreurs) : 0, 'avis_1_erreur_saisie', 'avis_nb_erreurs_saisie');
256
+                }
257
+            } else {
258
+                $erreurs['message_erreur'] = '';
259
+            }
260
+            $erreurs['_etapes'] = "etape suivante $etape";
261
+            set_request('_etape', $etape);
262
+        }
263
+    }
264 264
 
265
-	return $erreurs;
265
+    return $erreurs;
266 266
 }
267 267
 
268 268
 /**
@@ -274,17 +274,17 @@  discard block
 block discarded – undo
274 274
  * @return array
275 275
  */
276 276
 function cvtmulti_styliser($flux) {
277
-	if (
278
-		str_starts_with((string) $flux['args']['fond'], 'formulaires/')
279
-		&& isset($flux['args']['contexte']['_etapes'])
280
-		&& isset($flux['args']['contexte']['_etape'])
281
-		&& ($e = $flux['args']['contexte']['_etape']) > 1
282
-		&& ($ext = $flux['args']['ext'])
283
-		&& ($f = $flux['data'])
284
-		&& file_exists($f . "_$e.$ext")
285
-	) {
286
-		$flux['data'] = $f . "_$e";
287
-	}
277
+    if (
278
+        str_starts_with((string) $flux['args']['fond'], 'formulaires/')
279
+        && isset($flux['args']['contexte']['_etapes'])
280
+        && isset($flux['args']['contexte']['_etape'])
281
+        && ($e = $flux['args']['contexte']['_etape']) > 1
282
+        && ($ext = $flux['args']['ext'])
283
+        && ($f = $flux['data'])
284
+        && file_exists($f . "_$e.$ext")
285
+    ) {
286
+        $flux['data'] = $f . "_$e";
287
+    }
288 288
 
289
-	return $flux;
289
+    return $flux;
290 290
 }
Please login to merge, or discard this patch.
ecrire/inc/exporter_csv.php 1 patch
Indentation   +119 added lines, -119 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
 /**
@@ -90,107 +90,107 @@  discard block
 block discarded – undo
90 90
  */
91 91
 function inc_exporter_csv_dist($titre, $resource, $options = []) {
92 92
 
93
-	// support ancienne syntaxe
94
-	// inc_exporter_csv_dist($titre, $resource, $delim = ', ', $entetes = null, $envoyer = true)
95
-	if (is_string($options)) {
96
-		$args = func_get_args();
97
-		$options = [];
98
-		foreach ([2 => 'delim', 3 => 'entetes', 4 => 'envoyer'] as $k => $option) {
99
-			if (!empty($args[$k])) {
100
-				$options[$option] = $args[$k];
101
-			}
102
-		}
103
-	}
104
-
105
-	$default_options = [
106
-		'fichier' => null, // par défaut = $titre
107
-		'extension' => null, // par défaut = choix auto
108
-		'delim' => ',',
109
-		'entetes' => null,
110
-		'envoyer' => true,
111
-		'charset' => null,
112
-		'callback' => null,
113
-	];
114
-	$options = array_merge($default_options, $options);
115
-
116
-	// Délimiteur
117
-	if ($options['delim'] == 'TAB') {
118
-		$options['delim'] = "\t";
119
-	}
120
-	if (!in_array($options['delim'], [',', ';', "\t"])) {
121
-		$options['delim'] = ',';
122
-	}
123
-
124
-	// Nom du fichier : celui indiqué dans les options, sinon le titre
125
-	// Normalisation : uniquement les caractères non spéciaux, tirets, underscore et point + remplacer espaces par underscores
126
-	$filename = $options['fichier'] ?? translitteration(textebrut(typo($titre)));
127
-	$filename = preg_replace([',[^\w\-_\.\s]+,', ',\s+,'], ['', '_'], trim((string) $filename));
128
-	$filename = rtrim($filename, '.');
129
-
130
-	// Extension : celle indiquée en option, sinon choisie selon le délimiteur
131
-	// Normalisation : uniquement les charactères non spéciaux
132
-	if (!empty($options['extension'])) {
133
-		$options['extension'] = preg_replace(',[^\w]+,', '', trim((string) $options['extension']));
134
-	}
135
-	$extension = $options['extension'] ?? ($options['delim'] === ',' ? 'csv' : 'xls');
136
-
137
-	// Fichier
138
-	$basename = "$filename.$extension";
139
-
140
-	// Charset : celui indiqué en option, sinon celui compatible excel si nécessaire, sinon celui du site
141
-	// Excel n'accepte pas l'utf-8 ni les entites html... on transcode tout ce qu'on peut
142
-	$charset_site = $GLOBALS['meta']['charset'];
143
-	$charset_excel = ($extension === 'xls' ? 'iso-8859-1' : null);
144
-	$charset = $options['charset'] ?? $charset_excel ?? $charset_site;
145
-	$importer_charset = (($charset === $charset_site) ? null : $charset);
146
-
147
-	$output = '';
148
-	$nb = 0;
149
-	if (!empty($options['entetes']) && is_array($options['entetes'])) {
150
-		$output = exporter_csv_ligne_numerotee($nb, $options['entetes'], $options['delim'], $importer_charset, $options['callback']);
151
-	}
152
-	// les donnees commencent toujours a la ligne 1, qu'il y ait ou non des entetes
153
-	$nb++;
154
-
155
-	if ($options['envoyer']) {
156
-		$disposition = ($options['envoyer'] === 'attachment' ? 'attachment' : 'inline');
157
-		header("Content-Type: text/comma-separated-values; charset=$charset");
158
-		header("Content-Disposition: $disposition; filename=$basename");
159
-
160
-		// Vider tous les tampons
161
-		$level = @ob_get_level();
162
-		while ($level--) {
163
-			@ob_end_flush();
164
-		}
165
-	}
166
-
167
-	// si envoyer=='attachment' on passe par un fichier temporaire
168
-	// sinon on ecrit directement sur stdout
169
-	if ($options['envoyer'] && $options['envoyer'] !== 'attachment') {
170
-		$fichier = 'php://output';
171
-	}
172
-	else {
173
-		$fichier = sous_repertoire(_DIR_CACHE, 'export') . $basename;
174
-	}
175
-
176
-	$fp = fopen($fichier, 'w');
177
-	$length = fwrite($fp, $output);
178
-
179
-	while ($row = is_array($resource) ? array_shift($resource) : sql_fetch($resource)) {
180
-		$output = exporter_csv_ligne_numerotee($nb, $row, $options['delim'], $importer_charset, $options['callback']);
181
-		$length += fwrite($fp, $output);
182
-		$nb++;
183
-	}
184
-	fclose($fp);
185
-
186
-	if ($options['envoyer']) {
187
-		if ($options['envoyer'] === 'attachment') {
188
-			header("Content-Length: $length");
189
-			readfile($fichier);
190
-		}
191
-		// si on a envoye inline, c'est deja tout bon
192
-		exit;
193
-	}
194
-
195
-	return $fichier;
93
+    // support ancienne syntaxe
94
+    // inc_exporter_csv_dist($titre, $resource, $delim = ', ', $entetes = null, $envoyer = true)
95
+    if (is_string($options)) {
96
+        $args = func_get_args();
97
+        $options = [];
98
+        foreach ([2 => 'delim', 3 => 'entetes', 4 => 'envoyer'] as $k => $option) {
99
+            if (!empty($args[$k])) {
100
+                $options[$option] = $args[$k];
101
+            }
102
+        }
103
+    }
104
+
105
+    $default_options = [
106
+        'fichier' => null, // par défaut = $titre
107
+        'extension' => null, // par défaut = choix auto
108
+        'delim' => ',',
109
+        'entetes' => null,
110
+        'envoyer' => true,
111
+        'charset' => null,
112
+        'callback' => null,
113
+    ];
114
+    $options = array_merge($default_options, $options);
115
+
116
+    // Délimiteur
117
+    if ($options['delim'] == 'TAB') {
118
+        $options['delim'] = "\t";
119
+    }
120
+    if (!in_array($options['delim'], [',', ';', "\t"])) {
121
+        $options['delim'] = ',';
122
+    }
123
+
124
+    // Nom du fichier : celui indiqué dans les options, sinon le titre
125
+    // Normalisation : uniquement les caractères non spéciaux, tirets, underscore et point + remplacer espaces par underscores
126
+    $filename = $options['fichier'] ?? translitteration(textebrut(typo($titre)));
127
+    $filename = preg_replace([',[^\w\-_\.\s]+,', ',\s+,'], ['', '_'], trim((string) $filename));
128
+    $filename = rtrim($filename, '.');
129
+
130
+    // Extension : celle indiquée en option, sinon choisie selon le délimiteur
131
+    // Normalisation : uniquement les charactères non spéciaux
132
+    if (!empty($options['extension'])) {
133
+        $options['extension'] = preg_replace(',[^\w]+,', '', trim((string) $options['extension']));
134
+    }
135
+    $extension = $options['extension'] ?? ($options['delim'] === ',' ? 'csv' : 'xls');
136
+
137
+    // Fichier
138
+    $basename = "$filename.$extension";
139
+
140
+    // Charset : celui indiqué en option, sinon celui compatible excel si nécessaire, sinon celui du site
141
+    // Excel n'accepte pas l'utf-8 ni les entites html... on transcode tout ce qu'on peut
142
+    $charset_site = $GLOBALS['meta']['charset'];
143
+    $charset_excel = ($extension === 'xls' ? 'iso-8859-1' : null);
144
+    $charset = $options['charset'] ?? $charset_excel ?? $charset_site;
145
+    $importer_charset = (($charset === $charset_site) ? null : $charset);
146
+
147
+    $output = '';
148
+    $nb = 0;
149
+    if (!empty($options['entetes']) && is_array($options['entetes'])) {
150
+        $output = exporter_csv_ligne_numerotee($nb, $options['entetes'], $options['delim'], $importer_charset, $options['callback']);
151
+    }
152
+    // les donnees commencent toujours a la ligne 1, qu'il y ait ou non des entetes
153
+    $nb++;
154
+
155
+    if ($options['envoyer']) {
156
+        $disposition = ($options['envoyer'] === 'attachment' ? 'attachment' : 'inline');
157
+        header("Content-Type: text/comma-separated-values; charset=$charset");
158
+        header("Content-Disposition: $disposition; filename=$basename");
159
+
160
+        // Vider tous les tampons
161
+        $level = @ob_get_level();
162
+        while ($level--) {
163
+            @ob_end_flush();
164
+        }
165
+    }
166
+
167
+    // si envoyer=='attachment' on passe par un fichier temporaire
168
+    // sinon on ecrit directement sur stdout
169
+    if ($options['envoyer'] && $options['envoyer'] !== 'attachment') {
170
+        $fichier = 'php://output';
171
+    }
172
+    else {
173
+        $fichier = sous_repertoire(_DIR_CACHE, 'export') . $basename;
174
+    }
175
+
176
+    $fp = fopen($fichier, 'w');
177
+    $length = fwrite($fp, $output);
178
+
179
+    while ($row = is_array($resource) ? array_shift($resource) : sql_fetch($resource)) {
180
+        $output = exporter_csv_ligne_numerotee($nb, $row, $options['delim'], $importer_charset, $options['callback']);
181
+        $length += fwrite($fp, $output);
182
+        $nb++;
183
+    }
184
+    fclose($fp);
185
+
186
+    if ($options['envoyer']) {
187
+        if ($options['envoyer'] === 'attachment') {
188
+            header("Content-Length: $length");
189
+            readfile($fichier);
190
+        }
191
+        // si on a envoye inline, c'est deja tout bon
192
+        exit;
193
+    }
194
+
195
+    return $fichier;
196 196
 }
Please login to merge, or discard this patch.
ecrire/inc/chercher_logo.php 1 patch
Indentation   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\Logos
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 
21 21
 /**
@@ -34,23 +34,23 @@  discard block
 block discarded – undo
34 34
  **/
35 35
 function inc_chercher_logo_dist(int $id, string $_id_objet, string $mode = 'on', bool $compat_old_logos = false): array {
36 36
 
37
-	$mode = preg_replace(',\W,', '', $mode);
38
-	if ($mode) {
39
-		// chercher dans la base
40
-		$mode_document = 'logo' . $mode;
41
-		$objet = objet_type($_id_objet);
42
-		$doc = sql_fetsel(
43
-			'D.*',
44
-			'spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document',
45
-			'D.mode=' . sql_quote($mode_document) . ' AND L.objet=' . sql_quote($objet) . ' AND id_objet=' . $id
46
-		);
47
-		if ($doc) {
48
-			include_spip('inc/documents');
49
-			$d = get_spip_doc($doc['fichier']);
50
-			return [$d, _DIR_IMG, basename($d), $doc['extension'], @filemtime($d), $doc];
51
-		}
52
-	}
37
+    $mode = preg_replace(',\W,', '', $mode);
38
+    if ($mode) {
39
+        // chercher dans la base
40
+        $mode_document = 'logo' . $mode;
41
+        $objet = objet_type($_id_objet);
42
+        $doc = sql_fetsel(
43
+            'D.*',
44
+            'spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document',
45
+            'D.mode=' . sql_quote($mode_document) . ' AND L.objet=' . sql_quote($objet) . ' AND id_objet=' . $id
46
+        );
47
+        if ($doc) {
48
+            include_spip('inc/documents');
49
+            $d = get_spip_doc($doc['fichier']);
50
+            return [$d, _DIR_IMG, basename($d), $doc['extension'], @filemtime($d), $doc];
51
+        }
52
+    }
53 53
 
54
-	# coherence de type pour servir comme filtre (formulaire_login)
55
-	return [];
54
+    # coherence de type pour servir comme filtre (formulaire_login)
55
+    return [];
56 56
 }
Please login to merge, or discard this patch.
prive/squelettes/contenu/job_queue_fonctions.php 1 patch
Indentation   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -1,24 +1,24 @@
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 if (!defined('_ECRIRE_INC_VERSION')) {
4
-	return;
4
+    return;
5 5
 }
6 6
 
7 7
 function job_queue_block_and_watch() {
8
-	// bloquer la queue sur ce hit
9
-	// pour avoir coherence entre l'affichage de la liste de jobs
10
-	// et les jobs en base en fin de hit
11
-	define('_DEBUG_BLOCK_QUEUE', true);
12
-	include_spip('inc/genie');
13
-	genie_queue_watch_dist();
8
+    // bloquer la queue sur ce hit
9
+    // pour avoir coherence entre l'affichage de la liste de jobs
10
+    // et les jobs en base en fin de hit
11
+    define('_DEBUG_BLOCK_QUEUE', true);
12
+    include_spip('inc/genie');
13
+    genie_queue_watch_dist();
14 14
 }
15 15
 
16 16
 /**
17 17
  * Prévisu d'un appel à une fonction avec ses arguments
18 18
  */
19 19
 function job_queue_display_call(string $function, string $args): string {
20
-	$args = unserialize($args);
21
-	$args = array_map(fn ($arg) => is_scalar($arg) ? $arg : get_debug_type($arg), $args);
20
+    $args = unserialize($args);
21
+    $args = array_map(fn ($arg) => is_scalar($arg) ? $arg : get_debug_type($arg), $args);
22 22
 
23
-	return sprintf('%s(%s)', $function, implode(', ', $args));
23
+    return sprintf('%s(%s)', $function, implode(', ', $args));
24 24
 }
Please login to merge, or discard this patch.