Completed
Push — master ( e0ed86...b3a07f )
by cam
01:17
created
ecrire/inc/auth.php 2 patches
Indentation   +447 added lines, -447 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 include_spip('base/abstract_sql');
@@ -35,33 +35,33 @@  discard block
 block discarded – undo
35 35
  *  - une chaîne vide si autorisation à pénétrer dans l'espace privé.
36 36
  */
37 37
 function inc_auth_dist() {
38
-	$row = auth_mode();
38
+    $row = auth_mode();
39 39
 
40
-	if ($row) {
41
-		return auth_init_droits($row);
42
-	}
40
+    if ($row) {
41
+        return auth_init_droits($row);
42
+    }
43 43
 
44
-	if (!$GLOBALS['connect_login']) {
45
-		return auth_a_loger();
46
-	}
44
+    if (!$GLOBALS['connect_login']) {
45
+        return auth_a_loger();
46
+    }
47 47
 
48
-	// Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui
49
-	// C'est soit parce que la base est inutilisable,
50
-	// soit parce que la table des auteurs a changee (restauration etc)
51
-	// Pas la peine d'insister.
52
-	// Renvoyer le nom fautif et une URL de remise a zero
48
+    // Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui
49
+    // C'est soit parce que la base est inutilisable,
50
+    // soit parce que la table des auteurs a changee (restauration etc)
51
+    // Pas la peine d'insister.
52
+    // Renvoyer le nom fautif et une URL de remise a zero
53 53
 
54
-	if (spip_connect()) {
55
-		return [
56
-			'login' => $GLOBALS['connect_login'],
57
-			'site' => generer_url_public('', 'action=logout&logout=prive')
58
-		];
59
-	}
54
+    if (spip_connect()) {
55
+        return [
56
+            'login' => $GLOBALS['connect_login'],
57
+            'site' => generer_url_public('', 'action=logout&logout=prive')
58
+        ];
59
+    }
60 60
 
61
-	$n = intval(sql_errno());
62
-	spip_log("Erreur base de donnees $n " . sql_error());
61
+    $n = intval(sql_errno());
62
+    spip_log("Erreur base de donnees $n " . sql_error());
63 63
 
64
-	return $n ?: 1;
64
+    return $n ?: 1;
65 65
 }
66 66
 
67 67
 /**
@@ -73,39 +73,39 @@  discard block
 block discarded – undo
73 73
  * @return array|string
74 74
  */
75 75
 function auth_echec($raison) {
76
-	include_spip('inc/minipres');
77
-	include_spip('inc/headers');
78
-	// pas authentifie. Pourquoi ?
79
-	if (is_string($raison)) {
80
-		// redirection vers une page d'authentification
81
-		// on ne revient pas de cette fonction
82
-		// sauf si pb de header
83
-		$raison = redirige_formulaire($raison);
84
-	} elseif (is_int($raison)) {
85
-		// erreur SQL a afficher
86
-		$raison = minipres(
87
-			_T('info_travaux_titre'),
88
-			_T('titre_probleme_technique') . '<p><tt>' . sql_errno() . ' ' . sql_error() . '</tt></p>'
89
-		);
90
-	} elseif (@$raison['statut']) {
91
-		// un simple visiteur n'a pas acces a l'espace prive
92
-		spip_log('connexion refusee a ' . @$raison['id_auteur']);
93
-		$raison = minipres(_T('avis_erreur_connexion'), _T('avis_erreur_visiteur'));
94
-	} else {
95
-		// auteur en fin de droits ...
96
-		$h = $raison['site'];
97
-		$raison = minipres(
98
-			_T('avis_erreur_connexion'),
99
-			'<br /><br /><p>'
100
-			. _T('texte_inc_auth_1', ['auth_login' => $raison['login']])
101
-			. " <a href='$h'>"
102
-			. _T('texte_inc_auth_2')
103
-			. '</a>'
104
-			. _T('texte_inc_auth_3')
105
-		);
106
-	}
107
-
108
-	return $raison;
76
+    include_spip('inc/minipres');
77
+    include_spip('inc/headers');
78
+    // pas authentifie. Pourquoi ?
79
+    if (is_string($raison)) {
80
+        // redirection vers une page d'authentification
81
+        // on ne revient pas de cette fonction
82
+        // sauf si pb de header
83
+        $raison = redirige_formulaire($raison);
84
+    } elseif (is_int($raison)) {
85
+        // erreur SQL a afficher
86
+        $raison = minipres(
87
+            _T('info_travaux_titre'),
88
+            _T('titre_probleme_technique') . '<p><tt>' . sql_errno() . ' ' . sql_error() . '</tt></p>'
89
+        );
90
+    } elseif (@$raison['statut']) {
91
+        // un simple visiteur n'a pas acces a l'espace prive
92
+        spip_log('connexion refusee a ' . @$raison['id_auteur']);
93
+        $raison = minipres(_T('avis_erreur_connexion'), _T('avis_erreur_visiteur'));
94
+    } else {
95
+        // auteur en fin de droits ...
96
+        $h = $raison['site'];
97
+        $raison = minipres(
98
+            _T('avis_erreur_connexion'),
99
+            '<br /><br /><p>'
100
+            . _T('texte_inc_auth_1', ['auth_login' => $raison['login']])
101
+            . " <a href='$h'>"
102
+            . _T('texte_inc_auth_2')
103
+            . '</a>'
104
+            . _T('texte_inc_auth_3')
105
+        );
106
+    }
107
+
108
+    return $raison;
109 109
 }
110 110
 
111 111
 /**
@@ -115,81 +115,81 @@  discard block
 block discarded – undo
115 115
  * @return array|bool|string
116 116
  */
117 117
 function auth_mode() {
118
-	//
119
-	// Initialiser variables (eviter hacks par URL)
120
-	//
121
-	$GLOBALS['connect_login'] = '';
122
-	$id_auteur = null;
123
-	$GLOBALS['auth_can_disconnect'] = false;
124
-
125
-	//
126
-	// Recuperer les donnees d'identification
127
-	//
128
-	include_spip('inc/session');
129
-	// Session valide en cours ?
130
-	if (isset($_COOKIE['spip_session'])) {
131
-		$session = charger_fonction('session', 'inc');
132
-		if (
133
-			$id_auteur = $session()
134
-			or $id_auteur === 0 // reprise sur restauration
135
-		) {
136
-			$GLOBALS['auth_can_disconnect'] = true;
137
-			$GLOBALS['connect_login'] = session_get('login');
138
-		} else {
139
-			unset($_COOKIE['spip_session']);
140
-		}
141
-	}
142
-
143
-	// Essayer auth http si significatif
144
-	// (ignorer les login d'intranet independants de spip)
145
-	if (!$GLOBALS['ignore_auth_http']) {
146
-		if (
147
-			(isset($_SERVER['PHP_AUTH_USER']) and isset($_SERVER['PHP_AUTH_PW'])
148
-				and $r = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))
149
-			or
150
-			// Si auth http differtente de basic, PHP_AUTH_PW
151
-			// est indisponible mais tentons quand meme pour
152
-			// autocreation via LDAP
153
-			(isset($_SERVER['REMOTE_USER'])
154
-				and $r = lire_php_auth($_SERVER['PHP_AUTH_USER'] = $_SERVER['REMOTE_USER'], ''))
155
-		) {
156
-			if (!$id_auteur) {
157
-				$_SERVER['PHP_AUTH_PW'] = '';
158
-				$GLOBALS['auth_can_disconnect'] = true;
159
-				$GLOBALS['visiteur_session'] = $r;
160
-				$GLOBALS['connect_login'] = session_get('login');
161
-				$id_auteur = $r['id_auteur'];
162
-			} else {
163
-				// cas de la session en plus de PHP_AUTH
164
-				/*				  if ($id_auteur != $r['id_auteur']){
118
+    //
119
+    // Initialiser variables (eviter hacks par URL)
120
+    //
121
+    $GLOBALS['connect_login'] = '';
122
+    $id_auteur = null;
123
+    $GLOBALS['auth_can_disconnect'] = false;
124
+
125
+    //
126
+    // Recuperer les donnees d'identification
127
+    //
128
+    include_spip('inc/session');
129
+    // Session valide en cours ?
130
+    if (isset($_COOKIE['spip_session'])) {
131
+        $session = charger_fonction('session', 'inc');
132
+        if (
133
+            $id_auteur = $session()
134
+            or $id_auteur === 0 // reprise sur restauration
135
+        ) {
136
+            $GLOBALS['auth_can_disconnect'] = true;
137
+            $GLOBALS['connect_login'] = session_get('login');
138
+        } else {
139
+            unset($_COOKIE['spip_session']);
140
+        }
141
+    }
142
+
143
+    // Essayer auth http si significatif
144
+    // (ignorer les login d'intranet independants de spip)
145
+    if (!$GLOBALS['ignore_auth_http']) {
146
+        if (
147
+            (isset($_SERVER['PHP_AUTH_USER']) and isset($_SERVER['PHP_AUTH_PW'])
148
+                and $r = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))
149
+            or
150
+            // Si auth http differtente de basic, PHP_AUTH_PW
151
+            // est indisponible mais tentons quand meme pour
152
+            // autocreation via LDAP
153
+            (isset($_SERVER['REMOTE_USER'])
154
+                and $r = lire_php_auth($_SERVER['PHP_AUTH_USER'] = $_SERVER['REMOTE_USER'], ''))
155
+        ) {
156
+            if (!$id_auteur) {
157
+                $_SERVER['PHP_AUTH_PW'] = '';
158
+                $GLOBALS['auth_can_disconnect'] = true;
159
+                $GLOBALS['visiteur_session'] = $r;
160
+                $GLOBALS['connect_login'] = session_get('login');
161
+                $id_auteur = $r['id_auteur'];
162
+            } else {
163
+                // cas de la session en plus de PHP_AUTH
164
+                /*				  if ($id_auteur != $r['id_auteur']){
165 165
 					spip_log("vol de session $id_auteur" . join(', ', $r));
166 166
 				unset($_COOKIE['spip_session']);
167 167
 				$id_auteur = '';
168 168
 				} */
169
-			}
170
-		} else {
171
-			// Authentification .htaccess old style, car .htaccess semble
172
-			// souvent definir *aussi* PHP_AUTH_USER et PHP_AUTH_PW
173
-			if (isset($_SERVER['REMOTE_USER'])) {
174
-				$GLOBALS['connect_login'] = $_SERVER['REMOTE_USER'];
175
-			}
176
-		}
177
-	}
178
-
179
-	$where = (is_numeric($id_auteur)
180
-		/*AND $id_auteur>0*/ // reprise lors des restaurations
181
-	) ?
182
-		"id_auteur=$id_auteur" :
183
-		(!strlen($GLOBALS['connect_login']) ? '' : 'login=' . sql_quote($GLOBALS['connect_login'], '', 'text'));
184
-
185
-	if (!$where) {
186
-		return '';
187
-	}
188
-
189
-	// Trouver les autres infos dans la table auteurs.
190
-	// le champ 'quand' est utilise par l'agenda
191
-
192
-	return sql_fetsel('*, en_ligne AS quand', 'spip_auteurs', "$where AND statut!='5poubelle'");
169
+            }
170
+        } else {
171
+            // Authentification .htaccess old style, car .htaccess semble
172
+            // souvent definir *aussi* PHP_AUTH_USER et PHP_AUTH_PW
173
+            if (isset($_SERVER['REMOTE_USER'])) {
174
+                $GLOBALS['connect_login'] = $_SERVER['REMOTE_USER'];
175
+            }
176
+        }
177
+    }
178
+
179
+    $where = (is_numeric($id_auteur)
180
+        /*AND $id_auteur>0*/ // reprise lors des restaurations
181
+    ) ?
182
+        "id_auteur=$id_auteur" :
183
+        (!strlen($GLOBALS['connect_login']) ? '' : 'login=' . sql_quote($GLOBALS['connect_login'], '', 'text'));
184
+
185
+    if (!$where) {
186
+        return '';
187
+    }
188
+
189
+    // Trouver les autres infos dans la table auteurs.
190
+    // le champ 'quand' est utilise par l'agenda
191
+
192
+    return sql_fetsel('*, en_ligne AS quand', 'spip_auteurs', "$where AND statut!='5poubelle'");
193 193
 }
194 194
 
195 195
 /**
@@ -207,86 +207,86 @@  discard block
 block discarded – undo
207 207
  */
208 208
 function auth_init_droits($row) {
209 209
 
210
-	include_spip('inc/autoriser');
211
-	if (!autoriser('loger', '', 0, $row)) {
212
-		return false;
213
-	}
214
-
215
-
216
-	if ($row['statut'] == 'nouveau') {
217
-		include_spip('action/inscrire_auteur');
218
-		$row = confirmer_statut_inscription($row);
219
-	}
220
-
221
-	$GLOBALS['connect_id_auteur'] = $row['id_auteur'];
222
-	$GLOBALS['connect_login'] = $row['login'];
223
-	$GLOBALS['connect_statut'] = $row['statut'];
224
-
225
-	$GLOBALS['visiteur_session'] = array_merge((array)$GLOBALS['visiteur_session'], $row);
226
-
227
-	// au cas ou : ne pas memoriser les champs sensibles
228
-	unset($GLOBALS['visiteur_session']['pass']);
229
-	unset($GLOBALS['visiteur_session']['htpass']);
230
-	unset($GLOBALS['visiteur_session']['alea_actuel']);
231
-	unset($GLOBALS['visiteur_session']['alea_futur']);
232
-	unset($GLOBALS['visiteur_session']['ldap_password']);
233
-
234
-	// creer la session au besoin
235
-	if (!isset($_COOKIE['spip_session'])) {
236
-		$session = charger_fonction('session', 'inc');
237
-		$spip_session = $session($row);
238
-	}
239
-
240
-	// reinjecter les preferences_auteur apres le reset de spip_session
241
-	// car utilisees au retour par auth_loger()
242
-	$r = @unserialize($row['prefs']);
243
-	$GLOBALS['visiteur_session']['prefs'] = ($r ?: []);
244
-	// si prefs pas definies, les definir par defaut
245
-	if (!isset($GLOBALS['visiteur_session']['prefs']['couleur'])) {
246
-		$GLOBALS['visiteur_session']['prefs']['couleur'] = 2;
247
-		$GLOBALS['visiteur_session']['prefs']['display'] = 2;
248
-		$GLOBALS['visiteur_session']['prefs']['display_navigation'] = 'navigation_avec_icones';
249
-		$GLOBALS['visiteur_session']['prefs']['display_outils'] = 'oui';
250
-	}
251
-
252
-	$GLOBALS['visiteur_session'] = pipeline(
253
-		'preparer_visiteur_session',
254
-		['args' => ['row' => $row],
255
-		'data' => $GLOBALS['visiteur_session']]
256
-	);
257
-
258
-	// Etablir les droits selon le codage attendu
259
-	// dans ecrire/index.php ecrire/prive.php
260
-
261
-	// Pas autorise a acceder a ecrire ? renvoyer le tableau
262
-	// A noter : le premier appel a autoriser() a le bon gout
263
-	// d'initialiser $GLOBALS['visiteur_session']['restreint'],
264
-	// qui ne figure pas dans le fichier de session
265
-
266
-	if (!autoriser('ecrire')) {
267
-		return $row;
268
-	}
269
-
270
-	// autoriser('ecrire') ne laisse passer que les Admin et les Redac
271
-
272
-	auth_trace($row);
273
-
274
-	// Administrateurs
275
-	if (in_array($GLOBALS['connect_statut'], explode(',', _STATUT_AUTEUR_RUBRIQUE))) {
276
-		if (
277
-			isset($GLOBALS['visiteur_session']['restreint'])
278
-			and is_array($GLOBALS['visiteur_session']['restreint'])
279
-		) {
280
-			$GLOBALS['connect_id_rubrique'] = $GLOBALS['visiteur_session']['restreint'];
281
-		}
282
-		if ($GLOBALS['connect_statut'] == '0minirezo') {
283
-			$GLOBALS['connect_toutes_rubriques'] = !$GLOBALS['connect_id_rubrique'];
284
-		}
285
-	}
286
-
287
-	// Pour les redacteurs, inc_version a fait l'initialisation minimale
288
-
289
-	return ''; // i.e. pas de pb.
210
+    include_spip('inc/autoriser');
211
+    if (!autoriser('loger', '', 0, $row)) {
212
+        return false;
213
+    }
214
+
215
+
216
+    if ($row['statut'] == 'nouveau') {
217
+        include_spip('action/inscrire_auteur');
218
+        $row = confirmer_statut_inscription($row);
219
+    }
220
+
221
+    $GLOBALS['connect_id_auteur'] = $row['id_auteur'];
222
+    $GLOBALS['connect_login'] = $row['login'];
223
+    $GLOBALS['connect_statut'] = $row['statut'];
224
+
225
+    $GLOBALS['visiteur_session'] = array_merge((array)$GLOBALS['visiteur_session'], $row);
226
+
227
+    // au cas ou : ne pas memoriser les champs sensibles
228
+    unset($GLOBALS['visiteur_session']['pass']);
229
+    unset($GLOBALS['visiteur_session']['htpass']);
230
+    unset($GLOBALS['visiteur_session']['alea_actuel']);
231
+    unset($GLOBALS['visiteur_session']['alea_futur']);
232
+    unset($GLOBALS['visiteur_session']['ldap_password']);
233
+
234
+    // creer la session au besoin
235
+    if (!isset($_COOKIE['spip_session'])) {
236
+        $session = charger_fonction('session', 'inc');
237
+        $spip_session = $session($row);
238
+    }
239
+
240
+    // reinjecter les preferences_auteur apres le reset de spip_session
241
+    // car utilisees au retour par auth_loger()
242
+    $r = @unserialize($row['prefs']);
243
+    $GLOBALS['visiteur_session']['prefs'] = ($r ?: []);
244
+    // si prefs pas definies, les definir par defaut
245
+    if (!isset($GLOBALS['visiteur_session']['prefs']['couleur'])) {
246
+        $GLOBALS['visiteur_session']['prefs']['couleur'] = 2;
247
+        $GLOBALS['visiteur_session']['prefs']['display'] = 2;
248
+        $GLOBALS['visiteur_session']['prefs']['display_navigation'] = 'navigation_avec_icones';
249
+        $GLOBALS['visiteur_session']['prefs']['display_outils'] = 'oui';
250
+    }
251
+
252
+    $GLOBALS['visiteur_session'] = pipeline(
253
+        'preparer_visiteur_session',
254
+        ['args' => ['row' => $row],
255
+        'data' => $GLOBALS['visiteur_session']]
256
+    );
257
+
258
+    // Etablir les droits selon le codage attendu
259
+    // dans ecrire/index.php ecrire/prive.php
260
+
261
+    // Pas autorise a acceder a ecrire ? renvoyer le tableau
262
+    // A noter : le premier appel a autoriser() a le bon gout
263
+    // d'initialiser $GLOBALS['visiteur_session']['restreint'],
264
+    // qui ne figure pas dans le fichier de session
265
+
266
+    if (!autoriser('ecrire')) {
267
+        return $row;
268
+    }
269
+
270
+    // autoriser('ecrire') ne laisse passer que les Admin et les Redac
271
+
272
+    auth_trace($row);
273
+
274
+    // Administrateurs
275
+    if (in_array($GLOBALS['connect_statut'], explode(',', _STATUT_AUTEUR_RUBRIQUE))) {
276
+        if (
277
+            isset($GLOBALS['visiteur_session']['restreint'])
278
+            and is_array($GLOBALS['visiteur_session']['restreint'])
279
+        ) {
280
+            $GLOBALS['connect_id_rubrique'] = $GLOBALS['visiteur_session']['restreint'];
281
+        }
282
+        if ($GLOBALS['connect_statut'] == '0minirezo') {
283
+            $GLOBALS['connect_toutes_rubriques'] = !$GLOBALS['connect_id_rubrique'];
284
+        }
285
+    }
286
+
287
+    // Pour les redacteurs, inc_version a fait l'initialisation minimale
288
+
289
+    return ''; // i.e. pas de pb.
290 290
 }
291 291
 
292 292
 /**
@@ -295,23 +295,23 @@  discard block
 block discarded – undo
295 295
  * @return string
296 296
  */
297 297
 function auth_a_loger() {
298
-	$redirect = generer_url_public('login', 'url=' . rawurlencode(self('&', true)), true);
299
-
300
-	// un echec au "bonjour" (login initial) quand le statut est
301
-	// inconnu signale sans doute un probleme de cookies
302
-	if (isset($_GET['bonjour'])) {
303
-		$redirect = parametre_url(
304
-			$redirect,
305
-			'var_erreur',
306
-			(!isset($GLOBALS['visiteur_session']['statut'])
307
-				? 'cookie'
308
-				: 'statut'
309
-			),
310
-			'&'
311
-		);
312
-	}
313
-
314
-	return $redirect;
298
+    $redirect = generer_url_public('login', 'url=' . rawurlencode(self('&', true)), true);
299
+
300
+    // un echec au "bonjour" (login initial) quand le statut est
301
+    // inconnu signale sans doute un probleme de cookies
302
+    if (isset($_GET['bonjour'])) {
303
+        $redirect = parametre_url(
304
+            $redirect,
305
+            'var_erreur',
306
+            (!isset($GLOBALS['visiteur_session']['statut'])
307
+                ? 'cookie'
308
+                : 'statut'
309
+            ),
310
+            '&'
311
+        );
312
+    }
313
+
314
+    return $redirect;
315 315
 }
316 316
 
317 317
 /**
@@ -323,19 +323,19 @@  discard block
 block discarded – undo
323 323
  * @param null|string $date
324 324
  */
325 325
 function auth_trace($row, $date = null) {
326
-	// Indiquer la connexion. A la minute pres ca suffit.
327
-	if (!is_numeric($connect_quand = $row['quand'] ?? '')) {
328
-		$connect_quand = strtotime($connect_quand);
329
-	}
326
+    // Indiquer la connexion. A la minute pres ca suffit.
327
+    if (!is_numeric($connect_quand = $row['quand'] ?? '')) {
328
+        $connect_quand = strtotime($connect_quand);
329
+    }
330 330
 
331
-	$date ??= date('Y-m-d H:i:s');
331
+    $date ??= date('Y-m-d H:i:s');
332 332
 
333
-	if (abs(strtotime($date) - $connect_quand) >= 60) {
334
-		sql_updateq('spip_auteurs', ['en_ligne' => $date], 'id_auteur=' . intval($row['id_auteur']));
335
-		$row['en_ligne'] = $date;
336
-	}
333
+    if (abs(strtotime($date) - $connect_quand) >= 60) {
334
+        sql_updateq('spip_auteurs', ['en_ligne' => $date], 'id_auteur=' . intval($row['id_auteur']));
335
+        $row['en_ligne'] = $date;
336
+    }
337 337
 
338
-	pipeline('trig_auth_trace', ['args' => ['row' => $row, 'date' => $date]]);
338
+    pipeline('trig_auth_trace', ['args' => ['row' => $row, 'date' => $date]]);
339 339
 }
340 340
 
341 341
 
@@ -361,28 +361,28 @@  discard block
 block discarded – undo
361 361
  * @return mixed
362 362
  */
363 363
 function auth_administrer($fonction, $args, $defaut = false) {
364
-	$auth_methode = array_shift($args);
365
-	$auth_methode = $auth_methode ?: 'spip'; // valeur par defaut au cas ou
366
-	if (
367
-		$auth = charger_fonction($auth_methode, 'auth', true)
368
-		and function_exists($f = "auth_{$auth_methode}_$fonction")
369
-	) {
370
-		$res = call_user_func_array($f, $args);
371
-	} else {
372
-		$res = $defaut;
373
-	}
374
-	$res = pipeline(
375
-		'auth_administrer',
376
-		[
377
-			'args' => [
378
-				'fonction' => $fonction,
379
-				'methode' => $auth_methode,
380
-				'args' => $args
381
-			],
382
-			'data' => $res
383
-		]
384
-	);
385
-	return $res;
364
+    $auth_methode = array_shift($args);
365
+    $auth_methode = $auth_methode ?: 'spip'; // valeur par defaut au cas ou
366
+    if (
367
+        $auth = charger_fonction($auth_methode, 'auth', true)
368
+        and function_exists($f = "auth_{$auth_methode}_$fonction")
369
+    ) {
370
+        $res = call_user_func_array($f, $args);
371
+    } else {
372
+        $res = $defaut;
373
+    }
374
+    $res = pipeline(
375
+        'auth_administrer',
376
+        [
377
+            'args' => [
378
+                'fonction' => $fonction,
379
+                'methode' => $auth_methode,
380
+                'args' => $args
381
+            ],
382
+            'data' => $res
383
+        ]
384
+    );
385
+    return $res;
386 386
 }
387 387
 
388 388
 /**
@@ -392,11 +392,11 @@  discard block
 block discarded – undo
392 392
  * @return array
393 393
  */
394 394
 function auth_formulaire_login($flux) {
395
-	foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
396
-		$flux = auth_administrer('formulaire_login', [$methode, $flux], $flux);
397
-	}
395
+    foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
396
+        $flux = auth_administrer('formulaire_login', [$methode, $flux], $flux);
397
+    }
398 398
 
399
-	return $flux;
399
+    return $flux;
400 400
 }
401 401
 
402 402
 
@@ -410,19 +410,19 @@  discard block
 block discarded – undo
410 410
  * @return string/bool
411 411
  */
412 412
 function auth_retrouver_login($login, $serveur = '') {
413
-	if (!spip_connect($serveur)) {
414
-		include_spip('inc/minipres');
415
-		echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'));
416
-		exit;
417
-	}
418
-
419
-	foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
420
-		if ($auteur = auth_administrer('retrouver_login', [$methode, $login, $serveur])) {
421
-			return $auteur;
422
-		}
423
-	}
424
-
425
-	return false;
413
+    if (!spip_connect($serveur)) {
414
+        include_spip('inc/minipres');
415
+        echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'));
416
+        exit;
417
+    }
418
+
419
+    foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
420
+        if ($auteur = auth_administrer('retrouver_login', [$methode, $login, $serveur])) {
421
+            return $auteur;
422
+        }
423
+    }
424
+
425
+    return false;
426 426
 }
427 427
 
428 428
 /**
@@ -437,52 +437,52 @@  discard block
 block discarded – undo
437 437
  * @return array
438 438
  */
439 439
 function auth_informer_login($login, $serveur = '') {
440
-	if (
441
-		!$login
442
-		or !$login_base = auth_retrouver_login($login, $serveur)
443
-		or !$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur)
444
-	) {
445
-		// generer de fausses infos, mais credibles, pour eviter une attaque
446
-		// https://core.spip.net/issues/1758 + https://core.spip.net/issues/3691
447
-		include_spip('inc/securiser_action');
448
-		$fauxalea1 = md5('fauxalea' . secret_du_site() . $login . floor(date('U') / 86400));
449
-		$fauxalea2 = md5('fauxalea' . secret_du_site() . $login . ceil(date('U') / 86400));
450
-
451
-		$row = [
452
-			'login' => $login,
453
-			'cnx' => '0',
454
-			'logo' => '',
455
-			'alea_actuel' => substr_replace($fauxalea1, '.', 24, 0),
456
-			'alea_futur' => substr_replace($fauxalea2, '.', 24, 0)
457
-		];
458
-
459
-		// permettre d'autoriser l'envoi de password non crypte lorsque
460
-		// l'auteur n'est pas (encore) declare dans SPIP, par exemple pour les cas
461
-		// de premiere authentification via SPIP a une autre application.
462
-		if (defined('_AUTORISER_AUTH_FAIBLE') and _AUTORISER_AUTH_FAIBLE) {
463
-			$row['alea_actuel'] = '';
464
-			$row['alea_futur'] = '';
465
-		}
466
-
467
-		return $row;
468
-	}
469
-
470
-	$prefs = @unserialize($row['prefs']);
471
-	$infos = [
472
-		'id_auteur' => $row['id_auteur'],
473
-		'login' => $row['login'],
474
-		'cnx' => (isset($prefs['cnx']) and $prefs['cnx'] === 'perma') ? '1' : '0',
475
-		'logo' => recuperer_fond('formulaires/inc-logo_auteur', $row),
476
-	];
477
-
478
-	// desactiver le hash md5 si pas auteur spip ?
479
-	if ($row['source'] !== 'spip') {
480
-		$row['alea_actuel'] = '';
481
-		$row['alea_futur'] = '';
482
-	}
483
-	verifier_visiteur();
484
-
485
-	return auth_administrer('informer_login', [$row['source'], $infos, $row, $serveur], $infos);
440
+    if (
441
+        !$login
442
+        or !$login_base = auth_retrouver_login($login, $serveur)
443
+        or !$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur)
444
+    ) {
445
+        // generer de fausses infos, mais credibles, pour eviter une attaque
446
+        // https://core.spip.net/issues/1758 + https://core.spip.net/issues/3691
447
+        include_spip('inc/securiser_action');
448
+        $fauxalea1 = md5('fauxalea' . secret_du_site() . $login . floor(date('U') / 86400));
449
+        $fauxalea2 = md5('fauxalea' . secret_du_site() . $login . ceil(date('U') / 86400));
450
+
451
+        $row = [
452
+            'login' => $login,
453
+            'cnx' => '0',
454
+            'logo' => '',
455
+            'alea_actuel' => substr_replace($fauxalea1, '.', 24, 0),
456
+            'alea_futur' => substr_replace($fauxalea2, '.', 24, 0)
457
+        ];
458
+
459
+        // permettre d'autoriser l'envoi de password non crypte lorsque
460
+        // l'auteur n'est pas (encore) declare dans SPIP, par exemple pour les cas
461
+        // de premiere authentification via SPIP a une autre application.
462
+        if (defined('_AUTORISER_AUTH_FAIBLE') and _AUTORISER_AUTH_FAIBLE) {
463
+            $row['alea_actuel'] = '';
464
+            $row['alea_futur'] = '';
465
+        }
466
+
467
+        return $row;
468
+    }
469
+
470
+    $prefs = @unserialize($row['prefs']);
471
+    $infos = [
472
+        'id_auteur' => $row['id_auteur'],
473
+        'login' => $row['login'],
474
+        'cnx' => (isset($prefs['cnx']) and $prefs['cnx'] === 'perma') ? '1' : '0',
475
+        'logo' => recuperer_fond('formulaires/inc-logo_auteur', $row),
476
+    ];
477
+
478
+    // desactiver le hash md5 si pas auteur spip ?
479
+    if ($row['source'] !== 'spip') {
480
+        $row['alea_actuel'] = '';
481
+        $row['alea_futur'] = '';
482
+    }
483
+    verifier_visiteur();
484
+
485
+    return auth_administrer('informer_login', [$row['source'], $infos, $row, $serveur], $infos);
486 486
 }
487 487
 
488 488
 
@@ -496,21 +496,21 @@  discard block
 block discarded – undo
496 496
  * @return mixed
497 497
  */
498 498
 function auth_identifier_login($login, $password, $serveur = '') {
499
-	$erreur = '';
500
-	foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
501
-		if ($auth = charger_fonction($methode, 'auth', true)) {
502
-			$auteur = $auth($login, $password, $serveur);
503
-			if (is_array($auteur) and count($auteur)) {
504
-				spip_log("connexion de $login par methode $methode");
505
-				$auteur['auth'] = $methode;
506
-				return $auteur;
507
-			} elseif (is_string($auteur)) {
508
-				$erreur .= "$auteur ";
509
-			}
510
-		}
511
-	}
512
-
513
-	return $erreur;
499
+    $erreur = '';
500
+    foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
501
+        if ($auth = charger_fonction($methode, 'auth', true)) {
502
+            $auteur = $auth($login, $password, $serveur);
503
+            if (is_array($auteur) and count($auteur)) {
504
+                spip_log("connexion de $login par methode $methode");
505
+                $auteur['auth'] = $methode;
506
+                return $auteur;
507
+            } elseif (is_string($auteur)) {
508
+                $erreur .= "$auteur ";
509
+            }
510
+        }
511
+    }
512
+
513
+    return $erreur;
514 514
 }
515 515
 
516 516
 /**
@@ -524,8 +524,8 @@  discard block
 block discarded – undo
524 524
  * @return string
525 525
  */
526 526
 function auth_url_retour_login($auth_methode, $login, $redirect = '', $serveur = '') {
527
-	$securiser_action = charger_fonction('securiser_action', 'inc');
528
-	return $securiser_action('auth', "$auth_methode/$login", $redirect, true);
527
+    $securiser_action = charger_fonction('securiser_action', 'inc');
528
+    return $securiser_action('auth', "$auth_methode/$login", $redirect, true);
529 529
 }
530 530
 
531 531
 /**
@@ -539,9 +539,9 @@  discard block
 block discarded – undo
539 539
  * @return mixed
540 540
  */
541 541
 function auth_terminer_identifier_login($auth_methode, $login, $serveur = '') {
542
-	$args = func_get_args();
543
-	$auteur = auth_administrer('terminer_identifier_login', $args);
544
-	return $auteur;
542
+    $args = func_get_args();
543
+    $auteur = auth_administrer('terminer_identifier_login', $args);
544
+    return $auteur;
545 545
 }
546 546
 
547 547
 /**
@@ -551,29 +551,29 @@  discard block
 block discarded – undo
551 551
  * @return bool
552 552
  */
