Completed
Push — master ( 238d74...1c4dd4 )
by cam
01:23
created
ecrire/action/desinstaller_plugin.php 1 patch
Indentation   +25 added lines, -25 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  */
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -31,28 +31,28 @@  discard block
 block discarded – undo
31 31
  */
32 32
 function action_desinstaller_plugin_dist() {
33 33
 
34
-	$securiser_action = charger_fonction('securiser_action', 'inc');
35
-	$arg = $securiser_action();
36
-	[$dir_plugins, $plugin] = explode('::', (string) $arg);
37
-	$dir_type = '_DIR_PLUGINS';
38
-	if (defined('_DIR_PLUGINS_SUPPL') && $dir_plugins == _DIR_PLUGINS_SUPPL) {
39
-		$dir_type = '_DIR_PLUGINS_SUPPL';
40
-	}
41
-	$installer_plugins = charger_fonction('installer', 'plugins');
42
-	$infos = $installer_plugins($plugin, 'uninstall', $dir_type);
43
-	if ($infos && !$infos['install_test'][0]) {
44
-		include_spip('inc/plugin');
45
-		ecrire_plugin_actifs([$plugin], false, 'enleve');
46
-		$erreur = '';
47
-	} else {
48
-		$erreur = 'erreur_plugin_desinstalation_echouee';
49
-	}
50
-	if ($redirect = _request('redirect')) {
51
-		include_spip('inc/headers');
52
-		if ($erreur) {
53
-			$redirect = parametre_url($redirect, 'erreur', $erreur);
54
-		}
55
-		$redirect = str_replace('&', '&', (string) $redirect);
56
-		redirige_par_entete($redirect);
57
-	}
34
+    $securiser_action = charger_fonction('securiser_action', 'inc');
35
+    $arg = $securiser_action();
36
+    [$dir_plugins, $plugin] = explode('::', (string) $arg);
37
+    $dir_type = '_DIR_PLUGINS';
38
+    if (defined('_DIR_PLUGINS_SUPPL') && $dir_plugins == _DIR_PLUGINS_SUPPL) {
39
+        $dir_type = '_DIR_PLUGINS_SUPPL';
40
+    }
41
+    $installer_plugins = charger_fonction('installer', 'plugins');
42
+    $infos = $installer_plugins($plugin, 'uninstall', $dir_type);
43
+    if ($infos && !$infos['install_test'][0]) {
44
+        include_spip('inc/plugin');
45
+        ecrire_plugin_actifs([$plugin], false, 'enleve');
46
+        $erreur = '';
47
+    } else {
48
+        $erreur = 'erreur_plugin_desinstalation_echouee';
49
+    }
50
+    if ($redirect = _request('redirect')) {
51
+        include_spip('inc/headers');
52
+        if ($erreur) {
53
+            $redirect = parametre_url($redirect, 'erreur', $erreur);
54
+        }
55
+        $redirect = str_replace('&', '&', (string) $redirect);
56
+        redirige_par_entete($redirect);
57
+    }
58 58
 }
Please login to merge, or discard this patch.
ecrire/action/instituer_objet.php 1 patch
Indentation   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  */
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -28,24 +28,24 @@  discard block
 block discarded – undo
28 28
  */
29 29
 function action_instituer_objet_dist($arg = null) {
30 30
 
31
-	if (is_null($arg)) {
32
-		$securiser_action = charger_fonction('securiser_action', 'inc');
33
-		$arg = $securiser_action();
34
-	}
31
+    if (is_null($arg)) {
32
+        $securiser_action = charger_fonction('securiser_action', 'inc');
33
+        $arg = $securiser_action();
34
+    }
35 35
 
36
-	[$objet, $id_objet, $statut] = preg_split('/\W/', (string) $arg);
37
-	if (!$statut) {
38
-		$statut = _request('statut_nouv');
39
-	} // cas POST
40
-	if (!$statut) {
41
-		return;
42
-	} // impossible mais sait-on jamais
36
+    [$objet, $id_objet, $statut] = preg_split('/\W/', (string) $arg);
37
+    if (!$statut) {
38
+        $statut = _request('statut_nouv');
39
+    } // cas POST
40
+    if (!$statut) {
41
+        return;
42
+    } // impossible mais sait-on jamais
43 43
 
44
-	if (
45
-		($id_objet = (int) $id_objet)
46
-		&& autoriser('instituer', $objet, $id_objet, '', ['statut' => $statut])
47
-	) {
48
-		include_spip('action/editer_objet');
49
-		objet_modifier($objet, $id_objet, ['statut' => $statut]);
50
-	}
44
+    if (
45
+        ($id_objet = (int) $id_objet)
46
+        && autoriser('instituer', $objet, $id_objet, '', ['statut' => $statut])
47
+    ) {
48
+        include_spip('action/editer_objet');
49
+        objet_modifier($objet, $id_objet, ['statut' => $statut]);
50
+    }
51 51
 }
Please login to merge, or discard this patch.
ecrire/action/editer_rubrique.php 1 patch
Indentation   +218 added lines, -218 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\Rubriques\Edition
16 16
  */
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 
21 21
 include_spip('inc/rubriques');
@@ -37,34 +37,34 @@  discard block
 block discarded – undo
37 37
  */
38 38
 function action_editer_rubrique_dist($arg = null) {
39 39
 
40
-	if (is_null($arg)) {
41
-		$securiser_action = charger_fonction('securiser_action', 'inc');
42
-		$arg = $securiser_action();
43
-	}
44
-
45
-	if (!$id_rubrique = (int) $arg) {
46
-		if ($arg != 'oui') {
47
-			include_spip('inc/headers');
48
-			redirige_url_ecrire();
49
-		}
50
-		$id_rubrique = rubrique_inserer(_request('id_parent'));
51
-	}
52
-
53
-	$err = rubrique_modifier($id_rubrique);
54
-
55
-	if (_request('redirect')) {
56
-		$redirect = parametre_url(
57
-			urldecode((string) _request('redirect')),
58
-			'id_rubrique',
59
-			$id_rubrique,
60
-			'&'
61
-		);
62
-
63
-		include_spip('inc/headers');
64
-		redirige_par_entete($redirect);
65
-	}
66
-
67
-	return [$id_rubrique, $err];
40
+    if (is_null($arg)) {
41
+        $securiser_action = charger_fonction('securiser_action', 'inc');
42
+        $arg = $securiser_action();
43
+    }
44
+
45
+    if (!$id_rubrique = (int) $arg) {
46
+        if ($arg != 'oui') {
47
+            include_spip('inc/headers');
48
+            redirige_url_ecrire();
49
+        }
50
+        $id_rubrique = rubrique_inserer(_request('id_parent'));
51
+    }
52
+
53
+    $err = rubrique_modifier($id_rubrique);
54
+
55
+    if (_request('redirect')) {
56
+        $redirect = parametre_url(
57
+            urldecode((string) _request('redirect')),
58
+            'id_rubrique',
59
+            $id_rubrique,
60
+            '&'
61
+        );
62
+
63
+        include_spip('inc/headers');
64
+        redirige_par_entete($redirect);
65
+    }
66
+
67
+    return [$id_rubrique, $err];
68 68
 }
69 69
 
70 70
 
@@ -79,64 +79,64 @@  discard block
 block discarded – undo
79 79
  *     Identifiant de la rubrique crée
80 80
  */
81 81
 function rubrique_inserer($id_parent, $set = null) {
82
-	$champs = [
83
-		'titre' => _T('item_nouvelle_rubrique'),
84
-		'id_parent' => (int) $id_parent,
85
-		'statut' => 'prepa'
86
-	];
87
-
88
-	if ($set) {
89
-		$champs = array_merge($champs, $set);
90
-	}
91
-
92
-	// Envoyer aux plugins
93
-	$champs = pipeline(
94
-		'pre_insertion',
95
-		[
96
-			'args' => [
97
-				'table' => 'spip_rubriques',
98
-			],
99
-			'data' => $champs
100
-		]
101
-	);
102
-
103
-	$id_rubrique = sql_insertq('spip_rubriques', $champs);
104
-	pipeline(
105
-		'post_insertion',
106
-		[
107
-			'args' => [
108
-				'table' => 'spip_rubriques',
109
-				'id_objet' => $id_rubrique
110
-			],
111
-			'data' => $champs
112
-		]
113
-	);
114
-	propager_les_secteurs();
115
-	calculer_langues_rubriques();
116
-
117
-	// Appeler une notification
118
-	if ($notifications = charger_fonction('notifications', 'inc')) {
119
-		$notifications(
120
-			'rubrique_inserer',
121
-			$id_rubrique,
122
-			[
123
-				'id_parent' => $id_parent,
124
-				'champs' => $champs,
125
-			]
126
-		);
127
-		$notifications(
128
-			'objet_inserer',
129
-			$id_rubrique,
130
-			[
131
-				'objet' => 'rubrique',
132
-				'id_objet' => $id_rubrique,
133
-				'id_parent' => $id_parent,
134
-				'champs' => $champs,
135
-			]
136
-		);
137
-	}
138
-
139
-	return $id_rubrique;
82
+    $champs = [
83
+        'titre' => _T('item_nouvelle_rubrique'),
84
+        'id_parent' => (int) $id_parent,
85
+        'statut' => 'prepa'
86
+    ];
87
+
88
+    if ($set) {
89
+        $champs = array_merge($champs, $set);
90
+    }
91
+
92
+    // Envoyer aux plugins
93
+    $champs = pipeline(
94
+        'pre_insertion',
95
+        [
96
+            'args' => [
97
+                'table' => 'spip_rubriques',
98
+            ],
99
+            'data' => $champs
100
+        ]
101
+    );
102
+
103
+    $id_rubrique = sql_insertq('spip_rubriques', $champs);
104
+    pipeline(
105
+        'post_insertion',
106
+        [
107
+            'args' => [
108
+                'table' => 'spip_rubriques',
109
+                'id_objet' => $id_rubrique
110
+            ],
111
+            'data' => $champs
112
+        ]
113
+    );
114
+    propager_les_secteurs();
115
+    calculer_langues_rubriques();
116
+
117
+    // Appeler une notification
118
+    if ($notifications = charger_fonction('notifications', 'inc')) {
119
+        $notifications(
120
+            'rubrique_inserer',
121
+            $id_rubrique,
122
+            [
123
+                'id_parent' => $id_parent,
124
+                'champs' => $champs,
125
+            ]
126
+        );
127
+        $notifications(
128
+            'objet_inserer',
129
+            $id_rubrique,
130
+            [
131
+                'objet' => 'rubrique',
132
+                'id_objet' => $id_rubrique,
133
+                'id_parent' => $id_parent,
134
+                'champs' => $champs,
135
+            ]
136
+        );
137
+    }
138
+
139
+    return $id_rubrique;
140 140
 }
141 141
 
142 142
 /**
@@ -152,46 +152,46 @@  discard block
 block discarded – undo
152 152
  *     - chaîne : texte d'un message d'erreur
153 153
  */
