Commit | Line | Data |
---|---|---|
c495c100 P |
1 | <?php |
2 | ||
3 | /***************************************************************************\ | |
4 | * SPIP, Systeme de publication pour l'internet * | |
5 | * * | |
6 | * Copyright (c) 2001-2007 * | |
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/charsets'); # pour le nom de fichier | |
16 | include_spip('base/abstract_sql'); | |
17 | include_spip('inc/actions'); | |
18 | ||
19 | // http://doc.spip.org/@action_joindre_dist | |
20 | function action_joindre_dist() | |
21 | { | |
22 | global $hash, $url, $chemin, $ancre, | |
23 | $sousaction1, | |
24 | $sousaction2, | |
25 | $sousaction3, | |
26 | $sousaction4, | |
27 | $sousaction5, | |
28 | $_FILES, $HTTP_POST_FILES; | |
29 | ||
30 | $securiser_action = charger_fonction('securiser_action', 'inc'); | |
31 | $arg = $securiser_action(); | |
32 | ||
33 | $redirect = _request('redirect'); | |
34 | $iframe_redirect = _request('iframe_redirect'); | |
35 | if (!preg_match(',^(-?\d+)\D(\d+)\D(\w+)/(\w+)$,',$arg,$r)) { | |
36 | spip_log("action_joindre_dist incompris: " . $arg); | |
37 | redirige_par_entete(urldecode($redirect)); | |
38 | } | |
39 | list($arg, $id, $id_document, $mode, $type) = $r; | |
40 | ||
41 | // pas terrible, mais c'est le pb du bouton Submit qui retourne son texte, | |
42 | // et son transcodage est couteux et perilleux | |
43 | $sousaction = 'spip_action_joindre' . | |
44 | ($sousaction1 ? 1 : | |
45 | ($sousaction2 ? 2 : | |
46 | ($sousaction3 ? 3 : | |
47 | ($sousaction4 ? 4 : | |
48 | $sousaction5 )))); | |
49 | ||
50 | $path = ($sousaction1 ? ($_FILES ? $_FILES : $HTTP_POST_FILES) : | |
51 | ($sousaction2 ? $url : $chemin)); | |
52 | ||
53 | $documents_actifs = array(); | |
54 | ||
55 | if (function_exists($sousaction)) | |
56 | $type_image = $sousaction($path, $mode, $type, $id, $id_document, | |
57 | $hash, $redirect, $documents_actifs, $iframe_redirect); | |
58 | ||
59 | else spip_log("spip_action: sousaction inconnue $sousaction"); | |
60 | ||
61 | $redirect = urldecode($redirect); | |
62 | if ($documents_actifs) { | |
63 | $redirect = parametre_url($redirect,'show_docs',join(',',$documents_actifs),'&'); | |
64 | } | |
65 | ||
66 | if (!$ancre) { | |
67 | ||
68 | if ($mode=='vignette') | |
69 | $ancre = 'images'; | |
70 | else if ($type_image) | |
71 | $ancre = 'portfolio'; | |
72 | else | |
73 | $ancre = 'documents'; | |
74 | } | |
75 | ||
76 | $redirect .= '#' . $ancre; | |
77 | if ($type == 'rubrique') { | |
78 | include_spip('inc/rubriques'); | |
79 | calculer_rubriques(); | |
80 | } | |
81 | ||
82 | if(_request("iframe") == 'iframe') { | |
83 | $redirect = parametre_url(urldecode($iframe_redirect),"show_docs",join(',',$documents_actifs),'&')."&iframe=iframe"; | |
84 | } | |
85 | ||
86 | redirige_par_entete($redirect); | |
87 | ## redirection a supprimer si on veut poster dans l'espace prive directement (UPLOAD_DIRECT) | |
88 | } | |
89 | ||
90 | ||
91 | // Cas d'un document distant reference sur internet | |
92 | ||
93 | // http://doc.spip.org/@spip_action_joindre2 | |
94 | function spip_action_joindre2($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect) | |
95 | { | |
96 | return joindre_documents(array( | |
97 | array('name' => basename($path), | |
98 | 'tmp_name' => $path) | |
99 | ), 'distant', $type, $id, $id_document, | |
100 | $hash, $redirect, $actifs, $iframe_redirect); | |
101 | } | |
102 | ||
103 | // Cas d'un fichier transmis | |
104 | ||
105 | // http://doc.spip.org/@spip_action_joindre1 | |
106 | function spip_action_joindre1($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect) | |
107 | { | |
108 | $files = array(); | |
109 | if (is_array($path)) | |
110 | foreach ($path as $file) { | |
111 | if (!($file['error'] == 4) /* UPLOAD_ERR_NO_FILE */) | |
112 | $files[]=$file; | |
113 | } | |
114 | ||
115 | return joindre_documents($files, $mode, $type, $id, $id_document, | |
116 | $hash, $redirect, $actifs, $iframe_redirect); | |
117 | } | |
118 | ||
119 | // copie de tout ou partie du repertoire upload | |
120 | ||
121 | // http://doc.spip.org/@spip_action_joindre3 | |
122 | function spip_action_joindre3($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect) | |
123 | { | |
124 | if (!$path || strstr($path, '..')) return; | |
125 | ||
126 | $upload = determine_upload(); | |
127 | if ($path != '/' AND $path != './') $upload .= $path; | |
128 | ||
129 | if (!is_dir($upload)) | |
130 | // seul un fichier est demande | |
131 | $files = array(array ('name' => basename($upload), | |
132 | 'tmp_name' => $upload) | |
133 | ); | |
134 | else { | |
135 | include_spip('inc/documents'); | |
136 | $files = array(); | |
137 | foreach (preg_files($upload) as $fichier) { | |
138 | $files[]= array ( | |
139 | 'name' => basename($fichier), | |
140 | 'tmp_name' => $fichier | |
141 | ); | |
142 | } | |
143 | } | |
144 | ||
145 | return joindre_documents($files, $mode, $type, $id, $id_document, $hash, $redirect, $actifs, $iframe_redirect); | |
146 | } | |
147 | ||
148 | // | |
149 | // Charger la fonction surchargeable receptionnant un fichier | |
150 | // et l'appliquer sur celui ou ceux indiques. | |
151 | ||
152 | // http://doc.spip.org/@joindre_documents | |
153 | function joindre_documents($files, $mode, $type, $id, $id_document, $hash, $redirect, &$actifs, $iframe_redirect) | |
154 | { | |
155 | $ajouter_documents = charger_fonction('ajouter_documents', 'inc'); | |
156 | ||
157 | if (function_exists('gzopen') | |
158 | AND !($mode == 'distant') | |
159 | AND (count($files) == 1)) { | |
160 | ||
161 | $desc = $files[0]; | |
162 | if (preg_match('/\.zip$/i', $desc['name']) | |
163 | OR ($desc['type'] == 'application/zip')) { | |
164 | ||
165 | // on pose le fichier dans le repertoire zip | |
166 | // (nota : copier_document n'ecrase pas un fichier avec lui-meme | |
167 | // ca autorise a boucler) | |
168 | $zip = copier_document("zip", | |
169 | $desc['name'], | |
170 | $desc['tmp_name'] | |
171 | ); | |
172 | if (!$zip) | |
173 | {include_spip('minipres'); echo minipres('Erreur upload zip'); exit;} # pathologique | |
174 | // Est-ce qu'on sait le lire ? | |
175 | include_spip('inc/pclzip'); | |
176 | $archive = new PclZip($zip); | |
177 | if ($archive) { | |
178 | $valables = verifier_compactes($archive); | |
179 | if ($valables) { | |
180 | echo liste_archive_jointe($valables, $mode, $type, $id, $id_document, $hash, $redirect, $zip, $iframe_redirect); | |
181 | // a tout de suite en joindre4, joindre5, ou joindre6 | |
182 | exit; | |
183 | } | |
184 | } | |
185 | } | |
186 | } | |
187 | foreach ($files as $arg) { | |
188 | check_upload_error($arg['error']); | |
189 | $x = $ajouter_documents($arg['tmp_name'], $arg['name'], | |
190 | $type, $id, $mode, $id_document, $actifs); | |
191 | } | |
192 | // un invalideur a la hussarde qui doit marcher au moins pour article, breve, rubrique | |
193 | include_spip('inc/invalideur'); | |
194 | suivre_invalideur("id='id_$type/$id'"); | |
195 | return $x; | |
196 | } | |
197 | ||
198 | #----------------------------------------------------------------------- | |
199 | ||
200 | // sous-actions suite a l'envoi d'un Zip: | |
201 | // la fonction joindre_documents ci-dessus a construit un formulaire | |
202 | // qui renvoie sur une des 3 sous-actions qui suivent. | |
203 | ||
204 | // Zip avec confirmation "tel quel" | |
205 | ||
206 | // http://doc.spip.org/@spip_action_joindre5 | |
207 | function spip_action_joindre5($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs) | |
208 | { | |
209 | $ajouter_documents = charger_fonction('ajouter_documents', 'inc'); | |
210 | $pos = strpos($path, '/zip/'); | |
211 | if (!$pos) { | |
212 | $pos = strpos($path, '/zip_'); | |
213 | } | |
214 | return $ajouter_documents($path, substr($path, $pos+5), $type, $id, $mode, $id_document, $actifs); | |
215 | } | |
216 | ||
217 | // Zip a deballer. | |
218 | ||
219 | // http://doc.spip.org/@spip_action_joindre6 | |
220 | function spip_action_joindre6($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect) | |
221 | { | |
222 | $x = joindre_deballes($path, $mode, $type, $id, $id_document,$hash, $redirect, $actifs); | |
223 | // suppression de l'archive en zip | |
224 | @unlink($path); | |
225 | return $x; | |
226 | } | |
227 | ||
228 | // Zip avec les 2 options a la fois | |
229 | ||
230 | // http://doc.spip.org/@spip_action_joindre4 | |
231 | function spip_action_joindre4($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect) | |
232 | { | |
233 | joindre_deballes($path, $mode, $type, $id, $id_document,$hash, $redirect, $actifs); | |
234 | return spip_action_joindre5($path, $mode, $type, $id, $id_document,$hash, $redirect, $actifs); | |
235 | } | |
236 | ||
237 | // http://doc.spip.org/@joindre_deballes | |
238 | function joindre_deballes($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs) | |
239 | { | |
240 | $ajouter_documents = charger_fonction('ajouter_documents', 'inc'); | |
241 | define('_tmp_dir', creer_repertoire_documents($hash)); | |
242 | ||
243 | if (_tmp_dir == _DIR_DOC) | |
244 | {include_spip('minipres'); | |
245 | echo minipres(_T('avis_operation_impossible')); | |
246 | exit; | |
247 | } | |
248 | include_spip('inc/pclzip'); | |
249 | $archive = new PclZip($path); | |
250 | $archive->extract( | |
251 | PCLZIP_OPT_PATH, _tmp_dir, | |
252 | PCLZIP_CB_PRE_EXTRACT, 'callback_deballe_fichier' | |
253 | ); | |
254 | $contenu = verifier_compactes($archive); | |
255 | ||
256 | foreach ($contenu as $fichier) { | |
257 | $f = basename($fichier); | |
258 | $x = $ajouter_documents(_tmp_dir. $f, $f, | |
259 | $type, $id, $mode, $id_document, $actifs); | |
260 | } | |
261 | effacer_repertoire_temporaire(_tmp_dir); | |
262 | return $x; | |
263 | } | |
264 | ||
265 | ||
266 | ?> |