Skip to content
Extraits de code Groupes Projets
Valider 866d12f2 rédigé par Fil's avatar Fil
Parcourir les fichiers

encore des nettoyages dans acceder_document, qui fonctionne maintenant avec l'API autoriser()

parent 2502fef1
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -16,33 +16,49 @@ include_spip('inc/charsets'); # pour le nom de fichier
include_spip('inc/headers');
include_spip('base/abstract_sql');
// acces aux documents joints securise
// est appelee avec arg comme parametre CGI
// mais peu aussi etre appele avec le parametre file directement
// il verifie soit que le demandeur est authentifie
// soit que le document est publie, c'est-a-dire
// joint a au moins 1 article, breve ou rubrique publie
// TODO : a refaire avec l'API inc/autoriser
// 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, breve ou rubrique publie
// Definir une fonction d'autorisation specifique
// sauf si on a deja eu cette idee
// TODO: ne devrait pas figurer dans ce fichier
if (!function_exists('autoriser_document_voir')) {
function autoriser_document_voir($faire, $type, $id, $qui, $opt) {
if (in_array($qui['statut'], array('0minirezo', '1comite')))
return true;
return
spip_num_rows(spip_query("SELECT articles.id_article FROM spip_documents_articles AS rel_articles, spip_articles AS articles WHERE rel_articles.id_article = articles.id_article AND articles.statut = 'publie' AND rel_articles.id_document = $id LIMIT 1")) > 0
OR
spip_num_rows(spip_query("SELECT rubriques.id_rubrique FROM spip_documents_rubriques AS rel_rubriques, spip_rubriques AS rubriques WHERE rel_rubriques.id_rubrique = rubriques.id_rubrique AND rubriques.statut = 'publie' AND rel_rubriques.id_document = $id LIMIT 1")) > 0
OR
spip_num_rows(spip_query("SELECT breves.id_breve FROM spip_documents_breves AS rel_breves, spip_breves AS breves WHERE rel_breves.id_breve = breves.id_breve AND breves.statut = 'publie' AND rel_breves.id_document = $id_document LIMIT 1")) > 0
;
}
}
// http://doc.spip.org/@action_acceder_document_dist
function action_acceder_document_dist() {
include_spip('inc/documents');
global $auteur_session; // positionne par verifier_visiteur dans inc_version
if ($auteur_session['statut'] == '0minirezo'
OR $auteur_session['statut'] == '1comite')
$auth_login = $auteur_session['login'];
else
$auth_login = "";
// $file exige pour eviter le scan id_document par id_document
$file = rawurldecode(_request('file'));
$file = get_spip_doc($file);
$arg = rawurldecode(_request('arg'));
$status = $dcc = false;
if (strpos($file,'../') !== false) {
if (strpos($file,'../') !== false
OR preg_match(',^\w+://,', $file)) {
$status = 403;
} else if (!$arg AND $file) {
$where = "documents.fichier="._q(set_spip_doc($file));
}
else if (!file_exists($file) OR !is_readable($file)) {
$status = 404;
} else {
$where = "documents.id_document=".intval($arg);
$where = "documents.fichier="._q(set_spip_doc($file))
. ($arg ? " AND documents.id_document=".intval($arg): '');
}
if (!$status) {
......@@ -65,73 +81,52 @@ function action_acceder_document_dist() {
$dcc = $doc['titre']. ($doc['descriptif']
? ' - '.$doc['descriptif']
: '');
$file = get_spip_doc($doc['fichier']);
// Un document distant ne peut etre protege
// toutefois si on arrive ici c'est qu'on a hacke
if ($doc['distant'] == 'oui') {
http_status(403);
include_spip('inc/minipres');
echo minipres(_L('Status').' 403',
_T('ecrire:avis_acces_interdit'));
exit;
}
// Si le visiteur n'est pas redacteur, chercher un objet publie
// referencant notre document (old school)
$id_document = $doc['id_document'];
if (!$auth_login) {
$n = spip_num_rows(spip_query("SELECT articles.id_article FROM spip_documents_articles AS rel_articles, spip_articles AS articles WHERE rel_articles.id_article = articles.id_article AND articles.statut = 'publie' AND rel_articles.id_document = $id_document LIMIT 1"));
if (!$n) {
$n = spip_num_rows(spip_query("SELECT rubriques.id_rubrique FROM spip_documents_rubriques AS rel_rubriques, spip_rubriques AS rubriques WHERE rel_rubriques.id_rubrique = rubriques.id_rubrique AND rubriques.statut = 'publie' AND rel_rubriques.id_document = $id_document LIMIT 1"));
if (!$n) {
$n =spip_num_rows(spip_query("SELECT breves.id_breve FROM spip_documents_breves AS rel_breves, spip_breves AS breves WHERE rel_breves.id_breve = breves.id_breve AND breves.statut = 'publie' AND rel_breves.id_document = $id_document LIMIT 1"));
if (!$n)
$status = 403;
}
}
}
//
// Verifier les droits de lecture du document
//
if (!autoriser('voir', 'document', $doc['id_document']))
$status = 403;
}
}
# mettre une cle dans l'url (sympa mais ne resoud pas le cas des
# documents appeles dans les forums ...)
# if (_request('cle') == md5(...);
if ($status == 403) {
spip_log("403: acces refuse (erreur $refus) au document " . $arg . ': ' . $file);
http_status(403);
include_spip('inc/minipres');
echo minipres(_L('Status').' 403',
_T('ecrire:avis_acces_interdit'));
} else if ($status == 404
OR !file_exists($file)
OR !is_readable($file)) {
spip_log("404: Le document $file n'existe pas");
http_status(404);
include_spip('inc/minipres');
echo minipres(_L('Erreur').' 404',
_L('Ce document n\'est pas disponible sur le site.'));
}
else {
header("Content-Type: ". $doc['mime_type']);
if ($status == 403) {
spip_log("403: acces refuse (erreur $refus) au document " . $arg . ': ' . $file);
http_status(403);
include_spip('inc/minipres');
echo minipres(_L('Status').' 403',
_T('ecrire:avis_acces_interdit'));
} else if ($status == 404) {
spip_log("404: Le document $file n'existe pas");
http_status(404);
include_spip('inc/minipres');
echo minipres(_L('Erreur').' 404',
_L('Ce document n\'est pas disponible sur le site.'));
}
else {
// Content-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
header("Content-Type: ". $doc['mime_type']);
if (!preg_match(',^image/,', $doc['mime_type'])) {
header("Content-Disposition: attachment; filename=\""
. basename($file) ."\";");
if ($dcc) {
include_spip('inc/texte');
$dcc = preg_replace(',\s+,',' ', couper(textebrut(typo($dcc)),60, '...'));
spip_log('description: '.$dcc);
header("Content-Description: " . $dcc);
}
header("Content-Transfer-Encoding: binary");
}
if ($cl = filesize($file))
header("Content-Length: ". $cl);
if ($cl = filesize($file))
header("Content-Length: ". $cl);
header("Content-Transfer-Encoding: binary");
readfile($file);
}
readfile($file);
}
}
......
......@@ -357,4 +357,14 @@ function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) {
true;
}
//
// Peut-on voir un document ?
// par defaut tout le monde (y compris visiteurs non enregistres)
// peut lire tous les documents dans IMG/
//
function autoriser_document_voir_dist($faire, $type, $id, $qui, $opt) {
return true;
}
?>
......@@ -42,11 +42,13 @@ function get_spip_doc($fichier) {
function generer_url_document_dist($id_document) {
if (intval($id_document) <= 0)
return '';
$row = spip_fetch_array(spip_query("SELECT fichier,distant FROM spip_documents WHERE id_document = $id_document"));
$row = spip_fetch_array(spip_query("SELECT fichier,distant FROM spip_documents WHERE id_document="._q($id_document)));
if ($row) {
if ($GLOBALS['meta']["creer_htaccess"] == 'oui'
AND $row['distant'] != 'oui')
return generer_url_action('acceder_document', "arg=$id_document", true);
return parametre_url(
generer_url_action('acceder_document', "arg=$id_document"),
'file', $row['fichier'], '&');
else
return get_spip_doc($row['fichier']);
}
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter