Newer
Older

cedric@yterium.com
a validé
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *

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. *
\***************************************************************************/

cedric@yterium.com
a validé
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}

cedric@yterium.com
a validé
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;

cedric@yterium.com
a validé
if (strpos($f, '../') !== false

marcimat@rezo.net
a validé
or preg_match(',^\w+://,', $f)

cedric@yterium.com
a validé
) {

cedric@yterium.com
a validé
$status = 403;
} else {

marcimat@rezo.net
a validé
if (!file_exists($file) or !is_readable($file)) {

cedric@yterium.com
a validé
$status = 404;
} else {

cedric@yterium.com
a validé
$where = "D.fichier=" . sql_quote(set_spip_doc($file))
. ($arg ? " AND D.id_document=" . intval($arg) : '');

cedric@yterium.com
a validé

cedric@yterium.com
a validé
$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;

cedric@yterium.com
a validé
} else {

cedric@yterium.com
a validé
// ETag pour gerer le status 304
$ETag = md5($file . ': ' . filemtime($file));
if (isset($_SERVER['HTTP_IF_NONE_MATCH'])

marcimat@rezo.net
a validé
and $_SERVER['HTTP_IF_NONE_MATCH'] == $ETag

cedric@yterium.com
a validé
) {
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;
}

cedric@yterium.com
a validé
}
}
}

cedric@yterium.com
a validé
switch ($status) {

cedric@yterium.com
a validé

cedric@yterium.com
a validé
case 403:
include_spip('inc/minipres');
echo minipres();
break;

cedric@yterium.com
a validé

cedric@yterium.com
a validé
case 404:
http_status(404);
include_spip('inc/minipres');
echo minipres(_T('erreur') . ' 404',
_T('medias:info_document_indisponible'));
break;

cedric@yterium.com
a validé

cedric@yterium.com
a validé
default:
header("Content-Type: " . $doc['mime_type']);

cedric@yterium.com
a validé

cedric@yterium.com
a validé
// 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

cedric@yterium.com
a validé

cedric@yterium.com
a validé
if ($doc['inclus'] == 'non') {

cedric@yterium.com
a validé

cedric@yterium.com
a validé
// 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

cedric@yterium.com
a validé

cedric@yterium.com
a validé
$f = basename($file);
if (isset($doc['titre'])

marcimat@rezo.net
a validé
and (preg_match('/^\w+[.]\w+$/', $doc['titre']) or $doc['titre'] == 'Makefile')

cedric@yterium.com
a validé
) {
$f = $doc['titre'];
}

cedric@yterium.com
a validé

cedric@yterium.com
a validé
// ce content-type est necessaire pour eviter des corruptions de zip dans ie6
header('Content-Type: application/octet-stream');

cedric@yterium.com
a validé

cedric@yterium.com
a validé
header("Content-Disposition: attachment; filename=\"$f\";");
header("Content-Transfer-Encoding: binary");

cedric@yterium.com
a validé

cedric@yterium.com
a validé
// 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");

cedric@yterium.com
a validé

cedric@yterium.com
a validé
}

cedric@yterium.com
a validé

cedric@yterium.com
a validé
if ($cl = filesize($file)) {
header("Content-Length: " . $cl);
}

cedric@yterium.com
a validé

cedric@yterium.com
a validé
readfile($file);
break;