[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / inc / documents.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 /**
16 * donne le chemin du fichier relatif a _DIR_IMG
17 * pour stockage 'tel quel' dans la base de donnees
18 *
19 * http://doc.spip.org/@set_spip_doc
20 *
21 * @param string $fichier
22 * @return string
23 */
24 function set_spip_doc($fichier) {
25 if (strpos($fichier, _DIR_IMG) === 0)
26 return substr($fichier, strlen(_DIR_IMG));
27 else
28 return $fichier; // ex: fichier distant
29 }
30
31 /**
32 * donne le chemin complet du fichier
33 *
34 * http://doc.spip.org/@get_spip_doc
35 *
36 * @param string $fichier
37 * @return bool|string
38 */
39 function get_spip_doc($fichier) {
40 // fichier distant
41 if (preg_match(',^\w+://,', $fichier))
42 return $fichier;
43
44 // gestion d'erreurs, fichier=''
45 if (!strlen($fichier))
46 return false;
47
48 $fichier = (
49 strncmp($fichier,_DIR_IMG, strlen(_DIR_IMG))!=0
50 )
51 ? _DIR_IMG . $fichier
52 : $fichier ;
53
54 // fichier normal
55 return $fichier;
56 }
57
58 /**
59 * Creer IMG/pdf/
60 *
61 * http://doc.spip.org/@creer_repertoire_documents
62 *
63 * @param $ext
64 * @return string
65 */
66 function creer_repertoire_documents($ext) {
67 $rep = sous_repertoire(_DIR_IMG, $ext);
68
69 if (!$ext OR !$rep) {
70 spip_log("creer_repertoire_documents '$rep' interdit");
71 exit;
72 }
73
74 // Cette variable de configuration peut etre posee par un plugin
75 // par exemple acces_restreint
76 if (isset($GLOBALS['meta']["creer_htaccess"]) AND $GLOBALS['meta']["creer_htaccess"] == 'oui') {
77 include_spip('inc/acces');
78 verifier_htaccess($rep);
79 }
80
81 return $rep;
82 }
83
84 /**
85 * Efface le repertoire de maniere recursive !
86 *
87 * http://doc.spip.org/@effacer_repertoire_temporaire
88 *
89 * @param string $nom
90 */
91 function effacer_repertoire_temporaire($nom) {
92 $d = opendir($nom);
93 while (($f = readdir($d)) !== false) {
94 if (is_file("$nom/$f"))
95 spip_unlink("$nom/$f");
96 else if ($f <> '.' AND $f <> '..'
97 AND is_dir("$nom/$f"))
98 effacer_repertoire_temporaire("$nom/$f");
99 }
100 closedir($d);
101 @rmdir($nom);
102 }
103
104 //
105 /**
106 * Copier un document $source un dossier IMG/$ext/$orig.$ext
107 * en numerotant eventuellement si un du meme nom existe deja
108 *
109 * http://doc.spip.org/@copier_document
110 *
111 * @param string $ext
112 * @param string $orig
113 * @param string $source
114 * @return bool|mixed|string
115 */
116 function copier_document($ext, $orig, $source) {
117
118 $orig = preg_replace(',\.\.+,', '.', $orig); // pas de .. dans le nom du doc
119 $dir = creer_repertoire_documents($ext);
120 $dest = preg_replace("/[^.=\w-]+/", "_",
121 translitteration(preg_replace("/\.([^.]+)$/", "",
122 preg_replace("/<[^>]*>/", '', basename($orig)))));
123
124 // ne pas accepter de noms de la forme -r90.jpg qui sont reserves
125 // pour les images transformees par rotation (action/documenter)
126 $dest = preg_replace(',-r(90|180|270)$,', '', $dest);
127
128 // Si le document "source" est deja au bon endroit, ne rien faire
129 if ($source == ($dir . $dest . '.' . $ext))
130 return $source;
131
132 // sinon tourner jusqu'a trouver un numero correct
133 $n = 0;
134 while (@file_exists($newFile = $dir . $dest .($n++ ? ('-'.$n) : '').'.'.$ext));
135
136 return deplacer_fichier_upload($source, $newFile);
137 }
138
139 /**
140 * Trouver le dossier utilise pour upload un fichier
141 *
142 * http://doc.spip.org/@determine_upload
143 *
144 * @param string $type
145 * @return bool|string
146 */
147 function determine_upload($type='') {
148 if(!function_exists('autoriser'))
149 include_spip('inc/autoriser');
150
151 if (!autoriser('chargerftp')
152 OR $type == 'logos') # on ne le permet pas pour les logos
153 return false;
154
155 $repertoire = _DIR_TRANSFERT;
156 if (!@is_dir($repertoire)) {
157 $repertoire = str_replace(_DIR_TMP, '', $repertoire);
158 $repertoire = sous_repertoire(_DIR_TMP, $repertoire);
159 }
160
161 if (!$GLOBALS['visiteur_session']['restreint'])
162 return $repertoire;
163 else
164 return sous_repertoire($repertoire, $GLOBALS['visiteur_session']['login']);
165 }
166
167 /**
168 * Deplacer ou copier un fichier
169 *
170 * http://doc.spip.org/@deplacer_fichier_upload
171 *
172 * @param string $source
173 * @param string $dest
174 * @param bool $move
175 * @return bool|mixed|string
176 */
177 function deplacer_fichier_upload($source, $dest, $move=false) {
178 // Securite
179 if (substr($dest,0,strlen(_DIR_RACINE))==_DIR_RACINE)
180 $dest = _DIR_RACINE.preg_replace(',\.\.+,', '.', substr($dest,strlen(_DIR_RACINE)));
181 else
182 $dest = preg_replace(',\.\.+,', '.', $dest);
183
184 if ($move) $ok = @rename($source, $dest);
185 else $ok = @copy($source, $dest);
186 if (!$ok) $ok = @move_uploaded_file($source, $dest);
187 if ($ok)
188 @chmod($dest, _SPIP_CHMOD & ~0111);
189 else {
190 $f = @fopen($dest,'w');
191 if ($f) {
192 fclose ($f);
193 } else {
194 include_spip('inc/flock');
195 raler_fichier($dest);
196 }
197 spip_unlink($dest);
198 }
199 return $ok ? $dest : false;
200 }
201
202
203 // Erreurs d'upload
204 // renvoie false si pas d'erreur
205 // et true si erreur = pas de fichier
206 // pour les autres erreurs affiche le message d'erreur et meurt
207 // http://doc.spip.org/@check_upload_error
208 function check_upload_error($error, $msg='', $return=false) {
209 global $spip_lang_right;
210
211 if (!$error) return false;
212
213 spip_log("Erreur upload $error -- cf. http://php.net/manual/fr/features.file-upload.errors.php");
214
215 switch ($error) {
216
217 case 4: /* UPLOAD_ERR_NO_FILE */
218 return true;
219
220 # on peut affiner les differents messages d'erreur
221 case 1: /* UPLOAD_ERR_INI_SIZE */
222 $msg = _T('upload_limit',
223 array('max' => ini_get('upload_max_filesize')));
224 break;
225 case 2: /* UPLOAD_ERR_FORM_SIZE */
226 $msg = _T('upload_limit',
227 array('max' => ini_get('upload_max_filesize')));
228 break;
229 case 3: /* UPLOAD_ERR_PARTIAL */
230 $msg = _T('upload_limit',
231 array('max' => ini_get('upload_max_filesize')));
232 break;
233
234 default: /* autre */
235 if (!$msg)
236 $msg = _T('pass_erreur').' '. $error
237 . '<br />' . propre("[->http://php.net/manual/fr/features.file-upload.errors.php]");
238 break;
239 }
240
241 spip_log ("erreur upload $error");
242 if ($return)
243 return $msg;
244
245 if(_request("iframe")=="iframe") {
246 echo "<div class='upload_answer upload_error'>$msg</div>";
247 exit;
248 }
249
250 include_spip('inc/minipres');
251 echo minipres($msg,
252 "<div style='text-align: $spip_lang_right'><a href='" . rawurldecode($GLOBALS['redirect']) . "'><button type='button'>" . _T('ecrire:bouton_suivant') . "</button></a></div>");
253 exit;
254 }
255 ?>