154 154
 function rubrique_modifier($id_rubrique, $set = null) {
155
-	include_spip('inc/autoriser');
156
-	include_spip('inc/filtres');
157
-
158
-	include_spip('inc/modifier');
159
-	$c = collecter_requests(
160
-		// include list
161
-		objet_info('rubrique', 'champs_editables'),
162
-		// exclude list
163
-		['id_parent', 'confirme_deplace'],
164
-		// donnees eventuellement fournies
165
-		$set
166
-	);
167
-
168
-	if (
169
-		$err = objet_modifier_champs(
170
-			'rubrique',
171
-			$id_rubrique,
172
-			[
173
-			'data' => $set,
174
-			'nonvide' => ['titre' => _T('titre_nouvelle_rubrique') . ' ' . _T('info_numero_abbreviation') . $id_rubrique]
175
-			],
176
-			$c
177
-		)
178
-	) {
179
-		return $err;
180
-	}
181
-
182
-	$c = collecter_requests(['id_parent', 'confirme_deplace'], [], $set);
183
-	// Deplacer la rubrique
184
-	if (isset($c['id_parent'])) {
185
-		$err = rubrique_instituer($id_rubrique, $c);
186
-	}
187
-
188
-	// invalider les caches marques de cette rubrique
189
-	include_spip('inc/invalideur');
190
-	suivre_invalideur("id='rubrique/$id_rubrique'");
191
-	// et celui de menu_rubriques
192
-	effacer_meta('date_calcul_rubriques');
193
-
194
-	return $err;
155
+    include_spip('inc/autoriser');
156
+    include_spip('inc/filtres');
157
+
158
+    include_spip('inc/modifier');
159
+    $c = collecter_requests(
160
+        // include list
161
+        objet_info('rubrique', 'champs_editables'),
162
+        // exclude list
163
+        ['id_parent', 'confirme_deplace'],
164
+        // donnees eventuellement fournies
165
+        $set
166
+    );
167
+
168
+    if (
169
+        $err = objet_modifier_champs(
170
+            'rubrique',
171
+            $id_rubrique,
172
+            [
173
+            'data' => $set,
174
+            'nonvide' => ['titre' => _T('titre_nouvelle_rubrique') . ' ' . _T('info_numero_abbreviation') . $id_rubrique]
175
+            ],
176
+            $c
177
+        )
178
+    ) {
179
+        return $err;
180
+    }
181
+
182
+    $c = collecter_requests(['id_parent', 'confirme_deplace'], [], $set);
183
+    // Deplacer la rubrique
184
+    if (isset($c['id_parent'])) {
185
+        $err = rubrique_instituer($id_rubrique, $c);
186
+    }
187
+
188
+    // invalider les caches marques de cette rubrique
189
+    include_spip('inc/invalideur');
190
+    suivre_invalideur("id='rubrique/$id_rubrique'");
191
+    // et celui de menu_rubriques
192
+    effacer_meta('date_calcul_rubriques');
193
+
194
+    return $err;
195 195
 }
196 196
 
197 197
 /**
@@ -214,29 +214,29 @@  discard block
 block discarded – undo
214 214
  *     false si la confirmation du déplacement n'est pas présente
215 215
  */
216 216
 function editer_rubrique_breves($id_rubrique, $id_parent, $c = []) {
217
-	if (!sql_table_exists('spip_breves')) {
218
-		return true;
219
-	}
220
-
221
-	if (!sql_countsel('spip_breves', "id_rubrique=$id_rubrique")) {
222
-		return true;
223
-	}
224
-
225
-	if (empty($c['confirme_deplace']) || $c['confirme_deplace'] != 'oui') {
226
-		return false;
227
-	}
228
-
229
-	if (
230
-		$id_secteur = sql_getfetsel(
231
-			'id_secteur',
232
-			'spip_rubriques',
233
-			"id_rubrique=$id_parent"
234
-		)
235
-	) {
236
-		sql_updateq('spip_breves', ['id_rubrique' => $id_secteur], "id_rubrique=$id_rubrique");
237
-	}
238
-
239
-	return true;
217
+    if (!sql_table_exists('spip_breves')) {
218
+        return true;
219
+    }
220
+
221
+    if (!sql_countsel('spip_breves', "id_rubrique=$id_rubrique")) {
222
+        return true;
223
+    }
224
+
225
+    if (empty($c['confirme_deplace']) || $c['confirme_deplace'] != 'oui') {
226
+        return false;
227
+    }
228
+
229
+    if (
230
+        $id_secteur = sql_getfetsel(
231
+            'id_secteur',
232
+            'spip_rubriques',
233
+            "id_rubrique=$id_parent"
234
+        )
235
+    ) {
236
+        sql_updateq('spip_breves', ['id_rubrique' => $id_secteur], "id_rubrique=$id_rubrique");
237
+    }
238
+
239
+    return true;
240 240
 }
241 241
 
242 242
 
@@ -258,72 +258,72 @@  discard block
 block discarded – undo
258 258
  *     Chaîne : texte du message d'erreur
259 259
  */
260 260
 function rubrique_instituer($id_rubrique, $c) {
261
-	// traitement de la rubrique parente
262
-	// interdiction de deplacer vers ou a partir d'une rubrique
263
-	// qu'on n'administre pas.
264
-
265
-	if (null !== ($id_parent = $c['id_parent'])) {
266
-		$id_parent = (int) $id_parent;
267
-		$filles = calcul_branche_in($id_rubrique);
268
-		if (str_contains(",$id_parent,", (string) ",$filles,")) {
269
-			spip_log("La rubrique $id_rubrique ne peut etre fille de sa descendante $id_parent");
270
-		} else {
271
-			$s = sql_fetsel('id_parent, statut', 'spip_rubriques', "id_rubrique=$id_rubrique");
272
-			$old_parent = $s['id_parent'];
273
-
274
-			if (
275
-				!($id_parent != $old_parent
276
-				&& autoriser('publierdans', 'rubrique', $id_parent)
277
-				&& autoriser('creerrubriquedans', 'rubrique', $id_parent)
278
-				&& autoriser('publierdans', 'rubrique', $old_parent)
279
-				)
280
-			) {
281
-				if ($s['statut'] != 'prepa') {
282
-					spip_log("deplacement de $id_rubrique vers $id_parent refuse a " . $GLOBALS['visiteur_session']['id_auteur'] . ' ' . $GLOBALS['visiteur_session']['statut']);
283
-				}
284
-			} elseif (editer_rubrique_breves($id_rubrique, $id_parent, $c)) {
285
-				$statut_ancien = $s['statut'];
286
-				sql_updateq('spip_rubriques', ['id_parent' => $id_parent], "id_rubrique=$id_rubrique");
287
-
288
-
289
-				propager_les_secteurs();
290
-
291
-				// Deplacement d'une rubrique publiee ==> chgt general de leur statut
292
-				if ($statut_ancien == 'publie') {
293
-					calculer_rubriques_if($old_parent, ['id_rubrique' => $id_parent], ['statut_ancien' => $statut_ancien]);
294
-				}
295
-				// Creation ou deplacement d'une rubrique non publiee
296
-				// invalider le cache de leur menu
297
-				elseif (!$statut_ancien || $old_parent != $id_parent) {
298
-					effacer_meta('date_calcul_rubriques');
299
-				}
300
-
301
-				calculer_langues_rubriques();
302
-
303
-				// Appeler une notification
304
-				if ($notifications = charger_fonction('notifications', 'inc')) {
305
-					$notifications(
306
-						'rubrique_instituer',
307
-						$id_rubrique,
308
-						[
309
-							'statut_ancien' => $statut_ancien,
310
-							'id_parent_ancien' => $old_parent,
311
-						]
312
-					);
313
-					$notifications(
314
-						'objet_instituer',
315
-						$id_rubrique,
316
-						[
317
-							'objet' => 'rubrique',
318
-							'id_objet' => $id_rubrique,
319
-							'statut_ancien' => $statut_ancien,
320
-							'id_parent_ancien' => $old_parent,
321
-						]
322
-					);
323
-				}
324
-			}
325
-		}
326
-	}
327
-
328
-	return ''; // pas d'erreur
261
+    // traitement de la rubrique parente
262
+    // interdiction de deplacer vers ou a partir d'une rubrique
263
+    // qu'on n'administre pas.
264
+
265
+    if (null !== ($id_parent = $c['id_parent'])) {
266
+        $id_parent = (int) $id_parent;
267
+        $filles = calcul_branche_in($id_rubrique);
268
+        if (str_contains(",$id_parent,", (string) ",$filles,")) {
269
+            spip_log("La rubrique $id_rubrique ne peut etre fille de sa descendante $id_parent");
270
+        } else {
271
+            $s = sql_fetsel('id_parent, statut', 'spip_rubriques', "id_rubrique=$id_rubrique");
272
+            $old_parent = $s['id_parent'];
273
+
274
+            if (
275
+                !($id_parent != $old_parent
276
+                && autoriser('publierdans', 'rubrique', $id_parent)
277
+                && autoriser('creerrubriquedans', 'rubrique', $id_parent)
278
+                && autoriser('publierdans', 'rubrique', $old_parent)
279
+                )
280
+            ) {
281
+                if ($s['statut'] != 'prepa') {
282
+                    spip_log("deplacement de $id_rubrique vers $id_parent refuse a " . $GLOBALS['visiteur_session']['id_auteur'] . ' ' . $GLOBALS['visiteur_session']['statut']);
283
+                }
284
+            } elseif (editer_rubrique_breves($id_rubrique, $id_parent, $c)) {
285
+                $statut_ancien = $s['statut'];
286
+                sql_updateq('spip_rubriques', ['id_parent' => $id_parent], "id_rubrique=$id_rubrique");
287
+
288
+
289
+                propager_les_secteurs();
290
+
291
+                // Deplacement d'une rubrique publiee ==> chgt general de leur statut
292
+                if ($statut_ancien == 'publie') {
293
+                    calculer_rubriques_if($old_parent, ['id_rubrique' => $id_parent], ['statut_ancien' => $statut_ancien]);
294
+                }
295
+                // Creation ou deplacement d'une rubrique non publiee
296
+                // invalider le cache de leur menu
297
+                elseif (!$statut_ancien || $old_parent != $id_parent) {
298
+                    effacer_meta('date_calcul_rubriques');
299
+                }
300
+
301
+                calculer_langues_rubriques();
302
+
303
+                // Appeler une notification
304
+                if ($notifications = charger_fonction('notifications', 'inc')) {
305
+                    $notifications(
306
+                        'rubrique_instituer',
307
+                        $id_rubrique,
308
+                        [
309
+                            'statut_ancien' => $statut_ancien,
310
+                            'id_parent_ancien' => $old_parent,
311
+                        ]
312
+                    );
313
+                    $notifications(
314
+                        'objet_instituer',
315
+                        $id_rubrique,
316
+                        [
317
+                            'objet' => 'rubrique',
318
+                            'id_objet' => $id_rubrique,
319
+                            'statut_ancien' => $statut_ancien,
320
+                            'id_parent_ancien' => $old_parent,
321
+                        ]
322
+                    );
323
+                }
324
+            }
325
+        }
326
+    }
327
+
328
+    return ''; // pas d'erreur
329 329
 }