553 553
 function auth_loger($auteur) {
554
-	if (!is_array($auteur) or !count($auteur)) {
555
-		return false;
556
-	}
557
-
558
-	// initialiser et poser le cookie de session
559
-	unset($_COOKIE['spip_session']);
560
-	if (auth_init_droits($auteur) === false) {
561
-		return false;
562
-	}
563
-
564
-	// initialiser les prefs
565
-	$p = $GLOBALS['visiteur_session']['prefs'];
566
-	$p['cnx'] = (isset($auteur['cookie']) and $auteur['cookie'] == 'oui') ? 'perma' : '';
567
-
568
-	sql_updateq(
569
-		'spip_auteurs',
570
-		['prefs' => serialize($p)],
571
-		'id_auteur=' . intval($auteur['id_auteur'])
572
-	);
573
-
574
-	//  bloquer ici le visiteur qui tente d'abuser de ses droits
575
-	verifier_visiteur();
576
-	return true;
554
+    if (!is_array($auteur) or !count($auteur)) {
555
+        return false;
556
+    }
557
+
558
+    // initialiser et poser le cookie de session
559
+    unset($_COOKIE['spip_session']);
560
+    if (auth_init_droits($auteur) === false) {
561
+        return false;
562
+    }
563
+
564
+    // initialiser les prefs
565
+    $p = $GLOBALS['visiteur_session']['prefs'];
566
+    $p['cnx'] = (isset($auteur['cookie']) and $auteur['cookie'] == 'oui') ? 'perma' : '';
567
+
568
+    sql_updateq(
569
+        'spip_auteurs',
570
+        ['prefs' => serialize($p)],
571
+        'id_auteur=' . intval($auteur['id_auteur'])
572
+    );
573
+
574
+    //  bloquer ici le visiteur qui tente d'abuser de ses droits
575
+    verifier_visiteur();
576
+    return true;
577 577
 }
578 578
 
579 579
 /**
@@ -583,8 +583,8 @@  discard block
 block discarded – undo
583 583
  * return void
584 584
  **/
585 585
 function auth_deloger() {
586
-	$logout = charger_fonction('logout', 'action');
587
-	$logout();
586
+    $logout = charger_fonction('logout', 'action');
587
+    $logout();
588 588
 }
589 589
 
590 590
 /**
@@ -598,8 +598,8 @@  discard block
 block discarded – undo
598 598
  * @return bool
599 599
  */
600 600
 function auth_autoriser_modifier_login($auth_methode, $serveur = '') {
601
-	$args = func_get_args();
602
-	return auth_administrer('autoriser_modifier_login', $args);
601
+    $args = func_get_args();
602
+    return auth_administrer('autoriser_modifier_login', $args);
603 603
 }
604 604
 
605 605
 /**
@@ -614,8 +614,8 @@  discard block
 block discarded – undo
614 614
  *  message d'erreur ou chaine vide si pas d'erreur
615 615
  */
616 616
 function auth_verifier_login($auth_methode, $new_login, $id_auteur = 0, $serveur = '') {
617
-	$args = func_get_args();
618
-	return auth_administrer('verifier_login', $args, '');
617
+    $args = func_get_args();
618
+    return auth_administrer('verifier_login', $args, '');
619 619
 }
620 620
 
621 621
 /**
@@ -628,8 +628,8 @@  discard block
 block discarded – undo
628 628
  * @return bool
629 629
  */
630 630
 function auth_modifier_login($auth_methode, $new_login, $id_auteur, $serveur = '') {
631
-	$args = func_get_args();
632
-	return auth_administrer('modifier_login', $args);
631
+    $args = func_get_args();
632
+    return auth_administrer('modifier_login', $args);
633 633
 }
634 634
 
635 635
 /**
@@ -644,8 +644,8 @@  discard block
 block discarded – undo
644 644
  *  succès ou échec
645 645
  */
646 646
 function auth_autoriser_modifier_pass($auth_methode, $serveur = '') {
647
-	$args = func_get_args();
648
-	return auth_administrer('autoriser_modifier_pass', $args);
647
+    $args = func_get_args();
648
+    return auth_administrer('autoriser_modifier_pass', $args);
649 649
 }
650 650
 
651 651
 /**
@@ -661,8 +661,8 @@  discard block
 block discarded – undo
661 661
  *  message d'erreur ou chaine vide si pas d'erreur
662 662
  */
663 663
 function auth_verifier_pass($auth_methode, $login, $new_pass, $id_auteur = 0, $serveur = '') {
664
-	$args = func_get_args();
665
-	return auth_administrer('verifier_pass', $args, '');
664
+    $args = func_get_args();
665
+    return auth_administrer('verifier_pass', $args, '');
666 666
 }
667 667
 
668 668
 /**
@@ -678,8 +678,8 @@  discard block
 block discarded – undo
678 678
  *  succes ou echec
679 679
  */
680 680
 function auth_modifier_pass($auth_methode, $login, $new_pass, $id_auteur, $serveur = '') {
681
-	$args = func_get_args();
682
-	return auth_administrer('modifier_pass', $args);
681
+    $args = func_get_args();
682
+    return auth_administrer('modifier_pass', $args);
683 683
 }
684 684
 
685 685
 /**
@@ -695,24 +695,24 @@  discard block
 block discarded – undo
695 695
  * @return void
696 696
  */
697 697
 function auth_synchroniser_distant(
698
-	$auth_methode = true,
699
-	$id_auteur = 0,
700
-	$champs = [],
701
-	$options = [],
702
-	$serveur = ''
698
+    $auth_methode = true,
699
+    $id_auteur = 0,
700
+    $champs = [],
701
+    $options = [],
702
+    $serveur = ''
703 703
 ) {
704
-	$args = func_get_args();
705
-	if ($auth_methode === true or (isset($options['all']) and $options['all'] == true)) {
706
-		$options['all'] = true; // ajouter une option all=>true pour chaque auth
707
-		$args = [true, $id_auteur, $champs, $options, $serveur];
708
-		foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
709
-			array_shift($args);
710
-			array_unshift($args, $methode);
711
-			auth_administrer('synchroniser_distant', $args);
712
-		}
713
-	} else {
714
-		auth_administrer('synchroniser_distant', $args);
715
-	}
704
+    $args = func_get_args();
705
+    if ($auth_methode === true or (isset($options['all']) and $options['all'] == true)) {
706
+        $options['all'] = true; // ajouter une option all=>true pour chaque auth
707
+        $args = [true, $id_auteur, $champs, $options, $serveur];
708
+        foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
709
+            array_shift($args);
710
+            array_unshift($args, $methode);
711
+            auth_administrer('synchroniser_distant', $args);
712
+        }
713
+    } else {
714
+        auth_administrer('synchroniser_distant', $args);
715
+    }
716 716
 }
717 717
 
718 718
 
@@ -725,44 +725,44 @@  discard block
 block discarded – undo
725 725
  * @return array|bool
726 726
  */
727 727
 function lire_php_auth($login, $pw, $serveur = '') {
728
-	if (
729
-		!$login
730
-		or !$login = auth_retrouver_login($login, $serveur)
731
-	) {
732
-		return false;
733
-	}
734
-
735
-	$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login, $serveur, 'text'), '', '', '', '', $serveur);
736
-
737
-	if (!$row) {
738
-		if (
739
-			spip_connect_ldap($serveur)
740
-			and $auth_ldap = charger_fonction('ldap', 'auth', true)
741
-		) {
742
-			return $auth_ldap($login, $pw, $serveur, true);
743
-		}
744
-
745
-		return false;
746
-	}
747
-	// su pas de source definie
748
-	// ou auth/xxx introuvable, utiliser 'spip'
749
-	if (
750
-		!$auth_methode = $row['source']
751
-		or !$auth = charger_fonction($auth_methode, 'auth', true)
752
-	) {
753
-		$auth = charger_fonction('spip', 'auth', true);
754
-	}
755
-
756
-	$auteur = '';
757
-	if ($auth) {
758
-		$auteur = $auth($login, $pw, $serveur, true);
759
-	}
760
-	// verifier que ce n'est pas un message d'erreur
761
-	if (is_array($auteur) and count($auteur)) {
762
-		return $auteur;
763
-	}
764
-
765
-	return false;
728
+    if (
729
+        !$login
730
+        or !$login = auth_retrouver_login($login, $serveur)
731
+    ) {
732
+        return false;
733
+    }
734
+
735
+    $row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login, $serveur, 'text'), '', '', '', '', $serveur);
736
+
737
+    if (!$row) {
738
+        if (
739
+            spip_connect_ldap($serveur)
740
+            and $auth_ldap = charger_fonction('ldap', 'auth', true)
741
+        ) {
742
+            return $auth_ldap($login, $pw, $serveur, true);
743
+        }
744
+
745
+        return false;
746
+    }
747
+    // su pas de source definie
748
+    // ou auth/xxx introuvable, utiliser 'spip'
749
+    if (
750
+        !$auth_methode = $row['source']
751
+        or !$auth = charger_fonction($auth_methode, 'auth', true)
752
+    ) {
753
+        $auth = charger_fonction('spip', 'auth', true);
754
+    }
755
+
756
+    $auteur = '';
757
+    if ($auth) {
758
+        $auteur = $auth($login, $pw, $serveur, true);
759
+    }
760
+    // verifier que ce n'est pas un message d'erreur
761
+    if (is_array($auteur) and count($auteur)) {
762
+        return $auteur;
763
+    }
764
+
765
+    return false;
766 766
 }
767 767
 
768 768
 /**
@@ -778,21 +778,21 @@  discard block
 block discarded – undo
778 778
  * @param string $lien
779 779
  */
780 780
 function ask_php_auth($pb, $raison, $retour = '', $url = '', $re = '', $lien = '') {
781
-	@Header('WWW-Authenticate: Basic realm="espace prive"');
782
-	@Header('HTTP/1.0 401 Unauthorized');
783
-	$corps = '';
784
-	$public = generer_url_public();
785
-	$ecrire = generer_url_ecrire();
786
-	$retour = $retour ?: _T('icone_retour');
787
-	$corps .= "<p>$raison</p>[<a href='$public'>$retour</a>] ";
788
-	if ($url) {
789
-		$corps .= "[<a href='" . generer_url_action('cookie', "essai_auth_http=oui&$url") . "'>$re</a>]";
790
-	}
791
-
792
-	if ($lien) {
793
-		$corps .= " [<a href='$ecrire'>" . _T('login_espace_prive') . '</a>]';
794
-	}
795
-	include_spip('inc/minipres');
796
-	echo minipres($pb, $corps);
797
-	exit;
781
+    @Header('WWW-Authenticate: Basic realm="espace prive"');
782
+    @Header('HTTP/1.0 401 Unauthorized');
783
+    $corps = '';
784
+    $public = generer_url_public();
785
+    $ecrire = generer_url_ecrire();
786
+    $retour = $retour ?: _T('icone_retour');
787
+    $corps .= "<p>$raison</p>[<a href='$public'>$retour</a>] ";
788
+    if ($url) {
789
+        $corps .= "[<a href='" . generer_url_action('cookie', "essai_auth_http=oui&$url") . "'>$re</a>]";
790
+    }
791
+
792
+    if ($lien) {
793
+        $corps .= " [<a href='$ecrire'>" . _T('login_espace_prive') . '</a>]';
794
+    }
795
+    include_spip('inc/minipres');
796
+    echo minipres($pb, $corps);
797
+    exit;
798 798
 }
Please login to merge, or discard this patch.
Spacing   +14 added lines, -15 removed lines patch added patch discarded remove patch
@@ -59,7 +59,7 @@  discard block
 block discarded – undo
59 59
 	}
60 60
 
61 61
 	$n = intval(sql_errno());
62
-	spip_log("Erreur base de donnees $n " . sql_error());
62
+	spip_log("Erreur base de donnees $n ".sql_error());
63 63
 
64 64
 	return $n ?: 1;
65 65
 }
@@ -85,11 +85,11 @@  discard block
 block discarded – undo
85 85
 		// erreur SQL a afficher
86 86
 		$raison = minipres(
87 87
 			_T('info_travaux_titre'),
88
-			_T('titre_probleme_technique') . '<p><tt>' . sql_errno() . ' ' . sql_error() . '</tt></p>'
88
+			_T('titre_probleme_technique').'<p><tt>'.sql_errno().' '.sql_error().'</tt></p>'
89 89
 		);
90 90
 	} elseif (@$raison['statut']) {
91 91
 		// un simple visiteur n'a pas acces a l'espace prive
92
-		spip_log('connexion refusee a ' . @$raison['id_auteur']);
92
+		spip_log('connexion refusee a '.@$raison['id_auteur']);
93 93
 		$raison = minipres(_T('avis_erreur_connexion'), _T('avis_erreur_visiteur'));
94 94
 	} else {
95 95
 		// auteur en fin de droits ...
@@ -179,8 +179,7 @@  discard block
 block discarded – undo
179 179
 	$where = (is_numeric($id_auteur)
180 180
 		/*AND $id_auteur>0*/ // reprise lors des restaurations
181 181
 	) ?
182
-		"id_auteur=$id_auteur" :
183
-		(!strlen($GLOBALS['connect_login']) ? '' : 'login=' . sql_quote($GLOBALS['connect_login'], '', 'text'));
182
+		"id_auteur=$id_auteur" : (!strlen($GLOBALS['connect_login']) ? '' : 'login='.sql_quote($GLOBALS['connect_login'], '', 'text'));
184 183
 
185 184
 	if (!$where) {
186 185
 		return '';
@@ -222,7 +221,7 @@  discard block
 block discarded – undo
222 221
 	$GLOBALS['connect_login'] = $row['login'];
223 222
 	$GLOBALS['connect_statut'] = $row['statut'];
224 223
 
225
-	$GLOBALS['visiteur_session'] = array_merge((array)$GLOBALS['visiteur_session'], $row);
224
+	$GLOBALS['visiteur_session'] = array_merge((array) $GLOBALS['visiteur_session'], $row);
226 225
 
227 226
 	// au cas ou : ne pas memoriser les champs sensibles
228 227
 	unset($GLOBALS['visiteur_session']['pass']);
@@ -295,7 +294,7 @@  discard block
 block discarded – undo
295 294
  * @return string
296 295
  */
297 296
 function auth_a_loger() {
298
-	$redirect = generer_url_public('login', 'url=' . rawurlencode(self('&', true)), true);
297
+	$redirect = generer_url_public('login', 'url='.rawurlencode(self('&', true)), true);
299 298
 
300 299
 	// un echec au "bonjour" (login initial) quand le statut est
301 300
 	// inconnu signale sans doute un probleme de cookies
@@ -331,7 +330,7 @@  discard block
 block discarded – undo
331 330
 	$date ??= date('Y-m-d H:i:s');
332 331
 
333 332
 	if (abs(strtotime($date) - $connect_quand) >= 60) {
334
-		sql_updateq('spip_auteurs', ['en_ligne' => $date], 'id_auteur=' . intval($row['id_auteur']));
333
+		sql_updateq('spip_auteurs', ['en_ligne' => $date], 'id_auteur='.intval($row['id_auteur']));
335 334
 		$row['en_ligne'] = $date;
336 335
 	}
337 336
 
@@ -440,13 +439,13 @@  discard block
 block discarded – undo
440 439
 	if (
441 440
 		!$login
442 441
 		or !$login_base = auth_retrouver_login($login, $serveur)
443
-		or !$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur)
442
+		or !$row = sql_fetsel('*', 'spip_auteurs', 'login='.sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur)
444 443
 	) {
445 444
 		// generer de fausses infos, mais credibles, pour eviter une attaque
446 445
 		// https://core.spip.net/issues/1758 + https://core.spip.net/issues/3691
447 446
 		include_spip('inc/securiser_action');
448
-		$fauxalea1 = md5('fauxalea' . secret_du_site() . $login . floor(date('U') / 86400));
449
-		$fauxalea2 = md5('fauxalea' . secret_du_site() . $login . ceil(date('U') / 86400));
447
+		$fauxalea1 = md5('fauxalea'.secret_du_site().$login.floor(date('U') / 86400));
448
+		$fauxalea2 = md5('fauxalea'.secret_du_site().$login.ceil(date('U') / 86400));
450 449
 
451 450
 		$row = [
452 451
 			'login' => $login,
@@ -568,7 +567,7 @@  discard block
 block discarded – undo
568 567
 	sql_updateq(
569 568
 		'spip_auteurs',
570 569
 		['prefs' => serialize($p)],
571
-		'id_auteur=' . intval($auteur['id_auteur'])
570
+		'id_auteur='.intval($auteur['id_auteur'])
572 571
 	);
573 572
 
574 573
 	//  bloquer ici le visiteur qui tente d'abuser de ses droits
@@ -732,7 +731,7 @@  discard block
 block discarded – undo
732 731
 		return false;
733 732
 	}
734 733
 
735
-	$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login, $serveur, 'text'), '', '', '', '', $serveur);
734
+	$row = sql_fetsel('*', 'spip_auteurs', 'login='.sql_quote($login, $serveur, 'text'), '', '', '', '', $serveur);
736 735
 
737 736
 	if (!$row) {
738 737
 		if (
@@ -786,11 +785,11 @@  discard block
 block discarded – undo
786 785
 	$retour = $retour ?: _T('icone_retour');
787 786
 	$corps .= "<p>$raison</p>[<a href='$public'>$retour</a>] ";
788 787
 	if ($url) {
789
-		$corps .= "[<a href='" . generer_url_action('cookie', "essai_auth_http=oui&$url") . "'>$re</a>]";
788
+		$corps .= "[<a href='".generer_url_action('cookie', "essai_auth_http=oui&$url")."'>$re</a>]";
790 789
 	}
791 790
 
792 791
 	if ($lien) {
793
-		$corps .= " [<a href='$ecrire'>" . _T('login_espace_prive') . '</a>]';
792
+		$corps .= " [<a href='$ecrire'>"._T('login_espace_prive').'</a>]';
794 793
 	}
795 794
 	include_spip('inc/minipres');
796 795
 	echo minipres($pb, $corps);
Please login to merge, or discard this patch.
ecrire/inc/cvt_configurer.php 1 patch
Indentation   +147 added lines, -147 removed lines patch added patch discarded remove patch
@@ -20,7 +20,7 @@  discard block
 block discarded – undo
20 20
  */
21 21
 
22 22
 if (!defined('_ECRIRE_INC_VERSION')) {
23
-	return;
23
+    return;
24 24
 }
25 25
 
26 26
 include_spip('inc/config');
@@ -32,31 +32,31 @@  discard block
 block discarded – undo
32 32
  * @return array|false
33 33
  */
34 34
 function cvtconf_formulaire_charger($flux) {
35
-	if (
36
-		$form = $flux['args']['form']
37
-		and strncmp($form, 'configurer_', 11) == 0 // un #FORMULAIRE_CONFIGURER_XXX
38
-	) {
39
-		// Pour tous les formulaires CONFIGURER, ayant une fonction charger ou pas, on teste si autorisé
40
-		include_spip('inc/autoriser');
41
-		if (!autoriser('configurer', '_' . substr($form, 11))) {
42
-			return false;
43
-		}
35
+    if (
36
+        $form = $flux['args']['form']
37
+        and strncmp($form, 'configurer_', 11) == 0 // un #FORMULAIRE_CONFIGURER_XXX
38
+    ) {
39
+        // Pour tous les formulaires CONFIGURER, ayant une fonction charger ou pas, on teste si autorisé
40
+        include_spip('inc/autoriser');
41
+        if (!autoriser('configurer', '_' . substr($form, 11))) {
42
+            return false;
43
+        }
44 44
 
45
-		// S'il n'y a pas de fonction charger(), on génère un contexte automatiquement
46
-		if (!charger_fonction('charger', "formulaires/$form/", true)) {
47
-			$flux['data'] = cvtconf_formulaires_configurer_recense($form);
48
-			$flux['data']['editable'] = true;
49
-			if (_request('var_mode') == 'configurer' and autoriser('webmestre')) {
50
-				if (!_AJAX) {
51
-					var_dump($flux['data']);
52
-				}
53
-				// reinjecter pour la trace au traitement
54
-				$flux['data']['_hidden'] = "<input type='hidden' name='var_mode' value='configurer' />";
55
-			}
56
-		}
57
-	}
45
+        // S'il n'y a pas de fonction charger(), on génère un contexte automatiquement
46
+        if (!charger_fonction('charger', "formulaires/$form/", true)) {
47
+            $flux['data'] = cvtconf_formulaires_configurer_recense($form);
48
+            $flux['data']['editable'] = true;
49
+            if (_request('var_mode') == 'configurer' and autoriser('webmestre')) {
50
+                if (!_AJAX) {
51
+                    var_dump($flux['data']);
52
+                }
53
+                // reinjecter pour la trace au traitement
54
+                $flux['data']['_hidden'] = "<input type='hidden' name='var_mode' value='configurer' />";
55
+            }
56
+        }
57
+    }
58 58
 
59
-	return $flux;
59
+    return $flux;
60 60
 }
61 61
 
62 62
 /**
@@ -66,16 +66,16 @@  discard block
 block discarded – undo
66 66
  * @return array
67 67
  */
68 68
 function cvtconf_formulaire_traiter($flux) {
69
-	if (
70
-		$form = $flux['args']['form']
71
-		and strncmp($form, 'configurer_', 11) == 0 // un #FORMULAIRE_CONFIGURER_XXX
72
-		and !charger_fonction('traiter', "formulaires/$form/", true) // sans fonction traiter()
73
-	) {
74
-		$trace = cvtconf_formulaires_configurer_enregistre($form, $flux['args']['args']);
75
-		$flux['data'] = ['message_ok' => _T('config_info_enregistree') . $trace, 'editable' => true];
76
-	}
69
+    if (
70
+        $form = $flux['args']['form']
71
+        and strncmp($form, 'configurer_', 11) == 0 // un #FORMULAIRE_CONFIGURER_XXX
72
+        and !charger_fonction('traiter', "formulaires/$form/", true) // sans fonction traiter()
73
+    ) {
74
+        $trace = cvtconf_formulaires_configurer_enregistre($form, $flux['args']['args']);
75
+        $flux['data'] = ['message_ok' => _T('config_info_enregistree') . $trace, 'editable' => true];
76
+    }
77 77
 
78
-	return $flux;
78
+    return $flux;
79 79
 }
80 80
 
81 81
 /**
@@ -91,32 +91,32 @@  discard block
 block discarded – undo
91 91
  * @return string
92 92
  */
93 93
 function cvtconf_formulaires_configurer_enregistre($form, $args) {
94
-	$valeurs = [];
95
-	// charger les valeurs
96
-	// ce qui permet de prendre en charge une fonction charger() existante
97
-	// qui prend alors la main sur l'auto detection
98
-	if ($charger_valeurs = charger_fonction('charger', "formulaires/$form/", true)) {
99
-		$valeurs = call_user_func_array($charger_valeurs, $args);
100
-	}
101
-	$valeurs = pipeline(
102
-		'formulaire_charger',
103
-		[
104
-			'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => false],
105
-			'data' => $valeurs
106
-		]
107
-	);
108
-	// ne pas stocker editable !
109
-	unset($valeurs['editable']);
94
+    $valeurs = [];
95
+    // charger les valeurs
96
+    // ce qui permet de prendre en charge une fonction charger() existante
97
+    // qui prend alors la main sur l'auto detection
98
+    if ($charger_valeurs = charger_fonction('charger', "formulaires/$form/", true)) {
99
+        $valeurs = call_user_func_array($charger_valeurs, $args);
100
+    }
101
+    $valeurs = pipeline(
102
+        'formulaire_charger',
103
+        [
104
+            'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => false],
105
+            'data' => $valeurs
106
+        ]
107
+    );
108
+    // ne pas stocker editable !
109
+    unset($valeurs['editable']);
110 110
 
111
-	// recuperer les valeurs postees
112
-	$store = [];
113
-	foreach ($valeurs as $k => $v) {
114
-		if (substr($k, 0, 1) !== '_') {
115
-			$store[$k] = _request($k);
116
-		}
117
-	}
111
+    // recuperer les valeurs postees
112
+    $store = [];
113
+    foreach ($valeurs as $k => $v) {
114
+        if (substr($k, 0, 1) !== '_') {
115
+            $store[$k] = _request($k);
116
+        }
117
+    }
118 118
 
119
-	return cvtconf_configurer_stocker($form, $valeurs, $store);
119
+    return cvtconf_configurer_stocker($form, $valeurs, $store);
120 120
 }
121 121
 
122 122
 /**
@@ -132,31 +132,31 @@  discard block
 block discarded – undo
132 132
  * @return array
133 133
  */
134 134
 function cvtconf_definir_configurer_conteneur($form, $valeurs) {
135
-	// stocker en base
136
-	// par defaut, dans un casier serialize dans spip_meta (idem CFG)
137
-	$casier = substr($form, 11);
138
-	$table = 'meta';
139
-	$prefixe = '';
140
-	$stockage = '';
135
+    // stocker en base
136
+    // par defaut, dans un casier serialize dans spip_meta (idem CFG)
137
+    $casier = substr($form, 11);
138
+    $table = 'meta';
139
+    $prefixe = '';
140
+    $stockage = '';
141 141
 
142
-	if (isset($valeurs['_meta_casier'])) {
143
-		$casier = $valeurs['_meta_casier'];
144
-	}
145
-	if (isset($valeurs['_meta_prefixe'])) {
146
-		$prefixe = $valeurs['_meta_prefixe'];
147
-	}
148
-	if (isset($valeurs['_meta_stockage'])) {
149
-		$stockage = $valeurs['_meta_stockage'] . '::';
150
-	}
142
+    if (isset($valeurs['_meta_casier'])) {
143
+        $casier = $valeurs['_meta_casier'];
144
+    }
145
+    if (isset($valeurs['_meta_prefixe'])) {
146
+        $prefixe = $valeurs['_meta_prefixe'];
147
+    }
148
+    if (isset($valeurs['_meta_stockage'])) {
149
+        $stockage = $valeurs['_meta_stockage'] . '::';
150
+    }
151 151
 
152
-	// si on indique juste une table, il faut vider les autres proprietes
153
-	// car par defaut on utilise ni casier ni prefixe dans ce cas
154
-	if (isset($valeurs['_meta_table'])) {
155
-		$table = $valeurs['_meta_table'];
156
-		$casier = ($valeurs['_meta_casier'] ?? '');
157
-	}
152
+    // si on indique juste une table, il faut vider les autres proprietes
153
+    // car par defaut on utilise ni casier ni prefixe dans ce cas
154
+    if (isset($valeurs['_meta_table'])) {
155
+        $table = $valeurs['_meta_table'];
156
+        $casier = ($valeurs['_meta_casier'] ?? '');
157
+    }
158 158
 
159
-	return [$table, $casier, $prefixe, $stockage];
159
+    return [$table, $casier, $prefixe, $stockage];
160 160
 }
161 161
 
162 162
 /**
@@ -167,48 +167,48 @@  discard block
 block discarded – undo
167 167
  * @return array
168 168
  */
169 169
 function cvtconf_formulaires_configurer_recense($form) {
170
-	$valeurs = ['editable' => ' '];
170
+    $valeurs = ['editable' => ' '];
171 171
 
172
-	// sinon cas analyse du squelette
173
-	if (
174
-		$f = find_in_path($form . '.' . _EXTENSION_SQUELETTES, 'formulaires/')
175
-		and lire_fichier($f, $contenu)
176
-	) {
177
-		for ($i = 0; $i < 2; $i++) {
178
-			// a la seconde iteration, evaluer le fond avec les valeurs deja trouvees
179
-			// permet de trouver aussi les name="#GET{truc}"
180
-			if ($i == 1) {
181
-				$contenu = recuperer_fond("formulaires/$form", $valeurs);
182
-			}
172
+    // sinon cas analyse du squelette
173
+    if (
174
+        $f = find_in_path($form . '.' . _EXTENSION_SQUELETTES, 'formulaires/')
175
+        and lire_fichier($f, $contenu)
176
+    ) {
177
+        for ($i = 0; $i < 2; $i++) {
178
+            // a la seconde iteration, evaluer le fond avec les valeurs deja trouvees
179
+            // permet de trouver aussi les name="#GET{truc}"
180
+            if ($i == 1) {
181
+                $contenu = recuperer_fond("formulaires/$form", $valeurs);
182
+            }
183 183
 
184
-			$balises = array_merge(
185
-				extraire_balises($contenu, 'input'),
186
-				extraire_balises($contenu, 'textarea'),
187
-				extraire_balises($contenu, 'select')
188
-			);
184
+            $balises = array_merge(
185
+                extraire_balises($contenu, 'input'),
186
+                extraire_balises($contenu, 'textarea'),
187
+                extraire_balises($contenu, 'select')
188
+            );
189 189
 
190
-			foreach ($balises as $b) {
191
-				if (
192
-					$n = extraire_attribut($b, 'name')
193
-					and preg_match(',^([\w\-]+)(\[\w*\])?$,', $n, $r)
194
-					and !in_array($n, ['formulaire_action', 'formulaire_action_args', 'formulaire_action_sign'])
195
-					and extraire_attribut($b, 'type') !== 'submit'
196
-				) {
197
-					$valeurs[$r[1]] = '';
198
-					// recuperer les valeurs _meta_xx qui peuvent etre fournies
199
-					// en input hidden dans le squelette
200
-					if (strncmp($r[1], '_meta_', 6) == 0) {
201
-						$valeurs[$r[1]] = extraire_attribut($b, 'value');
202
-					}
203
-				}
204
-			}
205
-		}
206
-	}
190
+            foreach ($balises as $b) {
191
+                if (
192
+                    $n = extraire_attribut($b, 'name')
193
+                    and preg_match(',^([\w\-]+)(\[\w*\])?$,', $n, $r)
194
+                    and !in_array($n, ['formulaire_action', 'formulaire_action_args', 'formulaire_action_sign'])
195
+                    and extraire_attribut($b, 'type') !== 'submit'
196
+                ) {
197
+                    $valeurs[$r[1]] = '';
198
+                    // recuperer les valeurs _meta_xx qui peuvent etre fournies
199
+                    // en input hidden dans le squelette
200
+                    if (strncmp($r[1], '_meta_', 6) == 0) {
201
+                        $valeurs[$r[1]] = extraire_attribut($b, 'value');
202
+                    }
203
+                }
204
+            }
205
+        }
206
+    }
207 207
 
208 208
 
209
-	cvtconf_configurer_lire_meta($form, $valeurs);
209
+    cvtconf_configurer_lire_meta($form, $valeurs);
210 210
 
211
-	return $valeurs;
211
+    return $valeurs;
212 212
 }
213 213
 
214 214
 /**
@@ -220,26 +220,26 @@  discard block
 block discarded – undo
220 220
  * @return string
221 221
  */
222 222
 function cvtconf_configurer_stocker($form, $valeurs, $store) {
223
-	$trace = '';
224
-	[$table, $casier, $prefixe, $stockage] = cvtconf_definir_configurer_conteneur($form, $valeurs);
225
-	// stocker en base
226
-	// par defaut, dans un casier serialize dans spip_meta (idem CFG)
227
-	if (!isset($GLOBALS[$table])) {
228
-		lire_metas($table);
229
-	}
223
+    $trace = '';
224
+    [$table, $casier, $prefixe, $stockage] = cvtconf_definir_configurer_conteneur($form, $valeurs);
225
+    // stocker en base
226
+    // par defaut, dans un casier serialize dans spip_meta (idem CFG)
227
+    if (!isset($GLOBALS[$table])) {
228
+        lire_metas($table);
229
+    }
230 230
 
231
-	$prefixe = ($prefixe ? $prefixe . '_' : '');
232
-	$table = ($table) ? "/$table/" : '';
233
-	$casier = ($casier) ? rtrim($casier, '/') . '/' : ''; // slash final, sinon rien
231
+    $prefixe = ($prefixe ? $prefixe . '_' : '');
232
+    $table = ($table) ? "/$table/" : '';
233
+    $casier = ($casier) ? rtrim($casier, '/') . '/' : ''; // slash final, sinon rien
234 234
 
235
-	foreach ($store as $k => $v) {
236
-		ecrire_config("$stockage$table$prefixe$casier$k", $v);
237
-		if (_request('var_mode') == 'configurer' and autoriser('webmestre')) {
238
-			$trace .= "<br />table $table : " . $prefixe . $k . " = $v;";
239
-		}
240
-	}
235
+    foreach ($store as $k => $v) {
236
+        ecrire_config("$stockage$table$prefixe$casier$k", $v);
237
+        if (_request('var_mode') == 'configurer' and autoriser('webmestre')) {
238
+            $trace .= "<br />table $table : " . $prefixe . $k . " = $v;";
239
+        }
240
+    }
241 241
 
242
-	return $trace;
242
+    return $trace;
243 243
 }
244 244
 
245 245
 /**
@@ -249,21 +249,21 @@  discard block
 block discarded – undo
249 249
  * @param array $valeurs
250 250
  */
251 251
 function cvtconf_configurer_lire_meta($form, &$valeurs) {
252
-	[$table, $casier, $prefixe, $stockage] = cvtconf_definir_configurer_conteneur($form, $valeurs);
252
+    [$table, $casier, $prefixe, $stockage] = cvtconf_definir_configurer_conteneur($form, $valeurs);
253 253
 
254
-	$table = ($table) ? "/$table/" : '';
255
-	$prefixe = ($prefixe ? $prefixe . '_' : '');
256
-	if ($casier) {
257
-		$meta = lire_config("$stockage$table$prefixe$casier");
258
-		$prefixe = '';
259
-	} else {
260
-		$table = rtrim($table, '/');
261
-		$meta = lire_config("$stockage$table");
262
-	}
254
+    $table = ($table) ? "/$table/" : '';
255
+    $prefixe = ($prefixe ? $prefixe . '_' : '');
256
+    if ($casier) {
257
+        $meta = lire_config("$stockage$table$prefixe$casier");
258
+        $prefixe = '';
259
+    } else {
260
+        $table = rtrim($table, '/');
261
+        $meta = lire_config("$stockage$table");
262
+    }
263 263
 
264
-	foreach ($valeurs as $k => $v) {
265
-		if (substr($k, 0, 1) !== '_') {
266
-			$valeurs[$k] = ($meta[$prefixe . $k] ?? null);
267
-		}
268
-	}
264
+    foreach ($valeurs as $k => $v) {
265
+        if (substr($k, 0, 1) !== '_') {
266
+            $valeurs[$k] = ($meta[$prefixe . $k] ?? null);
267
+        }
268
+    }
269 269
 }
Please login to merge, or discard this patch.
ecrire/inc/autoriser.php 1 patch
Indentation   +674 added lines, -674 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Autorisations
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 include_spip('base/abstract_sql');
@@ -38,84 +38,84 @@  discard block
 block discarded – undo
38 38
 
39 39
 
40 40
 if (!function_exists('autoriser')) {
41
-	/**
42
-	 * Autoriser une action
43
-	 *
44
-	 * Teste si une personne (par défaut le visiteur en cours) peut effectuer
45
-	 * une certaine action. Cette fonction est le point d'entrée de toutes
46
-	 * les autorisations.
47
-	 *
48
-	 * La fonction se charge d'appeler des fonctions d'autorisations spécifiques
49
-	 * aux actions demandées si elles existent. Elle cherche donc les fonctions
50
-	 * dans cet ordre :
51
-	 *
52
-	 * - autoriser_{type}_{faire}, sinon avec _dist
53
-	 * - autoriser_{type}, sinon avec _dist
54
-	 * - autoriser_{faire}, sinon avec _dist
55
-	 * - autoriser_{defaut}, sinon avec _dist
56
-	 *
57
-	 * Seul le premier argument est obligatoire.
58
-	 *
59
-	 * @note
60
-	 *     Le paramètre `$type` attend par défaut un type d'objet éditorial, et à ce titre,
61
-	 *     la valeur transmise se verra appliquer la fonction 'objet_type' pour uniformiser
62
-	 *     cette valeur.
63
-	 *
64
-	 *     Si ce paramètre n'a rien n'a voir avec un objet éditorial, par exemple
65
-	 *     'statistiques', un souligné avant le terme est ajouté afin d'indiquer
66
-	 *     explicitement à la fonction autoriser de ne pas transformer la chaîne en type
67
-	 *     d'objet. Cela donne pour cet exemple : `autoriser('detruire', '_statistiques')`
68
-	 *
69
-	 * @note
70
-	 *     Le paramètre `$type`, en plus de l'uniformisation en type d'objet, se voit retirer
71
-	 *     tous les soulignés du terme. Ainsi le type d'objet `livre_art` deviendra `livreart`
72
-	 *     et SPIP cherchera une fonction `autoriser_livreart_{faire}`. Ceci permet
73
-	 *     d'éviter une possible confusion si une fonction `autoriser_livre_art` existait :
74
-	 *     quel serait le type, quel serait l'action ?
75
-	 *
76
-	 *     Pour résumer, si le type d'objet éditorial a un souligné, tel que 'livre_art',
77
-	 *     la fonction d'autorisation correspondante ne l'aura pas.
78
-	 *     Exemple : `function autoriser_livreart_modifier_dist(...){...}`
79
-	 *
80
-	 * @api
81
-	 * @see autoriser_dist()
82
-	 *
83
-	 * @param string $faire
84
-	 *   une action ('modifier', 'publier'...)
85
-	 * @param string|null $type
86
-	 *   type d'objet ou nom de table ('article')
87
-	 * @param int $id
88
-	 *   id de l'objet sur lequel on veut agir
89
-	 *   Casté en int si différent.
90
-	 * @param null|int|array $qui
91
-	 *   - si null on prend alors visiteur_session
92
-	 *   - un id_auteur (on regarde dans la base)
93
-	 *   - un tableau auteur complet, y compris [restreint]
94
-	 * @param array $opt
95
-	 *   options sous forme de tableau associatif
96
-	 * @return bool
97
-	 *   true si la personne peut effectuer l'action
98
-	 */
99
-	function autoriser(string $faire, ?string $type = '', $id = 0, $qui = null, array $opt = []): bool {
100
-		// Charger les fonctions d'autorisation supplementaires
101
-		static $pipe;
102
-		if (!isset($pipe)) {
103
-			$pipe = 1;
104
-			pipeline('autoriser');
105
-		}
106
-
107
-		$args = func_get_args();
108
-
109
-		return call_user_func_array('autoriser_dist', $args);
110
-	}
41
+    /**
42
+     * Autoriser une action
43
+     *
44
+     * Teste si une personne (par défaut le visiteur en cours) peut effectuer
45
+     * une certaine action. Cette fonction est le point d'entrée de toutes
46
+     * les autorisations.
47
+     *
48
+     * La fonction se charge d'appeler des fonctions d'autorisations spécifiques
49
+     * aux actions demandées si elles existent. Elle cherche donc les fonctions
50
+     * dans cet ordre :
51
+     *
52
+     * - autoriser_{type}_{faire}, sinon avec _dist
53
+     * - autoriser_{type}, sinon avec _dist
54
+     * - autoriser_{faire}, sinon avec _dist
55
+     * - autoriser_{defaut}, sinon avec _dist
56
+     *
57
+     * Seul le premier argument est obligatoire.
58
+     *
59
+     * @note
60
+     *     Le paramètre `$type` attend par défaut un type d'objet éditorial, et à ce titre,
61
+     *     la valeur transmise se verra appliquer la fonction 'objet_type' pour uniformiser
62
+     *     cette valeur.
63
+     *
64
+     *     Si ce paramètre n'a rien n'a voir avec un objet éditorial, par exemple
65
+     *     'statistiques', un souligné avant le terme est ajouté afin d'indiquer
66
+     *     explicitement à la fonction autoriser de ne pas transformer la chaîne en type
67
+     *     d'objet. Cela donne pour cet exemple : `autoriser('detruire', '_statistiques')`
68
+     *
69
+     * @note
70
+     *     Le paramètre `$type`, en plus de l'uniformisation en type d'objet, se voit retirer
71
+     *     tous les soulignés du terme. Ainsi le type d'objet `livre_art` deviendra `livreart`
72
+     *     et SPIP cherchera une fonction `autoriser_livreart_{faire}`. Ceci permet
73
+     *     d'éviter une possible confusion si une fonction `autoriser_livre_art` existait :
74
+     *     quel serait le type, quel serait l'action ?
75
+     *
76
+     *     Pour résumer, si le type d'objet éditorial a un souligné, tel que 'livre_art',
77
+     *     la fonction d'autorisation correspondante ne l'aura pas.
78
+     *     Exemple : `function autoriser_livreart_modifier_dist(...){...}`
79
+     *
80
+     * @api
81
+     * @see autoriser_dist()
82
+     *
83
+     * @param string $faire
84
+     *   une action ('modifier', 'publier'...)
85
+     * @param string|null $type
86
+     *   type d'objet ou nom de table ('article')
87
+     * @param int $id
88
+     *   id de l'objet sur lequel on veut agir
89
+     *   Casté en int si différent.
90
+     * @param null|int|array $qui
91
+     *   - si null on prend alors visiteur_session
92
+     *   - un id_auteur (on regarde dans la base)
93
+     *   - un tableau auteur complet, y compris [restreint]
94
+     * @param array $opt
95
+     *   options sous forme de tableau associatif
96
+     * @return bool
97
+     *   true si la personne peut effectuer l'action
98
+     */
99
+    function autoriser(string $faire, ?string $type = '', $id = 0, $qui = null, array $opt = []): bool {
100
+        // Charger les fonctions d'autorisation supplementaires
101
+        static $pipe;
102
+        if (!isset($pipe)) {
103
+            $pipe = 1;
104
+            pipeline('autoriser');
105
+        }
106
+
107
+        $args = func_get_args();
108
+
109
+        return call_user_func_array('autoriser_dist', $args);
110
+    }
111 111
 }
112 112
 
113 113
 
114 114
 // mes_fonctions peut aussi declarer des autorisations, il faut donc le charger
115 115
 // mais apres la fonction autoriser()
116 116
 if ($f = find_in_path('mes_fonctions.php')) {
117
-	global $dossier_squelettes;
118
-	include_once(_ROOT_CWD . $f);
117
+    global $dossier_squelettes;
118
+    include_once(_ROOT_CWD . $f);
119 119
 }
120 120
 
121 121
 
@@ -144,84 +144,84 @@  discard block
 block discarded – undo
144 144
  */
145 145
 function autoriser_dist(string $faire, ?string $type = '', $id = 0, $qui = null, array $opt = []): bool {
146 146
 
147
-	$a = null;
148
-	// Tolérance avec certains appels de $id (null, '', 'new', 'oui').
149
-	$id = (int) $id;
150
-	if ($type === null) {
151
-		$type = '';
152
-	}
153
-
154
-	// Qui ? visiteur_session ?
155
-	// si null ou '' (appel depuis #AUTORISER) on prend l'auteur loge
156
-	if ($qui === null or $qui === '') {
157
-		$qui = $GLOBALS['visiteur_session'] ?: [];
158
-		$qui = array_merge(['statut' => '', 'id_auteur' => 0, 'webmestre' => 'non'], $qui);
159
-	} elseif (is_numeric($qui)) {
160
-		$qui = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . $qui);
161
-	}
162
-
163
-	// Admins restreints, on construit ici (pas generique mais...)
164
-	// le tableau de toutes leurs rubriques (y compris les sous-rubriques)
165
-	if (_ADMINS_RESTREINTS and is_array($qui)) {
166
-		$qui['restreint'] = isset($qui['id_auteur']) ? liste_rubriques_auteur($qui['id_auteur']) : [];
167
-	}
168
-
169
-	spip_log(
170
-		"autoriser $faire $type $id (" . ($qui['nom'] ?? '') . ') ?',
171
-		'autoriser' . _LOG_DEBUG
172
-	);
173
-
174
-	// passer par objet_type pour avoir les alias
175
-	// sauf si _ est le premier caractère.
176
-	if ($type and $type[0] !== '_') {
177
-		$type = objet_type($type, false);
178
-	}
179
-	// et supprimer les _
180
-	$type = str_replace('_', '', (string) $type);
181
-
182
-	// Si une exception a ete decretee plus haut dans le code, l'appliquer
183
-	if (
184
-		(isset($GLOBALS['autoriser_exception'][$faire][$type][$id]) and autoriser_exception($faire, $type, $id, 'verifier'))
185
-		or (isset($GLOBALS['autoriser_exception'][$faire][$type]['*']) and autoriser_exception($faire, $type, '*', 'verifier'))
186
-	) {
187
-		spip_log("autoriser ($faire, $type, $id, " . ($qui['nom'] ?? '') . ') : OK Exception', 'autoriser' . _LOG_DEBUG);
188
-		return true;
189
-	}
190
-
191
-	// Chercher une fonction d'autorisation
192
-	// Dans l'ordre on va chercher autoriser_type_faire[_dist], autoriser_type[_dist],
193
-	// autoriser_faire[_dist], autoriser_defaut[_dist]
194
-	$fonctions = $type
195
-		? [
196
-			'autoriser_' . $type . '_' . $faire,
197
-			'autoriser_' . $type . '_' . $faire . '_dist',
198
-			'autoriser_' . $type,
199
-			'autoriser_' . $type . '_dist',
200
-			'autoriser_' . $faire,
201
-			'autoriser_' . $faire . '_dist',
202
-			'autoriser_defaut',
203
-			'autoriser_defaut_dist'
204
-		]
205
-		: [
206
-			'autoriser_' . $faire,
207
-			'autoriser_' . $faire . '_dist',
208
-			'autoriser_defaut',
209
-			'autoriser_defaut_dist'
210
-		];
211
-
212
-	foreach ($fonctions as $f) {
213
-		if (function_exists($f)) {
214
-			$a = $f($faire, $type, $id, $qui, $opt);
215
-			break;
216
-		}
217
-	}
218
-
219
-	spip_log(
220
-		"$f($faire, $type, $id, " . ($qui['nom'] ?? '') . ') : ' . ($a ? 'OK' : 'niet'),
221
-		'autoriser' . _LOG_DEBUG
222
-	);
223
-
224
-	return $a;
147
+    $a = null;
148
+    // Tolérance avec certains appels de $id (null, '', 'new', 'oui').
149
+    $id = (int) $id;
150
+    if ($type === null) {
151
+        $type = '';
152
+    }
153
+
154
+    // Qui ? visiteur_session ?
155
+    // si null ou '' (appel depuis #AUTORISER) on prend l'auteur loge
156
+    if ($qui === null or $qui === '') {
157
+        $qui = $GLOBALS['visiteur_session'] ?: [];
158
+        $qui = array_merge(['statut' => '', 'id_auteur' => 0, 'webmestre' => 'non'], $qui);
159
+    } elseif (is_numeric($qui)) {
160
+        $qui = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . $qui);
161
+    }
162
+
163
+    // Admins restreints, on construit ici (pas generique mais...)
164
+    // le tableau de toutes leurs rubriques (y compris les sous-rubriques)
165
+    if (_ADMINS_RESTREINTS and is_array($qui)) {
166
+        $qui['restreint'] = isset($qui['id_auteur']) ? liste_rubriques_auteur($qui['id_auteur']) : [];
167
+    }
168
+
169
+    spip_log(
170
+        "autoriser $faire $type $id (" . ($qui['nom'] ?? '') . ') ?',
171
+        'autoriser' . _LOG_DEBUG
172
+    );
173
+
174
+    // passer par objet_type pour avoir les alias
175
+    // sauf si _ est le premier caractère.
176
+    if ($type and $type[0] !== '_') {
177
+        $type = objet_type($type, false);
178
+    }
179
+    // et supprimer les _
180
+    $type = str_replace('_', '', (string) $type);
181
+
182
+    // Si une exception a ete decretee plus haut dans le code, l'appliquer
183
+    if (
184
+        (isset($GLOBALS['autoriser_exception'][$faire][$type][$id]) and autoriser_exception($faire, $type, $id, 'verifier'))
185
+        or (isset($GLOBALS['autoriser_exception'][$faire][$type]['*']) and autoriser_exception($faire, $type, '*', 'verifier'))
186
+    ) {
187
+        spip_log("autoriser ($faire, $type, $id, " . ($qui['nom'] ?? '') . ') : OK Exception', 'autoriser' . _LOG_DEBUG);
188
+        return true;
189
+    }
190
+
191
+    // Chercher une fonction d'autorisation
192
+    // Dans l'ordre on va chercher autoriser_type_faire[_dist], autoriser_type[_dist],
193
+    // autoriser_faire[_dist], autoriser_defaut[_dist]
194
+    $fonctions = $type
195
+        ? [
196
+            'autoriser_' . $type . '_' . $faire,
197
+            'autoriser_' . $type . '_' . $faire . '_dist',
198
+            'autoriser_' . $type,
199
+            'autoriser_' . $type . '_dist',
200
+            'autoriser_' . $faire,
201
+            'autoriser_' . $faire . '_dist',
202
+            'autoriser_defaut',
203
+            'autoriser_defaut_dist'
204
+        ]
205
+        : [
206
+            'autoriser_' . $faire,
207
+            'autoriser_' . $faire . '_dist',
208
+            'autoriser_defaut',
209
+            'autoriser_defaut_dist'
210
+        ];
211
+
212
+    foreach ($fonctions as $f) {
213
+        if (function_exists($f)) {
214
+            $a = $f($faire, $type, $id, $qui, $opt);
215
+            break;
216
+        }
217
+    }
218
+
219
+    spip_log(
220
+        "$f($faire, $type, $id, " . ($qui['nom'] ?? '') . ') : ' . ($a ? 'OK' : 'niet'),
221
+        'autoriser' . _LOG_DEBUG
222
+    );
223
+
224
+    return $a;
225 225
 }
226 226
 
227 227
 // une globale pour aller au plus vite dans la fonction generique ci dessus
@@ -239,33 +239,33 @@  discard block
 block discarded – undo
239 239
  * @return bool
240 240
  */
241 241
 function autoriser_exception(string $faire, ?string $type = '', $id = 0, $autoriser = true): bool {
242
-	// une static innaccessible par url pour verifier que la globale est positionnee a bon escient
243
-	static $autorisation;
244
-	// Tolérance avec certains appels
245
-	if ($type === null) {
246
-		$type = '';
247
-	}
248
-	if ($id === null) {
249
-		$id = 0;
250
-	}
251
-	if ($autoriser === 'verifier') {
252
-		return isset($autorisation[$faire][$type][$id]);
253
-	}
254
-	if ($autoriser === true) {
255
-		$GLOBALS['autoriser_exception'][$faire][$type][$id] = $autorisation[$faire][$type][$id] = true;
256
-	}
257
-	if ($autoriser === false) {
258
-		if ($id === '*') {
259
-			unset($GLOBALS['autoriser_exception'][$faire][$type]);
260
-			unset($autorisation[$faire][$type]);
261
-		}
262
-		else {
263
-			unset($GLOBALS['autoriser_exception'][$faire][$type][$id]);
264
-			unset($autorisation[$faire][$type][$id]);
265
-		}
266
-	}
267
-
268
-	return false;
242
+    // une static innaccessible par url pour verifier que la globale est positionnee a bon escient
243
+    static $autorisation;
244
+    // Tolérance avec certains appels
245
+    if ($type === null) {
246
+        $type = '';
247
+    }
248
+    if ($id === null) {
249
+        $id = 0;
250
+    }
251
+    if ($autoriser === 'verifier') {
252
+        return isset($autorisation[$faire][$type][$id]);
253
+    }
254
+    if ($autoriser === true) {
255
+        $GLOBALS['autoriser_exception'][$faire][$type][$id] = $autorisation[$faire][$type][$id] = true;
256
+    }
257
+    if ($autoriser === false) {
258
+        if ($id === '*') {
259
+            unset($GLOBALS['autoriser_exception'][$faire][$type]);
260
+            unset($autorisation[$faire][$type]);
261
+        }
262
+        else {
263
+            unset($GLOBALS['autoriser_exception'][$faire][$type][$id]);
264
+            unset($autorisation[$faire][$type][$id]);
265
+        }
266
+    }
267
+
268
+    return false;
269 269
 }
270 270
 
271 271
 
@@ -282,9 +282,9 @@  discard block
 block discarded – undo
282 282
  * @return bool          true s'il a le droit, false sinon
283 283
  **/
284 284
 function autoriser_defaut_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
285
-	return
286
-		$qui['statut'] == '0minirezo'
287
-		and !$qui['restreint'];
285
+    return
286
+        $qui['statut'] == '0minirezo'
287
+        and !$qui['restreint'];
288 288
 }
