Completed
Push — master ( 8b8662...05618b )
by cam
01:05
created
ecrire/inc/livrer_fichier.php 3 patches
Indentation   +125 added lines, -125 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Fichier
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -36,28 +36,28 @@  discard block
 block discarded – undo
36 36
  */
37 37
 function spip_livrer_fichier($fichier, $content_type = 'application/octet-stream', $options = []) {
38 38
 
39
-	$defaut = [
40
-		'attachment' => false,
41
-		'expires' => 3600,
42
-		'range' => null
43
-	];
44
-	$options = array_merge($defaut, $options);
45
-	if (is_numeric($options['expire']) and $options['expire'] > 0) {
46
-		$options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']) . ' GMT';
47
-	}
48
-
49
-	if (is_null($options) and isset($_SERVER['HTTP_RANGE'])) {
50
-		$options['range'] = $_SERVER['HTTP_RANGE'];
51
-	}
52
-
53
-	spip_livrer_fichier_entetes($fichier, $content_type, $options['attachment'] && !$options['range'], $options['expires']);
54
-
55
-	if (!is_null($options['range'])) {
56
-		spip_livrer_fichier_partie($fichier, $options['range']);
57
-	}
58
-	else {
59
-		spip_livrer_fichier_entier($fichier);
60
-	}
39
+    $defaut = [
40
+        'attachment' => false,
41
+        'expires' => 3600,
42
+        'range' => null
43
+    ];
44
+    $options = array_merge($defaut, $options);
45
+    if (is_numeric($options['expire']) and $options['expire'] > 0) {
46
+        $options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']) . ' GMT';
47
+    }
48
+
49
+    if (is_null($options) and isset($_SERVER['HTTP_RANGE'])) {
50
+        $options['range'] = $_SERVER['HTTP_RANGE'];
51
+    }
52
+
53
+    spip_livrer_fichier_entetes($fichier, $content_type, $options['attachment'] && !$options['range'], $options['expires']);
54
+
55
+    if (!is_null($options['range'])) {
56
+        spip_livrer_fichier_partie($fichier, $options['range']);
57
+    }
58
+    else {
59
+        spip_livrer_fichier_entier($fichier);
60
+    }
61 61
 }
62 62
 
63 63
 /**
@@ -70,28 +70,28 @@  discard block
 block discarded – undo
70 70
  * @param int|string $expires
71 71
  */
72 72
 function spip_livrer_fichier_entetes($fichier, $content_type = 'application/octet-stream', $attachment = false, $expires = 0) {
73
-	// toujours envoyer un content type, meme vide !
74
-	header('Accept-Ranges: bytes');
75
-	header('Content-Type: ' . $content_type);
76
-
77
-	if ($attachment) {
78
-		$f = basename($fichier);
79
-		// ce content-type est necessaire pour eviter des corruptions de zip dans ie6
80
-		header('Content-Type: application/octet-stream');
81
-
82
-		header("Content-Disposition: attachment; filename=\"$f\";");
83
-		header('Content-Transfer-Encoding: binary');
84
-
85
-		// fix for IE caching or PHP bug issue
86
-		header('Expires: 0'); // set expiration time
87
-		header('Pragma: public');
88
-		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
89
-	}
90
-	else {
91
-		$f = basename($fichier);
92
-		header("Content-Disposition: inline; filename=\"$f\";");
93
-		header('Expires: ' . $expires); // set expiration time
94
-	}
73
+    // toujours envoyer un content type, meme vide !
74
+    header('Accept-Ranges: bytes');
75
+    header('Content-Type: ' . $content_type);
76
+
77
+    if ($attachment) {
78
+        $f = basename($fichier);
79
+        // ce content-type est necessaire pour eviter des corruptions de zip dans ie6
80
+        header('Content-Type: application/octet-stream');
81
+
82
+        header("Content-Disposition: attachment; filename=\"$f\";");
83
+        header('Content-Transfer-Encoding: binary');
84
+
85
+        // fix for IE caching or PHP bug issue
86
+        header('Expires: 0'); // set expiration time
87
+        header('Pragma: public');
88
+        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
89
+    }
90
+    else {
91
+        $f = basename($fichier);
92
+        header("Content-Disposition: inline; filename=\"$f\";");
93
+        header('Expires: ' . $expires); // set expiration time
94
+    }
95 95
 }
96 96
 
97 97
 /**
@@ -99,20 +99,20 @@  discard block
 block discarded – undo
99 99
  * @param string $fichier
100 100
  */
101 101
 function spip_livrer_fichier_entier($fichier) {
102
-	if (!file_exists($fichier)) {
103
-		throw new \Exception(sprintf('File not found: %s', $fichier));
104
-	}
102
+    if (!file_exists($fichier)) {
103
+        throw new \Exception(sprintf('File not found: %s', $fichier));
104
+    }
105 105
 
106
-	if (!is_readable($fichier)) {
107
-		throw new \Exception(sprintf('File not readable: %s', $fichier));
108
-	}
106
+    if (!is_readable($fichier)) {
107
+        throw new \Exception(sprintf('File not readable: %s', $fichier));
108
+    }
109 109
 
110
-	if ($size = filesize($fichier)) {
111
-		header(sprintf('Content-Length: %d', $size));
112
-	}
110
+    if ($size = filesize($fichier)) {
111
+        header(sprintf('Content-Length: %d', $size));
112
+    }
113 113
 
114
-	readfile($fichier);
115
-	exit();
114
+    readfile($fichier);
115
+    exit();
116 116
 }
117 117
 
118 118
 /**
@@ -125,98 +125,98 @@  discard block
 block discarded – undo
125 125
  * @throws Exception
126 126
  */
127 127
 function spip_livrer_fichier_partie($fichier, $range = null) {
128
-	if (!file_exists($fichier)) {
129
-		throw new \Exception(sprintf('File not found: %s', $fichier));
130
-	}
128
+    if (!file_exists($fichier)) {
129
+        throw new \Exception(sprintf('File not found: %s', $fichier));
130
+    }
131 131
 
132
-	if (!is_readable($fichier)) {
133
-		throw new \Exception(sprintf('File not readable: %s', $fichier));
134
-	}
132
+    if (!is_readable($fichier)) {
133
+        throw new \Exception(sprintf('File not readable: %s', $fichier));
134
+    }
135 135
 
136 136
 
137
-	// Par defaut on envoie tout
138
-	$byteOffset = 0;
139
-	$byteLength = $fileSize = filesize($fichier);
137
+    // Par defaut on envoie tout
138
+    $byteOffset = 0;
139
+    $byteLength = $fileSize = filesize($fichier);
140 140
 
141 141
 
142
-	// Parse Content-Range header for byte offsets, looks like "bytes=11525-" OR "bytes=11525-12451"
143
-	if ($range and preg_match('%bytes=(\d+)-(\d+)?%i', $range, $match)) {
144
-		### Offset signifies where we should begin to read the file
145
-		$byteOffset = (int)$match[1];
142
+    // Parse Content-Range header for byte offsets, looks like "bytes=11525-" OR "bytes=11525-12451"
143
+    if ($range and preg_match('%bytes=(\d+)-(\d+)?%i', $range, $match)) {
144
+        ### Offset signifies where we should begin to read the file
145
+        $byteOffset = (int)$match[1];
146 146
 
147 147
 
148
-		### Length is for how long we should read the file according to the browser, and can never go beyond the file size
149
-		if (isset($match[2])) {
150
-			$finishBytes = (int)$match[2];
151
-			$byteLength = $finishBytes + 1;
152
-		} else {
153
-			$finishBytes = $fileSize - 1;
154
-		}
148
+        ### Length is for how long we should read the file according to the browser, and can never go beyond the file size
149
+        if (isset($match[2])) {
150
+            $finishBytes = (int)$match[2];
151
+            $byteLength = $finishBytes + 1;
152
+        } else {
153
+            $finishBytes = $fileSize - 1;
154
+        }
155 155
 
156
-		$cr_header = sprintf('Content-Range: bytes %d-%d/%d', $byteOffset, $finishBytes, $fileSize);
157
-	}
158
-	else {
159
-		// si pas de range valide, on delegue a la methode d'envoi complet
160
-		spip_livrer_fichier_entier($fichier);
161
-		// redondant, mais facilite la comprehension du code
162
-		exit();
163
-	}
156
+        $cr_header = sprintf('Content-Range: bytes %d-%d/%d', $byteOffset, $finishBytes, $fileSize);
157
+    }
158
+    else {
159
+        // si pas de range valide, on delegue a la methode d'envoi complet
160
+        spip_livrer_fichier_entier($fichier);
161
+        // redondant, mais facilite la comprehension du code
162
+        exit();
163
+    }
164 164
 
165
-	// Remove headers that might unnecessarily clutter up the output
166
-	header_remove('Cache-Control');
167
-	header_remove('Pragma');
165
+    // Remove headers that might unnecessarily clutter up the output
166
+    header_remove('Cache-Control');
167
+    header_remove('Pragma');
168 168
 
169
-	// partial content
170
-	header('HTTP/1.1 206 Partial content');
171
-	header($cr_header);  ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent
169
+    // partial content
170
+    header('HTTP/1.1 206 Partial content');
171
+    header($cr_header);  ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent
172 172
 
173 173
 
174
-	$byteRange = $byteLength - $byteOffset;
174
+    $byteRange = $byteLength - $byteOffset;
175 175
 
176
-	header(sprintf('Content-Length: %d', $byteRange));
176
+    header(sprintf('Content-Length: %d', $byteRange));
177 177
 
178
-	// Variable containing the buffer
179
-	$buffer = '';
180
-	// Just a reasonable buffer size
181
-	$bufferSize = 512 * 16;
182
-	// Contains how much is left to read of the byteRange
183
-	$bytePool = $byteRange;
178
+    // Variable containing the buffer
179
+    $buffer = '';
180
+    // Just a reasonable buffer size
181
+    $bufferSize = 512 * 16;
182
+    // Contains how much is left to read of the byteRange
183
+    $bytePool = $byteRange;
184 184
 
185
-	if (!$handle = fopen($fichier, 'r')) {
186
-		throw new \Exception(sprintf('Could not get handle for file %s', $fichier));
187
-	}
185
+    if (!$handle = fopen($fichier, 'r')) {
186
+        throw new \Exception(sprintf('Could not get handle for file %s', $fichier));
187
+    }
188 188
 
189
-	if (fseek($handle, $byteOffset, SEEK_SET) == -1) {
190
-		throw new \Exception(sprintf('Could not seek to byte offset %d', $byteOffset));
191
-	}
189
+    if (fseek($handle, $byteOffset, SEEK_SET) == -1) {
190
+        throw new \Exception(sprintf('Could not seek to byte offset %d', $byteOffset));
191
+    }
192 192
 
193 193
 
194
-	while ($bytePool > 0) {
195
-		// How many bytes we request on this iteration
196
-		$chunkSizeRequested = min($bufferSize, $bytePool);
194
+    while ($bytePool > 0) {
195
+        // How many bytes we request on this iteration
196
+        $chunkSizeRequested = min($bufferSize, $bytePool);
197 197
 
198
-		// Try readin $chunkSizeRequested bytes from $handle and put data in $buffer
199
-		$buffer = fread($handle, $chunkSizeRequested);
198
+        // Try readin $chunkSizeRequested bytes from $handle and put data in $buffer
199
+        $buffer = fread($handle, $chunkSizeRequested);
200 200
 
201
-		// Store how many bytes were actually read
202
-		$chunkSizeActual = strlen($buffer);
201
+        // Store how many bytes were actually read
202
+        $chunkSizeActual = strlen($buffer);
203 203
 
204
-		// If we didn't get any bytes that means something unexpected has happened since $bytePool should be zero already
205
-		if ($chunkSizeActual == 0) {
206
-			// For production servers this should go in your php error log, since it will break the output
207
-			trigger_error('Chunksize became 0', E_USER_WARNING);
208
-			break;
209
-		}
204
+        // If we didn't get any bytes that means something unexpected has happened since $bytePool should be zero already
205
+        if ($chunkSizeActual == 0) {
206
+            // For production servers this should go in your php error log, since it will break the output
207
+            trigger_error('Chunksize became 0', E_USER_WARNING);
208
+            break;
209
+        }
210 210
 
211
-		// Decrease byte pool with amount of bytes that were read during this iteration
212
-		$bytePool -= $chunkSizeActual;
211
+        // Decrease byte pool with amount of bytes that were read during this iteration
212
+        $bytePool -= $chunkSizeActual;
213 213
 
214
-		// Write the buffer to output
215
-		print $buffer;
214
+        // Write the buffer to output
215
+        print $buffer;
216 216
 
217
-		// Try to output the data to the client immediately
218
-		flush();
219
-	}
217
+        // Try to output the data to the client immediately
218
+        flush();
219
+    }
220 220
 
221
-	exit();
221
+    exit();
222 222
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -43,7 +43,7 @@  discard block
 block discarded – undo
43 43
 	];
44 44
 	$options = array_merge($defaut, $options);
45 45
 	if (is_numeric($options['expire']) and $options['expire'] > 0) {
46
-		$options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']) . ' GMT';
46
+		$options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']).' GMT';
47 47
 	}
48 48
 
49 49
 	if (is_null($options) and isset($_SERVER['HTTP_RANGE'])) {
@@ -72,7 +72,7 @@  discard block
 block discarded – undo
72 72
 function spip_livrer_fichier_entetes($fichier, $content_type = 'application/octet-stream', $attachment = false, $expires = 0) {
73 73
 	// toujours envoyer un content type, meme vide !
74 74
 	header('Accept-Ranges: bytes');
75
-	header('Content-Type: ' . $content_type);
75
+	header('Content-Type: '.$content_type);
76 76
 
77 77
 	if ($attachment) {
78 78
 		$f = basename($fichier);
@@ -90,7 +90,7 @@  discard block
 block discarded – undo
90 90
 	else {
91 91
 		$f = basename($fichier);
92 92
 		header("Content-Disposition: inline; filename=\"$f\";");
93
-		header('Expires: ' . $expires); // set expiration time
93
+		header('Expires: '.$expires); // set expiration time
94 94
 	}
95 95
 }
96 96
 
@@ -142,12 +142,12 @@  discard block
 block discarded – undo
142 142
 	// Parse Content-Range header for byte offsets, looks like "bytes=11525-" OR "bytes=11525-12451"
143 143
 	if ($range and preg_match('%bytes=(\d+)-(\d+)?%i', $range, $match)) {
144 144
 		### Offset signifies where we should begin to read the file
145
-		$byteOffset = (int)$match[1];
145
+		$byteOffset = (int) $match[1];
146 146
 
147 147
 
148 148
 		### Length is for how long we should read the file according to the browser, and can never go beyond the file size
149 149
 		if (isset($match[2])) {
150
-			$finishBytes = (int)$match[2];
150
+			$finishBytes = (int) $match[2];
151 151
 			$byteLength = $finishBytes + 1;
152 152
 		} else {
153 153
 			$finishBytes = $fileSize - 1;
@@ -168,7 +168,7 @@  discard block
 block discarded – undo
168 168
 
169 169
 	// partial content
170 170
 	header('HTTP/1.1 206 Partial content');
171
-	header($cr_header);  ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent
171
+	header($cr_header); ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent
172 172
 
173 173
 
174 174
 	$byteRange = $byteLength - $byteOffset;
Please login to merge, or discard this patch.
Braces   +3 added lines, -6 removed lines patch added patch discarded remove patch
@@ -54,8 +54,7 @@  discard block
 block discarded – undo
54 54
 
55 55
 	if (!is_null($options['range'])) {
56 56
 		spip_livrer_fichier_partie($fichier, $options['range']);
57
-	}
58
-	else {
57
+	} else {
59 58
 		spip_livrer_fichier_entier($fichier);
60 59
 	}
61 60
 }
@@ -86,8 +85,7 @@  discard block
 block discarded – undo
86 85
 		header('Expires: 0'); // set expiration time
87 86
 		header('Pragma: public');
88 87
 		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
89
-	}
90
-	else {
88
+	} else {
91 89
 		$f = basename($fichier);
92 90
 		header("Content-Disposition: inline; filename=\"$f\";");
93 91
 		header('Expires: ' . $expires); // set expiration time
@@ -154,8 +152,7 @@  discard block
 block discarded – undo
154 152
 		}
155 153
 
156 154
 		$cr_header = sprintf('Content-Range: bytes %d-%d/%d', $byteOffset, $finishBytes, $fileSize);
157
-	}
158
-	else {
155
+	} else {
159 156
 		// si pas de range valide, on delegue a la methode d'envoi complet
160 157
 		spip_livrer_fichier_entier($fichier);
161 158
 		// redondant, mais facilite la comprehension du code
Please login to merge, or discard this patch.
ecrire/inc/distant.php 3 patches
Braces   +2 added lines, -4 removed lines patch added patch discarded remove patch
@@ -116,8 +116,7 @@  discard block
 block discarded – undo
116 116
 		);
117 117
 		if (!$res or (!$res['length'] and $res['status'] != 304)) {
118 118
 			spip_log("copie_locale : Echec recuperation $source sur $localrac status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE);
119
-		}
120
-		else {
119
+		} else {
121 120
 			spip_log("copie_locale : recuperation $source sur $localrac OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant');
122 121
 		}
123 122
 		if (!$res or !$res['length']) {
@@ -222,8 +221,7 @@  discard block
 block discarded – undo
222 221
 						break;
223 222
 					}
224 223
 				}
225
-			}
226
-			else {
224
+			} else {
227 225
 				$ip = false;
228 226
 			}
229 227
 		}
Please login to merge, or discard this patch.
Indentation   +1053 added lines, -1053 removed lines patch added patch discarded remove patch
@@ -16,32 +16,32 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Distant
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 if (!defined('_INC_DISTANT_VERSION_HTTP')) {
23
-	define('_INC_DISTANT_VERSION_HTTP', 'HTTP/1.0');
23
+    define('_INC_DISTANT_VERSION_HTTP', 'HTTP/1.0');
24 24
 }
25 25
 if (!defined('_INC_DISTANT_CONTENT_ENCODING')) {
26
-	define('_INC_DISTANT_CONTENT_ENCODING', 'gzip');
26
+    define('_INC_DISTANT_CONTENT_ENCODING', 'gzip');
27 27
 }
28 28
 if (!defined('_INC_DISTANT_USER_AGENT')) {
29
-	define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . ' (' . $GLOBALS['home_server'] . ')');
29
+    define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . ' (' . $GLOBALS['home_server'] . ')');
30 30
 }
31 31
 if (!defined('_INC_DISTANT_MAX_SIZE')) {
32
-	define('_INC_DISTANT_MAX_SIZE', 2_097_152);
32
+    define('_INC_DISTANT_MAX_SIZE', 2_097_152);
33 33
 }
34 34
 if (!defined('_INC_DISTANT_CONNECT_TIMEOUT')) {
35
-	define('_INC_DISTANT_CONNECT_TIMEOUT', 10);
35
+    define('_INC_DISTANT_CONNECT_TIMEOUT', 10);
36 36
 }
37 37
 
38 38
 define('_REGEXP_COPIE_LOCALE', ',' 	.
39
-	preg_replace(
40
-		'@^https?:@',
41
-		'https?:',
42
-		($GLOBALS['meta']['adresse_site'] ?? '')
43
-	)
44
-	. '/?spip.php[?]action=acceder_document.*file=(.*)$,');
39
+    preg_replace(
40
+        '@^https?:@',
41
+        'https?:',
42
+        ($GLOBALS['meta']['adresse_site'] ?? '')
43
+    )
44
+    . '/?spip.php[?]action=acceder_document.*file=(.*)$,');
45 45
 
46 46
 //@define('_COPIE_LOCALE_MAX_SIZE',2097152); // poids (inc/utils l'a fait)
47 47
 
@@ -68,89 +68,89 @@  discard block
 block discarded – undo
68 68
  */
69 69
 function copie_locale($source, $mode = 'auto', $local = null, $taille_max = null) {
70 70
 
71
-	// si c'est la protection de soi-meme, retourner le path
72
-	if ($mode !== 'force' and preg_match(_REGEXP_COPIE_LOCALE, $source, $match)) {
73
-		$source = substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($match[1]);
74
-
75
-		return @file_exists($source) ? $source : false;
76
-	}
77
-
78
-	if (is_null($local)) {
79
-		$local = fichier_copie_locale($source);
80
-	} else {
81
-		if (_DIR_RACINE and strncmp(_DIR_RACINE, $local, strlen(_DIR_RACINE)) == 0) {
82
-			$local = substr($local, strlen(_DIR_RACINE));
83
-		}
84
-	}
85
-
86
-	// si $local = '' c'est un fichier refuse par fichier_copie_locale(),
87
-	// par exemple un fichier qui ne figure pas dans nos documents ;
88
-	// dans ce cas on n'essaie pas de le telecharger pour ensuite echouer
89
-	if (!$local) {
90
-		return false;
91
-	}
92
-
93
-	$localrac = _DIR_RACINE . $local;
94
-	$t = ($mode === 'force') ? false : @file_exists($localrac);
95
-
96
-	// test d'existence du fichier
97
-	if ($mode === 'test') {
98
-		return $t ? $local : '';
99
-	}
100
-
101
-	// sinon voir si on doit/peut le telecharger
102
-	if ($local === $source or !tester_url_absolue($source)) {
103
-		return $local;
104
-	}
105
-
106
-	if ($mode === 'modif' or !$t) {
107
-		// passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation
108
-		// et des eventuelles recuperations concurantes
109
-		include_spip('inc/acces');
110
-		if (!$taille_max) {
111
-			$taille_max = _COPIE_LOCALE_MAX_SIZE;
112
-		}
113
-		$res = recuperer_url(
114
-			$source,
115
-			['file' => $localrac, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : '']
116
-		);
117
-		if (!$res or (!$res['length'] and $res['status'] != 304)) {
118
-			spip_log("copie_locale : Echec recuperation $source sur $localrac status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE);
119
-		}
120
-		else {
121
-			spip_log("copie_locale : recuperation $source sur $localrac OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant');
122
-		}
123
-		if (!$res or !$res['length']) {
124
-			// si $t c'est sans doute juste un not-modified-since
125
-			return $t ? $local : false;
126
-		}
127
-
128
-		// si on retrouve l'extension
129
-		if (
130
-			!empty($res['headers'])
131
-			and $extension = distant_trouver_extension_selon_headers($source, $res['headers'])
132
-		) {
133
-			if ($sanitizer = charger_fonction($extension, 'sanitizer', true)) {
134
-				$sanitizer($localrac);
135
-			}
136
-		}
137
-
138
-		// pour une eventuelle indexation
139
-		pipeline(
140
-			'post_edition',
141
-			[
142
-				'args' => [
143
-					'operation' => 'copie_locale',
144
-					'source' => $source,
145
-					'fichier' => $local,
146
-					'http_res' => $res['length'],
147
-				],
148
-				'data' => null
149
-			]
150
-		);
151
-	}
152
-
153
-	return $local;
71
+    // si c'est la protection de soi-meme, retourner le path
72
+    if ($mode !== 'force' and preg_match(_REGEXP_COPIE_LOCALE, $source, $match)) {
73
+        $source = substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($match[1]);
74
+
75
+        return @file_exists($source) ? $source : false;
76
+    }
77
+
78
+    if (is_null($local)) {
79
+        $local = fichier_copie_locale($source);
80
+    } else {
81
+        if (_DIR_RACINE and strncmp(_DIR_RACINE, $local, strlen(_DIR_RACINE)) == 0) {
82
+            $local = substr($local, strlen(_DIR_RACINE));
83
+        }
84
+    }
85
+
86
+    // si $local = '' c'est un fichier refuse par fichier_copie_locale(),
87
+    // par exemple un fichier qui ne figure pas dans nos documents ;
88
+    // dans ce cas on n'essaie pas de le telecharger pour ensuite echouer
89
+    if (!$local) {
90
+        return false;
91
+    }
92
+
93
+    $localrac = _DIR_RACINE . $local;
94
+    $t = ($mode === 'force') ? false : @file_exists($localrac);
95
+
96
+    // test d'existence du fichier
97
+    if ($mode === 'test') {
98
+        return $t ? $local : '';
99
+    }
100
+
101
+    // sinon voir si on doit/peut le telecharger
102
+    if ($local === $source or !tester_url_absolue($source)) {
103
+        return $local;
104
+    }
105
+
106
+    if ($mode === 'modif' or !$t) {
107
+        // passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation
108
+        // et des eventuelles recuperations concurantes
109
+        include_spip('inc/acces');
110
+        if (!$taille_max) {
111
+            $taille_max = _COPIE_LOCALE_MAX_SIZE;
112
+        }
113
+        $res = recuperer_url(
114
+            $source,
115
+            ['file' => $localrac, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : '']
116
+        );
117
+        if (!$res or (!$res['length'] and $res['status'] != 304)) {
118
+            spip_log("copie_locale : Echec recuperation $source sur $localrac status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE);
119
+        }
120
+        else {
121
+            spip_log("copie_locale : recuperation $source sur $localrac OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant');
122
+        }
123
+        if (!$res or !$res['length']) {
124
+            // si $t c'est sans doute juste un not-modified-since
125
+            return $t ? $local : false;
126
+        }
127
+
128
+        // si on retrouve l'extension
129
+        if (
130
+            !empty($res['headers'])
131
+            and $extension = distant_trouver_extension_selon_headers($source, $res['headers'])
132
+        ) {
133
+            if ($sanitizer = charger_fonction($extension, 'sanitizer', true)) {
134
+                $sanitizer($localrac);
135
+            }
136
+        }
137
+
138
+        // pour une eventuelle indexation
139
+        pipeline(
140
+            'post_edition',
141
+            [
142
+                'args' => [
143
+                    'operation' => 'copie_locale',
144
+                    'source' => $source,
145
+                    'fichier' => $local,
146
+                    'http_res' => $res['length'],
147
+                ],
148
+                'data' => null
149
+            ]
150
+        );
151
+    }
152
+
153
+    return $local;
154 154
 }
155 155
 
156 156
 /**
@@ -165,99 +165,99 @@  discard block
 block discarded – undo
165 165
  *   url ou false en cas d'echec
166 166
  */
167 167
 function valider_url_distante($url, $known_hosts = []) {
168
-	if (!function_exists('protocole_verifier')) {
169
-		include_spip('inc/filtres_mini');
170
-	}
171
-
172
-	if (!protocole_verifier($url, ['http', 'https'])) {
173
-		return false;
174
-	}
175
-
176
-	$parsed_url = parse_url($url);
177
-	if (!$parsed_url or empty($parsed_url['host'])) {
178
-		return false;
179
-	}
180
-
181
-	if (isset($parsed_url['user']) or isset($parsed_url['pass'])) {
182
-		return false;
183
-	}
184
-
185
-	if (false !== strpbrk($parsed_url['host'], ':#?[]')) {
186
-		return false;
187
-	}
188
-
189
-	if (!is_array($known_hosts)) {
190
-		$known_hosts = [$known_hosts];
191
-	}
192
-	$known_hosts[] = $GLOBALS['meta']['adresse_site'];
193
-	$known_hosts[] = url_de_base();
194
-	$known_hosts = pipeline('declarer_hosts_distants', $known_hosts);
195
-
196
-	$is_known_host = false;
197
-	foreach ($known_hosts as $known_host) {
198
-		$parse_known = parse_url($known_host);
199
-		if (
200
-			$parse_known
201
-			and strtolower($parse_known['host']) === strtolower($parsed_url['host'])
202
-		) {
203
-			$is_known_host = true;
204
-			break;
205
-		}
206
-	}
207
-
208
-	if (!$is_known_host) {
209
-		$host = trim($parsed_url['host'], '.');
210
-		if (! $ip = filter_var($host, FILTER_VALIDATE_IP)) {
211
-			$ip = gethostbyname($host);
212
-			if ($ip === $host) {
213
-				// Error condition for gethostbyname()
214
-				$ip = false;
215
-			}
216
-			if ($records = dns_get_record($host)) {
217
-				foreach ($records as $record) {
218
-					// il faut que le TTL soit suffisant afin d'etre certain que le copie_locale eventuel qui suit
219
-					// se fasse sur la meme IP
220
-					if ($record['ttl'] < 10) {
221
-						$ip = false;
222
-						break;
223
-					}
224
-				}
225
-			}
226
-			else {
227
-				$ip = false;
228
-			}
229
-		}
230
-		if ($ip) {
231
-			if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
232
-				return false;
233
-			}
234
-		}
235
-	}
236
-
237
-	if (empty($parsed_url['port'])) {
238
-		return $url;
239
-	}
240
-
241
-	$port = $parsed_url['port'];
242
-	if ($port === 80  or $port === 443  or $port === 8080) {
243
-		return $url;
244
-	}
245
-
246
-	if ($is_known_host) {
247
-		foreach ($known_hosts as $known_host) {
248
-			$parse_known = parse_url($known_host);
249
-			if (
250
-				$parse_known
251
-				and !empty($parse_known['port'])
252
-				and strtolower($parse_known['host']) === strtolower($parsed_url['host'])
253
-				and $parse_known['port'] == $port
254
-			) {
255
-				return $url;
256
-			}
257
-		}
258
-	}
259
-
260
-	return false;
168
+    if (!function_exists('protocole_verifier')) {
169
+        include_spip('inc/filtres_mini');
170
+    }
171
+
172
+    if (!protocole_verifier($url, ['http', 'https'])) {
173
+        return false;
174
+    }
175
+
176
+    $parsed_url = parse_url($url);
177
+    if (!$parsed_url or empty($parsed_url['host'])) {
178
+        return false;
179
+    }
180
+
181
+    if (isset($parsed_url['user']) or isset($parsed_url['pass'])) {
182
+        return false;
183
+    }
184
+
185
+    if (false !== strpbrk($parsed_url['host'], ':#?[]')) {
186
+        return false;
187
+    }
188
+
189
+    if (!is_array($known_hosts)) {
190
+        $known_hosts = [$known_hosts];
191
+    }
192
+    $known_hosts[] = $GLOBALS['meta']['adresse_site'];
193
+    $known_hosts[] = url_de_base();
194
+    $known_hosts = pipeline('declarer_hosts_distants', $known_hosts);
195
+
196
+    $is_known_host = false;
197
+    foreach ($known_hosts as $known_host) {
198
+        $parse_known = parse_url($known_host);
199
+        if (
200
+            $parse_known
201
+            and strtolower($parse_known['host']) === strtolower($parsed_url['host'])
202
+        ) {
203
+            $is_known_host = true;
204
+            break;
205
+        }
206
+    }
207
+
208
+    if (!$is_known_host) {
209
+        $host = trim($parsed_url['host'], '.');
210
+        if (! $ip = filter_var($host, FILTER_VALIDATE_IP)) {
211
+            $ip = gethostbyname($host);
212
+            if ($ip === $host) {
213
+                // Error condition for gethostbyname()
214
+                $ip = false;
215
+            }
216
+            if ($records = dns_get_record($host)) {
217
+                foreach ($records as $record) {
218
+                    // il faut que le TTL soit suffisant afin d'etre certain que le copie_locale eventuel qui suit
219
+                    // se fasse sur la meme IP
220
+                    if ($record['ttl'] < 10) {
221
+                        $ip = false;
222
+                        break;
223
+                    }
224
+                }
225
+            }
226
+            else {
227
+                $ip = false;
228
+            }
229
+        }
230
+        if ($ip) {
231
+            if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
232
+                return false;
233
+            }
234
+        }
235
+    }
236
+
237
+    if (empty($parsed_url['port'])) {
238
+        return $url;
239
+    }
240
+
241
+    $port = $parsed_url['port'];
242
+    if ($port === 80  or $port === 443  or $port === 8080) {
243
+        return $url;
244
+    }
245
+
246
+    if ($is_known_host) {
247
+        foreach ($known_hosts as $known_host) {
248
+            $parse_known = parse_url($known_host);
249
+            if (
250
+                $parse_known
251
+                and !empty($parse_known['port'])
252
+                and strtolower($parse_known['host']) === strtolower($parsed_url['host'])
253
+                and $parse_known['port'] == $port
254
+            ) {
255
+                return $url;
256
+            }
257
+        }
258
+    }
259
+
260
+    return false;
261 261
 }
262 262
 
263 263
 /**
@@ -277,86 +277,86 @@  discard block
 block discarded – undo
277 277
  */
278 278
 function prepare_donnees_post($donnees, $boundary = '') {
279 279
 
280
-	// permettre a la fonction qui a demande le post de formater elle meme ses donnees
281
-	// pour un appel soap par exemple
282
-	// l'entete est separe des donnees par un double retour a la ligne
283
-	// on s'occupe ici de passer tous les retours lignes (\r\n, \r ou \n) en \r\n
284
-	if (is_string($donnees) && strlen($donnees)) {
285
-		$entete = '';
286
-		// on repasse tous les \r\n et \r en simples \n
287
-		$donnees = str_replace("\r\n", "\n", $donnees);
288
-		$donnees = str_replace("\r", "\n", $donnees);
289
-		// un double retour a la ligne signifie la fin de l'entete et le debut des donnees
290
-		$p = strpos($donnees, "\n\n");
291
-		if ($p !== false) {
292
-			$entete = str_replace("\n", "\r\n", substr($donnees, 0, $p + 1));
293
-			$donnees = substr($donnees, $p + 2);
294
-		}
295
-		$chaine = str_replace("\n", "\r\n", $donnees);
296
-	} else {
297
-		/* boundary automatique */
298
-		// Si on a plus de 500 octects de donnees, on "boundarise"
299
-		if ($boundary === '') {
300
-			$taille = 0;
301
-			foreach ($donnees as $cle => $valeur) {
302
-				if (is_array($valeur)) {
303
-					foreach ($valeur as $val2) {
304
-						$taille += strlen($val2);
305
-					}
306
-				} else {
307
-					// faut-il utiliser spip_strlen() dans inc/charsets ?
308
-					$taille += strlen($valeur);
309
-				}
310
-			}
311
-			if ($taille > 500) {
312
-				$boundary = substr(md5(random_int(0, mt_getrandmax()) . 'spip'), 0, 8);
313
-			}
314
-		}
315
-
316
-		if (is_string($boundary) and strlen($boundary)) {
317
-			// fabrique une chaine HTTP pour un POST avec boundary
318
-			$entete = "Content-Type: multipart/form-data; boundary=$boundary\r\n";
319
-			$chaine = '';
320
-			if (is_array($donnees)) {
321
-				foreach ($donnees as $cle => $valeur) {
322
-					if (is_array($valeur)) {
323
-						foreach ($valeur as $val2) {
324
-							$chaine .= "\r\n--$boundary\r\n";
325
-							$chaine .= "Content-Disposition: form-data; name=\"{$cle}[]\"\r\n";
326
-							$chaine .= "\r\n";
327
-							$chaine .= $val2;
328
-						}
329
-					} else {
330
-						$chaine .= "\r\n--$boundary\r\n";
331
-						$chaine .= "Content-Disposition: form-data; name=\"$cle\"\r\n";
332
-						$chaine .= "\r\n";
333
-						$chaine .= $valeur;
334
-					}
335
-				}
336
-				$chaine .= "\r\n--$boundary\r\n";
337
-			}
338
-		} else {
339
-			// fabrique une chaine HTTP simple pour un POST
340
-			$entete = 'Content-Type: application/x-www-form-urlencoded' . "\r\n";
341
-			$chaine = [];
342
-			if (is_array($donnees)) {
343
-				foreach ($donnees as $cle => $valeur) {
344
-					if (is_array($valeur)) {
345
-						foreach ($valeur as $val2) {
346
-							$chaine[] = rawurlencode($cle) . '[]=' . rawurlencode($val2);
347
-						}
348
-					} else {
349
-						$chaine[] = rawurlencode($cle) . '=' . rawurlencode($valeur);
350
-					}
351
-				}
352
-				$chaine = implode('&', $chaine);
353
-			} else {
354
-				$chaine = $donnees;
355
-			}
356
-		}
357
-	}
358
-
359
-	return [$entete, $chaine];
280
+    // permettre a la fonction qui a demande le post de formater elle meme ses donnees
281
+    // pour un appel soap par exemple
282
+    // l'entete est separe des donnees par un double retour a la ligne
283
+    // on s'occupe ici de passer tous les retours lignes (\r\n, \r ou \n) en \r\n
284
+    if (is_string($donnees) && strlen($donnees)) {
285
+        $entete = '';
286
+        // on repasse tous les \r\n et \r en simples \n
287
+        $donnees = str_replace("\r\n", "\n", $donnees);
288
+        $donnees = str_replace("\r", "\n", $donnees);
289
+        // un double retour a la ligne signifie la fin de l'entete et le debut des donnees
290
+        $p = strpos($donnees, "\n\n");
291
+        if ($p !== false) {
292
+            $entete = str_replace("\n", "\r\n", substr($donnees, 0, $p + 1));
293
+            $donnees = substr($donnees, $p + 2);
294
+        }
295
+        $chaine = str_replace("\n", "\r\n", $donnees);
296
+    } else {
297
+        /* boundary automatique */
298
+        // Si on a plus de 500 octects de donnees, on "boundarise"
299
+        if ($boundary === '') {
300
+            $taille = 0;
301
+            foreach ($donnees as $cle => $valeur) {
302
+                if (is_array($valeur)) {
303
+                    foreach ($valeur as $val2) {
304
+                        $taille += strlen($val2);
305
+                    }
306
+                } else {
307
+                    // faut-il utiliser spip_strlen() dans inc/charsets ?
308
+                    $taille += strlen($valeur);
309
+                }
310
+            }
311
+            if ($taille > 500) {
312
+                $boundary = substr(md5(random_int(0, mt_getrandmax()) . 'spip'), 0, 8);
313
+            }
314
+        }
315
+
316
+        if (is_string($boundary) and strlen($boundary)) {
317
+            // fabrique une chaine HTTP pour un POST avec boundary
318
+            $entete = "Content-Type: multipart/form-data; boundary=$boundary\r\n";
319
+            $chaine = '';
320
+            if (is_array($donnees)) {
321
+                foreach ($donnees as $cle => $valeur) {
322
+                    if (is_array($valeur)) {
323
+                        foreach ($valeur as $val2) {
324
+                            $chaine .= "\r\n--$boundary\r\n";
325
+                            $chaine .= "Content-Disposition: form-data; name=\"{$cle}[]\"\r\n";
326
+                            $chaine .= "\r\n";
327
+                            $chaine .= $val2;
328
+                        }
329
+                    } else {
330
+                        $chaine .= "\r\n--$boundary\r\n";
331
+                        $chaine .= "Content-Disposition: form-data; name=\"$cle\"\r\n";
332
+                        $chaine .= "\r\n";
333
+                        $chaine .= $valeur;
334
+                    }
335
+                }
336
+                $chaine .= "\r\n--$boundary\r\n";
337
+            }
338
+        } else {
339
+            // fabrique une chaine HTTP simple pour un POST
340
+            $entete = 'Content-Type: application/x-www-form-urlencoded' . "\r\n";
341
+            $chaine = [];
342
+            if (is_array($donnees)) {
343
+                foreach ($donnees as $cle => $valeur) {
344
+                    if (is_array($valeur)) {
345
+                        foreach ($valeur as $val2) {
346
+                            $chaine[] = rawurlencode($cle) . '[]=' . rawurlencode($val2);
347
+                        }
348
+                    } else {
349
+                        $chaine[] = rawurlencode($cle) . '=' . rawurlencode($valeur);
350
+                    }
351
+                }
352
+                $chaine = implode('&', $chaine);
353
+            } else {
354
+                $chaine = $donnees;
355
+            }
356
+        }
357
+    }
358
+
359
+    return [$entete, $chaine];
360 360
 }
361 361
 
362 362
 /**
@@ -370,20 +370,20 @@  discard block
 block discarded – undo
370 370
  */
371 371
 function url_to_ascii($url_idn) {
372 372
 
373
-	if ($parts = parse_url($url_idn)) {
374
-		$host = $parts['host'];
375
-		if (!preg_match(',^[a-z0-9_\.\-]+$,i', $host)) {
376
-			include_spip('inc/idna_convert.class');
377
-			$IDN = new idna_convert();
378
-			$host_ascii = $IDN->encode($host);
379
-			$url_idn = explode($host, $url_idn, 2);
380
-			$url_idn = implode($host_ascii, $url_idn);
381
-		}
382
-		// et on urlencode les char utf si besoin dans le path
383
-		$url_idn = preg_replace_callback('/[^\x20-\x7f]/', fn($match) => urlencode($match[0]), $url_idn);
384
-	}
385
-
386
-	return $url_idn;
373
+    if ($parts = parse_url($url_idn)) {
374
+        $host = $parts['host'];
375
+        if (!preg_match(',^[a-z0-9_\.\-]+$,i', $host)) {
376
+            include_spip('inc/idna_convert.class');
377
+            $IDN = new idna_convert();
378
+            $host_ascii = $IDN->encode($host);
379
+            $url_idn = explode($host, $url_idn, 2);
380
+            $url_idn = implode($host_ascii, $url_idn);
381
+        }
382
+        // et on urlencode les char utf si besoin dans le path
383
+        $url_idn = preg_replace_callback('/[^\x20-\x7f]/', fn($match) => urlencode($match[0]), $url_idn);
384
+    }
385
+
386
+    return $url_idn;
387 387
 }
388 388
 
389 389
 /**
@@ -424,209 +424,209 @@  discard block
 block discarded – undo
424 424
  *     string file : nom du fichier si enregistre dans un fichier
425 425
  */
426 426
 function recuperer_url($url, $options = []) {
427
-	// Conserve la mémoire de la méthode fournit éventuellement
428
-	$methode_demandee = $options['methode'] ?? '';
429
-	$default = [
430
-		'transcoder' => false,
431
-		'methode' => 'GET',
432
-		'taille_max' => null,
433
-		'headers' => [],
434
-		'datas' => '',
435
-		'boundary' => '',
436
-		'refuser_gz' => false,
437
-		'if_modified_since' => '',
438
-		'uri_referer' => '',
439
-		'file' => '',
440
-		'follow_location' => 10,
441
-		'version_http' => _INC_DISTANT_VERSION_HTTP,
442
-	];
443
-	$options = array_merge($default, $options);
444
-	// copier directement dans un fichier ?
445
-	$copy = $options['file'];
446
-
447
-	if ($options['methode'] == 'HEAD') {
448
-		$options['taille_max'] = 0;
449
-	}
450
-	if (is_null($options['taille_max'])) {
451
-		$options['taille_max'] = $copy ? _COPIE_LOCALE_MAX_SIZE : _INC_DISTANT_MAX_SIZE;
452
-	}
453
-
454
-	spip_log("recuperer_url " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG);
455
-
456
-	// Ajout des en-têtes spécifiques si besoin
457
-	$formatted_data = '';
458
-	if (!empty($options['headers'])) {
459
-		foreach ($options['headers'] as $champ => $valeur) {
460
-			$formatted_data .= $champ . ': ' . $valeur . "\r\n";
461
-		}
462
-	}
463
-
464
-	if (!empty($options['datas'])) {
465
-		[$head, $postdata] = prepare_donnees_post($options['datas'], $options['boundary']);
466
-		$head .= $formatted_data;
467
-		if (stripos($head, 'Content-Length:') === false) {
468
-			$head .= 'Content-Length: ' . strlen($postdata) . "\r\n";
469
-		}
470
-		$formatted_data = $head . "\r\n" . $postdata;
471
-		if (
472
-			strlen($postdata)
473
-			and !$methode_demandee
474
-		) {
475
-			$options['methode'] = 'POST';
476
-		}
477
-	} elseif ($formatted_data) {
478
-		$formatted_data .= "\r\n";
479
-	}
480
-
481
-	// Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole
482
-	$url = preg_replace(',^feed://,i', 'http://', $url);
483
-	if (!tester_url_absolue($url)) {
484
-		$url = 'http://' . $url;
485
-	} elseif (strncmp($url, '//', 2) == 0) {
486
-		$url = 'http:' . $url;
487
-	}
488
-
489
-	$url = url_to_ascii($url);
490
-
491
-	$result = [
492
-		'status' => 0,
493
-		'headers' => '',
494
-		'page' => '',
495
-		'length' => 0,
496
-		'last_modified' => '',
497
-		'location' => '',
498
-		'url' => $url
499
-	];
500
-
501
-	// si on ecrit directement dans un fichier, pour ne pas manipuler en memoire refuser gz
502
-	$refuser_gz = (($options['refuser_gz'] or $copy) ? true : false);
503
-
504
-	// ouvrir la connexion et envoyer la requete et ses en-tetes
505
-	[$handle, $fopen] = init_http(
506
-		$options['methode'],
507
-		$url,
508
-		$refuser_gz,
509
-		$options['uri_referer'],
510
-		$formatted_data,
511
-		$options['version_http'],
512
-		$options['if_modified_since']
513
-	);
514
-	if (!$handle) {
515
-		spip_log("ECHEC init_http $url", 'distant' . _LOG_ERREUR);
516
-
517
-		return false;
518
-	}
519
-
520
-	// Sauf en fopen, envoyer le flux d'entree
521
-	// et recuperer les en-tetes de reponses
522
-	if (!$fopen) {
523
-		$res = recuperer_entetes_complets($handle, $options['if_modified_since']);
524
-		if (!$res) {
525
-			fclose($handle);
526
-			$t = @parse_url($url);
527
-			$host = $t['host'];
528
-			// Chinoisierie inexplicable pour contrer
529
-			// les actions liberticides de l'empire du milieu
530
-			if (
531
-				!need_proxy($host)
532
-				and $res = @file_get_contents($url)
533
-			) {
534
-				$result['length'] = strlen($res);
535
-				if ($copy) {
536
-					ecrire_fichier($copy, $res);
537
-					$result['file'] = $copy;
538
-				} else {
539
-					$result['page'] = $res;
540
-				}
541
-				$res = [
542
-					'status' => 200,
543
-				];
544
-			} else {
545
-				spip_log("ECHEC chinoiserie $url", 'distant' . _LOG_ERREUR);
546
-				return false;
547
-			}
548
-		} elseif ($res['location'] and $options['follow_location']) {
549
-			$options['follow_location']--;
550
-			fclose($handle);
551
-			include_spip('inc/filtres');
552
-			$url = suivre_lien($url, $res['location']);
553
-
554
-			// une redirection doit se faire en GET, sauf status explicite 307 ou 308 qui indique de garder la meme methode
555
-			if ($options['methode'] !== 'GET') {
556
-				if (empty($res['status']) or !in_array($res['status'], [307, 308])) {
557
-					$options['methode'] = 'GET';
558
-					$options['datas'] = '';
559
-				}
560
-			}
561
-			spip_log("recuperer_url recommence " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG);
562
-
563
-			return recuperer_url($url, $options);
564
-		} elseif ($res['status'] !== 200) {
565
-			spip_log('HTTP status ' . $res['status'] . " pour $url", 'distant');
566
-		}
567
-		$result['status'] = $res['status'];
568
-		if (isset($res['headers'])) {
569
-			$result['headers'] = $res['headers'];
570
-		}
571
-		if (isset($res['last_modified'])) {
572
-			$result['last_modified'] = $res['last_modified'];
573
-		}
574
-		if (isset($res['location'])) {
575
-			$result['location'] = $res['location'];
576
-		}
577
-	}
578
-
579
-	// on ne veut que les entetes
580
-	if (!$options['taille_max'] or $options['methode'] == 'HEAD' or $result['status'] == '304') {
581
-		spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($result), 'distant' . _LOG_DEBUG);
582
-		return $result;
583
-	}
584
-
585
-
586
-	// s'il faut deballer, le faire via un fichier temporaire
587
-	// sinon la memoire explose pour les gros flux
588
-
589
-	$gz = false;
590
-	if (preg_match(",\bContent-Encoding: .*gzip,is", $result['headers'])) {
591
-		$gz = (_DIR_TMP . md5(uniqid(random_int(0, mt_getrandmax()))) . '.tmp.gz');
592
-	}
593
-
594
-	// si on a pas deja recuperer le contenu par une methode detournee
595
-	if (!$result['length']) {
596
-		$res = recuperer_body($handle, $options['taille_max'], $gz ?: $copy);
597
-		fclose($handle);
598
-		if ($copy) {
599
-			$result['length'] = $res;
600
-			$result['file'] = $copy;
601
-		} elseif ($res) {
602
-			$result['page'] = &$res;
603
-			$result['length'] = strlen($result['page']);
604
-		}
605
-		if (!$result['status']) {
606
-			$result['status'] = 200; // on a reussi, donc !
607
-		}
608
-	}
609
-	if (!$result['page']) {
610
-		return $result;
611
-	}
612
-
613
-	// Decompresser au besoin
614
-	if ($gz) {
615
-		$result['page'] = implode('', gzfile($gz));
616
-		supprimer_fichier($gz);
617
-	}
618
-
619
-	// Faut-il l'importer dans notre charset local ?
620
-	if ($options['transcoder']) {
621
-		include_spip('inc/charsets');
622
-		$result['page'] = transcoder_page($result['page'], $result['headers']);
623
-	}
624
-
625
-	$trace = json_decode(json_encode($result), true);
626
-	$trace['page'] = '...';
627
-	spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($trace), 'distant' . _LOG_DEBUG);
628
-
629
-	return $result;
427
+    // Conserve la mémoire de la méthode fournit éventuellement
428
+    $methode_demandee = $options['methode'] ?? '';
429
+    $default = [
430
+        'transcoder' => false,
431
+        'methode' => 'GET',
432
+        'taille_max' => null,
433
+        'headers' => [],
434
+        'datas' => '',
435
+        'boundary' => '',
436
+        'refuser_gz' => false,
437
+        'if_modified_since' => '',
438
+        'uri_referer' => '',
439
+        'file' => '',
440
+        'follow_location' => 10,
441
+        'version_http' => _INC_DISTANT_VERSION_HTTP,
442
+    ];
443
+    $options = array_merge($default, $options);
444
+    // copier directement dans un fichier ?
445
+    $copy = $options['file'];
446
+
447
+    if ($options['methode'] == 'HEAD') {
448
+        $options['taille_max'] = 0;
449
+    }
450
+    if (is_null($options['taille_max'])) {
451
+        $options['taille_max'] = $copy ? _COPIE_LOCALE_MAX_SIZE : _INC_DISTANT_MAX_SIZE;
452
+    }
453
+
454
+    spip_log("recuperer_url " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG);
455
+
456
+    // Ajout des en-têtes spécifiques si besoin
457
+    $formatted_data = '';
458
+    if (!empty($options['headers'])) {
459
+        foreach ($options['headers'] as $champ => $valeur) {
460
+            $formatted_data .= $champ . ': ' . $valeur . "\r\n";
461
+        }
462
+    }
463
+
464
+    if (!empty($options['datas'])) {
465
+        [$head, $postdata] = prepare_donnees_post($options['datas'], $options['boundary']);
466
+        $head .= $formatted_data;
467
+        if (stripos($head, 'Content-Length:') === false) {
468
+            $head .= 'Content-Length: ' . strlen($postdata) . "\r\n";
469
+        }
470
+        $formatted_data = $head . "\r\n" . $postdata;
471
+        if (
472
+            strlen($postdata)
473
+            and !$methode_demandee
474
+        ) {
475
+            $options['methode'] = 'POST';
476
+        }
477
+    } elseif ($formatted_data) {
478
+        $formatted_data .= "\r\n";
479
+    }
480
+
481
+    // Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole
482
+    $url = preg_replace(',^feed://,i', 'http://', $url);
483
+    if (!tester_url_absolue($url)) {
484
+        $url = 'http://' . $url;
485
+    } elseif (strncmp($url, '//', 2) == 0) {
486
+        $url = 'http:' . $url;
487
+    }
488
+
489
+    $url = url_to_ascii($url);
490
+
491
+    $result = [
492
+        'status' => 0,
493
+        'headers' => '',
494
+        'page' => '',
495
+        'length' => 0,
496
+        'last_modified' => '',
497
+        'location' => '',
498
+        'url' => $url
499
+    ];
500
+
501
+    // si on ecrit directement dans un fichier, pour ne pas manipuler en memoire refuser gz
502
+    $refuser_gz = (($options['refuser_gz'] or $copy) ? true : false);
503
+
504
+    // ouvrir la connexion et envoyer la requete et ses en-tetes
505
+    [$handle, $fopen] = init_http(
506
+        $options['methode'],
507
+        $url,
508
+        $refuser_gz,
509
+        $options['uri_referer'],
510
+        $formatted_data,
511
+        $options['version_http'],
512
+        $options['if_modified_since']
513
+    );
514
+    if (!$handle) {
515
+        spip_log("ECHEC init_http $url", 'distant' . _LOG_ERREUR);
516
+
517
+        return false;
518
+    }
519
+
520
+    // Sauf en fopen, envoyer le flux d'entree
521
+    // et recuperer les en-tetes de reponses
522
+    if (!$fopen) {
523
+        $res = recuperer_entetes_complets($handle, $options['if_modified_since']);
524
+        if (!$res) {
525
+            fclose($handle);
526
+            $t = @parse_url($url);
527
+            $host = $t['host'];
528
+            // Chinoisierie inexplicable pour contrer
529
+            // les actions liberticides de l'empire du milieu
530
+            if (
531
+                !need_proxy($host)
532
+                and $res = @file_get_contents($url)
533
+            ) {
534
+                $result['length'] = strlen($res);
535
+                if ($copy) {
536
+                    ecrire_fichier($copy, $res);
537
+                    $result['file'] = $copy;
538
+                } else {
539
+                    $result['page'] = $res;
540
+                }
541
+                $res = [
542
+                    'status' => 200,
543
+                ];
544
+            } else {
545
+                spip_log("ECHEC chinoiserie $url", 'distant' . _LOG_ERREUR);
546
+                return false;
547
+            }
548
+        } elseif ($res['location'] and $options['follow_location']) {
549
+            $options['follow_location']--;
550
+            fclose($handle);
551
+            include_spip('inc/filtres');
552
+            $url = suivre_lien($url, $res['location']);
553
+
554
+            // une redirection doit se faire en GET, sauf status explicite 307 ou 308 qui indique de garder la meme methode
555
+            if ($options['methode'] !== 'GET') {
556
+                if (empty($res['status']) or !in_array($res['status'], [307, 308])) {
557
+                    $options['methode'] = 'GET';
558
+                    $options['datas'] = '';
559
+                }
560
+            }
561
+            spip_log("recuperer_url recommence " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG);
562
+
563
+            return recuperer_url($url, $options);
564
+        } elseif ($res['status'] !== 200) {
565
+            spip_log('HTTP status ' . $res['status'] . " pour $url", 'distant');
566
+        }
567
+        $result['status'] = $res['status'];
568
+        if (isset($res['headers'])) {
569
+            $result['headers'] = $res['headers'];
570
+        }
571
+        if (isset($res['last_modified'])) {
572
+            $result['last_modified'] = $res['last_modified'];
573
+        }
574
+        if (isset($res['location'])) {
575
+            $result['location'] = $res['location'];
576
+        }
577
+    }
578
+
579
+    // on ne veut que les entetes
580
+    if (!$options['taille_max'] or $options['methode'] == 'HEAD' or $result['status'] == '304') {
581
+        spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($result), 'distant' . _LOG_DEBUG);
582
+        return $result;
583
+    }
584
+
585
+
586
+    // s'il faut deballer, le faire via un fichier temporaire
587
+    // sinon la memoire explose pour les gros flux
588
+
589
+    $gz = false;
590
+    if (preg_match(",\bContent-Encoding: .*gzip,is", $result['headers'])) {
591
+        $gz = (_DIR_TMP . md5(uniqid(random_int(0, mt_getrandmax()))) . '.tmp.gz');
592
+    }
593
+
594
+    // si on a pas deja recuperer le contenu par une methode detournee
595
+    if (!$result['length']) {
596
+        $res = recuperer_body($handle, $options['taille_max'], $gz ?: $copy);
597
+        fclose($handle);
598
+        if ($copy) {
599
+            $result['length'] = $res;
600
+            $result['file'] = $copy;
601
+        } elseif ($res) {
602
+            $result['page'] = &$res;
603
+            $result['length'] = strlen($result['page']);
604
+        }
605
+        if (!$result['status']) {
606
+            $result['status'] = 200; // on a reussi, donc !
607
+        }
608
+    }
609
+    if (!$result['page']) {
610
+        return $result;
611
+    }
612
+
613
+    // Decompresser au besoin
614
+    if ($gz) {
615
+        $result['page'] = implode('', gzfile($gz));
616
+        supprimer_fichier($gz);
617
+    }
618
+
619
+    // Faut-il l'importer dans notre charset local ?
620
+    if ($options['transcoder']) {
621
+        include_spip('inc/charsets');
622
+        $result['page'] = transcoder_page($result['page'], $result['headers']);
623
+    }
624
+
625
+    $trace = json_decode(json_encode($result), true);
626
+    $trace['page'] = '...';
627
+    spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($trace), 'distant' . _LOG_DEBUG);
628
+
629
+    return $result;
630 630
 }
631 631
 
632 632
 /**
@@ -642,73 +642,73 @@  discard block
 block discarded – undo
642 642
  * @return array|bool|mixed
643 643
  */
644 644
 function recuperer_url_cache($url, $options = []) {
645
-	if (!defined('_DELAI_RECUPERER_URL_CACHE')) {
646
-		define('_DELAI_RECUPERER_URL_CACHE', 3600);
647
-	}
648
-	$default = [
649
-		'transcoder' => false,
650
-		'methode' => 'GET',
651
-		'taille_max' => null,
652
-		'datas' => '',
653
-		'boundary' => '',
654
-		'refuser_gz' => false,
655
-		'if_modified_since' => '',
656
-		'uri_referer' => '',
657
-		'file' => '',
658
-		'follow_location' => 10,
659
-		'version_http' => _INC_DISTANT_VERSION_HTTP,
660
-		'delai_cache' => in_array(_VAR_MODE, ['preview', 'recalcul']) ? 0 : _DELAI_RECUPERER_URL_CACHE,
661
-	];
662
-	$options = array_merge($default, $options);
663
-
664
-	// cas ou il n'est pas possible de cacher
665
-	if (!empty($options['data']) or $options['methode'] == 'POST') {
666
-		return recuperer_url($url, $options);
667
-	}
668
-
669
-	// ne pas tenter plusieurs fois la meme url en erreur (non cachee donc)
670
-	static $errors = [];
671
-	if (isset($errors[$url])) {
672
-		return $errors[$url];
673
-	}
674
-
675
-	$sig = $options;
676
-	unset($sig['if_modified_since']);
677
-	unset($sig['delai_cache']);
678
-	$sig['url'] = $url;
679
-
680
-	$dir = sous_repertoire(_DIR_CACHE, 'curl');
681
-	$cache = md5(serialize($sig)) . '-' . substr(preg_replace(',\W+,', '_', $url), 0, 80);
682
-	$sub = sous_repertoire($dir, substr($cache, 0, 2));
683
-	$cache = "$sub$cache";
684
-
685
-	$res = false;
686
-	$is_cached = file_exists($cache);
687
-	if (
688
-		$is_cached
689
-		and (filemtime($cache) > $_SERVER['REQUEST_TIME'] - $options['delai_cache'])
690
-	) {
691
-		lire_fichier($cache, $res);
692
-		if ($res = unserialize($res)) {
693
-			// mettre le last_modified et le status=304 ?
694
-		}
695
-	}
696
-	if (!$res) {
697
-		$res = recuperer_url($url, $options);
698
-		// ne pas recharger cette url non cachee dans le meme hit puisque non disponible
699
-		if (!$res) {
700
-			if ($is_cached) {
701
-				// on a pas reussi a recuperer mais on avait un cache : l'utiliser
702
-				lire_fichier($cache, $res);
703
-				$res = unserialize($res);
704
-			}
705
-
706
-			return $errors[$url] = $res;
707
-		}
708
-		ecrire_fichier($cache, serialize($res));
709
-	}
710
-
711
-	return $res;
645
+    if (!defined('_DELAI_RECUPERER_URL_CACHE')) {
646
+        define('_DELAI_RECUPERER_URL_CACHE', 3600);
647
+    }
648
+    $default = [
649
+        'transcoder' => false,
650
+        'methode' => 'GET',
651
+        'taille_max' => null,
652
+        'datas' => '',
653
+        'boundary' => '',
654
+        'refuser_gz' => false,
655
+        'if_modified_since' => '',
656
+        'uri_referer' => '',
657
+        'file' => '',
658
+        'follow_location' => 10,
659
+        'version_http' => _INC_DISTANT_VERSION_HTTP,
660
+        'delai_cache' => in_array(_VAR_MODE, ['preview', 'recalcul']) ? 0 : _DELAI_RECUPERER_URL_CACHE,
661
+    ];
662
+    $options = array_merge($default, $options);
663
+
664
+    // cas ou il n'est pas possible de cacher
665
+    if (!empty($options['data']) or $options['methode'] == 'POST') {
666
+        return recuperer_url($url, $options);
667
+    }
668
+
669
+    // ne pas tenter plusieurs fois la meme url en erreur (non cachee donc)
670
+    static $errors = [];
671
+    if (isset($errors[$url])) {
672
+        return $errors[$url];
673
+    }
674
+
675
+    $sig = $options;
676
+    unset($sig['if_modified_since']);
677
+    unset($sig['delai_cache']);
678
+    $sig['url'] = $url;
679
+
680
+    $dir = sous_repertoire(_DIR_CACHE, 'curl');
681
+    $cache = md5(serialize($sig)) . '-' . substr(preg_replace(',\W+,', '_', $url), 0, 80);
682
+    $sub = sous_repertoire($dir, substr($cache, 0, 2));
683
+    $cache = "$sub$cache";
684
+
685
+    $res = false;
686
+    $is_cached = file_exists($cache);
687
+    if (
688
+        $is_cached
689
+        and (filemtime($cache) > $_SERVER['REQUEST_TIME'] - $options['delai_cache'])
690
+    ) {
691
+        lire_fichier($cache, $res);
692
+        if ($res = unserialize($res)) {
693
+            // mettre le last_modified et le status=304 ?
694
+        }
695
+    }
696
+    if (!$res) {
697
+        $res = recuperer_url($url, $options);
698
+        // ne pas recharger cette url non cachee dans le meme hit puisque non disponible
699
+        if (!$res) {
700
+            if ($is_cached) {
701
+                // on a pas reussi a recuperer mais on avait un cache : l'utiliser
702
+                lire_fichier($cache, $res);
703
+                $res = unserialize($res);
704
+            }
705
+
706
+            return $errors[$url] = $res;
707
+        }
708
+        ecrire_fichier($cache, serialize($res));
709
+    }
710
+
711
+    return $res;
712 712
 }
713 713
 
714 714
 /**
@@ -726,42 +726,42 @@  discard block
 block discarded – undo
726 726
  *   string contenu de la resource
727 727
  */
728 728
 function recuperer_body($handle, $taille_max = _INC_DISTANT_MAX_SIZE, $fichier = '') {
729
-	$tmpfile = null;
730
-	$taille = 0;
731
-	$result = '';
732
-	$fp = false;
733
-	if ($fichier) {
734
-		include_spip('inc/acces');
735
-		$tmpfile = "$fichier." . creer_uniqid() . '.tmp';
736
-		$fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX);
737
-		if (!$fp and file_exists($fichier)) {
738
-			return filesize($fichier);
739
-		}
740
-		if (!$fp) {
741
-			return false;
742
-		}
743
-		$result = 0; // on renvoie la taille du fichier
744
-	}
745
-	while (!feof($handle) and $taille < $taille_max) {
746
-		$res = fread($handle, 16384);
747
-		$taille += strlen($res);
748
-		if ($fp) {
749
-			fwrite($fp, $res);
750
-			$result = $taille;
751
-		} else {
752
-			$result .= $res;
753
-		}
754
-	}
755
-	if ($fp) {
756
-		spip_fclose_unlock($fp);
757
-		spip_unlink($fichier);
758
-		@rename($tmpfile, $fichier);
759
-		if (!file_exists($fichier)) {
760
-			return false;
761
-		}
762
-	}
763
-
764
-	return $result;
729
+    $tmpfile = null;
730
+    $taille = 0;
731
+    $result = '';
732
+    $fp = false;
733
+    if ($fichier) {
734
+        include_spip('inc/acces');
735
+        $tmpfile = "$fichier." . creer_uniqid() . '.tmp';
736
+        $fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX);
737
+        if (!$fp and file_exists($fichier)) {
738
+            return filesize($fichier);
739
+        }
740
+        if (!$fp) {
741
+            return false;
742
+        }
743
+        $result = 0; // on renvoie la taille du fichier
744
+    }
745
+    while (!feof($handle) and $taille < $taille_max) {
746
+        $res = fread($handle, 16384);
747
+        $taille += strlen($res);
748
+        if ($fp) {
749
+            fwrite($fp, $res);
750
+            $result = $taille;
751
+        } else {
752
+            $result .= $res;
753
+        }
754
+    }
755
+    if ($fp) {
756
+        spip_fclose_unlock($fp);
757
+        spip_unlink($fichier);
758
+        @rename($tmpfile, $fichier);
759
+        if (!file_exists($fichier)) {
760
+            return false;
761
+        }
762
+    }
763
+
764
+    return $result;
765 765
 }
766 766
 
767 767
 /**
@@ -783,35 +783,35 @@  discard block
 block discarded – undo
783 783
  *   string location
784 784
  */
785 785
 function recuperer_entetes_complets($handle, $if_modified_since = false) {
786
-	$result = ['status' => 0, 'headers' => [], 'last_modified' => 0, 'location' => ''];
787
-
788
-	$s = @trim(fgets($handle, 16384));
789
-	if (!preg_match(',^HTTP/[0-9]+\.[0-9]+ ([0-9]+),', $s, $r)) {
790
-		return false;
791
-	}
792
-	$result['status'] = intval($r[1]);
793
-	while ($s = trim(fgets($handle, 16384))) {
794
-		$result['headers'][] = $s . "\n";
795
-		preg_match(',^([^:]*): *(.*)$,i', $s, $r);
796
-		[, $d, $v] = $r;
797
-		if (strtolower(trim($d)) == 'location' and $result['status'] >= 300 and $result['status'] < 400) {
798
-			$result['location'] = $v;
799
-		} elseif ($d == 'Last-Modified') {
800
-			$result['last_modified'] = strtotime($v);
801
-		}
802
-	}
803
-	if (
804
-		$if_modified_since
805
-		and $result['last_modified']
806
-		and $if_modified_since > $result['last_modified']
807
-		and $result['status'] == 200
808
-	) {
809
-		$result['status'] = 304;
810
-	}
811
-
812
-	$result['headers'] = implode('', $result['headers']);
813
-
814
-	return $result;
786
+    $result = ['status' => 0, 'headers' => [], 'last_modified' => 0, 'location' => ''];
787
+
788
+    $s = @trim(fgets($handle, 16384));
789
+    if (!preg_match(',^HTTP/[0-9]+\.[0-9]+ ([0-9]+),', $s, $r)) {
790
+        return false;
791
+    }
792
+    $result['status'] = intval($r[1]);
793
+    while ($s = trim(fgets($handle, 16384))) {
794
+        $result['headers'][] = $s . "\n";
795
+        preg_match(',^([^:]*): *(.*)$,i', $s, $r);
796
+        [, $d, $v] = $r;
797
+        if (strtolower(trim($d)) == 'location' and $result['status'] >= 300 and $result['status'] < 400) {
798
+            $result['location'] = $v;
799
+        } elseif ($d == 'Last-Modified') {
800
+            $result['last_modified'] = strtotime($v);
801
+        }
802
+    }
803
+    if (
804
+        $if_modified_since
805
+        and $result['last_modified']
806
+        and $if_modified_since > $result['last_modified']
807
+        and $result['status'] == 200
808
+    ) {
809
+        $result['status'] = 304;
810
+    }
811
+
812
+    $result['headers'] = implode('', $result['headers']);
813
+
814
+    return $result;
815 815
 }
816 816
 
817 817
 /**
@@ -833,22 +833,22 @@  discard block
 block discarded – undo
833 833
  *     Nom du fichier pour copie locale
834 834
  **/
835 835
 function nom_fichier_copie_locale($source, $extension) {
836
-	include_spip('inc/documents');
836
+    include_spip('inc/documents');
837 837
 
838
-	$d = creer_repertoire_documents('distant'); # IMG/distant/
839
-	$d = sous_repertoire($d, $extension); # IMG/distant/pdf/
838
+    $d = creer_repertoire_documents('distant'); # IMG/distant/
839
+    $d = sous_repertoire($d, $extension); # IMG/distant/pdf/
840 840
 
841
-	// on se place tout le temps comme si on etait a la racine
842
-	if (_DIR_RACINE) {
843
-		$d = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $d);
844
-	}
841
+    // on se place tout le temps comme si on etait a la racine
842
+    if (_DIR_RACINE) {
843
+        $d = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $d);
844
+    }
845 845
 
846
-	$m = md5($source);
846
+    $m = md5($source);
847 847
 
848
-	return $d
849
-	. substr(preg_replace(',[^\w-],', '', basename($source)) . '-' . $m, 0, 12)
850
-	. substr($m, 0, 4)
851
-	. ".$extension";
848
+    return $d
849
+    . substr(preg_replace(',[^\w-],', '', basename($source)) . '-' . $m, 0, 12)
850
+    . substr($m, 0, 4)
851
+    . ".$extension";
852 852
 }
853 853
 
854 854
 /**
@@ -866,70 +866,70 @@  discard block
 block discarded – undo
866 866
  *      Nom du fichier calculé
867 867
  **/
868 868
 function fichier_copie_locale($source) {
869
-	// Si c'est deja local pas de souci
870
-	if (!tester_url_absolue($source)) {
871
-		if (_DIR_RACINE) {
872
-			$source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source);
873
-		}
874
-
875
-		return $source;
876
-	}
877
-
878
-	// optimisation : on regarde si on peut deviner l'extension dans l'url et si le fichier
879
-	// a deja ete copie en local avec cette extension
880
-	// dans ce cas elle est fiable, pas la peine de requeter en base
881
-	$path_parts = pathinfo($source);
882
-	if (!isset($path_parts['extension'])) {
883
-		$path_parts['extension'] = '';
884
-	}
885
-	$ext = $path_parts ? $path_parts['extension'] : '';
886
-	if (
887
-		$ext
888
-		and preg_match(',^\w+$,', $ext) // pas de php?truc=1&...
889
-		and $f = nom_fichier_copie_locale($source, $ext)
890
-		and file_exists(_DIR_RACINE . $f)
891
-	) {
892
-		return $f;
893
-	}
894
-
895
-
896
-	// Si c'est deja dans la table des documents,
897
-	// ramener le nom de sa copie potentielle
898
-	$ext = sql_getfetsel('extension', 'spip_documents', 'fichier=' . sql_quote($source) . " AND distant='oui' AND extension <> ''");
899
-
900
-	if ($ext) {
901
-		return nom_fichier_copie_locale($source, $ext);
902
-	}
903
-
904
-	// voir si l'extension indiquee dans le nom du fichier est ok
905
-	// et si il n'aurait pas deja ete rapatrie
906
-
907
-	$ext = $path_parts ? $path_parts['extension'] : '';
908
-
909
-	if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) {
910
-		$f = nom_fichier_copie_locale($source, $ext);
911
-		if (file_exists(_DIR_RACINE . $f)) {
912
-			return $f;
913
-		}
914
-	}
915
-
916
-	// Ping  pour voir si son extension est connue et autorisee
917
-	// avec mise en cache du resultat du ping
918
-
919
-	$cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source);
920
-	if (
921
-		!@file_exists($cache)
922
-		or !$path_parts = @unserialize(spip_file_get_contents($cache))
923
-		or _request('var_mode') === 'recalcul'
924
-	) {
925
-		$path_parts = recuperer_infos_distantes($source, 0, false);
926
-		ecrire_fichier($cache, serialize($path_parts));
927
-	}
928
-	$ext = !empty($path_parts['extension']) ? $path_parts['extension'] : '';
929
-	if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) {
930
-		return nom_fichier_copie_locale($source, $ext);
931
-	}
932
-	spip_log("pas de copie locale pour $source", 'distant' . _LOG_ERREUR);
869
+    // Si c'est deja local pas de souci
870
+    if (!tester_url_absolue($source)) {
871
+        if (_DIR_RACINE) {
872
+            $source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source);
873
+        }
874
+
875
+        return $source;
876
+    }
877
+
878
+    // optimisation : on regarde si on peut deviner l'extension dans l'url et si le fichier
879
+    // a deja ete copie en local avec cette extension
880
+    // dans ce cas elle est fiable, pas la peine de requeter en base
881
+    $path_parts = pathinfo($source);
882
+    if (!isset($path_parts['extension'])) {
883
+        $path_parts['extension'] = '';
884
+    }
885
+    $ext = $path_parts ? $path_parts['extension'] : '';
886
+    if (
887
+        $ext
888
+        and preg_match(',^\w+$,', $ext) // pas de php?truc=1&...
889
+        and $f = nom_fichier_copie_locale($source, $ext)
890
+        and file_exists(_DIR_RACINE . $f)
891
+    ) {
892
+        return $f;
893
+    }
894
+
895
+
896
+    // Si c'est deja dans la table des documents,
897
+    // ramener le nom de sa copie potentielle
898
+    $ext = sql_getfetsel('extension', 'spip_documents', 'fichier=' . sql_quote($source) . " AND distant='oui' AND extension <> ''");
899
+
900
+    if ($ext) {
901
+        return nom_fichier_copie_locale($source, $ext);
902
+    }
903
+
904
+    // voir si l'extension indiquee dans le nom du fichier est ok
905
+    // et si il n'aurait pas deja ete rapatrie
906
+
907
+    $ext = $path_parts ? $path_parts['extension'] : '';
908
+
909
+    if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) {
910
+        $f = nom_fichier_copie_locale($source, $ext);
911
+        if (file_exists(_DIR_RACINE . $f)) {
912
+            return $f;
913
+        }
914
+    }
915
+
916
+    // Ping  pour voir si son extension est connue et autorisee
917
+    // avec mise en cache du resultat du ping
918
+
919
+    $cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source);
920
+    if (
921
+        !@file_exists($cache)
922
+        or !$path_parts = @unserialize(spip_file_get_contents($cache))
923
+        or _request('var_mode') === 'recalcul'
924
+    ) {
925
+        $path_parts = recuperer_infos_distantes($source, 0, false);
926
+        ecrire_fichier($cache, serialize($path_parts));
927
+    }
928
+    $ext = !empty($path_parts['extension']) ? $path_parts['extension'] : '';
929
+    if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) {
930
+        return nom_fichier_copie_locale($source, $ext);
931
+    }
932
+    spip_log("pas de copie locale pour $source", 'distant' . _LOG_ERREUR);
933 933
 }
934 934
 
935 935
 
@@ -957,97 +957,97 @@  discard block
 block discarded – undo
957 957
  **/
958 958
 function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = true) {
959 959
 
960
-	// pas la peine de perdre son temps
961
-	if (!tester_url_absolue($source)) {
962
-		return false;
963
-	}
964
-
965
-	# charger les alias des types mime
966
-	include_spip('base/typedoc');
967
-
968
-	$a = [];
969
-	$mime_type = '';
970
-	// On va directement charger le debut des images et des fichiers html,
971
-	// de maniere a attrapper le maximum d'infos (titre, taille, etc). Si
972
-	// ca echoue l'utilisateur devra les entrer...
973
-	$reponse = recuperer_url($source, ['taille_max' => $max, 'refuser_gz' => true]);
974
-	$headers = $reponse['headers'] ?? '';
975
-	$a['body'] = $reponse['page'] ?? '';
976
-	if ($headers) {
977
-		if (!$extension = distant_trouver_extension_selon_headers($source, $headers)) {
978
-			return false;
979
-		}
980
-
981
-		$a['extension'] = $extension;
982
-
983
-		if (preg_match(",\nContent-Length: *([^[:space:]]*),i", "\n$headers", $regs)) {
984
-			$a['taille'] = intval($regs[1]);
985
-		}
986
-	}
987
-
988
-	// Echec avec HEAD, on tente avec GET
989
-	if (!$a and !$max) {
990
-		spip_log("tenter GET $source", 'distant');
991
-		$a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
992
-	}
993
-
994
-	// si on a rien trouve pas la peine d'insister
995
-	if (!$a) {
996
-		return false;
997
-	}
998
-
999
-	// S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller
1000
-	// recharger le document en GET et recuperer des donnees supplementaires...
1001
-	include_spip('inc/filtres_images_lib_mini');
1002
-	if (
1003
-		strpos($mime_type, 'image/') === 0
1004
-		and $extension = _image_trouver_extension_depuis_mime($mime_type)
1005
-	) {
1006
-		if (
1007
-			$max == 0
1008
-			and (empty($a['taille']) or $a['taille'] < _INC_DISTANT_MAX_SIZE)
1009
-			and in_array($extension, formats_image_acceptables())
1010
-			and $charger_si_petite_image
1011
-		) {
1012
-			$a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
1013
-		} else {
1014
-			if ($a['body']) {
1015
-				$a['extension'] = $extension;
1016
-				$a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $extension);
1017
-				ecrire_fichier($a['fichier'], $a['body']);
1018
-				$size_image = @spip_getimagesize($a['fichier']);
1019
-				$a['largeur'] = intval($size_image[0]);
1020
-				$a['hauteur'] = intval($size_image[1]);
1021
-				$a['type_image'] = true;
1022
-			}
1023
-		}
1024
-	}
1025
-
1026
-	// Fichier swf, si on n'a pas la taille, on va mettre 425x350 par defaut
1027
-	// ce sera mieux que 0x0
1028
-	// Flash is dead!
1029
-	if (
1030
-		$a and isset($a['extension']) and $a['extension'] == 'swf'
1031
-		and empty($a['largeur'])
1032
-	) {
1033
-		$a['largeur'] = 425;
1034
-		$a['hauteur'] = 350;
1035
-	}
1036
-
1037
-	if ($mime_type == 'text/html') {
1038
-		include_spip('inc/filtres');
1039
-		$page = recuperer_url($source, ['transcoder' => true, 'taille_max' => _INC_DISTANT_MAX_SIZE]);
1040
-		$page = $page['page'] ?? '';
1041
-		if (preg_match(',<title>(.*?)</title>,ims', $page, $regs)) {
1042
-			$a['titre'] = corriger_caracteres(trim($regs[1]));
1043
-		}
1044
-		if (!isset($a['taille']) or !$a['taille']) {
1045
-			$a['taille'] = strlen($page); # a peu pres
1046
-		}
1047
-	}
1048
-	$a['mime_type'] = $mime_type;
1049
-
1050
-	return $a;
960
+    // pas la peine de perdre son temps
961
+    if (!tester_url_absolue($source)) {
962
+        return false;
963
+    }
964
+
965
+    # charger les alias des types mime
966
+    include_spip('base/typedoc');
967
+
968
+    $a = [];
969
+    $mime_type = '';
970
+    // On va directement charger le debut des images et des fichiers html,
971
+    // de maniere a attrapper le maximum d'infos (titre, taille, etc). Si
972
+    // ca echoue l'utilisateur devra les entrer...
973
+    $reponse = recuperer_url($source, ['taille_max' => $max, 'refuser_gz' => true]);
974
+    $headers = $reponse['headers'] ?? '';
975
+    $a['body'] = $reponse['page'] ?? '';
976
+    if ($headers) {
977
+        if (!$extension = distant_trouver_extension_selon_headers($source, $headers)) {
978
+            return false;
979
+        }
980
+
981
+        $a['extension'] = $extension;
982
+
983
+        if (preg_match(",\nContent-Length: *([^[:space:]]*),i", "\n$headers", $regs)) {
984
+            $a['taille'] = intval($regs[1]);
985
+        }
986
+    }
987
+
988
+    // Echec avec HEAD, on tente avec GET
989
+    if (!$a and !$max) {
990
+        spip_log("tenter GET $source", 'distant');
991
+        $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
992
+    }
993
+
994
+    // si on a rien trouve pas la peine d'insister
995
+    if (!$a) {
996
+        return false;
997
+    }
998
+
999
+    // S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller
1000
+    // recharger le document en GET et recuperer des donnees supplementaires...
1001
+    include_spip('inc/filtres_images_lib_mini');
1002
+    if (
1003
+        strpos($mime_type, 'image/') === 0
1004
+        and $extension = _image_trouver_extension_depuis_mime($mime_type)
1005
+    ) {
1006
+        if (
1007
+            $max == 0
1008
+            and (empty($a['taille']) or $a['taille'] < _INC_DISTANT_MAX_SIZE)
1009
+            and in_array($extension, formats_image_acceptables())
1010
+            and $charger_si_petite_image
1011
+        ) {
1012
+            $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
1013
+        } else {
1014
+            if ($a['body']) {
1015
+                $a['extension'] = $extension;
1016
+                $a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $extension);
1017
+                ecrire_fichier($a['fichier'], $a['body']);
1018
+                $size_image = @spip_getimagesize($a['fichier']);
1019
+                $a['largeur'] = intval($size_image[0]);
1020
+                $a['hauteur'] = intval($size_image[1]);
1021
+                $a['type_image'] = true;
1022
+            }
1023
+        }
1024
+    }
1025
+
1026
+    // Fichier swf, si on n'a pas la taille, on va mettre 425x350 par defaut
1027
+    // ce sera mieux que 0x0
1028
+    // Flash is dead!
1029
+    if (
1030
+        $a and isset($a['extension']) and $a['extension'] == 'swf'
1031
+        and empty($a['largeur'])
1032
+    ) {
1033
+        $a['largeur'] = 425;
1034
+        $a['hauteur'] = 350;
1035
+    }
1036
+
1037
+    if ($mime_type == 'text/html') {
1038
+        include_spip('inc/filtres');
1039
+        $page = recuperer_url($source, ['transcoder' => true, 'taille_max' => _INC_DISTANT_MAX_SIZE]);
1040
+        $page = $page['page'] ?? '';
1041
+        if (preg_match(',<title>(.*?)</title>,ims', $page, $regs)) {
1042
+            $a['titre'] = corriger_caracteres(trim($regs[1]));
1043
+        }
1044
+        if (!isset($a['taille']) or !$a['taille']) {
1045
+            $a['taille'] = strlen($page); # a peu pres
1046
+        }
1047
+    }
1048
+    $a['mime_type'] = $mime_type;
1049
+
1050
+    return $a;
1051 1051
 }
1052 1052
 
1053 1053
 /**
@@ -1056,70 +1056,70 @@  discard block
 block discarded – undo
1056 1056
  * @return false|mixed
1057 1057
  */
1058 1058
 function distant_trouver_extension_selon_headers($source, $headers) {
1059
-	if (preg_match(",\nContent-Type: *([^[:space:];]*),i", "\n$headers", $regs)) {
1060
-		$mime_type = (trim($regs[1]));
1061
-	} else {
1062
-		$mime_type = '';
1063
-	} // inconnu
1064
-
1065
-	// Appliquer les alias
1066
-	while (isset($GLOBALS['mime_alias'][$mime_type])) {
1067
-		$mime_type = $GLOBALS['mime_alias'][$mime_type];
1068
-	}
1069
-
1070
-	// pour corriger_extension()
1071
-	include_spip('inc/documents');
1072
-
1073
-	// Si on a un mime-type insignifiant
1074
-	// text/plain,application/octet-stream ou vide
1075
-	// c'est peut-etre que le serveur ne sait pas
1076
-	// ce qu'il sert ; on va tenter de detecter via l'extension de l'url
1077
-	// ou le Content-Disposition: attachment; filename=...
1078
-	$t = null;
1079
-	if (in_array($mime_type, ['text/plain', '', 'application/octet-stream'])) {
1080
-		if (
1081
-			!$t
1082
-			and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext)
1083
-		) {
1084
-			$t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1085
-		}
1086
-		if (
1087
-			!$t
1088
-			and preg_match(',^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims', $headers, $m)
1089
-			and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $m[1], $rext)
1090
-		) {
1091
-			$t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1092
-		}
1093
-	}
1094
-
1095
-	// Autre mime/type (ou text/plain avec fichier d'extension inconnue)
1096
-	if (!$t) {
1097
-		$t = sql_fetsel('extension', 'spip_types_documents', 'mime_type=' . sql_quote($mime_type));
1098
-	}
1099
-
1100
-	// Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg)
1101
-	// On essaie de nouveau avec l'extension
1102
-	if (
1103
-		!$t
1104
-		and $mime_type != 'text/plain'
1105
-		and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext)
1106
-	) {
1107
-		# eviter xxx.3 => 3gp (> SPIP 3)
1108
-		$t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1109
-	}
1110
-
1111
-	if ($t) {
1112
-		spip_log("mime-type $mime_type ok, extension " . $t['extension'], 'distant');
1113
-		return $t['extension'];
1114
-	} else {
1115
-		# par defaut on retombe sur '.bin' si c'est autorise
1116
-		spip_log("mime-type $mime_type inconnu", 'distant');
1117
-		$t = sql_fetsel('extension', 'spip_types_documents', "extension='bin'");
1118
-		if (!$t) {
1119
-			return false;
1120
-		}
1121
-		return $t['extension'];
1122
-	}
1059
+    if (preg_match(",\nContent-Type: *([^[:space:];]*),i", "\n$headers", $regs)) {
1060
+        $mime_type = (trim($regs[1]));
1061
+    } else {
1062
+        $mime_type = '';
1063
+    } // inconnu
1064
+
1065
+    // Appliquer les alias
1066
+    while (isset($GLOBALS['mime_alias'][$mime_type])) {
1067
+        $mime_type = $GLOBALS['mime_alias'][$mime_type];
1068
+    }
1069
+
1070
+    // pour corriger_extension()
1071
+    include_spip('inc/documents');
1072
+
1073
+    // Si on a un mime-type insignifiant
1074
+    // text/plain,application/octet-stream ou vide
1075
+    // c'est peut-etre que le serveur ne sait pas
1076
+    // ce qu'il sert ; on va tenter de detecter via l'extension de l'url
1077
+    // ou le Content-Disposition: attachment; filename=...
1078
+    $t = null;
1079
+    if (in_array($mime_type, ['text/plain', '', 'application/octet-stream'])) {
1080
+        if (
1081
+            !$t
1082
+            and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext)
1083
+        ) {
1084
+            $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1085
+        }
1086
+        if (
1087
+            !$t
1088
+            and preg_match(',^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims', $headers, $m)
1089
+            and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $m[1], $rext)
1090
+        ) {
1091
+            $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1092
+        }
1093
+    }
1094
+
1095
+    // Autre mime/type (ou text/plain avec fichier d'extension inconnue)
1096
+    if (!$t) {
1097
+        $t = sql_fetsel('extension', 'spip_types_documents', 'mime_type=' . sql_quote($mime_type));
1098
+    }
1099
+
1100
+    // Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg)
1101
+    // On essaie de nouveau avec l'extension
1102
+    if (
1103
+        !$t
1104
+        and $mime_type != 'text/plain'
1105
+        and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext)
1106
+    ) {
1107
+        # eviter xxx.3 => 3gp (> SPIP 3)
1108
+        $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1109
+    }
1110
+
1111
+    if ($t) {
1112
+        spip_log("mime-type $mime_type ok, extension " . $t['extension'], 'distant');
1113
+        return $t['extension'];
1114
+    } else {
1115
+        # par defaut on retombe sur '.bin' si c'est autorise
1116
+        spip_log("mime-type $mime_type inconnu", 'distant');
1117
+        $t = sql_fetsel('extension', 'spip_types_documents', "extension='bin'");
1118
+        if (!$t) {
1119
+            return false;
1120
+        }
1121
+        return $t['extension'];
1122
+    }
1123 1123
 }
1124 1124
 
1125 1125
 /**
@@ -1135,45 +1135,45 @@  discard block
 block discarded – undo
1135 1135
  */
1136 1136
 function need_proxy($host, $http_proxy = null, $http_noproxy = null) {
1137 1137
 
1138
-	$http_proxy ??= $GLOBALS['meta']['http_proxy'] ?? null;
1138
+    $http_proxy ??= $GLOBALS['meta']['http_proxy'] ?? null;
1139 1139
 	
1140
-	// rien a faire si pas de proxy :)
1141
-	if (is_null($http_proxy) or !$http_proxy = trim($http_proxy)) {
1142
-		return '';
1143
-	}
1144
-
1145
-	if (is_null($http_noproxy)) {
1146
-		$http_noproxy = $GLOBALS['meta']['http_noproxy'] ?? null;
1147
-	}
1148
-	// si pas d'exception, on retourne le proxy
1149
-	if (is_null($http_noproxy) or !$http_noproxy = trim($http_noproxy)) {
1150
-		return $http_proxy;
1151
-	}
1152
-
1153
-	// si le host ou l'un des domaines parents est dans $http_noproxy on fait exception
1154
-	// $http_noproxy peut contenir plusieurs domaines separes par des espaces ou retour ligne
1155
-	$http_noproxy = str_replace("\n", ' ', $http_noproxy);
1156
-	$http_noproxy = str_replace("\r", ' ', $http_noproxy);
1157
-	$http_noproxy = " $http_noproxy ";
1158
-	$domain = $host;
1159
-	// si le domaine exact www.example.org est dans les exceptions
1160
-	if (strpos($http_noproxy, (string) " $domain ") !== false) {
1161
-		return '';
1162
-	}
1163
-
1164
-	while (strpos($domain, '.') !== false) {
1165
-		$domain = explode('.', $domain);
1166
-		array_shift($domain);
1167
-		$domain = implode('.', $domain);
1168
-
1169
-		// ou si un domaine parent commencant par un . est dans les exceptions (indiquant qu'il couvre tous les sous-domaines)
1170
-		if (strpos($http_noproxy, (string) " .$domain ") !== false) {
1171
-			return '';
1172
-		}
1173
-	}
1174
-
1175
-	// ok c'est pas une exception
1176
-	return $http_proxy;
1140
+    // rien a faire si pas de proxy :)
1141
+    if (is_null($http_proxy) or !$http_proxy = trim($http_proxy)) {
1142
+        return '';
1143
+    }
1144
+
1145
+    if (is_null($http_noproxy)) {
1146
+        $http_noproxy = $GLOBALS['meta']['http_noproxy'] ?? null;
1147
+    }
1148
+    // si pas d'exception, on retourne le proxy
1149
+    if (is_null($http_noproxy) or !$http_noproxy = trim($http_noproxy)) {
1150
+        return $http_proxy;
1151
+    }
1152
+
1153
+    // si le host ou l'un des domaines parents est dans $http_noproxy on fait exception
1154
+    // $http_noproxy peut contenir plusieurs domaines separes par des espaces ou retour ligne
1155
+    $http_noproxy = str_replace("\n", ' ', $http_noproxy);
1156
+    $http_noproxy = str_replace("\r", ' ', $http_noproxy);
1157
+    $http_noproxy = " $http_noproxy ";
1158
+    $domain = $host;
1159
+    // si le domaine exact www.example.org est dans les exceptions
1160
+    if (strpos($http_noproxy, (string) " $domain ") !== false) {
1161
+        return '';
1162
+    }
1163
+
1164
+    while (strpos($domain, '.') !== false) {
1165
+        $domain = explode('.', $domain);
1166
+        array_shift($domain);
1167
+        $domain = implode('.', $domain);
1168
+
1169
+        // ou si un domaine parent commencant par un . est dans les exceptions (indiquant qu'il couvre tous les sous-domaines)
1170
+        if (strpos($http_noproxy, (string) " .$domain ") !== false) {
1171
+            return '';
1172
+        }
1173
+    }
1174
+
1175
+    // ok c'est pas une exception
1176
+    return $http_proxy;
1177 1177
 }
1178 1178
 
1179 1179
 
@@ -1196,59 +1196,59 @@  discard block
 block discarded – undo
1196 1196
  * @return array
1197 1197
  */
1198 1198
 function init_http($method, $url, $refuse_gz = false, $referer = '', $datas = '', $vers = 'HTTP/1.0', $date = '') {
1199
-	$user = $via_proxy = $proxy_user = '';
1200
-	$fopen = false;
1201
-
1202
-	$t = @parse_url($url);
1203
-	$host = $t['host'];
1204
-	if ($t['scheme'] == 'http') {
1205
-		$scheme = 'http';
1206
-		$noproxy = '';
1207
-	} elseif ($t['scheme'] == 'https') {
1208
-		$scheme = 'ssl';
1209
-		$noproxy = 'ssl://';
1210
-		if (!isset($t['port']) || !($port = $t['port'])) {
1211
-			$t['port'] = 443;
1212
-		}
1213
-	} else {
1214
-		$scheme = $t['scheme'];
1215
-		$noproxy = $scheme . '://';
1216
-	}
1217
-	if (isset($t['user'])) {
1218
-		$user = [$t['user'], $t['pass']];
1219
-	}
1220
-
1221
-	if (!isset($t['port']) || !($port = $t['port'])) {
1222
-		$port = 80;
1223
-	}
1224
-	if (!isset($t['path']) || !($path = $t['path'])) {
1225
-		$path = '/';
1226
-	}
1227
-
1228
-	if (!empty($t['query'])) {
1229
-		$path .= '?' . $t['query'];
1230
-	}
1231
-
1232
-	$f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, $date);
1233
-	if (!$f or !is_resource($f)) {
1234
-		// fallback : fopen si on a pas fait timeout dans lance_requete
1235
-		// ce qui correspond a $f===110
1236
-		if (
1237
-			$f !== 110
1238
-			and !need_proxy($host)
1239
-			and !_request('tester_proxy')
1240
-			and (!isset($GLOBALS['inc_distant_allow_fopen']) or $GLOBALS['inc_distant_allow_fopen'])
1241
-		) {
1242
-			$f = @fopen($url, 'rb');
1243
-			spip_log("connexion vers $url par simple fopen", 'distant');
1244
-			$fopen = true;
1245
-		} else {
1246
-			// echec total
1247
-			$f = false;
1248
-		}
1249
-	}
1250
-
1251
-	return [$f, $fopen];
1199
+    $user = $via_proxy = $proxy_user = '';
1200
+    $fopen = false;
1201
+
1202
+    $t = @parse_url($url);
1203
+    $host = $t['host'];
1204
+    if ($t['scheme'] == 'http') {
1205
+        $scheme = 'http';
1206
+        $noproxy = '';
1207
+    } elseif ($t['scheme'] == 'https') {
1208
+        $scheme = 'ssl';
1209
+        $noproxy = 'ssl://';
1210
+        if (!isset($t['port']) || !($port = $t['port'])) {
1211
+            $t['port'] = 443;
1212
+        }
1213
+    } else {
1214
+        $scheme = $t['scheme'];
1215
+        $noproxy = $scheme . '://';
1216
+    }
1217
+    if (isset($t['user'])) {
1218
+        $user = [$t['user'], $t['pass']];
1219
+    }
1220
+
1221
+    if (!isset($t['port']) || !($port = $t['port'])) {
1222
+        $port = 80;
1223
+    }
1224
+    if (!isset($t['path']) || !($path = $t['path'])) {
1225
+        $path = '/';
1226
+    }
1227
+
1228
+    if (!empty($t['query'])) {
1229
+        $path .= '?' . $t['query'];
1230
+    }
1231
+
1232
+    $f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, $date);
1233
+    if (!$f or !is_resource($f)) {
1234
+        // fallback : fopen si on a pas fait timeout dans lance_requete
1235
+        // ce qui correspond a $f===110
1236
+        if (
1237
+            $f !== 110
1238
+            and !need_proxy($host)
1239
+            and !_request('tester_proxy')
1240
+            and (!isset($GLOBALS['inc_distant_allow_fopen']) or $GLOBALS['inc_distant_allow_fopen'])
1241
+        ) {
1242
+            $f = @fopen($url, 'rb');
1243
+            spip_log("connexion vers $url par simple fopen", 'distant');
1244
+            $fopen = true;
1245
+        } else {
1246
+            // echec total
1247
+            $f = false;
1248
+        }
1249
+    }
1250
+
1251
+    return [$f, $fopen];
1252 1252
 }
1253 1253
 
1254 1254
 /**
@@ -1283,123 +1283,123 @@  discard block
 block discarded – undo
1283 1283
  *   resource socket vers l'url demandee
1284 1284
  */
1285 1285
 function lance_requete(
1286
-	$method,
1287
-	$scheme,
1288
-	$user,
1289
-	$host,
1290
-	$path,
1291
-	$port,
1292
-	$noproxy,
1293
-	$refuse_gz = false,
1294
-	$referer = '',
1295
-	$datas = '',
1296
-	$vers = 'HTTP/1.0',
1297
-	$date = ''
1286
+    $method,
1287
+    $scheme,
1288
+    $user,
1289
+    $host,
1290
+    $path,
1291
+    $port,
1292
+    $noproxy,
1293
+    $refuse_gz = false,
1294
+    $referer = '',
1295
+    $datas = '',
1296
+    $vers = 'HTTP/1.0',
1297
+    $date = ''
1298 1298
 ) {
1299 1299
 
1300
-	$proxy_user = '';
1301
-	$http_proxy = need_proxy($host);
1302
-	if ($user) {
1303
-		$user = urlencode($user[0]) . ':' . urlencode($user[1]);
1304
-	}
1305
-
1306
-	$connect = '';
1307
-	if ($http_proxy) {
1308
-		if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls','ssl'])) {
1309
-			$path_host = (!$user ? '' : "$user@") . $host . (($port != 80) ? ":$port" : '');
1310
-			$connect = 'CONNECT ' . $path_host . " $vers\r\n"
1311
-				. "Host: $path_host\r\n"
1312
-				. "Proxy-Connection: Keep-Alive\r\n";
1313
-		} else {
1314
-			$path = (in_array($scheme, ['tls','ssl']) ? 'https://' : "$scheme://")
1315
-				. (!$user ? '' : "$user@")
1316
-				. "$host" . (($port != 80) ? ":$port" : '') . $path;
1317
-		}
1318
-		$t2 = @parse_url($http_proxy);
1319
-		$first_host = $t2['host'];
1320
-		$port = ($t2['port'] ?? null) ?: 80;
1321
-		if ($t2['user'] ?? null) {
1322
-			$proxy_user = base64_encode($t2['user'] . ':' . $t2['pass']);
1323
-		}
1324
-	} else {
1325
-		$first_host = $noproxy . $host;
1326
-	}
1327
-
1328
-	if ($connect) {
1329
-		$streamContext = stream_context_create([
1330
-			'ssl' => [
1331
-				'verify_peer' => false,
1332
-				'allow_self_signed' => true,
1333
-				'SNI_enabled' => true,
1334
-				'peer_name' => $host,
1335
-			]
1336
-		]);
1337
-		$f = @stream_socket_client(
1338
-			"tcp://$first_host:$port",
1339
-			$errno,
1340
-			$errstr,
1341
-			_INC_DISTANT_CONNECT_TIMEOUT,
1342
-			STREAM_CLIENT_CONNECT,
1343
-			$streamContext
1344
-		);
1345
-		spip_log("Recuperer $path sur $first_host:$port par $f (via CONNECT)", 'connect');
1346
-		if (!$f) {
1347
-			spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR);
1348
-			return $errno;
1349
-		}
1350
-		stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT);
1351
-
1352
-		fputs($f, $connect);
1353
-		fputs($f, "\r\n");
1354
-		$res = fread($f, 1024);
1355
-		if (
1356
-			!$res
1357
-			or !count($res = explode(' ', $res))
1358
-			or $res[1] !== '200'
1359
-		) {
1360
-			spip_log("Echec CONNECT sur $first_host:$port", 'connect' . _LOG_INFO_IMPORTANTE);
1361
-			fclose($f);
1362
-
1363
-			return false;
1364
-		}
1365
-		// important, car sinon on lit trop vite et les donnees ne sont pas encore dispo
1366
-		stream_set_blocking($f, true);
1367
-		// envoyer le handshake
1368
-		stream_socket_enable_crypto($f, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
1369
-		spip_log("OK CONNECT sur $first_host:$port", 'connect');
1370
-	} else {
1371
-		$ntry = 3;
1372
-		do {
1373
-			$f = @fsockopen($first_host, $port, $errno, $errstr, _INC_DISTANT_CONNECT_TIMEOUT);
1374
-		} while (!$f and $ntry-- and $errno !== 110 and sleep(1));
1375
-		spip_log("Recuperer $path sur $first_host:$port par $f");
1376
-		if (!$f) {
1377
-			spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR);
1378
-
1379
-			return $errno;
1380
-		}
1381
-		stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT);
1382
-	}
1383
-
1384
-	$site = $GLOBALS['meta']['adresse_site'] ?? '';
1385
-
1386
-	$host_port = $host;
1387
-	if ($port != (in_array($scheme, ['tls','ssl']) ? 443 : 80)) {
1388
-		$host_port .= ":$port";
1389
-	}
1390
-	$req = "$method $path $vers\r\n"
1391
-		. "Host: $host_port\r\n"
1392
-		. 'User-Agent: ' . _INC_DISTANT_USER_AGENT . "\r\n"
1393
-		. ($refuse_gz ? '' : ('Accept-Encoding: ' . _INC_DISTANT_CONTENT_ENCODING . "\r\n"))
1394
-		. (!$site ? '' : "Referer: $site/$referer\r\n")
1395
-		. (!$date ? '' : 'If-Modified-Since: ' . (gmdate('D, d M Y H:i:s', $date) . " GMT\r\n"))
1396
-		. (!$user ? '' : ('Authorization: Basic ' . base64_encode($user) . "\r\n"))
1397
-		. (!$proxy_user ? '' : "Proxy-Authorization: Basic $proxy_user\r\n")
1398
-		. (!strpos($vers, '1.1') ? '' : "Keep-Alive: 300\r\nConnection: keep-alive\r\n");
1300
+    $proxy_user = '';
1301
+    $http_proxy = need_proxy($host);
1302
+    if ($user) {
1303
+        $user = urlencode($user[0]) . ':' . urlencode($user[1]);
1304
+    }
1305
+
1306
+    $connect = '';
1307
+    if ($http_proxy) {
1308
+        if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls','ssl'])) {
1309
+            $path_host = (!$user ? '' : "$user@") . $host . (($port != 80) ? ":$port" : '');
1310
+            $connect = 'CONNECT ' . $path_host . " $vers\r\n"
1311
+                . "Host: $path_host\r\n"
1312
+                . "Proxy-Connection: Keep-Alive\r\n";
1313
+        } else {
1314
+            $path = (in_array($scheme, ['tls','ssl']) ? 'https://' : "$scheme://")
1315
+                . (!$user ? '' : "$user@")
1316
+                . "$host" . (($port != 80) ? ":$port" : '') . $path;
1317
+        }
1318
+        $t2 = @parse_url($http_proxy);
1319
+        $first_host = $t2['host'];
1320
+        $port = ($t2['port'] ?? null) ?: 80;
1321
+        if ($t2['user'] ?? null) {
1322
+            $proxy_user = base64_encode($t2['user'] . ':' . $t2['pass']);
1323
+        }
1324
+    } else {
1325
+        $first_host = $noproxy . $host;
1326
+    }
1327
+
1328
+    if ($connect) {
1329
+        $streamContext = stream_context_create([
1330
+            'ssl' => [
1331
+                'verify_peer' => false,
1332
+                'allow_self_signed' => true,
1333
+                'SNI_enabled' => true,
1334
+                'peer_name' => $host,
1335
+            ]
1336
+        ]);
1337
+        $f = @stream_socket_client(
1338
+            "tcp://$first_host:$port",
1339
+            $errno,
1340
+            $errstr,
1341
+            _INC_DISTANT_CONNECT_TIMEOUT,
1342
+            STREAM_CLIENT_CONNECT,
1343
+            $streamContext
1344
+        );
1345
+        spip_log("Recuperer $path sur $first_host:$port par $f (via CONNECT)", 'connect');
1346
+        if (!$f) {
1347
+            spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR);
1348
+            return $errno;
1349
+        }
1350
+        stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT);
1351
+
1352
+        fputs($f, $connect);
1353
+        fputs($f, "\r\n");
1354
+        $res = fread($f, 1024);
1355
+        if (
1356
+            !$res
1357
+            or !count($res = explode(' ', $res))
1358
+            or $res[1] !== '200'
1359
+        ) {
1360
+            spip_log("Echec CONNECT sur $first_host:$port", 'connect' . _LOG_INFO_IMPORTANTE);
1361
+            fclose($f);
1362
+
1363
+            return false;
1364
+        }
1365
+        // important, car sinon on lit trop vite et les donnees ne sont pas encore dispo
1366
+        stream_set_blocking($f, true);
1367
+        // envoyer le handshake
1368
+        stream_socket_enable_crypto($f, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
1369
+        spip_log("OK CONNECT sur $first_host:$port", 'connect');
1370
+    } else {
1371
+        $ntry = 3;
1372
+        do {
1373
+            $f = @fsockopen($first_host, $port, $errno, $errstr, _INC_DISTANT_CONNECT_TIMEOUT);
1374
+        } while (!$f and $ntry-- and $errno !== 110 and sleep(1));
1375
+        spip_log("Recuperer $path sur $first_host:$port par $f");
1376
+        if (!$f) {
1377
+            spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR);
1378
+
1379
+            return $errno;
1380
+        }
1381
+        stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT);
1382
+    }
1383
+
1384
+    $site = $GLOBALS['meta']['adresse_site'] ?? '';
1385
+
1386
+    $host_port = $host;
1387
+    if ($port != (in_array($scheme, ['tls','ssl']) ? 443 : 80)) {
1388
+        $host_port .= ":$port";
1389
+    }
1390
+    $req = "$method $path $vers\r\n"
1391
+        . "Host: $host_port\r\n"
1392
+        . 'User-Agent: ' . _INC_DISTANT_USER_AGENT . "\r\n"
1393
+        . ($refuse_gz ? '' : ('Accept-Encoding: ' . _INC_DISTANT_CONTENT_ENCODING . "\r\n"))
1394
+        . (!$site ? '' : "Referer: $site/$referer\r\n")
1395
+        . (!$date ? '' : 'If-Modified-Since: ' . (gmdate('D, d M Y H:i:s', $date) . " GMT\r\n"))
1396
+        . (!$user ? '' : ('Authorization: Basic ' . base64_encode($user) . "\r\n"))
1397
+        . (!$proxy_user ? '' : "Proxy-Authorization: Basic $proxy_user\r\n")
1398
+        . (!strpos($vers, '1.1') ? '' : "Keep-Alive: 300\r\nConnection: keep-alive\r\n");
1399 1399
 
1400 1400
 #	spip_log("Requete\n$req", 'distant');
1401
-	fputs($f, $req);
1402
-	fputs($f, $datas ?: "\r\n");
1401
+    fputs($f, $req);
1402
+    fputs($f, $datas ?: "\r\n");
1403 1403
 
1404
-	return $f;
1404
+    return $f;
1405 1405
 }
Please login to merge, or discard this patch.
Spacing   +63 added lines, -63 removed lines patch added patch discarded remove patch
@@ -26,7 +26,7 @@  discard block
 block discarded – undo
26 26
 	define('_INC_DISTANT_CONTENT_ENCODING', 'gzip');
27 27
 }
28 28
 if (!defined('_INC_DISTANT_USER_AGENT')) {
29
-	define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . ' (' . $GLOBALS['home_server'] . ')');
29
+	define('_INC_DISTANT_USER_AGENT', 'SPIP-'.$GLOBALS['spip_version_affichee'].' ('.$GLOBALS['home_server'].')');
30 30
 }
31 31
 if (!defined('_INC_DISTANT_MAX_SIZE')) {
32 32
 	define('_INC_DISTANT_MAX_SIZE', 2_097_152);
@@ -35,7 +35,7 @@  discard block
 block discarded – undo
35 35
 	define('_INC_DISTANT_CONNECT_TIMEOUT', 10);
36 36
 }
37 37
 
38
-define('_REGEXP_COPIE_LOCALE', ',' 	.
38
+define('_REGEXP_COPIE_LOCALE', ','.
39 39
 	preg_replace(
40 40
 		'@^https?:@',
41 41
 		'https?:',
@@ -70,7 +70,7 @@  discard block
 block discarded – undo
70 70
 
71 71
 	// si c'est la protection de soi-meme, retourner le path
72 72
 	if ($mode !== 'force' and preg_match(_REGEXP_COPIE_LOCALE, $source, $match)) {
73
-		$source = substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($match[1]);
73
+		$source = substr(_DIR_IMG, strlen(_DIR_RACINE)).urldecode($match[1]);
74 74
 
75 75
 		return @file_exists($source) ? $source : false;
76 76
 	}
@@ -90,7 +90,7 @@  discard block
 block discarded – undo
90 90
 		return false;
91 91
 	}
92 92
 
93
-	$localrac = _DIR_RACINE . $local;
93
+	$localrac = _DIR_RACINE.$local;
94 94
 	$t = ($mode === 'force') ? false : @file_exists($localrac);
95 95
 
96 96
 	// test d'existence du fichier
@@ -115,10 +115,10 @@  discard block
 block discarded – undo
115 115
 			['file' => $localrac, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : '']
116 116
 		);
117 117
 		if (!$res or (!$res['length'] and $res['status'] != 304)) {
118
-			spip_log("copie_locale : Echec recuperation $source sur $localrac status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE);
118
+			spip_log("copie_locale : Echec recuperation $source sur $localrac status : ".($res ? $res['status'] : '-'), 'distant'._LOG_INFO_IMPORTANTE);
119 119
 		}
120 120
 		else {
121
-			spip_log("copie_locale : recuperation $source sur $localrac OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant');
121
+			spip_log("copie_locale : recuperation $source sur $localrac OK | taille ".$res['length'].' status '.$res['status'], 'distant');
122 122
 		}
123 123
 		if (!$res or !$res['length']) {
124 124
 			// si $t c'est sans doute juste un not-modified-since
@@ -207,7 +207,7 @@  discard block
 block discarded – undo
207 207
 
208 208
 	if (!$is_known_host) {
209 209
 		$host = trim($parsed_url['host'], '.');
210
-		if (! $ip = filter_var($host, FILTER_VALIDATE_IP)) {
210
+		if (!$ip = filter_var($host, FILTER_VALIDATE_IP)) {
211 211
 			$ip = gethostbyname($host);
212 212
 			if ($ip === $host) {
213 213
 				// Error condition for gethostbyname()
@@ -228,7 +228,7 @@  discard block
 block discarded – undo
228 228
 			}
229 229
 		}
230 230
 		if ($ip) {
231
-			if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
231
+			if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
232 232
 				return false;
233 233
 			}
234 234
 		}
@@ -239,7 +239,7 @@  discard block
 block discarded – undo
239 239
 	}
240 240
 
241 241
 	$port = $parsed_url['port'];
242
-	if ($port === 80  or $port === 443  or $port === 8080) {
242
+	if ($port === 80 or $port === 443 or $port === 8080) {
243 243
 		return $url;
244 244
 	}
245 245
 
@@ -309,7 +309,7 @@  discard block
 block discarded – undo
309 309
 				}
310 310
 			}
311 311
 			if ($taille > 500) {
312
-				$boundary = substr(md5(random_int(0, mt_getrandmax()) . 'spip'), 0, 8);
312
+				$boundary = substr(md5(random_int(0, mt_getrandmax()).'spip'), 0, 8);
313 313
 			}
314 314
 		}
315 315
 
@@ -337,16 +337,16 @@  discard block
 block discarded – undo
337 337
 			}
338 338
 		} else {
339 339
 			// fabrique une chaine HTTP simple pour un POST
340
-			$entete = 'Content-Type: application/x-www-form-urlencoded' . "\r\n";
340
+			$entete = 'Content-Type: application/x-www-form-urlencoded'."\r\n";
341 341
 			$chaine = [];
342 342
 			if (is_array($donnees)) {
343 343
 				foreach ($donnees as $cle => $valeur) {
344 344
 					if (is_array($valeur)) {
345 345
 						foreach ($valeur as $val2) {
346
-							$chaine[] = rawurlencode($cle) . '[]=' . rawurlencode($val2);
346
+							$chaine[] = rawurlencode($cle).'[]='.rawurlencode($val2);
347 347
 						}
348 348
 					} else {
349
-						$chaine[] = rawurlencode($cle) . '=' . rawurlencode($valeur);
349
+						$chaine[] = rawurlencode($cle).'='.rawurlencode($valeur);
350 350
 					}
351 351
 				}
352 352
 				$chaine = implode('&', $chaine);
@@ -451,13 +451,13 @@  discard block
 block discarded – undo
451 451
 		$options['taille_max'] = $copy ? _COPIE_LOCALE_MAX_SIZE : _INC_DISTANT_MAX_SIZE;
452 452
 	}
453 453
 
454
-	spip_log("recuperer_url " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG);
454
+	spip_log("recuperer_url ".$options['methode']." sur $url", 'distant'._LOG_DEBUG);
455 455
 
456 456
 	// Ajout des en-têtes spécifiques si besoin
457 457
 	$formatted_data = '';
458 458
 	if (!empty($options['headers'])) {
459 459
 		foreach ($options['headers'] as $champ => $valeur) {
460
-			$formatted_data .= $champ . ': ' . $valeur . "\r\n";
460
+			$formatted_data .= $champ.': '.$valeur."\r\n";
461 461
 		}
462 462
 	}
463 463
 
@@ -465,9 +465,9 @@  discard block
 block discarded – undo
465 465
 		[$head, $postdata] = prepare_donnees_post($options['datas'], $options['boundary']);
466 466
 		$head .= $formatted_data;
467 467
 		if (stripos($head, 'Content-Length:') === false) {
468
-			$head .= 'Content-Length: ' . strlen($postdata) . "\r\n";
468
+			$head .= 'Content-Length: '.strlen($postdata)."\r\n";
469 469
 		}
470
-		$formatted_data = $head . "\r\n" . $postdata;
470
+		$formatted_data = $head."\r\n".$postdata;
471 471
 		if (
472 472
 			strlen($postdata)
473 473
 			and !$methode_demandee
@@ -481,9 +481,9 @@  discard block
 block discarded – undo
481 481
 	// Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole
482 482
 	$url = preg_replace(',^feed://,i', 'http://', $url);
483 483
 	if (!tester_url_absolue($url)) {
484
-		$url = 'http://' . $url;
484
+		$url = 'http://'.$url;
485 485
 	} elseif (strncmp($url, '//', 2) == 0) {
486
-		$url = 'http:' . $url;
486
+		$url = 'http:'.$url;
487 487
 	}
488 488
 
489 489
 	$url = url_to_ascii($url);
@@ -512,7 +512,7 @@  discard block
 block discarded – undo
512 512
 		$options['if_modified_since']
513 513
 	);
514 514
 	if (!$handle) {
515
-		spip_log("ECHEC init_http $url", 'distant' . _LOG_ERREUR);
515
+		spip_log("ECHEC init_http $url", 'distant'._LOG_ERREUR);
516 516
 
517 517
 		return false;
518 518
 	}
@@ -542,7 +542,7 @@  discard block
 block discarded – undo
542 542
 					'status' => 200,
543 543
 				];
544 544
 			} else {
545
-				spip_log("ECHEC chinoiserie $url", 'distant' . _LOG_ERREUR);
545
+				spip_log("ECHEC chinoiserie $url", 'distant'._LOG_ERREUR);
546 546
 				return false;
547 547
 			}
548 548
 		} elseif ($res['location'] and $options['follow_location']) {
@@ -558,11 +558,11 @@  discard block
 block discarded – undo
558 558
 					$options['datas'] = '';
559 559
 				}
560 560
 			}
561
-			spip_log("recuperer_url recommence " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG);
561
+			spip_log("recuperer_url recommence ".$options['methode']." sur $url", 'distant'._LOG_DEBUG);
562 562
 
563 563
 			return recuperer_url($url, $options);
564 564
 		} elseif ($res['status'] !== 200) {
565
-			spip_log('HTTP status ' . $res['status'] . " pour $url", 'distant');
565
+			spip_log('HTTP status '.$res['status']." pour $url", 'distant');
566 566
 		}
567 567
 		$result['status'] = $res['status'];
568 568
 		if (isset($res['headers'])) {
@@ -578,7 +578,7 @@  discard block
 block discarded – undo
578 578
 
579 579
 	// on ne veut que les entetes
580 580
 	if (!$options['taille_max'] or $options['methode'] == 'HEAD' or $result['status'] == '304') {
581
-		spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($result), 'distant' . _LOG_DEBUG);
581
+		spip_log("RESULTAT recuperer_url ".$options['methode']." sur $url : ".json_encode($result), 'distant'._LOG_DEBUG);
582 582
 		return $result;
583 583
 	}
584 584
 
@@ -588,7 +588,7 @@  discard block
 block discarded – undo
588 588
 
589 589
 	$gz = false;
590 590
 	if (preg_match(",\bContent-Encoding: .*gzip,is", $result['headers'])) {
591
-		$gz = (_DIR_TMP . md5(uniqid(random_int(0, mt_getrandmax()))) . '.tmp.gz');
591
+		$gz = (_DIR_TMP.md5(uniqid(random_int(0, mt_getrandmax()))).'.tmp.gz');
592 592
 	}
593 593
 
594 594
 	// si on a pas deja recuperer le contenu par une methode detournee
@@ -624,7 +624,7 @@  discard block
 block discarded – undo
624 624
 
625 625
 	$trace = json_decode(json_encode($result), true);
626 626
 	$trace['page'] = '...';
627
-	spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($trace), 'distant' . _LOG_DEBUG);
627
+	spip_log("RESULTAT recuperer_url ".$options['methode']." sur $url : ".json_encode($trace), 'distant'._LOG_DEBUG);
628 628
 
629 629
 	return $result;
630 630
 }
@@ -678,7 +678,7 @@  discard block
 block discarded – undo
678 678
 	$sig['url'] = $url;
679 679
 
680 680
 	$dir = sous_repertoire(_DIR_CACHE, 'curl');
681
-	$cache = md5(serialize($sig)) . '-' . substr(preg_replace(',\W+,', '_', $url), 0, 80);
681
+	$cache = md5(serialize($sig)).'-'.substr(preg_replace(',\W+,', '_', $url), 0, 80);
682 682
 	$sub = sous_repertoire($dir, substr($cache, 0, 2));
683 683
 	$cache = "$sub$cache";
684 684
 
@@ -732,7 +732,7 @@  discard block
 block discarded – undo
732 732
 	$fp = false;
733 733
 	if ($fichier) {
734 734
 		include_spip('inc/acces');
735
-		$tmpfile = "$fichier." . creer_uniqid() . '.tmp';
735
+		$tmpfile = "$fichier.".creer_uniqid().'.tmp';
736 736
 		$fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX);
737 737
 		if (!$fp and file_exists($fichier)) {
738 738
 			return filesize($fichier);
@@ -791,7 +791,7 @@  discard block
 block discarded – undo
791 791
 	}
792 792
 	$result['status'] = intval($r[1]);
793 793
 	while ($s = trim(fgets($handle, 16384))) {
794
-		$result['headers'][] = $s . "\n";
794
+		$result['headers'][] = $s."\n";
795 795
 		preg_match(',^([^:]*): *(.*)$,i', $s, $r);
796 796
 		[, $d, $v] = $r;
797 797
 		if (strtolower(trim($d)) == 'location' and $result['status'] >= 300 and $result['status'] < 400) {
@@ -840,13 +840,13 @@  discard block
 block discarded – undo
840 840
 
841 841
 	// on se place tout le temps comme si on etait a la racine
842 842
 	if (_DIR_RACINE) {
843
-		$d = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $d);
843
+		$d = preg_replace(',^'.preg_quote(_DIR_RACINE).',', '', $d);
844 844
 	}
845 845
 
846 846
 	$m = md5($source);
847 847
 
848 848
 	return $d
849
-	. substr(preg_replace(',[^\w-],', '', basename($source)) . '-' . $m, 0, 12)
849
+	. substr(preg_replace(',[^\w-],', '', basename($source)).'-'.$m, 0, 12)
850 850
 	. substr($m, 0, 4)
851 851
 	. ".$extension";
852 852
 }
@@ -869,7 +869,7 @@  discard block
 block discarded – undo
869 869
 	// Si c'est deja local pas de souci
870 870
 	if (!tester_url_absolue($source)) {
871 871
 		if (_DIR_RACINE) {
872
-			$source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source);
872
+			$source = preg_replace(',^'.preg_quote(_DIR_RACINE).',', '', $source);
873 873
 		}
874 874
 
875 875
 		return $source;
@@ -887,7 +887,7 @@  discard block
 block discarded – undo
887 887
 		$ext
888 888
 		and preg_match(',^\w+$,', $ext) // pas de php?truc=1&...
889 889
 		and $f = nom_fichier_copie_locale($source, $ext)
890
-		and file_exists(_DIR_RACINE . $f)
890
+		and file_exists(_DIR_RACINE.$f)
891 891
 	) {
892 892
 		return $f;
893 893
 	}
@@ -895,7 +895,7 @@  discard block
 block discarded – undo
895 895
 
896 896
 	// Si c'est deja dans la table des documents,
897 897
 	// ramener le nom de sa copie potentielle
898
-	$ext = sql_getfetsel('extension', 'spip_documents', 'fichier=' . sql_quote($source) . " AND distant='oui' AND extension <> ''");
898
+	$ext = sql_getfetsel('extension', 'spip_documents', 'fichier='.sql_quote($source)." AND distant='oui' AND extension <> ''");
899 899
 
900 900
 	if ($ext) {
901 901
 		return nom_fichier_copie_locale($source, $ext);
@@ -906,9 +906,9 @@  discard block
 block discarded – undo
906 906
 
907 907
 	$ext = $path_parts ? $path_parts['extension'] : '';
908 908
 
909
-	if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) {
909
+	if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension='.sql_quote($ext))) {
910 910
 		$f = nom_fichier_copie_locale($source, $ext);
911
-		if (file_exists(_DIR_RACINE . $f)) {
911
+		if (file_exists(_DIR_RACINE.$f)) {
912 912
 			return $f;
913 913
 		}
914 914
 	}
@@ -916,7 +916,7 @@  discard block
 block discarded – undo
916 916
 	// Ping  pour voir si son extension est connue et autorisee
917 917
 	// avec mise en cache du resultat du ping
918 918
 
919
-	$cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source);
919
+	$cache = sous_repertoire(_DIR_CACHE, 'rid').md5($source);
920 920
 	if (
921 921
 		!@file_exists($cache)
922 922
 		or !$path_parts = @unserialize(spip_file_get_contents($cache))
@@ -926,10 +926,10 @@  discard block
 block discarded – undo
926 926
 		ecrire_fichier($cache, serialize($path_parts));
927 927
 	}
928 928
 	$ext = !empty($path_parts['extension']) ? $path_parts['extension'] : '';
929
-	if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) {
929
+	if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension='.sql_quote($ext))) {
930 930
 		return nom_fichier_copie_locale($source, $ext);
931 931
 	}
932
-	spip_log("pas de copie locale pour $source", 'distant' . _LOG_ERREUR);
932
+	spip_log("pas de copie locale pour $source", 'distant'._LOG_ERREUR);
933 933
 }
934 934
 
935 935
 
@@ -1013,7 +1013,7 @@  discard block
 block discarded – undo
1013 1013
 		} else {
1014 1014
 			if ($a['body']) {
1015 1015
 				$a['extension'] = $extension;
1016
-				$a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $extension);
1016
+				$a['fichier'] = _DIR_RACINE.nom_fichier_copie_locale($source, $extension);
1017 1017
 				ecrire_fichier($a['fichier'], $a['body']);
1018 1018
 				$size_image = @spip_getimagesize($a['fichier']);
1019 1019
 				$a['largeur'] = intval($size_image[0]);
@@ -1081,20 +1081,20 @@  discard block
 block discarded – undo
1081 1081
 			!$t
1082 1082
 			and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext)
1083 1083
 		) {
1084
-			$t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1084
+			$t = sql_fetsel('extension', 'spip_types_documents', 'extension='.sql_quote(corriger_extension($rext[1]), '', 'text'));
1085 1085
 		}
1086 1086
 		if (
1087 1087
 			!$t
1088 1088
 			and preg_match(',^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims', $headers, $m)
1089 1089
 			and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $m[1], $rext)
1090 1090
 		) {
1091
-			$t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1091
+			$t = sql_fetsel('extension', 'spip_types_documents', 'extension='.sql_quote(corriger_extension($rext[1]), '', 'text'));
1092 1092
 		}
1093 1093
 	}
1094 1094
 
1095 1095
 	// Autre mime/type (ou text/plain avec fichier d'extension inconnue)
1096 1096
 	if (!$t) {
1097
-		$t = sql_fetsel('extension', 'spip_types_documents', 'mime_type=' . sql_quote($mime_type));
1097
+		$t = sql_fetsel('extension', 'spip_types_documents', 'mime_type='.sql_quote($mime_type));
1098 1098
 	}
1099 1099
 
1100 1100
 	// Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg)
@@ -1105,11 +1105,11 @@  discard block
 block discarded – undo
1105 1105
 		and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext)
1106 1106
 	) {
1107 1107
 		# eviter xxx.3 => 3gp (> SPIP 3)
1108
-		$t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text'));
1108
+		$t = sql_fetsel('extension', 'spip_types_documents', 'extension='.sql_quote(corriger_extension($rext[1]), '', 'text'));
1109 1109
 	}
1110 1110
 
1111 1111
 	if ($t) {
1112
-		spip_log("mime-type $mime_type ok, extension " . $t['extension'], 'distant');
1112
+		spip_log("mime-type $mime_type ok, extension ".$t['extension'], 'distant');
1113 1113
 		return $t['extension'];
1114 1114
 	} else {
1115 1115
 		# par defaut on retombe sur '.bin' si c'est autorise
@@ -1212,7 +1212,7 @@  discard block
 block discarded – undo
1212 1212
 		}
1213 1213
 	} else {
1214 1214
 		$scheme = $t['scheme'];
1215
-		$noproxy = $scheme . '://';
1215
+		$noproxy = $scheme.'://';
1216 1216
 	}
1217 1217
 	if (isset($t['user'])) {
1218 1218
 		$user = [$t['user'], $t['pass']];
@@ -1226,7 +1226,7 @@  discard block
 block discarded – undo
1226 1226
 	}
1227 1227
 
1228 1228
 	if (!empty($t['query'])) {
1229
-		$path .= '?' . $t['query'];
1229
+		$path .= '?'.$t['query'];
1230 1230
 	}
1231 1231
 
1232 1232
 	$f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, $date);
@@ -1300,29 +1300,29 @@  discard block
 block discarded – undo
1300 1300
 	$proxy_user = '';
1301 1301
 	$http_proxy = need_proxy($host);
1302 1302
 	if ($user) {
1303
-		$user = urlencode($user[0]) . ':' . urlencode($user[1]);
1303
+		$user = urlencode($user[0]).':'.urlencode($user[1]);
1304 1304
 	}
1305 1305
 
1306 1306
 	$connect = '';
1307 1307
 	if ($http_proxy) {
1308
-		if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls','ssl'])) {
1309
-			$path_host = (!$user ? '' : "$user@") . $host . (($port != 80) ? ":$port" : '');
1310
-			$connect = 'CONNECT ' . $path_host . " $vers\r\n"
1308
+		if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls', 'ssl'])) {
1309
+			$path_host = (!$user ? '' : "$user@").$host.(($port != 80) ? ":$port" : '');
1310
+			$connect = 'CONNECT '.$path_host." $vers\r\n"
1311 1311
 				. "Host: $path_host\r\n"
1312 1312
 				. "Proxy-Connection: Keep-Alive\r\n";
1313 1313
 		} else {
1314
-			$path = (in_array($scheme, ['tls','ssl']) ? 'https://' : "$scheme://")
1314
+			$path = (in_array($scheme, ['tls', 'ssl']) ? 'https://' : "$scheme://")
1315 1315
 				. (!$user ? '' : "$user@")
1316
-				. "$host" . (($port != 80) ? ":$port" : '') . $path;
1316
+				. "$host".(($port != 80) ? ":$port" : '').$path;
1317 1317
 		}
1318 1318
 		$t2 = @parse_url($http_proxy);
1319 1319
 		$first_host = $t2['host'];
1320 1320
 		$port = ($t2['port'] ?? null) ?: 80;
1321 1321
 		if ($t2['user'] ?? null) {
1322
-			$proxy_user = base64_encode($t2['user'] . ':' . $t2['pass']);
1322
+			$proxy_user = base64_encode($t2['user'].':'.$t2['pass']);
1323 1323
 		}
1324 1324
 	} else {
1325
-		$first_host = $noproxy . $host;
1325
+		$first_host = $noproxy.$host;
1326 1326
 	}
1327 1327
 
1328 1328
 	if ($connect) {
@@ -1344,7 +1344,7 @@  discard block
 block discarded – undo
1344 1344
 		);
1345 1345
 		spip_log("Recuperer $path sur $first_host:$port par $f (via CONNECT)", 'connect');
1346 1346
 		if (!$f) {
1347
-			spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR);
1347
+			spip_log("Erreur connexion $errno $errstr", 'distant'._LOG_ERREUR);
1348 1348
 			return $errno;
1349 1349
 		}
1350 1350
 		stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT);
@@ -1357,7 +1357,7 @@  discard block
 block discarded – undo
1357 1357
 			or !count($res = explode(' ', $res))
1358 1358
 			or $res[1] !== '200'
1359 1359
 		) {
1360
-			spip_log("Echec CONNECT sur $first_host:$port", 'connect' . _LOG_INFO_IMPORTANTE);
1360
+			spip_log("Echec CONNECT sur $first_host:$port", 'connect'._LOG_INFO_IMPORTANTE);
1361 1361
 			fclose($f);
1362 1362
 
1363 1363
 			return false;
@@ -1374,7 +1374,7 @@  discard block
 block discarded – undo
1374 1374
 		} while (!$f and $ntry-- and $errno !== 110 and sleep(1));
1375 1375
 		spip_log("Recuperer $path sur $first_host:$port par $f");
1376 1376
 		if (!$f) {
1377
-			spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR);
1377
+			spip_log("Erreur connexion $errno $errstr", 'distant'._LOG_ERREUR);
1378 1378
 
1379 1379
 			return $errno;
1380 1380
 		}
@@ -1384,16 +1384,16 @@  discard block
 block discarded – undo
1384 1384
 	$site = $GLOBALS['meta']['adresse_site'] ?? '';
1385 1385
 
1386 1386
 	$host_port = $host;
1387
-	if ($port != (in_array($scheme, ['tls','ssl']) ? 443 : 80)) {
1387
+	if ($port != (in_array($scheme, ['tls', 'ssl']) ? 443 : 80)) {
1388 1388
 		$host_port .= ":$port";
1389 1389
 	}
1390 1390
 	$req = "$method $path $vers\r\n"
1391 1391
 		. "Host: $host_port\r\n"
1392
-		. 'User-Agent: ' . _INC_DISTANT_USER_AGENT . "\r\n"
1393
-		. ($refuse_gz ? '' : ('Accept-Encoding: ' . _INC_DISTANT_CONTENT_ENCODING . "\r\n"))
1392
+		. 'User-Agent: '._INC_DISTANT_USER_AGENT."\r\n"
1393
+		. ($refuse_gz ? '' : ('Accept-Encoding: '._INC_DISTANT_CONTENT_ENCODING."\r\n"))
1394 1394
 		. (!$site ? '' : "Referer: $site/$referer\r\n")
1395
-		. (!$date ? '' : 'If-Modified-Since: ' . (gmdate('D, d M Y H:i:s', $date) . " GMT\r\n"))
1396
-		. (!$user ? '' : ('Authorization: Basic ' . base64_encode($user) . "\r\n"))
1395
+		. (!$date ? '' : 'If-Modified-Since: '.(gmdate('D, d M Y H:i:s', $date)." GMT\r\n"))
1396
+		. (!$user ? '' : ('Authorization: Basic '.base64_encode($user)."\r\n"))
1397 1397
 		. (!$proxy_user ? '' : "Proxy-Authorization: Basic $proxy_user\r\n")
1398 1398
 		. (!strpos($vers, '1.1') ? '' : "Keep-Alive: 300\r\nConnection: keep-alive\r\n");
1399 1399
 
Please login to merge, or discard this patch.
ecrire/balise/formulaire_.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -147,7 +147,7 @@  discard block
 block discarded – undo
147 147
 		// donc si on est dans le public avec un cache on va perdre le dynamisme
148 148
 		// et on risque de mettre en cache les valeurs pre-remplies du formulaire
149 149
 		// on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
150
-		$p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'";
150
+		$p->code = "'<'.'?php echo (".texte_script($p->code)."); ?'.'>'";
151 151
 		// dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)
152 152
 	}
153 153
 	return $p;
@@ -327,7 +327,7 @@  discard block
 block discarded – undo
327 327
 			foreach ($erreurs as $k => $v) {
328 328
 				if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) {
329 329
 					// on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form
330
-					$valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>';
330
+					$valeurs['erreurs'][$k] = "<span role='alert'>".$erreurs[$k].'</span>';
331 331
 				}
332 332
 			}
333 333
 		}
Please login to merge, or discard this patch.
Indentation   +266 added lines, -266 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Formulaires
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 include_spip('inc/filtres');
@@ -35,22 +35,22 @@  discard block
 block discarded – undo
35 35
  *     Saisie protégée
36 36
  **/
37 37
 function protege_champ($texte) {
38
-	if (is_array($texte)) {
39
-		return array_map('protege_champ', $texte);
40
-	} elseif ($texte === null) {
41
-		return $texte;
42
-	} elseif (is_bool($texte)) {
43
-		return $texte ? '1' : '';
44
-	} elseif (is_string($texte) and $texte) {
45
-		if (preg_match(',^[abis]:\d+[:;],', $texte) and @unserialize($texte) !== false) {
46
-			// ne pas corrompre une valeur serialize
47
-			return $texte;
48
-		} elseif (strpbrk($texte, "&\"'<>") !== false) {
49
-			return spip_htmlspecialchars($texte, ENT_QUOTES);
50
-		}
51
-	}
52
-
53
-	return $texte;
38
+    if (is_array($texte)) {
39
+        return array_map('protege_champ', $texte);
40
+    } elseif ($texte === null) {
41
+        return $texte;
42
+    } elseif (is_bool($texte)) {
43
+        return $texte ? '1' : '';
44
+    } elseif (is_string($texte) and $texte) {
45
+        if (preg_match(',^[abis]:\d+[:;],', $texte) and @unserialize($texte) !== false) {
46
+            // ne pas corrompre une valeur serialize
47
+            return $texte;
48
+        } elseif (strpbrk($texte, "&\"'<>") !== false) {
49
+            return spip_htmlspecialchars($texte, ENT_QUOTES);
50
+        }
51
+    }
52
+
53
+    return $texte;
54 54
 }
55 55
 
56 56
 /**
@@ -64,17 +64,17 @@  discard block
 block discarded – undo
64 64
  *     - false : pas de squelette trouvé
65 65
  **/
66 66
 function existe_formulaire($form) {
67
-	if (substr($form, 0, 11) == 'FORMULAIRE_') {
68
-		$form = strtolower(substr($form, 11));
69
-	} else {
70
-		$form = strtolower($form);
71
-	}
67
+    if (substr($form, 0, 11) == 'FORMULAIRE_') {
68
+        $form = strtolower(substr($form, 11));
69
+    } else {
70
+        $form = strtolower($form);
71
+    }
72 72
 
73
-	if (!$form) {
74
-		return '';
75
-	} // on ne sait pas, le nom du formulaire n'est pas fourni ici
73
+    if (!$form) {
74
+        return '';
75
+    } // on ne sait pas, le nom du formulaire n'est pas fourni ici
76 76
 
77
-	return trouver_fond($form, 'formulaires/') ? $form : false;
77
+    return trouver_fond($form, 'formulaires/') ? $form : false;
78 78
 }
79 79
 
80 80
 /**
@@ -83,31 +83,31 @@  discard block
 block discarded – undo
83 83
  * @return false|array
84 84
  */
85 85
 function test_formulaire_inclus_par_modele() {
86
-	$trace = debug_backtrace(0, 20);
87
-	$trace_fonctions = array_column($trace, 'function');
88
-	$trace_fonctions = array_map('strtolower', $trace_fonctions);
89
-
90
-	// regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn
91
-	if (
92
-		function_exists('arguments_balise_dyn_depuis_modele')
93
-		and $form = arguments_balise_dyn_depuis_modele(null, 'read')
94
-	) {
95
-		if (in_array('balise_formulaire__dyn', $trace_fonctions)) {
96
-			$k = array_search('balise_formulaire__dyn', $trace_fonctions);
97
-			if ($trace[$k]['args'][0] === $form) {
98
-				return $trace[$k]['args'];
99
-			}
100
-		}
101
-	}
102
-
103
-	// fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil,
104
-	// mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette
105
-	if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) {
106
-		$k = array_search('inclure_modele', $trace_fonctions);
107
-		// les arguments de recuperer_fond() passes par inclure_modele()
108
-		return $trace[$k - 1]['args'][1]['args'];
109
-	}
110
-	return false;
86
+    $trace = debug_backtrace(0, 20);
87
+    $trace_fonctions = array_column($trace, 'function');
88
+    $trace_fonctions = array_map('strtolower', $trace_fonctions);
89
+
90
+    // regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn
91
+    if (
92
+        function_exists('arguments_balise_dyn_depuis_modele')
93
+        and $form = arguments_balise_dyn_depuis_modele(null, 'read')
94
+    ) {
95
+        if (in_array('balise_formulaire__dyn', $trace_fonctions)) {
96
+            $k = array_search('balise_formulaire__dyn', $trace_fonctions);
97
+            if ($trace[$k]['args'][0] === $form) {
98
+                return $trace[$k]['args'];
99
+            }
100
+        }
101
+    }
102
+
103
+    // fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil,
104
+    // mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette
105
+    if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) {
106
+        $k = array_search('inclure_modele', $trace_fonctions);
107
+        // les arguments de recuperer_fond() passes par inclure_modele()
108
+        return $trace[$k - 1]['args'][1]['args'];
109
+    }
110
+    return false;
111 111
 }
112 112
 
113 113
 /**
@@ -122,32 +122,32 @@  discard block
 block discarded – undo
122 122
  **/
123 123
 function balise_FORMULAIRE__dist($p) {
124 124
 
125
-	// Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide.
126
-	// mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer
127
-	if (existe_formulaire($p->nom_champ) === false) {
128
-		$p->code = "''";
129
-		$p->interdire_scripts = false;
130
-
131
-		return $p;
132
-	}
133
-
134
-	// sinon renvoyer un code php dynamique
135
-	$p = calculer_balise_dynamique($p, $p->nom_champ, []);
136
-
137
-	if (
138
-		!test_espace_prive()
139
-		and !empty($p->descr['sourcefile'])
140
-		and $f = $p->descr['sourcefile']
141
-		and basename(dirname($f)) === 'modeles'
142
-	) {
143
-		// un modele est toujours inséré en texte dans son contenant
144
-		// donc si on est dans le public avec un cache on va perdre le dynamisme
145
-		// et on risque de mettre en cache les valeurs pre-remplies du formulaire
146
-		// on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
147
-		$p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'";
148
-		// dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)
149
-	}
150
-	return $p;
125
+    // Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide.
126
+    // mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer
127
+    if (existe_formulaire($p->nom_champ) === false) {
128
+        $p->code = "''";
129
+        $p->interdire_scripts = false;
130
+
131
+        return $p;
132
+    }
133
+
134
+    // sinon renvoyer un code php dynamique
135
+    $p = calculer_balise_dynamique($p, $p->nom_champ, []);
136
+
137
+    if (
138
+        !test_espace_prive()
139
+        and !empty($p->descr['sourcefile'])
140
+        and $f = $p->descr['sourcefile']
141
+        and basename(dirname($f)) === 'modeles'
142
+    ) {
143
+        // un modele est toujours inséré en texte dans son contenant
144
+        // donc si on est dans le public avec un cache on va perdre le dynamisme
145
+        // et on risque de mettre en cache les valeurs pre-remplies du formulaire
146
+        // on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
147
+        $p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'";
148
+        // dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)
149
+    }
150
+    return $p;
151 151
 }
152 152
 
153 153
 /**
@@ -167,17 +167,17 @@  discard block
 block discarded – undo
167 167
  *     - string : texte à afficher directement
168 168
  */
169 169
 function balise_FORMULAIRE__dyn($form, ...$args) {
170
-	$form = existe_formulaire($form);
171
-	if (!$form) {
172
-		return '';
173
-	}
170
+    $form = existe_formulaire($form);
171
+    if (!$form) {
172
+        return '';
173
+    }
174 174
 
175
-	$contexte = balise_FORMULAIRE__contexte($form, $args);
176
-	if (!is_array($contexte)) {
177
-		return $contexte;
178
-	}
175
+    $contexte = balise_FORMULAIRE__contexte($form, $args);
176
+    if (!is_array($contexte)) {
177
+        return $contexte;
178
+    }
179 179
 
180
-	return ["formulaires/$form", 3600, $contexte];
180
+    return ["formulaires/$form", 3600, $contexte];
181 181
 }
182 182
 
183 183
 /**
@@ -192,84 +192,84 @@  discard block
 block discarded – undo
192 192
  *     string: Formulaire non applicable (message d’explication)
193 193
  **/
194 194
 function balise_FORMULAIRE__contexte($form, $args) {
195
-	// tester si ce formulaire vient d'etre poste (memes arguments)
196
-	// pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page
197
-	// si poste, on recupere les erreurs
198
-
199
-	$je_suis_poste = false;
200
-	if (
201
-		$post_form = _request('formulaire_action')
202
-		and $post_form == $form
203
-		and $p = _request('formulaire_action_args')
204
-		and is_array($p = decoder_contexte_ajax($p, $post_form))
205
-	) {
206
-		// enlever le faux attribut de langue masque
207
-		array_shift($p);
208
-		if (formulaire__identifier($form, $args, $p)) {
209
-			$je_suis_poste = true;
210
-		}
211
-	}
212
-
213
-	$editable = true;
214
-	$erreurs = $post = [];
215
-	if ($je_suis_poste) {
216
-		$post = traiter_formulaires_dynamiques(true);
217
-		$e = "erreurs_$form";
218
-		$erreurs = $post[$e] ?? [];
219
-		$editable = "editable_$form";
220
-		$editable = (!isset($post[$e]))
221
-			|| (is_countable($erreurs) ? count($erreurs) : 0)
222
-			|| (isset($post[$editable]) && $post[$editable]);
223
-	}
224
-
225
-	$valeurs = formulaire__charger($form, $args, $je_suis_poste);
226
-
227
-	// si $valeurs n'est pas un tableau, le formulaire n'est pas applicable
228
-	// C'est plus fort qu'editable qui est gere par le squelette
229
-	// Idealement $valeur doit etre alors un message explicatif.
230
-	if (!is_array($valeurs)) {
231
-		return is_string($valeurs) ? $valeurs : '';
232
-	}
233
-
234
-	// charger peut passer une action si le formulaire ne tourne pas sur self()
235
-	// ou une action vide si elle ne sert pas
236
-	$action = $valeurs['action'] ?? self('&amp;', true);
237
-	// bug IEx : si action finit par /
238
-	// IE croit que le <form ... action=../ > est autoferme
239
-	if (substr($action, -1) == '/') {
240
-		// on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un /
241
-		$action .= '#';
242
-	}
243
-
244
-	// recuperer la saisie en cours si erreurs
245
-	// seulement si c'est ce formulaire qui est poste
246
-	// ou si on le demande explicitement par le parametre _forcer_request = true
247
-	$dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']));
248
-	foreach (array_keys($valeurs) as $champ) {
249
-		if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) {
250
-			if ($dispo and (($v = _request($champ)) !== null)) {
251
-				$valeurs[$champ] = $v;
252
-			}
253
-			// nettoyer l'url des champs qui vont etre saisis
254
-			if ($action) {
255
-				$action = parametre_url($action, $champ, '');
256
-			}
257
-			// proteger les ' et les " dans les champs que l'on va injecter
258
-			$valeurs[$champ] = protege_champ($valeurs[$champ]);
259
-		}
260
-	}
261
-
262
-	if ($action) {
263
-		// nettoyer l'url
264
-		$action = parametre_url($action, 'formulaire_action', '');
265
-		$action = parametre_url($action, 'formulaire_action_args', '');
266
-	}
267
-
268
-	/**
269
-	 * @deprecated 4.0
270
-	 * servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide
271
-	 */
272
-	/*
195
+    // tester si ce formulaire vient d'etre poste (memes arguments)
196
+    // pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page
197
+    // si poste, on recupere les erreurs
198
+
199
+    $je_suis_poste = false;
200
+    if (
201
+        $post_form = _request('formulaire_action')
202
+        and $post_form == $form
203
+        and $p = _request('formulaire_action_args')
204
+        and is_array($p = decoder_contexte_ajax($p, $post_form))
205
+    ) {
206
+        // enlever le faux attribut de langue masque
207
+        array_shift($p);
208
+        if (formulaire__identifier($form, $args, $p)) {
209
+            $je_suis_poste = true;
210
+        }
211
+    }
212
+
213
+    $editable = true;
214
+    $erreurs = $post = [];
215
+    if ($je_suis_poste) {
216
+        $post = traiter_formulaires_dynamiques(true);
217
+        $e = "erreurs_$form";
218
+        $erreurs = $post[$e] ?? [];
219
+        $editable = "editable_$form";
220
+        $editable = (!isset($post[$e]))
221
+            || (is_countable($erreurs) ? count($erreurs) : 0)
222
+            || (isset($post[$editable]) && $post[$editable]);
223
+    }
224
+
225
+    $valeurs = formulaire__charger($form, $args, $je_suis_poste);
226
+
227
+    // si $valeurs n'est pas un tableau, le formulaire n'est pas applicable
228
+    // C'est plus fort qu'editable qui est gere par le squelette
229
+    // Idealement $valeur doit etre alors un message explicatif.
230
+    if (!is_array($valeurs)) {
231
+        return is_string($valeurs) ? $valeurs : '';
232
+    }
233
+
234
+    // charger peut passer une action si le formulaire ne tourne pas sur self()
235
+    // ou une action vide si elle ne sert pas
236
+    $action = $valeurs['action'] ?? self('&amp;', true);
237
+    // bug IEx : si action finit par /
238
+    // IE croit que le <form ... action=../ > est autoferme
239
+    if (substr($action, -1) == '/') {
240
+        // on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un /
241
+        $action .= '#';
242
+    }
243
+
244
+    // recuperer la saisie en cours si erreurs
245
+    // seulement si c'est ce formulaire qui est poste
246
+    // ou si on le demande explicitement par le parametre _forcer_request = true
247
+    $dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']));
248
+    foreach (array_keys($valeurs) as $champ) {
249
+        if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) {
250
+            if ($dispo and (($v = _request($champ)) !== null)) {
251
+                $valeurs[$champ] = $v;
252
+            }
253
+            // nettoyer l'url des champs qui vont etre saisis
254
+            if ($action) {
255
+                $action = parametre_url($action, $champ, '');
256
+            }
257
+            // proteger les ' et les " dans les champs que l'on va injecter
258
+            $valeurs[$champ] = protege_champ($valeurs[$champ]);
259
+        }
260
+    }
261
+
262
+    if ($action) {
263
+        // nettoyer l'url
264
+        $action = parametre_url($action, 'formulaire_action', '');
265
+        $action = parametre_url($action, 'formulaire_action_args', '');
266
+    }
267
+
268
+    /**
269
+     * @deprecated 4.0
270
+     * servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide
271
+     */
272
+    /*
273 273
 	if (isset($valeurs['_action'])) {
274 274
 		$securiser_action = charger_fonction('securiser_action', 'inc');
275 275
 		$secu = $securiser_action(reset($valeurs['_action']), end($valeurs['_action']), '', -1);
@@ -279,59 +279,59 @@  discard block
 block discarded – undo
279 279
 	}
280 280
 	*/
281 281
 
282
-	// empiler la lang en tant que premier argument implicite du CVT
283
-	// pour permettre de la restaurer au moment du Verifier et du Traiter
284
-	array_unshift($args, $GLOBALS['spip_lang']);
285
-
286
-	$valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form);
287
-	$valeurs['erreurs'] = $erreurs;
288
-	$valeurs['action'] = $action;
289
-	$valeurs['form'] = $form;
290
-
291
-	$valeurs['formulaire_sign'] = '';
292
-	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
293
-		$securiser_action = charger_fonction('securiser_action', 'inc');
294
-		$secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1);
295
-		$valeurs['formulaire_sign'] = $secu['hash'];
296
-	}
297
-
298
-	if (!isset($valeurs['id'])) {
299
-		$valeurs['id'] = 'new';
300
-	}
301
-	// editable peut venir de charger() ou de traiter() sinon
302
-	if (!isset($valeurs['editable'])) {
303
-		$valeurs['editable'] = $editable;
304
-	}
305
-	// dans tous les cas, renvoyer un espace ou vide (et pas un booleen)
306
-	$valeurs['editable'] = ($valeurs['editable'] ? ' ' : '');
307
-
308
-	if ($je_suis_poste) {
309
-		$valeurs['message_erreur'] = '';
310
-		if (isset($erreurs['message_erreur'])) {
311
-			$valeurs['message_erreur'] = $erreurs['message_erreur'];
312
-		}
313
-
314
-		$valeurs['message_ok'] = '';
315
-		if (isset($post["message_ok_$form"])) {
316
-			$valeurs['message_ok'] = $post["message_ok_$form"];
317
-		} elseif (isset($erreurs['message_ok'])) {
318
-			$valeurs['message_ok'] = $erreurs['message_ok'];
319
-		}
320
-
321
-		// accessibilite : encapsuler toutes les erreurs dans un role='alert'
322
-		// uniquement si c'est une string et au premier niveau (on ne touche pas au tableaux)
323
-		// et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ)
324
-		if (html5_permis()) {
325
-			foreach ($erreurs as $k => $v) {
326
-				if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) {
327
-					// on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form
328
-					$valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>';
329
-				}
330
-			}
331
-		}
332
-	}
333
-
334
-	return $valeurs;
282
+    // empiler la lang en tant que premier argument implicite du CVT
283
+    // pour permettre de la restaurer au moment du Verifier et du Traiter
284
+    array_unshift($args, $GLOBALS['spip_lang']);
285
+
286
+    $valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form);
287
+    $valeurs['erreurs'] = $erreurs;
288
+    $valeurs['action'] = $action;
289
+    $valeurs['form'] = $form;
290
+
291
+    $valeurs['formulaire_sign'] = '';
292
+    if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
293
+        $securiser_action = charger_fonction('securiser_action', 'inc');
294
+        $secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1);
295
+        $valeurs['formulaire_sign'] = $secu['hash'];
296
+    }
297
+
298
+    if (!isset($valeurs['id'])) {
299
+        $valeurs['id'] = 'new';
300
+    }
301
+    // editable peut venir de charger() ou de traiter() sinon
302
+    if (!isset($valeurs['editable'])) {
303
+        $valeurs['editable'] = $editable;
304
+    }
305
+    // dans tous les cas, renvoyer un espace ou vide (et pas un booleen)
306
+    $valeurs['editable'] = ($valeurs['editable'] ? ' ' : '');
307
+
308
+    if ($je_suis_poste) {
309
+        $valeurs['message_erreur'] = '';
310
+        if (isset($erreurs['message_erreur'])) {
311
+            $valeurs['message_erreur'] = $erreurs['message_erreur'];
312
+        }
313
+
314
+        $valeurs['message_ok'] = '';
315
+        if (isset($post["message_ok_$form"])) {
316
+            $valeurs['message_ok'] = $post["message_ok_$form"];
317
+        } elseif (isset($erreurs['message_ok'])) {
318
+            $valeurs['message_ok'] = $erreurs['message_ok'];
319
+        }
320
+
321
+        // accessibilite : encapsuler toutes les erreurs dans un role='alert'
322
+        // uniquement si c'est une string et au premier niveau (on ne touche pas au tableaux)
323
+        // et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ)
324
+        if (html5_permis()) {
325
+            foreach ($erreurs as $k => $v) {
326
+                if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) {
327
+                    // on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form
328
+                    $valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>';
329
+                }
330
+            }
331
+        }
332
+    }
333
+
334
+    return $valeurs;
335 335
 }
336 336
 
337 337
 /**
@@ -343,51 +343,51 @@  discard block
 block discarded – undo
343 343
  * @return array
344 344
  */
345 345
 function formulaire__charger($form, $args, $poste) {
346
-	if ($charger_valeurs = charger_fonction('charger', "formulaires/$form", true)) {
347
-		$valeurs = call_user_func_array($charger_valeurs, $args);
348
-	} else {
349
-		$valeurs = [];
350
-	}
351
-
352
-	$valeurs = pipeline(
353
-		'formulaire_charger',
354
-		[
355
-			'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
356
-			'data' => $valeurs
357
-		]
358
-	);
359
-
360
-	// prise en charge CVT multi etape
361
-	if (is_array($valeurs) and isset($valeurs['_etapes'])) {
362
-		include_spip('inc/cvt_multietapes');
363
-		$valeurs = cvtmulti_formulaire_charger_etapes(
364
-			['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
365
-			$valeurs
366
-		);
367
-	}
368
-
369
-	// si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline !
370
-	if (is_array($valeurs)) {
371
-		if (!isset($valeurs['_pipelines'])) {
372
-			$valeurs['_pipelines'] = [];
373
-		}
374
-		// l'ancien argument _pipeline devient maintenant _pipelines
375
-		// reinjectons le vieux _pipeline au debut de _pipelines
376
-		if (isset($valeurs['_pipeline'])) {
377
-			$pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline'];
378
-			$args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : [];
379
-
380
-			$pipelines = [$pipe => $args];
381
-			$valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']);
382
-		}
383
-
384
-		// et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire
385
-		// qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond
386
-		// (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes)
387
-		$valeurs['_pipelines']['formulaire_fond'] = ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste];
388
-	}
389
-
390
-	return $valeurs;
346
+    if ($charger_valeurs = charger_fonction('charger', "formulaires/$form", true)) {
347
+        $valeurs = call_user_func_array($charger_valeurs, $args);
348
+    } else {
349
+        $valeurs = [];
350
+    }
351
+
352
+    $valeurs = pipeline(
353
+        'formulaire_charger',
354
+        [
355
+            'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
356
+            'data' => $valeurs
357
+        ]
358
+    );
359
+
360
+    // prise en charge CVT multi etape
361
+    if (is_array($valeurs) and isset($valeurs['_etapes'])) {
362
+        include_spip('inc/cvt_multietapes');
363
+        $valeurs = cvtmulti_formulaire_charger_etapes(
364
+            ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
365
+            $valeurs
366
+        );
367
+    }
368
+
369
+    // si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline !
370
+    if (is_array($valeurs)) {
371
+        if (!isset($valeurs['_pipelines'])) {
372
+            $valeurs['_pipelines'] = [];
373
+        }
374
+        // l'ancien argument _pipeline devient maintenant _pipelines
375
+        // reinjectons le vieux _pipeline au debut de _pipelines
376
+        if (isset($valeurs['_pipeline'])) {
377
+            $pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline'];
378
+            $args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : [];
379
+
380
+            $pipelines = [$pipe => $args];
381
+            $valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']);
382
+        }
383
+
384
+        // et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire
385
+        // qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond
386
+        // (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes)
387
+        $valeurs['_pipelines']['formulaire_fond'] = ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste];
388
+    }
389
+
390
+    return $valeurs;
391 391
 }
392 392
 
393 393
 /**
@@ -406,9 +406,9 @@  discard block
 block discarded – undo
406 406
  * @return bool
407 407
  */
408 408
 function formulaire__identifier($form, $args, $p) {
409
-	if ($identifier_args = charger_fonction('identifier', "formulaires/$form", true)) {
410
-		return call_user_func_array($identifier_args, $args) === call_user_func_array($identifier_args, $p);
411
-	}
409
+    if ($identifier_args = charger_fonction('identifier', "formulaires/$form", true)) {
410
+        return call_user_func_array($identifier_args, $args) === call_user_func_array($identifier_args, $p);
411
+    }
412 412
 
413
-	return $args === $p;
413
+    return $args === $p;
414 414
 }
Please login to merge, or discard this patch.
ecrire/public/interfaces.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -975,9 +975,9 @@
 block discarded – undo
975 975
 	if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976 976
 		define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977 977
 	}
978
-	$GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')';
978
+	$GLOBALS['table_des_traitements']['BIO'][] = 'safehtml('._TRAITEMENT_RACCOURCIS.')';
979 979
 	$GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)';
980
-	$GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')';
980
+	$GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml('._TRAITEMENT_TYPO_SANS_NUMERO.')';
981 981
 	$GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
982 982
 	$GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
983 983
 	$GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
Please login to merge, or discard this patch.
Indentation   +916 added lines, -916 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
 
@@ -34,53 +34,53 @@  discard block
 block discarded – undo
34 34
  * @package SPIP\Core\Compilateur\AST
35 35
  */
36 36
 class Contexte {
37
-	/**
38
-	 * Description du squelette
39
-	 *
40
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
-	 *
42
-	 * Peut contenir les index :
43
-	 *
44
-	 * - nom : Nom du fichier de cache
45
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
-	 * - sourcefile : Chemin du squelette
47
-	 * - squelette : Code du squelette
48
-	 * - id_mere : Identifiant de la boucle parente
49
-	 * - documents : Pour embed et img dans les textes
50
-	 * - session : Pour un cache sessionné par auteur
51
-	 * - niv : Niveau de tabulation
52
-	 *
53
-	 * @var array
54
-	 */
55
-	public $descr = [];
56
-
57
-	/**
58
-	 * Identifiant de la boucle
59
-	 *
60
-	 * @var string
61
-	 */
62
-	public $id_boucle = '';
63
-
64
-	/**
65
-	 * Numéro de ligne dans le code source du squelette
66
-	 *
67
-	 * @var int
68
-	 */
69
-	public $ligne = 0;
70
-
71
-	/**
72
-	 * Langue d'exécution
73
-	 *
74
-	 * @var string
75
-	 */
76
-	public $lang = '';
77
-
78
-	/**
79
-	 * Résultat de la compilation: toujours une expression PHP
80
-	 *
81
-	 * @var string
82
-	 */
83
-	public $code = '';
37
+    /**
38
+     * Description du squelette
39
+     *
40
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
+     *
42
+     * Peut contenir les index :
43
+     *
44
+     * - nom : Nom du fichier de cache
45
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
+     * - sourcefile : Chemin du squelette
47
+     * - squelette : Code du squelette
48
+     * - id_mere : Identifiant de la boucle parente
49
+     * - documents : Pour embed et img dans les textes
50
+     * - session : Pour un cache sessionné par auteur
51
+     * - niv : Niveau de tabulation
52
+     *
53
+     * @var array
54
+     */
55
+    public $descr = [];
56
+
57
+    /**
58
+     * Identifiant de la boucle
59
+     *
60
+     * @var string
61
+     */
62
+    public $id_boucle = '';
63
+
64
+    /**
65
+     * Numéro de ligne dans le code source du squelette
66
+     *
67
+     * @var int
68
+     */
69
+    public $ligne = 0;
70
+
71
+    /**
72
+     * Langue d'exécution
73
+     *
74
+     * @var string
75
+     */
76
+    public $lang = '';
77
+
78
+    /**
79
+     * Résultat de la compilation: toujours une expression PHP
80
+     *
81
+     * @var string
82
+     */
83
+    public $code = '';
84 84
 }
85 85
 
86 86
 
@@ -90,44 +90,44 @@  discard block
 block discarded – undo
90 90
  * @package SPIP\Core\Compilateur\AST
91 91
  **/
92 92
 class Texte {
93
-	/**
94
-	 * Type de noeud
95
-	 *
96
-	 * @var string
97
-	 */
98
-	public $type = 'texte';
99
-
100
-	/**
101
-	 * Le texte
102
-	 *
103
-	 * @var string
104
-	 */
105
-	public $texte;
106
-
107
-	/**
108
-	 * Contenu avant le texte.
109
-	 *
110
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
111
-	 *
112
-	 * @var string|array
113
-	 */
114
-	public $avant = '';
115
-
116
-	/**
117
-	 * Contenu après le texte.
118
-	 *
119
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
120
-	 *
121
-	 * @var string|array
122
-	 */
123
-	public $apres = '';
124
-
125
-	/**
126
-	 * Numéro de ligne dans le code source du squelette
127
-	 *
128
-	 * @var int
129
-	 */
130
-	public $ligne = 0;
93
+    /**
94
+     * Type de noeud
95
+     *
96
+     * @var string
97
+     */
98
+    public $type = 'texte';
99
+
100
+    /**
101
+     * Le texte
102
+     *
103
+     * @var string
104
+     */
105
+    public $texte;
106
+
107
+    /**
108
+     * Contenu avant le texte.
109
+     *
110
+     * Vide ou apostrophe simple ou double si le texte en était entouré
111
+     *
112
+     * @var string|array
113
+     */
114
+    public $avant = '';
115
+
116
+    /**
117
+     * Contenu après le texte.
118
+     *
119
+     * Vide ou apostrophe simple ou double si le texte en était entouré
120
+     *
121
+     * @var string|array
122
+     */
123
+    public $apres = '';
124
+
125
+    /**
126
+     * Numéro de ligne dans le code source du squelette
127
+     *
128
+     * @var int
129
+     */
130
+    public $ligne = 0;
131 131
 }
132 132
 
133 133
 /**
@@ -136,50 +136,50 @@  discard block
 block discarded – undo
136 136
  * @package SPIP\Core\Compilateur\AST
137 137
  **/
138 138
 class Inclure {
139
-	/**
140
-	 * Type de noeud
141
-	 *
142
-	 * @var string
143
-	 */
144
-	public $type = 'include';
145
-
146
-	/**
147
-	 * Nom d'un fichier inclu
148
-	 *
149
-	 * - Objet Texte si inclusion d'un autre squelette
150
-	 * - chaîne si inclusion d'un fichier PHP directement
151
-	 *
152
-	 * @var string|Texte
153
-	 */
154
-	public $texte;
155
-
156
-	/**
157
-	 * Inutilisé, propriété générique de l'AST
158
-	 *
159
-	 * @var string|array
160
-	 */
161
-	public $avant = '';
162
-
163
-	/**
164
-	 * Inutilisé, propriété générique de l'AST
165
-	 *
166
-	 * @var string|array
167
-	 */
168
-	public $apres = '';
169
-
170
-	/**
171
-	 * Numéro de ligne dans le code source du squelette
172
-	 *
173
-	 * @var int
174
-	 */
175
-	public $ligne = 0;
176
-
177
-	/**
178
-	 * Valeurs des paramètres
179
-	 *
180
-	 * @var array
181
-	 */
182
-	public $param = [];
139
+    /**
140
+     * Type de noeud
141
+     *
142
+     * @var string
143
+     */
144
+    public $type = 'include';
145
+
146
+    /**
147
+     * Nom d'un fichier inclu
148
+     *
149
+     * - Objet Texte si inclusion d'un autre squelette
150
+     * - chaîne si inclusion d'un fichier PHP directement
151
+     *
152
+     * @var string|Texte
153
+     */
154
+    public $texte;
155
+
156
+    /**
157
+     * Inutilisé, propriété générique de l'AST
158
+     *
159
+     * @var string|array
160
+     */
161
+    public $avant = '';
162
+
163
+    /**
164
+     * Inutilisé, propriété générique de l'AST
165
+     *
166
+     * @var string|array
167
+     */
168
+    public $apres = '';
169
+
170
+    /**
171
+     * Numéro de ligne dans le code source du squelette
172
+     *
173
+     * @var int
174
+     */
175
+    public $ligne = 0;
176
+
177
+    /**
178
+     * Valeurs des paramètres
179
+     *
180
+     * @var array
181
+     */
182
+    public $param = [];
183 183
 }
184 184
 
185 185
 
@@ -189,386 +189,386 @@  discard block
 block discarded – undo
189 189
  * @package SPIP\Core\Compilateur\AST
190 190
  **/
191 191
 class Boucle {
192
-	/**
193
-	 * Type de noeud
194
-	 *
195
-	 * @var string
196
-	 */
197
-	public $type = 'boucle';
198
-
199
-	/**
200
-	 * Identifiant de la boucle
201
-	 *
202
-	 * @var string
203
-	 */
204
-	public $id_boucle;
205
-
206
-	/**
207
-	 * Identifiant de la boucle parente
208
-	 *
209
-	 * @var string
210
-	 */
211
-	public $id_parent = '';
212
-
213
-	/**
214
-	 * Partie avant toujours affichee
215
-	 *
216
-	 * @var string|array
217
-	 */
218
-	public $preaff = '';
219
-
220
-	/**
221
-	 * Partie optionnelle avant
222
-	 *
223
-	 * @var string|array
224
-	 */
225
-	public $avant = '';
226
-
227
-	/**
228
-	 * Pour chaque élément
229
-	 *
230
-	 * @var string|array
231
-	 */
232
-	public $milieu = '';
233
-
234
-	/**
235
-	 * Partie optionnelle après
236
-	 *
237
-	 * @var string|array
238
-	 */
239
-	public $apres = '';
240
-
241
-	/**
242
-	 * Partie alternative, si pas de résultat dans la boucle
243
-	 *
244
-	 * @var string|array
245
-	 */
246
-	public $altern = '';
247
-
248
-	/**
249
-	 * Partie apres toujours affichee
250
-	 *
251
-	 * @var string|array
252
-	 */
253
-	public $postaff = '';
254
-
255
-
256
-	/**
257
-	 * La boucle doit-elle sélectionner la langue ?
258
-	 *
259
-	 * @var string|null
260
-	 */
261
-	public $lang_select;
262
-
263
-	/**
264
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
265
-	 *
266
-	 * @var string|null
267
-	 */
268
-	public $type_requete;
269
-
270
-	/**
271
-	 * La table est elle optionnelle ?
272
-	 *
273
-	 * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
274
-	 *
275
-	 * @var bool
276
-	 */
277
-	public $table_optionnelle = false;
278
-
279
-	/**
280
-	 * Nom du fichier de connexion
281
-	 *
282
-	 * @var string
283
-	 */
284
-	public $sql_serveur = '';
285
-
286
-	/**
287
-	 * Paramètres de la boucle
288
-	 *
289
-	 * Description des paramètres passés à la boucle, qui servent ensuite
290
-	 * au calcul des critères
291
-	 *
292
-	 * @var array
293
-	 */
294
-	public $param = [];
295
-
296
-	/**
297
-	 * Critères de la boucle
298
-	 *
299
-	 * @var Critere[]
300
-	 */
301
-	public $criteres = [];
302
-
303
-	/**
304
-	 * Textes insérés entre 2 éléments de boucle (critère inter)
305
-	 *
306
-	 * @var string[]
307
-	 */
308
-	public $separateur = [];
309
-
310
-	/**
311
-	 * Liste des jointures possibles avec cette table
312
-	 *
313
-	 * Les jointures par défaut de la table sont complétées en priorité
314
-	 * des jointures déclarées explicitement sur la boucle
315
-	 *
316
-	 * @see base_trouver_table_dist()
317
-	 * @var array
318
-	 */
319
-	public $jointures = [];
320
-
321
-	/**
322
-	 * Jointures explicites avec cette table
323
-	 *
324
-	 * Ces jointures sont utilisées en priorité par rapport aux jointures
325
-	 * normales possibles pour retrouver les colonnes demandées extérieures
326
-	 * à la boucle.
327
-	 *
328
-	 * @var string|bool
329
-	 */
330
-	public $jointures_explicites = false;
331
-
332
-	/**
333
-	 * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
334
-	 *
335
-	 * @var string|null
336
-	 */
337
-	public $doublons;
338
-
339
-	/**
340
-	 * Code PHP ajouté au début de chaque itération de boucle.
341
-	 *
342
-	 * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
343
-	 *
344
-	 * @var string
345
-	 */
346
-	public $partie = '';
347
-
348
-	/**
349
-	 * Nombre de divisions de la boucle, d'éléments à afficher,
350
-	 * ou de soustractions d'éléments à faire
351
-	 *
352
-	 * Dans les critères limitant le nombre d'éléments affichés
353
-	 * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
354
-	 *
355
-	 * @var string
356
-	 */
357
-	public $total_parties = '';
358
-
359
-	/**
360
-	 * Code PHP ajouté avant l'itération de boucle.
361
-	 *
362
-	 * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
363
-	 * pour initialiser les variables de début et de fin d'itération.
364
-	 *
365
-	 * @var string
366
-	 */
367
-	public $mode_partie = '';
368
-
369
-	/**
370
-	 * Identifiant d'une boucle qui appelle celle-ci de manière récursive
371
-	 *
372
-	 * Si une boucle est appelée de manière récursive quelque part par
373
-	 * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
374
-	 * boucle (identifiant) reçoit dans cette propriété l'identifiant
375
-	 * de l'appelant (rec)
376
-	 *
377
-	 * @var string
378
-	 */
379
-	public $externe = '';
380
-
381
-	// champs pour la construction de la requete SQL
382
-
383
-	/**
384
-	 * Liste des champs à récupérer par la boucle
385
-	 *
386
-	 * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
387
-	 *
388
-	 * @var string[]
389
-	 */
390
-	public $select = [];
391
-
392
-	/**
393
-	 * Liste des alias / tables SQL utilisées dans la boucle
394
-	 *
395
-	 * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
396
-	 * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
397
-	 *
398
-	 * L'index 0 peut définir le type de sources de données de l'itérateur DATA
399
-	 *
400
-	 * @var string[]
401
-	 */
402
-	public $from = [];
403
-
404
-	/**
405
-	 * Liste des alias / type de jointures utilisées dans la boucle
406
-	 *
407
-	 * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
408
-	 * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
409
-	 *
410
-	 * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
411
-	 * qui sera utilisé par défaut (créant donc un INNER JOIN).
412
-	 *
413
-	 * @var string[]
414
-	 */
415
-	public $from_type = [];
416
-
417
-	/**
418
-	 * Liste des conditions WHERE de la boucle
419
-	 *
420
-	 * Permet de restreindre les éléments retournés par une boucle
421
-	 * en fonctions des conditions transmises dans ce tableau.
422
-	 *
423
-	 * Ce tableau peut avoir plusieurs niveaux de profondeur.
424
-	 *
425
-	 * Les éléments du premier niveau sont reliés par des AND, donc
426
-	 * chaque élément ajouté directement au where par
427
-	 * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
428
-	 * est une condition AND en plus.
429
-	 *
430
-	 * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
431
-	 * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
432
-	 * $expr = array(operateur, val1, val2)
433
-	 *
434
-	 * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
435
-	 * à réaliser tel que :
436
-	 *
437
-	 * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
438
-	 *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
439
-	 *    suivant cet ordre : "val1 operateur val2".
440
-	 *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
441
-	 * - "'AND'", "'OR'", "'NOT'" :
442
-	 *    dans ce cas val1 et val2 sont également des expressions
443
-	 *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
444
-	 *    Exemples :
445
-	 *    $boucle->where[] = array("'OR'", $expr1, $expr2);
446
-	 *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
447
-	 *
448
-	 * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
449
-	 * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
450
-	 * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
451
-	 *
452
-	 * @var array
453
-	 */
454
-	public $where = [];
455
-
456
-	public $join = [];
457
-	public $having = [];
458
-	public $limit = '';
459
-	public $group = [];
460
-	public $order = [];
461
-	public $default_order = [];
462
-	public $date = 'date';
463
-	public $hash = '';
464
-	public $in = '';
465
-	public $sous_requete = false;
466
-
467
-	/**
468
-	 * Code PHP qui sera ajouté en tout début de la fonction de boucle
469
-	 *
470
-	 * Il sert à insérer le code calculant une hierarchie
471
-	 *
472
-	 * @var string
473
-	 */
474
-	public $hierarchie = '';
475
-
476
-	// champs pour la construction du corps PHP
477
-
478
-	/**
479
-	 * Description des sources de données de la boucle
480
-	 *
481
-	 * Description des données de la boucle issu de trouver_table
482
-	 * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
483
-	 *
484
-	 * @see base_trouver_table_dist()
485
-	 * @var array
486
-	 */
487
-	public $show = [];
488
-
489
-	/**
490
-	 * Nom de la table SQL principale de la boucle, sans son préfixe
491
-	 *
492
-	 * @var string
493
-	 */
494
-	public $id_table;
495
-
496
-	/**
497
-	 * Nom de la clé primaire de la table SQL principale de la boucle
498
-	 *
499
-	 * @var string
500
-	 */
501
-	public $primary;
502
-
503
-	/**
504
-	 * Code PHP compilé de la boucle
505
-	 *
506
-	 * @var string
507
-	 */
508
-	public $return;
509
-
510
-	public $numrows = false;
511
-	public $cptrows = false;
512
-
513
-	/**
514
-	 * Description du squelette
515
-	 *
516
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
517
-	 *
518
-	 * Peut contenir les index :
519
-	 *
520
-	 * - nom : Nom du fichier de cache
521
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
522
-	 * - sourcefile : Chemin du squelette
523
-	 * - squelette : Code du squelette
524
-	 * - id_mere : Identifiant de la boucle parente
525
-	 * - documents : Pour embed et img dans les textes
526
-	 * - session : Pour un cache sessionné par auteur
527
-	 * - niv : Niveau de tabulation
528
-	 *
529
-	 * @var array
530
-	 */
531
-	public $descr = [];
532
-
533
-	/**
534
-	 * Numéro de ligne dans le code source du squelette
535
-	 *
536
-	 * @var int
537
-	 */
538
-	public $ligne = 0;
539
-
540
-
541
-	public $modificateur = []; // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
542
-
543
-	/**
544
-	 * Type d'itérateur utilisé pour cette boucle
545
-	 *
546
-	 * - 'SQL' dans le cadre d'une boucle sur une table SQL
547
-	 * - 'DATA' pour l'itérateur DATA, ...
548
-	 *
549
-	 * @var string
550
-	 */
551
-	public $iterateur = ''; // type d'iterateur
552
-
553
-	/**
554
-	 * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
555
-	 */
556
-	public $debug = [];
557
-
558
-	/**
559
-	 * Index de la boucle dont le champ présent dans cette boucle est originaire,
560
-	 * notamment si le champ a été trouve dans une boucle parente
561
-	 *
562
-	 * Tableau nom du champ => index de boucle
563
-	 *
564
-	 * @var array $index_champ
565
-	*/
566
-	public $index_champ = [];
567
-
568
-	// obsoletes, conserves provisoirement pour compatibilite
569
-	public $tout = false;
570
-	public $plat = false;
571
-	public $lien = false;
192
+    /**
193
+     * Type de noeud
194
+     *
195
+     * @var string
196
+     */
197
+    public $type = 'boucle';
198
+
199
+    /**
200
+     * Identifiant de la boucle
201
+     *
202
+     * @var string
203
+     */
204
+    public $id_boucle;
205
+
206
+    /**
207
+     * Identifiant de la boucle parente
208
+     *
209
+     * @var string
210
+     */
211
+    public $id_parent = '';
212
+
213
+    /**
214
+     * Partie avant toujours affichee
215
+     *
216
+     * @var string|array
217
+     */
218
+    public $preaff = '';
219
+
220
+    /**
221
+     * Partie optionnelle avant
222
+     *
223
+     * @var string|array
224
+     */
225
+    public $avant = '';
226
+
227
+    /**
228
+     * Pour chaque élément
229
+     *
230
+     * @var string|array
231
+     */
232
+    public $milieu = '';
233
+
234
+    /**
235
+     * Partie optionnelle après
236
+     *
237
+     * @var string|array
238
+     */
239
+    public $apres = '';
240
+
241
+    /**
242
+     * Partie alternative, si pas de résultat dans la boucle
243
+     *
244
+     * @var string|array
245
+     */
246
+    public $altern = '';
247
+
248
+    /**
249
+     * Partie apres toujours affichee
250
+     *
251
+     * @var string|array
252
+     */
253
+    public $postaff = '';
254
+
255
+
256
+    /**
257
+     * La boucle doit-elle sélectionner la langue ?
258
+     *
259
+     * @var string|null
260
+     */
261
+    public $lang_select;
262
+
263
+    /**
264
+     * Alias de table d'application de la requête ou nom complet de la table SQL
265
+     *
266
+     * @var string|null
267
+     */
268
+    public $type_requete;
269
+
270
+    /**
271
+     * La table est elle optionnelle ?
272
+     *
273
+     * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
274
+     *
275
+     * @var bool
276
+     */
277
+    public $table_optionnelle = false;
278
+
279
+    /**
280
+     * Nom du fichier de connexion
281
+     *
282
+     * @var string
283
+     */
284
+    public $sql_serveur = '';
285
+
286
+    /**
287
+     * Paramètres de la boucle
288
+     *
289
+     * Description des paramètres passés à la boucle, qui servent ensuite
290
+     * au calcul des critères
291
+     *
292
+     * @var array
293
+     */
294
+    public $param = [];
295
+
296
+    /**
297
+     * Critères de la boucle
298
+     *
299
+     * @var Critere[]
300
+     */
301
+    public $criteres = [];
302
+
303
+    /**
304
+     * Textes insérés entre 2 éléments de boucle (critère inter)
305
+     *
306
+     * @var string[]
307
+     */
308
+    public $separateur = [];
309
+
310
+    /**
311
+     * Liste des jointures possibles avec cette table
312
+     *
313
+     * Les jointures par défaut de la table sont complétées en priorité
314
+     * des jointures déclarées explicitement sur la boucle
315
+     *
316
+     * @see base_trouver_table_dist()
317
+     * @var array
318
+     */
319
+    public $jointures = [];
320
+
321
+    /**
322
+     * Jointures explicites avec cette table
323
+     *
324
+     * Ces jointures sont utilisées en priorité par rapport aux jointures
325
+     * normales possibles pour retrouver les colonnes demandées extérieures
326
+     * à la boucle.
327
+     *
328
+     * @var string|bool
329
+     */
330
+    public $jointures_explicites = false;
331
+
332
+    /**
333
+     * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
334
+     *
335
+     * @var string|null
336
+     */
337
+    public $doublons;
338
+
339
+    /**
340
+     * Code PHP ajouté au début de chaque itération de boucle.
341
+     *
342
+     * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
343
+     *
344
+     * @var string
345
+     */
346
+    public $partie = '';
347
+
348
+    /**
349
+     * Nombre de divisions de la boucle, d'éléments à afficher,
350
+     * ou de soustractions d'éléments à faire
351
+     *
352
+     * Dans les critères limitant le nombre d'éléments affichés
353
+     * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
354
+     *
355
+     * @var string
356
+     */
357
+    public $total_parties = '';
358
+
359
+    /**
360
+     * Code PHP ajouté avant l'itération de boucle.
361
+     *
362
+     * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
363
+     * pour initialiser les variables de début et de fin d'itération.
364
+     *
365
+     * @var string
366
+     */
367
+    public $mode_partie = '';
368
+
369
+    /**
370
+     * Identifiant d'une boucle qui appelle celle-ci de manière récursive
371
+     *
372
+     * Si une boucle est appelée de manière récursive quelque part par
373
+     * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
374
+     * boucle (identifiant) reçoit dans cette propriété l'identifiant
375
+     * de l'appelant (rec)
376
+     *
377
+     * @var string
378
+     */
379
+    public $externe = '';
380
+
381
+    // champs pour la construction de la requete SQL
382
+
383
+    /**
384
+     * Liste des champs à récupérer par la boucle
385
+     *
386
+     * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
387
+     *
388
+     * @var string[]
389
+     */
390
+    public $select = [];
391
+
392
+    /**
393
+     * Liste des alias / tables SQL utilisées dans la boucle
394
+     *
395
+     * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
396
+     * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
397
+     *
398
+     * L'index 0 peut définir le type de sources de données de l'itérateur DATA
399
+     *
400
+     * @var string[]
401
+     */
402
+    public $from = [];
403
+
404
+    /**
405
+     * Liste des alias / type de jointures utilisées dans la boucle
406
+     *
407
+     * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
408
+     * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
409
+     *
410
+     * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
411
+     * qui sera utilisé par défaut (créant donc un INNER JOIN).
412
+     *
413
+     * @var string[]
414
+     */
415
+    public $from_type = [];
416
+
417
+    /**
418
+     * Liste des conditions WHERE de la boucle
419
+     *
420
+     * Permet de restreindre les éléments retournés par une boucle
421
+     * en fonctions des conditions transmises dans ce tableau.
422
+     *
423
+     * Ce tableau peut avoir plusieurs niveaux de profondeur.
424
+     *
425
+     * Les éléments du premier niveau sont reliés par des AND, donc
426
+     * chaque élément ajouté directement au where par
427
+     * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
428
+     * est une condition AND en plus.
429
+     *
430
+     * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
431
+     * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
432
+     * $expr = array(operateur, val1, val2)
433
+     *
434
+     * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
435
+     * à réaliser tel que :
436
+     *
437
+     * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
438
+     *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
439
+     *    suivant cet ordre : "val1 operateur val2".
440
+     *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
441
+     * - "'AND'", "'OR'", "'NOT'" :
442
+     *    dans ce cas val1 et val2 sont également des expressions
443
+     *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
444
+     *    Exemples :
445
+     *    $boucle->where[] = array("'OR'", $expr1, $expr2);
446
+     *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
447
+     *
448
+     * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
449
+     * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
450
+     * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
451
+     *
452
+     * @var array
453
+     */
454
+    public $where = [];
455
+
456
+    public $join = [];
457
+    public $having = [];
458
+    public $limit = '';
459
+    public $group = [];
460
+    public $order = [];
461
+    public $default_order = [];
462
+    public $date = 'date';
463
+    public $hash = '';
464
+    public $in = '';
465
+    public $sous_requete = false;
466
+
467
+    /**
468
+     * Code PHP qui sera ajouté en tout début de la fonction de boucle
469
+     *
470
+     * Il sert à insérer le code calculant une hierarchie
471
+     *
472
+     * @var string
473
+     */
474
+    public $hierarchie = '';
475
+
476
+    // champs pour la construction du corps PHP
477
+
478
+    /**
479
+     * Description des sources de données de la boucle
480
+     *
481
+     * Description des données de la boucle issu de trouver_table
482
+     * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
483
+     *
484
+     * @see base_trouver_table_dist()
485
+     * @var array
486
+     */
487
+    public $show = [];
488
+
489
+    /**
490
+     * Nom de la table SQL principale de la boucle, sans son préfixe
491
+     *
492
+     * @var string
493
+     */
494
+    public $id_table;
495
+
496
+    /**
497
+     * Nom de la clé primaire de la table SQL principale de la boucle
498
+     *
499
+     * @var string
500
+     */
501
+    public $primary;
502
+
503
+    /**
504
+     * Code PHP compilé de la boucle
505
+     *
506
+     * @var string
507
+     */
508
+    public $return;
509
+
510
+    public $numrows = false;
511
+    public $cptrows = false;
512
+
513
+    /**
514
+     * Description du squelette
515
+     *
516
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
517
+     *
518
+     * Peut contenir les index :
519
+     *
520
+     * - nom : Nom du fichier de cache
521
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
522
+     * - sourcefile : Chemin du squelette
523
+     * - squelette : Code du squelette
524
+     * - id_mere : Identifiant de la boucle parente
525
+     * - documents : Pour embed et img dans les textes
526
+     * - session : Pour un cache sessionné par auteur
527
+     * - niv : Niveau de tabulation
528
+     *
529
+     * @var array
530
+     */
531
+    public $descr = [];
532
+
533
+    /**
534
+     * Numéro de ligne dans le code source du squelette
535
+     *
536
+     * @var int
537
+     */
538
+    public $ligne = 0;
539
+
540
+
541
+    public $modificateur = []; // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
542
+
543
+    /**
544
+     * Type d'itérateur utilisé pour cette boucle
545
+     *
546
+     * - 'SQL' dans le cadre d'une boucle sur une table SQL
547
+     * - 'DATA' pour l'itérateur DATA, ...
548
+     *
549
+     * @var string
550
+     */
551
+    public $iterateur = ''; // type d'iterateur
552
+
553
+    /**
554
+     * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
555
+     */
556
+    public $debug = [];
557
+
558
+    /**
559
+     * Index de la boucle dont le champ présent dans cette boucle est originaire,
560
+     * notamment si le champ a été trouve dans une boucle parente
561
+     *
562
+     * Tableau nom du champ => index de boucle
563
+     *
564
+     * @var array $index_champ
565
+     */
566
+    public $index_champ = [];
567
+
568
+    // obsoletes, conserves provisoirement pour compatibilite
569
+    public $tout = false;
570
+    public $plat = false;
571
+    public $lien = false;
572 572
 }
573 573
 
574 574
 /**
@@ -579,56 +579,56 @@  discard block
 block discarded – undo
579 579
  * @package SPIP\Core\Compilateur\AST
580 580
  **/
581 581
 class Critere {
582
-	/**
583
-	 * Type de noeud
584
-	 *
585
-	 * @var string
586
-	 */
587
-	public $type = 'critere';
588
-
589
-	/**
590
-	 * Opérateur (>, <, >=, IN, ...)
591
-	 *
592
-	 * @var null|string
593
-	 */
594
-	public $op;
595
-
596
-	/**
597
-	 * Présence d'une négation (truc !op valeur)
598
-	 *
599
-	 * @var null|string
600
-	 */
601
-	public $not;
602
-
603
-	/**
604
-	 * Présence d'une exclusion (!truc op valeur)
605
-	 *
606
-	 * @var null|string
607
-	 */
608
-	public $exclus;
609
-
610
-	/**
611
-	 * Présence d'une condition dans le critère (truc ?)
612
-	 *
613
-	 * @var bool
614
-	 */
615
-	public $cond = false;
616
-
617
-	/**
618
-	 * Paramètres du critère
619
-	 * - $param[0] : élément avant l'opérateur
620
-	 * - $param[1..n] : éléments après l'opérateur
621
-	 *
622
-	 * @var array
623
-	 */
624
-	public $param = [];
625
-
626
-	/**
627
-	 * Numéro de ligne dans le code source du squelette
628
-	 *
629
-	 * @var int
630
-	 */
631
-	public $ligne = 0;
582
+    /**
583
+     * Type de noeud
584
+     *
585
+     * @var string
586
+     */
587
+    public $type = 'critere';
588
+
589
+    /**
590
+     * Opérateur (>, <, >=, IN, ...)
591
+     *
592
+     * @var null|string
593
+     */
594
+    public $op;
595
+
596
+    /**
597
+     * Présence d'une négation (truc !op valeur)
598
+     *
599
+     * @var null|string
600
+     */
601
+    public $not;
602
+
603
+    /**
604
+     * Présence d'une exclusion (!truc op valeur)
605
+     *
606
+     * @var null|string
607
+     */
608
+    public $exclus;
609
+
610
+    /**
611
+     * Présence d'une condition dans le critère (truc ?)
612
+     *
613
+     * @var bool
614
+     */
615
+    public $cond = false;
616
+
617
+    /**
618
+     * Paramètres du critère
619
+     * - $param[0] : élément avant l'opérateur
620
+     * - $param[1..n] : éléments après l'opérateur
621
+     *
622
+     * @var array
623
+     */
624
+    public $param = [];
625
+
626
+    /**
627
+     * Numéro de ligne dans le code source du squelette
628
+     *
629
+     * @var int
630
+     */
631
+    public $ligne = 0;
632 632
 }
633 633
 
634 634
 /**
@@ -637,139 +637,139 @@  discard block
 block discarded – undo
637 637
  * @package SPIP\Core\Compilateur\AST
638 638
  **/
639 639
 class Champ {
640
-	/**
641
-	 * Type de noeud
642
-	 *
643
-	 * @var string
644
-	 */
645
-	public $type = 'champ';
646
-
647
-	/**
648
-	 * Nom du champ demandé. Exemple 'ID_ARTICLE'
649
-	 *
650
-	 * @var string|null
651
-	 */
652
-	public $nom_champ;
653
-
654
-	/**
655
-	 * Identifiant de la boucle parente si explicité
656
-	 *
657
-	 * @var string|null
658
-	 */
659
-	public $nom_boucle = '';
660
-
661
-	/**
662
-	 * Partie optionnelle avant
663
-	 *
664
-	 * @var null|string|array
665
-	 */
666
-	public $avant;
667
-
668
-	/**
669
-	 * Partie optionnelle après
670
-	 *
671
-	 * @var null|string|array
672
-	 */
673
-	public $apres;
674
-
675
-	/**
676
-	 * Étoiles : annuler des automatismes
677
-	 *
678
-	 * - '*' annule les filtres automatiques
679
-	 * - '**' annule en plus les protections de scripts
680
-	 *
681
-	 * @var null|string
682
-	 */
683
-	public $etoile;
684
-
685
-	/**
686
-	 * Arguments et filtres explicites sur la balise
687
-	 *
688
-	 * - $param[0] contient les arguments de la balise
689
-	 * - $param[1..n] contient les filtres à appliquer à la balise
690
-	 *
691
-	 * @var array
692
-	 */
693
-	public $param = [];
694
-
695
-	/**
696
-	 * Source des filtres  (compatibilité) (?)
697
-	 *
698
-	 * @var array|null
699
-	 */
700
-	public $fonctions = [];
701
-
702
-	/**
703
-	 * Identifiant de la boucle
704
-	 *
705
-	 * @var string
706
-	 */
707
-	public $id_boucle = '';
708
-
709
-	/**
710
-	 * AST du squelette, liste de toutes les boucles
711
-	 *
712
-	 * @var Boucles[]
713
-	 */
714
-	public $boucles;
715
-
716
-	/**
717
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
718
-	 *
719
-	 * @var string|null
720
-	 */
721
-	public $type_requete;
722
-
723
-	/**
724
-	 * Résultat de la compilation: toujours une expression PHP
725
-	 *
726
-	 * @var string
727
-	 */
728
-	public $code = '';
729
-
730
-	/**
731
-	 * Interdire les scripts
732
-	 *
733
-	 * false si on est sûr de cette balise
734
-	 *
735
-	 * @see interdire_scripts()
736
-	 * @var bool
737
-	 */
738
-	public $interdire_scripts = true;
739
-
740
-	/**
741
-	 * Description du squelette
742
-	 *
743
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
744
-	 *
745
-	 * Peut contenir les index :
746
-	 *
747
-	 * - nom : Nom du fichier de cache
748
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
749
-	 * - sourcefile : Chemin du squelette
750
-	 * - squelette : Code du squelette
751
-	 * - id_mere : Identifiant de la boucle parente
752
-	 * - documents : Pour embed et img dans les textes
753
-	 * - session : Pour un cache sessionné par auteur
754
-	 * - niv : Niveau de tabulation
755
-	 *
756
-	 * @var array
757
-	 */
758
-	public $descr = [];
759
-
760
-	/**
761
-	 * Numéro de ligne dans le code source du squelette
762
-	 *
763
-	 * @var int
764
-	 */
765
-	public $ligne = 0;
766
-
767
-	/**
768
-	 * Drapeau pour reperer les balises calculées par une fonction explicite
769
-	 *
770
-	 * @var bool
771
-	 */
772
-	public $balise_calculee = false;
640
+    /**
641
+     * Type de noeud
642
+     *
643
+     * @var string
644
+     */
645
+    public $type = 'champ';
646
+
647
+    /**
648
+     * Nom du champ demandé. Exemple 'ID_ARTICLE'
649
+     *
650
+     * @var string|null
651
+     */
652
+    public $nom_champ;
653
+
654
+    /**
655
+     * Identifiant de la boucle parente si explicité
656
+     *
657
+     * @var string|null
658
+     */
659
+    public $nom_boucle = '';
660
+
661
+    /**
662
+     * Partie optionnelle avant
663
+     *
664
+     * @var null|string|array
665
+     */
666
+    public $avant;
667
+
668
+    /**
669
+     * Partie optionnelle après
670
+     *
671
+     * @var null|string|array
672
+     */
673
+    public $apres;
674
+
675
+    /**
676
+     * Étoiles : annuler des automatismes
677
+     *
678
+     * - '*' annule les filtres automatiques
679
+     * - '**' annule en plus les protections de scripts
680
+     *
681
+     * @var null|string
682
+     */
683
+    public $etoile;
684
+
685
+    /**
686
+     * Arguments et filtres explicites sur la balise
687
+     *
688
+     * - $param[0] contient les arguments de la balise
689
+     * - $param[1..n] contient les filtres à appliquer à la balise
690
+     *
691
+     * @var array
692
+     */
693
+    public $param = [];
694
+
695
+    /**
696
+     * Source des filtres  (compatibilité) (?)
697
+     *
698
+     * @var array|null
699
+     */
700
+    public $fonctions = [];
701
+
702
+    /**
703
+     * Identifiant de la boucle
704
+     *
705
+     * @var string
706
+     */
707
+    public $id_boucle = '';
708
+
709
+    /**
710
+     * AST du squelette, liste de toutes les boucles
711
+     *
712
+     * @var Boucles[]
713
+     */
714
+    public $boucles;
715
+
716
+    /**
717
+     * Alias de table d'application de la requête ou nom complet de la table SQL
718
+     *
719
+     * @var string|null
720
+     */
721
+    public $type_requete;
722
+
723
+    /**
724
+     * Résultat de la compilation: toujours une expression PHP
725
+     *
726
+     * @var string
727
+     */
728
+    public $code = '';
729
+
730
+    /**
731
+     * Interdire les scripts
732
+     *
733
+     * false si on est sûr de cette balise
734
+     *
735
+     * @see interdire_scripts()
736
+     * @var bool
737
+     */
738
+    public $interdire_scripts = true;
739
+
740
+    /**
741
+     * Description du squelette
742
+     *
743
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
744
+     *
745
+     * Peut contenir les index :
746
+     *
747
+     * - nom : Nom du fichier de cache
748
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
749
+     * - sourcefile : Chemin du squelette
750
+     * - squelette : Code du squelette
751
+     * - id_mere : Identifiant de la boucle parente
752
+     * - documents : Pour embed et img dans les textes
753
+     * - session : Pour un cache sessionné par auteur
754
+     * - niv : Niveau de tabulation
755
+     *
756
+     * @var array
757
+     */
758
+    public $descr = [];
759
+
760
+    /**
761
+     * Numéro de ligne dans le code source du squelette
762
+     *
763
+     * @var int
764
+     */
765
+    public $ligne = 0;
766
+
767
+    /**
768
+     * Drapeau pour reperer les balises calculées par une fonction explicite
769
+     *
770
+     * @var bool
771
+     */
772
+    public $balise_calculee = false;
773 773
 }
774 774
 
775 775
 
@@ -777,123 +777,123 @@  discard block
 block discarded – undo
777 777
  * Description d'une chaîne de langue
778 778
  **/
779 779
 class Idiome {
780
-	/**
781
-	 * Type de noeud
782
-	 *
783
-	 * @var string
784
-	 */
785
-	public $type = 'idiome';
786
-
787
-	/**
788
-	 * Clé de traduction demandée. Exemple 'item_oui'
789
-	 *
790
-	 * @var string
791
-	 */
792
-	public $nom_champ = '';
793
-
794
-	/**
795
-	 * Module de langue où chercher la clé de traduction. Exemple 'medias'
796
-	 *
797
-	 * @var string
798
-	 */
799
-	public $module = '';
800
-
801
-	/**
802
-	 * Arguments à passer à la chaîne
803
-	 *
804
-	 * @var array
805
-	 */
806
-	public $arg = [];
807
-
808
-	/**
809
-	 * Filtres à appliquer au résultat
810
-	 *
811
-	 * @var array
812
-	 */
813
-	public $param = [];
814
-
815
-	/**
816
-	 * Source des filtres  (compatibilité) (?)
817
-	 *
818
-	 * @var array|null
819
-	 */
820
-	public $fonctions = [];
821
-
822
-	/**
823
-	 * Inutilisé, propriété générique de l'AST
824
-	 *
825
-	 * @var string|array
826
-	 */
827
-	public $avant = '';
828
-
829
-	/**
830
-	 * Inutilisé, propriété générique de l'AST
831
-	 *
832
-	 * @var string|array
833
-	 */
834
-	public $apres = '';
835
-
836
-	/**
837
-	 * Identifiant de la boucle
838
-	 *
839
-	 * @var string
840
-	 */
841
-	public $id_boucle = '';
842
-
843
-	/**
844
-	 * AST du squelette, liste de toutes les boucles
845
-	 *
846
-	 * @var Boucles[]
847
-	 */
848
-	public $boucles;
849
-
850
-	/**
851
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
852
-	 *
853
-	 * @var string|null
854
-	 */
855
-	public $type_requete;
856
-
857
-	/**
858
-	 * Résultat de la compilation: toujours une expression PHP
859
-	 *
860
-	 * @var string
861
-	 */
862
-	public $code = '';
863
-
864
-	/**
865
-	 * Interdire les scripts
866
-	 *
867
-	 * @see interdire_scripts()
868
-	 * @var bool
869
-	 */
870
-	public $interdire_scripts = false;
871
-
872
-	/**
873
-	 * Description du squelette
874
-	 *
875
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
876
-	 *
877
-	 * Peut contenir les index :
878
-	 * - nom : Nom du fichier de cache
879
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
880
-	 * - sourcefile : Chemin du squelette
881
-	 * - squelette : Code du squelette
882
-	 * - id_mere : Identifiant de la boucle parente
883
-	 * - documents : Pour embed et img dans les textes
884
-	 * - session : Pour un cache sessionné par auteur
885
-	 * - niv : Niveau de tabulation
886
-	 *
887
-	 * @var array
888
-	 */
889
-	public $descr = [];
890
-
891
-	/**
892
-	 * Numéro de ligne dans le code source du squelette
893
-	 *
894
-	 * @var int
895
-	 */
896
-	public $ligne = 0;
780
+    /**
781
+     * Type de noeud
782
+     *
783
+     * @var string
784
+     */
785
+    public $type = 'idiome';
786
+
787
+    /**
788
+     * Clé de traduction demandée. Exemple 'item_oui'
789
+     *
790
+     * @var string
791
+     */
792
+    public $nom_champ = '';
793
+
794
+    /**
795
+     * Module de langue où chercher la clé de traduction. Exemple 'medias'
796
+     *
797
+     * @var string
798
+     */
799
+    public $module = '';
800
+
801
+    /**
802
+     * Arguments à passer à la chaîne
803
+     *
804
+     * @var array
805
+     */
806
+    public $arg = [];
807
+
808
+    /**
809
+     * Filtres à appliquer au résultat
810
+     *
811
+     * @var array
812
+     */
813
+    public $param = [];
814
+
815
+    /**
816
+     * Source des filtres  (compatibilité) (?)
817
+     *
818
+     * @var array|null
819
+     */
820
+    public $fonctions = [];
821
+
822
+    /**
823
+     * Inutilisé, propriété générique de l'AST
824
+     *
825
+     * @var string|array
826
+     */
827
+    public $avant = '';
828
+
829
+    /**
830
+     * Inutilisé, propriété générique de l'AST
831
+     *
832
+     * @var string|array
833
+     */
834
+    public $apres = '';
835
+
836
+    /**
837
+     * Identifiant de la boucle
838
+     *
839
+     * @var string
840
+     */
841
+    public $id_boucle = '';
842
+
843
+    /**
844
+     * AST du squelette, liste de toutes les boucles
845
+     *
846
+     * @var Boucles[]
847
+     */
848
+    public $boucles;
849
+
850
+    /**
851
+     * Alias de table d'application de la requête ou nom complet de la table SQL
852
+     *
853
+     * @var string|null
854
+     */
855
+    public $type_requete;
856
+
857
+    /**
858
+     * Résultat de la compilation: toujours une expression PHP
859
+     *
860
+     * @var string
861
+     */
862
+    public $code = '';
863
+
864
+    /**
865
+     * Interdire les scripts
866
+     *
867
+     * @see interdire_scripts()
868
+     * @var bool
869
+     */
870
+    public $interdire_scripts = false;
871
+
872
+    /**
873
+     * Description du squelette
874
+     *
875
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
876
+     *
877
+     * Peut contenir les index :
878
+     * - nom : Nom du fichier de cache
879
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
880
+     * - sourcefile : Chemin du squelette
881
+     * - squelette : Code du squelette
882
+     * - id_mere : Identifiant de la boucle parente
883
+     * - documents : Pour embed et img dans les textes
884
+     * - session : Pour un cache sessionné par auteur
885
+     * - niv : Niveau de tabulation
886
+     *
887
+     * @var array
888
+     */
889
+    public $descr = [];
890
+
891
+    /**
892
+     * Numéro de ligne dans le code source du squelette
893
+     *
894
+     * @var int
895
+     */
896
+    public $ligne = 0;
897 897
 }
898 898
 
899 899
 /**
@@ -902,28 +902,28 @@  discard block
 block discarded – undo
902 902
  * @package SPIP\Core\Compilateur\AST
903 903
  **/
904 904
 class Polyglotte {
905
-	/**
906
-	 * Type de noeud
907
-	 *
908
-	 * @var string
909
-	 */
910
-	public $type = 'polyglotte';
911
-
912
-	/**
913
-	 * Tableau des traductions possibles classées par langue
914
-	 *
915
-	 * Tableau code de langue => texte
916
-	 *
917
-	 * @var array
918
-	 */
919
-	public $traductions = [];
920
-
921
-	/**
922
-	 * Numéro de ligne dans le code source du squelette
923
-	 *
924
-	 * @var int
925
-	 */
926
-	public $ligne = 0;
905
+    /**
906
+     * Type de noeud
907
+     *
908
+     * @var string
909
+     */
910
+    public $type = 'polyglotte';
911
+
912
+    /**
913
+     * Tableau des traductions possibles classées par langue
914
+     *
915
+     * Tableau code de langue => texte
916
+     *
917
+     * @var array
918
+     */
919
+    public $traductions = [];
920
+
921
+    /**
922
+     * Numéro de ligne dans le code source du squelette
923
+     *
924
+     * @var int
925
+     */
926
+    public $ligne = 0;
927 927
 }
928 928
 
929 929
 
@@ -948,90 +948,90 @@  discard block
 block discarded – undo
948 948
  */
949 949
 function declarer_interfaces() {
950 950
 
951
-	$GLOBALS['table_des_tables']['articles'] = 'articles';
952
-	$GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
953
-	$GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
954
-	$GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
955
-
956
-	// definition des statuts de publication
957
-	$GLOBALS['table_statut'] = [];
958
-
959
-	//
960
-	// tableau des tables de jointures
961
-	// Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
962
-	$GLOBALS['tables_jointures'] = [];
963
-	$GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
964
-
965
-	// $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
966
-	$GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur'];
967
-
968
-
969
-	if (!defined('_TRAITEMENT_TYPO')) {
970
-		define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
971
-	}
972
-	if (!defined('_TRAITEMENT_RACCOURCIS')) {
973
-		define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
974
-	}
975
-	if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976
-		define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977
-	}
978
-	$GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')';
979
-	$GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)';
980
-	$GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')';
981
-	$GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
982
-	$GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
983
-	$GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
984
-	$GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
985
-	$GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
986
-	$GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
987
-	$GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
988
-	$GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
989
-	$GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
990
-	$GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
991
-	$GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
992
-	$GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
993
-	$GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
994
-	$GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
995
-	$GLOBALS['table_des_traitements']['TAGS'][] = '%s';
996
-	$GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
997
-	$GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
998
-	$GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
999
-	$GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
1000
-	$GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
1001
-	$GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
1002
-
1003
-	// valeur par defaut pour les balises non listees ci-dessus
1004
-	$GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
1005
-	// toujours securiser les DATA
1006
-	$GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
1007
-	// expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
1008
-	$GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
1009
-
1010
-
1011
-	// gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
1012
-	$interfaces = pipeline(
1013
-		'declarer_tables_interfaces',
1014
-		[
1015
-			'table_des_tables' => $GLOBALS['table_des_tables'],
1016
-			'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
1017
-			'table_date' => $GLOBALS['table_date'],
1018
-			'table_titre' => $GLOBALS['table_titre'],
1019
-			'tables_jointures' => $GLOBALS['tables_jointures'],
1020
-			'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
1021
-			'table_des_traitements' => $GLOBALS['table_des_traitements'],
1022
-			'table_statut' => $GLOBALS['table_statut'],
1023
-		]
1024
-	);
1025
-	if ($interfaces) {
1026
-		$GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1027
-		$GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1028
-		$GLOBALS['table_date'] = $interfaces['table_date'];
1029
-		$GLOBALS['table_titre'] = $interfaces['table_titre'];
1030
-		$GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1031
-		$GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1032
-		$GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1033
-		$GLOBALS['table_statut'] = $interfaces['table_statut'];
1034
-	}
951
+    $GLOBALS['table_des_tables']['articles'] = 'articles';
952
+    $GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
953
+    $GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
954
+    $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
955
+
956
+    // definition des statuts de publication
957
+    $GLOBALS['table_statut'] = [];
958
+
959
+    //
960
+    // tableau des tables de jointures
961
+    // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
962
+    $GLOBALS['tables_jointures'] = [];
963
+    $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
964
+
965
+    // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
966
+    $GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur'];
967
+
968
+
969
+    if (!defined('_TRAITEMENT_TYPO')) {
970
+        define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
971
+    }
972
+    if (!defined('_TRAITEMENT_RACCOURCIS')) {
973
+        define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
974
+    }
975
+    if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976
+        define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977
+    }
978
+    $GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')';
979
+    $GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)';
980
+    $GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')';
981
+    $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
982
+    $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
983
+    $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
984
+    $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
985
+    $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
986
+    $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
987
+    $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
988
+    $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
989
+    $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
990
+    $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
991
+    $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
992
+    $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
993
+    $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
994
+    $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
995
+    $GLOBALS['table_des_traitements']['TAGS'][] = '%s';
996
+    $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
997
+    $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
998
+    $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
999
+    $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
1000
+    $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
1001
+    $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
1002
+
1003
+    // valeur par defaut pour les balises non listees ci-dessus
1004
+    $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
1005
+    // toujours securiser les DATA
1006
+    $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
1007
+    // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
1008
+    $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
1009
+
1010
+
1011
+    // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
1012
+    $interfaces = pipeline(
1013
+        'declarer_tables_interfaces',
1014
+        [
1015
+            'table_des_tables' => $GLOBALS['table_des_tables'],
1016
+            'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
1017
+            'table_date' => $GLOBALS['table_date'],
1018
+            'table_titre' => $GLOBALS['table_titre'],
1019
+            'tables_jointures' => $GLOBALS['tables_jointures'],
1020
+            'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
1021
+            'table_des_traitements' => $GLOBALS['table_des_traitements'],
1022
+            'table_statut' => $GLOBALS['table_statut'],
1023
+        ]
1024
+    );
1025
+    if ($interfaces) {
1026
+        $GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1027
+        $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1028
+        $GLOBALS['table_date'] = $interfaces['table_date'];
1029
+        $GLOBALS['table_titre'] = $interfaces['table_titre'];
1030
+        $GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1031
+        $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1032
+        $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1033
+        $GLOBALS['table_statut'] = $interfaces['table_statut'];
1034
+    }
1035 1035
 }
1036 1036
 
1037 1037
 declarer_interfaces();
Please login to merge, or discard this patch.
ecrire/action/editer_article.php 2 patches
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -106,7 +106,7 @@  discard block
 block discarded – undo
106 106
 	);
107 107
 
108 108
 	// Si l'article est publie, invalider les caches et demander sa reindexation
109
-	$t = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id_article));
109
+	$t = sql_getfetsel('statut', 'spip_articles', 'id_article='.intval($id_article));
110 110
 	$invalideur = $indexation = false;
111 111
 	if ($t == 'publie') {
112 112
 		$invalideur = "id='article/$id_article'";
@@ -119,7 +119,7 @@  discard block
 block discarded – undo
119 119
 			$id_article,
120 120
 			[
121 121
 			'data' => $set,
122
-			'nonvide' => ['titre' => _T('info_nouvel_article') . ' ' . _T('info_numero_abbreviation') . $id_article],
122
+			'nonvide' => ['titre' => _T('info_nouvel_article').' '._T('info_numero_abbreviation').$id_article],
123 123
 			'invalideur' => $invalideur,
124 124
 			'indexation' => $indexation,
125 125
 			'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif
@@ -309,7 +309,7 @@  discard block
 block discarded – undo
309 309
 		} elseif (autoriser('modifier', 'article', $id_article) and $s != 'publie') {
310 310
 			$statut = $champs['statut'] = $s;
311 311
 		} else {
312
-			spip_log("editer_article $id_article refus " . join(' ', $c));
312
+			spip_log("editer_article $id_article refus ".join(' ', $c));
313 313
 		}
314 314
 
315 315
 		// En cas de publication, fixer la date a "maintenant"
@@ -334,7 +334,7 @@  discard block
 block discarded – undo
334 334
 		isset($c['id_parent'])
335 335
 		and $id_parent = $c['id_parent']
336 336
 		and $id_parent != $id_rubrique
337
-		and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)))
337
+		and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique='.intval($id_parent)))
338 338
 	) {
339 339
 		$champs['id_rubrique'] = $id_parent;
340 340
 
@@ -435,7 +435,7 @@  discard block
 block discarded – undo
435 435
 	// Si on deplace l'article
436 436
 	//  changer aussi son secteur et sa langue (si heritee)
437 437
 	if (isset($champs['id_rubrique'])) {
438
-		$row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique']));
438
+		$row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique='.sql_quote($champs['id_rubrique']));
439 439
 
440 440
 		$langue = $row_rub['lang'];
441 441
 		$champs['id_secteur'] = $row_rub['id_secteur'];
@@ -443,7 +443,7 @@  discard block
 block discarded – undo
443 443
 			sql_fetsel(
444 444
 				'1',
445 445
 				'spip_articles',
446
-				'id_article=' . intval($id_article) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue)
446
+				'id_article='.intval($id_article)." AND langue_choisie<>'oui' AND lang<>".sql_quote($langue)
447 447
 			)
448 448
 		) {
449 449
 			$champs['lang'] = $langue;
@@ -454,7 +454,7 @@  discard block
 block discarded – undo
454 454
 		return;
455 455
 	}
456 456
 
457
-	sql_updateq('spip_articles', $champs, 'id_article=' . intval($id_article));
457
+	sql_updateq('spip_articles', $champs, 'id_article='.intval($id_article));
458 458
 
459 459
 	// Changer le statut des rubriques concernees
460 460
 
@@ -475,6 +475,6 @@  discard block
 block discarded – undo
475 475
 		foreach ($plus as $n => $t) {
476 476
 			$plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,", '', $t);
477 477
 		}
478
-		set_request('texte', join('', $plus) . _request('texte'));
478
+		set_request('texte', join('', $plus)._request('texte'));
479 479
 	}
480 480
 }
Please login to merge, or discard this patch.
Indentation   +323 added lines, -323 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
 /**
@@ -39,36 +39,36 @@  discard block
 block discarded – undo
39 39
  *     Liste (identifiant de l'article, Texte d'erreur éventuel)
40 40
  */
41 41
 function action_editer_article_dist($arg = null) {
42
-	include_spip('inc/autoriser');
43
-	$err = '';
44
-	if (is_null($arg)) {
45
-		$securiser_action = charger_fonction('securiser_action', 'inc');
46
-		$arg = $securiser_action();
47
-	}
48
-
49
-	// si id_article n'est pas un nombre, c'est une creation
50
-	// mais on verifie qu'on a toutes les donnees qu'il faut.
51
-	if (!$id_article = intval($arg)) {
52
-		$id_parent = _request('id_parent');
53
-		if (!$id_parent) {
54
-			$err = _L("creation interdite d'un article sans rubrique");
55
-		} elseif (!autoriser('creerarticledans', 'rubrique', $id_parent)) {
56
-			$err = _T('info_creerdansrubrique_non_autorise');
57
-		} else {
58
-			$id_article = article_inserer($id_parent);
59
-		}
60
-	}
61
-
62
-	// Enregistre l'envoi dans la BD
63
-	if ($id_article > 0) {
64
-		$err = article_modifier($id_article);
65
-	}
66
-
67
-	if ($err) {
68
-		spip_log("echec editeur article: $err", _LOG_ERREUR);
69
-	}
70
-
71
-	return [$id_article, $err];
42
+    include_spip('inc/autoriser');
43
+    $err = '';
44
+    if (is_null($arg)) {
45
+        $securiser_action = charger_fonction('securiser_action', 'inc');
46
+        $arg = $securiser_action();
47
+    }
48
+
49
+    // si id_article n'est pas un nombre, c'est une creation
50
+    // mais on verifie qu'on a toutes les donnees qu'il faut.
51
+    if (!$id_article = intval($arg)) {
52
+        $id_parent = _request('id_parent');
53
+        if (!$id_parent) {
54
+            $err = _L("creation interdite d'un article sans rubrique");
55
+        } elseif (!autoriser('creerarticledans', 'rubrique', $id_parent)) {
56
+            $err = _T('info_creerdansrubrique_non_autorise');
57
+        } else {
58
+            $id_article = article_inserer($id_parent);
59
+        }
60
+    }
61
+
62
+    // Enregistre l'envoi dans la BD
63
+    if ($id_article > 0) {
64
+        $err = article_modifier($id_article);
65
+    }
66
+
67
+    if ($err) {
68
+        spip_log("echec editeur article: $err", _LOG_ERREUR);
69
+    }
70
+
71
+    return [$id_article, $err];
72 72
 }
73 73
 
74 74
 /**
@@ -90,50 +90,50 @@  discard block
 block discarded – undo
90 90
  */
91 91
 function article_modifier($id_article, $set = null) {
92 92
 
93
-	// unifier $texte en cas de texte trop long
94
-	trop_longs_articles();
95
-
96
-	include_spip('inc/modifier');
97
-	include_spip('inc/filtres');
98
-	$c = collecter_requests(
99
-	// white list
100
-		objet_info('article', 'champs_editables'),
101
-		// black list
102
-		['date', 'statut', 'id_parent'],
103
-		// donnees eventuellement fournies
104
-		$set
105
-	);
106
-
107
-	// Si l'article est publie, invalider les caches et demander sa reindexation
108
-	$t = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id_article));
109
-	$invalideur = $indexation = false;
110
-	if ($t == 'publie') {
111
-		$invalideur = "id='article/$id_article'";
112
-		$indexation = true;
113
-	}
114
-
115
-	if (
116
-		$err = objet_modifier_champs(
117
-			'article',
118
-			$id_article,
119
-			[
120
-			'data' => $set,
121
-			'nonvide' => ['titre' => _T('info_nouvel_article') . ' ' . _T('info_numero_abbreviation') . $id_article],
122
-			'invalideur' => $invalideur,
123
-			'indexation' => $indexation,
124
-			'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif
125
-			],
126
-			$c
127
-		)
128
-	) {
129
-		return $err;
130
-	}
131
-
132
-	// Modification de statut, changement de rubrique ?
133
-	$c = collecter_requests(['date', 'statut', 'id_parent'], [], $set);
134
-	$err = article_instituer($id_article, $c);
135
-
136
-	return $err;
93
+    // unifier $texte en cas de texte trop long
94
+    trop_longs_articles();
95
+
96
+    include_spip('inc/modifier');
97
+    include_spip('inc/filtres');
98
+    $c = collecter_requests(
99
+    // white list
100
+        objet_info('article', 'champs_editables'),
101
+        // black list
102
+        ['date', 'statut', 'id_parent'],
103
+        // donnees eventuellement fournies
104
+        $set
105
+    );
106
+
107
+    // Si l'article est publie, invalider les caches et demander sa reindexation
108
+    $t = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id_article));
109
+    $invalideur = $indexation = false;
110
+    if ($t == 'publie') {
111
+        $invalideur = "id='article/$id_article'";
112
+        $indexation = true;
113
+    }
114
+
115
+    if (
116
+        $err = objet_modifier_champs(
117
+            'article',
118
+            $id_article,
119
+            [
120
+            'data' => $set,
121
+            'nonvide' => ['titre' => _T('info_nouvel_article') . ' ' . _T('info_numero_abbreviation') . $id_article],
122
+            'invalideur' => $invalideur,
123
+            'indexation' => $indexation,
124
+            'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif
125
+            ],
126
+            $c
127
+        )
128
+    ) {
129
+        return $err;
130
+    }
131
+
132
+    // Modification de statut, changement de rubrique ?
133
+    $c = collecter_requests(['date', 'statut', 'id_parent'], [], $set);
134
+    $err = article_instituer($id_article, $c);
135
+
136
+    return $err;
137 137
 }
138 138
 
139 139
 /**
@@ -169,98 +169,98 @@  discard block
 block discarded – undo
169 169
  */
170 170
 function article_inserer($id_rubrique, $set = null) {
171 171
 
172
-	// Si id_rubrique vaut 0 ou n'est pas definie, creer l'article
173
-	// dans la premiere rubrique racine
174
-	if (!$id_rubrique = intval($id_rubrique)) {
175
-		$row = sql_fetsel('id_rubrique, id_secteur, lang', 'spip_rubriques', 'id_parent=0', '', '0+titre,titre', '1');
176
-		$id_rubrique = $row['id_rubrique'];
177
-	} else {
178
-		$row = sql_fetsel('lang, id_secteur', 'spip_rubriques', "id_rubrique=$id_rubrique");
179
-	}
180
-
181
-	// eviter $id_secteur = NULL (erreur sqlite) si la requete precedente echoue
182
-	// cas de id_rubrique = -1 par exemple avec plugin "pages"
183
-	$id_secteur = $row['id_secteur'] ?? 0;
184
-	$lang_rub = $row['lang'] ?? '';
185
-
186
-	$lang = '';
187
-	$choisie = 'non';
188
-	// La langue a la creation : si les liens de traduction sont autorises
189
-	// dans les rubriques, on essaie avec la langue de l'auteur,
190
-	// ou a defaut celle de la rubrique
191
-	// Sinon c'est la langue de la rubrique qui est choisie + heritee
192
-	if (
193
-		!empty($GLOBALS['meta']['multi_objets']) and in_array(
194
-			'spip_articles',
195
-			explode(',', $GLOBALS['meta']['multi_objets'])
196
-		)
197
-	) {
198
-		lang_select($GLOBALS['visiteur_session']['lang']);
199
-		if (
200
-			in_array(
201
-				$GLOBALS['spip_lang'],
202
-				explode(',', $GLOBALS['meta']['langues_multilingue'])
203
-			)
204
-		) {
205
-			$lang = $GLOBALS['spip_lang'];
206
-			$choisie = 'oui';
207
-		}
208
-	}
209
-
210
-	if (!$lang) {
211
-		$choisie = 'non';
212
-		$lang = $lang_rub ?: $GLOBALS['meta']['langue_site'];
213
-	}
214
-
215
-	$champs = [
216
-		'id_rubrique' => $id_rubrique,
217
-		'id_secteur' => $id_secteur,
218
-		'statut' => 'prepa',
219
-		'date' => date('Y-m-d H:i:s'),
220
-		'lang' => $lang,
221
-		'langue_choisie' => $choisie
222
-	];
223
-
224
-	if ($set) {
225
-		$champs = array_merge($champs, $set);
226
-	}
227
-
228
-	// Envoyer aux plugins
229
-	$champs = pipeline(
230
-		'pre_insertion',
231
-		[
232
-			'args' => [
233
-				'table' => 'spip_articles',
234
-			],
235
-			'data' => $champs
236
-		]
237
-	);
238
-
239
-	$id_article = sql_insertq('spip_articles', $champs);
240
-
241
-	// controler si le serveur n'a pas renvoye une erreur
242
-	if ($id_article > 0) {
243
-		$id_auteur = ((is_null(_request('id_auteur')) and isset($GLOBALS['visiteur_session']['id_auteur'])) ?
244
-			$GLOBALS['visiteur_session']['id_auteur']
245
-			: _request('id_auteur'));
246
-		if ($id_auteur) {
247
-			include_spip('action/editer_auteur');
248
-			auteur_associer($id_auteur, ['article' => $id_article]);
249
-		}
250
-	}
251
-
252
-	pipeline(
253
-		'post_insertion',
254
-		[
255
-			'args' => [
256
-				'table' => 'spip_articles',
257
-				'id_objet' => $id_article
258
-			],
259
-			'data' => $champs
260
-		]
261
-	);
262
-
263
-	return $id_article;
172
+    // Si id_rubrique vaut 0 ou n'est pas definie, creer l'article
173
+    // dans la premiere rubrique racine
174
+    if (!$id_rubrique = intval($id_rubrique)) {
175
+        $row = sql_fetsel('id_rubrique, id_secteur, lang', 'spip_rubriques', 'id_parent=0', '', '0+titre,titre', '1');
176
+        $id_rubrique = $row['id_rubrique'];
177
+    } else {
178
+        $row = sql_fetsel('lang, id_secteur', 'spip_rubriques', "id_rubrique=$id_rubrique");
179
+    }
180
+
181
+    // eviter $id_secteur = NULL (erreur sqlite) si la requete precedente echoue
182
+    // cas de id_rubrique = -1 par exemple avec plugin "pages"
183
+    $id_secteur = $row['id_secteur'] ?? 0;
184
+    $lang_rub = $row['lang'] ?? '';
185
+
186
+    $lang = '';
187
+    $choisie = 'non';
188
+    // La langue a la creation : si les liens de traduction sont autorises
189
+    // dans les rubriques, on essaie avec la langue de l'auteur,
190
+    // ou a defaut celle de la rubrique
191
+    // Sinon c'est la langue de la rubrique qui est choisie + heritee
192
+    if (
193
+        !empty($GLOBALS['meta']['multi_objets']) and in_array(
194
+            'spip_articles',
195
+            explode(',', $GLOBALS['meta']['multi_objets'])
196
+        )
197
+    ) {
198
+        lang_select($GLOBALS['visiteur_session']['lang']);
199
+        if (
200
+            in_array(
201
+                $GLOBALS['spip_lang'],
202
+                explode(',', $GLOBALS['meta']['langues_multilingue'])
203
+            )
204
+        ) {
205
+            $lang = $GLOBALS['spip_lang'];
206
+            $choisie = 'oui';
207
+        }
208
+    }
209
+
210
+    if (!$lang) {
211
+        $choisie = 'non';
212
+        $lang = $lang_rub ?: $GLOBALS['meta']['langue_site'];
213
+    }
214
+
215
+    $champs = [
216
+        'id_rubrique' => $id_rubrique,
217
+        'id_secteur' => $id_secteur,
218
+        'statut' => 'prepa',
219
+        'date' => date('Y-m-d H:i:s'),
220
+        'lang' => $lang,
221
+        'langue_choisie' => $choisie
222
+    ];
223
+
224
+    if ($set) {
225
+        $champs = array_merge($champs, $set);
226
+    }
227
+
228
+    // Envoyer aux plugins
229
+    $champs = pipeline(
230
+        'pre_insertion',
231
+        [
232
+            'args' => [
233
+                'table' => 'spip_articles',
234
+            ],
235
+            'data' => $champs
236
+        ]
237
+    );
238
+
239
+    $id_article = sql_insertq('spip_articles', $champs);
240
+
241
+    // controler si le serveur n'a pas renvoye une erreur
242
+    if ($id_article > 0) {
243
+        $id_auteur = ((is_null(_request('id_auteur')) and isset($GLOBALS['visiteur_session']['id_auteur'])) ?
244
+            $GLOBALS['visiteur_session']['id_auteur']
245
+            : _request('id_auteur'));
246
+        if ($id_auteur) {
247
+            include_spip('action/editer_auteur');
248
+            auteur_associer($id_auteur, ['article' => $id_article]);
249
+        }
250
+    }
251
+
252
+    pipeline(
253
+        'post_insertion',
254
+        [
255
+            'args' => [
256
+                'table' => 'spip_articles',
257
+                'id_objet' => $id_article
258
+            ],
259
+            'data' => $champs
260
+        ]
261
+    );
262
+
263
+    return $id_article;
264 264
 }
265 265
 
266 266
 
@@ -288,125 +288,125 @@  discard block
 block discarded – undo
288 288
  */
289 289
 function article_instituer($id_article, $c, $calcul_rub = true) {
290 290
 
291
-	include_spip('inc/autoriser');
292
-	include_spip('inc/rubriques');
293
-	include_spip('inc/modifier');
294
-
295
-	$row = sql_fetsel('statut, date, id_rubrique', 'spip_articles', "id_article=$id_article");
296
-	$id_rubrique = $row['id_rubrique'];
297
-	$statut_ancien = $statut = $row['statut'];
298
-	$date_ancienne = $date = $row['date'];
299
-	$champs = [];
300
-
301
-	$d = $c['date'] ?? null;
302
-	$s = $c['statut'] ?? $statut;
303
-
304
-	// cf autorisations dans inc/instituer_article
305
-	if ($s != $statut or ($d and $d != $date)) {
306
-		if (autoriser('publierdans', 'rubrique', $id_rubrique)) {
307
-			$statut = $champs['statut'] = $s;
308
-		} elseif (autoriser('modifier', 'article', $id_article) and $s != 'publie') {
309
-			$statut = $champs['statut'] = $s;
310
-		} else {
311
-			spip_log("editer_article $id_article refus " . join(' ', $c));
312
-		}
313
-
314
-		// En cas de publication, fixer la date a "maintenant"
315
-		// sauf si $c commande autre chose
316
-		// ou si l'article est deja date dans le futur
317
-		// En cas de proposition d'un article (mais pas depublication), idem
318
-		if (
319
-			$champs['statut'] == 'publie'
320
-			or ($champs['statut'] == 'prop' and ($d or !in_array($statut_ancien, ['publie', 'prop'])))
321
-		) {
322
-			if ($d or strtotime($d = $date) > time()) {
323
-				$champs['date'] = $date = $d;
324
-			} else {
325
-				$champs['date'] = $date = date('Y-m-d H:i:s');
326
-			}
327
-		}
328
-	}
329
-
330
-	// Verifier que la rubrique demandee existe et est differente
331
-	// de la rubrique actuelle
332
-	if (
333
-		isset($c['id_parent'])
334
-		and $id_parent = $c['id_parent']
335
-		and $id_parent != $id_rubrique
336
-		and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)))
337
-	) {
338
-		$champs['id_rubrique'] = $id_parent;
339
-
340
-		// si l'article etait publie
341
-		// et que le demandeur n'est pas admin de la rubrique de destination
342
-		// repasser l'article en statut 'propose'.
343
-		if (
344
-			$statut == 'publie'
345
-			and !autoriser('publierdans', 'rubrique', $id_parent)
346
-		) {
347
-			$champs['statut'] = 'prop';
348
-		}
349
-	}
350
-
351
-	// Envoyer aux plugins
352
-	$champs = pipeline(
353
-		'pre_edition',
354
-		[
355
-			'args' => [
356
-				'table' => 'spip_articles',
357
-				'id_objet' => $id_article,
358
-				'action' => 'instituer',
359
-				'statut_ancien' => $statut_ancien,
360
-				'date_ancienne' => $date_ancienne,
361
-			],
362
-			'data' => $champs
363
-		]
364
-	);
365
-
366
-	if (!(is_countable($champs) ? count($champs) : 0)) {
367
-		return '';
368
-	}
369
-
370
-	// Envoyer les modifs.
371
-	editer_article_heritage($id_article, $id_rubrique, $statut_ancien, $champs, $calcul_rub);
372
-
373
-	// Invalider les caches
374
-	include_spip('inc/invalideur');
375
-	suivre_invalideur("id='article/$id_article'");
376
-
377
-	if ($date) {
378
-		$t = strtotime($date);
379
-		$p = @$GLOBALS['meta']['date_prochain_postdate'];
380
-		if ($t > time() and (!$p or ($t < $p))) {
381
-			ecrire_meta('date_prochain_postdate', $t);
382
-		}
383
-	}
384
-
385
-	// Pipeline
386
-	pipeline(
387
-		'post_edition',
388
-		[
389
-			'args' => [
390
-				'table' => 'spip_articles',
391
-				'id_objet' => $id_article,
392
-				'action' => 'instituer',
393
-				'statut_ancien' => $statut_ancien,
394
-				'date_ancienne' => $date_ancienne,
395
-			],
396
-			'data' => $champs
397
-		]
398
-	);
399
-
400
-	// Notifications
401
-	if ($notifications = charger_fonction('notifications', 'inc')) {
402
-		$notifications(
403
-			'instituerarticle',
404
-			$id_article,
405
-			['statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date, 'date_ancienne' => $date_ancienne]
406
-		);
407
-	}
408
-
409
-	return ''; // pas d'erreur
291
+    include_spip('inc/autoriser');
292
+    include_spip('inc/rubriques');
293
+    include_spip('inc/modifier');
294
+
295
+    $row = sql_fetsel('statut, date, id_rubrique', 'spip_articles', "id_article=$id_article");
296
+    $id_rubrique = $row['id_rubrique'];
297
+    $statut_ancien = $statut = $row['statut'];
298
+    $date_ancienne = $date = $row['date'];
299
+    $champs = [];
300
+
301
+    $d = $c['date'] ?? null;
302
+    $s = $c['statut'] ?? $statut;
303
+
304
+    // cf autorisations dans inc/instituer_article
305
+    if ($s != $statut or ($d and $d != $date)) {
306
+        if (autoriser('publierdans', 'rubrique', $id_rubrique)) {
307
+            $statut = $champs['statut'] = $s;
308
+        } elseif (autoriser('modifier', 'article', $id_article) and $s != 'publie') {
309
+            $statut = $champs['statut'] = $s;
310
+        } else {
311
+            spip_log("editer_article $id_article refus " . join(' ', $c));
312
+        }
313
+
314
+        // En cas de publication, fixer la date a "maintenant"
315
+        // sauf si $c commande autre chose
316
+        // ou si l'article est deja date dans le futur
317
+        // En cas de proposition d'un article (mais pas depublication), idem
318
+        if (
319
+            $champs['statut'] == 'publie'
320
+            or ($champs['statut'] == 'prop' and ($d or !in_array($statut_ancien, ['publie', 'prop'])))
321
+        ) {
322
+            if ($d or strtotime($d = $date) > time()) {
323
+                $champs['date'] = $date = $d;
324
+            } else {
325
+                $champs['date'] = $date = date('Y-m-d H:i:s');
326
+            }
327
+        }
328
+    }
329
+
330
+    // Verifier que la rubrique demandee existe et est differente
331
+    // de la rubrique actuelle
332
+    if (
333
+        isset($c['id_parent'])
334
+        and $id_parent = $c['id_parent']
335
+        and $id_parent != $id_rubrique
336
+        and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)))
337
+    ) {
338
+        $champs['id_rubrique'] = $id_parent;
339
+
340
+        // si l'article etait publie
341
+        // et que le demandeur n'est pas admin de la rubrique de destination
342
+        // repasser l'article en statut 'propose'.
343
+        if (
344
+            $statut == 'publie'
345
+            and !autoriser('publierdans', 'rubrique', $id_parent)
346
+        ) {
347
+            $champs['statut'] = 'prop';
348
+        }
349
+    }
350
+
351
+    // Envoyer aux plugins
352
+    $champs = pipeline(
353
+        'pre_edition',
354
+        [
355
+            'args' => [
356
+                'table' => 'spip_articles',
357
+                'id_objet' => $id_article,
358
+                'action' => 'instituer',
359
+                'statut_ancien' => $statut_ancien,
360
+                'date_ancienne' => $date_ancienne,
361
+            ],
362
+            'data' => $champs
363
+        ]
364
+    );
365
+
366
+    if (!(is_countable($champs) ? count($champs) : 0)) {
367
+        return '';
368
+    }
369
+
370
+    // Envoyer les modifs.
371
+    editer_article_heritage($id_article, $id_rubrique, $statut_ancien, $champs, $calcul_rub);
372
+
373
+    // Invalider les caches
374
+    include_spip('inc/invalideur');
375
+    suivre_invalideur("id='article/$id_article'");
376
+
377
+    if ($date) {
378
+        $t = strtotime($date);
379
+        $p = @$GLOBALS['meta']['date_prochain_postdate'];
380
+        if ($t > time() and (!$p or ($t < $p))) {
381
+            ecrire_meta('date_prochain_postdate', $t);
382
+        }
383
+    }
384
+
385
+    // Pipeline
386
+    pipeline(
387
+        'post_edition',
388
+        [
389
+            'args' => [
390
+                'table' => 'spip_articles',
391
+                'id_objet' => $id_article,
392
+                'action' => 'instituer',
393
+                'statut_ancien' => $statut_ancien,
394
+                'date_ancienne' => $date_ancienne,
395
+            ],
396
+            'data' => $champs
397
+        ]
398
+    );
399
+
400
+    // Notifications
401
+    if ($notifications = charger_fonction('notifications', 'inc')) {
402
+        $notifications(
403
+            'instituerarticle',
404
+            $id_article,
405
+            ['statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date, 'date_ancienne' => $date_ancienne]
406
+        );
407
+    }
408
+
409
+    return ''; // pas d'erreur
410 410
 }
411 411
 
412 412
 /**
@@ -431,37 +431,37 @@  discard block
 block discarded – undo
431 431
  */
432 432
 function editer_article_heritage($id_article, $id_rubrique, $statut, $champs, $cond = true) {
433 433
 
434
-	// Si on deplace l'article
435
-	//  changer aussi son secteur et sa langue (si heritee)
436
-	if (isset($champs['id_rubrique'])) {
437
-		$row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique']));
438
-
439
-		$langue = $row_rub['lang'];
440
-		$champs['id_secteur'] = $row_rub['id_secteur'];
441
-		if (
442
-			sql_fetsel(
443
-				'1',
444
-				'spip_articles',
445
-				'id_article=' . intval($id_article) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue)
446
-			)
447
-		) {
448
-			$champs['lang'] = $langue;
449
-		}
450
-	}
451
-
452
-	if (!$champs) {
453
-		return;
454
-	}
455
-
456
-	sql_updateq('spip_articles', $champs, 'id_article=' . intval($id_article));
457
-
458
-	// Changer le statut des rubriques concernees
459
-
460
-	if ($cond) {
461
-		include_spip('inc/rubriques');
462
-		$postdate = ($GLOBALS['meta']['post_dates'] == 'non' and isset($champs['date']) and (strtotime($champs['date']) < time())) ? $champs['date'] : false;
463
-		calculer_rubriques_if($id_rubrique, $champs, ['statut_ancien' => $statut], $postdate);
464
-	}
434
+    // Si on deplace l'article
435
+    //  changer aussi son secteur et sa langue (si heritee)
436
+    if (isset($champs['id_rubrique'])) {
437
+        $row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique']));
438
+
439
+        $langue = $row_rub['lang'];
440
+        $champs['id_secteur'] = $row_rub['id_secteur'];
441
+        if (
442
+            sql_fetsel(
443
+                '1',
444
+                'spip_articles',
445
+                'id_article=' . intval($id_article) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue)
446
+            )
447
+        ) {
448
+            $champs['lang'] = $langue;
449
+        }
450
+    }
451
+
452
+    if (!$champs) {
453
+        return;
454
+    }
455
+
456
+    sql_updateq('spip_articles', $champs, 'id_article=' . intval($id_article));
457
+
458
+    // Changer le statut des rubriques concernees
459
+
460
+    if ($cond) {
461
+        include_spip('inc/rubriques');
462
+        $postdate = ($GLOBALS['meta']['post_dates'] == 'non' and isset($champs['date']) and (strtotime($champs['date']) < time())) ? $champs['date'] : false;
463
+        calculer_rubriques_if($id_rubrique, $champs, ['statut_ancien' => $statut], $postdate);
464
+    }
465 465
 }
466 466
 
467 467
 /**
@@ -470,10 +470,10 @@  discard block
 block discarded – undo
470 470
  * @return void
471 471
  */
472 472
 function trop_longs_articles() {
473
-	if (is_array($plus = _request('texte_plus'))) {
474
-		foreach ($plus as $n => $t) {
475
-			$plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,", '', $t);
476
-		}
477
-		set_request('texte', join('', $plus) . _request('texte'));
478
-	}
473
+    if (is_array($plus = _request('texte_plus'))) {
474
+        foreach ($plus as $n => $t) {
475
+            $plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,", '', $t);
476
+        }
477
+        set_request('texte', join('', $plus) . _request('texte'));
478
+    }
479 479
 }
Please login to merge, or discard this patch.
ecrire/auth/ldap.php 2 patches
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -68,7 +68,7 @@  discard block
 block discarded – undo
68 68
 	$credentials_ldap = ['ldap_dn' => $dn, 'ldap_password' => $pass];
69 69
 
70 70
 	// Si l'utilisateur figure deja dans la base, y recuperer les infos
71
-	$r = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login) . " AND source='ldap'", '', '', '', '', $serveur);
71
+	$r = sql_fetsel('*', 'spip_auteurs', 'login='.sql_quote($login)." AND source='ldap'", '', '', '', '', $serveur);
72 72
 
73 73
 	if ($r) {
74 74
 		return array_merge($r, $credentials_ldap);
@@ -92,7 +92,7 @@  discard block
 block discarded – undo
92 92
 	if ($r) {
93 93
 		return array_merge(
94 94
 			$credentials_ldap,
95
-			sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($r), '', '', '', '', $serveur)
95
+			sql_fetsel('*', 'spip_auteurs', 'id_auteur='.intval($r), '', '', '', '', $serveur)
96 96
 		);
97 97
 	}
98 98
 
@@ -121,7 +121,7 @@  discard block
 block discarded – undo
121 121
 	$connexion = spip_connect($serveur);
122 122
 	if (!is_array($connexion['ldap'])) {
123 123
 		if ($connexion['authentification']['ldap']) {
124
-			$f = _DIR_CONNECT . $connexion['authentification']['ldap'];
124
+			$f = _DIR_CONNECT.$connexion['authentification']['ldap'];
125 125
 			unset($GLOBALS['ldap_link']);
126 126
 			if (is_readable($f)) {
127 127
 				include_once($f);
@@ -334,7 +334,7 @@  discard block
 block discarded – undo
334 334
 	if (!ldap_bind($link, $dn, session_get('ldap_password'))) {
335 335
 		return false;
336 336
 	}
337
-	$encoded_pass = '{MD5}' . base64_encode(pack('H*', md5($new_pass)));
337
+	$encoded_pass = '{MD5}'.base64_encode(pack('H*', md5($new_pass)));
338 338
 	$success = ldap_mod_replace($link, $dn, ['userPassword' => $encoded_pass]);
339 339
 
340 340
 	return $success;
Please login to merge, or discard this patch.
Indentation   +176 added lines, -176 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
 // Authentifie via LDAP et retourne la ligne SQL decrivant l'utilisateur si ok
@@ -25,12 +25,12 @@  discard block
 block discarded – undo
25 25
 // Attributs LDAP correspondants a ceux de SPIP, notamment pour le login
26 26
 // ne pas ecraser une definition perso dans mes_options
27 27
 if (!isset($GLOBALS['ldap_attributes']) or !is_array($GLOBALS['ldap_attributes'])) {
28
-	$GLOBALS['ldap_attributes'] = [
29
-		'login' => ['sAMAccountName', 'uid', 'login', 'userid', 'cn', 'sn'],
30
-		'nom' => 'cn',
31
-		'email' => 'mail',
32
-		'bio' => 'description'
33
-	];
28
+    $GLOBALS['ldap_attributes'] = [
29
+        'login' => ['sAMAccountName', 'uid', 'login', 'userid', 'cn', 'sn'],
30
+        'nom' => 'cn',
31
+        'email' => 'mail',
32
+        'bio' => 'description'
33
+    ];
34 34
 }
35 35
 
36 36
 /**
@@ -56,50 +56,50 @@  discard block
 block discarded – undo
56 56
  */
57 57
 function auth_ldap_dist($login, $pass, $serveur = '', $phpauth = false) {
58 58
 
59
-	#spip_log("ldap $login " . ($pass ? "mdp fourni" : "mdp absent"));
60
-
61
-	// Utilisateur connu ?
62
-	// si http auth, inutile de reauthentifier: cela
63
-	// ne marchera pas avec auth http autre que basic.
64
-	$checkpass = isset($_SERVER['REMOTE_USER']) ? false : true;
65
-	if (!($dn = auth_ldap_search($login, $pass, $checkpass, $serveur))) {
66
-		return [];
67
-	}
68
-	$credentials_ldap = ['ldap_dn' => $dn, 'ldap_password' => $pass];
69
-
70
-	// Si l'utilisateur figure deja dans la base, y recuperer les infos
71
-	$r = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login) . " AND source='ldap'", '', '', '', '', $serveur);
72
-
73
-	if ($r) {
74
-		return array_merge($r, $credentials_ldap);
75
-	}
76
-
77
-	// sinon importer les infos depuis LDAP,
78
-
79
-	if (
80
-		$GLOBALS['meta']['ldap_statut_import']
81
-		and $desc = auth_ldap_retrouver($dn, [], $serveur)
82
-	) {
83
-		// rajouter le statut indique  a l'install
84
-		$desc['statut'] = $GLOBALS['meta']['ldap_statut_import'];
85
-		$desc['login'] = $login;
86
-		$desc['source'] = 'ldap';
87
-		$desc['pass'] = '';
88
-
89
-		$r = sql_insertq('spip_auteurs', $desc, [], $serveur);
90
-	}
91
-
92
-	if ($r) {
93
-		return array_merge(
94
-			$credentials_ldap,
95
-			sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($r), '', '', '', '', $serveur)
96
-		);
97
-	}
98
-
99
-	// sinon echec
100
-	spip_log("Creation de l'auteur '$login' impossible");
101
-
102
-	return [];
59
+    #spip_log("ldap $login " . ($pass ? "mdp fourni" : "mdp absent"));
60
+
61
+    // Utilisateur connu ?
62
+    // si http auth, inutile de reauthentifier: cela
63
+    // ne marchera pas avec auth http autre que basic.
64
+    $checkpass = isset($_SERVER['REMOTE_USER']) ? false : true;
65
+    if (!($dn = auth_ldap_search($login, $pass, $checkpass, $serveur))) {
66
+        return [];
67
+    }
68
+    $credentials_ldap = ['ldap_dn' => $dn, 'ldap_password' => $pass];
69
+
70
+    // Si l'utilisateur figure deja dans la base, y recuperer les infos
71
+    $r = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login) . " AND source='ldap'", '', '', '', '', $serveur);
72
+
73
+    if ($r) {
74
+        return array_merge($r, $credentials_ldap);
75
+    }
76
+
77
+    // sinon importer les infos depuis LDAP,
78
+
79
+    if (
80
+        $GLOBALS['meta']['ldap_statut_import']
81
+        and $desc = auth_ldap_retrouver($dn, [], $serveur)
82
+    ) {
83
+        // rajouter le statut indique  a l'install
84
+        $desc['statut'] = $GLOBALS['meta']['ldap_statut_import'];
85
+        $desc['login'] = $login;
86
+        $desc['source'] = 'ldap';
87
+        $desc['pass'] = '';
88
+
89
+        $r = sql_insertq('spip_auteurs', $desc, [], $serveur);
90
+    }
91
+
92
+    if ($r) {
93
+        return array_merge(
94
+            $credentials_ldap,
95
+            sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($r), '', '', '', '', $serveur)
96
+        );
97
+    }
98
+
99
+    // sinon echec
100
+    spip_log("Creation de l'auteur '$login' impossible");
101
+
102
+    return [];
103 103
 }
104 104
 
105 105
 /**
@@ -113,36 +113,36 @@  discard block
 block discarded – undo
113 113
  * @return array
114 114
  */
115 115
 function auth_ldap_connect($serveur = '') {
116
-	include_spip('base/connect_sql');
117
-	static $connexions_ldap = [];
118
-	if (isset($connexions_ldap[$serveur])) {
119
-		return $connexions_ldap[$serveur];
120
-	}
121
-	$connexion = spip_connect($serveur);
122
-	if (!is_array($connexion['ldap'])) {
123
-		if ($connexion['authentification']['ldap']) {
124
-			$f = _DIR_CONNECT . $connexion['authentification']['ldap'];
125
-			unset($GLOBALS['ldap_link']);
126
-			if (is_readable($f)) {
127
-				include_once($f);
128
-			};
129
-			if (isset($GLOBALS['ldap_link'])) {
130
-				$connexion['ldap'] = [
131
-					'link' => $GLOBALS['ldap_link'],
132
-					'base' => $GLOBALS['ldap_base']
133
-				];
134
-			} else {
135
-				spip_log("connection LDAP $serveur mal definie dans $f");
136
-			}
137
-			if (isset($GLOBALS['ldap_champs'])) {
138
-				$connexion['ldap']['attributes'] = $GLOBALS['ldap_champs'];
139
-			}
140
-		} else {
141
-			spip_log("connection LDAP $serveur inconnue");
142
-		}
143
-	}
144
-
145
-	return $connexions_ldap[$serveur] = $connexion['ldap'];
116
+    include_spip('base/connect_sql');
117
+    static $connexions_ldap = [];
118
+    if (isset($connexions_ldap[$serveur])) {
119
+        return $connexions_ldap[$serveur];
120
+    }
121
+    $connexion = spip_connect($serveur);
122
+    if (!is_array($connexion['ldap'])) {
123
+        if ($connexion['authentification']['ldap']) {
124
+            $f = _DIR_CONNECT . $connexion['authentification']['ldap'];
125
+            unset($GLOBALS['ldap_link']);
126
+            if (is_readable($f)) {
127
+                include_once($f);
128
+            };
129
+            if (isset($GLOBALS['ldap_link'])) {
130
+                $connexion['ldap'] = [
131
+                    'link' => $GLOBALS['ldap_link'],
132
+                    'base' => $GLOBALS['ldap_base']
133
+                ];
134
+            } else {
135
+                spip_log("connection LDAP $serveur mal definie dans $f");
136
+            }
137
+            if (isset($GLOBALS['ldap_champs'])) {
138
+                $connexion['ldap']['attributes'] = $GLOBALS['ldap_champs'];
139
+            }
140
+        } else {
141
+            spip_log("connection LDAP $serveur inconnue");
142
+        }
143
+    }
144
+
145
+    return $connexions_ldap[$serveur] = $connexion['ldap'];
146 146
 }
147 147
 
148 148
 /**
@@ -156,52 +156,52 @@  discard block
 block discarded – undo
156 156
  *    Le login trouvé ou chaine vide si non trouvé
157 157
  */
158 158
 function auth_ldap_search($login, $pass, $checkpass = true, $serveur = '') {
159
-	// Securite anti-injection et contre un serveur LDAP laxiste
160
-	$login_search = preg_replace('/[^-@._\s\d\w]/', '', $login);
161
-	if (!strlen($login_search) or ($checkpass and !strlen($pass))) {
162
-		return '';
163
-	}
164
-
165
-	// verifier la connexion
166
-	if (!$ldap = auth_ldap_connect($serveur)) {
167
-		return '';
168
-	}
169
-
170
-	$ldap_link = $ldap['link'] ?? null;
171
-	$ldap_base = $ldap['base'] ?? null;
172
-	$desc = !empty($ldap['attributes']) ? $ldap['attributes'] : $GLOBALS['ldap_attributes'];
173
-
174
-	$logins = is_array($desc['login']) ? $desc['login'] : [$desc['login']];
175
-
176
-	// Tenter une recherche pour essayer de retrouver le DN
177
-	foreach ($logins as $att) {
178
-		$result = @ldap_search($ldap_link, $ldap_base, "$att=$login_search", ['dn']);
179
-		$info = @ldap_get_entries($ldap_link, $result);
180
-		// Ne pas accepter les resultats si plus d'une entree
181
-		// (on veut un attribut unique)
182
-
183
-		if (is_array($info) and $info['count'] == 1) {
184
-			$dn = $info[0]['dn'];
185
-			if (!$checkpass) {
186
-				return $dn;
187
-			}
188
-			if (@ldap_bind($ldap_link, $dn, $pass)) {
189
-				return $dn;
190
-			}
191
-		}
192
-	}
193
-
194
-	if ($checkpass and !isset($dn)) {
195
-		// Si echec, essayer de deviner le DN
196
-		foreach ($logins as $att) {
197
-			$dn = "$att=$login_search, $ldap_base";
198
-			if (@ldap_bind($ldap_link, $dn, $pass)) {
199
-				return "$att=$login_search, $ldap_base";
200
-			}
201
-		}
202
-	}
203
-
204
-	return '';
159
+    // Securite anti-injection et contre un serveur LDAP laxiste
160
+    $login_search = preg_replace('/[^-@._\s\d\w]/', '', $login);
161
+    if (!strlen($login_search) or ($checkpass and !strlen($pass))) {
162
+        return '';
163
+    }
164
+
165
+    // verifier la connexion
166
+    if (!$ldap = auth_ldap_connect($serveur)) {
167
+        return '';
168
+    }
169
+
170
+    $ldap_link = $ldap['link'] ?? null;
171
+    $ldap_base = $ldap['base'] ?? null;
172
+    $desc = !empty($ldap['attributes']) ? $ldap['attributes'] : $GLOBALS['ldap_attributes'];
173
+
174
+    $logins = is_array($desc['login']) ? $desc['login'] : [$desc['login']];
175
+
176
+    // Tenter une recherche pour essayer de retrouver le DN
177
+    foreach ($logins as $att) {
178
+        $result = @ldap_search($ldap_link, $ldap_base, "$att=$login_search", ['dn']);
179
+        $info = @ldap_get_entries($ldap_link, $result);
180
+        // Ne pas accepter les resultats si plus d'une entree
181
+        // (on veut un attribut unique)
182
+
183
+        if (is_array($info) and $info['count'] == 1) {
184
+            $dn = $info[0]['dn'];
185
+            if (!$checkpass) {
186
+                return $dn;
187
+            }
188
+            if (@ldap_bind($ldap_link, $dn, $pass)) {
189
+                return $dn;
190
+            }
191
+        }
192
+    }
193
+
194
+    if ($checkpass and !isset($dn)) {
195
+        // Si echec, essayer de deviner le DN
196
+        foreach ($logins as $att) {
197
+            $dn = "$att=$login_search, $ldap_base";
198
+            if (@ldap_bind($ldap_link, $dn, $pass)) {
199
+                return "$att=$login_search, $ldap_base";
200
+            }
201
+        }
202
+    }
203
+
204
+    return '';
205 205
 }
206 206
 
207 207
 /**
@@ -213,40 +213,40 @@  discard block
 block discarded – undo
213 213
  * @return array
214 214
  */
215 215
 function auth_ldap_retrouver($dn, $desc = [], $serveur = '') {
216
-	// Lire les infos sur l'utilisateur a partir de son DN depuis LDAP
216
+    // Lire les infos sur l'utilisateur a partir de son DN depuis LDAP
217 217
 
218
-	if (!$ldap = auth_ldap_connect($serveur)) {
219
-		spip_log("ldap $serveur injoignable");
218
+    if (!$ldap = auth_ldap_connect($serveur)) {
219
+        spip_log("ldap $serveur injoignable");
220 220
 
221
-		return [];
222
-	}
221
+        return [];
222
+    }
223 223
 
224
-	$ldap_link = $ldap['link'];
225
-	if (!$desc) {
226
-		$desc = $ldap['attributes'] ?: $GLOBALS['ldap_attributes'];
227
-		unset($desc['login']);
228
-	}
229
-	$result = @ldap_read($ldap_link, $dn, 'objectClass=*', array_values($desc));
224
+    $ldap_link = $ldap['link'];
225
+    if (!$desc) {
226
+        $desc = $ldap['attributes'] ?: $GLOBALS['ldap_attributes'];
227
+        unset($desc['login']);
228
+    }
229
+    $result = @ldap_read($ldap_link, $dn, 'objectClass=*', array_values($desc));
230 230
 
231
-	if (!$result) {
232
-		return [];
233
-	}
231
+    if (!$result) {
232
+        return [];
233
+    }
234 234
 
235
-	// Recuperer les donnees du premier (unique?) compte de l'auteur
236
-	$val = @ldap_get_entries($ldap_link, $result);
237
-	if (!is_array($val) or !is_array($val[0])) {
238
-		return [];
239
-	}
240
-	$val = $val[0];
235
+    // Recuperer les donnees du premier (unique?) compte de l'auteur
236
+    $val = @ldap_get_entries($ldap_link, $result);
237
+    if (!is_array($val) or !is_array($val[0])) {
238
+        return [];
239
+    }
240
+    $val = $val[0];
241 241
 
242
-	// Convertir depuis UTF-8 (jeu de caracteres par defaut)
243
-	include_spip('inc/charsets');
242
+    // Convertir depuis UTF-8 (jeu de caracteres par defaut)
243
+    include_spip('inc/charsets');
244 244
 
245
-	foreach ($desc as $k => $v) {
246
-		$desc[$k] = importer_charset($val[strtolower($v)][0], 'utf-8');
247
-	}
245
+    foreach ($desc as $k => $v) {
246
+        $desc[$k] = importer_charset($val[strtolower($v)][0], 'utf-8');
247
+    }
248 248
 
249
-	return $desc;
249
+    return $desc;
250 250
 }
251 251
 
252 252
 
@@ -258,7 +258,7 @@  discard block
 block discarded – undo
258 258
  * @return string
259 259
  */
260 260
 function auth_ldap_retrouver_login($login, $serveur = '') {
261
-	return auth_ldap_search($login, '', false, $serveur) ? $login : '';
261
+    return auth_ldap_search($login, '', false, $serveur) ? $login : '';
262 262
 }
263 263
 
264 264
 /**
@@ -278,9 +278,9 @@  discard block
 block discarded – undo
278 278
  *   Message d'erreur si login non valide, chaîne vide sinon
279 279
  */
280 280
 function auth_ldap_verifier_pass($login, $new_pass, $id_auteur = 0, $serveur = '') {
281
-	include_spip('auth/spip');
281
+    include_spip('auth/spip');
282 282
 
283
-	return auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur);
283
+    return auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur);
284 284
 }
285 285
 
286 286
 /**
@@ -301,7 +301,7 @@  discard block
 block discarded – undo
301 301
  *   ```
302 302
  */
303 303
 function auth_ldap_autoriser_modifier_pass($serveur = '') {
304
-	return true;
304
+    return true;
305 305
 }
306 306
 
307 307
 /**
@@ -319,23 +319,23 @@  discard block
 block discarded – undo
319 319
  *    Informe du succès ou de l'echec du changement du mot de passe
320 320
  */
321 321
 function auth_ldap_modifier_pass($login, $new_pass, $id_auteur, $serveur = '') {
322
-	if (is_null($new_pass) or auth_ldap_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
323
-		return false;
324
-	}
325
-	if (!$ldap = auth_ldap_connect($serveur)) {
326
-		return false;
327
-	}
328
-	$link = $ldap['link'];
329
-	include_spip('inc/session');
330
-	$dn = session_get('ldap_dn');
331
-	if ('' == $dn) {
332
-		return false;
333
-	}
334
-	if (!ldap_bind($link, $dn, session_get('ldap_password'))) {
335
-		return false;
336
-	}
337
-	$encoded_pass = '{MD5}' . base64_encode(pack('H*', md5($new_pass)));
338
-	$success = ldap_mod_replace($link, $dn, ['userPassword' => $encoded_pass]);
339
-
340
-	return $success;
322
+    if (is_null($new_pass) or auth_ldap_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
323
+        return false;
324
+    }
325
+    if (!$ldap = auth_ldap_connect($serveur)) {
326
+        return false;
327
+    }
328
+    $link = $ldap['link'];
329
+    include_spip('inc/session');
330
+    $dn = session_get('ldap_dn');
331
+    if ('' == $dn) {
332
+        return false;
333
+    }
334
+    if (!ldap_bind($link, $dn, session_get('ldap_password'))) {
335
+        return false;
336
+    }
337
+    $encoded_pass = '{MD5}' . base64_encode(pack('H*', md5($new_pass)));
338
+    $success = ldap_mod_replace($link, $dn, ['userPassword' => $encoded_pass]);
339
+
340
+    return $success;
341 341
 }
Please login to merge, or discard this patch.
ecrire/inc/commencer_page.php 2 patches
Indentation   +58 added lines, -58 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
 /**
@@ -43,25 +43,25 @@  discard block
 block discarded – undo
43 43
  * @return string Code HTML
44 44
  **/
45 45
 function inc_commencer_page_dist(
46
-	$titre = '',
47
-	$rubrique = 'accueil',
48
-	$sous_rubrique = 'accueil',
49
-	$id_rubrique = '',
50
-	$menu = true,
51
-	$minipres = false,
52
-	$alertes = true
46
+    $titre = '',
47
+    $rubrique = 'accueil',
48
+    $sous_rubrique = 'accueil',
49
+    $id_rubrique = '',
50
+    $menu = true,
51
+    $minipres = false,
52
+    $alertes = true
53 53
 ) {
54 54
 
55
-	include_spip('inc/headers');
55
+    include_spip('inc/headers');
56 56
 
57
-	http_no_cache();
57
+    http_no_cache();
58 58
 
59
-	return init_entete($titre, $id_rubrique, $minipres)
60
-	. init_body($rubrique, $sous_rubrique, $id_rubrique, $menu)
61
-	. "<div id='page'>"
62
-	. auteurs_recemment_connectes($GLOBALS['connect_id_auteur'])
63
-	. ($alertes ? alertes_auteur($GLOBALS['connect_id_auteur']) : '')
64
-	. '<div class="largeur">';
59
+    return init_entete($titre, $id_rubrique, $minipres)
60
+    . init_body($rubrique, $sous_rubrique, $id_rubrique, $menu)
61
+    . "<div id='page'>"
62
+    . auteurs_recemment_connectes($GLOBALS['connect_id_auteur'])
63
+    . ($alertes ? alertes_auteur($GLOBALS['connect_id_auteur']) : '')
64
+    . '<div class="largeur">';
65 65
 }
66 66
 
67 67
 /**
@@ -82,21 +82,21 @@  discard block
 block discarded – undo
82 82
  *     Entête du fichier HTML avec le DOCTYPE
83 83
  */
84 84
 function init_entete($titre = '', $dummy = 0, $minipres = false) {
85
-	include_spip('inc/texte');
86
-	if (!$nom_site_spip = textebrut(typo($GLOBALS['meta']['nom_site']))) {
87
-		$nom_site_spip = _T('info_mon_site_spip');
88
-	}
89
-
90
-	$titre = '['
91
-		. $nom_site_spip
92
-		. ']'
93
-		. ($titre ? ' ' . textebrut(typo($titre)) : '');
94
-
95
-	return _DOCTYPE_ECRIRE
96
-	. html_lang_attributes()
97
-	. "<head>\n"
98
-	. init_head($titre, $dummy, $minipres)
99
-	. "</head>\n";
85
+    include_spip('inc/texte');
86
+    if (!$nom_site_spip = textebrut(typo($GLOBALS['meta']['nom_site']))) {
87
+        $nom_site_spip = _T('info_mon_site_spip');
88
+    }
89
+
90
+    $titre = '['
91
+        . $nom_site_spip
92
+        . ']'
93
+        . ($titre ? ' ' . textebrut(typo($titre)) : '');
94
+
95
+    return _DOCTYPE_ECRIRE
96
+    . html_lang_attributes()
97
+    . "<head>\n"
98
+    . init_head($titre, $dummy, $minipres)
99
+    . "</head>\n";
100 100
 }
101 101
 
102 102
 /**
@@ -110,7 +110,7 @@  discard block
 block discarded – undo
110 110
  * @return string
111 111
  */
112 112
 function init_head($titre = '', $dummy = 0, $minipres = false) {
113
-	return recuperer_fond('prive/squelettes/head/dist', ['titre' => $titre, 'minipres' => $minipres ? ' ' : '']);
113
+    return recuperer_fond('prive/squelettes/head/dist', ['titre' => $titre, 'minipres' => $minipres ? ' ' : '']);
114 114
 }
115 115
 
116 116
 /**
@@ -132,20 +132,20 @@  discard block
 block discarded – undo
132 132
  */
133 133
 function init_body($rubrique = 'accueil', $sous_rubrique = 'accueil', $id_rubrique = '', $menu = true) {
134 134
 
135
-	$res = pipeline('body_prive', "<body class='"
136
-		. init_body_class() . ' ' . _request('exec') . "'"
137
-		. ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : '')
138
-		. '>');
135
+    $res = pipeline('body_prive', "<body class='"
136
+        . init_body_class() . ' ' . _request('exec') . "'"
137
+        . ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : '')
138
+        . '>');
139 139
 
140
-	if (!$menu) {
141
-		return $res;
142
-	}
140
+    if (!$menu) {
141
+        return $res;
142
+    }
143 143
 
144 144
 
145
-	$bandeau = charger_fonction('bandeau', 'inc');
145
+    $bandeau = charger_fonction('bandeau', 'inc');
146 146
 
147
-	return $res
148
-	. $bandeau();
147
+    return $res
148
+    . $bandeau();
149 149
 }
150 150
 
151 151
 /**
@@ -157,25 +157,25 @@  discard block
 block discarded – undo
157 157
  * @return string Classes CSS (séparées par des espaces)
158 158
  */
159 159
 function init_body_class() {
160
-	$prefs = $GLOBALS['visiteur_session']['prefs'] ?? [];
160
+    $prefs = $GLOBALS['visiteur_session']['prefs'] ?? [];
161 161
 
162
-	$GLOBALS['spip_display'] = intval($prefs['display'] ?? 2);
163
-	$spip_display_navigation = isset($prefs['display_navigation']) ? spip_sanitize_classname($prefs['display_navigation']) : 'navigation_avec_icones';
164
-	$spip_display_outils = ($prefs['display_outils'] ?? true) ? 'navigation_avec_outils' : 'navigation_sans_outils';
165
-	$GLOBALS['spip_ecran'] = isset($_COOKIE['spip_ecran']) ? spip_sanitize_classname($_COOKIE['spip_ecran']) : 'etroit';
162
+    $GLOBALS['spip_display'] = intval($prefs['display'] ?? 2);
163
+    $spip_display_navigation = isset($prefs['display_navigation']) ? spip_sanitize_classname($prefs['display_navigation']) : 'navigation_avec_icones';
164
+    $spip_display_outils = ($prefs['display_outils'] ?? true) ? 'navigation_avec_outils' : 'navigation_sans_outils';
165
+    $GLOBALS['spip_ecran'] = isset($_COOKIE['spip_ecran']) ? spip_sanitize_classname($_COOKIE['spip_ecran']) : 'etroit';
166 166
 
167
-	$display_class = [
168
-		0 => 'icones_img_texte'
169
-		/*init*/,
170
-		1 => 'icones_texte',
171
-		2 => 'icones_img_texte',
172
-		3 => 'icones_img'
173
-	];
167
+    $display_class = [
168
+        0 => 'icones_img_texte'
169
+        /*init*/,
170
+        1 => 'icones_texte',
171
+        2 => 'icones_img_texte',
172
+        3 => 'icones_img'
173
+    ];
174 174
 
175
-	$couleur = intval($prefs['couleur'] ?? 2);
175
+    $couleur = intval($prefs['couleur'] ?? 2);
176 176
 
177
-	$classes = $GLOBALS['spip_ecran'] . " spip-theme-colors-$couleur $spip_display_navigation $spip_display_outils " . $display_class[$GLOBALS['spip_display']];
178
-	return spip_sanitize_classname($classes);
177
+    $classes = $GLOBALS['spip_ecran'] . " spip-theme-colors-$couleur $spip_display_navigation $spip_display_outils " . $display_class[$GLOBALS['spip_display']];
178
+    return spip_sanitize_classname($classes);
179 179
 }
180 180
 
181 181
 
@@ -186,5 +186,5 @@  discard block
 block discarded – undo
186 186
  * @return string
187 187
  */
188 188
 function auteurs_recemment_connectes($id_auteur) {
189
-	return recuperer_fond('prive/objets/liste/auteurs_enligne');
189
+    return recuperer_fond('prive/objets/liste/auteurs_enligne');
190 190
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -90,7 +90,7 @@  discard block
 block discarded – undo
90 90
 	$titre = '['
91 91
 		. $nom_site_spip
92 92
 		. ']'
93
-		. ($titre ? ' ' . textebrut(typo($titre)) : '');
93
+		. ($titre ? ' '.textebrut(typo($titre)) : '');
94 94
 
95 95
 	return _DOCTYPE_ECRIRE
96 96
 	. html_lang_attributes()
@@ -133,7 +133,7 @@  discard block
 block discarded – undo
133 133
 function init_body($rubrique = 'accueil', $sous_rubrique = 'accueil', $id_rubrique = '', $menu = true) {
134 134
 
135 135
 	$res = pipeline('body_prive', "<body class='"
136
-		. init_body_class() . ' ' . _request('exec') . "'"
136
+		. init_body_class().' '._request('exec')."'"
137 137
 		. ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : '')
138 138
 		. '>');
139 139
 
@@ -174,7 +174,7 @@  discard block
 block discarded – undo
174 174
 
175 175
 	$couleur = intval($prefs['couleur'] ?? 2);
176 176
 
177
-	$classes = $GLOBALS['spip_ecran'] . " spip-theme-colors-$couleur $spip_display_navigation $spip_display_outils " . $display_class[$GLOBALS['spip_display']];
177
+	$classes = $GLOBALS['spip_ecran']." spip-theme-colors-$couleur $spip_display_navigation $spip_display_outils ".$display_class[$GLOBALS['spip_display']];
178 178
 	return spip_sanitize_classname($classes);
179 179
 }
180 180
 
Please login to merge, or discard this patch.
ecrire/public.php 2 patches
Indentation   +188 added lines, -188 removed lines patch added patch discarded remove patch
@@ -21,193 +21,193 @@
 block discarded – undo
21 21
 // par souci de compatiilite).
22 22
 
23 23
 if (isset($GLOBALS['_INC_PUBLIC']) and $GLOBALS['_INC_PUBLIC']) {
24
-	echo recuperer_fond($fond, $contexte_inclus, [], _request('connect') ?? '');
24
+    echo recuperer_fond($fond, $contexte_inclus, [], _request('connect') ?? '');
25 25
 } else {
26
-	$GLOBALS['_INC_PUBLIC'] = 1;
27
-	define('_PIPELINE_SUFFIX', test_espace_prive() ? '_prive' : '');
28
-
29
-	// Faut-il initialiser SPIP ? (oui dans le cas general)
30
-	if (!defined('_DIR_RESTREINT_ABS')) {
31
-		if (
32
-			defined('_DIR_RESTREINT')
33
-			and @file_exists(_ROOT_RESTREINT . 'inc_version.php')
34
-		) {
35
-			include_once _ROOT_RESTREINT . 'inc_version.php';
36
-		} else {
37
-			die('inc_version absent ?');
38
-		}
39
-	} // $fond defini dans le fichier d'appel ?
40
-
41
-	else {
42
-		if (isset($fond) and !_request('fond')) {
43
-		} // fond demande dans l'url par page=xxxx ?
44
-		else {
45
-			if (isset($_GET[_SPIP_PAGE])) {
46
-				$fond = (string)$_GET[_SPIP_PAGE];
47
-
48
-				// Securite
49
-				if (
50
-					strstr($fond, '/')
51
-					and !(
52
-						isset($GLOBALS['visiteur_session']) // pour eviter d'evaluer la suite pour les anonymes
53
-						and include_spip('inc/autoriser')
54
-						and autoriser('webmestre'))
55
-				) {
56
-					include_spip('inc/minipres');
57
-					echo minipres();
58
-					exit;
59
-				}
60
-				// l'argument Page a priorite sur l'argument action
61
-				// le cas se presente a cause des RewriteRule d'Apache
62
-				// qui permettent d'ajouter un argument dans la QueryString
63
-				// mais pas d'en retirer un en conservant les autres.
64
-				if (isset($_GET['action']) and $_GET['action'] === $fond) {
65
-					unset($_GET['action']);
66
-				}
67
-				# sinon, fond par defaut
68
-			} else {
69
-				// sinon fond par defaut (cf. assembler.php)
70
-				$fond = pipeline('detecter_fond_par_defaut', '');
71
-			}
72
-		}
73
-	}
74
-
75
-	$tableau_des_temps = [];
76
-
77
-	// Particularites de certains squelettes
78
-	if ($fond == 'login') {
79
-		$forcer_lang = true;
80
-	}
81
-
82
-	if (
83
-		isset($forcer_lang) and $forcer_lang and ($forcer_lang !== 'non')
84
-		and !_request('action')
85
-		and $_SERVER['REQUEST_METHOD'] != 'POST'
86
-	) {
87
-		include_spip('inc/lang');
88
-		verifier_lang_url();
89
-	}
90
-
91
-	$lang = !isset($_GET['lang']) ? '' : lang_select($_GET['lang']);
92
-
93
-	// Charger l'aiguilleur des traitements derogatoires
94
-	// (action en base SQL, formulaires CVT, AJax)
95
-	if (_request('action') or _request('var_ajax') or _request('formulaire_action')) {
96
-		include_spip('public/aiguiller');
97
-		if (
98
-			// cas des appels actions ?action=xxx
99
-			traiter_appels_actions()
100
-			or
101
-			// cas des hits ajax sur les inclusions ajax
102
-			traiter_appels_inclusions_ajax()
103
-			or
104
-			// cas des formulaires charger/verifier/traiter
105
-			traiter_formulaires_dynamiques()
106
-		) {
107
-			// lancer les taches sur affichage final, comme le cron
108
-			// mais sans rien afficher
109
-			$GLOBALS['html'] = false; // ne rien afficher
110
-			pipeline('affichage_final' . _PIPELINE_SUFFIX, '');
111
-			exit; // le hit est fini !
112
-		}
113
-	}
114
-
115
-	// Il y a du texte a produire, charger le metteur en page
116
-	include_spip('public/assembler');
117
-	$page = assembler($fond, _request('connect') ?? '');
118
-
119
-	if (isset($page['status'])) {
120
-		include_spip('inc/headers');
121
-		http_response_code($page['status']);
122
-	}
123
-
124
-	// Content-Type ?
125
-	if (!isset($page['entetes']['Content-Type'])) {
126
-		$charset = $GLOBALS['meta']['charset'] ?? 'utf-8';
127
-		$page['entetes']['Content-Type'] = 'text/html; charset=' . $charset;
128
-		$html = true;
129
-	} else {
130
-		$html = preg_match(',^\s*text/html,', $page['entetes']['Content-Type']);
131
-	}
132
-
133
-	// Tester si on est admin et il y a des choses supplementaires a dire
134
-	// type tableau pour y mettre des choses au besoin.
135
-	$debug = ((_request('var_mode') == 'debug') or $tableau_des_temps) ? [1] : [];
136
-
137
-	// affiche-t-on les boutons d'administration ? voir f_admin()
138
-	$affiche_boutons_admin = ($html and (
139
-			(isset($_COOKIE['spip_admin']) and (!isset($flag_preserver) or !$flag_preserver))
140
-			or ($debug and include_spip('inc/autoriser') and autoriser('debug'))
141
-			or (defined('_VAR_PREVIEW') and _VAR_PREVIEW)
142
-		));
143
-
144
-	if ($affiche_boutons_admin) {
145
-		include_spip('balise/formulaire_admin');
146
-	}
147
-
148
-
149
-	// Execution de la page calculee
150
-
151
-	// traitements sur les entetes avant envoi
152
-	// peut servir pour le plugin de stats
153
-	$page['entetes'] = pipeline('affichage_entetes_final' . _PIPELINE_SUFFIX, $page['entetes']);
154
-
155
-
156
-	// eval $page et affecte $res
157
-	include _ROOT_RESTREINT . 'public/evaluer_page.php';
158
-	envoyer_entetes($page['entetes']);
159
-	if ($res === false) {
160
-		include_spip('inc/autoriser');
161
-		$err = _T('zbug_erreur_execution_page');
162
-		if (autoriser('webmestre')) {
163
-			$err .= "\n<hr />\n"
164
-				. highlight_string($page['codephp'], true)
165
-				. "\n<hr />\n";
166
-		}
167
-		$msg = [$err];
168
-		erreur_squelette($msg);
169
-	}
170
-
171
-	//
172
-	// Envoyer le resultat apres post-traitements
173
-	//
174
-	// (c'est ici qu'on fait var_recherche, validation, boutons d'admin,
175
-	// cf. public/assembler.php)
176
-	echo pipeline('affichage_final' . _PIPELINE_SUFFIX, $page['texte']);
177
-
178
-	if ($lang) {
179
-		lang_select();
180
-	}
181
-	// l'affichage de la page a pu lever des erreurs (inclusion manquante)
182
-	// il faut tester a nouveau
183
-	$debug = ((_request('var_mode') == 'debug') or $tableau_des_temps) ? [1] : [];
184
-
185
-	// Appel au debusqueur en cas d'erreurs ou de demande de trace
186
-	// at last
187
-	if ($debug) {
188
-		// en cas d'erreur, retester l'affichage
189
-		if ($html and ($affiche_boutons_admin or $debug)) {
190
-			$var_mode_affiche = _request('var_mode_affiche');
191
-			$var_mode_objet = _request('var_mode_objet');
192
-			$GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet . 'tout'] = ($var_mode_affiche == 'validation' ? $page['texte'] : '');
193
-			echo erreur_squelette(false);
194
-		}
195
-	} else {
196
-		if (
197
-			isset($GLOBALS['meta']['date_prochain_postdate'])
198
-			and $GLOBALS['meta']['date_prochain_postdate'] <= time()
199
-		) {
200
-			include_spip('inc/rubriques');
201
-			calculer_prochain_postdate(true);
202
-		}
203
-
204
-		// Effectuer une tache de fond ?
205
-		// si _DIRECT_CRON_FORCE est present, on force l'appel
206
-		if (defined('_DIRECT_CRON_FORCE')) {
207
-			cron();
208
-		}
209
-
210
-		// sauver le cache chemin si necessaire
211
-		save_path_cache();
212
-	}
26
+    $GLOBALS['_INC_PUBLIC'] = 1;
27
+    define('_PIPELINE_SUFFIX', test_espace_prive() ? '_prive' : '');
28
+
29
+    // Faut-il initialiser SPIP ? (oui dans le cas general)
30
+    if (!defined('_DIR_RESTREINT_ABS')) {
31
+        if (
32
+            defined('_DIR_RESTREINT')
33
+            and @file_exists(_ROOT_RESTREINT . 'inc_version.php')
34
+        ) {
35
+            include_once _ROOT_RESTREINT . 'inc_version.php';
36
+        } else {
37
+            die('inc_version absent ?');
38
+        }
39
+    } // $fond defini dans le fichier d'appel ?
40
+
41
+    else {
42
+        if (isset($fond) and !_request('fond')) {
43
+        } // fond demande dans l'url par page=xxxx ?
44
+        else {
45
+            if (isset($_GET[_SPIP_PAGE])) {
46
+                $fond = (string)$_GET[_SPIP_PAGE];
47
+
48
+                // Securite
49
+                if (
50
+                    strstr($fond, '/')
51
+                    and !(
52
+                        isset($GLOBALS['visiteur_session']) // pour eviter d'evaluer la suite pour les anonymes
53
+                        and include_spip('inc/autoriser')
54
+                        and autoriser('webmestre'))
55
+                ) {
56
+                    include_spip('inc/minipres');
57
+                    echo minipres();
58
+                    exit;
59
+                }
60
+                // l'argument Page a priorite sur l'argument action
61
+                // le cas se presente a cause des RewriteRule d'Apache
62
+                // qui permettent d'ajouter un argument dans la QueryString
63
+                // mais pas d'en retirer un en conservant les autres.
64
+                if (isset($_GET['action']) and $_GET['action'] === $fond) {
65
+                    unset($_GET['action']);
66
+                }
67
+                # sinon, fond par defaut
68
+            } else {
69
+                // sinon fond par defaut (cf. assembler.php)
70
+                $fond = pipeline('detecter_fond_par_defaut', '');
71
+            }
72
+        }
73
+    }
74
+
75
+    $tableau_des_temps = [];
76
+
77
+    // Particularites de certains squelettes
78
+    if ($fond == 'login') {
79
+        $forcer_lang = true;
80
+    }
81
+
82
+    if (
83
+        isset($forcer_lang) and $forcer_lang and ($forcer_lang !== 'non')
84
+        and !_request('action')
85
+        and $_SERVER['REQUEST_METHOD'] != 'POST'
86
+    ) {
87
+        include_spip('inc/lang');
88
+        verifier_lang_url();
89
+    }
90
+
91
+    $lang = !isset($_GET['lang']) ? '' : lang_select($_GET['lang']);
92
+
93
+    // Charger l'aiguilleur des traitements derogatoires
94
+    // (action en base SQL, formulaires CVT, AJax)
95
+    if (_request('action') or _request('var_ajax') or _request('formulaire_action')) {
96
+        include_spip('public/aiguiller');
97
+        if (
98
+            // cas des appels actions ?action=xxx
99
+            traiter_appels_actions()
100
+            or
101
+            // cas des hits ajax sur les inclusions ajax
102
+            traiter_appels_inclusions_ajax()
103
+            or
104
+            // cas des formulaires charger/verifier/traiter
105
+            traiter_formulaires_dynamiques()
106
+        ) {
107
+            // lancer les taches sur affichage final, comme le cron
108
+            // mais sans rien afficher
109
+            $GLOBALS['html'] = false; // ne rien afficher
110
+            pipeline('affichage_final' . _PIPELINE_SUFFIX, '');
111
+            exit; // le hit est fini !
112
+        }
113
+    }
114
+
115
+    // Il y a du texte a produire, charger le metteur en page
116
+    include_spip('public/assembler');
117
+    $page = assembler($fond, _request('connect') ?? '');
118
+
119
+    if (isset($page['status'])) {
120
+        include_spip('inc/headers');
121
+        http_response_code($page['status']);
122
+    }
123
+
124
+    // Content-Type ?
125
+    if (!isset($page['entetes']['Content-Type'])) {
126
+        $charset = $GLOBALS['meta']['charset'] ?? 'utf-8';
127
+        $page['entetes']['Content-Type'] = 'text/html; charset=' . $charset;
128
+        $html = true;
129
+    } else {
130
+        $html = preg_match(',^\s*text/html,', $page['entetes']['Content-Type']);
131
+    }
132
+
133
+    // Tester si on est admin et il y a des choses supplementaires a dire
134
+    // type tableau pour y mettre des choses au besoin.
135
+    $debug = ((_request('var_mode') == 'debug') or $tableau_des_temps) ? [1] : [];
136
+
137
+    // affiche-t-on les boutons d'administration ? voir f_admin()
138
+    $affiche_boutons_admin = ($html and (
139
+            (isset($_COOKIE['spip_admin']) and (!isset($flag_preserver) or !$flag_preserver))
140
+            or ($debug and include_spip('inc/autoriser') and autoriser('debug'))
141
+            or (defined('_VAR_PREVIEW') and _VAR_PREVIEW)
142
+        ));
143
+
144
+    if ($affiche_boutons_admin) {
145
+        include_spip('balise/formulaire_admin');
146
+    }
147
+
148
+
149
+    // Execution de la page calculee
150
+
151
+    // traitements sur les entetes avant envoi
152
+    // peut servir pour le plugin de stats
153
+    $page['entetes'] = pipeline('affichage_entetes_final' . _PIPELINE_SUFFIX, $page['entetes']);
154
+
155
+
156
+    // eval $page et affecte $res
157
+    include _ROOT_RESTREINT . 'public/evaluer_page.php';
158
+    envoyer_entetes($page['entetes']);
159
+    if ($res === false) {
160
+        include_spip('inc/autoriser');
161
+        $err = _T('zbug_erreur_execution_page');
162
+        if (autoriser('webmestre')) {
163
+            $err .= "\n<hr />\n"
164
+                . highlight_string($page['codephp'], true)
165
+                . "\n<hr />\n";
166
+        }
167
+        $msg = [$err];
168
+        erreur_squelette($msg);
169
+    }
170
+
171
+    //
172
+    // Envoyer le resultat apres post-traitements
173
+    //
174
+    // (c'est ici qu'on fait var_recherche, validation, boutons d'admin,
175
+    // cf. public/assembler.php)
176
+    echo pipeline('affichage_final' . _PIPELINE_SUFFIX, $page['texte']);
177
+
178
+    if ($lang) {
179
+        lang_select();
180
+    }
181
+    // l'affichage de la page a pu lever des erreurs (inclusion manquante)
182
+    // il faut tester a nouveau
183
+    $debug = ((_request('var_mode') == 'debug') or $tableau_des_temps) ? [1] : [];
184
+
185
+    // Appel au debusqueur en cas d'erreurs ou de demande de trace
186
+    // at last
187
+    if ($debug) {
188
+        // en cas d'erreur, retester l'affichage
189
+        if ($html and ($affiche_boutons_admin or $debug)) {
190
+            $var_mode_affiche = _request('var_mode_affiche');
191
+            $var_mode_objet = _request('var_mode_objet');
192
+            $GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet . 'tout'] = ($var_mode_affiche == 'validation' ? $page['texte'] : '');
193
+            echo erreur_squelette(false);
194
+        }
195
+    } else {
196
+        if (
197
+            isset($GLOBALS['meta']['date_prochain_postdate'])
198
+            and $GLOBALS['meta']['date_prochain_postdate'] <= time()
199
+        ) {
200
+            include_spip('inc/rubriques');
201
+            calculer_prochain_postdate(true);
202
+        }
203
+
204
+        // Effectuer une tache de fond ?
205
+        // si _DIRECT_CRON_FORCE est present, on force l'appel
206
+        if (defined('_DIRECT_CRON_FORCE')) {
207
+            cron();
208
+        }
209
+
210
+        // sauver le cache chemin si necessaire
211
+        save_path_cache();
212
+    }
213 213
 }
Please login to merge, or discard this patch.
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -30,9 +30,9 @@  discard block
 block discarded – undo
30 30
 	if (!defined('_DIR_RESTREINT_ABS')) {
31 31
 		if (
32 32
 			defined('_DIR_RESTREINT')
33
-			and @file_exists(_ROOT_RESTREINT . 'inc_version.php')
33
+			and @file_exists(_ROOT_RESTREINT.'inc_version.php')
34 34
 		) {
35
-			include_once _ROOT_RESTREINT . 'inc_version.php';
35
+			include_once _ROOT_RESTREINT.'inc_version.php';
36 36
 		} else {
37 37
 			die('inc_version absent ?');
38 38
 		}
@@ -43,7 +43,7 @@  discard block
 block discarded – undo
43 43
 		} // fond demande dans l'url par page=xxxx ?
44 44
 		else {
45 45
 			if (isset($_GET[_SPIP_PAGE])) {
46
-				$fond = (string)$_GET[_SPIP_PAGE];
46
+				$fond = (string) $_GET[_SPIP_PAGE];
47 47
 
48 48
 				// Securite
49 49
 				if (
@@ -107,7 +107,7 @@  discard block
 block discarded – undo
107 107
 			// lancer les taches sur affichage final, comme le cron
108 108
 			// mais sans rien afficher
109 109
 			$GLOBALS['html'] = false; // ne rien afficher
110
-			pipeline('affichage_final' . _PIPELINE_SUFFIX, '');
110
+			pipeline('affichage_final'._PIPELINE_SUFFIX, '');
111 111
 			exit; // le hit est fini !
112 112
 		}
113 113
 	}
@@ -124,7 +124,7 @@  discard block
 block discarded – undo
124 124
 	// Content-Type ?
125 125
 	if (!isset($page['entetes']['Content-Type'])) {
126 126
 		$charset = $GLOBALS['meta']['charset'] ?? 'utf-8';
127
-		$page['entetes']['Content-Type'] = 'text/html; charset=' . $charset;
127
+		$page['entetes']['Content-Type'] = 'text/html; charset='.$charset;
128 128
 		$html = true;
129 129
 	} else {
130 130
 		$html = preg_match(',^\s*text/html,', $page['entetes']['Content-Type']);
@@ -150,11 +150,11 @@  discard block
 block discarded – undo
150 150
 
151 151
 	// traitements sur les entetes avant envoi
152 152
 	// peut servir pour le plugin de stats
153
-	$page['entetes'] = pipeline('affichage_entetes_final' . _PIPELINE_SUFFIX, $page['entetes']);
153
+	$page['entetes'] = pipeline('affichage_entetes_final'._PIPELINE_SUFFIX, $page['entetes']);
154 154
 
155 155
 
156 156
 	// eval $page et affecte $res
157
-	include _ROOT_RESTREINT . 'public/evaluer_page.php';
157
+	include _ROOT_RESTREINT.'public/evaluer_page.php';
158 158
 	envoyer_entetes($page['entetes']);
159 159
 	if ($res === false) {
160 160
 		include_spip('inc/autoriser');
@@ -173,7 +173,7 @@  discard block
 block discarded – undo
173 173
 	//
174 174
 	// (c'est ici qu'on fait var_recherche, validation, boutons d'admin,
175 175
 	// cf. public/assembler.php)
176
-	echo pipeline('affichage_final' . _PIPELINE_SUFFIX, $page['texte']);
176
+	echo pipeline('affichage_final'._PIPELINE_SUFFIX, $page['texte']);
177 177
 
178 178
 	if ($lang) {
179 179
 		lang_select();
@@ -189,7 +189,7 @@  discard block
 block discarded – undo
189 189
 		if ($html and ($affiche_boutons_admin or $debug)) {
190 190
 			$var_mode_affiche = _request('var_mode_affiche');
191 191
 			$var_mode_objet = _request('var_mode_objet');
192
-			$GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet . 'tout'] = ($var_mode_affiche == 'validation' ? $page['texte'] : '');
192
+			$GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet.'tout'] = ($var_mode_affiche == 'validation' ? $page['texte'] : '');
193 193
 			echo erreur_squelette(false);
194 194
 		}
195 195
 	} else {
Please login to merge, or discard this patch.
ecrire/iterateur/data.php 2 patches
Spacing   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -234,7 +234,7 @@  discard block
 block discarded – undo
234 234
 		// Si a ce stade on n'a pas de table, il y a un bug
235 235
 		if (!is_array($this->tableau)) {
236 236
 			$this->err = true;
237
-			spip_log('erreur datasource ' . var_export($command, true));
237
+			spip_log('erreur datasource '.var_export($command, true));
238 238
 		}
239 239
 
240 240
 		// {datapath query.results}
@@ -276,7 +276,7 @@  discard block
 block discarded – undo
276 276
 			isset($this->command['sourcemode'])
277 277
 			and !in_array($this->command['sourcemode'], ['table', 'array', 'tableau'])
278 278
 		) {
279
-			charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
279
+			charger_fonction($this->command['sourcemode'].'_to_array', 'inc', true);
280 280
 		}
281 281
 
282 282
 		# le premier argument peut etre un array, une URL etc.
@@ -285,7 +285,7 @@  discard block
 block discarded – undo
285 285
 		# avons-nous un cache dispo ?
286 286
 		$cle = null;
287 287
 		if (is_string($src)) {
288
-			$cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
288
+			$cle = 'datasource_'.md5($this->command['sourcemode'].':'.var_export($this->command['source'], true));
289 289
 		}
290 290
 
291 291
 		$cache = $this->cache_get($cle);
@@ -344,7 +344,7 @@  discard block
 block discarded – undo
344 344
 
345 345
 					if (
346 346
 						!$this->err
347
-						and $data_to_array = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)
347
+						and $data_to_array = charger_fonction($this->command['sourcemode'].'_to_array', 'inc', true)
348 348
 					) {
349 349
 						$args = $this->command['source'];
350 350
 						$args[0] = $data;
@@ -484,13 +484,13 @@  discard block
 block discarded – undo
484 484
 							$tv = '%s';
485 485
 						} # {par valeur/xx/yy} ??
486 486
 						else {
487
-							$tv = 'table_valeur(%s, ' . var_export($r[1], true) . ')';
487
+							$tv = 'table_valeur(%s, '.var_export($r[1], true).')';
488 488
 						}
489 489
 						$sortfunc .= '
490
-					$a = ' . sprintf($tv, '$aa') . ';
491
-					$b = ' . sprintf($tv, '$bb') . ';
490
+					$a = ' . sprintf($tv, '$aa').';
491
+					$b = ' . sprintf($tv, '$bb').';
492 492
 					if ($a <> $b)
493
-						return ($a ' . (!empty($r[2]) ? '>' : '<') . ' $b) ? -1 : 1;';
493
+						return ($a ' . (!empty($r[2]) ? '>' : '<').' $b) ? -1 : 1;';
494 494
 					}
495 495
 				}
496 496
 			}
@@ -643,7 +643,7 @@  discard block
 block discarded – undo
643 643
 function inc_sql_to_array_dist($data) {
644 644
 	# sortir le connecteur de $data
645 645
 	preg_match(',^(?:(\w+):)?(.*)$,Sm', $data, $v);
646
-	$serveur = (string)$v[1];
646
+	$serveur = (string) $v[1];
647 647
 	$req = trim($v[2]);
648 648
 	if ($s = sql_query($req, $serveur)) {
649 649
 		$r = [];
@@ -668,7 +668,7 @@  discard block
 block discarded – undo
668 668
 		$json = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
669 669
 	} catch (JsonException $e) {
670 670
 		$json = null;
671
-		spip_log('Failed to parse Json data : ' . $e->getMessage(), _LOG_INFO);
671
+		spip_log('Failed to parse Json data : '.$e->getMessage(), _LOG_INFO);
672 672
 	}
673 673
 	return is_array($json) ? (array) $json : [];
674 674
 }
@@ -688,13 +688,13 @@  discard block
 block discarded – undo
688 688
 	$i = 1;
689 689
 	foreach ($entete as $k => $v) {
690 690
 		if (trim($v) == '') {
691
-			$v = 'col' . $i;
691
+			$v = 'col'.$i;
692 692
 		} // reperer des eventuelles cases vides
693 693
 		if (is_numeric($v) and $v < 0) {
694
-			$v = '__' . $v;
694
+			$v = '__'.$v;
695 695
 		} // ne pas risquer d'ecraser une cle numerique
696 696
 		if (is_numeric($v)) {
697
-			$v = '_' . $v;
697
+			$v = '_'.$v;
698 698
 		} // ne pas risquer d'ecraser une cle numerique
699 699
 		$v = strtolower(preg_replace(',\W+,', '_', translitteration($v)));
700 700
 		foreach ($csv as &$item) {
@@ -780,7 +780,7 @@  discard block
 block discarded – undo
780 780
  * @return array|bool
781 781
  */
782 782
 function inc_pregfiles_to_array_dist($dir, $regexp = -1, $limit = 10000) {
783
-	return (array)preg_files($dir, $regexp, $limit);
783
+	return (array) preg_files($dir, $regexp, $limit);
784 784
 }
785 785
 
786 786
 /**
@@ -795,13 +795,13 @@  discard block
 block discarded – undo
795 795
 	$glob_to_array = charger_fonction('glob_to_array', 'inc');
796 796
 	$a = $glob_to_array($data);
797 797
 	foreach ($a as &$v) {
798
-		$b = (array)@stat($v);
798
+		$b = (array) @stat($v);
799 799
 		foreach ($b as $k => $ignore) {
800 800
 			if (is_numeric($k)) {
801 801
 				unset($b[$k]);
802 802
 			}
803 803
 		}
804
-		$b['file'] = preg_replace('`/$`', '', $v) ;
804
+		$b['file'] = preg_replace('`/$`', '', $v);
805 805
 		$v = array_merge(
806 806
 			pathinfo($v),
807 807
 			$b
@@ -821,7 +821,7 @@  discard block
 block discarded – undo
821 821
 	$xml_array = [];
822 822
 	for ($object->rewind(); $object->valid(); $object->next()) {
823 823
 		if (array_key_exists($key = $object->key(), $xml_array)) {
824
-			$key .= '-' . uniqid();
824
+			$key .= '-'.uniqid();
825 825
 		}
826 826
 		$vars = get_object_vars($object->current());
827 827
 		if (isset($vars['@attributes'])) {
Please login to merge, or discard this patch.
Indentation   +640 added lines, -640 removed lines patch added patch discarded remove patch
@@ -17,11 +17,11 @@  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
 if (!defined('_DATA_SOURCE_MAX_SIZE')) {
24
-	define('_DATA_SOURCE_MAX_SIZE', 2 * 1_048_576);
24
+    define('_DATA_SOURCE_MAX_SIZE', 2 * 1_048_576);
25 25
 }
26 26
 
27 27
 
@@ -42,17 +42,17 @@  discard block
 block discarded – undo
42 42
  *     Description de la boucle complétée des champs
43 43
  */
44 44
 function iterateur_DATA_dist($b) {
45
-	$b->iterateur = 'DATA'; # designe la classe d'iterateur
46
-	$b->show = [
47
-		'field' => [
48
-			'cle' => 'STRING',
49
-			'valeur' => 'STRING',
50
-			'*' => 'ALL' // Champ joker *
51
-		]
52
-	];
53
-	$b->select[] = '.valeur';
54
-
55
-	return $b;
45
+    $b->iterateur = 'DATA'; # designe la classe d'iterateur
46
+    $b->show = [
47
+        'field' => [
48
+            'cle' => 'STRING',
49
+            'valeur' => 'STRING',
50
+            '*' => 'ALL' // Champ joker *
51
+        ]
52
+    ];
53
+    $b->select[] = '.valeur';
54
+
55
+    return $b;
56 56
 }
57 57
 
58 58
 
@@ -62,522 +62,522 @@  discard block
 block discarded – undo
62 62
  * Pour itérer sur des données quelconques (transformables en tableau)
63 63
  */
64 64
 class IterateurDATA implements Iterator {
65
-	/**
66
-	 * tableau de donnees
67
-	 *
68
-	 * @var array
69
-	 */
70
-	protected $tableau = [];
71
-
72
-	/**
73
-	 * Conditions de filtrage
74
-	 * ie criteres de selection
75
-	 *
76
-	 * @var array
77
-	 */
78
-	protected $filtre = [];
79
-
80
-
81
-	/**
82
-	 * Cle courante
83
-	 *
84
-	 * @var null
85
-	 */
86
-	protected $cle = null;
87
-
88
-	/**
89
-	 * Valeur courante
90
-	 *
91
-	 * @var null
92
-	 */
93
-	protected $valeur = null;
94
-
95
-	/**
96
-	 * Erreur presente ?
97
-	 *
98
-	 * @var bool
99
-	 **/
100
-	public $err = false;
101
-
102
-	/**
103
-	 * Calcul du total des elements
104
-	 *
105
-	 * @var int|null
106
-	 **/
107
-	public $total = null;
108
-
109
-	/**
110
-	 * Constructeur
111
-	 *
112
-	 * @param  $command
113
-	 * @param array $info
114
-	 */
115
-	public function __construct($command, $info = []) {
116
-		$this->type = 'DATA';
117
-		$this->command = $command;
118
-		$this->info = $info;
119
-
120
-		$this->select($command);
121
-	}
122
-
123
-	/**
124
-	 * Revenir au depart
125
-	 *
126
-	 * @return void
127
-	 */
128
-	public function rewind() : void {
129
-		reset($this->tableau);
130
-		$this->cle = array_key_first($this->tableau);
131
-		$this->valeur = current($this->tableau);
132
-		next($this->tableau);
133
-	}
134
-
135
-	/**
136
-	 * Déclarer les critères exceptions
137
-	 *
138
-	 * @return array
139
-	 */
140
-	public function exception_des_criteres() {
141
-		return ['tableau'];
142
-	}
143
-
144
-	/**
145
-	 * Récupérer depuis le cache si possible
146
-	 *
147
-	 * @param string $cle
148
-	 * @return mixed
149
-	 */
150
-	protected function cache_get($cle) {
151
-		if (!$cle) {
152
-			return;
153
-		}
154
-		# utiliser memoization si dispo
155
-		if (!function_exists('cache_get')) {
156
-			return;
157
-		}
158
-
159
-		return cache_get($cle);
160
-	}
161
-
162
-	/**
163
-	 * Stocker en cache si possible
164
-	 *
165
-	 * @param string $cle
166
-	 * @param int $ttl
167
-	 * @param null|mixed $valeur
168
-	 * @return bool
169
-	 */
170
-	protected function cache_set($cle, $ttl, $valeur = null) {
171
-		if (!$cle) {
172
-			return;
173
-		}
174
-		if (is_null($valeur)) {
175
-			$valeur = $this->tableau;
176
-		}
177
-		# utiliser memoization si dispo
178
-		if (!function_exists('cache_set')) {
179
-			return;
180
-		}
181
-
182
-		return cache_set(
183
-			$cle,
184
-			[
185
-				'data' => $valeur,
186
-				'time' => time(),
187
-				'ttl' => $ttl
188
-			],
189
-			3600 + $ttl
190
-		);
191
-		# conserver le cache 1h de plus que la validite demandee,
192
-		# pour le cas ou le serveur distant ne reponde plus
193
-	}
194
-
195
-	/**
196
-	 * Aller chercher les données de la boucle DATA
197
-	 *
198
-	 * @throws Exception
199
-	 * @param array $command
200
-	 * @return void
201
-	 */
202
-	protected function select($command) {
203
-
204
-		// l'iterateur DATA peut etre appele en passant (data:type)
205
-		// le type se retrouve dans la commande 'from'
206
-		// dans ce cas la le critere {source}, si present, n'a pas besoin du 1er argument
207
-		if (isset($this->command['from'][0])) {
208
-			if (isset($this->command['source']) and is_array($this->command['source'])) {
209
-				array_unshift($this->command['source'], $this->command['sourcemode']);
210
-			}
211
-			$this->command['sourcemode'] = $this->command['from'][0];
212
-		}
213
-
214
-		// cherchons differents moyens de creer le tableau de donnees
215
-		// les commandes connues pour l'iterateur DATA
216
-		// sont : {tableau #ARRAY} ; {cle=...} ; {valeur=...}
217
-
218
-		// {source format, [URL], [arg2]...}
219
-		if (
220
-			isset($this->command['source'])
221
-			and isset($this->command['sourcemode'])
222
-		) {
223
-			$this->select_source();
224
-		}
225
-
226
-		// Critere {liste X1, X2, X3}
227
-		if (isset($this->command['liste'])) {
228
-			$this->select_liste();
229
-		}
230
-		if (isset($this->command['enum'])) {
231
-			$this->select_enum();
232
-		}
233
-
234
-		// Si a ce stade on n'a pas de table, il y a un bug
235
-		if (!is_array($this->tableau)) {
236
-			$this->err = true;
237
-			spip_log('erreur datasource ' . var_export($command, true));
238
-		}
239
-
240
-		// {datapath query.results}
241
-		// extraire le chemin "query.results" du tableau de donnees
242
-		if (
243
-			!$this->err
244
-			and isset($this->command['datapath'])
245
-			and is_array($this->command['datapath'])
246
-		) {
247
-			$this->select_datapath();
248
-		}
249
-
250
-		// tri {par x}
251
-		if ($this->command['orderby']) {
252
-			$this->select_orderby();
253
-		}
254
-
255
-		// grouper les resultats {fusion /x/y/z} ;
256
-		if ($this->command['groupby']) {
257
-			$this->select_groupby();
258
-		}
259
-
260
-		$this->rewind();
261
-		#var_dump($this->tableau);
262
-	}
263
-
264
-
265
-	/**
266
-	 * Aller chercher les donnees de la boucle DATA
267
-	 * depuis une source
268
-	 * {source format, [URL], [arg2]...}
269
-	 */
270
-	protected function select_source() {
271
-		# un peu crado : avant de charger le cache il faut charger
272
-		# les class indispensables, sinon PHP ne saura pas gerer
273
-		# l'objet en cache ; cf plugins/icalendar
274
-		# perf : pas de fonction table_to_array ! (table est deja un array)
275
-		if (
276
-			isset($this->command['sourcemode'])
277
-			and !in_array($this->command['sourcemode'], ['table', 'array', 'tableau'])
278
-		) {
279
-			charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
280
-		}
281
-
282
-		# le premier argument peut etre un array, une URL etc.
283
-		$src = $this->command['source'][0];
284
-
285
-		# avons-nous un cache dispo ?
286
-		$cle = null;
287
-		if (is_string($src)) {
288
-			$cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
289
-		}
290
-
291
-		$cache = $this->cache_get($cle);
292
-		if (isset($this->command['datacache'])) {
293
-			$ttl = intval($this->command['datacache']);
294
-		}
295
-		if (
296
-			$cache
297
-			and ($cache['time'] + ($ttl ?? $cache['ttl'])
298
-				> time())
299
-			and !(_request('var_mode') === 'recalcul'
300
-				and include_spip('inc/autoriser')
301
-				and autoriser('recalcul')
302
-			)
303
-		) {
304
-			$this->tableau = $cache['data'];
305
-		} else {
306
-			try {
307
-				if (
308
-					isset($this->command['sourcemode'])
309
-					and in_array(
310
-						$this->command['sourcemode'],
311
-						['table', 'array', 'tableau']
312
-					)
313
-				) {
314
-					if (
315
-						is_array($a = $src)
316
-						or (is_string($a)
317
-							and $a = str_replace('&quot;', '"', $a) # fragile!
318
-							and is_array($a = @unserialize($a)))
319
-					) {
320
-						$this->tableau = $a;
321
-					}
322
-				} else {
323
-					$data = $src;
324
-					if (is_string($src)) {
325
-						if (tester_url_absolue($src)) {
326
-							include_spip('inc/distant');
327
-							$data = recuperer_url($src, ['taille_max' => _DATA_SOURCE_MAX_SIZE]);
328
-							$data = $data['page'] ?? '';
329
-							if (!$data) {
330
-								throw new Exception('404');
331
-							}
332
-							if (!isset($ttl)) {
333
-								$ttl = 24 * 3600;
334
-							}
335
-						} elseif (@is_dir($src)) {
336
-							$data = $src;
337
-						} elseif (@is_readable($src) && @is_file($src)) {
338
-							$data = spip_file_get_contents($src);
339
-						}
340
-						if (!isset($ttl)) {
341
-							$ttl = 10;
342
-						}
343
-					}
344
-
345
-					if (
346
-						!$this->err
347
-						and $data_to_array = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)
348
-					) {
349
-						$args = $this->command['source'];
350
-						$args[0] = $data;
351
-						if (is_array($a = $data_to_array(...$args))) {
352
-							$this->tableau = $a;
353
-						}
354
-					}
355
-				}
356
-
357
-				if (!is_array($this->tableau)) {
358
-					$this->err = true;
359
-				}
360
-
361
-				if (!$this->err and isset($ttl) and $ttl > 0) {
362
-					$this->cache_set($cle, $ttl);
363
-				}
364
-			} catch (Exception $e) {
365
-				$e = $e->getMessage();
366
-				$err = sprintf(
367
-					"[%s, %s] $e",
368
-					$src,
369
-					$this->command['sourcemode']
370
-				);
371
-				erreur_squelette([$err, []]);
372
-				$this->err = true;
373
-			}
374
-		}
375
-
376
-		# en cas d'erreur, utiliser le cache si encore dispo
377
-		if (
378
-			$this->err
379
-			and $cache
380
-		) {
381
-			$this->tableau = $cache['data'];
382
-			$this->err = false;
383
-		}
384
-	}
385
-
386
-
387
-	/**
388
-	 * Retourne un tableau donne depuis un critère liste
389
-	 *
390
-	 * Critère `{liste X1, X2, X3}`
391
-	 *
392
-	 * @see critere_DATA_liste_dist()
393
-	 *
394
-	 **/
395
-	protected function select_liste() {
396
-		# s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
397
-		if (!isset($this->command['liste'][1])) {
398
-			if (!is_array($this->command['liste'][0])) {
399
-				$this->command['liste'] = explode(',', $this->command['liste'][0]);
400
-			} else {
401
-				$this->command['liste'] = $this->command['liste'][0];
402
-			}
403
-		}
404
-		$this->tableau = $this->command['liste'];
405
-	}
406
-
407
-	/**
408
-	 * Retourne un tableau donne depuis un critere liste
409
-	 * Critere {enum Xmin, Xmax}
410
-	 *
411
-	 **/
412
-	protected function select_enum() {
413
-		# s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
414
-		if (!isset($this->command['enum'][1])) {
415
-			if (!is_array($this->command['enum'][0])) {
416
-				$this->command['enum'] = explode(',', $this->command['enum'][0]);
417
-			} else {
418
-				$this->command['enum'] = $this->command['enum'][0];
419
-			}
420
-		}
421
-		if ((is_countable($this->command['enum']) ? count($this->command['enum']) : 0) >= 3) {
422
-			$enum = range(
423
-				array_shift($this->command['enum']),
424
-				array_shift($this->command['enum']),
425
-				array_shift($this->command['enum'])
426
-			);
427
-		} else {
428
-			$enum = range(array_shift($this->command['enum']), array_shift($this->command['enum']));
429
-		}
430
-		$this->tableau = $enum;
431
-	}
432
-
433
-
434
-	/**
435
-	 * extraire le chemin "query.results" du tableau de donnees
436
-	 * {datapath query.results}
437
-	 *
438
-	 **/
439
-	protected function select_datapath() {
440
-		$base = reset($this->command['datapath']);
441
-		if (strlen($base = ltrim(trim($base), '/'))) {
442
-			$this->tableau = table_valeur($this->tableau, $base);
443
-			if (!is_array($this->tableau)) {
444
-				$this->tableau = [];
445
-				$this->err = true;
446
-				spip_log("datapath '$base' absent");
447
-			}
448
-		}
449
-	}
450
-
451
-	/**
452
-	 * Ordonner les resultats
453
-	 * {par x}
454
-	 *
455
-	 **/
456
-	protected function select_orderby() {
457
-		$sortfunc = '';
458
-		$aleas = 0;
459
-		foreach ($this->command['orderby'] as $tri) {
460
-			// virer le / initial pour les criteres de la forme {par /xx}
461
-			if (preg_match(',^\.?([/\w:_-]+)( DESC)?$,iS', ltrim($tri, '/'), $r)) {
462
-				$r = array_pad($r, 3, null);
463
-
464
-				// tri par cle
465
-				if ($r[1] == 'cle') {
466
-					if (isset($r[2]) and $r[2]) {
467
-						krsort($this->tableau);
468
-					} else {
469
-						ksort($this->tableau);
470
-					}
471
-				} # {par hasard}
472
-				else {
473
-					if ($r[1] == 'hasard') {
474
-						$k = array_keys($this->tableau);
475
-						shuffle($k);
476
-						$v = [];
477
-						foreach ($k as $cle) {
478
-							$v[$cle] = $this->tableau[$cle];
479
-						}
480
-						$this->tableau = $v;
481
-					} else {
482
-						# {par valeur}
483
-						if ($r[1] == 'valeur') {
484
-							$tv = '%s';
485
-						} # {par valeur/xx/yy} ??
486
-						else {
487
-							$tv = 'table_valeur(%s, ' . var_export($r[1], true) . ')';
488
-						}
489
-						$sortfunc .= '
65
+    /**
66
+     * tableau de donnees
67
+     *
68
+     * @var array
69
+     */
70
+    protected $tableau = [];
71
+
72
+    /**
73
+     * Conditions de filtrage
74
+     * ie criteres de selection
75
+     *
76
+     * @var array
77
+     */
78
+    protected $filtre = [];
79
+
80
+
81
+    /**
82
+     * Cle courante
83
+     *
84
+     * @var null
85
+     */
86
+    protected $cle = null;
87
+
88
+    /**
89
+     * Valeur courante
90
+     *
91
+     * @var null
92
+     */
93
+    protected $valeur = null;
94
+
95
+    /**
96
+     * Erreur presente ?
97
+     *
98
+     * @var bool
99
+     **/
100
+    public $err = false;
101
+
102
+    /**
103
+     * Calcul du total des elements
104
+     *
105
+     * @var int|null
106
+     **/
107
+    public $total = null;
108
+
109
+    /**
110
+     * Constructeur
111
+     *
112
+     * @param  $command
113
+     * @param array $info
114
+     */
115
+    public function __construct($command, $info = []) {
116
+        $this->type = 'DATA';
117
+        $this->command = $command;
118
+        $this->info = $info;
119
+
120
+        $this->select($command);
121
+    }
122
+
123
+    /**
124
+     * Revenir au depart
125
+     *
126
+     * @return void
127
+     */
128
+    public function rewind() : void {
129
+        reset($this->tableau);
130
+        $this->cle = array_key_first($this->tableau);
131
+        $this->valeur = current($this->tableau);
132
+        next($this->tableau);
133
+    }
134
+
135
+    /**
136
+     * Déclarer les critères exceptions
137
+     *
138
+     * @return array
139
+     */
140
+    public function exception_des_criteres() {
141
+        return ['tableau'];
142
+    }
143
+
144
+    /**
145
+     * Récupérer depuis le cache si possible
146
+     *
147
+     * @param string $cle
148
+     * @return mixed
149
+     */
150
+    protected function cache_get($cle) {
151
+        if (!$cle) {
152
+            return;
153
+        }
154
+        # utiliser memoization si dispo
155
+        if (!function_exists('cache_get')) {
156
+            return;
157
+        }
158
+
159
+        return cache_get($cle);
160
+    }
161
+
162
+    /**
163
+     * Stocker en cache si possible
164
+     *
165
+     * @param string $cle
166
+     * @param int $ttl
167
+     * @param null|mixed $valeur
168
+     * @return bool
169
+     */
170
+    protected function cache_set($cle, $ttl, $valeur = null) {
171
+        if (!$cle) {
172
+            return;
173
+        }
174
+        if (is_null($valeur)) {
175
+            $valeur = $this->tableau;
176
+        }
177
+        # utiliser memoization si dispo
178
+        if (!function_exists('cache_set')) {
179
+            return;
180
+        }
181
+
182
+        return cache_set(
183
+            $cle,
184
+            [
185
+                'data' => $valeur,
186
+                'time' => time(),
187
+                'ttl' => $ttl
188
+            ],
189
+            3600 + $ttl
190
+        );
191
+        # conserver le cache 1h de plus que la validite demandee,
192
+        # pour le cas ou le serveur distant ne reponde plus
193
+    }
194
+
195
+    /**
196
+     * Aller chercher les données de la boucle DATA
197
+     *
198
+     * @throws Exception
199
+     * @param array $command
200
+     * @return void
201
+     */
202
+    protected function select($command) {
203
+
204
+        // l'iterateur DATA peut etre appele en passant (data:type)
205
+        // le type se retrouve dans la commande 'from'
206
+        // dans ce cas la le critere {source}, si present, n'a pas besoin du 1er argument
207
+        if (isset($this->command['from'][0])) {
208
+            if (isset($this->command['source']) and is_array($this->command['source'])) {
209
+                array_unshift($this->command['source'], $this->command['sourcemode']);
210
+            }
211
+            $this->command['sourcemode'] = $this->command['from'][0];
212
+        }
213
+
214
+        // cherchons differents moyens de creer le tableau de donnees
215
+        // les commandes connues pour l'iterateur DATA
216
+        // sont : {tableau #ARRAY} ; {cle=...} ; {valeur=...}
217
+
218
+        // {source format, [URL], [arg2]...}
219
+        if (
220
+            isset($this->command['source'])
221
+            and isset($this->command['sourcemode'])
222
+        ) {
223
+            $this->select_source();
224
+        }
225
+
226
+        // Critere {liste X1, X2, X3}
227
+        if (isset($this->command['liste'])) {
228
+            $this->select_liste();
229
+        }
230
+        if (isset($this->command['enum'])) {
231
+            $this->select_enum();
232
+        }
233
+
234
+        // Si a ce stade on n'a pas de table, il y a un bug
235
+        if (!is_array($this->tableau)) {
236
+            $this->err = true;
237
+            spip_log('erreur datasource ' . var_export($command, true));
238
+        }
239
+
240
+        // {datapath query.results}
241
+        // extraire le chemin "query.results" du tableau de donnees
242
+        if (
243
+            !$this->err
244
+            and isset($this->command['datapath'])
245
+            and is_array($this->command['datapath'])
246
+        ) {
247
+            $this->select_datapath();
248
+        }
249
+
250
+        // tri {par x}
251
+        if ($this->command['orderby']) {
252
+            $this->select_orderby();
253
+        }
254
+
255
+        // grouper les resultats {fusion /x/y/z} ;
256
+        if ($this->command['groupby']) {
257
+            $this->select_groupby();
258
+        }
259
+
260
+        $this->rewind();
261
+        #var_dump($this->tableau);
262
+    }
263
+
264
+
265
+    /**
266
+     * Aller chercher les donnees de la boucle DATA
267
+     * depuis une source
268
+     * {source format, [URL], [arg2]...}
269
+     */
270
+    protected function select_source() {
271
+        # un peu crado : avant de charger le cache il faut charger
272
+        # les class indispensables, sinon PHP ne saura pas gerer
273
+        # l'objet en cache ; cf plugins/icalendar
274
+        # perf : pas de fonction table_to_array ! (table est deja un array)
275
+        if (
276
+            isset($this->command['sourcemode'])
277
+            and !in_array($this->command['sourcemode'], ['table', 'array', 'tableau'])
278
+        ) {
279
+            charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
280
+        }
281
+
282
+        # le premier argument peut etre un array, une URL etc.
283
+        $src = $this->command['source'][0];
284
+
285
+        # avons-nous un cache dispo ?
286
+        $cle = null;
287
+        if (is_string($src)) {
288
+            $cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
289
+        }
290
+
291
+        $cache = $this->cache_get($cle);
292
+        if (isset($this->command['datacache'])) {
293
+            $ttl = intval($this->command['datacache']);
294
+        }
295
+        if (
296
+            $cache
297
+            and ($cache['time'] + ($ttl ?? $cache['ttl'])
298
+                > time())
299
+            and !(_request('var_mode') === 'recalcul'
300
+                and include_spip('inc/autoriser')
301
+                and autoriser('recalcul')
302
+            )
303
+        ) {
304
+            $this->tableau = $cache['data'];
305
+        } else {
306
+            try {
307
+                if (
308
+                    isset($this->command['sourcemode'])
309
+                    and in_array(
310
+                        $this->command['sourcemode'],
311
+                        ['table', 'array', 'tableau']
312
+                    )
313
+                ) {
314
+                    if (
315
+                        is_array($a = $src)
316
+                        or (is_string($a)
317
+                            and $a = str_replace('&quot;', '"', $a) # fragile!
318
+                            and is_array($a = @unserialize($a)))
319
+                    ) {
320
+                        $this->tableau = $a;
321
+                    }
322
+                } else {
323
+                    $data = $src;
324
+                    if (is_string($src)) {
325
+                        if (tester_url_absolue($src)) {
326
+                            include_spip('inc/distant');
327
+                            $data = recuperer_url($src, ['taille_max' => _DATA_SOURCE_MAX_SIZE]);
328
+                            $data = $data['page'] ?? '';
329
+                            if (!$data) {
330
+                                throw new Exception('404');
331
+                            }
332
+                            if (!isset($ttl)) {
333
+                                $ttl = 24 * 3600;
334
+                            }
335
+                        } elseif (@is_dir($src)) {
336
+                            $data = $src;
337
+                        } elseif (@is_readable($src) && @is_file($src)) {
338
+                            $data = spip_file_get_contents($src);
339
+                        }
340
+                        if (!isset($ttl)) {
341
+                            $ttl = 10;
342
+                        }
343
+                    }
344
+
345
+                    if (
346
+                        !$this->err
347
+                        and $data_to_array = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)
348
+                    ) {
349
+                        $args = $this->command['source'];
350
+                        $args[0] = $data;
351
+                        if (is_array($a = $data_to_array(...$args))) {
352
+                            $this->tableau = $a;
353
+                        }
354
+                    }
355
+                }
356
+
357
+                if (!is_array($this->tableau)) {
358
+                    $this->err = true;
359
+                }
360
+
361
+                if (!$this->err and isset($ttl) and $ttl > 0) {
362
+                    $this->cache_set($cle, $ttl);
363
+                }
364
+            } catch (Exception $e) {
365
+                $e = $e->getMessage();
366
+                $err = sprintf(
367
+                    "[%s, %s] $e",
368
+                    $src,
369
+                    $this->command['sourcemode']
370
+                );
371
+                erreur_squelette([$err, []]);
372
+                $this->err = true;
373
+            }
374
+        }
375
+
376
+        # en cas d'erreur, utiliser le cache si encore dispo
377
+        if (
378
+            $this->err
379
+            and $cache
380
+        ) {
381
+            $this->tableau = $cache['data'];
382
+            $this->err = false;
383
+        }
384
+    }
385
+
386
+
387
+    /**
388
+     * Retourne un tableau donne depuis un critère liste
389
+     *
390
+     * Critère `{liste X1, X2, X3}`
391
+     *
392
+     * @see critere_DATA_liste_dist()
393
+     *
394
+     **/
395
+    protected function select_liste() {
396
+        # s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
397
+        if (!isset($this->command['liste'][1])) {
398
+            if (!is_array($this->command['liste'][0])) {
399
+                $this->command['liste'] = explode(',', $this->command['liste'][0]);
400
+            } else {
401
+                $this->command['liste'] = $this->command['liste'][0];
402
+            }
403
+        }
404
+        $this->tableau = $this->command['liste'];
405
+    }
406
+
407
+    /**
408
+     * Retourne un tableau donne depuis un critere liste
409
+     * Critere {enum Xmin, Xmax}
410
+     *
411
+     **/
412
+    protected function select_enum() {
413
+        # s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
414
+        if (!isset($this->command['enum'][1])) {
415
+            if (!is_array($this->command['enum'][0])) {
416
+                $this->command['enum'] = explode(',', $this->command['enum'][0]);
417
+            } else {
418
+                $this->command['enum'] = $this->command['enum'][0];
419
+            }
420
+        }
421
+        if ((is_countable($this->command['enum']) ? count($this->command['enum']) : 0) >= 3) {
422
+            $enum = range(
423
+                array_shift($this->command['enum']),
424
+                array_shift($this->command['enum']),
425
+                array_shift($this->command['enum'])
426
+            );
427
+        } else {
428
+            $enum = range(array_shift($this->command['enum']), array_shift($this->command['enum']));
429
+        }
430
+        $this->tableau = $enum;
431
+    }
432
+
433
+
434
+    /**
435
+     * extraire le chemin "query.results" du tableau de donnees
436
+     * {datapath query.results}
437
+     *
438
+     **/
439
+    protected function select_datapath() {
440
+        $base = reset($this->command['datapath']);
441
+        if (strlen($base = ltrim(trim($base), '/'))) {
442
+            $this->tableau = table_valeur($this->tableau, $base);
443
+            if (!is_array($this->tableau)) {
444
+                $this->tableau = [];
445
+                $this->err = true;
446
+                spip_log("datapath '$base' absent");
447
+            }
448
+        }
449
+    }
450
+
451
+    /**
452
+     * Ordonner les resultats
453
+     * {par x}
454
+     *
455
+     **/
456
+    protected function select_orderby() {
457
+        $sortfunc = '';
458
+        $aleas = 0;
459
+        foreach ($this->command['orderby'] as $tri) {
460
+            // virer le / initial pour les criteres de la forme {par /xx}
461
+            if (preg_match(',^\.?([/\w:_-]+)( DESC)?$,iS', ltrim($tri, '/'), $r)) {
462
+                $r = array_pad($r, 3, null);
463
+
464
+                // tri par cle
465
+                if ($r[1] == 'cle') {
466
+                    if (isset($r[2]) and $r[2]) {
467
+                        krsort($this->tableau);
468
+                    } else {
469
+                        ksort($this->tableau);
470
+                    }
471
+                } # {par hasard}
472
+                else {
473
+                    if ($r[1] == 'hasard') {
474
+                        $k = array_keys($this->tableau);
475
+                        shuffle($k);
476
+                        $v = [];
477
+                        foreach ($k as $cle) {
478
+                            $v[$cle] = $this->tableau[$cle];
479
+                        }
480
+                        $this->tableau = $v;
481
+                    } else {
482
+                        # {par valeur}
483
+                        if ($r[1] == 'valeur') {
484
+                            $tv = '%s';
485
+                        } # {par valeur/xx/yy} ??
486
+                        else {
487
+                            $tv = 'table_valeur(%s, ' . var_export($r[1], true) . ')';
488
+                        }
489
+                        $sortfunc .= '
490 490
 					$a = ' . sprintf($tv, '$aa') . ';
491 491
 					$b = ' . sprintf($tv, '$bb') . ';
492 492
 					if ($a <> $b)
493 493
 						return ($a ' . (!empty($r[2]) ? '>' : '<') . ' $b) ? -1 : 1;';
494
-					}
495
-				}
496
-			}
497
-		}
498
-
499
-		if ($sortfunc) {
500
-			$sortfunc .= "\n return 0;";
501
-			uasort($this->tableau, fn($aa, $bb) => eval($sortfunc));
502
-		}
503
-	}
504
-
505
-
506
-	/**
507
-	 * Grouper les resultats
508
-	 * {fusion /x/y/z}
509
-	 *
510
-	 **/
511
-	protected function select_groupby() {
512
-		// virer le / initial pour les criteres de la forme {fusion /xx}
513
-		if (strlen($fusion = ltrim($this->command['groupby'][0], '/'))) {
514
-			$vu = [];
515
-			foreach ($this->tableau as $k => $v) {
516
-				$val = table_valeur($v, $fusion);
517
-				if (isset($vu[$val])) {
518
-					unset($this->tableau[$k]);
519
-				} else {
520
-					$vu[$val] = true;
521
-				}
522
-			}
523
-		}
524
-	}
525
-
526
-
527
-	/**
528
-	 * L'iterateur est-il encore valide ?
529
-	 *
530
-	 * @return bool
531
-	 */
532
-	public function valid(): bool {
533
-		return !is_null($this->cle);
534
-	}
535
-
536
-	/**
537
-	 * Retourner la valeur
538
-	 *
539
-	 * @return mixed
540
-	 */
541
-	#[\ReturnTypeWillChange]
542
-	public function current() {
543
-		return $this->valeur;
544
-	}
545
-
546
-	/**
547
-	 * Retourner la cle
548
-	 *
549
-	 * @return mixed
550
-	 */
551
-	#[\ReturnTypeWillChange]
552
-	public function key() {
553
-		return $this->cle;
554
-	}
555
-
556
-	/**
557
-	 * Passer a la valeur suivante
558
-	 *
559
-	 * @return void
560
-	 */
561
-	public function next() : void {
562
-		if ($this->valid()) {
563
-			$this->cle = key($this->tableau);
564
-			$this->valeur = current($this->tableau);
565
-			next($this->tableau);
566
-		}
567
-	}
568
-
569
-	/**
570
-	 * Compter le nombre total de resultats
571
-	 *
572
-	 * @return int
573
-	 */
574
-	public function count() {
575
-		if (is_null($this->total)) {
576
-			$this->total = count($this->tableau);
577
-		}
578
-
579
-		return $this->total;
580
-	}
494
+                    }
495
+                }
496
+            }
497
+        }
498
+
499
+        if ($sortfunc) {
500
+            $sortfunc .= "\n return 0;";
501
+            uasort($this->tableau, fn($aa, $bb) => eval($sortfunc));
502
+        }
503
+    }
504
+
505
+
506
+    /**
507
+     * Grouper les resultats
508
+     * {fusion /x/y/z}
509
+     *
510
+     **/
511
+    protected function select_groupby() {
512
+        // virer le / initial pour les criteres de la forme {fusion /xx}
513
+        if (strlen($fusion = ltrim($this->command['groupby'][0], '/'))) {
514
+            $vu = [];
515
+            foreach ($this->tableau as $k => $v) {
516
+                $val = table_valeur($v, $fusion);
517
+                if (isset($vu[$val])) {
518
+                    unset($this->tableau[$k]);
519
+                } else {
520
+                    $vu[$val] = true;
521
+                }
522
+            }
523
+        }
524
+    }
525
+
526
+
527
+    /**
528
+     * L'iterateur est-il encore valide ?
529
+     *
530
+     * @return bool
531
+     */
532
+    public function valid(): bool {
533
+        return !is_null($this->cle);
534
+    }
535
+
536
+    /**
537
+     * Retourner la valeur
538
+     *
539
+     * @return mixed
540
+     */
541
+    #[\ReturnTypeWillChange]
542
+    public function current() {
543
+        return $this->valeur;
544
+    }
545
+
546
+    /**
547
+     * Retourner la cle
548
+     *
549
+     * @return mixed
550
+     */
551
+    #[\ReturnTypeWillChange]
552
+    public function key() {
553
+        return $this->cle;
554
+    }
555
+
556
+    /**
557
+     * Passer a la valeur suivante
558
+     *
559
+     * @return void
560
+     */
561
+    public function next() : void {
562
+        if ($this->valid()) {
563
+            $this->cle = key($this->tableau);
564
+            $this->valeur = current($this->tableau);
565
+            next($this->tableau);
566
+        }
567
+    }
568
+
569
+    /**
570
+     * Compter le nombre total de resultats
571
+     *
572
+     * @return int
573
+     */
574
+    public function count() {
575
+        if (is_null($this->total)) {
576
+            $this->total = count($this->tableau);
577
+        }
578
+
579
+        return $this->total;
580
+    }
581 581
 }
582 582
 
583 583
 /*
@@ -591,7 +591,7 @@  discard block
 block discarded – undo
591 591
  * @return array
592 592
  */
593 593
 function inc_file_to_array_dist($data) {
594
-	return preg_split('/\r?\n/', $data);
594
+    return preg_split('/\r?\n/', $data);
595 595
 }
596 596
 
597 597
 /**
@@ -600,9 +600,9 @@  discard block
 block discarded – undo
600 600
  * @return array
601 601
  */
602 602
 function inc_plugins_to_array_dist() {
603
-	include_spip('inc/plugin');
603
+    include_spip('inc/plugin');
604 604
 
605
-	return liste_chemin_plugin_actifs();
605
+    return liste_chemin_plugin_actifs();
606 606
 }
607 607
 
608 608
 /**
@@ -612,7 +612,7 @@  discard block
 block discarded – undo
612 612
  * @return array
613 613
  */
614 614
 function inc_xml_to_array_dist($data) {
615
-	return @XMLObjectToArray(new SimpleXmlIterator($data));
615
+    return @XMLObjectToArray(new SimpleXmlIterator($data));
616 616
 }
617 617
 
618 618
 /**
@@ -624,14 +624,14 @@  discard block
 block discarded – undo
624 624
  *
625 625
  */
626 626
 function inc_object_to_array($object) {
627
-	if (!is_object($object) && !is_array($object)) {
628
-		return $object;
629
-	}
630
-	if (is_object($object)) {
631
-		$object = get_object_vars($object);
632
-	}
633
-
634
-	return array_map('inc_object_to_array', $object);
627
+    if (!is_object($object) && !is_array($object)) {
628
+        return $object;
629
+    }
630
+    if (is_object($object)) {
631
+        $object = get_object_vars($object);
632
+    }
633
+
634
+    return array_map('inc_object_to_array', $object);
635 635
 }
636 636
 
637 637
 /**
@@ -641,20 +641,20 @@  discard block
 block discarded – undo
641 641
  * @return array|bool
642 642
  */
643 643
 function inc_sql_to_array_dist($data) {
644
-	# sortir le connecteur de $data
645
-	preg_match(',^(?:(\w+):)?(.*)$,Sm', $data, $v);
646
-	$serveur = (string)$v[1];
647
-	$req = trim($v[2]);
648
-	if ($s = sql_query($req, $serveur)) {
649
-		$r = [];
650
-		while ($t = sql_fetch($s)) {
651
-			$r[] = $t;
652
-		}
653
-
654
-		return $r;
655
-	}
656
-
657
-	return false;
644
+    # sortir le connecteur de $data
645
+    preg_match(',^(?:(\w+):)?(.*)$,Sm', $data, $v);
646
+    $serveur = (string)$v[1];
647
+    $req = trim($v[2]);
648
+    if ($s = sql_query($req, $serveur)) {
649
+        $r = [];
650
+        while ($t = sql_fetch($s)) {
651
+            $r[] = $t;
652
+        }
653
+
654
+        return $r;
655
+    }
656
+
657
+    return false;
658 658
 }
659 659
 
660 660
 /**
@@ -664,13 +664,13 @@  discard block
 block discarded – undo
664 664
  * @return array|bool
665 665
  */
666 666
 function inc_json_to_array_dist($data) {
667
-	try {
668
-		$json = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
669
-	} catch (JsonException $e) {
670
-		$json = null;
671
-		spip_log('Failed to parse Json data : ' . $e->getMessage(), _LOG_INFO);
672
-	}
673
-	return is_array($json) ? (array) $json : [];
667
+    try {
668
+        $json = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
669
+    } catch (JsonException $e) {
670
+        $json = null;
671
+        spip_log('Failed to parse Json data : ' . $e->getMessage(), _LOG_INFO);
672
+    }
673
+    return is_array($json) ? (array) $json : [];
674 674
 }
675 675
 
676 676
 /**
@@ -680,30 +680,30 @@  discard block
 block discarded – undo
680 680
  * @return array|bool
681 681
  */
682 682
 function inc_csv_to_array_dist($data) {
683
-	include_spip('inc/csv');
684
-	[$entete, $csv] = analyse_csv($data);
685
-	array_unshift($csv, $entete);
686
-
687
-	include_spip('inc/charsets');
688
-	$i = 1;
689
-	foreach ($entete as $k => $v) {
690
-		if (trim($v) == '') {
691
-			$v = 'col' . $i;
692
-		} // reperer des eventuelles cases vides
693
-		if (is_numeric($v) and $v < 0) {
694
-			$v = '__' . $v;
695
-		} // ne pas risquer d'ecraser une cle numerique
696
-		if (is_numeric($v)) {
697
-			$v = '_' . $v;
698
-		} // ne pas risquer d'ecraser une cle numerique
699
-		$v = strtolower(preg_replace(',\W+,', '_', translitteration($v)));
700
-		foreach ($csv as &$item) {
701
-			$item[$v] = &$item[$k];
702
-		}
703
-		$i++;
704
-	}
705
-
706
-	return $csv;
683
+    include_spip('inc/csv');
684
+    [$entete, $csv] = analyse_csv($data);
685
+    array_unshift($csv, $entete);
686
+
687
+    include_spip('inc/charsets');
688
+    $i = 1;
689
+    foreach ($entete as $k => $v) {
690
+        if (trim($v) == '') {
691
+            $v = 'col' . $i;
692
+        } // reperer des eventuelles cases vides
693
+        if (is_numeric($v) and $v < 0) {
694
+            $v = '__' . $v;
695
+        } // ne pas risquer d'ecraser une cle numerique
696
+        if (is_numeric($v)) {
697
+            $v = '_' . $v;
698
+        } // ne pas risquer d'ecraser une cle numerique
699
+        $v = strtolower(preg_replace(',\W+,', '_', translitteration($v)));
700
+        foreach ($csv as &$item) {
701
+            $item[$v] = &$item[$k];
702
+        }
703
+        $i++;
704
+    }
705
+
706
+    return $csv;
707 707
 }
708 708
 
709 709
 /**
@@ -713,13 +713,13 @@  discard block
 block discarded – undo
713 713
  * @return array|bool
714 714
  */
715 715
 function inc_rss_to_array_dist($data) {
716
-	$tableau = null;
717
-	include_spip('inc/syndic');
718
-	if (is_array($rss = analyser_backend($data))) {
719
-		$tableau = $rss;
720
-	}
716
+    $tableau = null;
717
+    include_spip('inc/syndic');
718
+    if (is_array($rss = analyser_backend($data))) {
719
+        $tableau = $rss;
720
+    }
721 721
 
722
-	return $tableau;
722
+    return $tableau;
723 723
 }
724 724
 
725 725
 /**
@@ -729,9 +729,9 @@  discard block
 block discarded – undo
729 729
  * @return array|bool
730 730
  */
731 731
 function inc_atom_to_array_dist($data) {
732
-	$rss_to_array = charger_fonction('rss_to_array', 'inc');
732
+    $rss_to_array = charger_fonction('rss_to_array', 'inc');
733 733
 
734
-	return $rss_to_array($data);
734
+    return $rss_to_array($data);
735 735
 }
736 736
 
737 737
 /**
@@ -742,12 +742,12 @@  discard block
 block discarded – undo
742 742
  * @return array|bool
743 743
  */
744 744
 function inc_glob_to_array_dist($data) {
745
-	$a = glob(
746
-		$data,
747
-		GLOB_MARK | GLOB_NOSORT | GLOB_BRACE
748
-	);
745
+    $a = glob(
746
+        $data,
747
+        GLOB_MARK | GLOB_NOSORT | GLOB_BRACE
748
+    );
749 749
 
750
-	return $a ?: [];
750
+    return $a ?: [];
751 751
 }
752 752
 
753 753
 /**
@@ -758,14 +758,14 @@  discard block
 block discarded – undo
758 758
  * @throws Exception
759 759
  */
760 760
 function inc_yaml_to_array_dist($data) {
761
-	include_spip('inc/yaml-mini');
762
-	if (!function_exists('yaml_decode')) {
763
-		throw new Exception('YAML: impossible de trouver la fonction yaml_decode');
761
+    include_spip('inc/yaml-mini');
762
+    if (!function_exists('yaml_decode')) {
763
+        throw new Exception('YAML: impossible de trouver la fonction yaml_decode');
764 764
 
765
-		return false;
766
-	}
765
+        return false;
766
+    }
767 767
 
768
-	return yaml_decode($data);
768
+    return yaml_decode($data);
769 769
 }
770 770
 
771 771
 
@@ -780,7 +780,7 @@  discard block
 block discarded – undo
780 780
  * @return array|bool
781 781
  */
782 782
 function inc_pregfiles_to_array_dist($dir, $regexp = -1, $limit = 10000) {
783
-	return (array)preg_files($dir, $regexp, $limit);
783
+    return (array)preg_files($dir, $regexp, $limit);
784 784
 }
785 785
 
786 786
 /**
@@ -792,23 +792,23 @@  discard block
 block discarded – undo
792 792
  * @return array|bool
793 793
  */
794 794
 function inc_ls_to_array_dist($data) {
795
-	$glob_to_array = charger_fonction('glob_to_array', 'inc');
796
-	$a = $glob_to_array($data);
797
-	foreach ($a as &$v) {
798
-		$b = (array)@stat($v);
799
-		foreach ($b as $k => $ignore) {
800
-			if (is_numeric($k)) {
801
-				unset($b[$k]);
802
-			}
803
-		}
804
-		$b['file'] = preg_replace('`/$`', '', $v) ;
805
-		$v = array_merge(
806
-			pathinfo($v),
807
-			$b
808
-		);
809
-	}
810
-
811
-	return $a;
795
+    $glob_to_array = charger_fonction('glob_to_array', 'inc');
796
+    $a = $glob_to_array($data);
797
+    foreach ($a as &$v) {
798
+        $b = (array)@stat($v);
799
+        foreach ($b as $k => $ignore) {
800
+            if (is_numeric($k)) {
801
+                unset($b[$k]);
802
+            }
803
+        }
804
+        $b['file'] = preg_replace('`/$`', '', $v) ;
805
+        $v = array_merge(
806
+            pathinfo($v),
807
+            $b
808
+        );
809
+    }
810
+
811
+    return $a;
812 812
 }
813 813
 
814 814
 /**
@@ -818,25 +818,25 @@  discard block
 block discarded – undo
818 818
  * @return array|bool
819 819
  */
820 820
 function XMLObjectToArray($object) {
821
-	$xml_array = [];
822
-	for ($object->rewind(); $object->valid(); $object->next()) {
823
-		if (array_key_exists($key = $object->key(), $xml_array)) {
824
-			$key .= '-' . uniqid();
825
-		}
826
-		$vars = get_object_vars($object->current());
827
-		if (isset($vars['@attributes'])) {
828
-			foreach ($vars['@attributes'] as $k => $v) {
829
-				$xml_array[$key][$k] = $v;
830
-			}
831
-		}
832
-		if ($object->hasChildren()) {
833
-			$xml_array[$key][] = XMLObjectToArray(
834
-				$object->current()
835
-			);
836
-		} else {
837
-			$xml_array[$key][] = strval($object->current());
838
-		}
839
-	}
840
-
841
-	return $xml_array;
821
+    $xml_array = [];
822
+    for ($object->rewind(); $object->valid(); $object->next()) {
823
+        if (array_key_exists($key = $object->key(), $xml_array)) {
824
+            $key .= '-' . uniqid();
825
+        }
826
+        $vars = get_object_vars($object->current());
827
+        if (isset($vars['@attributes'])) {
828
+            foreach ($vars['@attributes'] as $k => $v) {
829
+                $xml_array[$key][$k] = $v;
830
+            }
831
+        }
832
+        if ($object->hasChildren()) {
833
+            $xml_array[$key][] = XMLObjectToArray(
834
+                $object->current()
835
+            );
836
+        } else {
837
+            $xml_array[$key][] = strval($object->current());
838
+        }
839
+    }
840
+
841
+    return $xml_array;
842 842
 }
Please login to merge, or discard this patch.