Please login to merge, or discard this patch.
ecrire/action/annuler_job.php 1 patch
Indentation   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  **/
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -25,13 +25,13 @@  discard block
 block discarded – undo
25 25
  * @return void
26 26
  */
27 27
 function action_annuler_job_dist() {
28
-	$securiser_action = charger_fonction('securiser_action', 'inc');
29
-	$id_job = $securiser_action();
28
+    $securiser_action = charger_fonction('securiser_action', 'inc');
29
+    $id_job = $securiser_action();
30 30
 
31
-	if (
32
-		($id_job = (int) $id_job)
33
-		&& autoriser('annuler', 'job', $id_job)
34
-	) {
35
-		job_queue_remove($id_job);
36
-	}
31
+    if (
32
+        ($id_job = (int) $id_job)
33
+        && autoriser('annuler', 'job', $id_job)
34
+    ) {
35
+        job_queue_remove($id_job);
36
+    }
37 37
 }
Please login to merge, or discard this patch.
ecrire/action/activer_plugins.php 1 patch
Indentation   +46 added lines, -46 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  **/
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -27,49 +27,49 @@  discard block
 block discarded – undo
27 27
  * @return void
28 28
  */
29 29
 function enregistre_modif_plugin() {
30
-	include_spip('inc/plugin');
31
-	// recuperer les plugins dans l'ordre des $_POST
32
-	$test = [];
33
-	foreach (liste_plugin_files() as $file) {
34
-		$test['s' . substr(md5(_DIR_PLUGINS . $file), 0, 16)] = $file;
35
-	}
36
-	if (defined('_DIR_PLUGINS_SUPPL')) {
37
-		foreach (liste_plugin_files(_DIR_PLUGINS_SUPPL) as $file) {
38
-			$test['s' . substr(md5(_DIR_PLUGINS_SUPPL . $file), 0, 16)] = $file;
39
-		}
40
-	}
30
+    include_spip('inc/plugin');
31
+    // recuperer les plugins dans l'ordre des $_POST
32
+    $test = [];
33
+    foreach (liste_plugin_files() as $file) {
34
+        $test['s' . substr(md5(_DIR_PLUGINS . $file), 0, 16)] = $file;
35
+    }
36
+    if (defined('_DIR_PLUGINS_SUPPL')) {
37
+        foreach (liste_plugin_files(_DIR_PLUGINS_SUPPL) as $file) {
38
+            $test['s' . substr(md5(_DIR_PLUGINS_SUPPL . $file), 0, 16)] = $file;
39
+        }
40
+    }
41 41
 
42
-	$plugin = [];
42
+    $plugin = [];
43 43
 
44
-	foreach ($_POST as $choix => $val) {
45
-		if (isset($test[$choix]) && $val == 'O') {
46
-			$plugin[] = $test[$choix];
47
-		}
48
-	}
44
+    foreach ($_POST as $choix => $val) {
45
+        if (isset($test[$choix]) && $val == 'O') {
46
+            $plugin[] = $test[$choix];
47
+        }
48
+    }
49 49
 
50
-	spip_log("Changement des plugins actifs par l'auteur " . $GLOBALS['visiteur_session']['id_auteur'] . ': ' . implode(
51
-		',',
52
-		$plugin
53
-	));
54
-	ecrire_plugin_actifs($plugin);
50
+    spip_log("Changement des plugins actifs par l'auteur " . $GLOBALS['visiteur_session']['id_auteur'] . ': ' . implode(
51
+        ',',
52
+        $plugin
53
+    ));
54
+    ecrire_plugin_actifs($plugin);
55 55
 
56
-	// Chaque fois que l'on valide des plugins, on memorise la liste de ces plugins comme etant "interessants", avec un score initial, qui sera decremente a chaque tour : ainsi un plugin active pourra reter visible a l'ecran, jusqu'a ce qu'il tombe dans l'oubli.
57
-	$plugins_interessants = @unserialize($GLOBALS['meta']['plugins_interessants']);
58
-	if (!is_array($plugins_interessants)) {
59
-		$plugins_interessants = [];
60
-	}
56
+    // Chaque fois que l'on valide des plugins, on memorise la liste de ces plugins comme etant "interessants", avec un score initial, qui sera decremente a chaque tour : ainsi un plugin active pourra reter visible a l'ecran, jusqu'a ce qu'il tombe dans l'oubli.
57
+    $plugins_interessants = @unserialize($GLOBALS['meta']['plugins_interessants']);
58
+    if (!is_array($plugins_interessants)) {
59
+        $plugins_interessants = [];
60
+    }
61 61
 
62
-	$plugins_interessants2 = [];
62
+    $plugins_interessants2 = [];
63 63
 
64
-	foreach ($plugins_interessants as $plug => $score) {
65
-		if ($score > 1) {
66
-			$plugins_interessants2[$plug] = $score - 1;
67
-		}
68
-	}
69
-	foreach ($plugin as $plug) {
70
-		$plugins_interessants2[$plug] = 10;
71
-	} // score initial
72
-	ecrire_meta('plugins_interessants', serialize($plugins_interessants2));
64
+    foreach ($plugins_interessants as $plug => $score) {
65
+        if ($score > 1) {
66
+            $plugins_interessants2[$plug] = $score - 1;
67
+        }
68
+    }
69
+    foreach ($plugin as $plug) {
70
+        $plugins_interessants2[$plug] = 10;
71
+    } // score initial
72
+    ecrire_meta('plugins_interessants', serialize($plugins_interessants2));
73 73
 }
74 74
 
75 75
 /**
@@ -81,13 +81,13 @@  discard block
 block discarded – undo
81 81
  */
82 82
 function action_activer_plugins_dist() {
83 83
 
84
-	$securiser_action = charger_fonction('securiser_action', 'inc');
85
-	$securiser_action();
84
+    $securiser_action = charger_fonction('securiser_action', 'inc');
85
+    $securiser_action();
86 86
 
87
-	if (!autoriser('configurer', '_plugins')) {
88
-		die('erreur');
89
-	}
90
-	// forcer la maj des meta pour les cas de modif de numero de version base via phpmyadmin
91
-	lire_metas();
92
-	enregistre_modif_plugin();
87
+    if (!autoriser('configurer', '_plugins')) {
88
+        die('erreur');
89
+    }
90
+    // forcer la maj des meta pour les cas de modif de numero de version base via phpmyadmin
91
+    lire_metas();
92
+    enregistre_modif_plugin();
93 93
 }
Please login to merge, or discard this patch.
ecrire/src/Sql/Sqlite/Traducteur.php 1 patch
Indentation   +191 added lines, -191 removed lines patch added patch discarded remove patch
@@ -9,195 +9,195 @@
 block discarded – undo
9 9
  */
10 10
 class Traducteur