289 289
 
290 290
 /**
@@ -300,10 +300,10 @@  discard block
 block discarded – undo
300 300
  * @return bool
301 301
  */
302 302
 function autoriser_loger_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
303
-	if ($qui['statut'] == '5poubelle') {
304
-		return false;
305
-	}
306
-	return true;
303
+    if ($qui['statut'] == '5poubelle') {
304
+        return false;
305
+    }
306
+    return true;
307 307
 }
308 308
 
309 309
 /**
@@ -317,7 +317,7 @@  discard block
 block discarded – undo
317 317
  * @return bool          true s'il a le droit, false sinon
318 318
  **/
319 319
 function autoriser_ecrire_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
320
-	return isset($qui['statut']) and in_array($qui['statut'], ['0minirezo', '1comite']);
320
+    return isset($qui['statut']) and in_array($qui['statut'], ['0minirezo', '1comite']);
321 321
 }
322 322
 
323 323
 /**
@@ -334,7 +334,7 @@  discard block
 block discarded – undo
334 334
  * @return bool          true s'il a le droit, false sinon
335 335
  **/
336 336
 function autoriser_creer_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
337
-	return in_array($qui['statut'], ['0minirezo', '1comite']);
337
+    return in_array($qui['statut'], ['0minirezo', '1comite']);
338 338
 }
339 339
 
340 340
 /**
@@ -352,18 +352,18 @@  discard block
 block discarded – undo
352 352
  **/
353 353
 function autoriser_previsualiser_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
354 354
 
355
-	// Le visiteur a-t-il un statut prevu par la config ?
356
-	if (strpos($GLOBALS['meta']['preview'], ',' . $qui['statut'] . ',') !== false) {
357
-		return test_previsualiser_objet_champ($type, $id, $qui, $opt);
358
-	}
355
+    // Le visiteur a-t-il un statut prevu par la config ?
356
+    if (strpos($GLOBALS['meta']['preview'], ',' . $qui['statut'] . ',') !== false) {
357
+        return test_previsualiser_objet_champ($type, $id, $qui, $opt);
358
+    }
359 359
 
360
-	// A-t-on un token de prévisualisation valable ?
361
-	include_spip('inc/securiser_action');
362
-	if (decrire_token_previsu()) {
363
-		return true;
364
-	}
360
+    // A-t-on un token de prévisualisation valable ?
361
+    include_spip('inc/securiser_action');
362
+    if (decrire_token_previsu()) {
363
+        return true;
364
+    }
365 365
 
366
-	return false;
366
+    return false;
367 367
 }
368 368
 
369 369
 /**
@@ -391,58 +391,58 @@  discard block
 block discarded – undo
391 391
  */
392 392
 function test_previsualiser_objet_champ(string $type = '', int $id = 0, array $qui = [], array $opt = []): bool {
393 393
 
394
-	// si pas de type et statut fourni, c'est une autorisation generale => OK
395
-	if (!$type) {
396
-		return true;
397
-	}
398
-
399
-	include_spip('base/objets');
400
-	$infos = lister_tables_objets_sql(table_objet_sql($type));
401
-	if (isset($infos['statut'])) {
402
-		foreach ($infos['statut'] as $c) {
403
-			if (isset($c['publie'])) {
404
-				if (!isset($c['previsu'])) {
405
-					return false;
406
-				} // pas de previsu definie => NIET
407
-				$champ = $c['champ'];
408
-				if (!isset($opt[$champ])) {
409
-					return false;
410
-				} // pas de champ passe a la demande => NIET
411
-				$previsu = explode(',', $c['previsu']);
412
-				// regarder si ce statut est autorise pour l'auteur
413
-				if (in_array($opt[$champ] . '/auteur', $previsu)) {
414
-					// retrouver l’id_auteur qui a filé un lien de prévisu éventuellement,
415
-					// sinon l’auteur en session
416
-					include_spip('inc/securiser_action');
417
-					if ($desc = decrire_token_previsu()) {
418
-						$id_auteur = $desc['id_auteur'];
419
-					} elseif (isset($GLOBALS['visiteur_session']['id_auteur'])) {
420
-						$id_auteur = intval($GLOBALS['visiteur_session']['id_auteur']);
421
-					} else {
422
-						$id_auteur = null;
423
-					}
424
-
425
-					if (!$id_auteur) {
426
-						return false;
427
-					} elseif (autoriser('previsualiser' . $opt[$champ], $type, 0, $id_auteur)) {
428
-						// dans ce cas (admin en general), pas de filtrage sur ce statut
429
-					} elseif (
430
-						!sql_countsel(
431
-							'spip_auteurs_liens',
432
-							'id_auteur=' . intval($id_auteur) . ' AND objet=' . sql_quote($type) . ' AND id_objet=' . intval($id)
433
-						)
434
-					) {
435
-						return false;
436
-					} // pas auteur de cet objet => NIET
437
-				} elseif (!in_array($opt[$champ], $previsu)) {
438
-					// le statut n'est pas dans ceux definis par la previsu => NIET
439
-					return false;
440
-				}
441
-			}
442
-		}
443
-	}
444
-
445
-	return true;
394
+    // si pas de type et statut fourni, c'est une autorisation generale => OK
395
+    if (!$type) {
396
+        return true;
397
+    }
398
+
399
+    include_spip('base/objets');
400
+    $infos = lister_tables_objets_sql(table_objet_sql($type));
401
+    if (isset($infos['statut'])) {
402
+        foreach ($infos['statut'] as $c) {
403
+            if (isset($c['publie'])) {
404
+                if (!isset($c['previsu'])) {
405
+                    return false;
406
+                } // pas de previsu definie => NIET
407
+                $champ = $c['champ'];
408
+                if (!isset($opt[$champ])) {
409
+                    return false;
410
+                } // pas de champ passe a la demande => NIET
411
+                $previsu = explode(',', $c['previsu']);
412
+                // regarder si ce statut est autorise pour l'auteur
413
+                if (in_array($opt[$champ] . '/auteur', $previsu)) {
414
+                    // retrouver l’id_auteur qui a filé un lien de prévisu éventuellement,
415
+                    // sinon l’auteur en session
416
+                    include_spip('inc/securiser_action');
417
+                    if ($desc = decrire_token_previsu()) {
418
+                        $id_auteur = $desc['id_auteur'];
419
+                    } elseif (isset($GLOBALS['visiteur_session']['id_auteur'])) {
420
+                        $id_auteur = intval($GLOBALS['visiteur_session']['id_auteur']);
421
+                    } else {
422
+                        $id_auteur = null;
423
+                    }
424
+
425
+                    if (!$id_auteur) {
426
+                        return false;
427
+                    } elseif (autoriser('previsualiser' . $opt[$champ], $type, 0, $id_auteur)) {
428
+                        // dans ce cas (admin en general), pas de filtrage sur ce statut
429
+                    } elseif (
430
+                        !sql_countsel(
431
+                            'spip_auteurs_liens',
432
+                            'id_auteur=' . intval($id_auteur) . ' AND objet=' . sql_quote($type) . ' AND id_objet=' . intval($id)
433
+                        )
434
+                    ) {
435
+                        return false;
436
+                    } // pas auteur de cet objet => NIET
437
+                } elseif (!in_array($opt[$champ], $previsu)) {
438
+                    // le statut n'est pas dans ceux definis par la previsu => NIET
439
+                    return false;
440
+                }
441
+            }
442
+        }
443
+    }
444
+
445
+    return true;
446 446
 }
447 447
 
448 448
 /**
@@ -456,51 +456,51 @@  discard block
 block discarded – undo
456 456
  * @return bool          true s'il a le droit, false sinon
457 457
  **/
458 458
 function autoriser_changerlangue_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
459
-	$multi_objets = explode(',', lire_config('multi_objets'));
460
-	$gerer_trad_objets = explode(',', lire_config('gerer_trad_objets'));
461
-	$table = table_objet_sql($type);
462
-	if (
463
-		in_array($table, $multi_objets)
464
-		or in_array($table, $gerer_trad_objets)
465
-	) { // affichage du formulaire si la configuration l'accepte
466
-		$multi_secteurs = lire_config('multi_secteurs');
467
-		$champs = objet_info($type, 'field');
468
-		if (
469
-			$multi_secteurs == 'oui'
470
-			and array_key_exists('id_rubrique', $champs)
471
-		) {
472
-			// multilinguisme par secteur et objet rattaché à une rubrique
473
-			$primary = id_table_objet($type);
474
-			if ($table != 'spip_rubriques') {
475
-				$id_rubrique = sql_getfetsel('id_rubrique', "$table", "$primary=" . intval($id));
476
-			} else {
477
-				$id_rubrique = $id;
478
-			}
479
-			$id_secteur = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique));
480
-			if (!$id_secteur > 0) {
481
-				$id_secteur = $id_rubrique;
482
-			}
483
-			$langue_secteur = sql_getfetsel('lang', 'spip_rubriques', 'id_rubrique=' . intval($id_secteur));
484
-			$langue_objet = sql_getfetsel('lang', "$table", "$primary=" . intval($id));
485
-			if ($langue_secteur != $langue_objet) {
486
-				// configuration incohérente, on laisse l'utilisateur corriger la situation
487
-				return true;
488
-			}
489
-			if ($table != 'spip_rubriques') { // le choix de la langue se fait seulement sur les rubriques
490
-				return false;
491
-			} else {
492
-				$id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id));
493
-				if ($id_parent != 0) {
494
-					// sous-rubriques : pas de choix de langue
495
-					return false;
496
-				}
497
-			}
498
-		}
499
-	} else {
500
-		return false;
501
-	}
502
-
503
-	return autoriser('modifier', $type, $id, $qui, $opt);
459
+    $multi_objets = explode(',', lire_config('multi_objets'));
460
+    $gerer_trad_objets = explode(',', lire_config('gerer_trad_objets'));
461
+    $table = table_objet_sql($type);
462
+    if (
463
+        in_array($table, $multi_objets)
464
+        or in_array($table, $gerer_trad_objets)
465
+    ) { // affichage du formulaire si la configuration l'accepte
466
+        $multi_secteurs = lire_config('multi_secteurs');
467
+        $champs = objet_info($type, 'field');
468
+        if (
469
+            $multi_secteurs == 'oui'
470
+            and array_key_exists('id_rubrique', $champs)
471
+        ) {
472
+            // multilinguisme par secteur et objet rattaché à une rubrique
473
+            $primary = id_table_objet($type);
474
+            if ($table != 'spip_rubriques') {
475
+                $id_rubrique = sql_getfetsel('id_rubrique', "$table", "$primary=" . intval($id));
476
+            } else {
477
+                $id_rubrique = $id;
478
+            }
479
+            $id_secteur = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique));
480
+            if (!$id_secteur > 0) {
481
+                $id_secteur = $id_rubrique;
482
+            }
483
+            $langue_secteur = sql_getfetsel('lang', 'spip_rubriques', 'id_rubrique=' . intval($id_secteur));
484
+            $langue_objet = sql_getfetsel('lang', "$table", "$primary=" . intval($id));
485
+            if ($langue_secteur != $langue_objet) {
486
+                // configuration incohérente, on laisse l'utilisateur corriger la situation
487
+                return true;
488
+            }
489
+            if ($table != 'spip_rubriques') { // le choix de la langue se fait seulement sur les rubriques
490
+                return false;
491
+            } else {
492
+                $id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id));
493
+                if ($id_parent != 0) {
494
+                    // sous-rubriques : pas de choix de langue
495
+                    return false;
496
+                }
497
+            }
498
+        }
499
+    } else {
500
+        return false;
501
+    }
502
+
503
+    return autoriser('modifier', $type, $id, $qui, $opt);
504 504
 }
505 505
 
506 506
 /**
@@ -514,7 +514,7 @@  discard block
 block discarded – undo
514 514
  * @return bool          true s'il a le droit, false sinon
515 515
  **/
516 516
 function autoriser_changertraduction_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
517
-	return autoriser('modifier', $type, $id, $qui, $opt);
517
+    return autoriser('modifier', $type, $id, $qui, $opt);
518 518
 }
519 519
 
520 520
 /**
@@ -528,41 +528,41 @@  discard block
 block discarded – undo
528 528
  * @return bool          true s'il a le droit, false sinon
529 529
  **/
530 530
 function autoriser_dater_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
531
-	$table = table_objet($type);
532
-	$trouver_table = charger_fonction('trouver_table', 'base');
533
-	$desc = $trouver_table($table);
534
-	if (!$desc) {
535
-		return false;
536
-	}
537
-
538
-	if (!isset($opt['statut'])) {
539
-		if (isset($desc['field']['statut'])) {
540
-			$statut = sql_getfetsel('statut', $desc['table'], id_table_objet($type) . '=' . intval($id));
541
-		} else {
542
-			$statut = 'publie';
543
-		} // pas de statut => publie
544
-	} else {
545
-		$statut = $opt['statut'];
546
-	}
547
-
548
-	// Liste des statuts publiés pour cet objet
549
-	if (isset($desc['statut'][0]['publie'])) {
550
-		$statuts_publies = explode(',', $desc['statut'][0]['publie']);
551
-	}
552
-	// Sinon en dur le statut "publie"
553
-	else {
554
-		$statuts_publies = ['publie'];
555
-	}
556
-
557
-	if (
558
-		in_array($statut, $statuts_publies)
559
-		// Ou cas particulier géré en dur ici pour les articles
560
-		or ($statut == 'prop' and $type == 'article' and $GLOBALS['meta']['post_dates'] == 'non')
561
-	) {
562
-		return autoriser('modifier', $type, $id);
563
-	}
564
-
565
-	return false;
531
+    $table = table_objet($type);
532
+    $trouver_table = charger_fonction('trouver_table', 'base');
533
+    $desc = $trouver_table($table);
534
+    if (!$desc) {
535
+        return false;
536
+    }
537
+
538
+    if (!isset($opt['statut'])) {
539
+        if (isset($desc['field']['statut'])) {
540
+            $statut = sql_getfetsel('statut', $desc['table'], id_table_objet($type) . '=' . intval($id));
541
+        } else {
542
+            $statut = 'publie';
543
+        } // pas de statut => publie
544
+    } else {
545
+        $statut = $opt['statut'];
546
+    }
547
+
548
+    // Liste des statuts publiés pour cet objet
549
+    if (isset($desc['statut'][0]['publie'])) {
550
+        $statuts_publies = explode(',', $desc['statut'][0]['publie']);
551
+    }
552
+    // Sinon en dur le statut "publie"
553
+    else {
554
+        $statuts_publies = ['publie'];
555
+    }
556
+
557
+    if (
558
+        in_array($statut, $statuts_publies)
559
+        // Ou cas particulier géré en dur ici pour les articles
560
+        or ($statut == 'prop' and $type == 'article' and $GLOBALS['meta']['post_dates'] == 'non')
561
+    ) {
562
+        return autoriser('modifier', $type, $id);
563
+    }
564
+
565
+    return false;
566 566
 }
567 567
 
568 568
 /**
@@ -579,7 +579,7 @@  discard block
 block discarded – undo
579 579
  * @return bool          true s'il a le droit, false sinon
580 580
  **/
581 581
 function autoriser_instituer_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
582
-	return autoriser('modifier', $type, $id, $qui, $opt);
582
+    return autoriser('modifier', $type, $id, $qui, $opt);
583 583
 }
584 584
 
585 585
 /**
@@ -595,12 +595,12 @@  discard block
 block discarded – undo
595 595
  * @return bool          true s'il a le droit, false sinon
596 596
  **/
597 597
 function autoriser_rubrique_publierdans_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
598
-	return
599
-		($qui['statut'] == '0minirezo')
600
-		and (
601
-			!$qui['restreint'] or !$id
602
-			or in_array($id, $qui['restreint'])
603
-		);
598
+    return
599
+        ($qui['statut'] == '0minirezo')
600
+        and (
601
+            !$qui['restreint'] or !$id
602
+            or in_array($id, $qui['restreint'])
603
+        );
604 604
 }
605 605
 
606 606
 /**
@@ -616,12 +616,12 @@  discard block
 block discarded – undo
616 616
  * @return bool          true s'il a le droit, false sinon
617 617
  **/
618 618
 function autoriser_rubrique_creer_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
