Completed
Push — master ( 8b5a3c...b0cbd6 )
by cam
01:56
created
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.
prive/formulaires/login.php 1 patch
Indentation   +247 added lines, -247 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  **/
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 include_spip('base/abstract_sql');
@@ -30,11 +30,11 @@  discard block
 block discarded – undo
30 30
  *     true si espace privé, false sinon.
31 31
  **/
32 32
 function is_url_prive($cible) {
33
-	include_spip('inc/filtres_mini');
34
-	$path = parse_url(tester_url_absolue($cible) ? $cible : url_absolue($cible));
35
-	$path = ($path['path'] ?? '');
33
+    include_spip('inc/filtres_mini');
34
+    $path = parse_url(tester_url_absolue($cible) ? $cible : url_absolue($cible));
35
+    $path = ($path['path'] ?? '');
36 36
 
37
-	return str_starts_with(substr($path, -strlen((string) _DIR_RESTREINT_ABS)), (string) _DIR_RESTREINT_ABS);
37
+    return str_starts_with(substr($path, -strlen((string) _DIR_RESTREINT_ABS)), (string) _DIR_RESTREINT_ABS);
38 38
 }
39 39
 
40 40
 /**
@@ -59,110 +59,110 @@  discard block
 block discarded – undo
59 59
  *     Environnement du formulaire
60 60
  **/
61 61
 function formulaires_login_charger_dist($cible = '', $options = [], $deprecated = null) {
62
-	$erreur = _request('var_erreur');
63
-
64
-	if (!is_array($options)) {
65
-		$options = [
66
-			'login' => $options,
67
-			'prive' => $deprecated
68
-		];
69
-	}
70
-
71
-	$login = (empty($options['login']) ? '' : $options['login']);
72
-	$prive = (empty($options['prive']) ? null : $options['prive']);
73
-	// conserver le fonctionnement historique
74
-	if (!isset($options['autofocus'])) {
75
-		$options['autofocus'] = true;
76
-	}
77
-
78
-	if (!$login) {
79
-		$login = (string) _request('var_login');
80
-	}
81
-	// si on est deja identifie
82
-	if (!$login && isset($GLOBALS['visiteur_session']['email'])) {
83
-		$login = $GLOBALS['visiteur_session']['email'];
84
-	}
85
-	if (!$login && isset($GLOBALS['visiteur_session']['login'])) {
86
-		$login = $GLOBALS['visiteur_session']['login'];
87
-	}
88
-	// ou si on a un cookie admin
89
-	if (
90
-		!$login
91
-		&& isset($_COOKIE['spip_admin'])
92
-		&& preg_match(',^@(.*)$,', (string) $_COOKIE['spip_admin'], $regs)
93
-	) {
94
-		$login = $regs[1];
95
-	}
96
-
97
-	$lang = $GLOBALS['spip_lang'];
98
-	include_spip('inc/auth');
99
-	$row = auth_informer_login($login);
100
-
101
-	// retablir la langue de l'URL si forcee (on ignore la langue de l'auteur dans ce cas)
102
-	if (_request('lang') === $lang && $GLOBALS['spip_lang'] !== $lang) {
103
-		changer_langue($lang);
104
-	}
105
-
106
-	// Construire l'environnement du squelette
107
-	// Ne pas proposer de "rester connecte quelques jours"
108
-	// si la duree de l'alea est inferieure a 12 h (valeur par defaut)
109
-
110
-	$valeurs = [
111
-		'var_login' => $login,
112
-		'editable' => !$row,
113
-		'cnx' => $row['cnx'] ?? '0',
114
-		'auth_http' => login_auth_http(),
115
-		'rester_connecte' => ((_RENOUVELLE_ALEA < 12 * 3600) ? '' : ' '),
116
-		'_logo' => $row['logo'] ?? '',
117
-		'_alea_actuel' => $row['alea_actuel'] ?? '',
118
-		'_alea_futur' => $row['alea_futur'] ?? '',
119
-		'_pipeline' => 'affiche_formulaire_login', // faire passer le formulaire dans un pipe dedie pour les methodes auth
120
-		'_autofocus' => ($options['autofocus'] && $options['autofocus'] !== 'non') ? ' ' : '',
121
-	];
122
-
123
-	if ($erreur || !isset($GLOBALS['visiteur_session']['id_auteur']) || !$GLOBALS['visiteur_session']['id_auteur']) {
124
-		$valeurs['editable'] = true;
125
-	}
126
-
127
-	if (is_null($prive) ? is_url_prive($cible) : $prive) {
128
-		include_spip('inc/autoriser');
129
-		$loge = autoriser('ecrire');
130
-	} else {
131
-		$loge = (isset($GLOBALS['visiteur_session']['auth']) && $GLOBALS['visiteur_session']['auth'] != '');
132
-	}
133
-
134
-	// Si on est connecte, appeler traiter()
135
-	// et lancer la redirection si besoin
136
-	if (!$valeurs['editable'] && $loge && _request('formulaire_action') !== 'login') {
137
-		$traiter = charger_fonction('traiter', 'formulaires/login');
138
-		$res = $traiter($cible, $login, $prive);
139
-		$valeurs = array_merge($valeurs, $res);
140
-
141
-		if (isset($res['redirect']) && $res['redirect']) {
142
-			include_spip('inc/headers');
143
-			# preparer un lien pour quand redirige_formulaire ne fonctionne pas
144
-			$m = redirige_formulaire($res['redirect']);
145
-			$valeurs['_deja_loge'] = inserer_attribut(
146
-				'<a>' . _T('login_par_ici') . "</a>$m",
147
-				'href',
148
-				$res['redirect']
149
-			);
150
-		}
151
-	}
152
-	// en cas d'echec de cookie, inc_auth a renvoye vers le script de
153
-	// pose de cookie ; s'il n'est pas la, c'est echec cookie
154
-	// s'il est la, c'est probablement un bookmark sur bonjour=oui,
155
-	// et pas un echec cookie.
156
-	if ($erreur == 'cookie') {
157
-		$valeurs['echec_cookie'] = ' ';
158
-	} elseif ($erreur) {
159
-		// une erreur d'un SSO indique dans la redirection vers ici
160
-		// mais il faut se proteger de toute tentative d'injection malveilante
161
-		include_spip('inc/filtres');
162
-		$valeurs['message_erreur'] = textebrut($erreur);
163
-	}
164
-
165
-	return $valeurs;
62
+    $erreur = _request('var_erreur');
63
+
64
+    if (!is_array($options)) {
65
+        $options = [
66
+            'login' => $options,
67
+            'prive' => $deprecated
68
+        ];
69
+    }
70
+
71
+    $login = (empty($options['login']) ? '' : $options['login']);
72
+    $prive = (empty($options['prive']) ? null : $options['prive']);
73
+    // conserver le fonctionnement historique
74
+    if (!isset($options['autofocus'])) {
75
+        $options['autofocus'] = true;
76
+    }
77
+
78
+    if (!$login) {
79
+        $login = (string) _request('var_login');
80
+    }
81
+    // si on est deja identifie
82
+    if (!$login && isset($GLOBALS['visiteur_session']['email'])) {
83
+        $login = $GLOBALS['visiteur_session']['email'];
84
+    }
85
+    if (!$login && isset($GLOBALS['visiteur_session']['login'])) {
86
+        $login = $GLOBALS['visiteur_session']['login'];
87
+    }
88
+    // ou si on a un cookie admin
89
+    if (
90
+        !$login
91
+        && isset($_COOKIE['spip_admin'])
92
+        && preg_match(',^@(.*)$,', (string) $_COOKIE['spip_admin'], $regs)
93
+    ) {
94
+        $login = $regs[1];
95
+    }
96
+
97
+    $lang = $GLOBALS['spip_lang'];
98
+    include_spip('inc/auth');
99
+    $row = auth_informer_login($login);
100
+
101
+    // retablir la langue de l'URL si forcee (on ignore la langue de l'auteur dans ce cas)
102
+    if (_request('lang') === $lang && $GLOBALS['spip_lang'] !== $lang) {
103
+        changer_langue($lang);
104
+    }
105
+
106
+    // Construire l'environnement du squelette
107
+    // Ne pas proposer de "rester connecte quelques jours"
108
+    // si la duree de l'alea est inferieure a 12 h (valeur par defaut)
109
+
110
+    $valeurs = [
111
+        'var_login' => $login,
112
+        'editable' => !$row,
113
+        'cnx' => $row['cnx'] ?? '0',
114
+        'auth_http' => login_auth_http(),
115
+        'rester_connecte' => ((_RENOUVELLE_ALEA < 12 * 3600) ? '' : ' '),
116
+        '_logo' => $row['logo'] ?? '',
117
+        '_alea_actuel' => $row['alea_actuel'] ?? '',
118
+        '_alea_futur' => $row['alea_futur'] ?? '',
119
+        '_pipeline' => 'affiche_formulaire_login', // faire passer le formulaire dans un pipe dedie pour les methodes auth
120
+        '_autofocus' => ($options['autofocus'] && $options['autofocus'] !== 'non') ? ' ' : '',
121
+    ];
122
+
123
+    if ($erreur || !isset($GLOBALS['visiteur_session']['id_auteur']) || !$GLOBALS['visiteur_session']['id_auteur']) {
124
+        $valeurs['editable'] = true;
125
+    }
126
+
127
+    if (is_null($prive) ? is_url_prive($cible) : $prive) {
128
+        include_spip('inc/autoriser');
129
+        $loge = autoriser('ecrire');
130
+    } else {
131
+        $loge = (isset($GLOBALS['visiteur_session']['auth']) && $GLOBALS['visiteur_session']['auth'] != '');
132
+    }
133
+
134
+    // Si on est connecte, appeler traiter()
135
+    // et lancer la redirection si besoin
136
+    if (!$valeurs['editable'] && $loge && _request('formulaire_action') !== 'login') {
137
+        $traiter = charger_fonction('traiter', 'formulaires/login');
138
+        $res = $traiter($cible, $login, $prive);
139
+        $valeurs = array_merge($valeurs, $res);
140
+
141
+        if (isset($res['redirect']) && $res['redirect']) {
142
+            include_spip('inc/headers');
143
+            # preparer un lien pour quand redirige_formulaire ne fonctionne pas
144
+            $m = redirige_formulaire($res['redirect']);
145
+            $valeurs['_deja_loge'] = inserer_attribut(
146
+                '<a>' . _T('login_par_ici') . "</a>$m",
147
+                'href',
148
+                $res['redirect']
149
+            );
150
+        }
151
+    }
152
+    // en cas d'echec de cookie, inc_auth a renvoye vers le script de
153
+    // pose de cookie ; s'il n'est pas la, c'est echec cookie
154
+    // s'il est la, c'est probablement un bookmark sur bonjour=oui,
155
+    // et pas un echec cookie.
156
+    if ($erreur == 'cookie') {
157
+        $valeurs['echec_cookie'] = ' ';
158
+    } elseif ($erreur) {
159
+        // une erreur d'un SSO indique dans la redirection vers ici
160
+        // mais il faut se proteger de toute tentative d'injection malveilante
161
+        include_spip('inc/filtres');
162
+        $valeurs['message_erreur'] = textebrut($erreur);
163
+    }
164
+
165
+    return $valeurs;
166 166
 }
167 167
 
168 168
 
@@ -177,20 +177,20 @@  discard block
 block discarded – undo
177 177
  *     - chaîne vide sinon.
178 178
  **/
