[SPIP] +2.1.12
[velocampus/web/www.git] / www / ecrire / inc / getdocument.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2011 *
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 include_spip('inc/minipres');
16
17 // Creer IMG/pdf/
18 // http://doc.spip.org/@creer_repertoire_documents
19 function creer_repertoire_documents($ext) {
20 $rep = sous_repertoire(_DIR_IMG, $ext);
21
22 if (!$ext OR !$rep) {
23 spip_log("creer_repertoire_documents '$rep' interdit");
24 exit;
25 }
26
27 // Cette variable de configuration peut etre posee par un plugin
28 // par exemple acces_restreint
29 if ($GLOBALS['meta']["creer_htaccess"] == 'oui') {
30 include_spip('inc/acces');
31 verifier_htaccess($rep);
32 }
33
34 return $rep;
35 }
36
37 // Efface le repertoire de maniere recursive !
38 // http://doc.spip.org/@effacer_repertoire_temporaire
39 function effacer_repertoire_temporaire($nom) {
40 $d = opendir($nom);
41 while (($f = readdir($d)) !== false) {
42 if (is_file("$nom/$f"))
43 spip_unlink("$nom/$f");
44 else if ($f <> '.' AND $f <> '..'
45 AND is_dir("$nom/$f"))
46 effacer_repertoire_temporaire("$nom/$f");
47 }
48 closedir($d);
49 @rmdir($nom);
50 }
51
52 // http://doc.spip.org/@copier_document
53 function copier_document($ext, $orig, $source) {
54
55 $orig = preg_replace(',\.\.+,', '.', $orig); // pas de .. dans le nom du doc
56 $dir = creer_repertoire_documents($ext);
57 $dest = preg_replace("/[^._=-\w\d]+/", "_",
58 translitteration(preg_replace("/\.([^.]+)$/", "",
59 preg_replace("/<[^>]*>/", '', basename($orig)))));
60
61 // ne pas accepter de noms de la forme -r90.jpg qui sont reserves
62 // pour les images transformees par rotation (action/documenter)
63 $dest = preg_replace(',-r(90|180|270)$,', '', $dest);
64
65 // Si le document "source" est deja au bon endroit, ne rien faire
66 if ($source == ($dir . $dest . '.' . $ext))
67 return $source;
68
69 // sinon tourner jusqu'a trouver un numero correct
70 $n = 0;
71 while (@file_exists($newFile = $dir . $dest .($n++ ? ('-'.$n) : '').'.'.$ext));
72
73 return deplacer_fichier_upload($source, $newFile);
74 }
75
76 //
77 // Deplacer un fichier
78 //
79
80 // http://doc.spip.org/@deplacer_fichier_upload
81 function deplacer_fichier_upload($source, $dest, $move=false) {
82 // Securite
83 if (substr($dest,0,strlen(_DIR_RACINE))==_DIR_RACINE)
84 $dest = _DIR_RACINE.preg_replace(',\.\.+,', '.', substr($dest,strlen(_DIR_RACINE)));
85 else
86 $dest = preg_replace(',\.\.+,', '.', $dest);
87
88 if ($move) $ok = @rename($source, $dest);
89 else $ok = @copy($source, $dest);
90 if (!$ok) $ok = @move_uploaded_file($source, $dest);
91 if ($ok)
92 @chmod($dest, _SPIP_CHMOD & ~0111);
93 else {
94 $f = @fopen($dest,'w');
95 if ($f) {
96 fclose ($f);
97 } else {
98 include_spip('inc/flock');
99 raler_fichier($dest);
100 }
101 spip_unlink($dest);
102 }
103 return $ok ? $dest : false;
104 }
105
106
107 // Erreurs d'upload
108 // renvoie false si pas d'erreur
109 // et true si erreur = pas de fichier
110 // pour les autres erreurs affiche le message d'erreur et meurt
111 // http://doc.spip.org/@check_upload_error
112 function check_upload_error($error, $msg='') {
113 global $spip_lang_right;
114
115 if (!$error) return false;
116
117 spip_log("Erreur upload $error -- cf. http://php.net/manual/fr/features.file-upload.errors.php");
118
119 switch ($error) {
120
121 case 4: /* UPLOAD_ERR_NO_FILE */
122 return true;
123
124 # on peut affiner les differents messages d'erreur
125 case 1: /* UPLOAD_ERR_INI_SIZE */
126 $msg = _T('upload_limit',
127 array('max' => ini_get('upload_max_filesize')));
128 break;
129 case 2: /* UPLOAD_ERR_FORM_SIZE */
130 $msg = _T('upload_limit',
131 array('max' => ini_get('upload_max_filesize')));
132 break;
133 case 3: /* UPLOAD_ERR_PARTIAL */
134 $msg = _T('upload_limit',
135 array('max' => ini_get('upload_max_filesize')));
136 break;
137
138 default: /* autre */
139 if (!$msg)
140 $msg = _T('pass_erreur').' '. $error
141 . '<br />' . propre("[->http://php.net/manual/fr/features.file-upload.errors.php]");
142 break;
143 }
144
145 spip_log ("erreur upload $error");
146
147 if(_request("iframe")=="iframe") {
148 echo "<div class='upload_answer upload_error'>$msg</div>";
149 exit;
150 }
151
152 echo minipres($msg,
153 "<div style='text-align: $spip_lang_right'><a href='" . rawurldecode($GLOBALS['redirect']) . "'><button type='button'>" . _T('ecrire:bouton_suivant') . "</button></a></div>");
154 exit;
155 }
156
157 // Erreur appelee depuis public.php (la precedente ne fonctionne plus
158 // depuis qu'on est sortis de spip_image.php, apparemment).
159 // http://doc.spip.org/@erreur_upload_trop_gros
160 function erreur_upload_trop_gros() {
161 include_spip('inc/filtres');
162
163 $msg = "<p>"
164 .taille_en_octets($_SERVER["CONTENT_LENGTH"])
165 .'<br />'
166 ._T('upload_limit',
167 array('max' => ini_get('upload_max_filesize')))
168 ."</p>";
169
170 echo minipres(_T('pass_erreur'),"<div class='upload_answer upload_error'>".$msg."</div>");
171 exit;
172 }
173
174 //
175 // Gestion des fichiers ZIP
176 //
177 // http://doc.spip.org/@accepte_fichier_upload
178 function accepte_fichier_upload ($f) {
179 if (!preg_match(",.*__MACOSX/,", $f)
180 AND !preg_match(",^\.,", basename($f))) {
181 $ext = corriger_extension((strtolower(substr(strrchr($f, "."), 1))));
182 return sql_countsel('spip_types_documents', "extension=" . sql_quote($ext) . " AND upload='oui'");
183 }
184 }
185
186 # callback pour le deballage d'un zip telecharge
187 # http://www.phpconcept.net/pclzip/man/en/?options-pclzip_cb_pre_extractfunction
188 // http://doc.spip.org/@callback_deballe_fichier
189 function callback_deballe_fichier($p_event, &$p_header) {
190 if (accepte_fichier_upload($p_header['filename'])) {
191 $p_header['filename'] = _tmp_dir . basename($p_header['filename']);
192 return 1;
193 } else {
194 return 0;
195 }
196 }
197
198 ?>