619
-	if (!empty($opt['id_parent'])) {
620
-		return autoriser('creerrubriquedans', 'rubrique', $opt['id_parent'], $qui);
621
-	}
622
-	else {
623
-		return autoriser('defaut', null, 0, $qui, $opt);
624
-	}
619
+    if (!empty($opt['id_parent'])) {
620
+        return autoriser('creerrubriquedans', 'rubrique', $opt['id_parent'], $qui);
621
+    }
622
+    else {
623
+        return autoriser('defaut', null, 0, $qui, $opt);
624
+    }
625 625
 }
626 626
 
627 627
 /**
@@ -637,10 +637,10 @@  discard block
 block discarded – undo
637 637
  * @return bool          true s'il a le droit, false sinon
638 638
  **/
639 639
 function autoriser_rubrique_creerrubriquedans_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
640
-	return
641
-		($id or ($qui['statut'] == '0minirezo' and !$qui['restreint']))
642
-		and autoriser('voir', 'rubrique', $id)
643
-		and autoriser('publierdans', 'rubrique', $id);
640
+    return
641
+        ($id or ($qui['statut'] == '0minirezo' and !$qui['restreint']))
642
+        and autoriser('voir', 'rubrique', $id)
643
+        and autoriser('publierdans', 'rubrique', $id);
644 644
 }
645 645
 
646 646
 /**
@@ -656,10 +656,10 @@  discard block
 block discarded – undo
656 656
  * @return bool          true s'il a le droit, false sinon
657 657
  **/
658 658
 function autoriser_rubrique_creerarticledans_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
659
-	return
660
-		$id
661
-		and autoriser('voir', 'rubrique', $id)
662
-		and autoriser('creer', 'article');
659
+    return
660
+        $id
661
+        and autoriser('voir', 'rubrique', $id)
662
+        and autoriser('creer', 'article');
663 663
 }
664 664
 
665 665
 
@@ -676,8 +676,8 @@  discard block
 block discarded – undo
676 676
  * @return bool          true s'il a le droit, false sinon
677 677
  **/
678 678
 function autoriser_rubrique_modifier_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
679
-	return
680
-		autoriser('publierdans', 'rubrique', $id, $qui, $opt);
679
+    return
680
+        autoriser('publierdans', 'rubrique', $id, $qui, $opt);
681 681
 }
682 682
 
683 683
 /**
@@ -693,29 +693,29 @@  discard block
 block discarded – undo
693 693
  * @return bool          true s'il a le droit, false sinon
694 694
  **/
695 695
 function autoriser_rubrique_supprimer_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
696
-	if (!$id = intval($id)) {
697
-		return false;
698
-	}
696
+    if (!$id = intval($id)) {
697
+        return false;
698
+    }
699 699
 
700
-	if (sql_countsel('spip_rubriques', 'id_parent=' . intval($id))) {
701
-		return false;
702
-	}
700
+    if (sql_countsel('spip_rubriques', 'id_parent=' . intval($id))) {
701
+        return false;
702
+    }
703 703
 
704
-	if (sql_countsel('spip_articles', 'id_rubrique=' . intval($id) . " AND (statut<>'poubelle')")) {
705
-		return false;
706
-	}
704
+    if (sql_countsel('spip_articles', 'id_rubrique=' . intval($id) . " AND (statut<>'poubelle')")) {
705
+        return false;
706
+    }
707 707
 
708
-	$compte = pipeline(
709
-		'objet_compte_enfants',
710
-		['args' => ['objet' => 'rubrique', 'id_objet' => $id], 'data' => []]
711
-	);
712
-	foreach ($compte as $objet => $n) {
713
-		if ($n) {
714
-			return false;
715
-		}
716
-	}
708
+    $compte = pipeline(
709
+        'objet_compte_enfants',
710
+        ['args' => ['objet' => 'rubrique', 'id_objet' => $id], 'data' => []]
711
+    );
712
+    foreach ($compte as $objet => $n) {
713
+        if ($n) {
714
+            return false;
715
+        }
716
+    }
717 717
 
718
-	return autoriser('modifier', 'rubrique', $id);
718
+    return autoriser('modifier', 'rubrique', $id);
719 719
 }
720 720
 
721 721
 
@@ -733,23 +733,23 @@  discard block
 block discarded – undo
733 733
  * @return bool          true s'il a le droit, false sinon
734 734
  **/
735 735
 function autoriser_article_modifier_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
736
-	if (!$id) {
737
-		return false;
738
-	}
739
-	$r = sql_fetsel('id_rubrique,statut', 'spip_articles', 'id_article=' . sql_quote($id));
740
-
741
-	return
742
-		$r
743
-		and
744
-		(
745
-			autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
746
-			or (
747
-				(!isset($opt['statut']) or $opt['statut'] !== 'publie')
748
-				and in_array($qui['statut'], ['0minirezo', '1comite'])
749
-				and in_array($r['statut'], ['prop', 'prepa', 'poubelle'])
750
-				and auteurs_objet('article', $id, 'id_auteur=' . $qui['id_auteur'])
751
-			)
752
-		);
736
+    if (!$id) {
737
+        return false;
738
+    }
739
+    $r = sql_fetsel('id_rubrique,statut', 'spip_articles', 'id_article=' . sql_quote($id));
740
+
741
+    return
742
+        $r
743
+        and
744
+        (
745
+            autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
746
+            or (
747
+                (!isset($opt['statut']) or $opt['statut'] !== 'publie')
748
+                and in_array($qui['statut'], ['0minirezo', '1comite'])
749
+                and in_array($r['statut'], ['prop', 'prepa', 'poubelle'])
750
+                and auteurs_objet('article', $id, 'id_auteur=' . $qui['id_auteur'])
751
+            )
752
+        );
753 753
 }
754 754
 
755 755
 /**
@@ -765,13 +765,13 @@  discard block
 block discarded – undo
765 765
  * @return bool          true s'il a le droit, false sinon
766 766
  **/
767 767
 function autoriser_article_creer_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
768
-	if (!empty($opt['id_parent'])) {
769
-		// creerarticledans rappelle autoriser(creer,article) sans id, donc on verifiera condition du else aussi
770
-		return autoriser('creerarticledans', 'rubrique', $opt['id_parent'], $qui);
771
-	}
772
-	else {
773
-		return (sql_countsel('spip_rubriques') > 0 and in_array($qui['statut'], ['0minirezo', '1comite']));
774
-	}
768
+    if (!empty($opt['id_parent'])) {
769
+        // creerarticledans rappelle autoriser(creer,article) sans id, donc on verifiera condition du else aussi
770
+        return autoriser('creerarticledans', 'rubrique', $opt['id_parent'], $qui);
771
+    }
772
+    else {
773
+        return (sql_countsel('spip_rubriques') > 0 and in_array($qui['statut'], ['0minirezo', '1comite']));
774
+    }
775 775
 }
776 776
 
777 777
 /**
@@ -791,28 +791,28 @@  discard block
 block discarded – undo
791 791
  * @return bool          true s'il a le droit, false sinon
792 792
  */
793 793
 function autoriser_article_voir_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
794
-	if ($qui['statut'] == '0minirezo') {
795
-		return true;
796
-	}
797
-	// cas des articles : depend du statut de l'article et de l'auteur
798
-	if (isset($opt['statut'])) {
799
-		$statut = $opt['statut'];
800
-	} else {
801
-		if (!$id) {
802
-			return false;
803
-		}
804
-		$statut = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id));
805
-	}
806
-
807
-	return
808
-		// si on est pas auteur de l'article,
809
-		// seuls les propose et publies sont visibles
810
-		in_array($statut, ['prop', 'publie'])
811
-		// sinon si on est auteur, on a le droit de le voir, evidemment !
812
-		or
813
-		($id
814
-			and $qui['id_auteur']
815
-			and auteurs_objet('article', $id, 'id_auteur=' . $qui['id_auteur']));
794
+    if ($qui['statut'] == '0minirezo') {
795
+        return true;
796
+    }
797
+    // cas des articles : depend du statut de l'article et de l'auteur
798
+    if (isset($opt['statut'])) {
799
+        $statut = $opt['statut'];
800
+    } else {
801
+        if (!$id) {
802
+            return false;
803
+        }
804
+        $statut = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id));
805
+    }
806
+
807
+    return
808
+        // si on est pas auteur de l'article,
809
+        // seuls les propose et publies sont visibles
810
+        in_array($statut, ['prop', 'publie'])
811
+        // sinon si on est auteur, on a le droit de le voir, evidemment !
812
+        or
813
+        ($id
814
+            and $qui['id_auteur']
815
+            and auteurs_objet('article', $id, 'id_auteur=' . $qui['id_auteur']));
816 816
 }
817 817
 
818 818
 
@@ -829,24 +829,24 @@  discard block
 block discarded – undo
829 829
  * @return bool          true s'il a le droit, false sinon
830 830
  **/
831 831
 function autoriser_voir_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
832
-	# securite, mais on aurait pas du arriver ici !
833
-	if (
834
-		function_exists($f = 'autoriser_' . $type . '_voir')
835
-		or function_exists($f = 'autoriser_' . $type . '_voir_dist')
836
-	) {
837
-		return $f($faire, $type, $id, $qui, $opt);
838
-	}
832
+    # securite, mais on aurait pas du arriver ici !
833
+    if (
834
+        function_exists($f = 'autoriser_' . $type . '_voir')
835
+        or function_exists($f = 'autoriser_' . $type . '_voir_dist')
836
+    ) {
837
+        return $f($faire, $type, $id, $qui, $opt);
838
+    }
839 839
 
840
-	if ($qui['statut'] == '0minirezo') {
841
-		return true;
842
-	}
843
-	// admins et redacteurs peuvent voir un auteur
844
-	if ($type == 'auteur') {
845
-		return in_array($qui['statut'], ['0minirezo', '1comite']);
846
-	}
847
-	// sinon par defaut tout est visible
848
-	// sauf cas particuliers traites separemment (ie article)
849
-	return true;
840
+    if ($qui['statut'] == '0minirezo') {
841
+        return true;
842
+    }
843
+    // admins et redacteurs peuvent voir un auteur
844
+    if ($type == 'auteur') {
845
+        return in_array($qui['statut'], ['0minirezo', '1comite']);
846
+    }
847
+    // sinon par defaut tout est visible
848
+    // sauf cas particuliers traites separemment (ie article)
849
+    return true;
850 850
 }
851 851
 
852 852
 
@@ -867,12 +867,12 @@  discard block
 block discarded – undo
867 867
  * @return bool          true s'il a le droit, false sinon
868 868
  **/
869 869
 function autoriser_webmestre_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
870
-	return
871
-		(defined('_ID_WEBMESTRES') ?
872
-			in_array($qui['id_auteur'], explode(':', _ID_WEBMESTRES))
873
-			: $qui['webmestre'] == 'oui')
874
-		and $qui['statut'] == '0minirezo'
875
-		and !$qui['restreint'];
870
+    return
871
+        (defined('_ID_WEBMESTRES') ?
872
+            in_array($qui['id_auteur'], explode(':', _ID_WEBMESTRES))
873
+            : $qui['webmestre'] == 'oui')
874
+        and $qui['statut'] == '0minirezo'
875
+        and !$qui['restreint'];
876 876
 }
877 877
 
878 878
 /**
@@ -888,9 +888,9 @@  discard block
 block discarded – undo
888 888
  * @return bool          true s'il a le droit, false sinon
889 889
  **/
890 890
 function autoriser_configurer_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
891
-	return
892
-		$qui['statut'] == '0minirezo'
893
-		and !$qui['restreint'];
891
+    return
892
+        $qui['statut'] == '0minirezo'
893
+        and !$qui['restreint'];
894 894
 }
895 895
 
896 896
 /**
@@ -906,8 +906,8 @@  discard block
 block discarded – undo
906 906
  * @return bool          true s'il a le droit, false sinon
907 907
  **/
908 908
 function autoriser_sauvegarder_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
909
-	return
910
-		$qui['statut'] == '0minirezo';
909
+    return
910
+        $qui['statut'] == '0minirezo';
911 911
 }
912 912
 
913 913
 /**
@@ -923,7 +923,7 @@  discard block
 block discarded – undo
923 923
  * @return bool          true s'il a le droit, false sinon
924 924
  **/
925 925
 function autoriser_detruire_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
926
-	return autoriser('webmestre', null, 0, $qui, $opt);
926
+    return autoriser('webmestre', null, 0, $qui, $opt);
927 927
 }
928 928
 
929 929
 /**
@@ -940,23 +940,23 @@  discard block
 block discarded – undo
940 940
  * @return bool          true s'il a le droit, false sinon
941 941
  **/
942 942
 function autoriser_auteur_previsualiser_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
943
-	// les admins peuvent "previsualiser" une page auteur
944
-	if (
945
-		$qui['statut'] == '0minirezo'
946
-		and !$qui['restreint']
947
-	) {
948
-		return true;
949
-	} elseif ($id === 0) {
950
-		return false;
951
-	}
952
-	// "Voir en ligne" si l'auteur a un article publie
953
-	$n = sql_fetsel(
954
-		'A.id_article',
955
-		'spip_auteurs_liens AS L LEFT JOIN spip_articles AS A ON (L.objet=\'article\' AND L.id_objet=A.id_article)',
956
-		"A.statut='publie' AND L.id_auteur=" . sql_quote($id)
957
-	);
943
+    // les admins peuvent "previsualiser" une page auteur
944
+    if (
945
+        $qui['statut'] == '0minirezo'
946
+        and !$qui['restreint']
947
+    ) {
948
+        return true;
949
+    } elseif ($id === 0) {
950
+        return false;
951
+    }
952
+    // "Voir en ligne" si l'auteur a un article publie
953
+    $n = sql_fetsel(
954
+        'A.id_article',
955
+        'spip_auteurs_liens AS L LEFT JOIN spip_articles AS A ON (L.objet=\'article\' AND L.id_objet=A.id_article)',
956
+        "A.statut='publie' AND L.id_auteur=" . sql_quote($id)
957
+    );
958 958
 
959
-	return $n ? true : false;
959
+    return $n ? true : false;
960 960
 }
961 961
 
962 962
 
@@ -984,7 +984,7 @@  discard block
 block discarded – undo
984 984
  * @return bool          true s'il a le droit, false sinon
985 985
  **/
986 986
 function autoriser_auteur_creer_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
987
-	return ($qui['statut'] == '0minirezo');
987
+    return ($qui['statut'] == '0minirezo');
988 988
 }
989 989
 
990 990
 
@@ -1004,73 +1004,73 @@  discard block
 block discarded – undo
1004 1004
  **/
1005 1005
 function autoriser_auteur_modifier_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1006 1006
 
1007
-	// Si pas admin : seulement le droit de modifier ses donnees perso, mais pas statut ni login
1008
-	// la modif de l'email doit etre verifiee ou notifiee si possible, mais c'est a l'interface de gerer ca
1009
-	if (!in_array($qui['statut'], ['0minirezo'])) {
1010
-		if (
1011
-			$id == $qui['id_auteur']
1012
-			&& empty($opt['statut'])
1013
-			&& empty($opt['webmestre'])
1014
-			&& empty($opt['restreintes'])
1015
-			&& empty($opt['login'])
1016
-		) {
1017
-			return true;
1018
-		}
1019
-		return false;
1020
-	}
1021
-
1022
-	// Un admin restreint peut modifier/creer un auteur non-admin mais il
1023
-	// n'a le droit ni de le promouvoir admin, ni de changer les rubriques
1024
-	if ($qui['restreint']) {
1025
-		if (isset($opt['webmestre']) and $opt['webmestre']) {
1026
-			return false;
1027
-		} elseif (
1028
-			(isset($opt['statut']) and ($opt['statut'] == '0minirezo'))
1029
-			or (isset($opt['restreintes']) and $opt['restreintes'])
1030
-		) {
1031
-			return false;
1032
-		} else {
1033
-			if ($id == $qui['id_auteur']) {
1034
-				if (isset($opt['statut']) and $opt['statut']) {
1035
-					return false;
1036
-				} else {
1037
-					return true;
1038
-				}
1039
-			} else {
1040
-				if ($id_auteur = intval($id)) {
1041
-					$t = sql_fetsel('statut', 'spip_auteurs', "id_auteur=$id_auteur");
1042
-					if ($t and $t['statut'] != '0minirezo') {
1043
-						return true;
1044
-					} else {
1045
-						return false;
1046
-					}
1047
-				} // id = 0 => creation
1048
-				else {
1049
-					return true;
1050
-				}
1051
-			}
1052
-		}
1053
-	}
1054
-
1055
-	// Un admin complet fait ce qu'il veut
1056
-	// sauf se degrader
1057
-	if ($id == $qui['id_auteur'] && (isset($opt['statut']) and $opt['statut'])) {
1058
-		return false;
1059
-	} elseif (
1060
-		isset($opt['webmestre'])
1061
-				and $opt['webmestre']
1062
-				and (defined('_ID_WEBMESTRES')
1063
-				or !autoriser('webmestre'))
1064
-	) {
1065
-		// et toucher au statut webmestre si il ne l'est pas lui meme
1066
-		// ou si les webmestres sont fixes par constante (securite)
1067
-		return false;
1068
-	} // et modifier un webmestre si il ne l'est pas lui meme
1069
-	elseif (intval($id) and autoriser('webmestre', '', 0, $id) and !autoriser('webmestre')) {
1070
-		return false;
1071
-	} else {
1072
-		return true;
1073
-	}
1007
+    // Si pas admin : seulement le droit de modifier ses donnees perso, mais pas statut ni login
1008
+    // la modif de l'email doit etre verifiee ou notifiee si possible, mais c'est a l'interface de gerer ca
1009
+    if (!in_array($qui['statut'], ['0minirezo'])) {
1010
+        if (
1011
+            $id == $qui['id_auteur']
1012
+            && empty($opt['statut'])
1013
+            && empty($opt['webmestre'])
1014
+            && empty($opt['restreintes'])
1015
+            && empty($opt['login'])
1016
+        ) {
1017
+            return true;
1018
+        }
1019
+        return false;
1020
+    }
1021
+
1022
+    // Un admin restreint peut modifier/creer un auteur non-admin mais il
1023
+    // n'a le droit ni de le promouvoir admin, ni de changer les rubriques
1024
+    if ($qui['restreint']) {
1025
+        if (isset($opt['webmestre']) and $opt['webmestre']) {
1026
+            return false;
1027
+        } elseif (
1028
+            (isset($opt['statut']) and ($opt['statut'] == '0minirezo'))
1029
+            or (isset($opt['restreintes']) and $opt['restreintes'])
1030
+        ) {
1031
+            return false;
1032
+        } else {
1033
+            if ($id == $qui['id_auteur']) {
1034
+                if (isset($opt['statut']) and $opt['statut']) {
1035
+                    return false;
1036
+                } else {
1037
+                    return true;
1038
+                }
1039
+            } else {
1040
+                if ($id_auteur = intval($id)) {
1041
+                    $t = sql_fetsel('statut', 'spip_auteurs', "id_auteur=$id_auteur");
1042
+                    if ($t and $t['statut'] != '0minirezo') {
1043
+                        return true;
1044
+                    } else {
1045
+                        return false;
1046
+                    }
1047
+                } // id = 0 => creation
1048
+                else {
1049
+                    return true;
1050
+                }
1051
+            }
1052
+        }
1053
+    }
1054
+
1055
+    // Un admin complet fait ce qu'il veut
1056
+    // sauf se degrader
1057
+    if ($id == $qui['id_auteur'] && (isset($opt['statut']) and $opt['statut'])) {
1058
+        return false;
1059
+    } elseif (
1060
+        isset($opt['webmestre'])
1061
+                and $opt['webmestre']
1062
+                and (defined('_ID_WEBMESTRES')
1063
+                or !autoriser('webmestre'))
1064
+    ) {
1065
+        // et toucher au statut webmestre si il ne l'est pas lui meme
1066
+        // ou si les webmestres sont fixes par constante (securite)
1067
+        return false;
1068
+    } // et modifier un webmestre si il ne l'est pas lui meme
1069
+    elseif (intval($id) and autoriser('webmestre', '', 0, $id) and !autoriser('webmestre')) {
1070
+        return false;
1071
+    } else {
1072
+        return true;
1073
+    }
1074 1074
 }
1075 1075
 
1076 1076
 
@@ -1087,7 +1087,7 @@  discard block
 block discarded – undo
1087 1087
  * @return bool          true s'il a le droit, false sinon
1088 1088
  **/
1089 1089
 function autoriser_associerauteurs_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1090
-	return autoriser('modifier', $type, $id, $qui, $opt);
1090
+    return autoriser('modifier', $type, $id, $qui, $opt);
1091 1091
 }
1092 1092
 
1093 1093
 
@@ -1104,7 +1104,7 @@  discard block
 block discarded – undo
1104 1104
  * @return bool          true s'il a le droit, false sinon
1105 1105
  **/
1106 1106
 function autoriser_chargerftp_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1107
-	return $qui['statut'] == '0minirezo';
1107
+    return $qui['statut'] == '0minirezo';
1108 1108
 }
1109 1109
 
1110 1110
 /**
@@ -1120,7 +1120,7 @@  discard block
 block discarded – undo
1120 1120
  * @return bool          true s'il a le droit, false sinon
1121 1121
  **/
1122 1122
 function autoriser_debug_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1123
-	return $qui['statut'] == '0minirezo';
1123
+    return $qui['statut'] == '0minirezo';
1124 1124
 }
1125 1125
 
1126 1126
 /**
@@ -1137,54 +1137,54 @@  discard block
 block discarded – undo
1137 1137
  * @return array          Liste des rubriques
1138 1138
  **/
1139 1139
 function liste_rubriques_auteur($id_auteur, $raz = false) {
1140
-	static $restreint = [];
1141
-
1142
-	if (!$id_auteur = intval($id_auteur)) {
1143
-		return [];
1144
-	}
1145
-	if ($raz) {
1146
-		unset($restreint[$id_auteur]);
1147
-	} elseif (isset($restreint[$id_auteur])) {
1148
-		return $restreint[$id_auteur];
1149
-	}
1150
-
1151
-	$rubriques = [];
1152
-	if (
1153
-		(!isset($GLOBALS['meta']['version_installee'])
1154
-		or $GLOBALS['meta']['version_installee'] > 16428)
1155
-		and $r = sql_allfetsel(
1156
-			'id_objet',
1157
-			'spip_auteurs_liens',
1158
-			'id_auteur=' . intval($id_auteur) . " AND objet='rubrique' AND id_objet!=0"
1159
-		)
1160
-		and is_countable($r) ? count($r) : 0
1161
-	) {
1162
-		$r = array_column($r, 'id_objet');
1163
-
1164
-		// recuperer toute la branche, au format chaine enumeration
1165
-		include_spip('inc/rubriques');
1166
-		$r = calcul_branche_in($r);
1167
-		$r = explode(',', $r);
1168
-
1169
-		// passer les rubriques en index, elimine les doublons
1170
-		$r = array_flip($r);
1171
-		// recuperer les index seuls
1172
-		$r = array_keys($r);
1173
-		// combiner pour avoir un tableau id_rubrique=>id_rubrique
1174
-		// est-ce vraiment utile ? (on preserve la forme donnee par le code precedent)
1175
-		$rubriques = array_combine($r, $r);
1176
-	}
1177
-
1178
-	// Affecter l'auteur session le cas echeant
1179
-	if (
1180
-		isset($GLOBALS['visiteur_session']['id_auteur'])
1181
-		and $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
1182
-	) {
1183
-		$GLOBALS['visiteur_session']['restreint'] = $rubriques;
1184
-	}
1185
-
1186
-
1187
-	return $restreint[$id_auteur] = $rubriques;
1140
+    static $restreint = [];
1141
+
1142
+    if (!$id_auteur = intval($id_auteur)) {
1143
+        return [];
1144
+    }
1145
+    if ($raz) {
1146
+        unset($restreint[$id_auteur]);
1147
+    } elseif (isset($restreint[$id_auteur])) {
1148
+        return $restreint[$id_auteur];
1149
+    }
1150
+
1151
+    $rubriques = [];
1152
+    if (
1153
+        (!isset($GLOBALS['meta']['version_installee'])
1154
+        or $GLOBALS['meta']['version_installee'] > 16428)
1155
+        and $r = sql_allfetsel(
1156
+            'id_objet',
1157
+            'spip_auteurs_liens',
1158
+            'id_auteur=' . intval($id_auteur) . " AND objet='rubrique' AND id_objet!=0"
1159
+        )
1160
+        and is_countable($r) ? count($r) : 0
1161
+    ) {
1162
+        $r = array_column($r, 'id_objet');
1163
+
1164
+        // recuperer toute la branche, au format chaine enumeration
1165
+        include_spip('inc/rubriques');
1166
+        $r = calcul_branche_in($r);
1167
+        $r = explode(',', $r);
1168
+
1169
+        // passer les rubriques en index, elimine les doublons
1170
+        $r = array_flip($r);
1171
+        // recuperer les index seuls
1172
+        $r = array_keys($r);
1173
+        // combiner pour avoir un tableau id_rubrique=>id_rubrique
1174
+        // est-ce vraiment utile ? (on preserve la forme donnee par le code precedent)
1175
+        $rubriques = array_combine($r, $r);
1176
+    }
1177
+
1178
+    // Affecter l'auteur session le cas echeant
1179
+    if (
1180
+        isset($GLOBALS['visiteur_session']['id_auteur'])
1181
+        and $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
1182
+    ) {
1183
+        $GLOBALS['visiteur_session']['restreint'] = $rubriques;
1184
+    }
1185
+
1186
+
1187
+    return $restreint[$id_auteur] = $rubriques;
1188 1188
 }
1189 1189
 
1190 1190
 /**
@@ -1200,7 +1200,7 @@  discard block
 block discarded – undo
1200 1200
  * @return bool          true s'il a le droit, false sinon
1201 1201
  **/
1202 1202
 function autoriser_rubrique_previsualiser_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1203
-	return autoriser('previsualiser');
1203
+    return autoriser('previsualiser');
1204 1204
 }
1205 1205
 
1206 1206
 /**
@@ -1216,7 +1216,7 @@  discard block
 block discarded – undo
1216 1216
  * @return bool          true s'il a le droit, false sinon
1217 1217
  **/
1218 1218
 function autoriser_rubrique_iconifier_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1219
-	return autoriser('publierdans', 'rubrique', $id, $qui, $opt);
1219
+    return autoriser('publierdans', 'rubrique', $id, $qui, $opt);
1220 1220
 }
1221 1221
 
1222 1222
 /**
@@ -1232,8 +1232,8 @@  discard block
 block discarded – undo
1232 1232
  * @return bool          true s'il a le droit, false sinon
1233 1233
  **/
1234 1234
 function autoriser_auteur_iconifier_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1235
-	return (($id == $qui['id_auteur']) or
1236
-		(($qui['statut'] == '0minirezo') and !$qui['restreint']));
1235
+    return (($id == $qui['id_auteur']) or
1236
+        (($qui['statut'] == '0minirezo') and !$qui['restreint']));
1237 1237
 }
1238 1238
 
1239 1239
 /**
@@ -1249,8 +1249,8 @@  discard block
 block discarded – undo
1249 1249
  * @return bool          true s'il a le droit, false sinon
1250 1250
  **/
1251 1251
 function autoriser_iconifier_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1252
-	// par defaut, on a le droit d'iconifier si on a le droit de modifier
1253
-	return autoriser('modifier', $type, $id, $qui, $opt);
1252
+    // par defaut, on a le droit d'iconifier si on a le droit de modifier
1253
+    return autoriser('modifier', $type, $id, $qui, $opt);
1254 1254
 }
1255 1255
 
1256 1256
 
@@ -1268,7 +1268,7 @@  discard block
 block discarded – undo
1268 1268
  * @return bool          true
1269 1269
  **/
1270 1270
 function autoriser_ok_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1271
-	return true;
1271
+    return true;
1272 1272
 }
1273 1273
 
1274 1274
 /**
@@ -1285,7 +1285,7 @@  discard block
 block discarded – undo
1285 1285
  * @return bool          false
1286 1286
  **/
1287 1287
 function autoriser_niet_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1288
-	return false;
1288
+    return false;
1289 1289
 }
1290 1290
 
1291 1291
 /**
@@ -1301,11 +1301,11 @@  discard block
 block discarded – undo
1301 1301
  * @return bool          false
1302 1302
  **/
1303 1303
 function autoriser_base_reparer_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1304
-	if (!autoriser('detruire') or _request('reinstall')) {
1305
-		return false;
1306
-	}
1304
+    if (!autoriser('detruire') or _request('reinstall')) {
1305
+        return false;
1306
+    }
1307 1307
 
1308
-	return true;
1308
+    return true;
1309 1309
 }
1310 1310
 
1311 1311
 /**
@@ -1321,7 +1321,7 @@  discard block
 block discarded – undo
1321 1321
  * @return bool          true s'il a le droit, false sinon
1322 1322
  **/
1323 1323
 function autoriser_infosperso_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1324
-	return true;
1324
+    return true;
1325 1325
 }
1326 1326
 
1327 1327
 /**
@@ -1337,7 +1337,7 @@  discard block
 block discarded – undo
1337 1337
  * @return bool          true s'il a le droit, false sinon
1338 1338
  **/
1339 1339
 function autoriser_langage_configurer_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1340
-	return true;
1340
+    return true;
1341 1341
 }
1342 1342
 
1343 1343
 /**
@@ -1353,7 +1353,7 @@  discard block
 block discarded – undo
1353 1353
  * @return bool          true s'il a le droit, false sinon
1354 1354
  **/
1355 1355
 function autoriser_configurerlangage_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1356
-	return autoriser('configurer', '_langage', $id, $qui, $opt);
1356
+    return autoriser('configurer', '_langage', $id, $qui, $opt);
1357 1357
 }
1358 1358
 
1359 1359
 /**
@@ -1369,7 +1369,7 @@  discard block
 block discarded – undo
1369 1369
  * @return bool          true s'il a le droit, false sinon
1370 1370
  **/
1371 1371
 function autoriser_preferences_configurer_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1372
-	return true;
1372
+    return true;
1373 1373
 }
1374 1374
 
1375 1375
 /**
@@ -1385,7 +1385,7 @@  discard block
 block discarded – undo
1385 1385
  * @return bool          true s'il a le droit, false sinon
1386 1386
  **/
1387 1387
 function autoriser_configurerpreferences_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1388
-	return autoriser('configurer', '_preferences', $id, $qui, $opt);
1388
+    return autoriser('configurer', '_preferences', $id, $qui, $opt);
1389 1389
 }
1390 1390
 
1391 1391
 /**
@@ -1401,8 +1401,8 @@  discard block
 block discarded – undo
1401 1401
  * @return bool          true s'il a le droit, false sinon
1402 1402
  **/
1403 1403
 function autoriser_menudeveloppement_menugrandeentree_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1404
-	return (isset($GLOBALS['visiteur_session']['prefs']['activer_menudev'])
1405
-		and $GLOBALS['visiteur_session']['prefs']['activer_menudev'] == 'oui');
1404
+    return (isset($GLOBALS['visiteur_session']['prefs']['activer_menudev'])
1405
+        and $GLOBALS['visiteur_session']['prefs']['activer_menudev'] == 'oui');
1406 1406
 }
1407 1407
 
1408 1408
 /**
@@ -1419,7 +1419,7 @@  discard block
 block discarded – undo
1419 1419
  * @return bool          true s'il a le droit, false sinon
1420 1420
  **/
1421 1421
 function autoriser_menugrandeentree_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1422
-	return true;
1422
+    return true;
1423 1423
 }
1424 1424
 
1425 1425
 /**
@@ -1435,7 +1435,7 @@  discard block
 block discarded – undo
1435 1435
  * @return bool          true s'il a le droit, false sinon
1436 1436
  **/
1437 1437
 function autoriser_auteurs_voir_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1438
-	return true;
1438
+    return true;
1439 1439
 }
1440 1440
 
1441 1441
 /**
@@ -1451,7 +1451,7 @@  discard block
 block discarded – undo
1451 1451
  * @return bool          true s'il a le droit, false sinon
1452 1452
  **/
1453 1453
 function autoriser_auteurs_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1454
-	return autoriser('voir', '_auteurs', $id, $qui, $opt);
1454
+    return autoriser('voir', '_auteurs', $id, $qui, $opt);
1455 1455
 }
1456 1456
 
1457 1457
 /**
@@ -1467,7 +1467,7 @@  discard block
 block discarded – undo
1467 1467
  * @return bool          true s'il a le droit, false sinon
1468 1468
  **/
1469 1469
 function autoriser_articles_voir_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1470
-	return true;
1470
+    return true;
1471 1471
 }
1472 1472
 
1473 1473
 /**
@@ -1483,7 +1483,7 @@  discard block
 block discarded – undo
1483 1483
  * @return bool          true s'il a le droit, false sinon
1484 1484
  **/
1485 1485
 function autoriser_articles_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1486
-	return autoriser('voir', '_articles', $id, $qui, $opt);
1486
+    return autoriser('voir', '_articles', $id, $qui, $opt);
1487 1487
 }
1488 1488
 
1489 1489
 /**
@@ -1499,7 +1499,7 @@  discard block
 block discarded – undo
1499 1499
  * @return bool          true s'il a le droit, false sinon
1500 1500
  **/
1501 1501
 function autoriser_rubriques_voir_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1502
-	return true;
1502
+    return true;
1503 1503
 }
1504 1504
 
1505 1505
 /**
@@ -1515,7 +1515,7 @@  discard block
 block discarded – undo
1515 1515
  * @return bool          true s'il a le droit, false sinon
1516 1516
  **/
1517 1517
 function autoriser_rubriques_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1518
-	return autoriser('voir', '_rubriques', $id, $qui, $opt);
1518
+    return autoriser('voir', '_rubriques', $id, $qui, $opt);
1519 1519
 }
1520 1520
 
1521 1521
 /**
@@ -1531,7 +1531,7 @@  discard block
 block discarded – undo
1531 1531
  * @return bool          true s'il a le droit, false sinon
1532 1532
  **/