11 11
 {
12
-	/** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé
13
-	 *
14
-	 * @var array
15
-	 */
16
-	public $textes = [];
17
-
18
-	/**
19
-	 * Constructeur
20
-	 */
21
-	public function __construct(
22
-		/** Requête à préparer */
23
-		public string $query,
24
-		/** Prefixe des tables à utiliser */
25
-		public string $prefixe,
26
-		/** Version SQLite (2 ou 3) */
27
-		public string $sqlite_version
28
-	) {
29
-	}
30
-
31
-	/**
32
-	 * Transformer la requete pour SQLite
33
-	 *
34
-	 * Enlève les textes, transforme la requête pour quelle soit
35
-	 * bien interprétée par SQLite, puis remet les textes
36
-	 * la fonction affecte `$this->query`
37
-	 */
38
-	public function traduire_requete() {
39
-		//
40
-		// 1) Protection des textes en les remplacant par des codes
41
-		//
42
-		// enlever les 'textes' et initialiser avec
43
-		[$this->query, $textes] = query_echappe_textes($this->query);
44
-
45
-		//
46
-		// 2) Corrections de la requete
47
-		//
48
-		// Correction Create Database
49
-		// Create Database -> requete ignoree
50
-		if (str_starts_with((string) $this->query, 'CREATE DATABASE')) {
51
-			spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT);
52
-			$this->query = 'SELECT 1';
53
-		}
54
-
55
-		// Correction Insert Ignore
56
-		// INSERT IGNORE -> insert (tout court et pas 'insert or replace')
57
-		if (str_starts_with((string) $this->query, 'INSERT IGNORE')) {
58
-			spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG);
59
-			$this->query = 'INSERT ' . substr((string) $this->query, '13');
60
-		}
61
-
62
-		// Correction des dates avec INTERVAL
63
-		// utiliser sql_date_proche() de preference
64
-		if (str_contains((string) $this->query, 'INTERVAL')) {
65
-			$this->query = preg_replace_callback(
66
-				'/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U',
67
-				fn(array $matches): string => $this->_remplacerDateParTime($matches),
68
-				(string) $this->query
69
-			);
70
-		}
71
-
72
-		if (str_contains((string) $this->query, 'LEFT(')) {
73
-			$this->query = str_replace('LEFT(', '_LEFT(', (string) $this->query);
74
-		}
75
-
76
-		if (str_contains((string) $this->query, 'TIMESTAMPDIFF(')) {
77
-			$this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", (string) $this->query);
78
-		}
79
-
80
-
81
-		// Correction Using
82
-		// USING (non reconnu en sqlite2)
83
-		// problematique car la jointure ne se fait pas du coup.
84
-		if (($this->sqlite_version == 2) && (str_contains((string) $this->query, 'USING'))) {
85
-			spip_log(
86
-				"'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'",
87
-				'sqlite.' . _LOG_ERREUR
88
-			);
89
-			$this->query = preg_replace('/USING\s*\([^\)]*\)/', '', (string) $this->query);
90
-		}
91
-
92
-		// Correction Field
93
-		// remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END
94
-		if (str_contains((string) $this->query, 'FIELD')) {
95
-			$this->query = preg_replace_callback(
96
-				'/FIELD\s*\(([^\)]*)\)/',
97
-				fn(array $matches): string => $this->_remplacerFieldParCase($matches),
98
-				(string) $this->query
99
-			);
100
-		}
101
-
102
-		// Correction des noms de tables FROM
103
-		// mettre les bons noms de table dans from, update, insert, replace...
104
-		if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', (string) $this->query, $regs)) {
105
-			$suite = strstr((string) $this->query, $regs[0]);
106
-			$this->query = substr((string) $this->query, 0, -strlen($suite));
107
-		} else {
108
-			$suite = '';
109
-		}
110
-		$pref = ($this->prefixe) ? $this->prefixe . '_' : '';
111
-		$this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, (string) $this->query) . $suite;
112
-
113
-		// Correction zero AS x
114
-		// pg n'aime pas 0+x AS alias, sqlite, dans le meme style,
115
-		// n'apprecie pas du tout SELECT 0 as x ... ORDER BY x
116
-		// il dit que x ne doit pas être un integer dans le order by !
117
-		// on remplace du coup x par vide() dans ce cas uniquement
118
-		//
119
-		// apparait dans public/vertebrer.php et dans le plugin menu aussi qui genere aussi ce genre de requete via un {par num #GET{tri_num}}
120
-		// mais est-ce encore un soucis pour sqlite en 2021 ? (ie commenter le preg_replace marche très bien en sqlite 3.28)
121
-		// on ne remplace que dans ORDER BY ou GROUP BY
122
-		if (str_contains($this->query, '0 AS') && preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) {
123
-			$suite = strstr($this->query, $regs[0]);
124
-			$this->query = substr($this->query, 0, -strlen($suite));
125
-			// on cherche les noms des x dans 0 AS x
126
-			// on remplace dans $suite le nom par vide()
127
-			preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER);
128
-			foreach ($matches[1] as $m) {
129
-				if (str_contains($suite, $m)) {
130
-					$suite = preg_replace(",\b$m\b,", 'VIDE()', $suite);
131
-				}
132
-			}
133
-			$this->query .= $suite;
134
-		}
135
-
136
-		// Correction possible des divisions entieres
137
-		// Le standard SQL (lequel? ou?) semble indiquer que
138
-		// a/b=c doit donner c entier si a et b sont entiers 4/3=1.
139
-		// C'est ce que retournent effectivement SQL Server et SQLite
140
-		// Ce n'est pas ce qu'applique MySQL qui retourne un reel : 4/3=1.333...
141
-		//
142
-		// On peut forcer la conversion en multipliant par 1.0 avant la division
143
-		// /!\ SQLite 3.5.9 Debian/Ubuntu est victime d'un bug en plus !
144
-		// cf. https://bugs.launchpad.net/ubuntu/+source/sqlite3/+bug/254228
145
-		//     http://www.sqlite.org/cvstrac/tktview?tn=3202
146
-		// (4*1.0/3) n'est pas rendu dans ce cas !
147
-		# $this->query = str_replace('/','* 1.00 / ',$this->query);
148
-
149
-
150
-		// Correction critere REGEXP, non reconnu en sqlite2
151
-		if (($this->sqlite_version == 2) && (str_contains($this->query, 'REGEXP'))) {
152
-			$this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query);
153
-		}
154
-
155
-		//
156
-		// 3) Remise en place des textes d'origine
157
-		//
158
-		// Correction Antiquotes et echappements
159
-		// ` => rien
160
-		if (str_contains($this->query, '`')) {
161
-			$this->query = str_replace('`', '', $this->query);
162
-		}
163
-
164
-		$this->query = query_reinjecte_textes($this->query, $textes);
165
-
166
-		return $this->query;
167
-	}
168
-
169
-	/**
170
-	 * Callback pour remplacer `DATE_` / `INTERVAL`
171
-	 * par `DATE ... strtotime`
172
-	 *
173
-	 * @param array $matches Captures
174
-	 * @return string texte de date compris par SQLite
175
-	 */
176
-	public function _remplacerDateParTime($matches) {
177
-		$op = strtoupper($matches[1] == 'ADD') ? '+' : '-';
178
-
179
-		return "datetime$matches[2] '$op$matches[3] $matches[4]')";
180
-	}
181
-
182
-	/**
183
-	 * Callback pour remplacer `FIELD(table,i,j,k...)`
184
-	 * par `CASE WHEN table=i THEN n ... ELSE 0 END`
185
-	 *
186
-	 * @param array $matches Captures
187
-	 * @return string texte de liste ordonnée compris par SQLite
188
-	 */
189
-	public function _remplacerFieldParCase($matches) {
190
-		$fields = substr((string) $matches[0], 6, -1); // ne recuperer que l'interieur X de field(X)
191
-		$t = explode(',', $fields);
192
-		$index = array_shift($t);
193
-
194
-		$res = '';
195
-		$n = 0;
196
-		foreach ($t as $v) {
197
-			$n++;
198
-			$res .= "\nWHEN $index=$v THEN $n";
199
-		}
200
-
201
-		return "CASE $res ELSE 0 END ";
202
-	}
12
+    /** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé
13
+     *
14
+     * @var array
15
+     */
16
+    public $textes = [];
17
+
18
+    /**
19
+     * Constructeur
20
+     */
21
+    public function __construct(
22
+        /** Requête à préparer */
23
+        public string $query,
24
+        /** Prefixe des tables à utiliser */
25
+        public string $prefixe,
26
+        /** Version SQLite (2 ou 3) */
27
+        public string $sqlite_version
28
+    ) {
29
+    }
30
+
31
+    /**
32
+     * Transformer la requete pour SQLite
33
+     *
34
+     * Enlève les textes, transforme la requête pour quelle soit
35
+     * bien interprétée par SQLite, puis remet les textes
36
+     * la fonction affecte `$this->query`
37
+     */
38
+    public function traduire_requete() {
39
+        //
40
+        // 1) Protection des textes en les remplacant par des codes
41
+        //
42
+        // enlever les 'textes' et initialiser avec
43
+        [$this->query, $textes] = query_echappe_textes($this->query);
44
+
45
+        //
46
+        // 2) Corrections de la requete
47
+        //
48
+        // Correction Create Database
49
+        // Create Database -> requete ignoree
50
+        if (str_starts_with((string) $this->query, 'CREATE DATABASE')) {
51
+            spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT);
52
+            $this->query = 'SELECT 1';
53
+        }
54
+
55
+        // Correction Insert Ignore
56
+        // INSERT IGNORE -> insert (tout court et pas 'insert or replace')
57
+        if (str_starts_with((string) $this->query, 'INSERT IGNORE')) {
58
+            spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG);
59
+            $this->query = 'INSERT ' . substr((string) $this->query, '13');
60
+        }
61
+
62
+        // Correction des dates avec INTERVAL
63
+        // utiliser sql_date_proche() de preference
64
+        if (str_contains((string) $this->query, 'INTERVAL')) {
65
+            $this->query = preg_replace_callback(
66
+                '/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U',
67
+                fn(array $matches): string => $this->_remplacerDateParTime($matches),
68
+                (string) $this->query
69
+            );
70
+        }
71
+
72
+        if (str_contains((string) $this->query, 'LEFT(')) {
73
+            $this->query = str_replace('LEFT(', '_LEFT(', (string) $this->query);
74
+        }
75
+
76
+        if (str_contains((string) $this->query, 'TIMESTAMPDIFF(')) {
77
+            $this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", (string) $this->query);
78
+        }
79
+
80
+
81
+        // Correction Using
82
+        // USING (non reconnu en sqlite2)
83
+        // problematique car la jointure ne se fait pas du coup.
84
+        if (($this->sqlite_version == 2) && (str_contains((string) $this->query, 'USING'))) {
85
+            spip_log(
86
+                "'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'",
87
+                'sqlite.' . _LOG_ERREUR
88
+            );
89
+            $this->query = preg_replace('/USING\s*\([^\)]*\)/', '', (string) $this->query);
90
+        }
91
+
92
+        // Correction Field
93
+        // remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END
94
+        if (str_contains((string) $this->query, 'FIELD')) {
95
+            $this->query = preg_replace_callback(
96
+                '/FIELD\s*\(([^\)]*)\)/',
97
+                fn(array $matches): string => $this->_remplacerFieldParCase($matches),
98
+                (string) $this->query
99
+            );
100
+        }
101
+
102
+        // Correction des noms de tables FROM
103
+        // mettre les bons noms de table dans from, update, insert, replace...
104
+        if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', (string) $this->query, $regs)) {
105
+            $suite = strstr((string) $this->query, $regs[0]);
106
+            $this->query = substr((string) $this->query, 0, -strlen($suite));
107
+        } else {
108
+            $suite = '';
109
+        }
110
+        $pref = ($this->prefixe) ? $this->prefixe . '_' : '';
111
+        $this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, (string) $this->query) . $suite;
112
+
113
+        // Correction zero AS x
114
+        // pg n'aime pas 0+x AS alias, sqlite, dans le meme style,
115
+        // n'apprecie pas du tout SELECT 0 as x ... ORDER BY x
116
+        // il dit que x ne doit pas être un integer dans le order by !
117
+        // on remplace du coup x par vide() dans ce cas uniquement
118
+        //
119
+        // apparait dans public/vertebrer.php et dans le plugin menu aussi qui genere aussi ce genre de requete via un {par num #GET{tri_num}}
120
+        // mais est-ce encore un soucis pour sqlite en 2021 ? (ie commenter le preg_replace marche très bien en sqlite 3.28)
121
+        // on ne remplace que dans ORDER BY ou GROUP BY
122
+        if (str_contains($this->query, '0 AS') && preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) {
123
+            $suite = strstr($this->query, $regs[0]);
124
+            $this->query = substr($this->query, 0, -strlen($suite));
125
+            // on cherche les noms des x dans 0 AS x
126
+            // on remplace dans $suite le nom par vide()
127
+            preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER);
128
+            foreach ($matches[1] as $m) {
129
+                if (str_contains($suite, $m)) {
130
+                    $suite = preg_replace(",\b$m\b,", 'VIDE()', $suite);
131
+                }
132
+            }
133
+            $this->query .= $suite;
134
+        }
135
+
136
+        // Correction possible des divisions entieres
137
+        // Le standard SQL (lequel? ou?) semble indiquer que
138
+        // a/b=c doit donner c entier si a et b sont entiers 4/3=1.
139
+        // C'est ce que retournent effectivement SQL Server et SQLite
140
+        // Ce n'est pas ce qu'applique MySQL qui retourne un reel : 4/3=1.333...
141
+        //
142
+        // On peut forcer la conversion en multipliant par 1.0 avant la division
143
+        // /!\ SQLite 3.5.9 Debian/Ubuntu est victime d'un bug en plus !
144
+        // cf. https://bugs.launchpad.net/ubuntu/+source/sqlite3/+bug/254228
145
+        //     http://www.sqlite.org/cvstrac/tktview?tn=3202
146
+        // (4*1.0/3) n'est pas rendu dans ce cas !
147
+        # $this->query = str_replace('/','* 1.00 / ',$this->query);
148
+
149
+
150
+        // Correction critere REGEXP, non reconnu en sqlite2
151
+        if (($this->sqlite_version == 2) && (str_contains($this->query, 'REGEXP'))) {
152
+            $this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query);
153
+        }
154
+
155
+        //
156
+        // 3) Remise en place des textes d'origine
157
+        //
158
+        // Correction Antiquotes et echappements
159
+        // ` => rien
160
+        if (str_contains($this->query, '`')) {
161
+            $this->query = str_replace('`', '', $this->query);
162
+        }
163
+
164
+        $this->query = query_reinjecte_textes($this->query, $textes);
165
+
166
+        return $this->query;
167
+    }
168
+
169
+    /**
170
+     * Callback pour remplacer `DATE_` / `INTERVAL`
171
+     * par `DATE ... strtotime`
172
+     *
173
+     * @param array $matches Captures
174
+     * @return string texte de date compris par SQLite
175
+     */
176
+    public function _remplacerDateParTime($matches) {
177
+        $op = strtoupper($matches[1] == 'ADD') ? '+' : '-';
178
+
179
+        return "datetime$matches[2] '$op$matches[3] $matches[4]')";
180
+    }
181
+
182
+    /**
183
+     * Callback pour remplacer `FIELD(table,i,j,k...)`
184
+     * par `CASE WHEN table=i THEN n ... ELSE 0 END`
185
+     *
186
+     * @param array $matches Captures
187
+     * @return string texte de liste ordonnée compris par SQLite
188
+     */
189
+    public function _remplacerFieldParCase($matches) {
190
+        $fields = substr((string) $matches[0], 6, -1); // ne recuperer que l'interieur X de field(X)
191
+        $t = explode(',', $fields);
192
+        $index = array_shift($t);
193
+
194
+        $res = '';
195
+        $n = 0;
196
+        foreach ($t as $v) {
197
+            $n++;
198
+            $res .= "\nWHEN $index=$v THEN $n";
199
+        }
200
+
201
+        return "CASE $res ELSE 0 END ";
202
+    }
203 203
 }
