X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fecrire%2Finc%2Fajouter_documents.php;fp=www%2Fecrire%2Finc%2Fajouter_documents.php;h=49ec25b27c5712a0c03446d62e4291eff7c66ef5;hp=33902b0e7ea8a669fa735bdec45b1238af784e31;hb=e99f0878011913365e49b30d90e496c24c301393;hpb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed diff --git a/www/ecrire/inc/ajouter_documents.php b/www/ecrire/inc/ajouter_documents.php index 33902b0..49ec25b 100644 --- a/www/ecrire/inc/ajouter_documents.php +++ b/www/ecrire/inc/ajouter_documents.php @@ -3,7 +3,7 @@ /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * - * Copyright (c) 2001-2011 * + * Copyright (c) 2001-2014 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * @@ -89,6 +89,7 @@ function ajouter_un_document($source, $nom_envoye, $type_lien, $id_lien, $mode, // Documents distants : pas trop de verifications bloquantes, mais un test // via une requete HEAD pour savoir si la ressource existe (non 404), si le // content-type est connu, et si possible recuperer la taille, voire plus. + if ($mode == 'distant') { include_spip('inc/distant'); if ($a = recuperer_infos_distantes($source)) { @@ -117,21 +118,10 @@ function ajouter_un_document($source, $nom_envoye, $type_lien, $id_lien, $mode, // - interdit a l'upload ? // - quelle extension dans spip_types_documents ? // - est-ce "inclus" comme une image ? + list($nom_envoye, $ext, $titre, $inclus) = corriger_extension_et_nom($nom_envoye, $titrer); - preg_match(",^(.*)\.([^.]+)$,", $nom_envoye, $match); - @list(,$titre,$ext) = $match; - // securite : pas de . en dehors de celui separant l'extension - // sinon il est possible d'injecter du php dans un toto.php.txt - $nom_envoye = str_replace('.','-',$titre).'.'.$ext; - if ($titrer) { - $titre = preg_replace(',[[:punct:][:space:]]+,u', ' ', $titre); - } else $titre = ''; - $ext = corriger_extension(strtolower($ext)); - - $row = sql_fetsel("inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'"); - - if ($row) { - $type_inclus_image = ($row['inclus'] == 'image'); + if ($inclus !== false) { + $type_inclus_image = ($inclus == 'image'); $fichier = copier_document($ext, $nom_envoye, $source); } else { @@ -297,6 +287,10 @@ function ajouter_un_document($source, $nom_envoye, $type_lien, $id_lien, $mode, ) ); + if (strlen($a['fichier']) > 255) { + spip_log("Upload avec nom > 255 : " . $a['fichier']); + return; + } $id = sql_insertq("spip_documents", $a); pipeline('post_insertion', @@ -441,6 +435,29 @@ function traite_svg($file) return array($width, $height); } +// Regexp synthetisant un titre a partir d'un nom de fichier. +// Exemple: squelette-de-Mozart-vers-5-ans.jpg => squelette de Mozart vers 5 ans +define('_REGEXP_TITRER_DOCUMENT', ',[[:punct:][:space:]]+,u'); + +function corriger_extension_et_nom($nom, $titrer=false) +{ + preg_match(",^(.*)\.([^.]+)$,", $nom, $match); + @list(,$titre,$ext) = $match; + // les navigateur devraient savoir que ceci est mime-type text + if (!$ext AND (strtolower($nom) === 'makefile')) + $ext = 'txt'; + // securite : pas de . en dehors de celui separant l'extension + // sinon il est possible d'injecter du php dans un toto.php.txt + else $nom = str_replace('.','-',$titre).'.'.$ext; + + if ($titrer) { + $titre = is_string($titre) ? $titre : preg_replace("%".$titre."%", ' ', $titre ? $titre : $nom); + } else $titre = ''; + $ext = corriger_extension(strtolower($ext)); + $row = sql_fetsel("inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'"); + return array($nom, $ext, $titre, $row ? $row['inclus'] : false); +} + // // Corrige l'extension du fichier dans quelques cas particuliers // (a passer dans ecrire/base/typedoc) @@ -456,6 +473,8 @@ function corriger_extension($ext) { return 'jpg'; case 'tiff': return 'tif'; + case 'aif': + return 'aiff'; case 'mpeg': return 'mpg'; default: @@ -470,18 +489,19 @@ function corriger_extension($ext) { function fixer_extension_document($doc) { $extension = ''; $name = $doc['name']; - if (preg_match(',[.]([^.]+)$,', $name, $r) + if (preg_match(',\.([^.]+)$,', $name, $r) AND $t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote(corriger_extension($r[1])))) { $extension = $t['extension']; - $name = preg_replace(',[.][^.]*$,', '', $doc['name']).'.'.$extension; - } - else if ($t = sql_fetsel("extension", "spip_types_documents", - "mime_type=" . sql_quote($doc['type']))) { - $extension = $t['extension']; - $name = preg_replace(',[.][^.]*$,', '', $doc['name']).'.'.$extension; + $name = preg_replace(',\.[^.]*$,', '', $doc['name']).'.'.$extension; + } else { + // les navigateur devraient savoir que ceci est mime-type text + if (strtolower($name) === 'makefile') $doc['type'] = 'txt'; + if ($t = sql_getfetsel("extension", "spip_types_documents", + "mime_type=" . sql_quote($doc['type']))) { + $name = preg_replace(',\.[^.]*$,', '', $doc['name']).'.'.$t; + } } - return array($extension,$name); }