1533 1533
 function autoriser_articlecreer_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1534
-	return verifier_table_non_vide();
1534
+    return verifier_table_non_vide();
1535 1535
 }
1536 1536
 
1537 1537
 
@@ -1550,7 +1550,7 @@  discard block
 block discarded – undo
1550 1550
  * @return bool          true s'il a le droit, false sinon
1551 1551
  **/
1552 1552
 function autoriser_auteurcreer_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1553
-	return autoriser('creer', 'auteur', $id, $qui, $opt);
1553
+    return autoriser('creer', 'auteur', $id, $qui, $opt);
1554 1554
 }
1555 1555
 
1556 1556
 /**
@@ -1566,13 +1566,13 @@  discard block
 block discarded – undo
1566 1566
  * @return bool          true s'il a le droit, false sinon
1567 1567
  **/
1568 1568
 function autoriser_visiteurs_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1569
-	include_spip('base/abstract_sql');
1570
-	return
1571
-		$qui['statut'] == '0minirezo' and !$qui['restreint']
1572
-		and (
1573
-			$GLOBALS['meta']['accepter_visiteurs'] != 'non'
1574
-			or sql_countsel('spip_auteurs', 'statut in ("6forum", "nouveau")') > 0
1575
-		);
1569
+    include_spip('base/abstract_sql');
1570
+    return
1571
+        $qui['statut'] == '0minirezo' and !$qui['restreint']
1572
+        and (
1573
+            $GLOBALS['meta']['accepter_visiteurs'] != 'non'
1574
+            or sql_countsel('spip_auteurs', 'statut in ("6forum", "nouveau")') > 0
1575
+        );
1576 1576
 }
1577 1577
 
1578 1578
 /**
@@ -1588,7 +1588,7 @@  discard block
 block discarded – undo
1588 1588
  * @return bool          true s'il a le droit, false sinon
1589 1589
  **/
1590 1590
 function autoriser_suiviedito_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1591
-	return $qui['statut'] == '0minirezo';
1591
+    return $qui['statut'] == '0minirezo';
1592 1592
 }
1593 1593
 
1594 1594
 /**
@@ -1604,7 +1604,7 @@  discard block
 block discarded – undo
1604 1604
  * @return bool          true s'il a le droit, false sinon
1605 1605
  **/
1606 1606
 function autoriser_synchro_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1607
-	return $qui['statut'] == '0minirezo';
1607
+    return $qui['statut'] == '0minirezo';
1608 1608
 }
1609 1609
 
1610 1610
 /**
@@ -1620,7 +1620,7 @@  discard block
 block discarded – undo
1620 1620
  * @return bool          true s'il a le droit, false sinon
1621 1621
  **/
1622 1622
 function autoriser_configurerinteractions_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1623
-	return autoriser('configurer', '_interactions', $id, $qui, $opt);
1623
+    return autoriser('configurer', '_interactions', $id, $qui, $opt);
1624 1624
 }
1625 1625
 
1626 1626
 /**
@@ -1636,7 +1636,7 @@  discard block
 block discarded – undo
1636 1636
  * @return bool          true s'il a le droit, false sinon
1637 1637
  **/
1638 1638
 function autoriser_configurerlangue_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1639
-	return autoriser('configurer', '_langue', $id, $qui, $opt);
1639
+    return autoriser('configurer', '_langue', $id, $qui, $opt);
1640 1640
 }
1641 1641
 
1642 1642
 /**
@@ -1652,7 +1652,7 @@  discard block
 block discarded – undo
1652 1652
  * @return bool          true s'il a le droit, false sinon
1653 1653
  **/
1654 1654
 function autoriser_configurermultilinguisme_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1655
-	return autoriser('configurer', '_multilinguisme', $id, $qui, $opt);
1655
+    return autoriser('configurer', '_multilinguisme', $id, $qui, $opt);
1656 1656
 }
1657 1657
 
1658 1658
 /**
@@ -1668,7 +1668,7 @@  discard block
 block discarded – undo
1668 1668
  * @return bool          true s'il a le droit, false sinon
1669 1669
  **/
1670 1670
 function autoriser_configurercontenu_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1671
-	return autoriser('configurer', '_contenu', $id, $qui, $opt);
1671
+    return autoriser('configurer', '_contenu', $id, $qui, $opt);
1672 1672
 }
1673 1673
 
1674 1674
 /**
@@ -1684,7 +1684,7 @@  discard block
 block discarded – undo
1684 1684
  * @return bool          true s'il a le droit, false sinon
1685 1685
  **/
1686 1686
 function autoriser_configureravancees_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1687
-	return autoriser('configurer', '_avancees', $id, $qui, $opt);
1687
+    return autoriser('configurer', '_avancees', $id, $qui, $opt);
1688 1688
 }
1689 1689
 
1690 1690
 /**
@@ -1700,7 +1700,7 @@  discard block
 block discarded – undo
1700 1700
  * @return bool          true s'il a le droit, false sinon
1701 1701
  **/
1702 1702
 function autoriser_adminplugin_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1703
-	return autoriser('configurer', '_plugins', $id, $qui, $opt);
1703
+    return autoriser('configurer', '_plugins', $id, $qui, $opt);
1704 1704
 }
1705 1705
 
1706 1706
 /**
@@ -1716,7 +1716,7 @@  discard block
 block discarded – undo
1716 1716
  * @return bool          true s'il a le droit, false sinon
1717 1717
  **/
1718 1718
 function autoriser_admintech_menu_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1719
-	return autoriser('detruire', $type, $id, $qui, $opt);
1719
+    return autoriser('detruire', $type, $id, $qui, $opt);
1720 1720
 }
1721 1721
 
1722 1722
 /**
@@ -1732,7 +1732,7 @@  discard block
 block discarded – undo
1732 1732
  * @return bool          true s'il a le droit, false sinon
1733 1733
  **/
1734 1734
 function autoriser_queue_purger_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1735
-	return autoriser('webmestre');
1735
+    return autoriser('webmestre');
1736 1736
 }
1737 1737
 
1738 1738
 
@@ -1750,11 +1750,11 @@  discard block
 block discarded – undo
1750 1750
  * @return bool          true s'il a le droit, false sinon
1751 1751
  **/
1752 1752
 function autoriser_echafauder_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1753
-	if (test_espace_prive()) {
1754
-		return intval($qui['id_auteur']) ? true : false;
1755
-	} else {
1756
-		return autoriser('webmestre', '', $id, $qui, $opt);
1757
-	}
1753
+    if (test_espace_prive()) {
1754
+        return intval($qui['id_auteur']) ? true : false;
1755
+    } else {
1756
+        return autoriser('webmestre', '', $id, $qui, $opt);
1757
+    }
1758 1758
 }
1759 1759
 
1760 1760
 
@@ -1769,27 +1769,27 @@  discard block
 block discarded – undo
1769 1769
  *     Identifiants d'auteurs
1770 1770
  */
1771 1771
 function auteurs_objet($objet, $id_objet, $cond = '') {
1772
-	$objet = objet_type($objet);
1773
-	$where = [
1774
-		'objet=' . sql_quote($objet),
1775
-		'id_objet=' . intval($id_objet)
1776
-	];
1777
-	if (!empty($cond)) {
1778
-		if (is_array($cond)) {
1779
-			$where = array_merge($where, $cond);
1780
-		} else {
1781
-			$where[] = $cond;
1782
-		}
1783
-	}
1784
-	$auteurs = sql_allfetsel(
1785
-		'id_auteur',
1786
-		'spip_auteurs_liens',
1787
-		$where
1788
-	);
1789
-	if (is_array($auteurs)) {
1790
-		return array_column($auteurs, 'id_auteur');
1791
-	}
1792
-	return [];
1772
+    $objet = objet_type($objet);
1773
+    $where = [
1774
+        'objet=' . sql_quote($objet),
1775
+        'id_objet=' . intval($id_objet)
1776
+    ];
1777
+    if (!empty($cond)) {
1778
+        if (is_array($cond)) {
1779
+            $where = array_merge($where, $cond);
1780
+        } else {
1781
+            $where[] = $cond;
1782
+        }
1783
+    }
1784
+    $auteurs = sql_allfetsel(
1785
+        'id_auteur',
1786
+        'spip_auteurs_liens',
1787
+        $where
1788
+    );
1789
+    if (is_array($auteurs)) {
1790
+        return array_column($auteurs, 'id_auteur');
1791
+    }
1792
+    return [];
1793 1793
 }
1794 1794
 
1795 1795
 /**
@@ -1804,11 +1804,11 @@  discard block
 block discarded – undo
1804 1804
  *     - false : serveur SQL indisponible
1805 1805
  */
1806 1806
 function auteurs_article($id_article, $cond = '') {
1807
-	return sql_allfetsel(
1808
-		'id_auteur',
1809
-		'spip_auteurs_liens',
1810
-		"objet='article' AND id_objet=" . intval($id_article) . ($cond ? " AND $cond" : '')
1811
-	);
1807
+    return sql_allfetsel(
1808
+        'id_auteur',
1809
+        'spip_auteurs_liens',
1810
+        "objet='article' AND id_objet=" . intval($id_article) . ($cond ? " AND $cond" : '')
1811
+    );
1812 1812
 }
1813 1813
 
1814 1814
 
@@ -1822,7 +1822,7 @@  discard block
 block discarded – undo
1822 1822
  */
1823 1823
 function acces_restreint_rubrique($id_rubrique) {
1824 1824
 
1825
-	return (isset($GLOBALS['connect_id_rubrique'][$id_rubrique]));
1825
+    return (isset($GLOBALS['connect_id_rubrique'][$id_rubrique]));
1826 1826
 }
1827 1827
 
1828 1828
 
@@ -1835,12 +1835,12 @@  discard block
 block discarded – undo
1835 1835
  * @return bool             true si un parent existe
1836 1836
  */
1837 1837
 function verifier_table_non_vide($table = 'spip_rubriques') {
1838
-	static $done = [];
1839
-	if (!isset($done[$table])) {
1840
-		$done[$table] = sql_countsel($table) > 0;
1841
-	}
1838
+    static $done = [];
1839
+    if (!isset($done[$table])) {
1840
+        $done[$table] = sql_countsel($table) > 0;
1841
+    }
1842 1842
 
1843
-	return $done[$table];
1843
+    return $done[$table];
1844 1844
 }
1845 1845
 
1846 1846
 /**
@@ -1865,15 +1865,15 @@  discard block
 block discarded – undo
1865 1865
  */
1866 1866
 function autoriser_inscrireauteur_dist($faire, $quoi, $id, $qui, $opt) {
1867 1867
 
1868
-	$s = array_search($quoi, $GLOBALS['liste_des_statuts']);
1869
-	switch ($s) {
1870
-		case 'info_redacteurs':
1871
-			return ($GLOBALS['meta']['accepter_inscriptions'] == 'oui');
1872
-		case 'info_visiteurs':
1873
-			return ($GLOBALS['meta']['accepter_visiteurs'] == 'oui' or $GLOBALS['meta']['forums_publics'] == 'abo');
1874
-	}
1868
+    $s = array_search($quoi, $GLOBALS['liste_des_statuts']);
1869
+    switch ($s) {
1870
+        case 'info_redacteurs':
1871
+            return ($GLOBALS['meta']['accepter_inscriptions'] == 'oui');
1872
+        case 'info_visiteurs':
1873
+            return ($GLOBALS['meta']['accepter_visiteurs'] == 'oui' or $GLOBALS['meta']['forums_publics'] == 'abo');
1874
+    }
1875 1875
 
1876
-	return false;
1876
+    return false;
1877 1877
 }
1878 1878
 
1879 1879
 /**
@@ -1889,7 +1889,7 @@  discard block
 block discarded – undo
1889 1889
  * @return bool          false
1890 1890
  **/
1891 1891
 function autoriser_inscription_relancer_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1892
-	return $qui['statut'] == '0minirezo' and !$qui['restreint'];
1892
+    return $qui['statut'] == '0minirezo' and !$qui['restreint'];
1893 1893
 }
1894 1894
 
1895 1895
 /**
@@ -1905,5 +1905,5 @@  discard block
 block discarded – undo
1905 1905
  * @return bool          true s'il a le droit, false sinon
1906 1906
  **/
1907 1907
 function autoriser_phpinfos_dist(string $faire, string $type, int $id, array $qui, array $opt): bool {
1908
-	return autoriser('webmestre');
1908
+    return autoriser('webmestre');
1909 1909
 }
Please login to merge, or discard this patch.
ecrire/base/objets.php 1 patch
Indentation   +1256 added lines, -1256 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -32,11 +32,11 @@  discard block
 block discarded – undo
32 32
  * @return void
33 33
  **/
34 34
 function array_set_merge(&$table, $index, $valeur) {
35
-	if (!isset($table[$index])) {
36
-		$table[$index] = $valeur;
37
-	} else {
38
-		$table[$index] = array_merge($table[$index], $valeur);
39
-	}
35
+    if (!isset($table[$index])) {
36
+        $table[$index] = $valeur;
37
+    } else {
38
+        $table[$index] = array_merge($table[$index], $valeur);
39
+    }
40 40
 }
41 41
 
42 42
 /**
@@ -55,440 +55,440 @@  discard block
 block discarded – undo
55 55
  *   - string (interne) si table '::md5' retourne un hash
56 56
  */
57 57
 function lister_tables_objets_sql(?string $table_sql = null, $desc = []) {
58
-	static $deja_la = false;
59
-	static $infos_tables = null;
60
-	static $md5 = null;
61
-	static $plugin_hash = null;
62
-
63
-	// plugins hash connu ? non si _CACHE_PLUGINS_OPT est pas encore chargé.
64
-	$_PLUGINS_HASH = defined('_PLUGINS_HASH') ? _PLUGINS_HASH : '!_CACHE_PLUGINS_OPT';
65
-
66
-	// prealablement recuperer les tables_principales
67
-	if (is_null($infos_tables) or $plugin_hash !== $_PLUGINS_HASH) {
68
-		// pas de reentrance (cas base/serial)
69
-		if ($deja_la) {
70
-			spip_log('Re-entrance anormale sur lister_tables_objets_sql : '
71
-				. var_export(debug_backtrace(), true), _LOG_CRITIQUE);
72
-
73
-			return ($table_sql === '::md5' ? $md5 : []);
74
-		}
75
-		$deja_la = true;
76
-		$plugin_hash = $_PLUGINS_HASH; // avant de lancer les pipelines
77
-
78
-		// recuperer les declarations explicites ancienne mode
79
-		// qui servent a completer declarer_tables_objets_sql
80
-		base_serial($GLOBALS['tables_principales']);
81
-		base_auxiliaires($GLOBALS['tables_auxiliaires']);
82
-		$infos_tables = [
83
-			'spip_articles' => [
84
-				'page' => 'article',
85
-				'texte_retour' => 'icone_retour_article',
86
-				'texte_modifier' => 'icone_modifier_article',
87
-				'texte_creer' => 'icone_ecrire_article',
88
-				'texte_objets' => 'public:articles',
89
-				'texte_objet' => 'public:article',
90
-				'texte_signale_edition' => 'texte_travail_article',
91
-				'info_aucun_objet' => 'info_aucun_article',
92
-				'info_1_objet' => 'info_1_article',
93
-				'info_nb_objets' => 'info_nb_articles',
94
-				'texte_logo_objet' => 'logo_article',
95
-				'texte_langue_objet' => 'titre_langue_article',
96
-				'texte_definir_comme_traduction_objet' => 'trad_lier',
97
-				'titre' => 'titre, lang',
98
-				'date' => 'date',
99
-				'principale' => 'oui',
100
-				'introduction_longueur' => '500',
101
-				'champs_editables' => [
102
-					'surtitre',
103
-					'titre',
104
-					'soustitre',
105
-					'descriptif',
106
-					'nom_site',
107
-					'url_site',
108
-					'chapo',
109
-					'texte',
110
-					'ps',
111
-					'virtuel'
112
-				],
113
-				'champs_versionnes' => [
114
-					'id_rubrique',
115
-					'surtitre',
116
-					'titre',
117
-					'soustitre',
118
-					'jointure_auteurs',
119
-					'descriptif',
120
-					'nom_site',
121
-					'url_site',
122
-					'chapo',
123
-					'texte',
124
-					'ps'
125
-				],
126
-				'field' => [
127
-					'id_article' => 'bigint(21) NOT NULL',
128
-					'surtitre' => "text DEFAULT '' NOT NULL",
129
-					'titre' => "text DEFAULT '' NOT NULL",
130
-					'soustitre' => "text DEFAULT '' NOT NULL",
131
-					'id_rubrique' => "bigint(21) DEFAULT '0' NOT NULL",
132
-					'descriptif' => "text DEFAULT '' NOT NULL",
133
-					'chapo' => "mediumtext DEFAULT '' NOT NULL",
134
-					'texte' => "longtext DEFAULT '' NOT NULL",
135
-					'ps' => "mediumtext DEFAULT '' NOT NULL",
136
-					'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
137
-					'statut' => "varchar(10) DEFAULT '0' NOT NULL",
138
-					'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL",
139
-					'maj' => 'TIMESTAMP',
140
-					'export' => "VARCHAR(10) DEFAULT 'oui'",
141
-					'date_redac' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
142
-					'visites' => "integer DEFAULT '0' NOT NULL",
143
-					'referers' => "integer DEFAULT '0' NOT NULL",
144
-					'popularite' => "DOUBLE DEFAULT '0' NOT NULL",
145
-					'accepter_forum' => "CHAR(3) DEFAULT '' NOT NULL",
146
-					'date_modif' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
147
-					'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
148
-					'langue_choisie' => "VARCHAR(3) DEFAULT 'non'",
149
-					'id_trad' => "bigint(21) DEFAULT '0' NOT NULL",
150
-					'nom_site' => "tinytext DEFAULT '' NOT NULL",
151
-					'url_site' => "text DEFAULT '' NOT NULL",
152
-					'virtuel' => "text DEFAULT '' NOT NULL",
153
-				],
154
-				'key' => [
155
-					'PRIMARY KEY' => 'id_article',
156
-					'KEY id_rubrique' => 'id_rubrique',
157
-					'KEY id_secteur' => 'id_secteur',
158
-					'KEY id_trad' => 'id_trad',
159
-					'KEY lang' => 'lang',
160
-					'KEY statut' => 'statut, date',
161
-				],
162
-				'join' => [
163
-					'id_article' => 'id_article',
164
-					'id_rubrique' => 'id_rubrique'
165
-				],
166
-				'parent' => [
167
-					['type' => 'rubrique', 'champ' => 'id_rubrique']
168
-				],
169
-				'rechercher_champs' => [
170
-					'surtitre' => 5,
171
-					'titre' => 8,
172
-					'soustitre' => 5,
173
-					'chapo' => 3,
174
-					'texte' => 1,
175
-					'ps' => 1,
176
-					'nom_site' => 1,
177
-					'url_site' => 1,
178
-					'descriptif' => 4
179
-				],
180
-				'rechercher_jointures' => [
181
-					'auteur' => ['nom' => 10],
182
-				],
183
-				'statut' => [
184
-					[
185
-						'champ' => 'statut',
186
-						'publie' => 'publie',
187
-						'previsu' => 'publie,prop,prepa/auteur',
188
-						'post_date' => 'date',
189
-						'exception' => ['statut', 'tout']
190
-					]
191
-				],
192
-				'statut_titres' => [
193
-					'prepa' => 'info_article_redaction',
194
-					'prop' => 'info_article_propose',
195
-					'publie' => 'info_article_publie',
196
-					'refuse' => 'info_article_refuse',
197
-					'poubelle' => 'info_article_supprime'
198
-				],
199
-				'statut_textes_instituer' => [
200
-					'prepa' => 'texte_statut_en_cours_redaction',
201
-					'prop' => 'texte_statut_propose_evaluation',
202
-					'publie' => 'texte_statut_publie',
203
-					'refuse' => 'texte_statut_refuse',
204
-					'poubelle' => 'texte_statut_poubelle',
205
-				],
206
-				'texte_changer_statut' => 'texte_article_statut',
207
-				'aide_changer_statut' => 'artstatut',
208
-				'tables_jointures' => [
209
-					'profondeur' => 'rubriques',
210
-					#'id_auteur' => 'auteurs_liens' // declaration generique plus bas
211
-				],
212
-			],
213
-			'spip_auteurs' => [
214
-				'page' => 'auteur',
215
-				'texte_retour' => 'icone_retour',
216
-				'texte_ajouter' => 'titre_ajouter_un_auteur',
217
-				'texte_modifier' => 'admin_modifier_auteur',
218
-				'texte_objets' => 'icone_auteurs',
219
-				'texte_objet' => 'public:auteur',
220
-				'info_aucun_objet' => 'info_aucun_auteur',
221
-				'info_1_objet' => 'info_1_auteur',
222
-				'info_nb_objets' => 'info_nb_auteurs',
223
-				'texte_logo_objet' => 'logo_auteur',
224
-				'texte_creer_associer' => 'creer_et_associer_un_auteur',
225
-				'titre' => "nom AS titre, '' AS lang",
226
-				'date' => 'date',
227
-				'principale' => 'oui',
228
-				'champs_editables' => ['nom', 'email', 'bio', 'nom_site', 'url_site', 'imessage', 'pgp'],
229
-				'champs_versionnes' => ['nom', 'bio', 'email', 'nom_site', 'url_site', 'login'],
230
-				'field' => [
231
-					'id_auteur' => 'bigint(21) NOT NULL',
232
-					'nom' => "text DEFAULT '' NOT NULL",
233
-					'bio' => "text DEFAULT '' NOT NULL",
234
-					'email' => "tinytext DEFAULT '' NOT NULL",
235
-					'nom_site' => "tinytext DEFAULT '' NOT NULL",
236
-					'url_site' => "text DEFAULT '' NOT NULL",
237
-					'login' => 'VARCHAR(255) BINARY',
238
-					'pass' => "tinytext DEFAULT '' NOT NULL",
239
-					'low_sec' => "tinytext DEFAULT '' NOT NULL",
240
-					'statut' => "varchar(255)  DEFAULT '0' NOT NULL",
241
-					'webmestre' => "varchar(3)  DEFAULT 'non' NOT NULL",
242
-					'maj' => 'TIMESTAMP',
243
-					'pgp' => "TEXT DEFAULT '' NOT NULL",
244
-					'htpass' => "tinytext DEFAULT '' NOT NULL",
245
-					'en_ligne' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
246
-					'alea_actuel' => 'tinytext',
247
-					'alea_futur' => 'tinytext',
248
-					'prefs' => 'text',
249
-					'cookie_oubli' => 'tinytext',
250
-					'source' => "VARCHAR(10) DEFAULT 'spip' NOT NULL",
251
-					'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
252
-					'imessage' => "VARCHAR(3) DEFAULT '' NOT NULL"
253
-				],
254
-				'key' => [
255
-					'PRIMARY KEY' => 'id_auteur',
256
-					'KEY login' => 'login',
257
-					'KEY statut' => 'statut',
258
-					'KEY en_ligne' => 'en_ligne',
259
-				],
260
-				'join' => [
261
-					'id_auteur' => 'id_auteur',
262
-					'login' => 'login'
263
-				],
264
-				'rechercher_champs' => [
265
-					'nom' => 5,
266
-					'bio' => 1,
267
-					'email' => 1,
268
-					'nom_site' => 1,
269
-					'url_site' => 1,
270
-					'login' => 1
271
-				],
272
-				// 2 conditions pour les auteurs : statut!=poubelle,
273
-				// et avoir des articles publies
274
-				'statut' => [
275
-					[
276
-						'champ' => 'statut',
277
-						'publie' => '!5poubelle',
278
-						'previsu' => '!5poubelle',
279
-						'exception' => 'statut'
280
-					],
281
-					[
282
-						'champ' => [
283
-							['spip_auteurs_liens', 'id_auteur'],
284
-							[
285
-								'spip_articles',
286
-								['id_objet', 'id_article', 'objet', 'article']
287
-							],
288
-							'statut'
289
-						],
290
-						'publie' => 'publie',
291
-						'previsu' => '!',
292
-						'post_date' => 'date',
293
-						'exception' => ['statut', 'lien', 'tout']
294
-					],
295
-				],
296
-				'statut_images' => [
297
-					'auteur-6forum-16.png',
298
-					'0minirezo' => 'auteur-0minirezo-16.png',
299
-					'1comite' => 'auteur-1comite-16.png',
300
-					'6forum' => 'auteur-6forum-16.png',
301
-					'5poubelle' => 'auteur-5poubelle-16.png',
302
-					'nouveau' => ''
303
-				],
304
-				'statut_titres' => [
305
-					'titre_image_visiteur',
306
-					'0minirezo' => 'titre_image_administrateur',
307
-					'1comite' => 'titre_image_redacteur_02',
308
-					'6forum' => 'titre_image_visiteur',
309
-					'5poubelle' => 'titre_image_auteur_supprime',
310
-				],
311
-				'tables_jointures' => [#'auteurs_liens' // declaration generique plus bas
312
-				],
313
-			],
314
-			'spip_rubriques' => [
315
-				'page' => 'rubrique',
316
-				'url_voir' => 'rubrique',
317
-				'url_edit' => 'rubrique_edit',
318
-				'texte_retour' => 'icone_retour',
319
-				'texte_objets' => 'public:rubriques',
320
-				'texte_objet' => 'public:rubrique',
321
-				'texte_modifier' => 'icone_modifier_rubrique',
322
-				'texte_creer' => 'icone_creer_rubrique',
323
-				'texte_ajouter' => 'titre_ajouter_une_rubrique',
324
-				'texte_creer_associer' => 'creer_et_associer_une_rubrique',
325
-				'info_aucun_objet' => 'info_aucun_rubrique',
326
-				'info_1_objet' => 'info_1_rubrique',
327
-				'info_nb_objets' => 'info_nb_rubriques',
328
-				'texte_logo_objet' => 'logo_rubrique',
329
-				'texte_langue_objet' => 'titre_langue_rubrique',
330
-				'texte_definir_comme_traduction_objet' => 'texte_definir_comme_traduction_rubrique',
331
-				'titre' => 'titre, lang',
332
-				'date' => 'date',
333
-				'principale' => 'oui',
334
-				'introduction_longueur' => '600',
335
-				'champs_editables' => ['titre', 'texte', 'descriptif', 'extra'],
336
-				'champs_versionnes' => ['titre', 'descriptif', 'texte'],
337
-				'field' => [
338
-					'id_rubrique' => 'bigint(21) NOT NULL',
339
-					'id_parent' => "bigint(21) DEFAULT '0' NOT NULL",
340
-					'titre' => "text DEFAULT '' NOT NULL",
341
-					'descriptif' => "text DEFAULT '' NOT NULL",
342
-					'texte' => "longtext DEFAULT '' NOT NULL",
343
-					'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL",
344
-					'maj' => 'TIMESTAMP',
345
-					'statut' => "varchar(10) DEFAULT '0' NOT NULL",
346
-					'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
347
-					'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
348
-					'langue_choisie' => "VARCHAR(3) DEFAULT 'non'",
349
-					'statut_tmp' => "varchar(10) DEFAULT '0' NOT NULL",
350
-					'date_tmp' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
351
-					'profondeur' => "smallint(5) DEFAULT '0' NOT NULL"
352
-				],
353
-				'key' => [
354
-					'PRIMARY KEY' => 'id_rubrique',
355
-					'KEY lang' => 'lang',
356
-					'KEY id_parent' => 'id_parent',
357
-				],
358
-				'parent' => [
359
-					['type' => 'rubrique', 'champ' => 'id_parent']
360
-				],
361
-				'rechercher_champs' => [
362
-					'titre' => 8,
363
-					'descriptif' => 5,
364
-					'texte' => 1
365
-				],
366
-				'statut' => [
367
-					[
368
-						'champ' => 'statut',
369
-						'publie' => 'publie',
370
-						'previsu' => '!',
371
-						'exception' => ['statut', 'tout']
372
-					],
373
-				],
374
-				'tables_jointures' => [#'id_auteur' => 'auteurs_liens' // declaration generique plus bas
375
-				],
376
-			],
377
-			// toutes les tables ont le droit a une jointure sur les auteurs
378
-			['tables_jointures' => ['id_auteur' => 'auteurs_liens']]
379
-		];
380
-
381
-		// avant d'appeller les pipeline qui peuvent generer une reentrance a l'install
382
-		// initialiser la signature
383
-		$md5 = md5(serialize($infos_tables));
384
-
385
-		$GLOBALS['tables_principales'] = pipeline('declarer_tables_principales', $GLOBALS['tables_principales']);
386
-		$GLOBALS['tables_auxiliaires'] = pipeline('declarer_tables_auxiliaires', $GLOBALS['tables_auxiliaires']);
387
-		$infos_tables = pipeline('declarer_tables_objets_sql', $infos_tables);
388
-
389
-		// completer les informations manquantes ou implicites
390
-		$all = [];
391
-		foreach (array_keys($infos_tables) as $t) {
392
-			// les cles numeriques servent a declarer
393
-			// les proprietes applicables a tous les objets
394
-			// on les mets de cote
395
-			if (is_numeric($t)) {
396
-				$all = array_merge_recursive($all, $infos_tables[$t]);
397
-				unset($infos_tables[$t]);
398
-			} else {
399
-				$infos_tables[$t] = renseigner_table_objet_sql($t, $infos_tables[$t]);
400
-			}
401
-		}
402
-
403
-		// repercuter les proprietes generales communes a tous les objets
404
-		foreach (array_keys($infos_tables) as $t) {
405
-			foreach ($all as $i => $v) {
406
-				if (in_array($i, ['tables_jointures', 'champs_versionnes'])) {
407
-					$add = $all[$i];
408
-					// eviter les doublons de declaration de table jointure (ex des mots sur auteurs)
409
-					// pour les declarations generiques avec cles numeriques
410
-					if ($i == 'tables_jointures' and isset($infos_tables[$t][$i]) and is_countable($infos_tables[$t][$i]) ? count($infos_tables[$t][$i]) : 0) {
411
-						$doublons = array_intersect($infos_tables[$t][$i], $add);
412
-						foreach ($doublons as $d) {
413
-							if (
414
-								is_numeric(array_search($d, $infos_tables[$t][$i]))
415
-								and is_numeric($k = array_search($d, $add))
416
-							) {
417
-								unset($add[$k]);
418
-							}
419
-						}
420
-					}
421
-					$infos_tables[$t][$i] = array_merge($infos_tables[$t][$i] ?? [], $add);
422
-				} else {
423
-					$infos_tables[$t][$i] = array_merge_recursive(
424
-						$infos_tables[$t][$i] ?? [],
425
-						$all[$i]
426
-					);
427
-				}
428
-			}
429
-		}
430
-
431
-		// completer les tables principales et auxiliaires
432
-		// avec celles declarees uniquement dans declarer_table_objets_sql
433
-		// pour assurer la compat en transition
434
-		foreach ($infos_tables as $table => $infos) {
435
-			$principale_ou_auxiliaire = ($infos['principale'] ? 'tables_principales' : 'tables_auxiliaires');
436
-			// memoriser des champs eventuels declares par des plugins dans le pipeline tables_xxx
437
-			// qui a ete appelle avant
438
-			$mem = ($GLOBALS[$principale_ou_auxiliaire][$table] ?? []);
439
-			// l'ajouter au tableau
440
-			$GLOBALS[$principale_ou_auxiliaire][$table] = [];
441
-			if (isset($infos['field']) and isset($infos['key'])) {
442
-				foreach (['field', 'key', 'join'] as $k) {
443
-					if (isset($infos_tables[$table][$k])) {
444
-						$GLOBALS[$principale_ou_auxiliaire][$table][$k] = &$infos_tables[$table][$k];
445
-					}
446
-				}
447
-			} else {
448
-				// ici on ne renvoie que les declarations, donc RIEN
449
-				// pour avoir la vrai description en base, il faut passer par trouver_table
450
-				$GLOBALS[$principale_ou_auxiliaire][$table] = [];
451
-			}
452
-			if (is_countable($mem) ? count($mem) : 0) {
453
-				foreach (array_keys($mem) as $k) {
454
-					if (isset($GLOBALS[$principale_ou_auxiliaire][$table][$k])) {
455
-						$GLOBALS[$principale_ou_auxiliaire][$table][$k] = array_merge(
456
-							$GLOBALS[$principale_ou_auxiliaire][$table][$k],
457
-							$mem[$k]
458
-						);
459
-					} else {
460
-						$GLOBALS[$principale_ou_auxiliaire][$table][$k] = $mem[$k];
461
-					}
462
-				}
463
-			}
464
-		}
465
-
466
-		// recuperer les interfaces (table_titre, table_date)
467
-		// on ne le fait que dans un second temps pour que table_objet soit fonctionnel
468
-		// dans le pipeline de declarer_tables_interfaces
469
-		include_spip('public/interfaces');
470
-		foreach (array_keys($infos_tables) as $t) {
471
-			$infos_tables[$t] = renseigner_table_objet_interfaces($t, $infos_tables[$t]);
472
-		}
473
-
474
-		$deja_la = false;
475
-		// signature
476
-		$md5 = md5(serialize($infos_tables));
477
-	}
478
-	if ($table_sql === '::md5') {
479
-		return $md5;
480
-	}
481
-	if ($table_sql and !isset($infos_tables[$table_sql])) {
482
-		#$desc = renseigner_table_objet_sql($table_sql,$desc);
483
-		$desc = renseigner_table_objet_interfaces($table_sql, $desc);
484
-
485
-		return $desc;
486
-	}
487
-	if ($table_sql) {
488
-		return $infos_tables[$table_sql] ?? [];
489
-	}
490
-
491
-	return $infos_tables;
58
+    static $deja_la = false;
59
+    static $infos_tables = null;
60
+    static $md5 = null;
61
+    static $plugin_hash = null;
62
+
63
+    // plugins hash connu ? non si _CACHE_PLUGINS_OPT est pas encore chargé.
64
+    $_PLUGINS_HASH = defined('_PLUGINS_HASH') ? _PLUGINS_HASH : '!_CACHE_PLUGINS_OPT';
65
+
66
+    // prealablement recuperer les tables_principales
67
+    if (is_null($infos_tables) or $plugin_hash !== $_PLUGINS_HASH) {
68
+        // pas de reentrance (cas base/serial)
69
+        if ($deja_la) {
70
+            spip_log('Re-entrance anormale sur lister_tables_objets_sql : '
71
+                . var_export(debug_backtrace(), true), _LOG_CRITIQUE);
72
+
73
+            return ($table_sql === '::md5' ? $md5 : []);
74
+        }
75
+        $deja_la = true;
76
+        $plugin_hash = $_PLUGINS_HASH; // avant de lancer les pipelines
77
+
78
+        // recuperer les declarations explicites ancienne mode
79
+        // qui servent a completer declarer_tables_objets_sql
80
+        base_serial($GLOBALS['tables_principales']);
81
+        base_auxiliaires($GLOBALS['tables_auxiliaires']);
82
+        $infos_tables = [
83
+            'spip_articles' => [
84
+                'page' => 'article',
85
+                'texte_retour' => 'icone_retour_article',
86
+                'texte_modifier' => 'icone_modifier_article',
87
+                'texte_creer' => 'icone_ecrire_article',
88
+                'texte_objets' => 'public:articles',
89
+                'texte_objet' => 'public:article',
90
+                'texte_signale_edition' => 'texte_travail_article',
91
+                'info_aucun_objet' => 'info_aucun_article',
92
+                'info_1_objet' => 'info_1_article',
93
+                'info_nb_objets' => 'info_nb_articles',
94
+                'texte_logo_objet' => 'logo_article',
95
+                'texte_langue_objet' => 'titre_langue_article',
96
+                'texte_definir_comme_traduction_objet' => 'trad_lier',
97
+                'titre' => 'titre, lang',
98
+                'date' => 'date',
99
+                'principale' => 'oui',
100
+                'introduction_longueur' => '500',
101
+                'champs_editables' => [
102
+                    'surtitre',
103
+                    'titre',
104
+                    'soustitre',
105
+                    'descriptif',
106
+                    'nom_site',
107
+                    'url_site',
108
+                    'chapo',
109
+                    'texte',
110
+                    'ps',
111
+                    'virtuel'
112
+                ],
113
+                'champs_versionnes' => [
114
+                    'id_rubrique',
115
+                    'surtitre',
116
+                    'titre',
117
+                    'soustitre',
118
+                    'jointure_auteurs',
119
+                    'descriptif',
120
+                    'nom_site',
121
+                    'url_site',
122
+                    'chapo',
123
+                    'texte',
124
+                    'ps'
125
+                ],
126
+                'field' => [
127
+                    'id_article' => 'bigint(21) NOT NULL',
128
+                    'surtitre' => "text DEFAULT '' NOT NULL",
129
+                    'titre' => "text DEFAULT '' NOT NULL",
130
+                    'soustitre' => "text DEFAULT '' NOT NULL",
131
+                    'id_rubrique' => "bigint(21) DEFAULT '0' NOT NULL",
132
+                    'descriptif' => "text DEFAULT '' NOT NULL",
133
+                    'chapo' => "mediumtext DEFAULT '' NOT NULL",
134
+                    'texte' => "longtext DEFAULT '' NOT NULL",
135
+                    'ps' => "mediumtext DEFAULT '' NOT NULL",
136
+                    'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
137
+                    'statut' => "varchar(10) DEFAULT '0' NOT NULL",
138
+                    'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL",
139
+                    'maj' => 'TIMESTAMP',
140
+                    'export' => "VARCHAR(10) DEFAULT 'oui'",
141
+                    'date_redac' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
142
+                    'visites' => "integer DEFAULT '0' NOT NULL",
143
+                    'referers' => "integer DEFAULT '0' NOT NULL",
144
+                    'popularite' => "DOUBLE DEFAULT '0' NOT NULL",
145
+                    'accepter_forum' => "CHAR(3) DEFAULT '' NOT NULL",
146
+                    'date_modif' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
147
+                    'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
148
+                    'langue_choisie' => "VARCHAR(3) DEFAULT 'non'",
149
+                    'id_trad' => "bigint(21) DEFAULT '0' NOT NULL",
150
+                    'nom_site' => "tinytext DEFAULT '' NOT NULL",
151
+                    'url_site' => "text DEFAULT '' NOT NULL",
152
+                    'virtuel' => "text DEFAULT '' NOT NULL",
153
+                ],
154
+                'key' => [
155
+                    'PRIMARY KEY' => 'id_article',
156
+                    'KEY id_rubrique' => 'id_rubrique',
157
+                    'KEY id_secteur' => 'id_secteur',
158
+                    'KEY id_trad' => 'id_trad',
159
+                    'KEY lang' => 'lang',
160
+                    'KEY statut' => 'statut, date',
161
+                ],
162
+                'join' => [
163
+                    'id_article' => 'id_article',
164
+                    'id_rubrique' => 'id_rubrique'
165
+                ],
166
+                'parent' => [
167
+                    ['type' => 'rubrique', 'champ' => 'id_rubrique']
168
+                ],
169
+                'rechercher_champs' => [
170
+                    'surtitre' => 5,
171
+                    'titre' => 8,
172
+                    'soustitre' => 5,
173
+                    'chapo' => 3,
174
+                    'texte' => 1,
175
+                    'ps' => 1,
176
+                    'nom_site' => 1,
177
+                    'url_site' => 1,
178
+                    'descriptif' => 4
179
+                ],
180
+                'rechercher_jointures' => [
181
+                    'auteur' => ['nom' => 10],
182
+                ],
183
+                'statut' => [
184
+                    [
185
+                        'champ' => 'statut',
186
+                        'publie' => 'publie',
187
+                        'previsu' => 'publie,prop,prepa/auteur',
188
+                        'post_date' => 'date',
189
+                        'exception' => ['statut', 'tout']
190
+                    ]
191
+                ],
192
+                'statut_titres' => [
193
+                    'prepa' => 'info_article_redaction',
194
+                    'prop' => 'info_article_propose',
195
+                    'publie' => 'info_article_publie',
196
+                    'refuse' => 'info_article_refuse',
197
+                    'poubelle' => 'info_article_supprime'
198
+                ],
199
+                'statut_textes_instituer' => [
200
+                    'prepa' => 'texte_statut_en_cours_redaction',
201
+                    'prop' => 'texte_statut_propose_evaluation',
202
+                    'publie' => 'texte_statut_publie',
203
+                    'refuse' => 'texte_statut_refuse',
204
+                    'poubelle' => 'texte_statut_poubelle',
205
+                ],
206
+                'texte_changer_statut' => 'texte_article_statut',
207
+                'aide_changer_statut' => 'artstatut',
208
+                'tables_jointures' => [
209
+                    'profondeur' => 'rubriques',
210
+                    #'id_auteur' => 'auteurs_liens' // declaration generique plus bas
211
+                ],
212
+            ],
213
+            'spip_auteurs' => [
214
+                'page' => 'auteur',
215
+                'texte_retour' => 'icone_retour',
216
+                'texte_ajouter' => 'titre_ajouter_un_auteur',
217
+                'texte_modifier' => 'admin_modifier_auteur',
218
+                'texte_objets' => 'icone_auteurs',
219
+                'texte_objet' => 'public:auteur',
220
+                'info_aucun_objet' => 'info_aucun_auteur',
221
+                'info_1_objet' => 'info_1_auteur',
222
+                'info_nb_objets' => 'info_nb_auteurs',
223
+                'texte_logo_objet' => 'logo_auteur',
224
+                'texte_creer_associer' => 'creer_et_associer_un_auteur',
225
+                'titre' => "nom AS titre, '' AS lang",
226
+                'date' => 'date',
227
+                'principale' => 'oui',
228
+                'champs_editables' => ['nom', 'email', 'bio', 'nom_site', 'url_site', 'imessage', 'pgp'],
229
+                'champs_versionnes' => ['nom', 'bio', 'email', 'nom_site', 'url_site', 'login'],
230
+                'field' => [
231
+                    'id_auteur' => 'bigint(21) NOT NULL',
232
+                    'nom' => "text DEFAULT '' NOT NULL",
233
+                    'bio' => "text DEFAULT '' NOT NULL",
234
+                    'email' => "tinytext DEFAULT '' NOT NULL",
235
+                    'nom_site' => "tinytext DEFAULT '' NOT NULL",
236
+                    'url_site' => "text DEFAULT '' NOT NULL",
237
+                    'login' => 'VARCHAR(255) BINARY',
238
+                    'pass' => "tinytext DEFAULT '' NOT NULL",
239
+                    'low_sec' => "tinytext DEFAULT '' NOT NULL",
240
+                    'statut' => "varchar(255)  DEFAULT '0' NOT NULL",
241
+                    'webmestre' => "varchar(3)  DEFAULT 'non' NOT NULL",
242
+                    'maj' => 'TIMESTAMP',
243
+                    'pgp' => "TEXT DEFAULT '' NOT NULL",
244
+                    'htpass' => "tinytext DEFAULT '' NOT NULL",
245
+                    'en_ligne' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
246
+                    'alea_actuel' => 'tinytext',
247
+                    'alea_futur' => 'tinytext',
248
+                    'prefs' => 'text',
249
+                    'cookie_oubli' => 'tinytext',
250
+                    'source' => "VARCHAR(10) DEFAULT 'spip' NOT NULL",
251
+                    'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
252
+                    'imessage' => "VARCHAR(3) DEFAULT '' NOT NULL"
253
+                ],
254
+                'key' => [
255
+                    'PRIMARY KEY' => 'id_auteur',
256
+                    'KEY login' => 'login',
257
+                    'KEY statut' => 'statut',
258
+                    'KEY en_ligne' => 'en_ligne',
259
+                ],
260
+                'join' => [
261
+                    'id_auteur' => 'id_auteur',
262
+                    'login' => 'login'
263
+                ],
264
+                'rechercher_champs' => [
265
+                    'nom' => 5,
266
+                    'bio' => 1,
267
+                    'email' => 1,
268
+                    'nom_site' => 1,
269
+                    'url_site' => 1,
270
+                    'login' => 1
271
+                ],
272
+                // 2 conditions pour les auteurs : statut!=poubelle,
273
+                // et avoir des articles publies
274
+                'statut' => [
275
+                    [
276
+                        'champ' => 'statut',
277
+                        'publie' => '!5poubelle',
278
+                        'previsu' => '!5poubelle',
279
+                        'exception' => 'statut'
280
+                    ],
281
+                    [
282
+                        'champ' => [
283
+                            ['spip_auteurs_liens', 'id_auteur'],
284
+                            [
285
+                                'spip_articles',
286
+                                ['id_objet', 'id_article', 'objet', 'article']
287
+                            ],
288
+                            'statut'
289
+                        ],
290
+                        'publie' => 'publie',
291
+                        'previsu' => '!',
292
+                        'post_date' => 'date',
293
+                        'exception' => ['statut', 'lien', 'tout']
294
+                    ],
295
+                ],
296
+                'statut_images' => [
297
+                    'auteur-6forum-16.png',
298
+                    '0minirezo' => 'auteur-0minirezo-16.png',
299
+                    '1comite' => 'auteur-1comite-16.png',
300
+                    '6forum' => 'auteur-6forum-16.png',
301
+                    '5poubelle' => 'auteur-5poubelle-16.png',
302
+                    'nouveau' => ''
303
+                ],
304
+                'statut_titres' => [
305
+                    'titre_image_visiteur',
306
+                    '0minirezo' => 'titre_image_administrateur',
307
+                    '1comite' => 'titre_image_redacteur_02',
308
+                    '6forum' => 'titre_image_visiteur',
309
+                    '5poubelle' => 'titre_image_auteur_supprime',
310
+                ],
311
+                'tables_jointures' => [#'auteurs_liens' // declaration generique plus bas
312
+                ],
313
+            ],
314
+            'spip_rubriques' => [
315
+                'page' => 'rubrique',
316
+                'url_voir' => 'rubrique',
317
+                'url_edit' => 'rubrique_edit',
318
+                'texte_retour' => 'icone_retour',
319
+                'texte_objets' => 'public:rubriques',
320
+                'texte_objet' => 'public:rubrique',
321
+                'texte_modifier' => 'icone_modifier_rubrique',
322
+                'texte_creer' => 'icone_creer_rubrique',
323
+                'texte_ajouter' => 'titre_ajouter_une_rubrique',
324
+                'texte_creer_associer' => 'creer_et_associer_une_rubrique',
325
+                'info_aucun_objet' => 'info_aucun_rubrique',
326
+                'info_1_objet' => 'info_1_rubrique',
327
+                'info_nb_objets' => 'info_nb_rubriques',
328
+                'texte_logo_objet' => 'logo_rubrique',
329
+                'texte_langue_objet' => 'titre_langue_rubrique',
330
+                'texte_definir_comme_traduction_objet' => 'texte_definir_comme_traduction_rubrique',
331
+                'titre' => 'titre, lang',
332
+                'date' => 'date',
333
+                'principale' => 'oui',
334
+                'introduction_longueur' => '600',
335
+                'champs_editables' => ['titre', 'texte', 'descriptif', 'extra'],
336
+                'champs_versionnes' => ['titre', 'descriptif', 'texte'],
337
+                'field' => [
338
+                    'id_rubrique' => 'bigint(21) NOT NULL',
339
+                    'id_parent' => "bigint(21) DEFAULT '0' NOT NULL",
340
+                    'titre' => "text DEFAULT '' NOT NULL",
341
+                    'descriptif' => "text DEFAULT '' NOT NULL",
342
+                    'texte' => "longtext DEFAULT '' NOT NULL",
343
+                    'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL",
344
+                    'maj' => 'TIMESTAMP',
345
+                    'statut' => "varchar(10) DEFAULT '0' NOT NULL",
346
+                    'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
347
+                    'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
348
+                    'langue_choisie' => "VARCHAR(3) DEFAULT 'non'",
349
+                    'statut_tmp' => "varchar(10) DEFAULT '0' NOT NULL",
350
+                    'date_tmp' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
351
+                    'profondeur' => "smallint(5) DEFAULT '0' NOT NULL"
352
+                ],
353
+                'key' => [
354
+                    'PRIMARY KEY' => 'id_rubrique',
355
+                    'KEY lang' => 'lang',
356
+                    'KEY id_parent' => 'id_parent',
357
+                ],
358
+                'parent' => [
359
+                    ['type' => 'rubrique', 'champ' => 'id_parent']
360
+                ],
361
+                'rechercher_champs' => [
362
+                    'titre' => 8,
363
+                    'descriptif' => 5,
364
+                    'texte' => 1
365
+                ],
366
+                'statut' => [
367
+                    [
368
+                        'champ' => 'statut',
369
+                        'publie' => 'publie',
370
+                        'previsu' => '!',
371
+                        'exception' => ['statut', 'tout']
372
+                    ],
373
+                ],
374
+                'tables_jointures' => [#'id_auteur' => 'auteurs_liens' // declaration generique plus bas
375
+                ],
376
+            ],
377
+            // toutes les tables ont le droit a une jointure sur les auteurs
378
+            ['tables_jointures' => ['id_auteur' => 'auteurs_liens']]
379
+        ];
380
+
381
+        // avant d'appeller les pipeline qui peuvent generer une reentrance a l'install
382
+        // initialiser la signature
383
+        $md5 = md5(serialize($infos_tables));
384
+
385
+        $GLOBALS['tables_principales'] = pipeline('declarer_tables_principales', $GLOBALS['tables_principales']);
386
+        $GLOBALS['tables_auxiliaires'] = pipeline('declarer_tables_auxiliaires', $GLOBALS['tables_auxiliaires']);
387
+        $infos_tables = pipeline('declarer_tables_objets_sql', $infos_tables);
388
+
389
+        // completer les informations manquantes ou implicites
390
+        $all = [];
391
+        foreach (array_keys($infos_tables) as $t) {
392
+            // les cles numeriques servent a declarer
393
+            // les proprietes applicables a tous les objets
394
+            // on les mets de cote
395
+            if (is_numeric($t)) {
396
+                $all = array_merge_recursive($all, $infos_tables[$t]);
397
+                unset($infos_tables[$t]);
398
+            } else {
399
+                $infos_tables[$t] = renseigner_table_objet_sql($t, $infos_tables[$t]);
400
+            }
401
+        }
402
+
403
+        // repercuter les proprietes generales communes a tous les objets
404
+        foreach (array_keys($infos_tables) as $t) {
405
+            foreach ($all as $i => $v) {
406
+                if (in_array($i, ['tables_jointures', 'champs_versionnes'])) {
407
+                    $add = $all[$i];
408
+                    // eviter les doublons de declaration de table jointure (ex des mots sur auteurs)
409
+                    // pour les declarations generiques avec cles numeriques
410
+                    if ($i == 'tables_jointures' and isset($infos_tables[$t][$i]) and is_countable($infos_tables[$t][$i]) ? count($infos_tables[$t][$i]) : 0) {
411
+                        $doublons = array_intersect($infos_tables[$t][$i], $add);
412
+                        foreach ($doublons as $d) {
413
+                            if (
414
+                                is_numeric(array_search($d, $infos_tables[$t][$i]))
415
+                                and is_numeric($k = array_search($d, $add))
416
+                            ) {
417
+                                unset($add[$k]);
418
+                            }
419
+                        }
420
+                    }
421
+                    $infos_tables[$t][$i] = array_merge($infos_tables[$t][$i] ?? [], $add);
422
+                } else {
423
+                    $infos_tables[$t][$i] = array_merge_recursive(
424
+                        $infos_tables[$t][$i] ?? [],
425
+                        $all[$i]
426
+                    );
427
+                }
428
+            }
429
+        }
430
+
431
+        // completer les tables principales et auxiliaires
432
+        // avec celles declarees uniquement dans declarer_table_objets_sql
433
+        // pour assurer la compat en transition
434
+        foreach ($infos_tables as $table => $infos) {
435
+            $principale_ou_auxiliaire = ($infos['principale'] ? 'tables_principales' : 'tables_auxiliaires');
436
+            // memoriser des champs eventuels declares par des plugins dans le pipeline tables_xxx
437
+            // qui a ete appelle avant
438
+            $mem = ($GLOBALS[$principale_ou_auxiliaire][$table] ?? []);
439
+            // l'ajouter au tableau
440
+            $GLOBALS[$principale_ou_auxiliaire][$table] = [];
441
+            if (isset($infos['field']) and isset($infos['key'])) {
442
+                foreach (['field', 'key', 'join'] as $k) {
443
+                    if (isset($infos_tables[$table][$k])) {
444
+                        $GLOBALS[$principale_ou_auxiliaire][$table][$k] = &$infos_tables[$table][$k];
445
+                    }
446
+                }
447
+            } else {
448
+                // ici on ne renvoie que les declarations, donc RIEN
449
+                // pour avoir la vrai description en base, il faut passer par trouver_table
450
+                $GLOBALS[$principale_ou_auxiliaire][$table] = [];
451
+            }
452
+            if (is_countable($mem) ? count($mem) : 0) {
453
+                foreach (array_keys($mem) as $k) {
454
+                    if (isset($GLOBALS[$principale_ou_auxiliaire][$table][$k])) {
455
+                        $GLOBALS[$principale_ou_auxiliaire][$table][$k] = array_merge(
456
+                            $GLOBALS[$principale_ou_auxiliaire][$table][$k],
457
+                            $mem[$k]
458
+                        );
459
+                    } else {
460
+                        $GLOBALS[$principale_ou_auxiliaire][$table][$k] = $mem[$k];
461
+                    }
462
+                }
463
+            }
464
+        }
465
+
466
+        // recuperer les interfaces (table_titre, table_date)
467
+        // on ne le fait que dans un second temps pour que table_objet soit fonctionnel
468
+        // dans le pipeline de declarer_tables_interfaces
469
+        include_spip('public/interfaces');
470
+        foreach (array_keys($infos_tables) as $t) {
471
+            $infos_tables[$t] = renseigner_table_objet_interfaces($t, $infos_tables[$t]);
472
+        }
473
+
474
+        $deja_la = false;
475
+        // signature
476
+        $md5 = md5(serialize($infos_tables));
477
+    }
478
+    if ($table_sql === '::md5') {
479
+        return $md5;
480
+    }
481
+    if ($table_sql and !isset($infos_tables[$table_sql])) {
482
+        #$desc = renseigner_table_objet_sql($table_sql,$desc);
483
+        $desc = renseigner_table_objet_interfaces($table_sql, $desc);
484
+
485
+        return $desc;
486
+    }
487
+    if ($table_sql) {
488
+        return $infos_tables[$table_sql] ?? [];
489
+    }
490
+
491
+    return $infos_tables;
492 492
 }