Please login to merge, or discard this patch.
ecrire/src/Texte/Collecteur/Liens.php 1 patch
Indentation   +94 added lines, -94 removed lines patch added patch discarded remove patch
@@ -15,98 +15,98 @@
 block discarded – undo
15 15
  *    Collecte les raccourcis liens [titre->url] de SPIP
16 16
  */
17 17
 class Liens extends AbstractCollecteur {
18
-	protected static string $markPrefix = 'LIEN';
19
-
20
-	/**
21
-	 * La preg pour découper et collecter les modèles
22
-	 * @var string
23
-	 */
24
-	protected string $preg_lien;
25
-
26
-	public function __construct(?string $preg = null) {
27
-
28
-		// Regexp des raccourcis, aussi utilisee pour la fusion de sauvegarde Spip
29
-		// Laisser passer des paires de crochets pour la balise multi
30
-		// mais refuser plus d'imbrications ou de mauvaises imbrications
31
-		// sinon les crochets ne peuvent plus servir qu'a ce type de raccourci
32
-		$this->preg_lien = ($preg ?: '/\[([^][]*?([[][^]>-]*[]][^][]*)*)->(>?)([^]]*)\]/msS');
33
-	}
34
-
35
-
36
-	/**
37
-	 * Sanitizer une collection d'occurences de liens : il faut sanitizer le href et le texte uniquement
38
-	 *
39
-	 * @param array $collection
40
-	 * @param string $sanitize_callback
41
-	 * @return array
42
-	 */
43
-	protected function sanitizer_collection(array $collection, string $sanitize_callback): array {
44
-		foreach ($collection as &$lien) {
45
-			$t = $sanitize_callback($lien['texte']);
46
-			if ($t !== $lien['texte']) {
47
-				$lien['raw'] = str_replace($lien['texte'], $t, (string) $lien['raw']);
48
-				$lien['texte'] = $t;
49
-			}
50
-			$href = $sanitize_callback($lien['href']);
51
-			if ($href !== $lien['href']) {
52
-				$lien['raw'] = str_replace($lien['href'], $href, (string) $lien['raw']);
53
-				$lien['href'] = $href;
54
-			}
55
-		}
56
-
57
-		return $collection;
58
-	}
59
-
60
-	/**
61
-	 * @param string $texte
62
-	 * @param array $options
63
-	 *   bool $collecter_liens
64
-	 * @return array
65
-	 */
66
-	public function collecter(string $texte, array $options = []): array {
67
-		if (!$texte) {
68
-			return [];
69
-		}
70
-
71
-		$liens = [];
72
-		if (str_contains($texte, '->')) {
73
-			$desechappe_crochets = false;
74
-			// si il y a un crochet ouvrant échappé ou un crochet fermant échappé, les substituer pour les ignorer
75
-			if (str_contains($texte, '\[') || str_contains($texte, '\]')) {
76
-				$texte = str_replace(['\[', '\]'], ["\x1\x5", "\x1\x6"], $texte);
77
-				$desechappe_crochets = true;
78
-			}
79
-
80
-			// collecter les matchs de la preg
81
-			$liens = static::collecteur($texte, '->', '[', $this->preg_lien, empty($options['detecter_presence']) ? 0 : 1);
82
-
83
-			// si on veut seulement detecter la présence, on peut retourner tel quel
84
-			if (empty($options['detecter_presence'])) {
85
-				foreach ($liens as $k => &$lien) {
86
-					$lien['href'] = end($lien['match']);
87
-					$lien['texte'] = $lien['match'][1];
88
-					$lien['ouvrant'] = $lien['match'][3] ?? '';
89
-
90
-					// la mise en lien automatique est passee par la a tort !
91
-					// corrigeons pour eviter d'avoir un <a...> dans un href...
92
-					if (str_starts_with((string) $lien['href'], '<a')) {
93
-						$href = extraire_attribut($lien['href'], 'href');
94
-						// remplacons dans la source qui peut etre reinjectee dans les arguments
95
-						// d'un modele
96
-						$lien['raw'] = str_replace($lien['href'], $href, (string) $lien['raw']);
97
-						// et prenons le href comme la vraie url a linker
98
-						$lien['href'] = $href;
99
-					}
100
-
101
-					if ($desechappe_crochets && str_contains((string) $lien['raw'], "\x1")) {
102
-						$lien['raw'] = str_replace(["\x1\x5", "\x1\x6"], ['[', ']'], (string) $lien['raw']);
103
-						$lien['texte'] = str_replace(["\x1\x5", "\x1\x6"], ['[', ']'], (string) $lien['texte']);
104
-						$lien['href'] = str_replace(["\x1\x5", "\x1\x6"], ['[', ']'], (string) $lien['href']);
105
-					}
106
-				}
107
-			}
108
-		}
109
-
110
-		return $liens;
111
-	}
18
+    protected static string $markPrefix = 'LIEN';
19
+
20
+    /**
21
+     * La preg pour découper et collecter les modèles
22
+     * @var string
23
+     */
24
+    protected string $preg_lien;
25
+
26
+    public function __construct(?string $preg = null) {
27
+
28
+        // Regexp des raccourcis, aussi utilisee pour la fusion de sauvegarde Spip
29
+        // Laisser passer des paires de crochets pour la balise multi
30
+        // mais refuser plus d'imbrications ou de mauvaises imbrications
31
+        // sinon les crochets ne peuvent plus servir qu'a ce type de raccourci
32
+        $this->preg_lien = ($preg ?: '/\[([^][]*?([[][^]>-]*[]][^][]*)*)->(>?)([^]]*)\]/msS');
33
+    }
34
+
35
+
36
+    /**
37
+     * Sanitizer une collection d'occurences de liens : il faut sanitizer le href et le texte uniquement
38
+     *
39
+     * @param array $collection
40
+     * @param string $sanitize_callback
41
+     * @return array
42
+     */
43
+    protected function sanitizer_collection(array $collection, string $sanitize_callback): array {
44
+        foreach ($collection as &$lien) {
45
+            $t = $sanitize_callback($lien['texte']);
46
+            if ($t !== $lien['texte']) {
47
+                $lien['raw'] = str_replace($lien['texte'], $t, (string) $lien['raw']);
48
+                $lien['texte'] = $t;
49
+            }
50
+            $href = $sanitize_callback($lien['href']);
51
+            if ($href !== $lien['href']) {
52
+                $lien['raw'] = str_replace($lien['href'], $href, (string) $lien['raw']);
53
+                $lien['href'] = $href;
54
+            }
55
+        }
56
+
57
+        return $collection;
58
+    }
59
+
60
+    /**
61
+     * @param string $texte
62
+     * @param array $options
63
+     *   bool $collecter_liens
64
+     * @return array
65
+     */
66
+    public function collecter(string $texte, array $options = []): array {
67
+        if (!$texte) {
68
+            return [];
69
+        }
70
+
71
+        $liens = [];
72
+        if (str_contains($texte, '->')) {
73
+            $desechappe_crochets = false;
74
+            // si il y a un crochet ouvrant échappé ou un crochet fermant échappé, les substituer pour les ignorer
75
+            if (str_contains($texte, '\[') || str_contains($texte, '\]')) {
76
+                $texte = str_replace(['\[', '\]'], ["\x1\x5", "\x1\x6"], $texte);
77
+                $desechappe_crochets = true;
78
+            }
79
+
80
+            // collecter les matchs de la preg
81
+            $liens = static::collecteur($texte, '->', '[', $this->preg_lien, empty($options['detecter_presence']) ? 0 : 1);
82
+
83
+            // si on veut seulement detecter la présence, on peut retourner tel quel
84
+            if (empty($options['detecter_presence'])) {
85
+                foreach ($liens as $k => &$lien) {
86
+                    $lien['href'] = end($lien['match']);
87
+                    $lien['texte'] = $lien['match'][1];
88
+                    $lien['ouvrant'] = $lien['match'][3] ?? '';
89
+
90
+                    // la mise en lien automatique est passee par la a tort !
91
+                    // corrigeons pour eviter d'avoir un <a...> dans un href...
92
+                    if (str_starts_with((string) $lien['href'], '<a')) {
93
+                        $href = extraire_attribut($lien['href'], 'href');
94
+                        // remplacons dans la source qui peut etre reinjectee dans les arguments
95
+                        // d'un modele
96
+                        $lien['raw'] = str_replace($lien['href'], $href, (string) $lien['raw']);
97
+                        // et prenons le href comme la vraie url a linker
98
+                        $lien['href'] = $href;
99
+                    }
100
+
101
+                    if ($desechappe_crochets && str_contains((string) $lien['raw'], "\x1")) {
102
+                        $lien['raw'] = str_replace(["\x1\x5", "\x1\x6"], ['[', ']'], (string) $lien['raw']);
103
+                        $lien['texte'] = str_replace(["\x1\x5", "\x1\x6"], ['[', ']'], (string) $lien['texte']);
104
+                        $lien['href'] = str_replace(["\x1\x5", "\x1\x6"], ['[', ']'], (string) $lien['href']);
105
+                    }
106
+                }
107
+            }
108
+        }
109
+
110
+        return $liens;
111
+    }
112 112
 }
Please login to merge, or discard this patch.
ecrire/inc/layer.php 1 patch
Indentation   +45 added lines, -45 removed lines patch added patch discarded remove patch
@@ -10,7 +10,7 @@  discard block
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 /**
@@ -25,68 +25,68 @@  discard block
 block discarded – undo
25 25
  * @return string Code HTML du cadre dépliable
26 26
  **/
27 27
 function cadre_depliable($icone, $titre, $deplie, $contenu, $ids = '', $style_cadre = 'r') {
28
-	$bouton = bouton_block_depliable($titre, $deplie, $ids);
28
+    $bouton = bouton_block_depliable($titre, $deplie, $ids);
29 29
 
30
-	return
31
-		debut_cadre($style_cadre, $icone, '', $bouton, '', '', false)
32
-		. debut_block_depliable($deplie, $ids)
33
-		. "<div class='cadre_padding'>\n"
34
-		. $contenu
35
-		. "</div>\n"
36
-		. fin_block()
37
-		. fin_cadre();
30
+    return
31
+        debut_cadre($style_cadre, $icone, '', $bouton, '', '', false)
32
+        . debut_block_depliable($deplie, $ids)
33
+        . "<div class='cadre_padding'>\n"
34
+        . $contenu
35
+        . "</div>\n"
36
+        . fin_block()
37
+        . fin_cadre();
38 38
 }
