3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2009 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
13 if (!defined("_ECRIRE_INC_VERSION")) return;
15 include_spip('inc/headers');
18 * acces aux documents joints securise
19 * verifie soit que le demandeur est authentifie
20 * soit que le document est publie, c'est-a-dire
21 * joint a au moins 1 article, breve ou rubrique publie
24 * docrestreint.api/id/cle/file
28 function action_api_docrestreint_dist($arg=null) {
32 $arg =_request('arg');
34 $arg = explode("/",$arg);
38 $id_document = intval(array_shift($arg));
39 $cle = array_shift($arg);
40 // file exige pour eviter le scan id_document par id_document
41 $f = implode("/",$arg);
45 AND $f=="test/.test") {
50 include_spip('inc/documents');
52 $file = get_spip_doc($f);
53 spip_log($file,'dbg');
55 $status = $dcc = false;
56 // securite : on refuse tout ../ ou url absolue
57 if (strpos($f,'../') !== false
58 OR preg_match(',^\w+://,', $f)) {
61 else if (!file_exists($file) OR !is_readable($file)) {
65 $where = "documents.fichier=".sql_quote(set_spip_doc($file))
66 . ($id_document ?
" AND documents.id_document=".intval($id_document): '');
67 spip_log($where,'dbg');
69 $doc = sql_fetsel("documents.id_document, documents.titre, documents.fichier, types.mime_type, types.inclus, documents.extension", "spip_documents AS documents LEFT JOIN spip_types_documents AS types ON documents.extension=types.extension",$where);
76 // ETag pour gerer le status 304
77 $ETag = md5($file . ': '. filemtime($file));
78 if (isset($_SERVER['HTTP_IF_NONE_MATCH'])
79 AND $_SERVER['HTTP_IF_NONE_MATCH'] == $ETag) {
80 http_status(304); // Not modified
84 header('ETag: '.$ETag);
88 // Verifier les droits de lecture du document
90 // en controlant la cle passee en argument si elle est dispo
91 // (perf issue : toutes les urls ont en principe cette cle fournie dans la page au moment du calcul de la page)
93 include_spip('inc/securiser_action');
94 if (!verifier_cle_action($doc['id_document'].','.$f, $cle)) {
95 spip_log("acces interdit $cle erronee");
99 // en verifiant le droit explicitement sinon, plus lent !
101 if (!function_exists("autoriser"))
102 include_spip("inc/autoriser");
103 if (!autoriser('voir', 'document', $doc['id_document'])) {
105 spip_log("acces interdit $cle erronee");
116 include_spip('inc/minipres');
117 echo minipres("","","",true);
122 include_spip('inc/minipres');
123 echo minipres(_T('erreur').' 404',
124 _T('medias:info_document_indisponible'),"",true);
128 header("Content-Type: ". $doc['mime_type']);
129 // pour les images ne pas passer en attachment
130 // sinon, lorsqu'on pointe directement sur leur adresse,
131 // le navigateur les downloade au lieu de les afficher
133 if ($doc['inclus']=='non') {
135 $f = basename($file);
136 // ce content-type est necessaire pour eviter des corruptions de zip dans ie6
137 header('Content-Type: application/octet-stream');
139 header("Content-Disposition: attachment; filename=\"$f\";");
140 header("Content-Transfer-Encoding: binary");
142 // fix for IE catching or PHP bug issue
143 header("Pragma: public");
144 header("Expires: 0"); // set expiration time
145 header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
149 header("Expires: 3600"); // set expiration time
152 if ($cl = filesize($file))
153 header("Content-Length: ". $cl);