493 493
 
494 494
 
@@ -503,27 +503,27 @@  discard block
 block discarded – undo
503 503
  **/
504 504
 function base_serial(&$tables_principales) {
505 505
 
506
-	$spip_jobs = [
507
-		'id_job' => 'bigint(21) NOT NULL',
508
-		'descriptif' => "text DEFAULT '' NOT NULL",
509
-		'fonction' => 'varchar(255) NOT NULL', //nom de la fonction
510
-		'args' => "longblob DEFAULT '' NOT NULL", // arguments
511
-		'md5args' => "char(32) NOT NULL default ''", // signature des arguments
512
-		'inclure' => 'varchar(255) NOT NULL', // fichier a inclure ou path/ pour charger_fonction
513
-		'priorite' => 'smallint(6) NOT NULL default 0',
514
-		'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // date au plus tot
515
-		'status' => 'tinyint NOT NULL default 1',
516
-	];
517
-
518
-	$spip_jobs_key = [
519
-		'PRIMARY KEY' => 'id_job',
520
-		'KEY date' => 'date',
521
-		'KEY status' => 'status',
522
-	];
523
-
524
-	/// Attention: mes_fonctions peut avoir deja defini cette variable
525
-	/// il faut donc rajouter, mais pas reinitialiser
526
-	$tables_principales['spip_jobs'] = ['field' => &$spip_jobs, 'key' => &$spip_jobs_key];
506
+    $spip_jobs = [
507
+        'id_job' => 'bigint(21) NOT NULL',
508
+        'descriptif' => "text DEFAULT '' NOT NULL",
509
+        'fonction' => 'varchar(255) NOT NULL', //nom de la fonction
510
+        'args' => "longblob DEFAULT '' NOT NULL", // arguments
511
+        'md5args' => "char(32) NOT NULL default ''", // signature des arguments
512
+        'inclure' => 'varchar(255) NOT NULL', // fichier a inclure ou path/ pour charger_fonction
513
+        'priorite' => 'smallint(6) NOT NULL default 0',
514
+        'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // date au plus tot
515
+        'status' => 'tinyint NOT NULL default 1',
516
+    ];
517
+
518
+    $spip_jobs_key = [
519
+        'PRIMARY KEY' => 'id_job',
520
+        'KEY date' => 'date',
521
+        'KEY status' => 'status',
522
+    ];
523
+
524
+    /// Attention: mes_fonctions peut avoir deja defini cette variable
525
+    /// il faut donc rajouter, mais pas reinitialiser
526
+    $tables_principales['spip_jobs'] = ['field' => &$spip_jobs, 'key' => &$spip_jobs_key];
527 527
 }
528 528
 
529 529
 
@@ -535,71 +535,71 @@  discard block
 block discarded – undo
535 535
  * @return void
536 536
  **/
537 537
 function base_auxiliaires(&$tables_auxiliaires) {
538
-	$spip_resultats = [
539
-		'recherche' => "char(16) DEFAULT '' NOT NULL",
540
-		'id' => 'INT UNSIGNED NOT NULL',
541
-		'points' => "INT UNSIGNED DEFAULT '0' NOT NULL",
542
-		'table_objet' => "varchar(30) DEFAULT '' NOT NULL",
543
-		'serveur' => "char(16) DEFAULT '' NOT NULL", // hash md5 partiel du serveur de base ('' pour le serveur principal)
544
-		'maj' => 'TIMESTAMP'
545
-	];
546
-
547
-	$spip_resultats_key = [// pas de cle ni index, ca fait des insertions plus rapides et les requetes jointes utilisees en recheche ne sont pas plus lentes ...
548
-	];
549
-
550
-	$spip_auteurs_liens = [
551
-		'id_auteur' => "bigint(21) DEFAULT '0' NOT NULL",
552
-		'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
553
-		'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
554
-		'vu' => "VARCHAR(6) DEFAULT 'non' NOT NULL"
555
-	];
556
-
557
-	$spip_auteurs_liens_key = [
558
-		'PRIMARY KEY' => 'id_auteur,id_objet,objet',
559
-		'KEY id_auteur' => 'id_auteur',
560
-		'KEY id_objet' => 'id_objet',
561
-		'KEY objet' => 'objet',
562
-	];
563
-
564
-	$spip_meta = [
565
-		'nom' => 'VARCHAR (255) NOT NULL',
566
-		'valeur' => "text DEFAULT ''",
567
-		'impt' => "ENUM('non', 'oui') DEFAULT 'oui' NOT NULL",
568
-		'maj' => 'TIMESTAMP'
569
-	];
570
-
571
-	$spip_meta_key = [
572
-		'PRIMARY KEY' => 'nom'
573
-	];
574
-
575
-	$spip_jobs_liens = [
576
-		'id_job' => "bigint(21) DEFAULT '0' NOT NULL",
577
-		'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
578
-		'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
579
-	];
580
-
581
-	$spip_jobs_liens_key = [
582
-		'PRIMARY KEY' => 'id_job,id_objet,objet',
583
-		'KEY id_job' => 'id_job'
584
-	];
585
-
586
-	$tables_auxiliaires['spip_auteurs_liens'] = [
587
-		'field' => &$spip_auteurs_liens,
588
-		'key' => &$spip_auteurs_liens_key
589
-	];
590
-
591
-	$tables_auxiliaires['spip_meta'] = [
592
-		'field' => &$spip_meta,
593
-		'key' => &$spip_meta_key
594
-	];
595
-	$tables_auxiliaires['spip_resultats'] = [
596
-		'field' => &$spip_resultats,
597
-		'key' => &$spip_resultats_key
598
-	];
599
-	$tables_auxiliaires['spip_jobs_liens'] = [
600
-		'field' => &$spip_jobs_liens,
601
-		'key' => &$spip_jobs_liens_key
602
-	];
538
+    $spip_resultats = [
539
+        'recherche' => "char(16) DEFAULT '' NOT NULL",
540
+        'id' => 'INT UNSIGNED NOT NULL',
541
+        'points' => "INT UNSIGNED DEFAULT '0' NOT NULL",
542
+        'table_objet' => "varchar(30) DEFAULT '' NOT NULL",
543
+        'serveur' => "char(16) DEFAULT '' NOT NULL", // hash md5 partiel du serveur de base ('' pour le serveur principal)
544
+        'maj' => 'TIMESTAMP'
545
+    ];
546
+
547
+    $spip_resultats_key = [// pas de cle ni index, ca fait des insertions plus rapides et les requetes jointes utilisees en recheche ne sont pas plus lentes ...
548
+    ];
549
+
550
+    $spip_auteurs_liens = [
551
+        'id_auteur' => "bigint(21) DEFAULT '0' NOT NULL",
552
+        'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
553
+        'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
554
+        'vu' => "VARCHAR(6) DEFAULT 'non' NOT NULL"
555
+    ];
556
+
557
+    $spip_auteurs_liens_key = [
558
+        'PRIMARY KEY' => 'id_auteur,id_objet,objet',
559
+        'KEY id_auteur' => 'id_auteur',
560
+        'KEY id_objet' => 'id_objet',
561
+        'KEY objet' => 'objet',
562
+    ];
563
+
564
+    $spip_meta = [
565
+        'nom' => 'VARCHAR (255) NOT NULL',
566
+        'valeur' => "text DEFAULT ''",
567
+        'impt' => "ENUM('non', 'oui') DEFAULT 'oui' NOT NULL",
568
+        'maj' => 'TIMESTAMP'
569
+    ];
570
+
571
+    $spip_meta_key = [
572
+        'PRIMARY KEY' => 'nom'
573
+    ];
574
+
575
+    $spip_jobs_liens = [
576
+        'id_job' => "bigint(21) DEFAULT '0' NOT NULL",
577
+        'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
578
+        'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
579
+    ];
580
+
581
+    $spip_jobs_liens_key = [
582
+        'PRIMARY KEY' => 'id_job,id_objet,objet',
583
+        'KEY id_job' => 'id_job'
584
+    ];
585
+
586
+    $tables_auxiliaires['spip_auteurs_liens'] = [
587
+        'field' => &$spip_auteurs_liens,
588
+        'key' => &$spip_auteurs_liens_key
589
+    ];
590
+
591
+    $tables_auxiliaires['spip_meta'] = [
592
+        'field' => &$spip_meta,
593
+        'key' => &$spip_meta_key
594
+    ];
595
+    $tables_auxiliaires['spip_resultats'] = [
596
+        'field' => &$spip_resultats,
597
+        'key' => &$spip_resultats_key
598
+    ];
599
+    $tables_auxiliaires['spip_jobs_liens'] = [
600
+        'field' => &$spip_jobs_liens,
601
+        'key' => &$spip_jobs_liens_key
602
+    ];
603 603
 }
604 604
 
605 605
 
@@ -656,129 +656,129 @@  discard block
 block discarded – undo
656 656
  * @return array
657 657
  */
