[SPIP] ~2.1.12 -->2.1.25
[velocampus/web/www.git] / www / ecrire / inc / ajouter_documents.php
index 33902b0..49ec25b 100644 (file)
@@ -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);
 }