Newer
Older

cedric@yterium.com
a validé
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2014 *

cedric@yterium.com
a validé
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) return;
include_spip('inc/headers');
// acces aux documents joints securise
// verifie soit que le demandeur est authentifie
// soit que le document est publie, c'est-a-dire
// joint a au moins 1 article ou rubrique publie

spip.franck@lien-d-amis.net
a validé
// http://code.spip.net/@action_acceder_document_dist

cedric@yterium.com
a validé
function action_acceder_document_dist() {
include_spip('inc/documents');
// $file exige pour eviter le scan id_document par id_document
$f = rawurldecode(_request('file'));
$file = get_spip_doc($f);
$arg = rawurldecode(_request('arg'));
$status = $dcc = false;
if (strpos($f,'../') !== false
OR preg_match(',^\w+://,', $f)) {
$status = 403;
}
else if (!file_exists($file) OR !is_readable($file)) {
$status = 404;
} else {
$where = "D.fichier=".sql_quote(set_spip_doc($file))
. ($arg ? " AND D.id_document=".intval($arg): '');

cedric@yterium.com
a validé
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
$doc = sql_fetsel("D.id_document, D.titre, D.fichier, T.mime_type, T.inclus, D.extension", "spip_documents AS D LEFT JOIN spip_types_documents AS T ON D.extension=T.extension",$where);
if (!$doc) {
$status = 404;
} else {
// ETag pour gerer le status 304
$ETag = md5($file . ': '. filemtime($file));
if (isset($_SERVER['HTTP_IF_NONE_MATCH'])
AND $_SERVER['HTTP_IF_NONE_MATCH'] == $ETag) {
http_status(304); // Not modified
exit;
} else {
header('ETag: '.$ETag);
}
//
// Verifier les droits de lecture du document
// en controlant la cle passee en argument
//
include_spip('inc/securiser_action');
$cle = _request('cle');
if (!verifier_cle_action($doc['id_document'].','.$f, $cle)) {
spip_log("acces interdit $cle erronee");
$status = 403;
}
}
}
switch($status) {
case 403:
include_spip('inc/minipres');
echo minipres();
break;
case 404:
http_status(404);
include_spip('inc/minipres');
echo minipres(_T('erreur').' 404',
_T('medias:info_document_indisponible'));

cedric@yterium.com
a validé
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
break;
default:
header("Content-Type: ". $doc['mime_type']);
// pour les images ne pas passer en attachment
// sinon, lorsqu'on pointe directement sur leur adresse,
// le navigateur les downloade au lieu de les afficher
if ($doc['inclus']=='non') {
// Si le fichier a un titre avec extension,
// ou si c'est un nom bien connu d'Unix, le prendre
// sinon l'ignorer car certains navigateurs pataugent
$f = basename($file);
if (isset($doc['titre'])
AND (preg_match('/^\w+[.]\w+$/', $doc['titre']) OR $doc['titre'] == 'Makefile'))
$f = $doc['titre'];
// ce content-type est necessaire pour eviter des corruptions de zip dans ie6
header('Content-Type: application/octet-stream');
header("Content-Disposition: attachment; filename=\"$f\";");
header("Content-Transfer-Encoding: binary");
// fix for IE catching or PHP bug issue
header("Pragma: public");
header("Expires: 0"); // set expiration time
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
}
if ($cl = filesize($file))
header("Content-Length: ". $cl);
readfile($file);
break;
}
}
?>