658 658
 function renseigner_table_objet_sql($table_sql, &$infos) {
659
-	if (!isset($infos['type'])) {
660
-		// si on arrive de base/trouver_table, on a la cle primaire :
661
-		// s'en servir pour extrapoler le type
662
-		if (isset($infos['key']['PRIMARY KEY'])) {
663
-			$primary = $infos['key']['PRIMARY KEY'];
664
-			$primary = explode(',', $primary);
665
-			$primary = reset($primary);
666
-			$infos['type'] = preg_replace(',^spip_|^id_|s$,', '', $primary);
667
-		} else {
668
-			$infos['type'] = preg_replace(',^spip_|s$,', '', $table_sql);
669
-		}
670
-	}
671
-	if (!isset($infos['type_surnoms'])) {
672
-		$infos['type_surnoms'] = [];
673
-	}
674
-
675
-	if (!isset($infos['table_objet'])) {
676
-		$infos['table_objet'] = preg_replace(',^spip_,', '', $table_sql);
677
-	}
678
-	if (!isset($infos['table_objet_surnoms'])) {
679
-		$infos['table_objet_surnoms'] = [];
680
-	}
681
-
682
-	if (!isset($infos['principale'])) {
683
-		$infos['principale'] = (isset($GLOBALS['tables_principales'][$table_sql]) ? 'oui' : false);
684
-	}
685
-
686
-	// normaliser pour pouvoir tester en php $infos['principale']?
687
-	// et dans une boucle {principale=oui}
688
-	$infos['principale'] = (($infos['principale'] and $infos['principale'] != 'non') ? 'oui' : false);
689
-
690
-	// declarer et normaliser pour pouvoir tester en php $infos['editable']?
691
-	// et dans une boucle {editable=oui}
692
-	if (!isset($infos['editable'])) {
693
-		$infos['editable'] = 'oui';
694
-	}
695
-
696
-	$infos['editable'] = (($infos['editable'] and $infos['editable'] != 'non') ? 'oui' : false);
697
-
698
-	// les urls publiques sont par defaut page=type pour les tables principales, et rien pour les autres
699
-	// seules les exceptions sont donc a declarer
700
-	if (!isset($infos['page'])) {
701
-		$infos['page'] = ($infos['principale'] ? $infos['type'] : '');
702
-	}
703
-
704
-	if (!isset($infos['url_voir'])) {
705
-		$infos['url_voir'] = $infos['type'];
706
-	}
707
-	if (!isset($infos['url_edit'])) {
708
-		$infos['url_edit'] = $infos['url_voir'] . ($infos['editable'] ? '_edit' : '');
709
-	}
710
-	if (!isset($infos['icone_objet'])) {
711
-		$infos['icone_objet'] = $infos['type'];
712
-	}
713
-
714
-	// chaines de langue
715
-	// par defaut : objet:icone_xxx_objet
716
-	if (!isset($infos['texte_retour'])) {
717
-		$infos['texte_retour'] = 'icone_retour';
718
-	}
719
-	if (!isset($infos['texte_modifier'])) {
720
-		$infos['texte_modifier'] = $infos['type'] . ':' . 'icone_modifier_' . $infos['type'];
721
-	}
722
-	if (!isset($infos['texte_creer'])) {
723
-		$infos['texte_creer'] = $infos['type'] . ':' . 'icone_creer_' . $infos['type'];
724
-	}
725
-	if (!isset($infos['texte_creer_associer'])) {
726
-		$infos['texte_creer_associer'] = $infos['type'] . ':' . 'texte_creer_associer_' . $infos['type'];
727
-	}
728
-	if (!isset($infos['texte_ajouter'])) {
729
-		// Ajouter un X
730
-		$infos['texte_ajouter'] = $infos['type'] . ':' . 'texte_ajouter_' . $infos['type'];
731
-	}
732
-	if (!isset($infos['texte_objets'])) {
733
-		$infos['texte_objets'] = $infos['type'] . ':' . 'titre_' . $infos['table_objet'];
734
-	}
735
-	if (!isset($infos['texte_objet'])) {
736
-		$infos['texte_objet'] = $infos['type'] . ':' . 'titre_' . $infos['type'];
737
-	}
738
-	if (!isset($infos['texte_logo_objet'])) {
739
-		// objet:titre_logo_objet "Logo de ce X"
740
-		$infos['texte_logo_objet'] = $infos['type'] . ':' . 'titre_logo_' . $infos['type'];
741
-	}
742
-	if (!isset($infos['texte_langue_objet'])) {
743
-		// objet:texte_langue_objet "Langue de ce X"
744
-		$infos['texte_langue_objet'] = $infos['type'] . ':' . 'titre_langue_' . $infos['type'];
745
-	}
746
-	if (!isset($infos['texte_definir_comme_traduction_objet'])) {
747
-		// "Ce X est une traduction du X numéro :"
748
-		$infos['texte_definir_comme_traduction_objet'] = $infos['type'] . ':' . 'texte_definir_comme_traduction_' . $infos['type'];
749
-	}
750
-
751
-	// objet:info_aucun_objet
752
-	if (!isset($infos['info_aucun_objet'])) {
753
-		$infos['info_aucun_objet'] = $infos['type'] . ':' . 'info_aucun_' . $infos['type'];
754
-	}
755
-	// objet:info_1_objet
756
-	if (!isset($infos['info_1_objet'])) {
757
-		$infos['info_1_objet'] = $infos['type'] . ':' . 'info_1_' . $infos['type'];
758
-	}
759
-	// objet:info_nb_objets
760
-	if (!isset($infos['info_nb_objets'])) {
761
-		$infos['info_nb_objets'] = $infos['type'] . ':' . 'info_nb_' . $infos['table_objet'];
762
-	}
763
-
764
-	if (!isset($infos['champs_editables'])) {
765
-		$infos['champs_editables'] = [];
766
-	}
767
-	if (!isset($infos['champs_versionnes'])) {
768
-		$infos['champs_versionnes'] = [];
769
-	}
770
-	if (!isset($infos['rechercher_champs'])) {
771
-		$infos['rechercher_champs'] = [];
772
-	}
773
-	if (!isset($infos['rechercher_jointures'])) {
774
-		$infos['rechercher_jointures'] = [];
775
-	}
776
-
777
-	if (!isset($infos['modeles'])) {
778
-		$infos['modeles'] = [$infos['type']];
779
-	}
780
-
781
-	return $infos;
659
+    if (!isset($infos['type'])) {
660
+        // si on arrive de base/trouver_table, on a la cle primaire :
661
+        // s'en servir pour extrapoler le type
662
+        if (isset($infos['key']['PRIMARY KEY'])) {
663
+            $primary = $infos['key']['PRIMARY KEY'];
664
+            $primary = explode(',', $primary);
665
+            $primary = reset($primary);
666
+            $infos['type'] = preg_replace(',^spip_|^id_|s$,', '', $primary);
667
+        } else {
668
+            $infos['type'] = preg_replace(',^spip_|s$,', '', $table_sql);
669
+        }
670
+    }
671
+    if (!isset($infos['type_surnoms'])) {
672
+        $infos['type_surnoms'] = [];
673
+    }
674
+
675
+    if (!isset($infos['table_objet'])) {
676
+        $infos['table_objet'] = preg_replace(',^spip_,', '', $table_sql);
677
+    }
678
+    if (!isset($infos['table_objet_surnoms'])) {
679
+        $infos['table_objet_surnoms'] = [];
680
+    }
681
+
682
+    if (!isset($infos['principale'])) {
683
+        $infos['principale'] = (isset($GLOBALS['tables_principales'][$table_sql]) ? 'oui' : false);
684
+    }
685
+
686
+    // normaliser pour pouvoir tester en php $infos['principale']?
687
+    // et dans une boucle {principale=oui}
688
+    $infos['principale'] = (($infos['principale'] and $infos['principale'] != 'non') ? 'oui' : false);
689
+
690
+    // declarer et normaliser pour pouvoir tester en php $infos['editable']?
691
+    // et dans une boucle {editable=oui}
692
+    if (!isset($infos['editable'])) {
693
+        $infos['editable'] = 'oui';
694
+    }
695
+
696
+    $infos['editable'] = (($infos['editable'] and $infos['editable'] != 'non') ? 'oui' : false);
697
+
698
+    // les urls publiques sont par defaut page=type pour les tables principales, et rien pour les autres
699
+    // seules les exceptions sont donc a declarer
700
+    if (!isset($infos['page'])) {
701
+        $infos['page'] = ($infos['principale'] ? $infos['type'] : '');
702
+    }
703
+
704
+    if (!isset($infos['url_voir'])) {
705
+        $infos['url_voir'] = $infos['type'];
706
+    }
707
+    if (!isset($infos['url_edit'])) {
708
+        $infos['url_edit'] = $infos['url_voir'] . ($infos['editable'] ? '_edit' : '');
709
+    }
710
+    if (!isset($infos['icone_objet'])) {
711
+        $infos['icone_objet'] = $infos['type'];
712
+    }
713
+
714
+    // chaines de langue
715
+    // par defaut : objet:icone_xxx_objet
716
+    if (!isset($infos['texte_retour'])) {
717
+        $infos['texte_retour'] = 'icone_retour';
718
+    }
719
+    if (!isset($infos['texte_modifier'])) {
720
+        $infos['texte_modifier'] = $infos['type'] . ':' . 'icone_modifier_' . $infos['type'];
721
+    }
722
+    if (!isset($infos['texte_creer'])) {
723
+        $infos['texte_creer'] = $infos['type'] . ':' . 'icone_creer_' . $infos['type'];
724
+    }
725
+    if (!isset($infos['texte_creer_associer'])) {
726
+        $infos['texte_creer_associer'] = $infos['type'] . ':' . 'texte_creer_associer_' . $infos['type'];
727
+    }
728
+    if (!isset($infos['texte_ajouter'])) {
729
+        // Ajouter un X
730
+        $infos['texte_ajouter'] = $infos['type'] . ':' . 'texte_ajouter_' . $infos['type'];
731
+    }
732
+    if (!isset($infos['texte_objets'])) {
733
+        $infos['texte_objets'] = $infos['type'] . ':' . 'titre_' . $infos['table_objet'];
734
+    }
735
+    if (!isset($infos['texte_objet'])) {
736
+        $infos['texte_objet'] = $infos['type'] . ':' . 'titre_' . $infos['type'];
737
+    }
738
+    if (!isset($infos['texte_logo_objet'])) {
739
+        // objet:titre_logo_objet "Logo de ce X"
740
+        $infos['texte_logo_objet'] = $infos['type'] . ':' . 'titre_logo_' . $infos['type'];
741
+    }
742
+    if (!isset($infos['texte_langue_objet'])) {
743
+        // objet:texte_langue_objet "Langue de ce X"
744
+        $infos['texte_langue_objet'] = $infos['type'] . ':' . 'titre_langue_' . $infos['type'];
745
+    }
746
+    if (!isset($infos['texte_definir_comme_traduction_objet'])) {
747
+        // "Ce X est une traduction du X numéro :"
748
+        $infos['texte_definir_comme_traduction_objet'] = $infos['type'] . ':' . 'texte_definir_comme_traduction_' . $infos['type'];
749
+    }
750
+
751
+    // objet:info_aucun_objet
752
+    if (!isset($infos['info_aucun_objet'])) {
753
+        $infos['info_aucun_objet'] = $infos['type'] . ':' . 'info_aucun_' . $infos['type'];
754
+    }
755
+    // objet:info_1_objet
756
+    if (!isset($infos['info_1_objet'])) {
757
+        $infos['info_1_objet'] = $infos['type'] . ':' . 'info_1_' . $infos['type'];
758
+    }
759
+    // objet:info_nb_objets
760
+    if (!isset($infos['info_nb_objets'])) {
761
+        $infos['info_nb_objets'] = $infos['type'] . ':' . 'info_nb_' . $infos['table_objet'];
762
+    }
763
+
764
+    if (!isset($infos['champs_editables'])) {
765
+        $infos['champs_editables'] = [];
766
+    }
767
+    if (!isset($infos['champs_versionnes'])) {
768
+        $infos['champs_versionnes'] = [];
769
+    }
770
+    if (!isset($infos['rechercher_champs'])) {
771
+        $infos['rechercher_champs'] = [];
772
+    }
773
+    if (!isset($infos['rechercher_jointures'])) {
774
+        $infos['rechercher_jointures'] = [];
775
+    }
776
+
777
+    if (!isset($infos['modeles'])) {
778
+        $infos['modeles'] = [$infos['type']];
779
+    }
780
+
781
+    return $infos;
782 782
 }
783 783
 
784 784
 /**
@@ -795,30 +795,30 @@  discard block
 block discarded – undo
795 795
  * @return array
796 796
  */
797 797
 function renseigner_table_objet_interfaces($table_sql, &$infos) {
798
-	if (!isset($infos['titre'])) {
799
-		if (isset($infos['table_objet']) and isset($GLOBALS['table_titre'][$infos['table_objet']])) {
800
-			$infos['titre'] = $GLOBALS['table_titre'][$infos['table_objet']];
801
-		} else {
802
-			$infos['titre'] = ((isset($infos['field']['titre'])) ? 'titre,' : "'' as titre,");
803
-			$infos['titre'] .= ((isset($infos['field']['lang'])) ? 'lang' : "'' as lang");
804
-		}
805
-	}
806
-	if (!isset($infos['date'])) {
807
-		if (isset($infos['table_objet']) and isset($GLOBALS['table_date'][$infos['table_objet']])) {
808
-			$infos['date'] = $GLOBALS['table_date'][$infos['table_objet']];
809
-		} else {
810
-			$infos['date'] = ((isset($infos['field']['date'])) ? 'date' : '');
811
-		}
812
-	}
813
-
814
-	$infos['statut'] ??= $GLOBALS['table_statut'][$table_sql] ?? '';
815
-	$infos['tables_jointures'] ??= [];
816
-
817
-	if (isset($GLOBALS['tables_jointures'][$table_sql])) {
818
-		$infos['tables_jointures'] = array_merge($infos['tables_jointures'], $GLOBALS['tables_jointures'][$table_sql]);
819
-	}
820
-
821
-	return $infos;
798
+    if (!isset($infos['titre'])) {
799
+        if (isset($infos['table_objet']) and isset($GLOBALS['table_titre'][$infos['table_objet']])) {
800
+            $infos['titre'] = $GLOBALS['table_titre'][$infos['table_objet']];
801
+        } else {
802
+            $infos['titre'] = ((isset($infos['field']['titre'])) ? 'titre,' : "'' as titre,");
803
+            $infos['titre'] .= ((isset($infos['field']['lang'])) ? 'lang' : "'' as lang");
804
+        }
805
+    }
806
+    if (!isset($infos['date'])) {
807
+        if (isset($infos['table_objet']) and isset($GLOBALS['table_date'][$infos['table_objet']])) {
808
+            $infos['date'] = $GLOBALS['table_date'][$infos['table_objet']];
809
+        } else {
810
+            $infos['date'] = ((isset($infos['field']['date'])) ? 'date' : '');
811
+        }
812
+    }
813
+
814
+    $infos['statut'] ??= $GLOBALS['table_statut'][$table_sql] ?? '';
815
+    $infos['tables_jointures'] ??= [];
816
+
817
+    if (isset($GLOBALS['tables_jointures'][$table_sql])) {
818
+        $infos['tables_jointures'] = array_merge($infos['tables_jointures'], $GLOBALS['tables_jointures'][$table_sql]);
819
+    }
820
+
821
+    return $infos;
822 822
 }
823 823
 
824 824
 /**
@@ -829,13 +829,13 @@  discard block
 block discarded – undo
829 829
  *     Liste et descriptions des tables principales
830 830
  **/
831 831
 function lister_tables_principales() {
832
-	static $done = false;
833
-	if (!$done or !(is_countable($GLOBALS['tables_principales']) ? count($GLOBALS['tables_principales']) : 0)) {
834
-		lister_tables_objets_sql();
835
-		$done = true;
836
-	}
832
+    static $done = false;
833
+    if (!$done or !(is_countable($GLOBALS['tables_principales']) ? count($GLOBALS['tables_principales']) : 0)) {
834
+        lister_tables_objets_sql();
835
+        $done = true;
836
+    }
837 837
 
838
-	return $GLOBALS['tables_principales'];
838
+    return $GLOBALS['tables_principales'];
839 839
 }
840 840
 
841 841
 /**
@@ -846,13 +846,13 @@  discard block
 block discarded – undo
846 846
  *     Liste et descriptions des tables auxiliaires
847 847
  **/
848 848
 function lister_tables_auxiliaires() {
849
-	static $done = false;
850
-	if (!$done or !(is_countable($GLOBALS['tables_auxiliaires']) ? count($GLOBALS['tables_auxiliaires']) : 0)) {
851
-		lister_tables_objets_sql();
852
-		$done = true;
853
-	}
849
+    static $done = false;
850
+    if (!$done or !(is_countable($GLOBALS['tables_auxiliaires']) ? count($GLOBALS['tables_auxiliaires']) : 0)) {
851
+        lister_tables_objets_sql();
852
+        $done = true;
853
+    }
854 854
 
855
-	return $GLOBALS['tables_auxiliaires'];
855
+    return $GLOBALS['tables_auxiliaires'];
856 856
 }
857 857
 
858 858
 /**
@@ -861,45 +861,45 @@  discard block
 block discarded – undo
861 861
  * @return array
862 862
  */
863 863
 function lister_tables_objets_surnoms() {
864
-	static $surnoms = null;
865
-	static $md5 = null;
866
-	if (
867
-		!$surnoms
868
-		or $md5 != lister_tables_objets_sql('::md5')
869
-	) {
870
-		// passer dans un pipeline qui permet aux plugins de declarer leurs exceptions
871
-		// pour compatibilite, car il faut dorenavent utiliser
872
-		// declarer_table_objets_sql
873
-		$surnoms = pipeline(
874
-			'declarer_tables_objets_surnoms',
875
-			[
876
-				# pour les modeles
877
-				# a enlever ?
878
-				'doc' => 'documents',
879
-				'img' => 'documents',
880
-				'emb' => 'documents',
881
-			]
882
-		);
883
-		$infos_tables = lister_tables_objets_sql();
884
-		foreach ($infos_tables as $t => $infos) {
885
-			// cas de base type=>table
886
-			// et preg_replace(',^spip_|^id_|s$,',table)=>table
887
-			if ($infos['table_objet']) { // securite, si la fonction est appelee trop tot, c'est vide
888
-				// optimisations pour table_objet
889
-				//$surnoms[$infos['type']] = $infos['table_objet'];
890
-				$surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['table_objet'];
891
-				$surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['table_objet'];
892
-				if (is_array($infos['table_objet_surnoms']) and count($infos['table_objet_surnoms'])) {
893
-					foreach ($infos['table_objet_surnoms'] as $surnom) {
894
-						$surnoms[$surnom] = $infos['table_objet'];
895
-					}
896
-				}
897
-			}
898
-		}
899
-		$md5 = lister_tables_objets_sql('::md5');
900
-	}
901
-
902
-	return $surnoms;
864
+    static $surnoms = null;
865
+    static $md5 = null;
866
+    if (
867
+        !$surnoms
868
+        or $md5 != lister_tables_objets_sql('::md5')
869
+    ) {
870
+        // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions
871
+        // pour compatibilite, car il faut dorenavent utiliser
872
+        // declarer_table_objets_sql
873
+        $surnoms = pipeline(
874
+            'declarer_tables_objets_surnoms',
875
+            [
876
+                # pour les modeles
877
+                # a enlever ?
878
+                'doc' => 'documents',
879
+                'img' => 'documents',
880
+                'emb' => 'documents',
881
+            ]
882
+        );
883
+        $infos_tables = lister_tables_objets_sql();
884
+        foreach ($infos_tables as $t => $infos) {
885
+            // cas de base type=>table
886
+            // et preg_replace(',^spip_|^id_|s$,',table)=>table
887
+            if ($infos['table_objet']) { // securite, si la fonction est appelee trop tot, c'est vide
888
+                // optimisations pour table_objet
889
+                //$surnoms[$infos['type']] = $infos['table_objet'];
890
+                $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['table_objet'];
891
+                $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['table_objet'];
892
+                if (is_array($infos['table_objet_surnoms']) and count($infos['table_objet_surnoms'])) {
893
+                    foreach ($infos['table_objet_surnoms'] as $surnom) {
894
+                        $surnoms[$surnom] = $infos['table_objet'];
895
+                    }
896
+                }
897
+            }
898
+        }
899
+        $md5 = lister_tables_objets_sql('::md5');
900
+    }
901
+
902
+    return $surnoms;
903 903
 }
904 904
 
905 905
 /**
@@ -908,35 +908,35 @@  discard block
 block discarded – undo
908 908
  * @return array
909 909
  */
910 910
 function lister_types_surnoms() {
911
-	static $surnoms = null;
912
-	static $md5 = null;
913
-	if (
914
-		!$surnoms
915
-		or $md5 != lister_tables_objets_sql('::md5')
916
-	) {
917
-		// passer dans un pipeline qui permet aux plugins de declarer leurs exceptions
918
-		// pour compatibilite, car il faut dorenavent utiliser
919
-		// declarer_table_objets_sql
920
-		$surnoms = pipeline('declarer_type_surnoms', ['racine-site' => 'site']);
921
-		$infos_tables = lister_tables_objets_sql();
922
-		foreach ($infos_tables as $t => $infos) {
923
-			if ($infos['type']) { // securite, si la fonction est appelee trop tot, c'est vide
924
-				// optimisations pour objet_type
925
-				//$surnoms[$infos['type']] = $infos['type'];
926
-				$surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['type'];
927
-				$surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['type'];
928
-				// surnoms declares
929
-				if (is_array($infos['type_surnoms']) and count($infos['type_surnoms'])) {
930
-					foreach ($infos['type_surnoms'] as $surnom) {
931
-						$surnoms[$surnom] = $infos['type'];
932
-					}
933
-				}
934
-			}
935
-		}
936
-		$md5 = lister_tables_objets_sql('::md5');
937
-	}
938
-
939
-	return $surnoms;
911
+    static $surnoms = null;
912
+    static $md5 = null;
913
+    if (
914
+        !$surnoms
915
+        or $md5 != lister_tables_objets_sql('::md5')
916
+    ) {
917
+        // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions
918
+        // pour compatibilite, car il faut dorenavent utiliser
919
+        // declarer_table_objets_sql
920
+        $surnoms = pipeline('declarer_type_surnoms', ['racine-site' => 'site']);
921
+        $infos_tables = lister_tables_objets_sql();
922
+        foreach ($infos_tables as $t => $infos) {
923
+            if ($infos['type']) { // securite, si la fonction est appelee trop tot, c'est vide
924
+                // optimisations pour objet_type
925
+                //$surnoms[$infos['type']] = $infos['type'];
926
+                $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['type'];
927
+                $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['type'];
928
+                // surnoms declares
929
+                if (is_array($infos['type_surnoms']) and count($infos['type_surnoms'])) {
930
+                    foreach ($infos['type_surnoms'] as $surnom) {
931
+                        $surnoms[$surnom] = $infos['type'];
932
+                    }
933
+                }
934
+            }
935
+        }
936
+        $md5 = lister_tables_objets_sql('::md5');
937
+    }
938
+
939
+    return $surnoms;
940 940
 }
941 941
 
942 942
 /**
@@ -950,22 +950,22 @@  discard block
 block discarded – undo
950 950
  *     Couples (nom de la table SQL => même nom, sans 'spip_' devant)
951 951
  **/
952 952
 function lister_tables_spip($serveur = '') {
953
-	static $tables = [];
954
-	if (!isset($tables[$serveur])) {
955
-		$tables[$serveur] = [];
956
-		if (!function_exists('sql_alltable')) {
957
-			include_spip('base/abstract_sql');
958
-		}
959
-		$ts = sql_alltable(null, $serveur); // toutes les tables "spip_" (ou prefixe perso)
960
-		$connexion = $GLOBALS['connexions'][$serveur ?: 0];
961
-		$spip = $connexion['prefixe'] . '_';
962
-		foreach ($ts as $t) {
963
-			$t = substr($t, strlen($spip));
964
-			$tables[$serveur]["spip_$t"] = $t;
965
-		}
966
-	}
967
-
968
-	return $tables[$serveur];
953
+    static $tables = [];
954
+    if (!isset($tables[$serveur])) {
955
+        $tables[$serveur] = [];
956
+        if (!function_exists('sql_alltable')) {
957
+            include_spip('base/abstract_sql');
958
+        }
959
+        $ts = sql_alltable(null, $serveur); // toutes les tables "spip_" (ou prefixe perso)
960
+        $connexion = $GLOBALS['connexions'][$serveur ?: 0];
961
+        $spip = $connexion['prefixe'] . '_';
962
+        foreach ($ts as $t) {
963
+            $t = substr($t, strlen($spip));
964
+            $tables[$serveur]["spip_$t"] = $t;
965
+        }
966
+    }
967
+
968
+    return $tables[$serveur];
969 969
 }
970 970
 
971 971
 
@@ -980,18 +980,18 @@  discard block
 block discarded – undo
980 980
  *     Couples (nom de la table SQL => même nom)
981 981
  **/
982 982
 function lister_toutes_tables($serveur) {
983
-	static $tables = [];
984
-	if (!isset($tables[$serveur])) {
985
-		$tables[$serveur] = [];
986
-		if (!function_exists('sql_alltable')) {
987
-			include_spip('base/abstract_sql');
988
-		}
989
-		$ts = sql_alltable('%', $serveur); // toutes les tables
990
-		foreach ($ts as $t) {
991
-			$tables[$serveur][$t] = $t;
992
-		}
993
-	}
994
-	return $tables[$serveur];
983
+    static $tables = [];
984
+    if (!isset($tables[$serveur])) {
985
+        $tables[$serveur] = [];
986
+        if (!function_exists('sql_alltable')) {
987
+            include_spip('base/abstract_sql');
988
+        }
989
+        $ts = sql_alltable('%', $serveur); // toutes les tables
990
+        foreach ($ts as $t) {
991
+            $tables[$serveur][$t] = $t;
992
+        }
993
+    }
994
+    return $tables[$serveur];
995 995
 }
996 996
 
997 997
 /**
@@ -1012,39 +1012,39 @@  discard block
 block discarded – undo
1012 1012
  **/
1013 1013
 function table_objet(string $type, string $serveur = ''): string {
1014 1014
 
1015
-	if ($type) {
1016
-		$type = preg_replace(',^spip_|^id_|s$,', '', $type);
1017
-	}
1018
-	if (!strlen($type)) {
1019
-		return '';
1020
-	}
1021
-
1022
-	$surnoms = lister_tables_objets_surnoms();
1023
-	if (isset($surnoms[$type])) {
1024
-		return $surnoms[$type];
1025
-	}
1026
-
1027
-	if ($serveur !== false) {
1028
-		$t = lister_tables_spip($serveur);
1029
-		$trouver_table = charger_fonction('trouver_table', 'base');
1030
-		$typetrim = rtrim($type, 's') . 's';
1031
-		if (
1032
-			(isset($t[$typetrim]) or in_array($typetrim, $t))
1033
-			and ($desc = $trouver_table(rtrim($type, 's') . 's', $serveur))
1034
-		) {
1035
-			return $desc['id_table'];
1036
-		} elseif (
1037
-			(isset($t[$type]) or in_array($type, $t))
1038
-			and ($desc = $trouver_table($type, $serveur))
1039
-		) {
1040
-			return $desc['id_table'];
1041
-		}
1042
-
1043
-		spip_log('table_objet(' . $type . ') calculee sans verification');
1044
-		#spip_log(debug_backtrace(),'db');
1045
-	}
1046
-
1047
-	return rtrim($type, 's') . 's'; # cas historique ne devant plus servir, sauf si $serveur=false
1015
+    if ($type) {
1016
+        $type = preg_replace(',^spip_|^id_|s$,', '', $type);
1017
+    }
1018
+    if (!strlen($type)) {
1019
+        return '';
1020
+    }
1021
+
1022
+    $surnoms = lister_tables_objets_surnoms();
1023
+    if (isset($surnoms[$type])) {
1024
+        return $surnoms[$type];
1025
+    }
1026
+
1027
+    if ($serveur !== false) {
1028
+        $t = lister_tables_spip($serveur);
1029
+        $trouver_table = charger_fonction('trouver_table', 'base');
1030
+        $typetrim = rtrim($type, 's') . 's';
1031
+        if (
1032
+            (isset($t[$typetrim]) or in_array($typetrim, $t))
1033
+            and ($desc = $trouver_table(rtrim($type, 's') . 's', $serveur))
1034
+        ) {
1035
+            return $desc['id_table'];
1036
+        } elseif (
1037
+            (isset($t[$type]) or in_array($type, $t))
1038
+            and ($desc = $trouver_table($type, $serveur))
1039
+        ) {
1040
+            return $desc['id_table'];
1041
+        }
1042
+
1043
+        spip_log('table_objet(' . $type . ') calculee sans verification');
1044
+        #spip_log(debug_backtrace(),'db');
1045
+    }
1046
+
1047
+    return rtrim($type, 's') . 's'; # cas historique ne devant plus servir, sauf si $serveur=false
1048 1048
 }
1049 1049
 
1050 1050
 /**
@@ -1065,33 +1065,33 @@  discard block
 block discarded – undo
1065 1065
  **/
1066 1066
 function table_objet_sql(string $type, string $serveur = ''): string {
1067 1067
 
1068
-	$nom = table_objet($type, $serveur);
1069
-	if (!strlen($nom)) {
1070
-		return '';
1071
-	}
1072
-	if (!isset($GLOBALS['table_des_tables']['articles'])) {
1073
-		// eviter de multiples inclusions
1074
-		include_spip('public/interfaces');
1075
-	}
1076
-	if (isset($GLOBALS['table_des_tables'][$nom])) {
1077
-		$nom = $GLOBALS['table_des_tables'][$nom];
1078
-		$nom = "spip_$nom";
1079
-	} else {
1080
-		$infos_tables = lister_tables_objets_sql();
1081
-		if (isset($infos_tables["spip_$nom"])) {
1082
-			$nom = "spip_$nom";
1083
-		} elseif ($serveur !== false) {
1084
-			$t = lister_tables_spip($serveur);
1085
-			if (isset($t[$nom]) or in_array($nom, $t)) {
1086
-				$trouver_table = charger_fonction('trouver_table', 'base');
1087
-				if ($desc = $trouver_table($nom, $serveur)) {
1088
-					return $desc['table_sql'];
1089
-				}
1090
-			}
1091
-		}
1092
-	}
1093
-
1094
-	return $nom;
1068
+    $nom = table_objet($type, $serveur);
1069
+    if (!strlen($nom)) {
1070
+        return '';
1071
+    }
1072
+    if (!isset($GLOBALS['table_des_tables']['articles'])) {
1073
+        // eviter de multiples inclusions
1074
+        include_spip('public/interfaces');
1075
+    }
1076
+    if (isset($GLOBALS['table_des_tables'][$nom])) {
1077
+        $nom = $GLOBALS['table_des_tables'][$nom];
1078
+        $nom = "spip_$nom";
1079
+    } else {
1080
+        $infos_tables = lister_tables_objets_sql();
1081
+        if (isset($infos_tables["spip_$nom"])) {
1082
+            $nom = "spip_$nom";
1083
+        } elseif ($serveur !== false) {
1084
+            $t = lister_tables_spip($serveur);
1085
+            if (isset($t[$nom]) or in_array($nom, $t)) {
1086
+                $trouver_table = charger_fonction('trouver_table', 'base');
1087
+                if ($desc = $trouver_table($nom, $serveur)) {
1088
+                    return $desc['table_sql'];
1089
+                }
1090
+            }
1091
+        }
1092
+    }
1093
+
1094
+    return $nom;
1095 1095
 }
1096 1096
 
1097 1097
 /**
@@ -1110,35 +1110,35 @@  discard block
 block discarded – undo
1110 1110
  *     Nom de la clé primaire
1111 1111
  **/
1112 1112
 function id_table_objet($type, $serveur = '') {
1113
-	static $trouver_table = null;
1114
-	$type = objet_type($type, $serveur);
1115
-	if (!$type) {
1116
-		return null;
1117
-	}
1118
-	$t = table_objet($type);
1119
-	if (!$trouver_table) {
1120
-		$trouver_table = charger_fonction('trouver_table', 'base');
1121
-	}
1122
-
1123
-	$ts = lister_tables_spip($serveur);
1124
-	if (
1125
-		in_array($t, $ts)
1126
-		or in_array($t, lister_toutes_tables($serveur))
1127
-	) {
1128
-		$desc = $trouver_table($t, $serveur);
1129
-		if (isset($desc['key']['PRIMARY KEY'])) {
1130
-			return $desc['key']['PRIMARY KEY'];
1131
-		}
1132
-		if (!$desc or isset($desc['field']["id_$type"])) {
1133
-			return "id_$type";
1134
-		}
1135
-		// sinon renvoyer le premier champ de la table...
1136
-		$keys = array_keys($desc['field']);
1137
-
1138
-		return array_shift($keys);
1139
-	}
1140
-
1141
-	return "id_$type";
1113
+    static $trouver_table = null;
1114
+    $type = objet_type($type, $serveur);
1115
+    if (!$type) {
1116
+        return null;
1117
+    }
1118
+    $t = table_objet($type);
1119
+    if (!$trouver_table) {
1120
+        $trouver_table = charger_fonction('trouver_table', 'base');
1121
+    }
1122
+
1123
+    $ts = lister_tables_spip($serveur);
1124
+    if (
1125
+        in_array($t, $ts)
1126
+        or in_array($t, lister_toutes_tables($serveur))
1127
+    ) {
1128
+        $desc = $trouver_table($t, $serveur);
1129
+        if (isset($desc['key']['PRIMARY KEY'])) {
1130
+            return $desc['key']['PRIMARY KEY'];
1131
+        }
1132
+        if (!$desc or isset($desc['field']["id_$type"])) {
1133
+            return "id_$type";
1134
+        }
1135
+        // sinon renvoyer le premier champ de la table...
1136
+        $keys = array_keys($desc['field']);
1137
+
1138
+        return array_shift($keys);
1139
+    }
1140
+
1141
+    return "id_$type";
1142 1142
 }
1143 1143
 
1144 1144
 /**
@@ -1157,60 +1157,60 @@  discard block
 block discarded – undo
1157 1157
  *     Type de l'objet
1158 1158
  **/
1159 1159
 function objet_type(string $table_objet, string $serveur = '') : ?string {
1160
-	if (!$table_objet) {
1161
-		return null;
1162
-	}
1163
-	$surnoms = lister_types_surnoms();
1164
-
1165
-	// scenario de base
1166
-	// le type est decline a partir du nom de la table en enlevant le prefixe eventuel
1167
-	// et la marque du pluriel
1168
-	// on accepte id_xx en entree aussi
1169
-	$type = preg_replace(',^spip_|^id_|s$,', '', $table_objet);
1170
-	if (isset($surnoms[$type])) {
1171
-		return $surnoms[$type];
1172
-	}
1173
-
1174
-	// securite : eliminer les caracteres non \w
1175
-	$type = preg_replace(',[^\w-],', '', $type);
1176
-
1177
-	// si le type redonne bien la table c'est bon
1178
-	// oui si table_objet ressemblait deja a un type
1179
-	if (
1180
-		$type == $table_objet
1181
-		or (table_objet($type, $serveur) == $table_objet)
1182
-		or (table_objet_sql($type, $serveur) == $table_objet)
1183
-	) {
1184
-		return $type;
1185
-	}
1186
-
1187
-	// si on ne veut pas chercher en base
1188
-	if ($serveur === false) {
1189
-		return $type;
1190
-	}
1191
-
1192
-	// sinon on passe par la cle primaire id_xx pour trouver le type
1193
-	// car le s a la fin est incertain
1194
-	// notamment en cas de pluriel derogatoire
1195
-	// id_jeu/spip_jeux id_journal/spip_journaux qui necessitent tout deux
1196
-	// une declaration jeu => jeux, journal => journaux
1197
-	// dans le pipeline declarer_tables_objets_surnoms
1198
-	$trouver_table = charger_fonction('trouver_table', 'base');
1199
-	$ts = lister_tables_spip($serveur);
1200
-	$desc = false;
1201
-	if (in_array($table_objet, $ts)) {
1202
-		$desc = $trouver_table($table_objet);
1203
-	}
1204
-	if (!$desc and in_array($table_objet = table_objet($type, $serveur), $ts)) {
1205
-		$desc = $trouver_table($table_objet, $serveur);
1206
-	}
1207
-	// si le type est declare : bingo !
1208
-	if ($desc and isset($desc['type'])) {
1209
-		return $desc['type'];
1210
-	}
1211
-
1212
-	// on a fait ce qu'on a pu
1213
-	return $type;
1160
+    if (!$table_objet) {
1161
+        return null;
1162
+    }
1163
+    $surnoms = lister_types_surnoms();
1164
+
1165
+    // scenario de base
1166
+    // le type est decline a partir du nom de la table en enlevant le prefixe eventuel
1167
+    // et la marque du pluriel
1168
+    // on accepte id_xx en entree aussi
1169
+    $type = preg_replace(',^spip_|^id_|s$,', '', $table_objet);
1170
+    if (isset($surnoms[$type])) {
1171
+        return $surnoms[$type];
1172
+    }
1173
+
1174
+    // securite : eliminer les caracteres non \w
1175
+    $type = preg_replace(',[^\w-],', '', $type);
1176
+
1177
+    // si le type redonne bien la table c'est bon
1178
+    // oui si table_objet ressemblait deja a un type
1179
+    if (
1180
+        $type == $table_objet
1181
+        or (table_objet($type, $serveur) == $table_objet)
1182
+        or (table_objet_sql($type, $serveur) == $table_objet)
1183
+    ) {
1184
+        return $type;
1185
+    }
1186
+
1187
+    // si on ne veut pas chercher en base
1188
+    if ($serveur === false) {
1189
+        return $type;
1190
+    }
1191
+
1192
+    // sinon on passe par la cle primaire id_xx pour trouver le type
1193
+    // car le s a la fin est incertain
1194
+    // notamment en cas de pluriel derogatoire
1195
+    // id_jeu/spip_jeux id_journal/spip_journaux qui necessitent tout deux
1196
+    // une declaration jeu => jeux, journal => journaux
1197
+    // dans le pipeline declarer_tables_objets_surnoms
1198
+    $trouver_table = charger_fonction('trouver_table', 'base');
1199
+    $ts = lister_tables_spip($serveur);
1200
+    $desc = false;
1201
+    if (in_array($table_objet, $ts)) {
1202
+        $desc = $trouver_table($table_objet);
1203
+    }
1204
+    if (!$desc and in_array($table_objet = table_objet($type, $serveur), $ts)) {
1205
+        $desc = $trouver_table($table_objet, $serveur);
1206
+    }
1207
+    // si le type est declare : bingo !
1208
+    if ($desc and isset($desc['type'])) {
1209
+        return $desc['type'];
1210
+    }
1211
+
1212
+    // on a fait ce qu'on a pu
1213
+    return $type;
1214 1214
 }