179 179
 function login_auth_http() {
180
-	if (!$GLOBALS['ignore_auth_http'] && _request('var_erreur') == 'cookie') {
181
-		include_spip('inc/session');
182
-		$cookie = lire_cookie_session(true);
183
-		if ($cookie !== 'test_echec_cookie'
184
-		  && (preg_match(',apache,', \PHP_SAPI) || preg_match(',^Apache.* PHP,', (string) $_SERVER['SERVER_SOFTWARE']))
185
-		  // Attention dans le cas 'intranet' la proposition de se loger
186
-		  // par auth_http peut conduire a l'echec.
187
-		  && !(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW']))
188
-		) {
189
-			return generer_url_action('cookie', '', false, true);
190
-		}
191
-	}
192
-
193
-	return '';
180
+    if (!$GLOBALS['ignore_auth_http'] && _request('var_erreur') == 'cookie') {
181
+        include_spip('inc/session');
182
+        $cookie = lire_cookie_session(true);
183
+        if ($cookie !== 'test_echec_cookie'
184
+          && (preg_match(',apache,', \PHP_SAPI) || preg_match(',^Apache.* PHP,', (string) $_SERVER['SERVER_SOFTWARE']))
185
+            // Attention dans le cas 'intranet' la proposition de se loger
186
+            // par auth_http peut conduire a l'echec.
187
+          && !(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW']))
188
+        ) {
189
+            return generer_url_action('cookie', '', false, true);
190
+        }
191
+    }
192
+
193
+    return '';
194 194
 }
195 195
 
196 196
 
@@ -216,64 +216,64 @@  discard block
 block discarded – undo
216 216
  **/
217 217
 function formulaires_login_verifier_dist($cible = '', $options = [], $deprecated = null) {
218 218
 
219
-	$erreurs = [];
220
-	if (!is_array($options)) {
221
-		$options = [
222
-			'login' => $options,
223
-			'prive' => $deprecated
224
-		];
225
-	}
226
-
227
-	$prive = (empty($options['prive']) ? null : $options['prive']);
228
-
229
-	$session_login = _request('var_login');
230
-	$session_password = _request('password');
231
-	$session_remember = _request('session_remember');
232
-
233
-	if (!$session_login) {
234
-		# pas de login saisi !
235
-		return ['var_login' => _T('info_obligatoire')];
236
-	}
237
-
238
-	// appeler auth_identifier_login qui va :
239
-	// - renvoyer un string si echec (message d'erreur)
240
-	// - un array decrivant l'auteur identifie si possible
241
-	// - rediriger vers un SSO qui renverra in fine sur action/auth qui finira l'authentification
242
-	include_spip('inc/auth');
243
-	$auteur = auth_identifier_login($session_login, $session_password);
244
-	// on arrive ici si on ne s'est pas identifie avec un SSO
245
-	if (!is_array($auteur)) {
246
-		$erreurs = [];
247
-		if (is_string($auteur) && strlen($auteur)) {
248
-			$erreurs['var_login'] = $auteur;
249
-		}
250
-		include_spip('inc/cookie');
251
-		spip_setcookie('spip_admin', '', time() - 3600, httponly: true);
252
-		if (strlen((string) $session_password)) {
253
-			$erreurs['password'] = _T('login_erreur_pass');
254
-		} else {
255
-			// sinon c'est un login en deux passe old style (ou js en panne)
256
-			// pas de message d'erreur
257
-			$erreurs['password'] = ' ';
258
-			$erreurs['message_erreur'] = '';
259
-		}
260
-
261
-		return $erreurs;
262
-	}
263
-	// on a ete authentifie, construire la session
264
-	// en gerant la duree demandee pour son cookie
265
-	if ($session_remember !== null) {
266
-		$auteur['cookie'] = $session_remember;
267
-	}
268
-	// si la connexion est refusee on renvoi un message erreur de mot de passe
269
-	// car en donnant plus de detail on renseignerait un assaillant sur l'existence d'un compte
270
-	if (auth_loger($auteur) === false) {
271
-		$erreurs['message_erreur'] = _T('login_erreur_pass');
272
-		return $erreurs;
273
-	}
274
-
275
-	return (is_null($prive) ? is_url_prive($cible) : $prive)
276
-		? login_autoriser() : [];
219
+    $erreurs = [];
220
+    if (!is_array($options)) {
221
+        $options = [
222
+            'login' => $options,
223
+            'prive' => $deprecated
224
+        ];
225
+    }
226
+
227
+    $prive = (empty($options['prive']) ? null : $options['prive']);
228
+
229
+    $session_login = _request('var_login');
230
+    $session_password = _request('password');
231
+    $session_remember = _request('session_remember');
232
+
233
+    if (!$session_login) {
234
+        # pas de login saisi !
235
+        return ['var_login' => _T('info_obligatoire')];
236
+    }
237
+
238
+    // appeler auth_identifier_login qui va :
239
+    // - renvoyer un string si echec (message d'erreur)
240
+    // - un array decrivant l'auteur identifie si possible
241
+    // - rediriger vers un SSO qui renverra in fine sur action/auth qui finira l'authentification
242
+    include_spip('inc/auth');
243
+    $auteur = auth_identifier_login($session_login, $session_password);
244
+    // on arrive ici si on ne s'est pas identifie avec un SSO
245
+    if (!is_array($auteur)) {
246
+        $erreurs = [];
247
+        if (is_string($auteur) && strlen($auteur)) {
248
+            $erreurs['var_login'] = $auteur;
249
+        }
250
+        include_spip('inc/cookie');
251
+        spip_setcookie('spip_admin', '', time() - 3600, httponly: true);
252
+        if (strlen((string) $session_password)) {
253
+            $erreurs['password'] = _T('login_erreur_pass');
254
+        } else {
255
+            // sinon c'est un login en deux passe old style (ou js en panne)
256
+            // pas de message d'erreur
257
+            $erreurs['password'] = ' ';
258
+            $erreurs['message_erreur'] = '';
259
+        }
260
+
261
+        return $erreurs;
262
+    }
263
+    // on a ete authentifie, construire la session
264
+    // en gerant la duree demandee pour son cookie
265
+    if ($session_remember !== null) {
266
+        $auteur['cookie'] = $session_remember;
267
+    }
268
+    // si la connexion est refusee on renvoi un message erreur de mot de passe
269
+    // car en donnant plus de detail on renseignerait un assaillant sur l'existence d'un compte
270
+    if (auth_loger($auteur) === false) {
271
+        $erreurs['message_erreur'] = _T('login_erreur_pass');
272
+        return $erreurs;
273
+    }
274
+
275
+    return (is_null($prive) ? is_url_prive($cible) : $prive)
276
+        ? login_autoriser() : [];
277 277
 }
278 278
 
279 279
 /**
@@ -288,21 +288,21 @@  discard block
 block discarded – undo
288 288
  *     - tableau vide sinon.
289 289
  **/
290 290
 function login_autoriser() {
291
-	include_spip('inc/autoriser');
292
-	if (!autoriser('ecrire')) {
293
-		$h = generer_url_action('logout', 'logout=prive&url=' . urlencode((string) self()));
294
-
295
-		return [
296
-			'message_erreur' => '<h1>'
297
-				. _T('avis_erreur_visiteur')
298
-				. '</h1><p>'
299
-				. _T('texte_erreur_visiteur')
300
-				. "</p><p class='retour'>[<a href='$h'>"
301
-				. _T('icone_deconnecter') . '</a>]</p>'
302
-		];
303
-	}
304
-
305
-	return [];
291
+    include_spip('inc/autoriser');
292
+    if (!autoriser('ecrire')) {
293
+        $h = generer_url_action('logout', 'logout=prive&url=' . urlencode((string) self()));
294
+
295
+        return [
296
+            'message_erreur' => '<h1>'
297
+                . _T('avis_erreur_visiteur')
298
+                . '</h1><p>'
299
+                . _T('texte_erreur_visiteur')
300
+                . "</p><p class='retour'>[<a href='$h'>"
301
+                . _T('icone_deconnecter') . '</a>]</p>'
302
+        ];
303
+    }
304
+
305
+    return [];
306 306
 }
307 307
 
308 308
 /**
@@ -323,55 +323,55 @@  discard block
 block discarded – undo
323 323
  *     Retours du traitement
324 324
  **/
325 325
 function formulaires_login_traiter_dist($cible = '', $options = [], $deprecated = null) {
326
-	$res = [];
327
-
328
-	if (!is_array($options)) {
329
-		$options = [
330
-			'login' => $options,
331
-			'prive' => $deprecated
332
-		];
333
-	}
334
-
335
-	$login = (empty($options['login']) ? '' : $options['login']);
336
-	$prive = (empty($options['prive']) ? null : $options['prive']);
337
-
338
-	// Si on se connecte dans l'espace prive,
339
-	// ajouter "bonjour" (repere a peu pres les cookies desactives)
340
-	if (is_null($prive) ? is_url_prive($cible) : $prive) {
341
-		$cible = parametre_url($cible, 'bonjour', 'oui', '&');
342
-	}
343
-	if ($cible == '@page_auteur') {
344
-		$cible = generer_objet_url($GLOBALS['auteur_session']['id_auteur'], 'auteur');
345
-	}
346
-
347
-	if ($cible) {
348
-		$cible = parametre_url($cible, 'var_login', '', '&');
349
-
350
-		// transformer la cible absolue en cible relative
351
-		// pour pas echouer quand la meta adresse_site est foireuse
352
-		if (strncmp((string) $cible, (string) ($u = url_de_base()), strlen((string) $u)) == 0) {
353
-			$cible = './' . substr((string) $cible, strlen((string) $u));
354
-		} elseif (tester_url_absolue($cible) && !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) {
355
-			// si c'est une url absolue, refuser la redirection
356
-			// sauf si cette securite est levee volontairement par le webmestre
357
-			$cible = '';
358
-		}
359
-	}
360
-
361
-	// Si on est connecte, envoyer vers la destination
362
-	if ($cible && $cible != self('&') && $cible != self()) {
363
-		$res['redirect'] = $cible;
364
-		$res['message_ok'] = inserer_attribut(
365
-			'<a>' . _T('login_par_ici') . '</a>',
366
-			'href',
367
-			$cible
368
-		);
369
-	}
370
-
371
-	// avant de rediriger il faut mettre a jour les sessions sur le disque si on a charge une session
372
-	if (function_exists('terminer_actualiser_sessions')) {
373
-		terminer_actualiser_sessions();
374
-	}
375
-
376
-	return $res;
326
+    $res = [];
327
+
328
+    if (!is_array($options)) {
329
+        $options = [
330
+            'login' => $options,
331
+            'prive' => $deprecated
332
+        ];
333
+    }
334
+
335
+    $login = (empty($options['login']) ? '' : $options['login']);
336
+    $prive = (empty($options['prive']) ? null : $options['prive']);
337
+
338
+    // Si on se connecte dans l'espace prive,
339
+    // ajouter "bonjour" (repere a peu pres les cookies desactives)
340
+    if (is_null($prive) ? is_url_prive($cible) : $prive) {
341
+        $cible = parametre_url($cible, 'bonjour', 'oui', '&');
342
+    }
343
+    if ($cible == '@page_auteur') {
344
+        $cible = generer_objet_url($GLOBALS['auteur_session']['id_auteur'], 'auteur');
345
+    }
346
+
347
+    if ($cible) {
348
+        $cible = parametre_url($cible, 'var_login', '', '&');
349
+
350
+        // transformer la cible absolue en cible relative
351
+        // pour pas echouer quand la meta adresse_site est foireuse
352
+        if (strncmp((string) $cible, (string) ($u = url_de_base()), strlen((string) $u)) == 0) {
353
+            $cible = './' . substr((string) $cible, strlen((string) $u));
354
+        } elseif (tester_url_absolue($cible) && !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) {
355
+            // si c'est une url absolue, refuser la redirection
356
+            // sauf si cette securite est levee volontairement par le webmestre
357
+            $cible = '';
358
+        }
359
+    }
360
+
361
+    // Si on est connecte, envoyer vers la destination
362
+    if ($cible && $cible != self('&') && $cible != self()) {
363
+        $res['redirect'] = $cible;
364
+        $res['message_ok'] = inserer_attribut(
365
+            '<a>' . _T('login_par_ici') . '</a>',
366
+            'href',
367
+            $cible
368
+        );
369
+    }
370
+
371
+    // avant de rediriger il faut mettre a jour les sessions sur le disque si on a charge une session
372
+    if (function_exists('terminer_actualiser_sessions')) {
373
+        terminer_actualiser_sessions();
374
+    }
375
+
376
+    return $res;
377 377
 }
Please login to merge, or discard this patch.
prive/formulaires/editer_liens.php 1 patch
Indentation   +433 added lines, -433 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\Formulaires
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 
21 21
 
@@ -35,25 +35,25 @@  discard block
 block discarded – undo
35 35
  *   ($table_source,$objet,$id_objet,$objet_lien)
36 36
  */
37 37
 function determine_source_lien_objet($a, $b, $c) {
38
-	$table_source = $objet_lien = $objet = $id_objet = null;
39
-	// auteurs, article, 23 :
40
-	// associer des auteurs à l'article 23, sur la table pivot spip_auteurs_liens
41
-	if (is_numeric($c) && !is_numeric($b)) {
42
-		$table_source = table_objet($a);
43
-		$objet_lien = objet_type($a);
44
-		$objet = objet_type($b);
45
-		$id_objet = $c;
46
-	}
47
-	// article, 23, auteurs
48
-	// associer des auteurs à l'article 23, sur la table pivot spip_articles_liens
49
-	if (is_numeric($b) && !is_numeric($c)) {
50
-		$table_source = table_objet($c);
51
-		$objet_lien = objet_type($a);
52
-		$objet = objet_type($a);
53
-		$id_objet = $b;
54
-	}
55
-
56
-	return [$table_source, $objet, $id_objet, $objet_lien];
38
+    $table_source = $objet_lien = $objet = $id_objet = null;
39
+    // auteurs, article, 23 :
40
+    // associer des auteurs à l'article 23, sur la table pivot spip_auteurs_liens
41
+    if (is_numeric($c) && !is_numeric($b)) {
42
+        $table_source = table_objet($a);
43
+        $objet_lien = objet_type($a);
44
+        $objet = objet_type($b);
45
+        $id_objet = $c;
46
+    }
47
+    // article, 23, auteurs
48
+    // associer des auteurs à l'article 23, sur la table pivot spip_articles_liens
49
+    if (is_numeric($b) && !is_numeric($c)) {
50
+        $table_source = table_objet($c);
51
+        $objet_lien = objet_type($a);
52
+        $objet = objet_type($a);
53
+        $id_objet = $b;
54
+    }
55
+
56
+    return [$table_source, $objet, $id_objet, $objet_lien];
57 57
 }
58 58
 
59 59
 /**
@@ -79,87 +79,87 @@  discard block
 block discarded – undo
79 79
  */
80 80
 function formulaires_editer_liens_charger_dist($a, $b, $c, $options = []) {
81 81
 
82
-	// compat avec ancienne signature ou le 4eme argument est $editable
83
-	if (!is_array($options)) {
84
-		$options = ['editable' => $options];
85
-	} elseif (!isset($options['editable'])) {
86
-		$options['editable'] = true;
87
-	}
88
-
89
-	$editable = $options['editable'];
90
-
91
-	[$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c);
92
-	if (!$table_source || !$objet || !$objet_lien || !$id_objet) {
93
-		return false;
94
-	}
95
-
96
-	$objet_source = objet_type($table_source);
97
-	$table_sql_source = table_objet_sql($objet_source);
98
-
99
-	// verifier existence de la table xxx_liens
100
-	include_spip('action/editer_liens');
101
-	if (!objet_associable($objet_lien)) {
102
-		return false;
103
-	}
104
-
105
-	// L'éditabilité :) est définie par un test permanent (par exemple "associermots") ET le 4ème argument
106
-	include_spip('inc/autoriser');
107
-	$editable = ($editable
108
-		&& autoriser('associer' . $table_source, $objet, $id_objet)
109
-		&& autoriser('modifier', $objet, $id_objet));
110
-
111
-	if (
112
-		!$editable && !count(objet_trouver_liens(
113
-			[$objet_lien => '*'],
114
-			[($objet_lien == $objet_source ? $objet : $objet_source) => $id_objet]
115
-		))
116
-	) {
117
-		return false;
118
-	}
119
-
120
-	// squelettes de vue et de d'association
121
-	// ils sont différents si des rôles sont définis.
122
-	$skel_vue = $table_source . '_lies';
123
-	$skel_ajout = $table_source . '_associer';
124
-
125
-	// description des roles
126
-	include_spip('inc/roles');
127
-	if ($roles = roles_presents($objet_source, $objet)) {
128
-		// on demande de nouveaux squelettes en conséquence
129
-		$skel_vue = $table_source . '_roles_lies';
130
-		$skel_ajout = $table_source . '_roles_associer';
131
-	}
132
-
133
-	$oups = '';
134
-	if ($editable) {
135
-		$oups = lien_gerer__oups('editer_liens', 'hash');
136
-	}
137
-	$valeurs = [
138
-		'id' => "$table_source-$objet-$id_objet-$objet_lien", // identifiant unique pour les id du form
139
-		'_vue_liee' => $skel_vue,
140
-		'_vue_ajout' => $skel_ajout,
141
-		'_objet_lien' => $objet_lien,
142
-		'id_lien_ajoute' => _request('id_lien_ajoute'),
143
-		'objet' => $objet,
144
-		'id_objet' => $id_objet,
145
-		'objet_source' => $objet_source,
146
-		'table_source' => $table_source,
147
-		'recherche' => '',
148
-		'visible' => 0,
149
-		'ajouter_lien' => '',
150
-		'supprimer_lien' => '',
151
-		'qualifier_lien' => '',
152
-		'ordonner_lien' => '',
153
-		'desordonner_liens' => '',
154
-		'_roles' => $roles, # description des roles
155
-		'_oups' => entites_html($oups),
156
-		'editable' => $editable,
157
-	];
158
-
159
-	// les options non definies dans $valeurs sont passees telles quelles au formulaire html
160
-	$valeurs = array_merge($options, $valeurs);
161
-
162
-	return $valeurs;
82
+    // compat avec ancienne signature ou le 4eme argument est $editable
83
+    if (!is_array($options)) {
84
+        $options = ['editable' => $options];
85
+    } elseif (!isset($options['editable'])) {
86
+        $options['editable'] = true;
87
+    }
88
+
89
+    $editable = $options['editable'];
90
+
91
+    [$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c);
92
+    if (!$table_source || !$objet || !$objet_lien || !$id_objet) {
93
+        return false;
94
+    }
95
+
96
+    $objet_source = objet_type($table_source);
97
+    $table_sql_source = table_objet_sql($objet_source);
98
+
99
+    // verifier existence de la table xxx_liens
100
+    include_spip('action/editer_liens');
101
+    if (!objet_associable($objet_lien)) {
102
+        return false;
103
+    }
104
+
105
+    // L'éditabilité :) est définie par un test permanent (par exemple "associermots") ET le 4ème argument
106
+    include_spip('inc/autoriser');
107
+    $editable = ($editable
108
+        && autoriser('associer' . $table_source, $objet, $id_objet)
109
+        && autoriser('modifier', $objet, $id_objet));
110
+
111
+    if (
112
+        !$editable && !count(objet_trouver_liens(
113
+            [$objet_lien => '*'],
114
+            [($objet_lien == $objet_source ? $objet : $objet_source) => $id_objet]
115
+        ))
116
+    ) {
117
+        return false;
118
+    }
119
+
120
+    // squelettes de vue et de d'association
121
+    // ils sont différents si des rôles sont définis.
122
+    $skel_vue = $table_source . '_lies';
123
+    $skel_ajout = $table_source . '_associer';
124
+
125
+    // description des roles
126
+    include_spip('inc/roles');
127
+    if ($roles = roles_presents($objet_source, $objet)) {
128
+        // on demande de nouveaux squelettes en conséquence
129
+        $skel_vue = $table_source . '_roles_lies';
130
+        $skel_ajout = $table_source . '_roles_associer';
131
+    }
132
+
133
+    $oups = '';
134
+    if ($editable) {
135
+        $oups = lien_gerer__oups('editer_liens', 'hash');
136
+    }
137
+    $valeurs = [
138
+        'id' => "$table_source-$objet-$id_objet-$objet_lien", // identifiant unique pour les id du form
139
+        '_vue_liee' => $skel_vue,
140
+        '_vue_ajout' => $skel_ajout,
141
+        '_objet_lien' => $objet_lien,
142
+        'id_lien_ajoute' => _request('id_lien_ajoute'),
143
+        'objet' => $objet,
144
+        'id_objet' => $id_objet,
145
+        'objet_source' => $objet_source,
146
+        'table_source' => $table_source,
147
+        'recherche' => '',
148
+        'visible' => 0,
149
+        'ajouter_lien' => '',
150
+        'supprimer_lien' => '',
151
+        'qualifier_lien' => '',
152
+        'ordonner_lien' => '',
153
+        'desordonner_liens' => '',
154
+        '_roles' => $roles, # description des roles
155
+        '_oups' => entites_html($oups),
156
+        'editable' => $editable,
157
+    ];
158
+
159
+    // les options non definies dans $valeurs sont passees telles quelles au formulaire html
160
+    $valeurs = array_merge($options, $valeurs);
161
+
162
+    return $valeurs;
163 163
 }
164 164
 
165 165
 /**
@@ -203,170 +203,170 @@  discard block
 block discarded – undo
203 203
  * @return array
204 204
  */
205 205
 function formulaires_editer_liens_traiter_dist($a, $b, $c, $options = []) {
206
-	// compat avec ancienne signature ou le 4eme argument est $editable
207
-	if (!is_array($options)) {
208
-		$options = ['editable' => $options];
209
-	} elseif (!isset($options['editable'])) {
210
-		$options['editable'] = true;
211
-	}
212
-
213
-	$editable = $options['editable'];
214
-
215
-	$res = ['editable' => (bool) $editable];
216
-	[$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c);
217
-	if (!$table_source || !$objet || !$objet_lien) {
218
-		return $res;
219
-	}
220
-
221
-
222
-	if (_request('tout_voir')) {
223
-		set_request('recherche', '');
224
-	}
225
-
226
-	include_spip('inc/autoriser');
227
-	if (autoriser('modifier', $objet, $id_objet)) {
228
-		// recuperer le oups du coup d'avant pour le propager à charger() si on ne fait rien par exemple
229
-		lien_gerer__oups('editer_liens', 'request');
230
-
231
-		// annuler les suppressions du coup d'avant ?
232
-		if (
233
-			_request('annuler_oups')
234
-			&& ($oups = lien_gerer__oups('editer_liens', 'get'))
235
-		) {
236
-			if ($oups_objets = charger_fonction("editer_liens_oups_{$table_source}_{$objet}_{$objet_lien}", 'action', true)) {
237
-				$oups_objets($oups);
238
-			} else {
239
-				$objet_source = objet_type($table_source);
240
-				include_spip('action/editer_liens');
241
-				foreach ($oups as $oup) {
242
-					if ($objet_lien == $objet_source) {
243
-						objet_associer([$objet_source => $oup[$objet_source]], [$objet => $oup[$objet]], $oup);
244
-					} else {
245
-						objet_associer([$objet => $oup[$objet]], [$objet_source => $oup[$objet_source]], $oup);
246
-					}
247
-				}
248
-			}
249
-			# oups ne persiste que pour la derniere action, si suppression
250
-			lien_gerer__oups('editer_liens', 'reset');
251
-		}
252
-
253
-		$supprimer = _request('supprimer_lien');
254
-		$ajouter = _request('ajouter_lien');
255
-		$ordonner = _request('ordonner_lien');
256
-
257
-		if (_request('desordonner_liens')) {
258
-			include_spip('action/editer_liens');
259
-			objet_qualifier_liens([$objet_lien => '*'], [$objet => $id_objet], ['rang_lien' => 0]);
260
-		}
261
-
262
-		// il est possible de preciser dans une seule variable un remplacement :
263
-		// remplacer_lien[old][new]
264
-		if ($remplacer = _request('remplacer_lien')) {
265
-			foreach ($remplacer as $k => $v) {
266
-				if ($old = lien_verifier_action($k, '')) {
267
-					foreach (is_array($v) ? $v : [$v] as $kn => $vn) {
268
-						if ($new = lien_verifier_action($kn, $vn)) {
269
-							$supprimer[$old] = 'x';
270
-							$ajouter[$new] = '+';
271
-						}
272
-					}
273
-				}
274
-			}
275
-		}
276
-
277
-		if ($supprimer) {
278
-			if (
279
-				$supprimer_objets = charger_fonction(
280
-					"editer_liens_supprimer_{$table_source}_{$objet}_{$objet_lien}",
281
-					'action',
282
-					true
283
-				)
284
-			) {
285
-				$oups = $supprimer_objets($supprimer);
286
-			} else {
287
-				include_spip('action/editer_liens');
288
-				$oups = [];
289
-
290
-				foreach ($supprimer as $k => $v) {
291
-					if ($lien = lien_verifier_action($k, $v)) {
292
-						$lien = explode('-', $lien);
293
-						[$objet_source, $ids, $objet_lie, $idl, $role] = array_pad($lien, 5, null);
294
-						// appliquer une condition sur le rôle si défini ('*' pour tous les roles)
295
-						$cond = (is_null($role) ? [] : ['role' => $role]);
296
-						if ($objet_lien == $objet_source) {
297
-							$oups = array_merge(
298
-								$oups,
299
-								objet_trouver_liens([$objet_source => $ids], [$objet_lie => $idl], $cond)
300
-							);
301
-							objet_dissocier([$objet_source => $ids], [$objet_lie => $idl], $cond);
302
-						} else {
303
-							$oups = array_merge(
304
-								$oups,
305
-								objet_trouver_liens([$objet_lie => $idl], [$objet_source => $ids], $cond)
306
-							);
307
-							objet_dissocier([$objet_lie => $idl], [$objet_source => $ids], $cond);
308
-						}
309
-					}
310
-				}
311
-			}
312
-			if (!empty($oups)) {
313
-				lien_gerer__oups('editer_liens', 'set', $oups);
314
-			} else {
315
-				lien_gerer__oups('editer_liens', 'reset');
316
-			}
317
-		}
318
-
319
-		if ($ajouter) {
320
-			if (
321
-				$ajouter_objets = charger_fonction("editer_liens_ajouter_{$table_source}_{$objet}_{$objet_lien}", 'action', true)
322
-			) {
323
-				$ajout_ok = $ajouter_objets($ajouter);
324
-			} else {
325
-				$ajout_ok = false;
326
-				include_spip('action/editer_liens');
327
-				foreach ($ajouter as $k => $v) {
328
-					if ($lien = lien_verifier_action($k, $v)) {
329
-						$ajout_ok = true;
330
-						[$objet1, $ids, $objet2, $idl] = explode('-', $lien);
331
-						$qualifs = lien_retrouver_qualif($objet_lien, $lien);
332
-						if ($objet_lien == $objet1) {
333
-							lien_ajouter_liaisons($objet1, $ids, $objet2, $idl, $qualifs);
334
-						} else {
335
-							lien_ajouter_liaisons($objet2, $idl, $objet1, $ids, $qualifs);
336
-						}
337
-						set_request('id_lien_ajoute', $ids);
338
-					}
339
-				}
340
-			}
341
-			# oups ne persiste que pour la derniere action, si suppression
342
-			# une suppression suivie d'un ajout dans le meme hit est un remplacement
343
-			# non annulable !
344
-			if ($ajout_ok) {
345
-				lien_gerer__oups('editer_liens', 'reset');
346
-			}
347
-		}
348
-
349
-		if ($ordonner) {
350
-			include_spip('action/editer_liens');
351
-			foreach ($ordonner as $k => $rang_lien) {
352
-				if ($lien = lien_verifier_action($k, '')) {
353
-					[$objet1, $ids, $objet2, $idl] = explode('-', $lien);
354
-					$qualif = ['rang_lien' => $rang_lien];
355
-
356
-					if ($objet_lien == $objet1) {
357
-						objet_qualifier_liens([$objet1 => $ids], [$objet2 => $idl], $qualif);
358
-					} else {
359
-						objet_qualifier_liens([$objet2 => $idl], [$objet1 => $ids], $qualif);
360
-					}
361
-					set_request('id_lien_ajoute', $ids);
362
-					lien_gerer__oups('editer_liens', 'reset');
363
-				}
364
-			}
365
-		}
366
-	}
367
-
368
-
369
-	return $res;
206
+    // compat avec ancienne signature ou le 4eme argument est $editable
207
+    if (!is_array($options)) {
208
+        $options = ['editable' => $options];
209
+    } elseif (!isset($options['editable'])) {
210
+        $options['editable'] = true;
211
+    }
212
+
213
+    $editable = $options['editable'];
214
+
215
+    $res = ['editable' => (bool) $editable];
216
+    [$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c);
217
+    if (!$table_source || !$objet || !$objet_lien) {
218
+        return $res;
219
+    }
220
+
221
+
222
+    if (_request('tout_voir')) {
223
+        set_request('recherche', '');
224
+    }
225
+
226
+    include_spip('inc/autoriser');
227
+    if (autoriser('modifier', $objet, $id_objet)) {
228
+        // recuperer le oups du coup d'avant pour le propager à charger() si on ne fait rien par exemple
229
+        lien_gerer__oups('editer_liens', 'request');
230
+
231
+        // annuler les suppressions du coup d'avant ?
232
+        if (
233
+            _request('annuler_oups')
234
+            && ($oups = lien_gerer__oups('editer_liens', 'get'))
235
+        ) {
236
+            if ($oups_objets = charger_fonction("editer_liens_oups_{$table_source}_{$objet}_{$objet_lien}", 'action', true)) {
237
+                $oups_objets($oups);
238
+            } else {
239
+                $objet_source = objet_type($table_source);
240
+                include_spip('action/editer_liens');
241
+                foreach ($oups as $oup) {
242
+                    if ($objet_lien == $objet_source) {
243
+                        objet_associer([$objet_source => $oup[$objet_source]], [$objet => $oup[$objet]], $oup);
244
+                    } else {
245
+                        objet_associer([$objet => $oup[$objet]], [$objet_source => $oup[$objet_source]], $oup);
246
+                    }
247
+                }
248
+            }
249
+            # oups ne persiste que pour la derniere action, si suppression
250
+            lien_gerer__oups('editer_liens', 'reset');
251
+        }
252
+
253
+        $supprimer = _request('supprimer_lien');
254
+        $ajouter = _request('ajouter_lien');
255
+        $ordonner = _request('ordonner_lien');
256
+
257
+        if (_request('desordonner_liens')) {
258
+            include_spip('action/editer_liens');
259
+            objet_qualifier_liens([$objet_lien => '*'], [$objet => $id_objet], ['rang_lien' => 0]);
260
+        }
261
+
262
+        // il est possible de preciser dans une seule variable un remplacement :
263
+        // remplacer_lien[old][new]
264
+        if ($remplacer = _request('remplacer_lien')) {
265
+            foreach ($remplacer as $k => $v) {
266
+                if ($old = lien_verifier_action($k, '')) {
267
+                    foreach (is_array($v) ? $v : [$v] as $kn => $vn) {
268
+                        if ($new = lien_verifier_action($kn, $vn)) {
269
+                            $supprimer[$old] = 'x';
270
+                            $ajouter[$new] = '+';
271
+                        }
272
+                    }
273
+                }
274
+            }
275
+        }
276
+
277
+        if ($supprimer) {
278
+            if (
279
+                $supprimer_objets = charger_fonction(
280
+                    "editer_liens_supprimer_{$table_source}_{$objet}_{$objet_lien}",
281
+                    'action',
282
+                    true
283
+                )
284
+            ) {
285
+                $oups = $supprimer_objets($supprimer);
286
+            } else {
287
+                include_spip('action/editer_liens');
288
+                $oups = [];
289
+
290
+                foreach ($supprimer as $k => $v) {
291
+                    if ($lien = lien_verifier_action($k, $v)) {
292
+                        $lien = explode('-', $lien);
293
+                        [$objet_source, $ids, $objet_lie, $idl, $role] = array_pad($lien, 5, null);
294
+                        // appliquer une condition sur le rôle si défini ('*' pour tous les roles)
295
+                        $cond = (is_null($role) ? [] : ['role' => $role]);
296
+                        if ($objet_lien == $objet_source) {
297
+                            $oups = array_merge(
298
+                                $oups,
299
+                                objet_trouver_liens([$objet_source => $ids], [$objet_lie => $idl], $cond)
300
+                            );
301
+                            objet_dissocier([$objet_source => $ids], [$objet_lie => $idl], $cond);
302
+                        } else {
303
+                            $oups = array_merge(
304
+                                $oups,
305
+                                objet_trouver_liens([$objet_lie => $idl], [$objet_source => $ids], $cond)
306
+                            );
307
+                            objet_dissocier([$objet_lie => $idl], [$objet_source => $ids], $cond);
308
+                        }
309
+                    }
310
+                }
311
+            }
312
+            if (!empty($oups)) {
313
+                lien_gerer__oups('editer_liens', 'set', $oups);
314
+            } else {
315
+                lien_gerer__oups('editer_liens', 'reset');
316
+            }
317
+        }
318
+
319
+        if ($ajouter) {
320
+            if (
321
+                $ajouter_objets = charger_fonction("editer_liens_ajouter_{$table_source}_{$objet}_{$objet_lien}", 'action', true)
322
+            ) {
323
+                $ajout_ok = $ajouter_objets($ajouter);
324
+            } else {
325
+                $ajout_ok = false;
326
+                include_spip('action/editer_liens');
327
+                foreach ($ajouter as $k => $v) {
328
+                    if ($lien = lien_verifier_action($k, $v)) {
329
+                        $ajout_ok = true;
330
+                        [$objet1, $ids, $objet2, $idl] = explode('-', $lien);
331
+                        $qualifs = lien_retrouver_qualif($objet_lien, $lien);
332
+                        if ($objet_lien == $objet1) {
333
+                            lien_ajouter_liaisons($objet1, $ids, $objet2, $idl, $qualifs);
334
+                        } else {
335
+                            lien_ajouter_liaisons($objet2, $idl, $objet1, $ids, $qualifs);
336
+                        }
337
+                        set_request('id_lien_ajoute', $ids);
338
+                    }
339
+                }
340
+            }
341
+            # oups ne persiste que pour la derniere action, si suppression
342
+            # une suppression suivie d'un ajout dans le meme hit est un remplacement
343
+            # non annulable !
344
+            if ($ajout_ok) {
345
+                lien_gerer__oups('editer_liens', 'reset');
346
+            }
347
+        }
348
+
349
+        if ($ordonner) {
350
+            include_spip('action/editer_liens');
351
+            foreach ($ordonner as $k => $rang_lien) {
352
+                if ($lien = lien_verifier_action($k, '')) {
353
+                    [$objet1, $ids, $objet2, $idl] = explode('-', $lien);
354
+                    $qualif = ['rang_lien' => $rang_lien];
355
+
356
+                    if ($objet_lien == $objet1) {
357
+                        objet_qualifier_liens([$objet1 => $ids], [$objet2 => $idl], $qualif);
358
+                    } else {
359
+                        objet_qualifier_liens([$objet2 => $idl], [$objet1 => $ids], $qualif);
360
+                    }
361
+                    set_request('id_lien_ajoute', $ids);
362
+                    lien_gerer__oups('editer_liens', 'reset');
363
+                }
364
+            }
365
+        }
366
+    }
367
+
368
+
369
+    return $res;
370 370
 }
371 371
 
372 372
 
@@ -389,24 +389,24 @@  discard block
 block discarded – undo
389 389
  * @return string Action demandée si trouvée, sinon ''
390 390
  */
391 391
 function lien_verifier_action($k, $v) {
392
-	$action = '';
393
-	if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $k)) {
394
-		$action = $k;
395
-	}
396
-	if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $v)) {
397
-		if (is_numeric($k)) {
398
-			$action = $v;
399
-		}
400
-		if (_request($k)) {
401
-			$action = $v;
402
-		}
403
-	}
404
-	// ajout un role null fictif (plus pratique) si pas défini
405
-	if ($action && count(explode('-', $action)) == 4) {
406
-		$action .= '-';
407
-	}
408
-
409
-	return $action;
392
+    $action = '';
393
+    if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $k)) {
394
+        $action = $k;
395
+    }
396
+    if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $v)) {
397
+        if (is_numeric($k)) {
398
+            $action = $v;
399
+        }
400
+        if (_request($k)) {
401
+            $action = $v;
402
+        }
403
+    }
404
+    // ajout un role null fictif (plus pratique) si pas défini
405
+    if ($action && count(explode('-', $action)) == 4) {
406
+        $action .= '-';
407
+    }
408
+
409
+    return $action;
410 410
 }