39 39
 
40 40
 function block_parfois_visible($nom, $invite, $masque, $style = '', $visible = false) {
41
-	return "\n"
42
-	. bouton_block_depliable($invite, $visible, $nom)
43
-	. debut_block_depliable($visible, $nom)
44
-	. $masque
45
-	. fin_block();
41
+    return "\n"
42
+    . bouton_block_depliable($invite, $visible, $nom)
43
+    . debut_block_depliable($visible, $nom)
44
+    . $masque
45
+    . fin_block();
46 46
 }
47 47
 
48 48
 function debut_block_depliable($deplie, $id = '') {
49
-	$class = ' blocdeplie';
50
-	// si on n'accepte pas js, ne pas fermer
51
-	if (!$deplie) {
52
-		$class = ' blocreplie';
53
-	}
49
+    $class = ' blocdeplie';
50
+    // si on n'accepte pas js, ne pas fermer
51
+    if (!$deplie) {
52
+        $class = ' blocreplie';
53
+    }
54 54
 
55
-	return '<div ' . ($id ? "id='$id' " : '') . "class='bloc_depliable$class'>";
55
+    return '<div ' . ($id ? "id='$id' " : '') . "class='bloc_depliable$class'>";
56 56
 }
57 57
 
58 58
 function fin_block() {
59
-	return "<div class='nettoyeur'></div>\n</div>";
59
+    return "<div class='nettoyeur'></div>\n</div>";
60 60
 }
61 61
 
62 62
 // $texte : texte du bouton
63 63
 // $deplie : true (deplie) ou false (plie) ou -1 (inactif) ou 'incertain' pour que le bouton s'auto init au chargement de la page
64 64
 // $ids : id des div lies au bouton (facultatif, par defaut c'est le div.bloc_depliable qui suit)
65 65
 function bouton_block_depliable($texte, $deplie, $ids = '') {
66
-	$bouton_id = 'b' . substr(md5($texte . microtime()), 0, 8);
66
+    $bouton_id = 'b' . substr(md5($texte . microtime()), 0, 8);
67 67
 
68
-	$class = ($deplie === true) ? ' deplie' : (($deplie == -1) ? ' impliable' : ' replie');
69
-	if (strlen((string) $ids)) {
70
-		$cible = explode(',', (string) $ids);
71
-		$cible = '#' . implode(',#', $cible);
72
-	} else {
73
-		$cible = "#$bouton_id + div.bloc_depliable";
74
-	}
68
+    $class = ($deplie === true) ? ' deplie' : (($deplie == -1) ? ' impliable' : ' replie');
69
+    if (strlen((string) $ids)) {
70
+        $cible = explode(',', (string) $ids);
71
+        $cible = '#' . implode(',#', $cible);
72
+    } else {
73
+        $cible = "#$bouton_id + div.bloc_depliable";
74
+    }
75 75
 
76
-	$b = (str_contains((string) $texte, '<h') ? 'div' : 'h3');
76
+    $b = (str_contains((string) $texte, '<h') ? 'div' : 'h3');
77 77
 
78
-	return "<$b "
79
-	. ($bouton_id ? "id='$bouton_id' " : '')
80
-	. "class='titrem$class'"
81
-	. (($deplie === -1)
82
-		? ''
83
-		: " onmouseover=\"jQuery(this).depliant('$cible');\""
84
-	)
85
-	. '>'
86
-	// une ancre pour rendre accessible au clavier le depliage du sous bloc
87
-	. "<a href='#' onclick=\"return jQuery(this).depliant_clicancre('$cible');\" class='titremancre'></a>"
88
-	. "$texte</$b>"
89
-	. http_script(($deplie === 'incertain')
90
-		? "jQuery(function($){if ($('$cible').is(':visible')) { $('#$bouton_id').addClass('deplie').removeClass('replie'); }});"
91
-		: '');
78
+    return "<$b "
79
+    . ($bouton_id ? "id='$bouton_id' " : '')
80
+    . "class='titrem$class'"
81
+    . (($deplie === -1)
82
+        ? ''
83
+        : " onmouseover=\"jQuery(this).depliant('$cible');\""
84
+    )
85
+    . '>'
86
+    // une ancre pour rendre accessible au clavier le depliage du sous bloc
87
+    . "<a href='#' onclick=\"return jQuery(this).depliant_clicancre('$cible');\" class='titremancre'></a>"
88
+    . "$texte</$b>"
89
+    . http_script(($deplie === 'incertain')
90
+        ? "jQuery(function($){if ($('$cible').is(':visible')) { $('#$bouton_id').addClass('deplie').removeClass('replie'); }});"
91
+        : '');
92 92
 }
Please login to merge, or discard this patch.
ecrire/public/cacher.php 1 patch
Indentation   +314 added lines, -314 removed lines patch added patch discarded remove patch
@@ -10,7 +10,7 @@  discard block
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 /**
@@ -24,9 +24,9 @@  discard block
 block discarded – undo
24 24
  * @return string
25 25
  */
26 26
 function generer_nom_fichier_cache($contexte, $page) {
27
-	$u = md5(var_export([$contexte, $page], true));
27
+    $u = md5(var_export([$contexte, $page], true));
28 28
 
29
-	return $u . '.cache';
29
+    return $u . '.cache';
30 30
 }
31 31
 
32 32
 /**
@@ -42,26 +42,26 @@  discard block
 block discarded – undo
42 42
  * @return string
43 43
  */
44 44
 function cache_chemin_fichier($nom_cache, $ecrire = false) {
45
-	static $l1, $l2;
46
-	if (is_null($l1)) {
47
-		$length = (defined('_CACHE_PROFONDEUR_STOCKAGE') ? min(8, max(_CACHE_PROFONDEUR_STOCKAGE, 2)) : 4);
48
-		$l1 = (int) floor($length / 2);
49
-		$l2 = $length - $l1;
50
-	}
51
-	$d = substr((string) $nom_cache, 0, $l1);
52
-	$u = substr((string) $nom_cache, $l1, $l2);
53
-
54
-	if ($ecrire) {
55
-		$rep = sous_repertoire(_DIR_CACHE, '', false, true);
56
-		$rep = sous_repertoire($rep, 'calcul/', false, true);
57
-		$rep = sous_repertoire($rep, $d, false, true);
58
-	}
59
-	else {
60
-		// en lecture on essaye pas de creer les repertoires, on va au plus vite
61
-		$rep = _DIR_CACHE . "calcul/$d/";
62
-	}
63
-
64
-	return $rep . $u . '.cache';
45
+    static $l1, $l2;
46
+    if (is_null($l1)) {
47
+        $length = (defined('_CACHE_PROFONDEUR_STOCKAGE') ? min(8, max(_CACHE_PROFONDEUR_STOCKAGE, 2)) : 4);
48
+        $l1 = (int) floor($length / 2);
49
+        $l2 = $length - $l1;
50
+    }
51
+    $d = substr((string) $nom_cache, 0, $l1);
52
+    $u = substr((string) $nom_cache, $l1, $l2);
53
+
54
+    if ($ecrire) {
55
+        $rep = sous_repertoire(_DIR_CACHE, '', false, true);
56
+        $rep = sous_repertoire($rep, 'calcul/', false, true);
57
+        $rep = sous_repertoire($rep, $d, false, true);
58
+    }
59
+    else {
60
+        // en lecture on essaye pas de creer les repertoires, on va au plus vite
61
+        $rep = _DIR_CACHE . "calcul/$d/";
62
+    }
63
+
64
+    return $rep . $u . '.cache';
65 65
 }
66 66
 
67 67
 /**
@@ -72,7 +72,7 @@  discard block
 block discarded – undo
72 72
  * @return bool
73 73
  */
74 74
 function ecrire_cache($nom_cache, $valeur) {
75
-	return ecrire_fichier(cache_chemin_fichier($nom_cache, true), serialize(['nom_cache' => $nom_cache, 'valeur' => $valeur]));
75
+    return ecrire_fichier(cache_chemin_fichier($nom_cache, true), serialize(['nom_cache' => $nom_cache, 'valeur' => $valeur]));
76 76
 }
77 77
 
78 78
 /**
@@ -82,33 +82,33 @@  discard block
 block discarded – undo
82 82
  * @return mixed
83 83
  */
84 84
 function lire_cache($nom_cache) {
85
-	$tmp = [];
86
-	if (
87
-		file_exists($f = cache_chemin_fichier($nom_cache))
88
-		&& lire_fichier($f, $tmp)
89
-		&& ($tmp = unserialize($tmp))
90
-		&& $tmp['nom_cache'] == $nom_cache
91
-		&& isset($tmp['valeur'])
92
-	) {
93
-		return $tmp['valeur'];
94
-	}
95
-
96
-	return false;
85
+    $tmp = [];
86
+    if (
87
+        file_exists($f = cache_chemin_fichier($nom_cache))
88
+        && lire_fichier($f, $tmp)
89
+        && ($tmp = unserialize($tmp))
90
+        && $tmp['nom_cache'] == $nom_cache
91
+        && isset($tmp['valeur'])
92
+    ) {
93
+        return $tmp['valeur'];
94
+    }
95
+
96
+    return false;
97 97
 }
98 98
 
99 99
 // Parano : on signe le cache, afin d'interdire un hack d'injection
100 100
 // dans notre memcache
101 101
 function cache_signature(&$page) {
102
-	if (!isset($GLOBALS['meta']['cache_signature'])) {
103
-		include_spip('inc/acces');
104
-		ecrire_meta(
105
-			'cache_signature',
106
-			hash('sha256', $_SERVER['DOCUMENT_ROOT'] . ($_SERVER['SERVER_SIGNATURE'] ?? '') . creer_uniqid()),
107
-			'non'
108
-		);
109
-	}
110
-
111
-	return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']);
102
+    if (!isset($GLOBALS['meta']['cache_signature'])) {
103
+        include_spip('inc/acces');
104
+        ecrire_meta(
105
+            'cache_signature',
106
+            hash('sha256', $_SERVER['DOCUMENT_ROOT'] . ($_SERVER['SERVER_SIGNATURE'] ?? '') . creer_uniqid()),
107
+            'non'
108
+        );
109
+    }
110
+
111
+    return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']);
112 112
 }
113 113
 
114 114
 /**
@@ -121,14 +121,14 @@  discard block
 block discarded – undo
121 121
  * @return array
122 122
  */
123 123
 function gzip_page($page) {
124
-	if (function_exists('gzcompress') && strlen((string) $page['texte']) > 16 * 1024) {
125
-		$page['gz'] = true;
126
-		$page['texte'] = gzcompress((string) $page['texte']);
127
-	} else {
128
-		$page['gz'] = false;
129
-	}
130
-
131
-	return $page;
124
+    if (function_exists('gzcompress') && strlen((string) $page['texte']) > 16 * 1024) {
125
+        $page['gz'] = true;
126
+        $page['texte'] = gzcompress((string) $page['texte']);
127
+    } else {
128
+        $page['gz'] = false;
129
+    }
130
+
131
+    return $page;
132 132
 }
