0784a6af4a2fef2b1871378aabed1a055f87b7a9
[velocampus/web/www.git] / www / ecrire / action / acceder_document.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/headers');
16
17 // acces aux documents joints securise
18 // verifie soit que le demandeur est authentifie
19 // soit que le document est publie, c'est-a-dire
20 // joint a au moins 1 article, breve ou rubrique publie
21
22 // http://doc.spip.org/@action_acceder_document_dist
23 function action_acceder_document_dist() {
24 include_spip('inc/documents');
25
26 // $file exige pour eviter le scan id_document par id_document
27 $f = rawurldecode(_request('file'));
28 $file = get_spip_doc($f);
29 $arg = rawurldecode(_request('arg'));
30
31 $status = $dcc = false;
32 if (strpos($f,'../') !== false
33 OR preg_match(',^\w+://,', $f)) {
34 $status = 403;
35 }
36 else if (!file_exists($file) OR !is_readable($file)) {
37 $status = 404;
38 } else {
39 $where = "documents.fichier=".sql_quote(set_spip_doc($file))
40 . ($arg ? " AND documents.id_document=".intval($arg): '');
41
42 $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);
43 if (!$doc) {
44 $status = 404;
45 } else {
46
47 // ETag pour gerer le status 304
48 $ETag = md5($file . ': '. filemtime($file));
49 if (isset($_SERVER['HTTP_IF_NONE_MATCH'])
50 AND $_SERVER['HTTP_IF_NONE_MATCH'] == $ETag) {
51 http_status(304); // Not modified
52 exit;
53 } else {
54 header('ETag: '.$ETag);
55 }
56
57 //
58 // Verifier les droits de lecture du document
59 // en controlant la cle passee en argument
60 //
61 include_spip('inc/securiser_action');
62 $cle = _request('cle');
63 if (!verifier_cle_action($doc['id_document'].','.$f, $cle)) {
64 spip_log("acces interdit $cle erronee");
65 $status = 403;
66 }
67 }
68 }
69
70 switch($status) {
71
72 case 403:
73 include_spip('inc/minipres');
74 echo minipres();
75 break;
76
77 case 404:
78 http_status(404);
79 include_spip('inc/minipres');
80 echo minipres(_T('erreur').' 404',
81 _T('info_document_indisponible'));
82 break;
83
84 default:
85 header("Content-Type: ". $doc['mime_type']);
86
87 // pour les images ne pas passer en attachment
88 // sinon, lorsqu'on pointe directement sur leur adresse,
89 // le navigateur les downloade au lieu de les afficher
90
91 if ($doc['inclus']=='non') {
92
93 // Si le fichier a un titre avec extension,
94 // ou si c'est un nom bien connu d'Unix, le prendre
95 // sinon l'ignorer car certains navigateurs pataugent
96
97 $f = basename($file);
98 if (isset($doc['titre'])
99 AND (preg_match('/^\w+[.]\w+$/', $doc['titre']) OR $doc['titre'] == 'Makefile'))
100 $f = $doc['titre'];
101
102 // ce content-type est necessaire pour eviter des corruptions de zip dans ie6
103 header('Content-Type: application/octet-stream');
104
105 header("Content-Disposition: attachment; filename=\"$f\";");
106 header("Content-Transfer-Encoding: binary");
107
108 // fix for IE catching or PHP bug issue
109 header("Pragma: public");
110 header("Expires: 0"); // set expiration time
111 header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
112
113 }
114
115 if ($cl = filesize($file))
116 header("Content-Length: ". $cl);
117
118 readfile($file);
119 break;
120 }
121
122 }
123
124 ?>