411 411
 
412 412
 
@@ -422,62 +422,62 @@  discard block
 block discarded – undo
422 422
  *   Liste des qualifs pour chaque lien. Tableau vide s'il n'y en a pas.
423 423
  **/
424 424
 function lien_retrouver_qualif($objet_lien, $lien) {
425
-	// un role est défini dans la liaison
426
-	$defs = explode('-', $lien);
427
-	[$objet1, , $objet2, , $role] = array_pad($defs, 5, null);
428
-	$colonne_role = $objet_lien == $objet1 ? roles_colonne($objet1, $objet2) : roles_colonne($objet2, $objet1);
429
-
430
-	// cas ou le role est defini en 5e argument de l'action sur le lien (suppression, ajout rapide sans autre attribut)
431
-	if ($role) {
432
-		return [
433
-			// un seul lien avec ce role
434
-			[$colonne_role => $role]
435
-		];
436
-	}
437
-
438
-	// retrouver les rôles postés pour cette liaison, s'il y en a.
439
-	$qualifier_lien = _request('qualifier_lien');
440
-	if (!$qualifier_lien || !is_array($qualifier_lien)) {
441
-		return [];
442
-	}
443
-
444
-	// pas avec l'action complete (incluant le role)
445
-	$qualif = [];
446
-	if (
447
-		(!isset($qualifier_lien[$lien]) || !$qualif = $qualifier_lien[$lien])
448
-		&& count($defs) == 5
449
-	) {
450
-		// on tente avec l'action sans le role
451
-		array_pop($defs);
452
-		$lien = implode('-', $defs);
453
-		if (!isset($qualifier_lien[$lien]) || !$qualif = $qualifier_lien[$lien]) {
454
-			$qualif = [];
455
-		}
456
-	}
457
-
458
-	// $qualif de la forme array(role=>array(...),valeur=>array(...),....)
459
-	// on le reforme en array(array(role=>..,valeur=>..,..),array(role=>..,valeur=>..,..),...)
460
-	$qualifs = [];
461
-	while (is_countable($qualif) ? count($qualif) : 0) {
462
-		$q = [];
463
-		foreach ($qualif as $att => $values) {
464
-			if (is_array($values)) {
465
-				$q[$att] = array_shift($qualif[$att]);
466
-				if (!(is_countable($qualif[$att]) ? count($qualif[$att]) : 0)) {
467
-					unset($qualif[$att]);
468
-				}
469
-			} else {
470
-				$q[$att] = $values;
471
-				unset($qualif[$att]);
472
-			}
473
-		}
474
-		// pas de rôle vide
475
-		if (!$colonne_role || !isset($q[$colonne_role]) || $q[$colonne_role]) {
476
-			$qualifs[] = $q;
477
-		}
478
-	}
479
-
480
-	return $qualifs;
425
+    // un role est défini dans la liaison
426
+    $defs = explode('-', $lien);
427
+    [$objet1, , $objet2, , $role] = array_pad($defs, 5, null);
428
+    $colonne_role = $objet_lien == $objet1 ? roles_colonne($objet1, $objet2) : roles_colonne($objet2, $objet1);
429
+
430
+    // cas ou le role est defini en 5e argument de l'action sur le lien (suppression, ajout rapide sans autre attribut)
431
+    if ($role) {
432
+        return [
433
+            // un seul lien avec ce role
434
+            [$colonne_role => $role]
435
+        ];
436
+    }
437
+
438
+    // retrouver les rôles postés pour cette liaison, s'il y en a.
439
+    $qualifier_lien = _request('qualifier_lien');
440
+    if (!$qualifier_lien || !is_array($qualifier_lien)) {
441
+        return [];
442
+    }
443
+
444
+    // pas avec l'action complete (incluant le role)
445
+    $qualif = [];
446
+    if (
447
+        (!isset($qualifier_lien[$lien]) || !$qualif = $qualifier_lien[$lien])
448
+        && count($defs) == 5
449
+    ) {
450
+        // on tente avec l'action sans le role
451
+        array_pop($defs);
452
+        $lien = implode('-', $defs);
453
+        if (!isset($qualifier_lien[$lien]) || !$qualif = $qualifier_lien[$lien]) {
454
+            $qualif = [];
455
+        }
456
+    }
457
+
458
+    // $qualif de la forme array(role=>array(...),valeur=>array(...),....)
459
+    // on le reforme en array(array(role=>..,valeur=>..,..),array(role=>..,valeur=>..,..),...)
460
+    $qualifs = [];
461
+    while (is_countable($qualif) ? count($qualif) : 0) {
462
+        $q = [];
463
+        foreach ($qualif as $att => $values) {
464
+            if (is_array($values)) {
465
+                $q[$att] = array_shift($qualif[$att]);
466
+                if (!(is_countable($qualif[$att]) ? count($qualif[$att]) : 0)) {
467
+                    unset($qualif[$att]);
468
+                }
469
+            } else {
470
+                $q[$att] = $values;
471
+                unset($qualif[$att]);
472
+            }
473
+        }
474
+        // pas de rôle vide
475
+        if (!$colonne_role || !isset($q[$colonne_role]) || $q[$colonne_role]) {
476
+            $qualifs[] = $q;
477
+        }
478
+    }
479
+
480
+    return $qualifs;
481 481
 }
