acceder_document.php 2,78 Kio
<?php
/**
* SPIP, Système de publication pour l'internet
*
* Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
*
* Ce programme est un logiciel libre distribué sous licence GNU/GPL.
*/
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
function action_acceder_document_dist() {
$doc = [];
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 = 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) : '');
$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_response_code(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_response_code(404);
include_spip('inc/minipres');
echo minipres(_T('erreur') . ' 404', _T('medias:info_document_indisponible'));
break;
default:
include_spip('inc/livrer_fichier');
$options = ['attachment' => false];
if ($doc['inclus'] == 'non') {
$options['attachment'] = true;
// 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
if (
isset($doc['titre'])
and (preg_match('/^\w+[.]\w+$/', $doc['titre']) or $doc['titre'] == 'Makefile')
) {
$options['attachment'] = $doc['titre'];
}
}
spip_livrer_fichier($file, $doc['mime_type'], $options);
exit;
break;
}
}