133 133
 
134 134
 /**
@@ -141,10 +141,10 @@  discard block
 block discarded – undo
141 141
  * @return void
142 142
  */
143 143
 function gunzip_page(&$page) {
144
-	if ($page['gz']) {
145
-		$page['texte'] = gzuncompress($page['texte']);
146
-		$page['gz'] = false; // ne pas gzuncompress deux fois une meme page
147
-	}
144
+    if ($page['gz']) {
145
+        $page['texte'] = gzuncompress($page['texte']);
146
+        $page['gz'] = false; // ne pas gzuncompress deux fois une meme page
147
+    }
148 148
 }
149 149
 
150 150
 /**
@@ -159,72 +159,72 @@  discard block
 block discarded – undo
159 159
  * -1 si il faut calculer sans stocker en cache
160 160
  */
161 161
 function cache_valide(&$page, $date) {
162
-	$now = $_SERVER['REQUEST_TIME'];
163
-
164
-	// Apparition d'un nouvel article post-date ?
165
-	if (
166
-		isset($GLOBALS['meta']['post_dates'])
167
-		&& $GLOBALS['meta']['post_dates'] == 'non'
168
-		&& isset($GLOBALS['meta']['date_prochain_postdate'])
169
-		&& $now > $GLOBALS['meta']['date_prochain_postdate']
170
-	) {
171
-		spip_log('Un article post-date invalide le cache');
172
-		include_spip('inc/rubriques');
173
-		calculer_prochain_postdate(true);
174
-	}
175
-
176
-	if (defined('_VAR_NOCACHE') && _VAR_NOCACHE) {
177
-		return -1;
178
-	}
179
-	if (isset($GLOBALS['meta']['cache_inhib']) && $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
180
-		return -1;
181
-	}
182
-	if (defined('_NO_CACHE')) {
183
-		return (_NO_CACHE == 0 && !isset($page['texte'])) ? 1 : _NO_CACHE;
184
-	}
185
-
186
-	// pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
187
-	if (!$page || !isset($page['texte']) || !isset($page['entetes']['X-Spip-Cache'])) {
188
-		return _IS_BOT ? -1 : 1;
189
-	}
190
-
191
-	// controle de la signature
192
-	if ($page['sig'] !== cache_signature($page)) {
193
-		return _IS_BOT ? -1 : 1;
194
-	}
195
-
196
-	// #CACHE{n,statique} => on n'invalide pas avec derniere_modif
197
-	// cf. ecrire/public/balises.php, balise_CACHE_dist()
198
-	// Cache invalide par la meta 'derniere_modif'
199
-	// sauf pour les bots, qui utilisent toujours le cache
200
-	if (
201
-		(!isset($page['entetes']['X-Spip-Statique']) || $page['entetes']['X-Spip-Statique'] !== 'oui')
202
-		&& (
203
-			!_IS_BOT
204
-			&& $GLOBALS['derniere_modif_invalide']
205
-			&& isset($GLOBALS['meta']['derniere_modif'])
206
-			&& $date < $GLOBALS['meta']['derniere_modif']
207
-		)
208
-	) {
209
-		return 1;
210
-	}
211
-
212
-	// Sinon comparer l'age du fichier a sa duree de cache
213
-	$duree = (int) $page['entetes']['X-Spip-Cache'];
214
-	$cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0);
215
-	if ($duree == 0) {  #CACHE{0}
216
-	return -1;
217
-	} // sauf pour les bots, qui utilisent toujours le cache
218
-	else {
219
-		if (
220
-			!_IS_BOT && $date + $duree < $now
221
-			|| $date < $cache_mark
222
-		) {
223
-			return _IS_BOT ? -1 : 1;
224
-		} else {
225
-			return 0;
226
-		}
227
-	}
162
+    $now = $_SERVER['REQUEST_TIME'];
163
+
164
+    // Apparition d'un nouvel article post-date ?
165
+    if (
166
+        isset($GLOBALS['meta']['post_dates'])
167
+        && $GLOBALS['meta']['post_dates'] == 'non'
168
+        && isset($GLOBALS['meta']['date_prochain_postdate'])
169
+        && $now > $GLOBALS['meta']['date_prochain_postdate']
170
+    ) {
171
+        spip_log('Un article post-date invalide le cache');
172
+        include_spip('inc/rubriques');
173
+        calculer_prochain_postdate(true);
174
+    }
175
+
176
+    if (defined('_VAR_NOCACHE') && _VAR_NOCACHE) {
177
+        return -1;
178
+    }
179
+    if (isset($GLOBALS['meta']['cache_inhib']) && $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
180
+        return -1;
181
+    }
182
+    if (defined('_NO_CACHE')) {
183
+        return (_NO_CACHE == 0 && !isset($page['texte'])) ? 1 : _NO_CACHE;
184
+    }
185
+
186
+    // pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
187
+    if (!$page || !isset($page['texte']) || !isset($page['entetes']['X-Spip-Cache'])) {
188
+        return _IS_BOT ? -1 : 1;
189
+    }
190
+
191
+    // controle de la signature
192
+    if ($page['sig'] !== cache_signature($page)) {
193
+        return _IS_BOT ? -1 : 1;
194
+    }
195
+
196
+    // #CACHE{n,statique} => on n'invalide pas avec derniere_modif
197
+    // cf. ecrire/public/balises.php, balise_CACHE_dist()
198
+    // Cache invalide par la meta 'derniere_modif'
199
+    // sauf pour les bots, qui utilisent toujours le cache
200
+    if (
201
+        (!isset($page['entetes']['X-Spip-Statique']) || $page['entetes']['X-Spip-Statique'] !== 'oui')
202
+        && (
203
+            !_IS_BOT
204
+            && $GLOBALS['derniere_modif_invalide']
205
+            && isset($GLOBALS['meta']['derniere_modif'])
206
+            && $date < $GLOBALS['meta']['derniere_modif']
207
+        )
208
+    ) {
209
+        return 1;
210
+    }
211
+
212
+    // Sinon comparer l'age du fichier a sa duree de cache
213
+    $duree = (int) $page['entetes']['X-Spip-Cache'];
214
+    $cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0);
215
+    if ($duree == 0) {  #CACHE{0}
216
+    return -1;
217
+    } // sauf pour les bots, qui utilisent toujours le cache
218
+    else {
219
+        if (
220
+            !_IS_BOT && $date + $duree < $now
221
+            || $date < $cache_mark
222
+        ) {
223
+            return _IS_BOT ? -1 : 1;
224
+        } else {
225
+            return 0;
226
+        }
227
+    }
228 228
 }
229 229
 
230 230
 /**
@@ -237,59 +237,59 @@  discard block
 block discarded – undo
237 237
  */
238 238
 function creer_cache(&$page, &$chemin_cache) {
239 239
 
240
-	// Ne rien faire si on est en preview, debug, ou si une erreur
241
-	// grave s'est presentee (compilation du squelette, MySQL, etc)
242
-	// le cas var_nocache ne devrait jamais arriver ici (securite)
243
-	// le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
244
-	if (
245
-		defined('_VAR_NOCACHE') && _VAR_NOCACHE
246
-		|| defined('spip_interdire_cache')
247
-	) {
248
-		return;
249
-	}
250
-
251
-	// Si la page c1234 a un invalideur de session 'zz', sauver dans
252
-	// 'tmp/cache/MD5(chemin_cache)_zz'
253
-	if (
254
-		isset($page['invalideurs'])
255
-		&& isset($page['invalideurs']['session'])
256
-	) {
257
-		// on verifie que le contenu du chemin cache indique seulement
258
-		// "cache sessionne" ; sa date indique la date de validite
259
-		// des caches sessionnes
260
-		if (!$tmp = lire_cache($chemin_cache)) {
261
-			spip_log('Creation cache sessionne ' . $chemin_cache);
262
-			$tmp = [
263
-				'invalideurs' => ['session' => ''],
264
-				'lastmodified' => $_SERVER['REQUEST_TIME']
265
-			];
266
-			ecrire_cache($chemin_cache, $tmp);
267
-		}
268
-		$chemin_cache = generer_nom_fichier_cache(
269
-			['chemin_cache' => $chemin_cache],
270
-			['session' => $page['invalideurs']['session']]
271
-		);
272
-	}
273
-
274
-	// ajouter la date de production dans le cache lui meme
275
-	// (qui contient deja sa duree de validite)
276
-	$page['lastmodified'] = $_SERVER['REQUEST_TIME'];
277
-
278
-	// compresser le contenu si besoin
279
-	$pagez = gzip_page($page);
280
-
281
-	// signer le contenu
282
-	$pagez['sig'] = cache_signature($pagez);
283
-
284
-	// l'enregistrer, compresse ou non...
285
-	$ok = ecrire_cache($chemin_cache, $pagez);
286
-
287
-	spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $chemin_cache pour "
288
-		. $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO);
289
-
290
-	// Inserer ses invalideurs
291
-	include_spip('inc/invalideur');
292
-	maj_invalideurs($chemin_cache, $page);
240
+    // Ne rien faire si on est en preview, debug, ou si une erreur
241
+    // grave s'est presentee (compilation du squelette, MySQL, etc)
242
+    // le cas var_nocache ne devrait jamais arriver ici (securite)
243
+    // le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
244
+    if (
245
+        defined('_VAR_NOCACHE') && _VAR_NOCACHE
246
+        || defined('spip_interdire_cache')
247
+    ) {
248
+        return;
249
+    }
250
+
251
+    // Si la page c1234 a un invalideur de session 'zz', sauver dans
252
+    // 'tmp/cache/MD5(chemin_cache)_zz'
253
+    if (
254
+        isset($page['invalideurs'])
255
+        && isset($page['invalideurs']['session'])
256
+    ) {
257
+        // on verifie que le contenu du chemin cache indique seulement
258
+        // "cache sessionne" ; sa date indique la date de validite
259
+        // des caches sessionnes
260
+        if (!$tmp = lire_cache($chemin_cache)) {
261
+            spip_log('Creation cache sessionne ' . $chemin_cache);
262
+            $tmp = [
263
+                'invalideurs' => ['session' => ''],
264
+                'lastmodified' => $_SERVER['REQUEST_TIME']
265
+            ];
266
+            ecrire_cache($chemin_cache, $tmp);
267
+        }
268
+        $chemin_cache = generer_nom_fichier_cache(
269
+            ['chemin_cache' => $chemin_cache],
270
+            ['session' => $page['invalideurs']['session']]
271
+        );
272
+    }
273
+
274
+    // ajouter la date de production dans le cache lui meme
275
+    // (qui contient deja sa duree de validite)
276
+    $page['lastmodified'] = $_SERVER['REQUEST_TIME'];
277
+
278
+    // compresser le contenu si besoin
279
+    $pagez = gzip_page($page);
280
+
281
+    // signer le contenu
282
+    $pagez['sig'] = cache_signature($pagez);
283
+
284
+    // l'enregistrer, compresse ou non...
285
+    $ok = ecrire_cache($chemin_cache, $pagez);
286
+
287
+    spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $chemin_cache pour "
288
+        . $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO);
289
+
290
+    // Inserer ses invalideurs
291
+    include_spip('inc/invalideur');
292
+    maj_invalideurs($chemin_cache, $page);
293 293
 }