482 482
 
483 483
 /**
@@ -496,14 +496,14 @@  discard block
 block discarded – undo
496 496
  **/
497 497
 function lien_ajouter_liaisons($objet_source, $ids, $objet_lien, $idl, $qualifs) {
498 498
 
499
-	// retrouver la colonne de roles s'il y en a a lier
500
-	if (is_array($qualifs) && count($qualifs)) {
501
-		foreach ($qualifs as $qualif) {
502
-			objet_associer([$objet_source => $ids], [$objet_lien => $idl], $qualif);
503
-		}
504
-	} else {
505
-		objet_associer([$objet_source => $ids], [$objet_lien => $idl]);
506
-	}
499
+    // retrouver la colonne de roles s'il y en a a lier
500
+    if (is_array($qualifs) && count($qualifs)) {
501
+        foreach ($qualifs as $qualif) {
502
+            objet_associer([$objet_source => $ids], [$objet_lien => $idl], $qualif);
503
+        }
504
+    } else {
505
+        objet_associer([$objet_source => $ids], [$objet_lien => $idl]);
506
+    }
507 507
 }
508 508
 
509 509
 
@@ -513,77 +513,77 @@  discard block
 block discarded – undo
513 513
  * @return array|string|null
514 514
  */
515 515
 function lien_gerer__oups(string $form, string $action, ?array $valeur = null) {
516
-	static $_oups_value;
517
-
518
-	switch ($action) {
519
-		case 'reset':
520
-			$res = !empty($_oups_value);
521
-			$_oups_value = null;
522
-			return $res;
523
-
524
-		case 'get':
525
-			return $_oups_value ?: null;
526
-
527
-		case 'set':
528
-			$_oups_value = $valeur;
529
-			return true;
530
-
531
-		case 'request':
532
-			$_oups_value = null;
533
-			if ($oups = _request('_oups')) {
534
-				include_spip('inc/filtres');
535
-				// on accepte uniquement une valeur signée
536
-				if ($oups = decoder_contexte_ajax($oups, $form)) {
537
-					if (
538
-						!is_array($oups)
539
-						|| empty($oups['id_auteur'])
540
-						|| $oups['id_auteur'] !== $GLOBALS['visiteur_session']['id_auteur']
541
-						|| empty($oups['time'])
542
-						|| $oups['time'] < $_SERVER['REQUEST_TIME'] - 86400
543
-						|| empty($oups['args'])
544
-						|| $oups['args'] !== lien_gerer__oups_collecter_args($form, debug_backtrace(0, 5))
545
-						|| empty($oups['oups_value'])
546
-					) {
547
-						$oups = null;
548
-					}
549
-					else {
550
-						$oups = $oups['oups_value'];
551
-						// controler le contenu
552
-						foreach ($oups as $k => $oup) {
553
-							if (!is_array($oup)) {
554
-								unset($oups[$k]);
555
-							} else {
556
-								foreach ($oup as $champ => $valeur) {
557
-									if (!is_scalar($champ) || !is_scalar($valeur) || preg_match(',\W,', $champ)) {
558
-										unset($oups[$k][$champ]);
559
-									}
560
-								}
561
-								if (empty($oups[$k])) {
562
-									unset($oups[$k]);
563
-								}
564
-							}
565
-						}
566
-					}
567
-					$_oups_value = $oups;
568
-					return $_oups_value;
569
-				}
570
-			}
571
-			break;
572
-
573
-		case 'hash':
574
-			if (!$_oups_value) {
575
-				return '';
576
-			}
577
-
578
-			include_spip('inc/filtres');
579
-			$oups = [
580
-				'id_auteur' => $GLOBALS['visiteur_session']['id_auteur'] ?? 0,
581
-				'time' => strtotime(date('Y-m-d H:00:00')),
582
-				'args' => lien_gerer__oups_collecter_args($form, debug_backtrace(0, 5)),
583
-				'oups_value' => $_oups_value,
584
-			];
585
-			return encoder_contexte_ajax($oups, $form);
586
-	}
516
+    static $_oups_value;
517
+
518
+    switch ($action) {
519
+        case 'reset':
520
+            $res = !empty($_oups_value);
521
+            $_oups_value = null;
522
+            return $res;
523
+
524
+        case 'get':
525
+            return $_oups_value ?: null;
526
+
527
+        case 'set':
528
+            $_oups_value = $valeur;
529
+            return true;
530
+
531
+        case 'request':
532
+            $_oups_value = null;
533
+            if ($oups = _request('_oups')) {
534
+                include_spip('inc/filtres');
535
+                // on accepte uniquement une valeur signée
536
+                if ($oups = decoder_contexte_ajax($oups, $form)) {
537
+                    if (
538
+                        !is_array($oups)
539
+                        || empty($oups['id_auteur'])
540
+                        || $oups['id_auteur'] !== $GLOBALS['visiteur_session']['id_auteur']
541
+                        || empty($oups['time'])
542
+                        || $oups['time'] < $_SERVER['REQUEST_TIME'] - 86400
543
+                        || empty($oups['args'])
544
+                        || $oups['args'] !== lien_gerer__oups_collecter_args($form, debug_backtrace(0, 5))
545
+                        || empty($oups['oups_value'])
546
+                    ) {
547
+                        $oups = null;
548
+                    }
549
+                    else {
550
+                        $oups = $oups['oups_value'];
551
+                        // controler le contenu
552
+                        foreach ($oups as $k => $oup) {
553
+                            if (!is_array($oup)) {
554
+                                unset($oups[$k]);
555
+                            } else {
556
+                                foreach ($oup as $champ => $valeur) {
557
+                                    if (!is_scalar($champ) || !is_scalar($valeur) || preg_match(',\W,', $champ)) {
558
+                                        unset($oups[$k][$champ]);
559
+                                    }
560
+                                }
561
+                                if (empty($oups[$k])) {
562
+                                    unset($oups[$k]);
563
+                                }
564
+                            }
565
+                        }
566
+                    }
567
+                    $_oups_value = $oups;
568
+                    return $_oups_value;
569
+                }
570
+            }
571
+            break;
572
+
573
+        case 'hash':
574
+            if (!$_oups_value) {
575
+                return '';
576
+            }
577
+
578
+            include_spip('inc/filtres');
579
+            $oups = [
580
+                'id_auteur' => $GLOBALS['visiteur_session']['id_auteur'] ?? 0,
581
+                'time' => strtotime(date('Y-m-d H:00:00')),
582
+                'args' => lien_gerer__oups_collecter_args($form, debug_backtrace(0, 5)),
583
+                'oups_value' => $_oups_value,
584
+            ];
585
+            return encoder_contexte_ajax($oups, $form);
586
+    }
587 587
 }
588 588
 
589 589
 /**
@@ -593,19 +593,19 @@  discard block
 block discarded – undo
593 593
  * @return string
594 594
  */
595 595
 function lien_gerer__oups_collecter_args($form, $trace) {
596
-	$args = '';
597
-	if (!empty($trace)) {
598
-		do {
599
-			$t = array_shift($trace);
600
-			$function = $t['function'] ?? '';
601
-			if (str_starts_with((string) $function, 'formulaires_' . $form)) {
602
-				if (isset($t['args'])) {
603
-					$args = json_encode($t['args'], JSON_THROW_ON_ERROR);
604
-				}
605
-				break;
606
-			}
607
-		}
608
-		while (count($trace));
609
-	}
610
-	return $args;
596
+    $args = '';
597
+    if (!empty($trace)) {
598
+        do {
599
+            $t = array_shift($trace);
600
+            $function = $t['function'] ?? '';
601
+            if (str_starts_with((string) $function, 'formulaires_' . $form)) {
602
+                if (isset($t['args'])) {
603
+                    $args = json_encode($t['args'], JSON_THROW_ON_ERROR);
604
+                }
605
+                break;
606
+            }
607
+        }
608
+        while (count($trace));
609
+    }
610
+    return $args;
611 611
 }
Please login to merge, or discard this patch.
prive/formulaires/rediriger_article.php 1 patch
Indentation   +45 added lines, -45 removed lines patch added patch discarded remove patch
@@ -10,65 +10,65 @@
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 function formulaires_rediriger_article_charger_dist($id_article, $retour = '') {
17 17
 
18
-	include_spip('inc/autoriser');
19
-	if (!autoriser('modifier', 'article', $id_article)) {
20
-		return false;
21
-	}
22
-
23
-	$row = sql_fetsel('id_article,virtuel', 'spip_articles', 'id_article=' . (int) $id_article);
24
-	if (!$row['id_article']) {
25
-		return false;
26
-	}
27
-	include_spip('inc/lien');
28
-	$redirection = virtuel_redirige($row['virtuel']);
29
-
30
-	if (
31
-		!$redirection
32
-		&& $GLOBALS['meta']['articles_redirection'] != 'oui'
33
-	) {
34
-		return false;
35
-	}
36
-
37
-
38
-	include_spip('inc/texte');
39
-	include_spip('inc/filtres_ecrire');
40
-
41
-	return [
42
-		'redirection' => $redirection,
43
-		'id' => $id_article,
44
-		'_afficher_url' => ($redirection ? lien_article_virtuel($redirection) : ''),
45
-	];
18
+    include_spip('inc/autoriser');
19
+    if (!autoriser('modifier', 'article', $id_article)) {
20
+        return false;
21
+    }
22
+
23
+    $row = sql_fetsel('id_article,virtuel', 'spip_articles', 'id_article=' . (int) $id_article);
24
+    if (!$row['id_article']) {
25
+        return false;
26
+    }
27
+    include_spip('inc/lien');
28
+    $redirection = virtuel_redirige($row['virtuel']);
29
+
30
+    if (
31
+        !$redirection
32
+        && $GLOBALS['meta']['articles_redirection'] != 'oui'
33
+    ) {
34
+        return false;
35
+    }
36
+
37
+
38
+    include_spip('inc/texte');
39
+    include_spip('inc/filtres_ecrire');
40
+
41
+    return [
42
+        'redirection' => $redirection,
43
+        'id' => $id_article,
44
+        '_afficher_url' => ($redirection ? lien_article_virtuel($redirection) : ''),
45
+    ];
46 46
 }
47 47
 
48 48
 function formulaires_rediriger_article_verifier_dist($id_article, $retour = '') {
49
-	$erreurs = [];
49
+    $erreurs = [];
50 50
 
51
-	if (($redirection = _request('redirection')) == $id_article || $redirection == 'art' . $id_article) {
52
-		$erreurs['redirection'] = _T('info_redirection_boucle');
53
-	}
51
+    if (($redirection = _request('redirection')) == $id_article || $redirection == 'art' . $id_article) {
52
+        $erreurs['redirection'] = _T('info_redirection_boucle');
53
+    }
54 54
 
55
-	return $erreurs;
55
+    return $erreurs;
56 56
 }
57 57
 
58 58
 function formulaires_rediriger_article_traiter_dist($id_article, $retour = '') {
59 59
 
60
-	$url = preg_replace(',^\s*https?://$,i', '', rtrim((string) _request('redirection')));
61
-	if ($url) {
62
-		$url = corriger_caracteres($url);
63
-	}
60
+    $url = preg_replace(',^\s*https?://$,i', '', rtrim((string) _request('redirection')));
61
+    if ($url) {
62
+        $url = corriger_caracteres($url);
63
+    }
64 64
 
65
-	include_spip('action/editer_article');
66
-	article_modifier($id_article, ['virtuel' => $url]);
65
+    include_spip('action/editer_article');
66
+    article_modifier($id_article, ['virtuel' => $url]);
67 67
 
68
-	$js = _AJAX ? '<script type="text/javascript">if (window.ajaxReload) ajaxReload("wysiwyg");</script>' : '';
68
+    $js = _AJAX ? '<script type="text/javascript">if (window.ajaxReload) ajaxReload("wysiwyg");</script>' : '';
69 69
 
70
-	return [
71
-		'message_ok' => ($url ? _T('info_redirection_activee') : _T('info_redirection_desactivee')) . $js,
72
-		'editable' => true
73
-	];
70
+    return [
71
+        'message_ok' => ($url ? _T('info_redirection_activee') : _T('info_redirection_desactivee')) . $js,
72
+        'editable' => true
73
+    ];
74 74
 }
Please login to merge, or discard this patch.
prive/formulaires/editer_auteur.php 1 patch
Indentation   +369 added lines, -369 removed lines patch added patch discarded remove patch
@@ -7,7 +7,7 @@  discard block
 block discarded – undo
7 7
  **/
8 8
 
9 9
 if (!defined('_ECRIRE_INC_VERSION')) {
10
-	return;
10
+    return;
11 11
 }
12 12
 
13 13
 include_spip('inc/actions');
@@ -38,24 +38,24 @@  discard block
 block discarded – undo
38 38
  *     Environnement du formulaire
39 39
  **/
40 40
 function formulaires_editer_auteur_charger_dist(
41
-	$id_auteur = 'new',
42
-	$retour = '',
43
-	$associer_objet = '',
44
-	$config_fonc = 'auteurs_edit_config',
45
-	$row = [],
46
-	$hidden = ''
41
+    $id_auteur = 'new',
42
+    $retour = '',
43
+    $associer_objet = '',
44
+    $config_fonc = 'auteurs_edit_config',
45
+    $row = [],
46
+    $hidden = ''
47 47
 ) {
48
-	$valeurs = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
49
-	$valeurs['new_login'] = $valeurs['login'];
48
+    $valeurs = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
49
+    $valeurs['new_login'] = $valeurs['login'];
50 50
 
51
-	// S'il n'y a pas la langue, on prend la langue du site
52
-	$valeurs['langue'] = $valeurs['langue'] ?: $GLOBALS['meta']['langue_site'];
51
+    // S'il n'y a pas la langue, on prend la langue du site
52
+    $valeurs['langue'] = $valeurs['langue'] ?: $GLOBALS['meta']['langue_site'];
53 53
 
54
-	if (!autoriser('modifier', 'auteur', (int) $id_auteur)) {
55
-		$valeurs['editable'] = '';
56
-	}
54
+    if (!autoriser('modifier', 'auteur', (int) $id_auteur)) {
55
+        $valeurs['editable'] = '';
56
+    }
57 57
 
58
-	return $valeurs;
58
+    return $valeurs;
59 59
 }
60 60
 
61 61
 /**
@@ -79,14 +79,14 @@  discard block
 block discarded – undo
79 79
  *     Hash du formulaire
80 80
  */
81 81
 function formulaires_editer_auteur_identifier_dist(
82
-	$id_auteur = 'new',
83
-	$retour = '',
84
-	$associer_objet = '',
85
-	$config_fonc = 'auteurs_edit_config',
86
-	$row = [],
87
-	$hidden = ''
82
+    $id_auteur = 'new',
83
+    $retour = '',
84
+    $associer_objet = '',
85
+    $config_fonc = 'auteurs_edit_config',
86
+    $row = [],
87
+    $hidden = ''
88 88
 ) {
89
-	return serialize([(int) $id_auteur, $associer_objet]);
89
+    return serialize([(int) $id_auteur, $associer_objet]);
90 90
 }
91 91
 
92 92
 
@@ -100,27 +100,27 @@  discard block
 block discarded – undo
100 100
  */
101 101
 function auteurs_edit_config(array $row): array {
102 102
 
103
-	$config = [];
104
-	$config['lignes'] = 8;
105
-	$config['langue'] = $GLOBALS['spip_lang'];
106
-
107
-	// pour instituer_auteur
108
-	$config['auteur'] = $row;
109
-
110
-	//$config['restreint'] = ($row['statut'] == 'publie');
111
-	$auth_methode = $row['source'];
112
-	include_spip('inc/auth');
113
-	$config['edit_login'] = (
114
-		auth_autoriser_modifier_login($auth_methode)
115
-		&& autoriser('modifier', 'auteur', $row['id_auteur'], null, ['login' => true])
116
-		&& autoriser('modifier', 'auteur', $row['id_auteur'], null, ['email' => true])
117
-	);
118
-	$config['edit_pass'] = (
119
-			auth_autoriser_modifier_pass($auth_methode)
120
-			&& autoriser('modifier', 'auteur', $row['id_auteur'])
121
-	);
122
-
123
-	return $config;
103
+    $config = [];
104
+    $config['lignes'] = 8;
105
+    $config['langue'] = $GLOBALS['spip_lang'];
106
+
107
+    // pour instituer_auteur
108
+    $config['auteur'] = $row;
109
+
110
+    //$config['restreint'] = ($row['statut'] == 'publie');
111
+    $auth_methode = $row['source'];
112
+    include_spip('inc/auth');
113
+    $config['edit_login'] = (
114
+        auth_autoriser_modifier_login($auth_methode)
115
+        && autoriser('modifier', 'auteur', $row['id_auteur'], null, ['login' => true])
116
+        && autoriser('modifier', 'auteur', $row['id_auteur'], null, ['email' => true])
117
+    );
118
+    $config['edit_pass'] = (
119
+            auth_autoriser_modifier_pass($auth_methode)
120
+            && autoriser('modifier', 'auteur', $row['id_auteur'])
121
+    );
122
+
123
+    return $config;
124 124
 }