1215 1215
 
1216 1216
 /**
@@ -1226,62 +1226,62 @@  discard block
 block discarded – undo
1226 1226
  * @return bool
1227 1227
  */
1228 1228
 function objet_test_si_publie($objet, $id_objet, $serveur = '') {
1229
-	// voir si une fonction est definie pour faire le boulot
1230
-	// elle a la priorite dans ce cas
1231
-	if ($f = charger_fonction($objet . '_test_si_publie', 'base', true)) {
1232
-		return $f($objet, $id_objet, $serveur);
1233
-	}
1234
-
1235
-	// sinon on se fie a la declaration de l'objet si presente
1236
-	$id_table = $table_objet = table_objet($objet);
1237
-	$id_table_objet = id_table_objet($objet, $serveur);
1238
-	$trouver_table = charger_fonction('trouver_table', 'base');
1239
-	if (
1240
-		$desc = $trouver_table($table_objet, $serveur)
1241
-		and isset($desc['statut'])
1242
-		and $desc['statut']
1243
-	) {
1244
-		$boucle = new Boucle();
1245
-		$boucle->show = $desc;
1246
-		$boucle->nom = 'objet_test_si_publie';
1247
-		$boucle->id_boucle = $id_table;
1248
-		$boucle->id_table = $id_table;
1249
-		$boucle->primary = $desc['key']['PRIMARY KEY'] ?? '';
1250
-		$boucle->sql_serveur = $serveur;
1251
-		$boucle->select[] = $id_table_objet;
1252
-		$boucle->from[$table_objet] = table_objet_sql($objet, $serveur);
1253
-		$boucle->where[] = $id_table . '.' . $id_table_objet . '=' . intval($id_objet);
1254
-
1255
-		$boucle->descr['nom'] = 'objet_test_si_publie'; // eviter notice php
1256
-		$boucle->descr['sourcefile'] = 'internal';
1257
-		$boucle->descr['gram'] = 'html';
1258
-
1259
-		include_spip('public/compiler');
1260
-		include_spip('public/composer');
1261
-		instituer_boucle($boucle, false, true);
1262
-		$res = calculer_select(
1263
-			$boucle->select,
1264
-			$boucle->from,
1265
-			$boucle->from_type,
1266
-			$boucle->where,
1267
-			$boucle->join,
1268
-			$boucle->group,
1269
-			$boucle->order,
1270
-			$boucle->limit,
1271
-			$boucle->having,
1272
-			$table_objet,
1273
-			$id_table,
1274
-			$serveur
1275
-		);
1276
-		if (sql_fetch($res)) {
1277
-			return true;
1278
-		}
1279
-
1280
-		return false;
1281
-	}
1282
-
1283
-	// si pas d'info statut ni de fonction : l'objet est publie
1284
-	return true;
1229
+    // voir si une fonction est definie pour faire le boulot
1230
+    // elle a la priorite dans ce cas
1231
+    if ($f = charger_fonction($objet . '_test_si_publie', 'base', true)) {
1232
+        return $f($objet, $id_objet, $serveur);
1233
+    }
1234
+
1235
+    // sinon on se fie a la declaration de l'objet si presente
1236
+    $id_table = $table_objet = table_objet($objet);
1237
+    $id_table_objet = id_table_objet($objet, $serveur);
1238
+    $trouver_table = charger_fonction('trouver_table', 'base');
1239
+    if (
1240
+        $desc = $trouver_table($table_objet, $serveur)
1241
+        and isset($desc['statut'])
1242
+        and $desc['statut']
1243
+    ) {
1244
+        $boucle = new Boucle();
1245
+        $boucle->show = $desc;
1246
+        $boucle->nom = 'objet_test_si_publie';
1247
+        $boucle->id_boucle = $id_table;
1248
+        $boucle->id_table = $id_table;
1249
+        $boucle->primary = $desc['key']['PRIMARY KEY'] ?? '';
1250
+        $boucle->sql_serveur = $serveur;
1251
+        $boucle->select[] = $id_table_objet;
1252
+        $boucle->from[$table_objet] = table_objet_sql($objet, $serveur);
1253
+        $boucle->where[] = $id_table . '.' . $id_table_objet . '=' . intval($id_objet);
1254
+
1255
+        $boucle->descr['nom'] = 'objet_test_si_publie'; // eviter notice php
1256
+        $boucle->descr['sourcefile'] = 'internal';
1257
+        $boucle->descr['gram'] = 'html';
1258
+
1259
+        include_spip('public/compiler');
1260
+        include_spip('public/composer');
1261
+        instituer_boucle($boucle, false, true);
1262
+        $res = calculer_select(
1263
+            $boucle->select,
1264
+            $boucle->from,
1265
+            $boucle->from_type,
1266
+            $boucle->where,
1267
+            $boucle->join,
1268
+            $boucle->group,
1269
+            $boucle->order,
1270
+            $boucle->limit,
1271
+            $boucle->having,
1272
+            $table_objet,
1273
+            $id_table,
1274
+            $serveur
1275
+        );
1276
+        if (sql_fetch($res)) {
1277
+            return true;
1278
+        }
1279
+
1280
+        return false;
1281
+    }
1282
+
1283
+    // si pas d'info statut ni de fonction : l'objet est publie
1284
+    return true;
1285 1285
 }
1286 1286
 
1287 1287
 
@@ -1316,124 +1316,124 @@  discard block
 block discarded – undo
1316 1316
  *     Retourne un tableau décrivant les parents trouvés
1317 1317
  */
1318 1318
 function objet_lister_parents($objet, $id_objet, $parent_direct_seulement = false) {
1319
-	$parents = [];
1320
-
1321
-	// Si on trouve une ou des méthodes de parent
1322
-	if ($parent_methodes = objet_type_decrire_infos_parents($objet)) {
1323
-		// On identifie les informations sur l'objet source dont on cherche le parent.
1324
-		include_spip('base/abstract_sql');
1325
-		$table_objet = table_objet_sql($objet);
1326
-		$cle_objet = id_table_objet($objet);
1327
-		$id_objet = intval($id_objet);
1328
-
1329
-		// On teste chacun méthode dans l'ordre, et dès qu'on a trouvé un parent on s'arrête
1330
-		foreach ($parent_methodes as $parent_methode) {
1331
-			// Champ identifiant le parent (id et éventuellement le type)
1332
-			// -- cette identification ne dépend pas du fait que le parent soit stocké dans une table de différente
1333
-			//    de celle de l'objet source
1334
-			$select = [];
1335
-			if (isset($parent_methode['champ'])) {
1336
-				$select[] = $parent_methode['champ'];
1337
-			}
1338
-			if (isset($parent_methode['champ_type'])) {
1339
-				$select[] = $parent_methode['champ_type'];
1340
-			}
1341
-
1342
-			// Détermination de la table du parent et des conditions sur l'objet source et le parent.
1343
-			$condition_objet_invalide = false;
1344
-			$where = [];
1345
-			if (!isset($parent_methode['table'])) {
1346
-				// Le parent est stocké dans la même table que l'objet source :
1347
-				// -- toutes les conditions s'appliquent à la table source.
1348
-				$table = $table_objet;
1349
-				$where = ["$cle_objet = $id_objet"];
1350
-				// -- Condition supplémentaire sur la détection du parent
1351
-				if (isset($parent_methode['condition'])) {
1352
-					$where[] = $parent_methode['condition'];
1353
-				}
1354
-			} elseif (!$parent_direct_seulement) {
1355
-				// Le parent est stocké dans une table différente de l'objet source.
1356
-				// -- on vérifie d'emblée si il y a une condition sur l'objet source et si celle-ci est vérifiée
1357
-				//    Si non, on peut arrêter le traitement.
1358
-				if (isset($parent_methode['condition'])) {
1359
-					$where = [
1360
-						"$cle_objet = $id_objet",
1361
-						$parent_methode['condition']
1362
-					];
1363
-					if (!sql_countsel($table_objet, $where)) {
1364
-						$condition_objet_invalide = true;
1365
-					}
1366
-				}
1367
-
1368
-				// Si pas de condition sur l'objet source ou que la condition est vérifiée, on peut construire
1369
-				// la requête sur la table qui accueille le parent.
1370
-				if (!$condition_objet_invalide) {
1371
-					$table = $parent_methode['table'];
1372
-					// On construit les conditions en fonction de l'identification de l'objet source
1373
-					$where = [];
1374
-					// -- si le champ_source de l'id n'est pas précisé c'est qu'il est déjà connu et donc que c'est
1375
-					//    le même que celui de l'objet source.
1376
-					$where[] = isset($parent_methode['source_champ'])
1377
-						? "{$parent_methode['source_champ']} = $id_objet"
1378
-						: "${cle_objet} = $id_objet";
1379
-					if (isset($parent_methode['source_champ_type'])) {
1380
-						$where[] = "{$parent_methode['source_champ_type']} = " . sql_quote($objet);
1381
-					}
1382
-					// -- Condition supplémentaire sur la détection du parent
1383
-					if (isset($parent_methode['table_condition'])) {
1384
-						$where[] = $parent_methode['table_condition'];
1385
-					}
1386
-				}
1387
-			}
1388
-
1389
-			// On lance la requête de récupération du parent
1390
-			$is_table_lien = (strpos($table, '_liens') !== false and substr($table, -6) === '_liens');
1391
-			if (
1392
-				!$condition_objet_invalide
1393
-				and $where
1394
-				and ($lignes = sql_allfetsel($is_table_lien ? '*' : $select, $table, $where))
1395
-			) {
1396
-				foreach ($lignes as $ligne) {
1397
-					// Si le type est fixe
1398
-					if (isset($parent_methode['type'])) {
1399
-						$parent = [
1400
-							'objet' 	=> $parent_methode['type'],
1401
-							'id_objet'	=> intval($ligne[$parent_methode['champ']]),
1402
-							'champ' 	=> $parent_methode['champ'],
1403
-							'table'    => $table,
1404
-						];
1405
-					}
1406
-					elseif (isset($parent_methode['champ_type'])) {
1407
-						$parent = [
1408
-							'objet' 	 => $ligne[$parent_methode['champ_type']],
1409
-							'id_objet' 	 => intval($ligne[$parent_methode['champ']]),
1410
-							'champ' 	 => $parent_methode['champ'],
1411
-							'champ_type' => $parent_methode['champ_type'],
1412
-							'table'    => $table,
1413
-						];
1414
-					}
1415
-					if ($is_table_lien) {
1416
-						$parent['lien'] = $ligne;
1417
-					}
1418
-					$parents[] = $parent;
1419
-				}
1420
-			}
1421
-		}
1422
-	}
1423
-
1424
-	// On passe par un pipeline avant de retourner
1425
-	$parents = pipeline(
1426
-		'objet_lister_parents',
1427
-		[
1428
-			'args' => [
1429
-				'objet' => $objet,
1430
-				'id_objet' => $id_objet,
1431
-			],
1432
-			'data' => $parents,
1433
-		]
1434
-	);
1435
-
1436
-	return $parents;
1319
+    $parents = [];
1320
+
1321
+    // Si on trouve une ou des méthodes de parent
1322
+    if ($parent_methodes = objet_type_decrire_infos_parents($objet)) {
1323
+        // On identifie les informations sur l'objet source dont on cherche le parent.
1324
+        include_spip('base/abstract_sql');
1325
+        $table_objet = table_objet_sql($objet);
1326
+        $cle_objet = id_table_objet($objet);
1327
+        $id_objet = intval($id_objet);
1328
+
1329
+        // On teste chacun méthode dans l'ordre, et dès qu'on a trouvé un parent on s'arrête
1330
+        foreach ($parent_methodes as $parent_methode) {
1331
+            // Champ identifiant le parent (id et éventuellement le type)
1332
+            // -- cette identification ne dépend pas du fait que le parent soit stocké dans une table de différente
1333
+            //    de celle de l'objet source
1334
+            $select = [];
1335
+            if (isset($parent_methode['champ'])) {
1336
+                $select[] = $parent_methode['champ'];
1337
+            }
1338
+            if (isset($parent_methode['champ_type'])) {
1339
+                $select[] = $parent_methode['champ_type'];
1340
+            }
1341
+
1342
+            // Détermination de la table du parent et des conditions sur l'objet source et le parent.
1343
+            $condition_objet_invalide = false;
1344
+            $where = [];
1345
+            if (!isset($parent_methode['table'])) {
1346
+                // Le parent est stocké dans la même table que l'objet source :
1347
+                // -- toutes les conditions s'appliquent à la table source.
1348
+                $table = $table_objet;
1349
+                $where = ["$cle_objet = $id_objet"];
1350
+                // -- Condition supplémentaire sur la détection du parent
1351
+                if (isset($parent_methode['condition'])) {
1352
+                    $where[] = $parent_methode['condition'];
1353
+                }
1354
+            } elseif (!$parent_direct_seulement) {
1355
+                // Le parent est stocké dans une table différente de l'objet source.
1356
+                // -- on vérifie d'emblée si il y a une condition sur l'objet source et si celle-ci est vérifiée
1357
+                //    Si non, on peut arrêter le traitement.
1358
+                if (isset($parent_methode['condition'])) {
1359
+                    $where = [
1360
+                        "$cle_objet = $id_objet",
1361
+                        $parent_methode['condition']
1362
+                    ];
1363
+                    if (!sql_countsel($table_objet, $where)) {
1364
+                        $condition_objet_invalide = true;
1365
+                    }
1366
+                }
1367
+
1368
+                // Si pas de condition sur l'objet source ou que la condition est vérifiée, on peut construire
1369
+                // la requête sur la table qui accueille le parent.
1370
+                if (!$condition_objet_invalide) {
1371
+                    $table = $parent_methode['table'];
1372
+                    // On construit les conditions en fonction de l'identification de l'objet source
1373
+                    $where = [];
1374
+                    // -- si le champ_source de l'id n'est pas précisé c'est qu'il est déjà connu et donc que c'est
1375
+                    //    le même que celui de l'objet source.
1376
+                    $where[] = isset($parent_methode['source_champ'])
1377
+                        ? "{$parent_methode['source_champ']} = $id_objet"
1378
+                        : "${cle_objet} = $id_objet";
1379
+                    if (isset($parent_methode['source_champ_type'])) {
1380
+                        $where[] = "{$parent_methode['source_champ_type']} = " . sql_quote($objet);
1381
+                    }
1382
+                    // -- Condition supplémentaire sur la détection du parent
1383
+                    if (isset($parent_methode['table_condition'])) {
1384
+                        $where[] = $parent_methode['table_condition'];
1385
+                    }
1386
+                }
1387
+            }
1388
+
1389
+            // On lance la requête de récupération du parent
1390
+            $is_table_lien = (strpos($table, '_liens') !== false and substr($table, -6) === '_liens');
1391
+            if (
1392
+                !$condition_objet_invalide
1393
+                and $where
1394
+                and ($lignes = sql_allfetsel($is_table_lien ? '*' : $select, $table, $where))
1395
+            ) {
1396
+                foreach ($lignes as $ligne) {
1397
+                    // Si le type est fixe
1398
+                    if (isset($parent_methode['type'])) {
1399
+                        $parent = [
1400
+                            'objet' 	=> $parent_methode['type'],
1401
+                            'id_objet'	=> intval($ligne[$parent_methode['champ']]),
1402
+                            'champ' 	=> $parent_methode['champ'],
1403
+                            'table'    => $table,
1404
+                        ];
1405
+                    }
1406
+                    elseif (isset($parent_methode['champ_type'])) {
1407
+                        $parent = [
1408
+                            'objet' 	 => $ligne[$parent_methode['champ_type']],
1409
+                            'id_objet' 	 => intval($ligne[$parent_methode['champ']]),
1410
+                            'champ' 	 => $parent_methode['champ'],
1411
+                            'champ_type' => $parent_methode['champ_type'],
1412
+                            'table'    => $table,
1413
+                        ];
1414
+                    }
1415
+                    if ($is_table_lien) {
1416
+                        $parent['lien'] = $ligne;
1417
+                    }
1418
+                    $parents[] = $parent;
1419
+                }
1420
+            }
1421
+        }
1422
+    }
1423
+
1424
+    // On passe par un pipeline avant de retourner
1425
+    $parents = pipeline(
1426
+        'objet_lister_parents',
1427
+        [
1428
+            'args' => [
1429
+                'objet' => $objet,
1430
+                'id_objet' => $id_objet,
1431
+            ],
1432
+            'data' => $parents,
1433
+        ]
1434
+    );
1435
+
1436
+    return $parents;
1437 1437
 }
1438 1438
 
1439 1439
 /**
@@ -1445,17 +1445,17 @@  discard block
 block discarded – undo
1445 1445
  * @return array
1446 1446
  */
1447 1447
 function objet_lister_parents_par_type($objet, $id_objet) {
1448
-	$parents = objet_lister_parents($objet, $id_objet);
1448
+    $parents = objet_lister_parents($objet, $id_objet);
1449 1449
 
1450
-	$parents_par_type = [];
1451
-	foreach ($parents as $parent) {
1452
-		if (!isset($parents_par_type[$parent['objet']])) {
1453
-			$parents_par_type[$parent['objet']] = [];
1454
-		}
1455
-		$parents_par_type[$parent['objet']][] = $parent['id_objet'];
1456
-	}
1450
+    $parents_par_type = [];
1451
+    foreach ($parents as $parent) {
1452
+        if (!isset($parents_par_type[$parent['objet']])) {
1453
+            $parents_par_type[$parent['objet']] = [];
1454
+        }
1455
+        $parents_par_type[$parent['objet']][] = $parent['id_objet'];
1456
+    }
1457 1457
 
1458
-	return $parents_par_type;
1458
+    return $parents_par_type;
1459 1459
 }
1460 1460
 
1461 1461
 
@@ -1488,85 +1488,85 @@  discard block
 block discarded – undo
1488 1488
  *     Retourne un tableau de tableaux, avec comme clés les types des objets, et dans chacun un tableau des identifiants trouvés
1489 1489
  */
1490 1490
 function objet_lister_enfants($objet, $id_objet) {
1491
-	$enfants = [];
1492
-
1493
-	// Si on trouve des types d'enfants et leurs méthodes
1494
-	if ($enfants_methodes = objet_type_decrire_infos_enfants($objet)) {
1495
-		include_spip('base/abstract_sql');
1496
-		$id_objet = intval($id_objet);
1497
-
1498
-		// On parcourt tous les types d'enfants trouvés
1499
-		foreach ($enfants_methodes as $objet_enfant => $_methode_parent) {
1500
-			// On construit les conditions d'identification du parent
1501
-			$where = [];
1502
-			// -- L'identifiant du parent
1503
-			if (isset($_methode_parent['champ'])) {
1504
-				$where[] = $_methode_parent['champ'] . ' = ' . $id_objet;
1505
-			}
1506
-			// -- Si le parent est variable
1507
-			if (isset($_methode_parent['champ_type'])) {
1508
-				$where[] = $_methode_parent['champ_type'] . ' = ' . sql_quote($objet);
1509
-			}
1510
-
1511
-			// On détermine la table, le champ id des enfants et on complète éventuellement les conditions
1512
-			if (!isset($_methode_parent['table'])) {
1513
-				// Les enfants sont stockés dans la même table que l'objet parent :
1514
-				$table_enfant = table_objet_sql($objet_enfant);
1515
-				$cle_objet_enfant = id_table_objet($objet_enfant);
1516
-
1517
-				// S'il y a une condition supplémentaire
1518
-				if (isset($_methode_parent['condition'])) {
1519
-					$where[] = $_methode_parent['condition'];
1520
-				}
1521
-			} else {
1522
-				// Les enfants sont stockés dans une table différente de l'objet parent.
1523
-				$table_enfant = $_methode_parent['table'];
1524
-				$cle_objet_enfant = $_methode_parent['source_champ'] ?? id_table_objet($objet_enfant);
1525
-
1526
-				// S'il y a une condition supplémentaire
1527
-				if (isset($_methode_parent['table_condition'])) {
1528
-					$where[] = $_methode_parent['table_condition'];
1529
-				}
1530
-			}
1531
-
1532
-			// On lance la requête
1533
-			$is_table_lien = (strpos($table_enfant, '_liens') !== false and substr($table_enfant, -6) === '_liens');
1534
-			if ($rows = sql_allfetsel($is_table_lien ? '*' : $cle_objet_enfant, $table_enfant, $where)) {
1535
-				$enfant = [
1536
-					'objet' => $objet_enfant,
1537
-					'id_objet' => 0,
1538
-					'table' => $table_enfant
1539
-				];
1540
-				if (isset($_methode_parent['champ'])) {
1541
-					$enfant['champ'] = $_methode_parent['champ'];
1542
-				}
1543
-				if (isset($_methode_parent['champ_type'])) {
1544
-					$enfant['champ_type'] = $_methode_parent['champ_type'];
1545
-				}
1546
-				foreach ($rows as $row) {
1547
-					$enfant['id_objet'] = intval($row[$cle_objet_enfant]);
1548
-					if ($is_table_lien) {
1549
-						$enfant['lien'] = $row;
1550
-					}
1551
-					$enfants[] = $enfant;
1552
-				}
1553
-			}
1554
-		}
1555
-	}
1556
-
1557
-	// On passe par un pipeline avant de retourner
1558
-	$enfants = pipeline(
1559
-		'objet_lister_enfants',
1560
-		[
1561
-			'args' => [
1562
-				'objet' => $objet,
1563
-				'id_objet' => $id_objet,
1564
-			],
1565
-			'data' => $enfants,
1566
-		]
1567
-	);
1568
-
1569
-	return $enfants;
1491
+    $enfants = [];
1492
+
1493
+    // Si on trouve des types d'enfants et leurs méthodes
1494
+    if ($enfants_methodes = objet_type_decrire_infos_enfants($objet)) {
1495
+        include_spip('base/abstract_sql');
1496
+        $id_objet = intval($id_objet);
1497
+
1498
+        // On parcourt tous les types d'enfants trouvés
1499
+        foreach ($enfants_methodes as $objet_enfant => $_methode_parent) {
1500
+            // On construit les conditions d'identification du parent
1501
+            $where = [];
1502
+            // -- L'identifiant du parent
1503
+            if (isset($_methode_parent['champ'])) {
1504
+                $where[] = $_methode_parent['champ'] . ' = ' . $id_objet;
1505
+            }
1506
+            // -- Si le parent est variable
1507
+            if (isset($_methode_parent['champ_type'])) {
1508
+                $where[] = $_methode_parent['champ_type'] . ' = ' . sql_quote($objet);
1509
+            }
1510
+
1511
+            // On détermine la table, le champ id des enfants et on complète éventuellement les conditions
1512
+            if (!isset($_methode_parent['table'])) {
1513
+                // Les enfants sont stockés dans la même table que l'objet parent :
1514
+                $table_enfant = table_objet_sql($objet_enfant);
1515
+                $cle_objet_enfant = id_table_objet($objet_enfant);
1516
+
1517
+                // S'il y a une condition supplémentaire
1518
+                if (isset($_methode_parent['condition'])) {
1519
+                    $where[] = $_methode_parent['condition'];
1520
+                }
1521
+            } else {
1522
+                // Les enfants sont stockés dans une table différente de l'objet parent.
1523
+                $table_enfant = $_methode_parent['table'];
1524
+                $cle_objet_enfant = $_methode_parent['source_champ'] ?? id_table_objet($objet_enfant);
1525
+
1526
+                // S'il y a une condition supplémentaire
1527
+                if (isset($_methode_parent['table_condition'])) {
1528
+                    $where[] = $_methode_parent['table_condition'];
1529
+                }
1530
+            }
1531
+
1532
+            // On lance la requête
1533
+            $is_table_lien = (strpos($table_enfant, '_liens') !== false and substr($table_enfant, -6) === '_liens');
1534
+            if ($rows = sql_allfetsel($is_table_lien ? '*' : $cle_objet_enfant, $table_enfant, $where)) {
1535
+                $enfant = [
1536
+                    'objet' => $objet_enfant,
1537
+                    'id_objet' => 0,
1538
+                    'table' => $table_enfant
1539
+                ];
1540
+                if (isset($_methode_parent['champ'])) {
1541
+                    $enfant['champ'] = $_methode_parent['champ'];
1542
+                }
1543
+                if (isset($_methode_parent['champ_type'])) {
1544
+                    $enfant['champ_type'] = $_methode_parent['champ_type'];
1545
+                }
1546
+                foreach ($rows as $row) {
1547
+                    $enfant['id_objet'] = intval($row[$cle_objet_enfant]);
1548
+                    if ($is_table_lien) {
1549
+                        $enfant['lien'] = $row;
1550
+                    }
1551
+                    $enfants[] = $enfant;
1552
+                }
1553
+            }
1554
+        }
1555
+    }
1556
+
1557
+    // On passe par un pipeline avant de retourner
1558
+    $enfants = pipeline(
1559
+        'objet_lister_enfants',
1560
+        [
1561
+            'args' => [
1562
+                'objet' => $objet,
1563
+                'id_objet' => $id_objet,
1564
+            ],
1565
+            'data' => $enfants,
1566
+        ]
1567
+    );
1568
+
1569
+    return $enfants;
1570 1570
 }
1571 1571
 
1572 1572
 /**
@@ -1578,17 +1578,17 @@  discard block
 block discarded – undo
1578 1578
  * @return array
1579 1579
  */
1580 1580
 function objet_lister_enfants_par_type($objet, $id_objet) {
1581
-	$enfants = objet_lister_enfants($objet, $id_objet);
1581
+    $enfants = objet_lister_enfants($objet, $id_objet);
1582 1582
 
1583
-	$enfants_par_type = [];
1584
-	foreach ($enfants as $enfant) {
1585
-		if (!isset($enfants_par_type[$enfant['objet']])) {
1586
-			$enfants_par_type[$enfant['objet']] = [];
1587
-		}
1588
-		$enfants_par_type[$enfant['objet']][] = $enfant['id_objet'];
1589
-	}
1583
+    $enfants_par_type = [];
1584
+    foreach ($enfants as $enfant) {
1585
+        if (!isset($enfants_par_type[$enfant['objet']])) {
1586
+            $enfants_par_type[$enfant['objet']] = [];
1587
+        }
1588
+        $enfants_par_type[$enfant['objet']][] = $enfant['id_objet'];
1589
+    }
1590 1590
 
1591
-	return $enfants_par_type;
1591
+    return $enfants_par_type;
1592 1592
 }
1593 1593
 
1594 1594
 /**
@@ -1600,35 +1600,35 @@  discard block
 block discarded – undo
1600 1600
  *     Retourne un tableau de tableau contenant les informations de type et de champ pour trouver le parent ou false sinon
1601 1601
  */
1602 1602
 function objet_type_decrire_infos_parents($objet) {
1603
-	static $parents = [];
1604
-
1605
-	// Si on ne l'a pas encore cherché pour cet objet
1606
-	if (!isset($parents[$objet])) {
1607
-		$parents[$objet] = false;
1608
-		$table = table_objet_sql($objet);
1609
-
1610
-		// Si on trouve bien la description de cet objet
1611
-		if ($infos = lister_tables_objets_sql($table)) {
1612
-			if (isset($infos['parent']) and is_array($infos['parent'])) {
1613
-				// S'il y a une description explicite de parent, c'est prioritaire
1614
-				// -- on traite les cas où il y a une ou plusieurs description mais on renvoie toujours un tableau
1615
-				//    de description
1616
-				if (!isset($infos['parent'][0])) {
1617
-					$parents[$objet] = [$infos['parent']];
1618
-				} else {
1619
-					$parents[$objet] = $infos['parent'];
1620
-				}
1621
-			} elseif (isset($infos['field']['id_rubrique'])) {
1622
-				// Sinon on cherche des cas courants connus magiquement, à commencer par id_rubrique
1623
-				$parents[$objet] = [['type' => 'rubrique', 'champ' => 'id_rubrique']];
1624
-			} elseif (isset($infos['field']['id_parent'])) {
1625
-				// Sinon on cherche un champ id_parent, ce qui signifie que l'objet est parent de lui-même
1626
-				$parents[$objet] = [['type' => $objet, 'champ' => 'id_parent']];
1627
-			}
1628
-		}
1629
-	}
1630
-
1631
-	return $parents[$objet];
1603
+    static $parents = [];
1604
+
1605
+    // Si on ne l'a pas encore cherché pour cet objet
1606
+    if (!isset($parents[$objet])) {
1607
+        $parents[$objet] = false;
1608
+        $table = table_objet_sql($objet);
1609
+
1610
+        // Si on trouve bien la description de cet objet
1611
+        if ($infos = lister_tables_objets_sql($table)) {
1612
+            if (isset($infos['parent']) and is_array($infos['parent'])) {
1613
+                // S'il y a une description explicite de parent, c'est prioritaire
1614
+                // -- on traite les cas où il y a une ou plusieurs description mais on renvoie toujours un tableau
1615
+                //    de description
1616
+                if (!isset($infos['parent'][0])) {
1617
+                    $parents[$objet] = [$infos['parent']];
1618
+                } else {
1619
+                    $parents[$objet] = $infos['parent'];
1620
+                }
1621
+            } elseif (isset($infos['field']['id_rubrique'])) {
1622
+                // Sinon on cherche des cas courants connus magiquement, à commencer par id_rubrique
1623
+                $parents[$objet] = [['type' => 'rubrique', 'champ' => 'id_rubrique']];
1624
+            } elseif (isset($infos['field']['id_parent'])) {
1625
+                // Sinon on cherche un champ id_parent, ce qui signifie que l'objet est parent de lui-même
1626
+                $parents[$objet] = [['type' => $objet, 'champ' => 'id_parent']];
1627
+            }
1628
+        }
1629
+    }
1630
+
1631
+    return $parents[$objet];
1632 1632
 }
1633 1633
 
1634 1634
 /**
@@ -1640,36 +1640,36 @@  discard block
 block discarded – undo
1640 1640
  *     Retourne un tableau de tableaux contenant chacun les informations d'un type d'enfant
1641 1641
  */
1642 1642
 function objet_type_decrire_infos_enfants($objet) {
1643
-	static $enfants = [];
1644
-
1645
-	// Si on a déjà fait la recherche pour ce type d'objet
1646
-	if (!isset($enfants[$objet])) {
1647
-		$enfants[$objet] = [];
1648
-		$tables = lister_tables_objets_sql();
1649
-
1650
-		// On parcourt toutes les tables d'objet, et on cherche si chacune peut être enfant
1651
-		foreach ($tables as $table => $infos) {
1652
-			$objet_enfant = objet_type($table);
1653
-
1654
-			// On ne va pas refaire les tests des différents cas, on réutilise
1655
-			if ($parent_methodes = objet_type_decrire_infos_parents($objet_enfant)) {
1656
-				// On parcourt les différents cas possible, si certains peuvent concerner l'objet demandé
1657
-				foreach ($parent_methodes as $parent_methode) {
1658
-					// Si la méthode qu'on teste n'exclut pas le parent demandé
1659
-					if (!isset($parent_methode['exclus']) or !in_array($objet, $parent_methode['exclus'])) {
1660
-						// Si le type du parent est fixe et directement l'objet demandé
1661
-						if (isset($parent_methode['type']) and isset($parent_methode['champ']) and $parent_methode['type'] == $objet) {
1662
-							$enfants[$objet][$objet_enfant] = $parent_methode;
1663
-						}
1664
-						// Si le type est variable, alors l'objet demandé peut forcément être parent
1665
-						elseif (isset($parent_methode['champ_type']) and isset($parent_methode['champ'])) {
1666
-							$enfants[$objet][$objet_enfant] = $parent_methode;
1667
-						}
1668
-					}
1669
-				}
1670
-			}
1671
-		}
1672
-	}
1673
-
1674
-	return $enfants[$objet];
1643
+    static $enfants = [];
1644
+
1645
+    // Si on a déjà fait la recherche pour ce type d'objet
1646
+    if (!isset($enfants[$objet])) {
1647
+        $enfants[$objet] = [];
1648
+        $tables = lister_tables_objets_sql();
1649
+
1650
+        // On parcourt toutes les tables d'objet, et on cherche si chacune peut être enfant
1651
+        foreach ($tables as $table => $infos) {
1652
+            $objet_enfant = objet_type($table);
1653
+
1654
+            // On ne va pas refaire les tests des différents cas, on réutilise
1655
+            if ($parent_methodes = objet_type_decrire_infos_parents($objet_enfant)) {
1656
+                // On parcourt les différents cas possible, si certains peuvent concerner l'objet demandé
1657
+                foreach ($parent_methodes as $parent_methode) {
1658
+                    // Si la méthode qu'on teste n'exclut pas le parent demandé
1659
+                    if (!isset($parent_methode['exclus']) or !in_array($objet, $parent_methode['exclus'])) {
1660
+                        // Si le type du parent est fixe et directement l'objet demandé
1661
+                        if (isset($parent_methode['type']) and isset($parent_methode['champ']) and $parent_methode['type'] == $objet) {
1662
+                            $enfants[$objet][$objet_enfant] = $parent_methode;
1663
+                        }
1664
+                        // Si le type est variable, alors l'objet demandé peut forcément être parent
1665
+                        elseif (isset($parent_methode['champ_type']) and isset($parent_methode['champ'])) {
1666
+                            $enfants[$objet][$objet_enfant] = $parent_methode;
1667
+                        }
1668
+                    }
1669
+                }
1670
+            }
1671
+        }
1672
+    }
1673
+
1674
+    return $enfants[$objet];
1675 1675
 }
Please login to merge, or discard this patch.