294 294
 
295 295
 
@@ -302,15 +302,15 @@  discard block
 block discarded – undo
302 302
  * @return void
303 303
  */
304 304
 function nettoyer_petit_cache($prefix, $duree = 300) {
305
-	// determiner le repertoire a purger : 'tmp/CACHE/rech/'
306
-	$dircache = sous_repertoire(_DIR_CACHE, $prefix);
307
-	if (spip_touch($dircache . 'purger_' . $prefix, $duree, true)) {
308
-		foreach (preg_files($dircache, '[.]txt$') as $f) {
309
-			if ($_SERVER['REQUEST_TIME'] - (@file_exists($f) ? @filemtime($f) : 0) > $duree) {
310
-				spip_unlink($f);
311
-			}
312
-		}
313
-	}
305
+    // determiner le repertoire a purger : 'tmp/CACHE/rech/'
306
+    $dircache = sous_repertoire(_DIR_CACHE, $prefix);
307
+    if (spip_touch($dircache . 'purger_' . $prefix, $duree, true)) {
308
+        foreach (preg_files($dircache, '[.]txt$') as $f) {
309
+            if ($_SERVER['REQUEST_TIME'] - (@file_exists($f) ? @filemtime($f) : 0) > $duree) {
310
+                spip_unlink($f);
311
+            }
312
+        }
313
+    }
314 314
 }
315 315
 
316 316
 
@@ -338,132 +338,132 @@  discard block
 block discarded – undo
338 338
  */
339 339
 function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified) {
340 340
 
341
-	# fonction de cache minimale : dire "non on ne met rien en cache"
342
-	# $use_cache = -1; return;
343
-
344
-	// Second appel, destine a l'enregistrement du cache sur le disque
345
-	if (isset($chemin_cache)) {
346
-		creer_cache($page, $chemin_cache);
347
-		return;
348
-	}
349
-
350
-	// Toute la suite correspond au premier appel
351
-	$contexte_implicite = $page['contexte_implicite'];
352
-
353
-	// Cas ignorant le cache car completement dynamique
354
-	if (
355
-		!empty($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST'
356
-		|| _request('connect')
357
-	) {
358
-		$use_cache = -1;
359
-		$lastmodified = 0;
360
-		$chemin_cache = '';
361
-		$page = [];
362
-
363
-		return;
364
-	}
365
-
366
-	// Controler l'existence d'un cache nous correspondant
367
-	$chemin_cache = generer_nom_fichier_cache($contexte, $page);
368
-	$lastmodified = 0;
369
-
370
-	// charger le cache s'il existe (et si il a bien le bon hash = anticollision)
371
-	if (!$page = lire_cache($chemin_cache)) {
372
-		$page = [];
373
-	}
374
-
375
-	// s'il est sessionne, charger celui correspondant a notre session
376
-	if (
377
-		isset($page['invalideurs'])
378
-		&& isset($page['invalideurs']['session'])
379
-	) {
380
-		$chemin_cache_session = generer_nom_fichier_cache(
381
-			['chemin_cache' => $chemin_cache],
382
-			['session' => spip_session()]
383
-		);
384
-		if (
385
-			($page_session = lire_cache($chemin_cache_session)) && $page_session['lastmodified'] >= $page['lastmodified']
386
-		) {
387
-			$page = $page_session;
388
-		} else {
389
-			$page = [];
390
-		}
391
-	}
392
-
393
-
394
-	// Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
395
-	// ne le faire que si la base est disponible
396
-	if (isset($GLOBALS['meta']['invalider']) && spip_connect()) {
397
-		include_spip('inc/invalideur');
398
-		retire_caches($chemin_cache);
399
-		# API invalideur inutile
400
-		supprimer_fichier(_DIR_CACHE . $chemin_cache);
401
-		if (isset($chemin_cache_session) && $chemin_cache_session) {
402
-			supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
403
-		}
404
-	}
405
-
406
-	// Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
407
-	// on supprime le cache
408
-	if (
409
-		defined('_VAR_MODE') &&
410
-		_VAR_MODE &&
411
-		(isset($_COOKIE['spip_session']) ||
412
-			isset($_COOKIE['spip_admin']) ||
413
-			@file_exists(_ACCESS_FILE_NAME))
414
-	) {
415
-		$page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu
416
-		include_spip('inc/invalideur');
417
-		retire_caches($chemin_cache); # API invalideur inutile
418
-		supprimer_fichier(_DIR_CACHE . $chemin_cache);
419
-		if (isset($chemin_cache_session) && $chemin_cache_session) {
420
-			supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
421
-		}
422
-	}
423
-
424
-	// $delais par defaut
425
-	// pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
426
-	// qui sont a cache nul par defaut
427
-	if (!isset($GLOBALS['delais'])) {
428
-		if (!defined('_DUREE_CACHE_DEFAUT')) {
429
-			define('_DUREE_CACHE_DEFAUT', 24 * 3600);
430
-		}
431
-		$GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
432
-	}
433
-
434
-	// determiner la validite de la page
435
-	if ($page) {
436
-		$use_cache = cache_valide($page, $page['lastmodified'] ?? 0);
437
-		// le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
438
-		// par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
439
-		$page['contexte_implicite'] = $contexte_implicite;
440
-		if (!$use_cache) {
441
-			// $page est un cache utilisable
442
-			gunzip_page($page);
443
-
444
-			return;
445
-		}
446
-	} else {
447
-		$page = ['contexte_implicite' => $contexte_implicite];
448
-		$use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul
449
-	}
450
-
451
-	// Si pas valide mais pas de connexion a la base, le garder quand meme
452
-	if (!spip_connect()) {
453
-		if (isset($page['texte'])) {
454
-			gunzip_page($page);
455
-			$use_cache = 0;
456
-		} else {
457
-			spip_log("Erreur base de donnees, impossible utiliser $chemin_cache");
458
-			include_spip('inc/minipres');
459
-
460
-			return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
461
-		}
462
-	}
463
-
464
-	if ($use_cache < 0) {
465
-		$chemin_cache = '';
466
-	}
467
-
468
-	return;
341
+    # fonction de cache minimale : dire "non on ne met rien en cache"
342
+    # $use_cache = -1; return;
343
+
344
+    // Second appel, destine a l'enregistrement du cache sur le disque
345
+    if (isset($chemin_cache)) {
346
+        creer_cache($page, $chemin_cache);
347
+        return;
348
+    }
349
+
350
+    // Toute la suite correspond au premier appel
351
+    $contexte_implicite = $page['contexte_implicite'];
352
+
353
+    // Cas ignorant le cache car completement dynamique
354
+    if (
355
+        !empty($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST'
356
+        || _request('connect')
357
+    ) {
358
+        $use_cache = -1;
359
+        $lastmodified = 0;
360
+        $chemin_cache = '';
361
+        $page = [];
362
+
363
+        return;
364
+    }
365
+
366
+    // Controler l'existence d'un cache nous correspondant
367
+    $chemin_cache = generer_nom_fichier_cache($contexte, $page);
368
+    $lastmodified = 0;
369
+
370
+    // charger le cache s'il existe (et si il a bien le bon hash = anticollision)
371
+    if (!$page = lire_cache($chemin_cache)) {
372
+        $page = [];
373
+    }
374
+
375
+    // s'il est sessionne, charger celui correspondant a notre session
376
+    if (
377
+        isset($page['invalideurs'])
378
+        && isset($page['invalideurs']['session'])
379
+    ) {
380
+        $chemin_cache_session = generer_nom_fichier_cache(
381
+            ['chemin_cache' => $chemin_cache],
382
+            ['session' => spip_session()]
383
+        );
384
+        if (
385
+            ($page_session = lire_cache($chemin_cache_session)) && $page_session['lastmodified'] >= $page['lastmodified']
386
+        ) {
387
+            $page = $page_session;
388
+        } else {
389
+            $page = [];
390
+        }
391
+    }
392
+
393
+
394
+    // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
395
+    // ne le faire que si la base est disponible
396
+    if (isset($GLOBALS['meta']['invalider']) && spip_connect()) {
397
+        include_spip('inc/invalideur');
398
+        retire_caches($chemin_cache);
399
+        # API invalideur inutile
400
+        supprimer_fichier(_DIR_CACHE . $chemin_cache);
401
+        if (isset($chemin_cache_session) && $chemin_cache_session) {
402
+            supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
403
+        }
404
+    }
405
+
406
+    // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
407
+    // on supprime le cache
408
+    if (
409
+        defined('_VAR_MODE') &&
410
+        _VAR_MODE &&
411
+        (isset($_COOKIE['spip_session']) ||
412
+            isset($_COOKIE['spip_admin']) ||
413
+            @file_exists(_ACCESS_FILE_NAME))
414
+    ) {
415
+        $page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu
416
+        include_spip('inc/invalideur');
417
+        retire_caches($chemin_cache); # API invalideur inutile
418
+        supprimer_fichier(_DIR_CACHE . $chemin_cache);
419
+        if (isset($chemin_cache_session) && $chemin_cache_session) {
420
+            supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
421
+        }
422
+    }
423
+
424
+    // $delais par defaut
425
+    // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
426
+    // qui sont a cache nul par defaut
427
+    if (!isset($GLOBALS['delais'])) {
428
+        if (!defined('_DUREE_CACHE_DEFAUT')) {
429
+            define('_DUREE_CACHE_DEFAUT', 24 * 3600);
430
+        }
431
+        $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
432
+    }
433
+
434
+    // determiner la validite de la page
435
+    if ($page) {
436
+        $use_cache = cache_valide($page, $page['lastmodified'] ?? 0);
437
+        // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
438
+        // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
439
+        $page['contexte_implicite'] = $contexte_implicite;
440
+        if (!$use_cache) {
441
+            // $page est un cache utilisable
442
+            gunzip_page($page);
443
+
444
+            return;
445
+        }
446
+    } else {
447
+        $page = ['contexte_implicite' => $contexte_implicite];
448
+        $use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul
449
+    }
450
+
451
+    // Si pas valide mais pas de connexion a la base, le garder quand meme
452
+    if (!spip_connect()) {
453
+        if (isset($page['texte'])) {
454
+            gunzip_page($page);
455
+            $use_cache = 0;
456
+        } else {
457
+            spip_log("Erreur base de donnees, impossible utiliser $chemin_cache");
458
+            include_spip('inc/minipres');
459
+
460
+            return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
461
+        }
462
+    }
463
+
464
+    if ($use_cache < 0) {
465
+        $chemin_cache = '';
466
+    }
467
+
468
+    return;
469 469
 }
Please login to merge, or discard this patch.