125 125
 
126 126
 /**
@@ -150,145 +150,145 @@  discard block
 block discarded – undo
150 150
  *     Erreurs des saisies
151 151
  **/
152 152
 function formulaires_editer_auteur_verifier_dist(
153
-	$id_auteur = 'new',
154
-	$retour = '',
155
-	$associer_objet = '',
156
-	$config_fonc = 'auteurs_edit_config',
157
-	$row = [],
158
-	$hidden = ''
153
+    $id_auteur = 'new',
154
+    $retour = '',
155
+    $associer_objet = '',
156
+    $config_fonc = 'auteurs_edit_config',
157
+    $row = [],
158
+    $hidden = ''
159 159
 ) {
160
-	// auto-renseigner le nom si il n'existe pas, sans couper
161
-	titre_automatique('nom', ['email', 'login'], 255);
162
-
163
-	$oblis = ['nom'];
164
-	// si on veut renvoyer des identifiants il faut un email et un login
165
-	if (_request('reset_password')) {
166
-		$oblis[] = 'email';
167
-		$oblis[] = 'new_login';
168
-	}
169
-	// mais il reste obligatoire si on a rien trouve
170
-	$erreurs = formulaires_editer_objet_verifier('auteur', $id_auteur, $oblis);
171
-	if (isset($erreurs['new_login'])) {
172
-		$erreurs['login'] = $erreurs['new_login'];
173
-		unset($erreurs['new_login']);
174
-	}
175
-
176
-	$auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur);
177
-	$auth_methode = ($auth_methode ?: 'spip');
178
-	include_spip('inc/auth');
179
-
180
-	if (!nom_acceptable(_request('nom'))) {
181
-		$erreurs['nom'] = _T('info_nom_pas_conforme');
182
-	}
183
-
184
-	if ($email = _request('email')) {
185
-		include_spip('inc/filtres');
186
-		include_spip('inc/autoriser');
187
-		// un redacteur qui modifie son email n'a pas le droit de le vider si il y en avait un
188
-		if (
189
-			!autoriser('modifier', 'auteur', $id_auteur, null, ['email' => '?'])
190
-			&& $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
191
-			&& !strlen(trim((string) $email))
192
-			&& $email != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur))
193
-		) {
194
-			$erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
195
-		} else {
196
-			if (!email_valide($email)) {
197
-				$erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
198
-			}
199
-		}
200
-		# Ne pas autoriser d'avoir deux auteurs avec le même email
201
-		# cette fonctionalité nécessite que la base soit clean à l'activation : pas de
202
-		# doublon sur la requête select email,count(*) from spip_auteurs group by email ;
203
-		if (defined('_INTERDIRE_AUTEUR_MEME_EMAIL')) {
204
-			#Nouvel auteur
205
-			if ((int) $id_auteur == 0) {
206
-				#Un auteur existe deja avec cette adresse ?
207
-				if (sql_countsel('spip_auteurs', 'email=' . sql_quote($email)) > 0) {
208
-					$erreurs['email'] = _T('erreur_email_deja_existant');
209
-				}
210
-			} else {
211
-				#Un auteur existe deja avec cette adresse ? et n'est pas le user courant.
212
-				if (
213
-					sql_countsel(
214
-						'spip_auteurs',
215
-						'email=' . sql_quote($email)
216
-					) > 0
217
-					&& $id_auteur != ($id_auteur_ancien = sql_getfetsel(
218
-						'id_auteur',
219
-						'spip_auteurs',
220
-						'email=' . sql_quote($email)
221
-					))
222
-				) {
223
-					$erreurs['email'] = _T('erreur_email_deja_existant');
224
-				}
225
-			}
226
-		}
227
-	}
228
-
229
-	// quand c'est un auteur existant on fait le reset password ici
230
-	if (!(is_countable($erreurs) ? count($erreurs) : 0) && _request('reset_password') && (int) $id_auteur) {
231
-		return auteur_reset_password($id_auteur, $erreurs);
232
-	}
233
-
234
-	// corriger un cas si frequent : www.example.org sans le http:// qui precede
235
-	if (
236
-		($url = _request('url_site'))
237
-		&& !tester_url_absolue($url)
238
-		&& (!str_contains((string) $url, ':')
239
-		&& strncasecmp((string) $url, 'www.', 4) === 0)
240
-	) {
241
-		$url = 'http://' . $url;
242
-		set_request('url_site', $url);
243
-	}
244
-	// traiter les liens implicites avant de tester l'url
245
-	include_spip('inc/lien');
246
-	if (($url = calculer_url(_request('url_site'))) && !tester_url_absolue($url)) {
247
-		$erreurs['url_site'] = _T('info_url_site_pas_conforme');
248
-	}
249
-
250
-	$erreurs['message_erreur'] = '';
251
-	if (_request('login')) {
252
-		// on n'est jamais cense poster le name 'login'
253
-		$erreurs['login'] = _T('info_non_modifiable');
254
-	}
255
-	elseif (
256
-		($login = _request('new_login')) && $login !== sql_getfetsel('login', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur)
257
-	) {
258
-		// on verifie la meme chose que dans auteurs_edit_config()
259
-		if (
260
-			! auth_autoriser_modifier_login($auth_methode)
261
-			|| !autoriser('modifier', 'auteur', (int) $id_auteur, null, ['login' => true])
262
-			// legacy : ne pas risquer d'autoriser la modif login si fonction d'autorisation pas mise a jour et ne teste que l'option email
263
-			|| !autoriser('modifier', 'auteur', (int) $id_auteur, null, ['email' => true])
264
-		) {
265
-			$erreurs['login'] = _T('info_non_modifiable');
266
-		}
267
-	}
268
-
269
-	if (empty($erreurs['login'])) {
270
-		if ($err = auth_verifier_login($auth_methode, _request('new_login'), $id_auteur)) {
271
-			$erreurs['login'] = $err;
272
-			$erreurs['message_erreur'] .= $err;
273
-		} else {
274
-			// pass trop court ou confirmation non identique
275
-			if ($p = _request('new_pass')) {
276
-				if ($p != _request('new_pass2')) {
277
-					$erreurs['new_pass'] = _T('info_passes_identiques');
278
-					$erreurs['message_erreur'] .= _T('info_passes_identiques');
279
-				} elseif ($err = auth_verifier_pass($auth_methode, _request('new_login'), $p, $id_auteur)) {
280
-					$erreurs['new_pass'] = $err;
281
-					$erreurs['message_erreur'] .= $err;
282
-				}
283
-			}
284
-		}
285
-	}
286
-
287
-	if (!$erreurs['message_erreur']) {
288
-		unset($erreurs['message_erreur']);
289
-	}
290
-
291
-	return $erreurs;
160
+    // auto-renseigner le nom si il n'existe pas, sans couper
161
+    titre_automatique('nom', ['email', 'login'], 255);
162
+
163
+    $oblis = ['nom'];
164
+    // si on veut renvoyer des identifiants il faut un email et un login
165
+    if (_request('reset_password')) {
166
+        $oblis[] = 'email';
167
+        $oblis[] = 'new_login';
168
+    }
169
+    // mais il reste obligatoire si on a rien trouve
170
+    $erreurs = formulaires_editer_objet_verifier('auteur', $id_auteur, $oblis);
171
+    if (isset($erreurs['new_login'])) {
172
+        $erreurs['login'] = $erreurs['new_login'];
173
+        unset($erreurs['new_login']);
174
+    }
175
+
176
+    $auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur);
177
+    $auth_methode = ($auth_methode ?: 'spip');
178
+    include_spip('inc/auth');
179
+
180
+    if (!nom_acceptable(_request('nom'))) {
181
+        $erreurs['nom'] = _T('info_nom_pas_conforme');
182
+    }
183
+
184
+    if ($email = _request('email')) {
185
+        include_spip('inc/filtres');
186
+        include_spip('inc/autoriser');
187
+        // un redacteur qui modifie son email n'a pas le droit de le vider si il y en avait un
188
+        if (
189
+            !autoriser('modifier', 'auteur', $id_auteur, null, ['email' => '?'])
190
+            && $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
191
+            && !strlen(trim((string) $email))
192
+            && $email != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur))
193
+        ) {
194
+            $erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
195
+        } else {
196
+            if (!email_valide($email)) {
197
+                $erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
198
+            }
199
+        }
200
+        # Ne pas autoriser d'avoir deux auteurs avec le même email
201
+        # cette fonctionalité nécessite que la base soit clean à l'activation : pas de
202
+        # doublon sur la requête select email,count(*) from spip_auteurs group by email ;
203
+        if (defined('_INTERDIRE_AUTEUR_MEME_EMAIL')) {
204
+            #Nouvel auteur
205
+            if ((int) $id_auteur == 0) {
206
+                #Un auteur existe deja avec cette adresse ?
207
+                if (sql_countsel('spip_auteurs', 'email=' . sql_quote($email)) > 0) {
208
+                    $erreurs['email'] = _T('erreur_email_deja_existant');
209
+                }
210
+            } else {
211
+                #Un auteur existe deja avec cette adresse ? et n'est pas le user courant.
212
+                if (
213
+                    sql_countsel(
214
+                        'spip_auteurs',
215
+                        'email=' . sql_quote($email)
216
+                    ) > 0
217
+                    && $id_auteur != ($id_auteur_ancien = sql_getfetsel(
218
+                        'id_auteur',
219
+                        'spip_auteurs',
220
+                        'email=' . sql_quote($email)
221
+                    ))
222
+                ) {
223
+                    $erreurs['email'] = _T('erreur_email_deja_existant');
224
+                }
225
+            }
226
+        }
227
+    }
228
+
229
+    // quand c'est un auteur existant on fait le reset password ici
230
+    if (!(is_countable($erreurs) ? count($erreurs) : 0) && _request('reset_password') && (int) $id_auteur) {
231
+        return auteur_reset_password($id_auteur, $erreurs);
232
+    }
233
+
234
+    // corriger un cas si frequent : www.example.org sans le http:// qui precede
235
+    if (
236
+        ($url = _request('url_site'))
237
+        && !tester_url_absolue($url)
238
+        && (!str_contains((string) $url, ':')
239
+        && strncasecmp((string) $url, 'www.', 4) === 0)
240
+    ) {
241
+        $url = 'http://' . $url;
242
+        set_request('url_site', $url);
243
+    }
244
+    // traiter les liens implicites avant de tester l'url
245
+    include_spip('inc/lien');
246
+    if (($url = calculer_url(_request('url_site'))) && !tester_url_absolue($url)) {
247
+        $erreurs['url_site'] = _T('info_url_site_pas_conforme');
248
+    }
249
+
250
+    $erreurs['message_erreur'] = '';
251
+    if (_request('login')) {
252
+        // on n'est jamais cense poster le name 'login'
253
+        $erreurs['login'] = _T('info_non_modifiable');
254
+    }
255
+    elseif (
256
+        ($login = _request('new_login')) && $login !== sql_getfetsel('login', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur)
257
+    ) {
258
+        // on verifie la meme chose que dans auteurs_edit_config()
259
+        if (
260
+            ! auth_autoriser_modifier_login($auth_methode)
261
+            || !autoriser('modifier', 'auteur', (int) $id_auteur, null, ['login' => true])
262
+            // legacy : ne pas risquer d'autoriser la modif login si fonction d'autorisation pas mise a jour et ne teste que l'option email
263
+            || !autoriser('modifier', 'auteur', (int) $id_auteur, null, ['email' => true])
264
+        ) {
265
+            $erreurs['login'] = _T('info_non_modifiable');
266
+        }
267
+    }
268
+
269
+    if (empty($erreurs['login'])) {
270
+        if ($err = auth_verifier_login($auth_methode, _request('new_login'), $id_auteur)) {
271
+            $erreurs['login'] = $err;
272
+            $erreurs['message_erreur'] .= $err;
273
+        } else {
274
+            // pass trop court ou confirmation non identique
275
+            if ($p = _request('new_pass')) {
276
+                if ($p != _request('new_pass2')) {
277
+                    $erreurs['new_pass'] = _T('info_passes_identiques');
278
+                    $erreurs['message_erreur'] .= _T('info_passes_identiques');
279
+                } elseif ($err = auth_verifier_pass($auth_methode, _request('new_login'), $p, $id_auteur)) {
280
+                    $erreurs['new_pass'] = $err;
281
+                    $erreurs['message_erreur'] .= $err;
282
+                }
283
+            }
284
+        }
285
+    }
286
+
287
+    if (!$erreurs['message_erreur']) {
288
+        unset($erreurs['message_erreur']);
289
+    }
290
+
291
+    return $erreurs;
292 292
 }
293 293
 
294 294
 
@@ -325,153 +325,153 @@  discard block
 block discarded – undo
325 325
  *     Retour des traitements
326 326
  **/
