Skip to content
Extraits de code Groupes Projets
Valider 2be76cb1 rédigé par esj's avatar esj
Parcourir les fichiers

Le filtre 'contenu_document' accepte comme argument non seulement un entier...

Le filtre 'contenu_document' accepte comme argument non seulement un entier (produit notamment par #ID_DOCUMENT) mais aussi un chemin ou une URL (produit notamment par #URL_DOCUMENT). Dans les deux cas il ramène le contenu du document ainsi désigné. La forme {{{ [(#URL_DOCUMENT|contenu_document)] }}} est à préférer car elle garantit l'exécution du squelette sur une base externe, contrairement à ID_DOCUMENT qui ne communique pas sa base de référence. Cette forme reste toutefois nécessaire en cas d'accès protégé aux documents: il faudrait continuer le ménage autour de la fonction ''copie_locale'' pour qu'une copie de soi à soi ne soit pas bloquée dans ce cas.

Et correction d'une scorie de [11088].
parent aaa022de
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -286,41 +286,36 @@ function nom_fichier_copie_locale($source, $extension) { ...@@ -286,41 +286,36 @@ function nom_fichier_copie_locale($source, $extension) {
// //
// http://doc.spip.org/@fichier_copie_locale // http://doc.spip.org/@fichier_copie_locale
function fichier_copie_locale($source) { function fichier_copie_locale($source) {
// Si c'est une image locale pas de souci // Si c'est deja local pas de souci
if (!preg_match(',^\w+://,', $source)) { if (!preg_match(',^\w+://,', $source)) {
if (_DIR_RACINE) if (_DIR_RACINE)
$source = preg_replace(',^'.preg_quote(_DIR_RACINE).',', '', $source); $source = preg_replace(',^'.preg_quote(_DIR_RACINE).',', '', $source);
return $source; return $source;
} }
// Chercher d'abord le doc dans la table des documents, pour se baser sur son type reel // Si c'est deja dans la table des documents,
$s = sql_select("extension", "spip_documents", "fichier=" . sql_quote($source) . " AND distant='oui' AND extension>''"); // ramener le nom de sa copie potentielle
if ($t = sql_fetch($s)) { $ext = sql_getfetsel("extension", "spip_documents", "fichier=" . sql_quote($source) . " AND distant='oui' AND extension <> ''");
$extension = $t['extension'];
if ($ext) return nom_fichier_copie_locale($source, $ext);
// si la source n'est pas dans la table des documents, // voir si l'extension indiquee dans le nom du fichier est ok
// on determine son extension et on verifie que c'est ok // et si il n'aurait pas deja ete rapatrie
} else {
if (
// voir si l'extension est pas indiquee dans le nom du fichier et si il aurait pas deja ete rapatrie, auquel cas c'est ok
($path_parts = pathinfo($source) AND $ext = $path_parts['extension'] AND $f = _DIR_RACINE . nom_fichier_copie_locale($source, $ext) AND file_exists($f))
OR
// on la ping et on regarde si son extension est connue et autorisee
($a = recuperer_infos_distantes($source,0,false) AND $ext = $a['extension'])
OR
// a defaut on fait confiance a l'extension
($path_parts = pathinfo($source) AND $ext = $path_parts['extension'])
) {
// verifier que c'est un type autorise
$t = sql_fetsel("extension", "spip_types_documents", "extension=".sql_quote($ext));
if ($t)
$extension = $t['extension'];
}
}
if (isset($extension)) $path_parts = pathinfo($source);
return nom_fichier_copie_locale($source, $extension); $ext = $path_part ? $path_parts['extension'] : '';
if ($ext AND sql_getfetsel("extension", "spip_types_documents", "extension=".sql_quote($ext))) {
$f = nom_fichier_copie_locale($source, $ext);
if (file_exists(_DIR_RACINE . $f))
return $f;
}
// Ping pour voir si son extension est connue et autorisee
$path_parts = recuperer_infos_distantes($source,0,false) ;
$ext = $path_part ? $path_parts['extension'] : '';
if ($ext AND sql_getfetsel("extension", "spip_types_documents", "extension=".sql_quote($ext))) {
return nom_fichier_copie_locale($source, $ext);
}
} }
......
...@@ -42,12 +42,17 @@ function get_spip_doc($fichier) { ...@@ -42,12 +42,17 @@ function get_spip_doc($fichier) {
: $fichier; : $fichier;
} }
function contenu_document($id_document) // Filtre pour #ID_DOCUMENT ou #URL_DOCUMENT
function contenu_document($arg)
{ {
$r = sql_fetsel("fichier,distant", "spip_documents", "id_document=".sql_quote($id_document)); if (is_numeric($arg)) {
if (!$r) return ''; $r = sql_fetsel("fichier,distant", "spip_documents", "id_document=".sql_quote($arg));
$f = $r['fichier']; if (!$r) return '';
$f = ($r['distant'] =='oui') ? copie_locale($f) : get_spip_doc($f); $f = $r['fichier'];
$f = ($r['distant'] =='oui') ? copie_locale($f) : get_spip_doc($f);
} else if (!$f = copie_locale($arg)) return '';
return spip_file_get_contents($f); return spip_file_get_contents($f);
} }
...@@ -65,7 +70,7 @@ function generer_url_document_dist($id_document, $args='', $ancre='') { ...@@ -65,7 +70,7 @@ function generer_url_document_dist($id_document, $args='', $ancre='') {
// Si droit de voir tous les docs, pas seulement celui-ci // Si droit de voir tous les docs, pas seulement celui-ci
// il est inutilement couteux de rajouter une protection // il est inutilement couteux de rajouter une protection
if (($row['distant'] == 'oui') OR !autoriser('voir', 'document')) if (($row['distant'] == 'oui') OR autoriser('voir', 'document'))
return get_spip_doc($f); return get_spip_doc($f);
include_spip('inc/securiser_action'); include_spip('inc/securiser_action');
......
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