327 327
 function formulaires_editer_auteur_traiter_dist(
328
-	$id_auteur = 'new',
329
-	$retour = '',
330
-	$associer_objet = '',
331
-	$config_fonc = 'auteurs_edit_config',
332
-	$row = [],
333
-	$hidden = ''
328
+    $id_auteur = 'new',
329
+    $retour = '',
330
+    $associer_objet = '',
331
+    $config_fonc = 'auteurs_edit_config',
332
+    $row = [],
333
+    $hidden = ''
334 334
 ) {
335
-	if (_request('saisie_webmestre') || _request('webmestre')) {
336
-		set_request('webmestre', _request('webmestre') ?: 'non');
337
-	}
338
-
339
-	// si il y a des modifs sensibles (statut, mot de passe), on refuse le traitement en ajax
340
-	// le formulaire ne peut être traité depuis une XMLHttpRequest
341
-	$prev = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
342
-	if (
343
-		_request('new_pass') // nouveau mot de passe
344
-		|| empty($prev['statut']) // creation auteur
345
-		|| _request('email') && $prev['email'] !== _request('email') // modification email
346
-		|| _request('statut') === '0minirezo' && $prev['statut'] !== '0minirezo' // promotion 0minirezo
347
-		|| _request('statut') && (int) _request('statut') < (int) $prev['statut'] // promotion de statut
348
-		|| _request('webmestre') && _request('webmestre') !== 'non' && $prev['webmestre'] !== 'oui' // promotion webmestre
349
-	) {
350
-		refuser_traiter_formulaire_ajax();
351
-		// si on arrive là encore en ajax c'est pas OK, on genere une erreur
352
-		if (_AJAX || !empty($_SERVER['HTTP_X_REQUESTED_WITH'])) {
353
-			return [
354
-				'message_erreur' => _T('erreur_technique_ajaxform')
355
-			];
356
-		}
357
-	}
358
-
359
-	$id_objet = null;
360
-	$retour = parametre_url($retour, 'email_confirm', '');
361
-
362
-	if ($restreintes = _request('restreintes')) {
363
-		foreach ($restreintes as $k => $v) {
364
-			if (str_starts_with((string) $v, 'rubrique|')) {
365
-				$restreintes[$k] = substr((string) $v, 9);
366
-			}
367
-		}
368
-		set_request('restreintes', $restreintes);
369
-	}
370
-
371
-	set_request(
372
-		'email',
373
-		email_valide(_request('email'))
374
-	); // eviter d'enregistrer les cas qui sont acceptés par email_valide dans le verifier :
375
-	// "[email protected]  " ou encore "Marie Toto <[email protected]>"
376
-
377
-	include_spip('inc/autoriser');
378
-	if (!autoriser('modifier', 'auteur', $id_auteur, null, ['email' => '?'])) {
379
-		$email_nouveau = _request('email');
380
-		set_request('email'); // vider la saisie car l'auteur n'a pas le droit de modifier cet email
381
-		// mais si c'est son propre profil on lui envoie un email à l'adresse qu'il a indique
382
-		// pour qu'il confirme qu'il possede bien cette adresse
383
-		// son clic sur l'url du message permettre de confirmer le changement
384
-		// et de revenir sur son profil
385
-		if (
386
-			$GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
387
-			&& $email_nouveau != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur))
388
-		) {
389
-			$envoyer_mail = charger_fonction('envoyer_mail', 'inc');
390
-			$texte = _T(
391
-				'form_auteur_mail_confirmation',
392
-				[
393
-					'url' => generer_action_auteur(
394
-						'confirmer_email',
395
-						$email_nouveau,
396
-						parametre_url($retour, 'email_modif', 'ok')
397
-					)
398
-				]
399
-			);
400
-			$envoyer_mail($email_nouveau, _T('form_auteur_confirmation'), $texte);
401
-			set_request('email_confirm', $email_nouveau);
402
-			if ($email_ancien) {
403
-				$envoyer_mail(
404
-					$email_ancien,
405
-					_T('form_auteur_confirmation'),
406
-					_T('form_auteur_envoi_mail_confirmation', ['email' => $email_nouveau])
407
-				);
408
-			}
409
-			$retour = parametre_url($retour, 'email_confirm', $email_nouveau);
410
-		}
411
-	}
412
-
413
-	// Trafic de langue pour enregistrer la bonne
414
-	if ($langue = _request('langue')) {
415
-		set_request('lang', $langue);
416
-	}
417
-
418
-	$res = formulaires_editer_objet_traiter('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
419
-
420
-	if (_request('reset_password') && !(int) $id_auteur && (int) $res['id_auteur']) {
421
-		$erreurs = [];
422
-		$erreurs = auteur_reset_password($res['id_auteur'], $erreurs);
423
-		if (isset($erreurs['message_ok'])) {
424
-			if (!isset($res['message_ok'])) { $res['message_ok'] = '';
425
-			}
426
-			$res['message_ok'] = trim($res['message_ok'] . ' ' . $erreurs['message_ok']);
427
-		}
428
-		if (isset($erreurs['message_erreur']) && $erreurs['message_erreur']) {
429
-			if (!isset($res['message_erreur'])) { $res['message_erreur'] = '';
430
-			}
431
-			$res['message_erreur'] = trim($res['message_erreur'] . ' ' . $erreurs['message_erreur']);
432
-		}
433
-	}
434
-
435
-	// Un lien auteur a prendre en compte ?
436
-	if ($associer_objet && ($id_auteur = $res['id_auteur'])) {
437
-		$objet = '';
438
-		if ((int) $associer_objet) {
439
-			$objet = 'article';
440
-			$id_objet = (int) $associer_objet;
441
-		} elseif (preg_match(',^\w+\|\d+$,', $associer_objet)) {
442
-			[$objet, $id_objet] = explode('|', $associer_objet);
443
-		}
444
-		if ((bool) $objet && (bool) $id_objet && autoriser('modifier', $objet, $id_objet)) {
445
-			include_spip('action/editer_auteur');
446
-			auteur_associer($id_auteur, [$objet => $id_objet]);
447
-			if (isset($res['redirect'])) {
448
-				$res['redirect'] = parametre_url($res['redirect'], 'id_lien_ajoute', $id_auteur, '&');
449
-			}
450
-		}
451
-	}
452
-
453
-	return $res;
335
+    if (_request('saisie_webmestre') || _request('webmestre')) {
336
+        set_request('webmestre', _request('webmestre') ?: 'non');
337
+    }
338
+
339
+    // si il y a des modifs sensibles (statut, mot de passe), on refuse le traitement en ajax
340
+    // le formulaire ne peut être traité depuis une XMLHttpRequest
341
+    $prev = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
342
+    if (
343
+        _request('new_pass') // nouveau mot de passe
344
+        || empty($prev['statut']) // creation auteur
345
+        || _request('email') && $prev['email'] !== _request('email') // modification email
346
+        || _request('statut') === '0minirezo' && $prev['statut'] !== '0minirezo' // promotion 0minirezo
347
+        || _request('statut') && (int) _request('statut') < (int) $prev['statut'] // promotion de statut
348
+        || _request('webmestre') && _request('webmestre') !== 'non' && $prev['webmestre'] !== 'oui' // promotion webmestre
349
+    ) {
350
+        refuser_traiter_formulaire_ajax();
351
+        // si on arrive là encore en ajax c'est pas OK, on genere une erreur
352
+        if (_AJAX || !empty($_SERVER['HTTP_X_REQUESTED_WITH'])) {
353
+            return [
354
+                'message_erreur' => _T('erreur_technique_ajaxform')
355
+            ];
356
+        }
357
+    }
358
+
359
+    $id_objet = null;
360
+    $retour = parametre_url($retour, 'email_confirm', '');
361
+
362
+    if ($restreintes = _request('restreintes')) {
363
+        foreach ($restreintes as $k => $v) {
364
+            if (str_starts_with((string) $v, 'rubrique|')) {
365
+                $restreintes[$k] = substr((string) $v, 9);
366
+            }
367
+        }
368
+        set_request('restreintes', $restreintes);
369
+    }
370
+
371
+    set_request(
372
+        'email',
373
+        email_valide(_request('email'))
374
+    ); // eviter d'enregistrer les cas qui sont acceptés par email_valide dans le verifier :
375
+    // "[email protected]  " ou encore "Marie Toto <[email protected]>"
376
+
377
+    include_spip('inc/autoriser');
378
+    if (!autoriser('modifier', 'auteur', $id_auteur, null, ['email' => '?'])) {
379
+        $email_nouveau = _request('email');
380
+        set_request('email'); // vider la saisie car l'auteur n'a pas le droit de modifier cet email
381
+        // mais si c'est son propre profil on lui envoie un email à l'adresse qu'il a indique
382
+        // pour qu'il confirme qu'il possede bien cette adresse
383
+        // son clic sur l'url du message permettre de confirmer le changement
384
+        // et de revenir sur son profil
385
+        if (
386
+            $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
387
+            && $email_nouveau != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur))
388
+        ) {
389
+            $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
390
+            $texte = _T(
391
+                'form_auteur_mail_confirmation',
392
+                [
393
+                    'url' => generer_action_auteur(
394
+                        'confirmer_email',
395
+                        $email_nouveau,
396
+                        parametre_url($retour, 'email_modif', 'ok')
397
+                    )
398
+                ]
399
+            );
400
+            $envoyer_mail($email_nouveau, _T('form_auteur_confirmation'), $texte);
401
+            set_request('email_confirm', $email_nouveau);
402
+            if ($email_ancien) {
403
+                $envoyer_mail(
404
+                    $email_ancien,
405
+                    _T('form_auteur_confirmation'),
406
+                    _T('form_auteur_envoi_mail_confirmation', ['email' => $email_nouveau])
407
+                );
408
+            }
409
+            $retour = parametre_url($retour, 'email_confirm', $email_nouveau);
410
+        }
411
+    }
412
+
413
+    // Trafic de langue pour enregistrer la bonne
414
+    if ($langue = _request('langue')) {
415
+        set_request('lang', $langue);
416
+    }
417
+
418
+    $res = formulaires_editer_objet_traiter('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
419
+
420
+    if (_request('reset_password') && !(int) $id_auteur && (int) $res['id_auteur']) {
421
+        $erreurs = [];
422
+        $erreurs = auteur_reset_password($res['id_auteur'], $erreurs);
423
+        if (isset($erreurs['message_ok'])) {
424
+            if (!isset($res['message_ok'])) { $res['message_ok'] = '';
425
+            }
426
+            $res['message_ok'] = trim($res['message_ok'] . ' ' . $erreurs['message_ok']);
427
+        }
428
+        if (isset($erreurs['message_erreur']) && $erreurs['message_erreur']) {
429
+            if (!isset($res['message_erreur'])) { $res['message_erreur'] = '';
430
+            }
431
+            $res['message_erreur'] = trim($res['message_erreur'] . ' ' . $erreurs['message_erreur']);
432
+        }
433
+    }
434
+
435
+    // Un lien auteur a prendre en compte ?
436
+    if ($associer_objet && ($id_auteur = $res['id_auteur'])) {
437
+        $objet = '';
438
+        if ((int) $associer_objet) {
439
+            $objet = 'article';
440
+            $id_objet = (int) $associer_objet;
441
+        } elseif (preg_match(',^\w+\|\d+$,', $associer_objet)) {
442
+            [$objet, $id_objet] = explode('|', $associer_objet);
443
+        }
444
+        if ((bool) $objet && (bool) $id_objet && autoriser('modifier', $objet, $id_objet)) {
445
+            include_spip('action/editer_auteur');
446
+            auteur_associer($id_auteur, [$objet => $id_objet]);
447
+            if (isset($res['redirect'])) {
448
+                $res['redirect'] = parametre_url($res['redirect'], 'id_lien_ajoute', $id_auteur, '&');
449
+            }
450
+        }
451
+    }
452
+
453
+    return $res;
454 454
 }
455 455
 
456 456
 
457 457
 function auteur_reset_password($id_auteur, $erreurs = []) {
458
-	$auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur);
459
-	$config = auteurs_edit_config($auteur);
460
-
461
-	if ($config['edit_pass']) {
462
-		if ($email = auteur_regenerer_identifiants($id_auteur)) {
463
-			$erreurs['message_ok'] = _T('message_nouveaux_identifiants_ok', ['email' => $email]);
464
-			$erreurs['message_erreur'] = '';
465
-		} elseif ($email === false) {
466
-			$erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec_envoi');
467
-		} else {
468
-			$erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec');
469
-		}
470
-	} else {
471
-		$erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec');
472
-	}
473
-
474
-	return $erreurs;
458
+    $auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur);
459
+    $config = auteurs_edit_config($auteur);
460
+
461
+    if ($config['edit_pass']) {
462
+        if ($email = auteur_regenerer_identifiants($id_auteur)) {
463
+            $erreurs['message_ok'] = _T('message_nouveaux_identifiants_ok', ['email' => $email]);
464
+            $erreurs['message_erreur'] = '';
465
+        } elseif ($email === false) {
466
+            $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec_envoi');
467
+        } else {
468
+            $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec');
469
+        }
470
+    } else {
471
+        $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec');
472
+    }
473
+
474
+    return $erreurs;
475 475
 }
476 476
 
477 477
 /**
@@ -482,50 +482,50 @@  discard block
 block discarded – undo
482 482
  * @return string
483 483
  */
484 484
 function auteur_regenerer_identifiants($id_auteur, $notifier = true, $contexte = []) {
485
-	if ($id_auteur) {
486
-		$set = [];
487
-		include_spip('inc/access');
488
-		$set['pass'] = creer_pass_aleatoire(max(_PASS_LONGUEUR_MINI, 16));
489
-
490
-		include_spip('action/editer_auteur');
491
-		auteur_modifier($id_auteur, $set);
492
-
493
-		$row = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur);
494
-		include_spip('inc/filtres');
495
-		if (
496
-			$notifier
497
-			&& $row['email']
498
-			&& email_valide($row['email'])
499
-			&& trouver_fond($fond = 'modeles/mail_nouveaux_identifiants')
500
-		) {
501
-			// envoyer l'email avec login/pass
502
-			$c = [
503
-				'id_auteur' => $id_auteur,
504
-				'nom' => $row['nom'],
505
-				'mode' => $row['statut'],
506
-				'email' => $row['email'],
507
-				'pass' => $set['pass'],
508
-			];
509
-			// on merge avec les champs fournit en appel, qui sont passes au modele de notification donc
510
-			$contexte = array_merge($contexte, $c);
511
-			// si pas de langue explicitement demandee, prendre celle de l'auteur si on la connait, ou a defaut celle du site
512
-			// plutot que celle de l'admin qui vient de cliquer sur le bouton
513
-			if (!isset($contexte['lang']) || !$contexte['lang']) {
514
-				$contexte['lang'] = isset($row['lang']) && $row['lang']
515
-					? $row['lang']
516
-					: $GLOBALS['meta']['langue_site'];
517
-			}
518
-			lang_select($contexte['lang']);
519
-			$message = recuperer_fond($fond, $contexte);
520
-			include_spip('inc/notifications');
521
-			notifications_envoyer_mails($row['email'], $message);
522
-			lang_select();
523
-
524
-			return $row['email'];
525
-		}
526
-
527
-		return false;
528
-	}
529
-
530
-	return '';
485
+    if ($id_auteur) {
486
+        $set = [];
487
+        include_spip('inc/access');
488
+        $set['pass'] = creer_pass_aleatoire(max(_PASS_LONGUEUR_MINI, 16));
489
+
490
+        include_spip('action/editer_auteur');
491
+        auteur_modifier($id_auteur, $set);
492
+
493
+        $row = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur);
494
+        include_spip('inc/filtres');
495
+        if (
496
+            $notifier
497
+            && $row['email']
498
+            && email_valide($row['email'])
499
+            && trouver_fond($fond = 'modeles/mail_nouveaux_identifiants')
500
+        ) {
501
+            // envoyer l'email avec login/pass
502
+            $c = [
503
+                'id_auteur' => $id_auteur,
504
+                'nom' => $row['nom'],
505
+                'mode' => $row['statut'],
506
+                'email' => $row['email'],
507
+                'pass' => $set['pass'],
508
+            ];
509
+            // on merge avec les champs fournit en appel, qui sont passes au modele de notification donc
510
+            $contexte = array_merge($contexte, $c);
511
+            // si pas de langue explicitement demandee, prendre celle de l'auteur si on la connait, ou a defaut celle du site
512
+            // plutot que celle de l'admin qui vient de cliquer sur le bouton
513
+            if (!isset($contexte['lang']) || !$contexte['lang']) {
514
+                $contexte['lang'] = isset($row['lang']) && $row['lang']
515
+                    ? $row['lang']
516
+                    : $GLOBALS['meta']['langue_site'];
517
+            }
518
+            lang_select($contexte['lang']);
519
+            $message = recuperer_fond($fond, $contexte);
520
+            include_spip('inc/notifications');
521
+            notifications_envoyer_mails($row['email'], $message);
522
+            lang_select();
523
+
524
+            return $row['email'];
525
+        }
526
+
527
+        return false;
528
+    }
529
+
530
+    return '';
531 531
 }
Please login to merge, or discard this patch.
rector.php 1 patch
Indentation   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -17,16 +17,16 @@
 block discarded – undo
17 17
         __DIR__ . '/index.php',
18 18
     ]);
19 19
 
20
-	$rectorConfig->sets([
21
-		LevelSetList::UP_TO_PHP_81
22
-	]);
20
+    $rectorConfig->sets([
21
+        LevelSetList::UP_TO_PHP_81
22
+    ]);
23 23
 
24 24
     $rectorConfig->skip([
25 25
         __DIR__ . '/ecrire/lang',
26
-		FinalizePublicClassConstantRector::class,
27
-		NullToStrictStringFuncCallArgRector::class,
28
-		CountOnNullRector::class,
29
-		MixedTypeRector::class,
26
+        FinalizePublicClassConstantRector::class,
27
+        NullToStrictStringFuncCallArgRector::class,
28
+        CountOnNullRector::class,
29
+        MixedTypeRector::class,
30 30
     ]);
31 31
 
32 32
 };
Please login to merge, or discard this patch.
ecrire/public/fonctions.php 1 patch
Indentation   +373 added lines, -373 removed lines patch added patch discarded remove patch
@@ -22,7 +22,7 @@  discard block
 block discarded – undo
22 22
  **/
23 23
 
24 24
 if (!defined('_ECRIRE_INC_VERSION')) {
25
-	return;
25
+    return;
26 26
 }
27 27
 
28 28
 // public/interfaces definit des traitements sur les champs qui utilisent des fonctions de inc/texte
@@ -54,75 +54,75 @@  discard block
 block discarded – undo
54 54
  *     Introduction calculée
55 55
  **/
56 56
 function filtre_introduction_dist($descriptif, $texte, $longueur, $connect, $suite = null) {
57
-	// Si un descriptif est envoye, on l'utilise directement
58
-	if (strlen($descriptif)) {
59
-		return appliquer_traitement_champ($descriptif, 'introduction', '', [], $connect);
60
-	}
61
-
62
-	// De preference ce qui est marque <intro>...</intro>
63
-	$intro = '';
64
-	$texte = preg_replace(',(</?)intro>,i', "\\1intro>", $texte); // minuscules
65
-	while ($fin = strpos($texte, '</intro>')) {
66
-		$zone = substr($texte, 0, $fin);
67
-		$texte = substr($texte, $fin + strlen('</intro>'));
68
-		if (($deb = strpos($zone, '<intro>')) || str_starts_with($zone, '<intro>')) {
69
-			$zone = substr($zone, $deb + 7);
70
-		}
71
-		$intro .= $zone;
72
-	}
73
-
74
-	// [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut,
75
-	// qui inclus raccourcis et modeles
76
-	// un simple <articlexx> peut etre ensuite transforme en 1000 lignes ...
77
-	// par ailleurs le nettoyage des raccourcis ne tient pas compte
78
-	// des surcharges et enrichissement de propre
79
-	// couper doit se faire apres propre
80
-	//$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect);
81
-
82
-	// Cependant pour des questions de perfs on coupe quand meme, en prenant
83
-	// large et en se mefiant des tableaux #1323
84
-
85
-	if (strlen($intro)) {
86
-		$texte = $intro;
87
-	} else {
88
-		if (
89
-			!str_contains("\n" . $texte, "\n|")
90
-			&& strlen($texte) > 2.5 * $longueur
91
-		) {
92
-			if (str_contains($texte, '<multi')) {
93
-				$texte = extraire_multi($texte);
94
-			}
95
-			$texte = couper($texte, 2 * $longueur);
96
-		}
97
-	}
98
-
99
-	// ne pas tenir compte des notes
100
-	if ($notes = charger_fonction('notes', 'inc', true)) {
101
-		$notes('', 'empiler');
102
-	}
103
-	// Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable
104
-	// dans l'introduction.
105
-	$texte = supprime_img($texte, '');
106
-	$texte = appliquer_traitement_champ($texte, 'introduction', '', [], $connect);
107
-
108
-	if ($notes) {
109
-		$notes('', 'depiler');
110
-	}
111
-
112
-	if (is_null($suite) && defined('_INTRODUCTION_SUITE')) {
113
-		$suite = _INTRODUCTION_SUITE;
114
-	}
115
-	$texte = couper($texte, $longueur, $suite);
116
-	// comme on a coupe il faut repasser la typo (on a perdu les insecables)
117
-	$texte = typo($texte, true, $connect, []);
118
-
119
-	// et reparagrapher si necessaire (coherence avec le cas descriptif)
120
-	// une introduction a tojours un <p>
121
-	if ($GLOBALS['toujours_paragrapher']) { // Fermer les paragraphes
122
-	$texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']);
123
-	}
124
-
125
-	return $texte;
57
+    // Si un descriptif est envoye, on l'utilise directement
58
+    if (strlen($descriptif)) {
59
+        return appliquer_traitement_champ($descriptif, 'introduction', '', [], $connect);
60
+    }
61
+
62
+    // De preference ce qui est marque <intro>...</intro>
63
+    $intro = '';
64
+    $texte = preg_replace(',(</?)intro>,i', "\\1intro>", $texte); // minuscules
65
+    while ($fin = strpos($texte, '</intro>')) {
66
+        $zone = substr($texte, 0, $fin);
67
+        $texte = substr($texte, $fin + strlen('</intro>'));
68
+        if (($deb = strpos($zone, '<intro>')) || str_starts_with($zone, '<intro>')) {
69
+            $zone = substr($zone, $deb + 7);
70
+        }
71
+        $intro .= $zone;
72
+    }
73
+
74
+    // [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut,
75
+    // qui inclus raccourcis et modeles
76
+    // un simple <articlexx> peut etre ensuite transforme en 1000 lignes ...
77
+    // par ailleurs le nettoyage des raccourcis ne tient pas compte
78
+    // des surcharges et enrichissement de propre
79
+    // couper doit se faire apres propre
80
+    //$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect);
81
+
82
+    // Cependant pour des questions de perfs on coupe quand meme, en prenant
83
+    // large et en se mefiant des tableaux #1323
84
+
85
+    if (strlen($intro)) {
86
+        $texte = $intro;
87
+    } else {
88
+        if (
89
+            !str_contains("\n" . $texte, "\n|")
90
+            && strlen($texte) > 2.5 * $longueur
91
+        ) {
92
+            if (str_contains($texte, '<multi')) {
93
+                $texte = extraire_multi($texte);
94
+            }
95
+            $texte = couper($texte, 2 * $longueur);
96
+        }
97
+    }
98
+
99
+    // ne pas tenir compte des notes
100
+    if ($notes = charger_fonction('notes', 'inc', true)) {
101
+        $notes('', 'empiler');
102
+    }
103
+    // Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable
104
+    // dans l'introduction.
105
+    $texte = supprime_img($texte, '');
106
+    $texte = appliquer_traitement_champ($texte, 'introduction', '', [], $connect);
107
+
108
+    if ($notes) {
109
+        $notes('', 'depiler');
110
+    }
111
+
112
+    if (is_null($suite) && defined('_INTRODUCTION_SUITE')) {
113
+        $suite = _INTRODUCTION_SUITE;
114
+    }
115
+    $texte = couper($texte, $longueur, $suite);
116
+    // comme on a coupe il faut repasser la typo (on a perdu les insecables)
117
+    $texte = typo($texte, true, $connect, []);
118
+
119
+    // et reparagrapher si necessaire (coherence avec le cas descriptif)
120
+    // une introduction a tojours un <p>
121
+    if ($GLOBALS['toujours_paragrapher']) { // Fermer les paragraphes
122
+    $texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']);
123
+    }
124
+
125
+    return $texte;
126 126
 }
127 127
 
128 128
 
@@ -157,64 +157,64 @@  discard block
 block discarded – undo
157 157
  *     Code HTML de la pagination
158 158
  **/
159 159
 function filtre_pagination_dist(
160
-	$total,
161
-	$nom,
162
-	$position,
163
-	$pas,
164
-	$liste = true,
165
-	$modele = '',
166
-	string $connect = '',
167
-	$env = []
160
+    $total,
161
+    $nom,
162
+    $position,
163
+    $pas,
164
+    $liste = true,
165
+    $modele = '',
166
+    string $connect = '',
167
+    $env = []
168 168
 ) {
169
-	static $ancres = [];
170
-	if ($pas < 1) {
171
-		return '';
172
-	}
173
-	$ancre = 'pagination' . $nom; // #pagination_articles
174
-	$debut = 'debut' . $nom; // 'debut_articles'
175
-
176
-	// n'afficher l'ancre qu'une fois
177
-	$bloc_ancre = isset($ancres[$ancre]) ? '' : ($ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>");
178
-	// liste = false : on ne veut que l'ancre
179
-	if (!$liste) {
180
-		return $ancres[$ancre];
181
-	}
182
-
183
-	$self = (empty($env['self']) ? self() : $env['self']);
184
-	$pagination = [
185
-		'debut' => $debut,
186
-		'url' => parametre_url($self, 'fragment', ''), // nettoyer l'id ahah eventuel
187
-		'total' => $total,
188
-		'position' => (int) $position,
189
-		'pas' => $pas,
190
-		'nombre_pages' => floor(($total - 1) / $pas) + 1,
191
-		'page_courante' => floor((int) $position / $pas) + 1,
192
-		'ancre' => $ancre,
193
-		'bloc_ancre' => $bloc_ancre
194
-	];
195
-	if (is_array($env)) {
196
-		$pagination = array_merge($env, $pagination);
197
-	}
198
-
199
-	// Pas de pagination
200
-	if ($pagination['nombre_pages'] <= 1) {
201
-		return '';
202
-	}
203
-
204
-	if ($modele) {
205
-		$pagination['type_pagination'] = $modele;
206
-		$modele = trouver_fond('pagination_' . $modele, 'modeles') ? '_' . $modele : '';
207
-	}
208
-
209
-	if (!defined('_PAGINATION_NOMBRE_LIENS_MAX')) {
210
-		define('_PAGINATION_NOMBRE_LIENS_MAX', 10);
211
-	}
212
-	if (!defined('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE')) {
213
-		define('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE', 5);
214
-	}
215
-
216
-
217
-	return recuperer_fond("modeles/pagination$modele", $pagination, ['trim' => true], $connect);
169
+    static $ancres = [];
170
+    if ($pas < 1) {
171
+        return '';
172
+    }
173
+    $ancre = 'pagination' . $nom; // #pagination_articles
174
+    $debut = 'debut' . $nom; // 'debut_articles'
175
+
176
+    // n'afficher l'ancre qu'une fois
177
+    $bloc_ancre = isset($ancres[$ancre]) ? '' : ($ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>");
178
+    // liste = false : on ne veut que l'ancre
179
+    if (!$liste) {
180
+        return $ancres[$ancre];
181
+    }
182
+
183
+    $self = (empty($env['self']) ? self() : $env['self']);
184
+    $pagination = [
185
+        'debut' => $debut,
186
+        'url' => parametre_url($self, 'fragment', ''), // nettoyer l'id ahah eventuel
187
+        'total' => $total,
188
+        'position' => (int) $position,
189
+        'pas' => $pas,
190
+        'nombre_pages' => floor(($total - 1) / $pas) + 1,
191
+        'page_courante' => floor((int) $position / $pas) + 1,
192
+        'ancre' => $ancre,
193
+        'bloc_ancre' => $bloc_ancre
194
+    ];
195
+    if (is_array($env)) {
196
+        $pagination = array_merge($env, $pagination);
197
+    }
198
+
199
+    // Pas de pagination
200
+    if ($pagination['nombre_pages'] <= 1) {
201
+        return '';
202
+    }
203
+
204
+    if ($modele) {
205
+        $pagination['type_pagination'] = $modele;
206
+        $modele = trouver_fond('pagination_' . $modele, 'modeles') ? '_' . $modele : '';
207
+    }
208
+
209
+    if (!defined('_PAGINATION_NOMBRE_LIENS_MAX')) {
210
+        define('_PAGINATION_NOMBRE_LIENS_MAX', 10);
211
+    }
212
+    if (!defined('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE')) {
213
+        define('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE', 5);
214
+    }
215
+
216
+
217
+    return recuperer_fond("modeles/pagination$modele", $pagination, ['trim' => true], $connect);
218 218
 }
219 219
 
220 220
 
@@ -233,38 +233,38 @@  discard block
 block discarded – undo
233 233
  *     Liste (première page, dernière page).
234 234
  **/
235 235
 function filtre_bornes_pagination_dist($courante, $nombre, $max = 10) {
236
-	if ($max <= 0 || $max >= $nombre) {
237
-		return [1, $nombre];
238
-	}
239
-	if ($max <= 1) {
240
-		return [$courante, $courante];
241
-	}
242
-
243
-	$premiere = max(1, $courante - floor(($max - 1) / 2));
244
-	$derniere = min($nombre, $premiere + $max - 2);
245
-	$premiere = $derniere == $nombre ? $derniere - $max + 1 : $premiere;
246
-
247
-	return [$premiere, $derniere];
236
+    if ($max <= 0 || $max >= $nombre) {
237
+        return [1, $nombre];
238
+    }
239
+    if ($max <= 1) {
240
+        return [$courante, $courante];
241
+    }
242
+
243
+    $premiere = max(1, $courante - floor(($max - 1) / 2));
244
+    $derniere = min($nombre, $premiere + $max - 2);
245
+    $premiere = $derniere == $nombre ? $derniere - $max + 1 : $premiere;
246
+
247
+    return [$premiere, $derniere];
248 248
 }
249 249
 
250 250
 function filtre_pagination_affiche_texte_lien_page_dist($type_pagination, $numero_page, $rang_item) {
251
-	if ($numero_page === 'tous') {
252
-		return '&#8734;';
253
-	}
254
-	if ($numero_page === 'prev') {
255
-		return '&lt;';
256
-	}
257
-	if ($numero_page === 'next') {
258
-		return '&gt;';
259
-	}
260
-
261
-	return match ($type_pagination) {
262
-		'resultats' => $rang_item + 1, // 1 11 21 31...
263
-		'naturel' => $rang_item ?: 1, // 1 10 20 30...
264
-		'rang' => $rang_item, // 0 10 20 30...
265
-		'page', 'prive' => $numero_page, // 1 2 3 4 5...
266
-		default => $numero_page, // 1 2 3 4 5...
267
-	};
251
+    if ($numero_page === 'tous') {
252
+        return '&#8734;';
253
+    }
254
+    if ($numero_page === 'prev') {
255
+        return '&lt;';
256
+    }
257
+    if ($numero_page === 'next') {
258
+        return '&gt;';
259
+    }
260
+
261
+    return match ($type_pagination) {
262
+        'resultats' => $rang_item + 1, // 1 11 21 31...
263
+        'naturel' => $rang_item ?: 1, // 1 10 20 30...
264
+        'rang' => $rang_item, // 0 10 20 30...
265
+        'page', 'prive' => $numero_page, // 1 2 3 4 5...
266
+        default => $numero_page, // 1 2 3 4 5...
267
+    };
268 268
 }
269 269
 
270 270
 /**
@@ -277,15 +277,15 @@  discard block
 block discarded – undo
277 277
  **/
278 278
 function lister_objets_avec_logos($type) {
279 279
 
280
-	$objet = objet_type($type);
281
-	$ids = sql_allfetsel('L.id_objet', 'spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document', 'D.mode=' . sql_quote('logoon') . ' AND L.objet=' . sql_quote($objet));
282
-	if ($ids) {
283
-		$ids = array_column($ids, 'id_objet');
284
-		return implode(',', $ids);
285
-	}
286
-	else {
287
-		return '0';
288
-	}
280
+    $objet = objet_type($type);
281
+    $ids = sql_allfetsel('L.id_objet', 'spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document', 'D.mode=' . sql_quote('logoon') . ' AND L.objet=' . sql_quote($objet));
282
+    if ($ids) {
283
+        $ids = array_column($ids, 'id_objet');
284
+        return implode(',', $ids);
285
+    }
286
+    else {
287
+        return '0';
288
+    }
289 289
 }
290 290
 
291 291
 
@@ -301,14 +301,14 @@  discard block
 block discarded – undo
301 301
  *     Code HTML des notes
302 302
  **/
303 303
 function calculer_notes() {
304
-	$r = '';
305
-	if ($notes = charger_fonction('notes', 'inc', true)) {
306
-		$r = $notes([]);
307
-		$notes('', 'depiler');
308
-		$notes('', 'empiler');
309
-	}
310
-
311
-	return $r;
304
+    $r = '';
305
+    if ($notes = charger_fonction('notes', 'inc', true)) {
306
+        $r = $notes([]);
307
+        $notes('', 'depiler');
308
+        $notes('', 'empiler');
309
+    }
310
+
311
+    return $r;
312 312
 }
313 313
 
314 314
 
@@ -325,10 +325,10 @@  discard block
 block discarded – undo
325 325
  * @return string
326 326
  */
327 327
 function retrouver_rang_lien($objet_source, $ids, $objet_lie, $idl, $objet_lien) {
328
-	$res = lister_objets_liens($objet_source, $objet_lie, $idl, $objet_lien);
329
-	$res = array_column($res, 'rang_lien', $objet_source);
328
+    $res = lister_objets_liens($objet_source, $objet_lie, $idl, $objet_lien);
329
+    $res = array_column($res, 'rang_lien', $objet_source);
330 330
 
331
-	return ($res[$ids] ?? '');
331
+    return ($res[$ids] ?? '');
332 332
 }
333 333
 
334 334
 
@@ -345,19 +345,19 @@  discard block
 block discarded – undo
345 345
  * @private
346 346
  */
347 347
 function lister_objets_liens($objet_source, $objet, $id_objet, $objet_lien) {
348
-	static $liens = [];
349
-	if (!isset($liens["$objet_source-$objet-$id_objet-$objet_lien"])) {
350
-		include_spip('action/editer_liens');
351
-		// quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source
352
-		if ($objet_lien == $objet && $objet_lien !== $objet_source) {
353
-			$res = objet_trouver_liens([$objet => $id_objet], [$objet_source => '*']);
354
-		} else {
355
-			$res = objet_trouver_liens([$objet_source => '*'], [$objet => $id_objet]);
356
-		}
357
-
358
-		$liens["$objet_source-$objet-$id_objet-$objet_lien"] = $res;
359
-	}
360
-	return $liens["$objet_source-$objet-$id_objet-$objet_lien"];
348
+    static $liens = [];
349
+    if (!isset($liens["$objet_source-$objet-$id_objet-$objet_lien"])) {
350
+        include_spip('action/editer_liens');
351
+        // quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source
352
+        if ($objet_lien == $objet && $objet_lien !== $objet_source) {
353
+            $res = objet_trouver_liens([$objet => $id_objet], [$objet_source => '*']);
354
+        } else {
355
+            $res = objet_trouver_liens([$objet_source => '*'], [$objet => $id_objet]);
356
+        }
357
+
358
+        $liens["$objet_source-$objet-$id_objet-$objet_lien"] = $res;
359
+    }
360
+    return $liens["$objet_source-$objet-$id_objet-$objet_lien"];
361 361
 }
362 362
 
363 363
 /**
@@ -371,24 +371,24 @@  discard block
 block discarded – undo
371 371
  * @return int|string
372 372
  */
373 373
 function calculer_rang_smart($titre, $objet_source, $id, $env) {
374
-	// Cas du #RANG utilisé dans #FORMULAIRE_EDITER_LIENS -> attraper le rang du lien
375
-	// permet de voir le rang du lien si il y en a un en base, meme avant un squelette xxxx-lies.html ne gerant pas les liens
376
-	if (
377
-		isset($env['form']) && $env['form']
378
-		&& isset($env['_objet_lien']) && $env['_objet_lien']
379
-		&& (function_exists('lien_triables') || include_spip('action/editer_liens'))
380
-		&& ($r = objet_associable($env['_objet_lien']))
381
-		&& ([$p, $table_lien] = $r)
382
-		&& lien_triables($table_lien)
383
-		&& isset($env['objet']) && $env['objet']
384
-		&& isset($env['id_objet']) && $env['id_objet']
385
-		&& $objet_source
386
-		&& ($id = (int) $id)
387
-	) {
388
-		$rang = retrouver_rang_lien($objet_source, $id, $env['objet'], $env['id_objet'], $env['_objet_lien']);
389
-		return ($rang ?: '');
390
-	}
391
-	return recuperer_numero($titre);
374
+    // Cas du #RANG utilisé dans #FORMULAIRE_EDITER_LIENS -> attraper le rang du lien
375
+    // permet de voir le rang du lien si il y en a un en base, meme avant un squelette xxxx-lies.html ne gerant pas les liens
376
+    if (
377
+        isset($env['form']) && $env['form']
378
+        && isset($env['_objet_lien']) && $env['_objet_lien']
379
+        && (function_exists('lien_triables') || include_spip('action/editer_liens'))
380
+        && ($r = objet_associable($env['_objet_lien']))
381
+        && ([$p, $table_lien] = $r)
382
+        && lien_triables($table_lien)
383
+        && isset($env['objet']) && $env['objet']
384
+        && isset($env['id_objet']) && $env['id_objet']
385
+        && $objet_source
386
+        && ($id = (int) $id)
387
+    ) {
388
+        $rang = retrouver_rang_lien($objet_source, $id, $env['objet'], $env['id_objet'], $env['_objet_lien']);
389
+        return ($rang ?: '');
390
+    }
391
+    return recuperer_numero($titre);
392 392
 }
393 393
 
394 394
 /**
@@ -417,78 +417,78 @@  discard block
 block discarded – undo
417 417
  */
418 418
 function calculer_balise_tri(string $champ_ou_sens, string $libelle, string $classe, string $tri_nom, string $tri_champ, string $tri_sens, $liste_tri_sens_defaut, string $nom_pagination = ''): string {
419 419
 
420
-	$url = self('&');
421
-	$tri_sens = (int) $tri_sens;
422
-	$alias_sens = [
423
-		'<' => -1,
424
-		'>' => 1,
425
-		'inverse' => -1,
426
-	];
427
-
428
-	// Normaliser la liste des sens de tri par défaut
429
-	// On ajoute un jocker pour les champs non présents dans la liste
430
-	// avec la valeur du 1er item de la liste, idem critère {tri}
431
-	if (is_array($liste_tri_sens_defaut)) {
432
-		$liste_tri_sens_defaut['*'] = array_values($liste_tri_sens_defaut)[0];
433
-	} else {
434
-		$liste_tri_sens_defaut = [
435
-			'*' => (int) ($alias_sens[$liste_tri_sens_defaut] ?? $liste_tri_sens_defaut),
436
-		];
437
-	}
438
-
439
-	// Les sens de tri actuel et nouveau :
440
-	// Soit c'est un sens fixe donné en paramètre (< ou >)
441
-	$is_sens_fixe = array_key_exists($champ_ou_sens, $alias_sens);
442
-	if ($is_sens_fixe) {
443
-		$tri_sens_actuel = $tri_sens;
444
-		$tri_sens_nouveau = $alias_sens[$champ_ou_sens];
445
-	// Soit c'est le champ utilisé actuellement pour le tri → on inverse le sens
446
-	} elseif ($champ_ou_sens === $tri_champ) {
447
-		$tri_sens_actuel = $tri_sens;
448
-		$tri_sens_nouveau = $tri_sens * -1;
449
-	// Sinon c'est un nouveau champ, et on prend son tri par défaut
450
-	} else {
451
-		$tri_sens_actuel = $tri_sens_nouveau = (int) ($liste_tri_sens_defaut[$champ_ou_sens] ?? $liste_tri_sens_defaut['*']);
452
-	}
453
-
454
-	// URL : ajouter le champ sur lequel porte le tri
455
-	if (!$is_sens_fixe) {
456
-		$param_tri = "tri$tri_nom";
457
-		$url = parametre_url($url, $param_tri, $champ_ou_sens);
458
-	}
459
-
460
-	// URL : n'ajouter le sens de tri que si nécessaire,
461
-	// c.à.d différent du sens par défaut pour le champ
462
-	$param_sens = "sens$tri_nom";
463
-	$tri_sens_defaut_champ = (int) ($liste_tri_sens_defaut[$champ_ou_sens] ?? $liste_tri_sens_defaut['*']);
464
-	if ($tri_sens_nouveau !== $tri_sens_defaut_champ) {
465
-		$url = parametre_url($url, $param_sens, $tri_sens_nouveau);
466
-	} else {
467
-		$url = parametre_url($url, $param_sens, '');
468
-	}
469
-
470
-	// Drapeau pour garder en session ?
471
-	$param_memo = ($is_sens_fixe ? $param_sens : $param_tri);
472
-	$url = parametre_url($url, 'var_memotri', str_starts_with($tri_nom, 'session') ? $param_memo : '');
473
-
474
-	// Classes : on indique le sens de tri et l'item exposé
475
-	if (!$is_sens_fixe) {
476
-		$classe .= ' item-tri item-tri_' . ($tri_sens_actuel === 1 ? 'asc' : 'desc');
477
-	}
478
-	if ($champ_ou_sens === $tri_champ) {
479
-		$classe .= ' item-tri_actif';
480
-	}
481
-
482
-	// Si on n'est pas en mode "Tout afficher" de la pagination
483
-	if ($nom_pagination && parametre_url($url, 'debut' . $nom_pagination) !== '-1') {
484
-		// reset la pagination quand on change de mode ou de sens de tri
485
-		$url = parametre_url($url, 'debut' . $nom_pagination, '');
486
-	}
487
-
488
-	// Lien
489
-	$balise = lien_ou_expose($url, $libelle, false, $classe);
490
-
491
-	return $balise;
420
+    $url = self('&');
421
+    $tri_sens = (int) $tri_sens;
422
+    $alias_sens = [
423
+        '<' => -1,
424
+        '>' => 1,
425
+        'inverse' => -1,
426
+    ];
427
+
428
+    // Normaliser la liste des sens de tri par défaut
429
+    // On ajoute un jocker pour les champs non présents dans la liste
430
+    // avec la valeur du 1er item de la liste, idem critère {tri}
431
+    if (is_array($liste_tri_sens_defaut)) {
432
+        $liste_tri_sens_defaut['*'] = array_values($liste_tri_sens_defaut)[0];
433
+    } else {
434
+        $liste_tri_sens_defaut = [
435
+            '*' => (int) ($alias_sens[$liste_tri_sens_defaut] ?? $liste_tri_sens_defaut),
436
+        ];
437
+    }
438
+
439
+    // Les sens de tri actuel et nouveau :
440
+    // Soit c'est un sens fixe donné en paramètre (< ou >)
441
+    $is_sens_fixe = array_key_exists($champ_ou_sens, $alias_sens);
442
+    if ($is_sens_fixe) {
443
+        $tri_sens_actuel = $tri_sens;
444
+        $tri_sens_nouveau = $alias_sens[$champ_ou_sens];
445
+    // Soit c'est le champ utilisé actuellement pour le tri → on inverse le sens
446
+    } elseif ($champ_ou_sens === $tri_champ) {
447
+        $tri_sens_actuel = $tri_sens;
448
+        $tri_sens_nouveau = $tri_sens * -1;
449
+    // Sinon c'est un nouveau champ, et on prend son tri par défaut
450
+    } else {
451
+        $tri_sens_actuel = $tri_sens_nouveau = (int) ($liste_tri_sens_defaut[$champ_ou_sens] ?? $liste_tri_sens_defaut['*']);
452
+    }
453
+
454
+    // URL : ajouter le champ sur lequel porte le tri
455
+    if (!$is_sens_fixe) {
456
+        $param_tri = "tri$tri_nom";
457
+        $url = parametre_url($url, $param_tri, $champ_ou_sens);
458
+    }
459
+
460
+    // URL : n'ajouter le sens de tri que si nécessaire,
461
+    // c.à.d différent du sens par défaut pour le champ
462
+    $param_sens = "sens$tri_nom";
463
+    $tri_sens_defaut_champ = (int) ($liste_tri_sens_defaut[$champ_ou_sens] ?? $liste_tri_sens_defaut['*']);
464
+    if ($tri_sens_nouveau !== $tri_sens_defaut_champ) {
465
+        $url = parametre_url($url, $param_sens, $tri_sens_nouveau);
466
+    } else {
467
+        $url = parametre_url($url, $param_sens, '');
468
+    }
469
+
470
+    // Drapeau pour garder en session ?
471
+    $param_memo = ($is_sens_fixe ? $param_sens : $param_tri);
472
+    $url = parametre_url($url, 'var_memotri', str_starts_with($tri_nom, 'session') ? $param_memo : '');
473
+
474
+    // Classes : on indique le sens de tri et l'item exposé
475
+    if (!$is_sens_fixe) {
476
+        $classe .= ' item-tri item-tri_' . ($tri_sens_actuel === 1 ? 'asc' : 'desc');
477
+    }
478
+    if ($champ_ou_sens === $tri_champ) {
479
+        $classe .= ' item-tri_actif';
480
+    }
481
+
482
+    // Si on n'est pas en mode "Tout afficher" de la pagination
483
+    if ($nom_pagination && parametre_url($url, 'debut' . $nom_pagination) !== '-1') {
484
+        // reset la pagination quand on change de mode ou de sens de tri
485
+        $url = parametre_url($url, 'debut' . $nom_pagination, '');
486
+    }
487
+
488
+    // Lien
489
+    $balise = lien_ou_expose($url, $libelle, false, $classe);
490
+
491
+    return $balise;
492 492
 }
493 493
 
494 494
 
@@ -504,7 +504,7 @@  discard block
 block discarded – undo
504 504
  * @return string
505 505
  */
506 506
 function tri_protege_champ($t) {
507
-	return preg_replace(',[^\s\w.+\[\]],', '', $t);
507
+    return preg_replace(',[^\s\w.+\[\]],', '', $t);
508 508
 }
509 509
 
510 510
 /**
@@ -517,39 +517,39 @@  discard block
 block discarded – undo
517 517
  * @return string
518 518
  */
519 519
 function tri_champ_order($t, $from = null, $senstri = '') {
520
-	if (str_starts_with($t, 'multi ')) {
521
-		return 'multi' . $senstri;
522
-	}
523
-
524
-	$champ = $t;
525
-
526
-	$prefixe = '';
527
-	foreach (['num ', 'sinum '] as $p) {
528
-		if (str_starts_with($t, $p)) {
529
-			$champ = substr($t, strlen($p));
530
-			$prefixe = $p;
531
-		}
532
-	}
533
-
534
-	// enlever les autres espaces non evacues par tri_protege_champ
535
-	$champ = preg_replace(',\s,', '', $champ);
536
-
537
-	if (is_array($from)) {
538
-		$trouver_table = charger_fonction('trouver_table', 'base');
539
-		foreach ($from as $idt => $table_sql) {
540
-			if (
541
-				($desc = $trouver_table($table_sql)) && isset($desc['field'][$champ])
542
-			) {
543
-				$champ = "$idt.$champ";
544
-				break;
545
-			}
546
-		}
547
-	}
548
-	return match ($prefixe) {
549
-		'num ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}",
550
-		'sinum ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}",
551
-		default => $champ . $senstri,
552
-	};
520
+    if (str_starts_with($t, 'multi ')) {
521
+        return 'multi' . $senstri;
522
+    }
523
+
524
+    $champ = $t;
525
+
526
+    $prefixe = '';
527
+    foreach (['num ', 'sinum '] as $p) {
528
+        if (str_starts_with($t, $p)) {
529
+            $champ = substr($t, strlen($p));
530
+            $prefixe = $p;
531
+        }
532
+    }
533
+
534
+    // enlever les autres espaces non evacues par tri_protege_champ
535
+    $champ = preg_replace(',\s,', '', $champ);
536
+
537
+    if (is_array($from)) {
538
+        $trouver_table = charger_fonction('trouver_table', 'base');
539
+        foreach ($from as $idt => $table_sql) {
540
+            if (
541
+                ($desc = $trouver_table($table_sql)) && isset($desc['field'][$champ])
542
+            ) {
543
+                $champ = "$idt.$champ";
544
+                break;
545
+            }
546
+        }
547
+    }
548
+    return match ($prefixe) {
549
+        'num ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}",
550
+        'sinum ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}",
551
+        default => $champ . $senstri,
552
+    };
553 553
 }
554 554
 
555 555
 /**
@@ -563,17 +563,17 @@  discard block
 block discarded – undo
563 563
  * @return string
564 564
  */
565 565
 function tri_champ_select($t) {
566
-	if (str_starts_with($t, 'multi ')) {
567
-		$t = substr($t, 6);
568
-		$t = preg_replace(',\s,', '', $t);
566
+    if (str_starts_with($t, 'multi ')) {
567
+        $t = substr($t, 6);
568
+        $t = preg_replace(',\s,', '', $t);
569 569
 
570
-		return sql_multi($t, $GLOBALS['spip_lang']);
571
-	}
572
-	if (trim($t) == 'hasard') {
573
-		return 'rand() AS hasard';
574
-	}
570
+        return sql_multi($t, $GLOBALS['spip_lang']);
571
+    }
572
+    if (trim($t) == 'hasard') {
573
+        return 'rand() AS hasard';
574
+    }
575 575
 
576
-	return "''";
576
+    return "''";
577 577
 }
578 578
 
579 579
 /**
@@ -585,15 +585,15 @@  discard block
 block discarded – undo
585 585
  * @return string
586 586
  */
587 587
 function formate_liste_critere_par_ordre_liste($valeurs, $serveur = '') {
588
-	if (!is_array($valeurs)) {
589
-		return '';
590
-	}
591
-	$f = sql_serveur('quote', $serveur, true);
592
-	if (!is_string($f) || !$f) {
593
-		return '';
594
-	}
595
-
596
-	return implode(',', array_map($f, array_unique($valeurs)));
588
+    if (!is_array($valeurs)) {
589
+        return '';
590
+    }
591
+    $f = sql_serveur('quote', $serveur, true);
592
+    if (!is_string($f) || !$f) {
593
+        return '';
594
+    }
595
+
596
+    return implode(',', array_map($f, array_unique($valeurs)));
597 597
 }
598 598
 
599 599
 /**
@@ -616,22 +616,22 @@  discard block
 block discarded – undo
616 616
  *     Valeur $defaut sinon.
617 617
  **/
618 618
 function appliquer_filtre_sinon($arg, $filtre, $args, mixed $defaut = '') {
619
-	// Si c'est un filtre d'image, on utilise image_filtrer()
620
-	// Attention : les 2 premiers arguments sont inversés dans ce cas
621
-	if (trouver_filtre_matrice($filtre) && str_starts_with($filtre, 'image_')) {
622
-		include_spip('inc/filtres_images_lib_mini');
623
-		$args[1] = $args[0];
624
-		$args[0] = $filtre;
625
-		return image_graver(image_filtrer($args));
626
-	}
627
-
628
-	$f = chercher_filtre($filtre);
629
-	if (!$f) {
630
-		return $defaut;
631
-	}
632
-	array_shift($args); // enlever $arg
633
-	array_shift($args); // enlever $filtre
634
-	return $f($arg, ...$args);
619
+    // Si c'est un filtre d'image, on utilise image_filtrer()
620
+    // Attention : les 2 premiers arguments sont inversés dans ce cas
621
+    if (trouver_filtre_matrice($filtre) && str_starts_with($filtre, 'image_')) {
622
+        include_spip('inc/filtres_images_lib_mini');
623
+        $args[1] = $args[0];
624
+        $args[0] = $filtre;
625
+        return image_graver(image_filtrer($args));
626
+    }
627
+
628
+    $f = chercher_filtre($filtre);
629
+    if (!$f) {
630
+        return $defaut;
631
+    }
632
+    array_shift($args); // enlever $arg
633
+    array_shift($args); // enlever $filtre
634
+    return $f($arg, ...$args);
635 635
 }
636 636
 
637 637
 /**
@@ -641,30 +641,30 @@  discard block
 block discarded – undo
641 641
  * @return string
642 642
  */
643 643
 function filtre_styles_inline_page_login_pass_dist(&$Pile, ...$dummy) {
644
-	$styles = '';
645
-	include_spip('inc/config');
646
-	if ($couleur = lire_config('couleur_login')) {
647
-		include_spip('inc/filtres_images_mini');
648
-		$hs = couleur_hex_to_hsl($couleur, 'h, s');
649
-		$l = couleur_hex_to_hsl($couleur, 'l');
650
-		$styles .= ":root {--spip-login-color-theme--hs: {$hs};--spip-login-color-theme--l: {$l};}\n";
651
-	}
652
-	$logo_bg = _DIR_IMG . 'spip_fond_login.jpg';
653
-	if (file_exists($logo_bg)) {
654
-		include_spip('inc/filtres_images_mini');
655
-		$logo_mini = image_reduire($logo_bg, 64, 64);
656
-		$logo_mini = extraire_attribut($logo_mini, 'src');
657
-		$embarque_fichier = charger_filtre('embarque_fichier');
658
-		$logo_mini = $embarque_fichier($logo_mini);
659
-		$logo_bg = timestamp($logo_bg);
660
-		$styles .= ".page_login, .page_spip_pass {background-image:url($logo_bg), url($logo_mini);}\n";
661
-		$Pile[0]['body_class'] = 'fond_image';
662
-	}
663
-	else {
664
-		$Pile[0]['body_class'] = 'sans_fond';
665
-	}
666
-	if ($styles) {
667
-		$styles = "<style type='text/css'>$styles</style>";
668
-	}
669
-	return $styles;
644
+    $styles = '';
645
+    include_spip('inc/config');
646
+    if ($couleur = lire_config('couleur_login')) {
647
+        include_spip('inc/filtres_images_mini');
648
+        $hs = couleur_hex_to_hsl($couleur, 'h, s');
649
+        $l = couleur_hex_to_hsl($couleur, 'l');
650
+        $styles .= ":root {--spip-login-color-theme--hs: {$hs};--spip-login-color-theme--l: {$l};}\n";
651
+    }
652
+    $logo_bg = _DIR_IMG . 'spip_fond_login.jpg';
653
+    if (file_exists($logo_bg)) {
654
+        include_spip('inc/filtres_images_mini');
655
+        $logo_mini = image_reduire($logo_bg, 64, 64);
656
+        $logo_mini = extraire_attribut($logo_mini, 'src');
657
+        $embarque_fichier = charger_filtre('embarque_fichier');
658
+        $logo_mini = $embarque_fichier($logo_mini);
659
+        $logo_bg = timestamp($logo_bg);
660
+        $styles .= ".page_login, .page_spip_pass {background-image:url($logo_bg), url($logo_mini);}\n";
661
+        $Pile[0]['body_class'] = 'fond_image';
662
+    }
663
+    else {
664
+        $Pile[0]['body_class'] = 'sans_fond';
665
+    }
666
+    if ($styles) {
667
+        $styles = "<style type='text/css'>$styles</style>";
668
+    }
669
+    return $styles;
670 670
 }
Please login to merge, or discard this patch.