[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / plugins-dist / medias / action / ajouter_documents.php
index a48cc5f..b9fc7b0 100644 (file)
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-if (!defined("_ECRIRE_INC_VERSION")) return;
+/**
+ * Gestion de l'action ajouter_documents
+ *
+ * @package SPIP\Medias\Action
+ **/
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+       return;
+}
 
 include_spip('inc/getdocument');
 include_spip('inc/documents');
@@ -21,59 +29,60 @@ include_spip('inc/renseigner_document');
  * Ajouter des documents
  *
  * @param int $id_document
- *   document a remplacer, ou pour une vignette, l'id_document de maman
+ *   Document à remplacer, ou pour une vignette, l'id_document de maman
  *   0 ou 'new' pour une insertion
- * @param  $files
- *   tableau de taleau de propriete pour chaque document a inserer
- * @param  $objet
- *   objet auquel associer le document
- * @param  $id_objet
+ * @param array $files
+ *   Tableau de tableaux de propriétés pour chaque document à insérer
+ * @param string $objet
+ *   Objet auquel associer le document
+ * @param int $id_objet
  *   id_objet
- * @param  $mode
- *   mode par defaut si pas precise pour le document
+ * @param string $mode
+ *   Mode par défaut si pas precisé pour le document
  * @return array
- *   liste des id_documents inseres
+ *   Liste des id_documents inserés
  */
-function action_ajouter_documents_dist($id_document, $files, $objet, $id_objet, $mode){
-       $ajouter_un_document = charger_fonction('ajouter_un_document','action');
+function action_ajouter_documents_dist($id_document, $files, $objet, $id_objet, $mode) {
+       $ajouter_un_document = charger_fonction('ajouter_un_document', 'action');
        $ajoutes = array();
 
        // on ne peut mettre qu'un seul document a la place d'un autre ou en vignette d'un autre
-       if (intval($id_document)){
+       if (intval($id_document)) {
                $ajoutes[] = $ajouter_un_document($id_document, reset($files), $objet, $id_objet, $mode);
-       }
-       else
-               foreach($files as $file){
+       } else {
+               foreach ($files as $file) {
                        $ajoutes[] = $ajouter_un_document('new', $file, $objet, $id_objet, $mode);
                }
+       }
+
        return $ajoutes;
 }
 
 /**
  * Ajouter un document (au format $_FILES)
  *
- * https://code.spip.net/@ajouter_un_document
- *
  * @param int $id_document
- *   document a remplacer, ou pour une vignette, l'id_document de maman
+ *   Document à remplacer, ou pour une vignette, l'id_document de maman
  *   0 ou 'new' pour une insertion
  * @param array $file
- *   proprietes au format $_FILE etendu :
- *     string tmp_name : source sur le serveur
- *     string name : nom du fichier envoye
- *     bool titrer : donner ou non un titre a partir du nom du fichier
- *     bool distant : pour utiliser une source distante sur internet
- *     string mode : vignette|image|documents|choix
+ *   Propriétes au format $_FILE étendu :
+ *
+ *   - string tmp_name : source sur le serveur
+ *   - string name : nom du fichier envoye
+ *   - bool titrer : donner ou non un titre a partir du nom du fichier
+ *   - bool distant : pour utiliser une source distante sur internet
+ *   - string mode : vignette|image|documents|choix
  * @param string $objet
- *   objet auquel associer le document
+ *   Objet auquel associer le document
  * @param int $id_objet
  *   id_objet
  * @param string $mode
- *   mode par defaut si pas precise pour le document
+ *   Mode par défaut si pas precisé pour le document
  * @return array|bool|int|mixed|string|unknown
- *      si int : l'id_document ajouté (opération réussie)
- *   si string : une erreur s'est produit, la chaine est le message d'erreur
- *  
+ *
+ *   - int : l'id_document ajouté (opération réussie)
+ *   - string : une erreur s'est produit, la chaine est le message d'erreur
+ *
  */
 function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet, $mode) {
 
@@ -85,16 +94,19 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
        // pas que Toto.pdf et toto.pdf
        // et on aura une collision en cas de changement de file system
        $file['name'] = strtolower(translitteration($file['name']));
-       
+
        // Pouvoir definir dans mes_options.php que l'on veut titrer tous les documents par d?faut
-       if (!defined('_TITRER_DOCUMENTS')) { define('_TITRER_DOCUMENTS', false); }
+       if (!defined('_TITRER_DOCUMENTS')) {
+               define('_TITRER_DOCUMENTS', false);
+       }
 
-       $titrer = isset($file['titrer'])?$file['titrer']:_TITRER_DOCUMENTS;
-       $mode = ((isset($file['mode']) AND $file['mode'])?$file['mode']:$mode);
+       $titrer = isset($file['titrer']) ? $file['titrer'] : _TITRER_DOCUMENTS;
+       $mode = ((isset($file['mode']) and $file['mode']) ? $file['mode'] : $mode);
 
        include_spip('inc/modifier');
-       if (isset($file['distant']) AND $file['distant'] AND !in_array($mode,array('choix','auto','image','document'))) {
-               spip_log("document distant $source accepte sans verification, mode=$mode","medias"._LOG_INFO_IMPORTANTE);
+       if (isset($file['distant']) and $file['distant']
+               and !in_array($mode, array('choix', 'auto', 'image', 'document'))) {
+               spip_log("document distant $source accepte sans verification, mode=$mode", 'medias'._LOG_INFO_IMPORTANTE);
                include_spip('inc/distant');
                $file['tmp_name'] = _DIR_RACINE . copie_locale($source);
                $source = $file['tmp_name'];
@@ -104,42 +116,48 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
        // 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 (isset($file['distant']) AND $file['distant']) {
-               if (!tester_url_absolue($source)){
+       if (isset($file['distant']) and $file['distant']) {
+               if (!tester_url_absolue($source)) {
                        return _T('medias:erreur_chemin_distant', array('nom' => $source));
                }
                include_spip('inc/distant');
+               $source = str_replace(array("'",'"','<'),array("%27",'%22','%3C'), $source);
                if (is_array($a = renseigner_source_distante($source))) {
-
                        $champs = $a;
                        # NB: dans les bonnes conditions (fichier autorise et pas trop gros)
                        # $a['fichier'] est une copie locale du fichier
 
+                       $infos = renseigner_taille_dimension_image($champs['fichier'], $champs['extension'], true);
+                       // on ignore erreur eventuelle sur $infos car on est distant, ca ne marche pas forcement
+                       if (is_array($infos)) {
+                               $champs = array_merge($champs, $infos);
+                       }
+
                        unset($champs['type_image']);
-               }
-               // on ne doit plus arriver ici, car l'url distante a ete verifiee a la saisie !
+               } // on ne doit plus arriver ici, car l'url distante a ete verifiee a la saisie !
                else {
                        spip_log("Echec du lien vers le document $source, abandon");
+
                        return $a; // message d'erreur
                }
-       }
-       else { // pas distant
+       } else { // pas distant
 
                $champs = array(
                        'distant' => 'non'
                );
-               
-               $type_image = ''; // au pire
+
                $champs['titre'] = '';
-               if ($titrer){
-                       $titre = substr($nom_envoye,0, strrpos($nom_envoye, ".")); // Enlever l'extension du nom du fichier
+               if ($titrer) {
+                       $titre = substr($nom_envoye, 0, strrpos($nom_envoye, '.')); // Enlever l'extension du nom du fichier
                        $titre = preg_replace(',[[:punct:][:space:]]+,u', ' ', $titre);
                        $champs['titre'] = preg_replace(',\.([^.]+)$,', '', $titre);
                }
 
-               if (!is_array($fichier = fixer_fichier_upload($file, $mode)))
-                       return is_string($fichier)?$fichier:_T("medias:erreur_upload_type_interdit",array('nom'=>$file['name']));
-               
+               if (!is_array($fichier = fixer_fichier_upload($file, $mode))) {
+                       return is_string($fichier) ?
+                               $fichier : _T('medias:erreur_upload_type_interdit', array('nom' => $file['name']));
+               }
+
                $champs['inclus'] = $fichier['inclus'];
                $champs['extension'] = $fichier['extension'];
                $champs['fichier'] = $fichier['fichier'];
@@ -152,21 +170,44 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
                 * -* taille
                 * -* ses metadonnées si une fonction de metadatas/ est présente
                 */
-               $infos = renseigner_taille_dimension_image($champs['fichier'],$champs['extension']);
-               if (is_string($infos))
-                       return $infos; // c'est un message d'erreur !
-               
-               $champs = array_merge($champs,$infos);
+               $infos = renseigner_taille_dimension_image($champs['fichier'], $champs['extension']);
+               if (is_string($infos)) {
+                       // c'est un message d'erreur !
+                       return $infos;
+               }
+
+               // lorsqu’une image arrive avec une mauvaise extension par rapport au mime type, adapter.
+               // Exemple : si extension .jpg mais le contenu est un png
+               if (!empty($infos['type_image']) and $infos['type_image'] !== $champs['extension']) {
+                       spip_log('Image `' . $file['name'] . '` mauvaise extension. Correcte : ' . $infos['type_image'], 'medias' . _LOG_INFO);
+                       $new = copier_document($infos['type_image'], $file['name'] . '.' . $infos['type_image'], $champs['fichier']);
+                       if ($new) {
+                               supprimer_fichier($champs['fichier']);
+                               $champs['fichier'] = $new;
+                               $champs['extension'] = $infos['type_image'];
+                               $infos = renseigner_taille_dimension_image($champs['fichier'], $champs['extension']);
+                               if (is_string($infos)) {
+                                       // c'est un message d'erreur !
+                                       return $infos;
+                               }
+                               spip_log('> Image `' . $file['name'] . '` renommée en : ' . basename($champs['fichier']), 'medias' . _LOG_INFO);
+                       } else {
+                               spip_log('! Image  `' . $file['name'] . '` non renommée en extension : ' . $champs['extension'], 'medias' . _LOG_INFO_IMPORTANTE);
+                       }
+               }
+
+               $champs = array_merge($champs, $infos);
 
                // Si mode == 'choix', fixer le mode image/document
-               if (in_array($mode,array('choix','auto'))) {
-                       $choisir_mode_document = charger_fonction('choisir_mode_document','inc');
+               if (in_array($mode, array('choix', 'auto'))) {
+                       $choisir_mode_document = charger_fonction('choisir_mode_document', 'inc');
                        $mode = $choisir_mode_document($champs, $champs['inclus'] == 'image', $objet);
                }
                $champs['mode'] = $mode;
 
-               if (($test = verifier_taille_document_acceptable($champs))!==true){
+               if (($test = verifier_taille_document_acceptable($champs)) !== true) {
                        spip_unlink($champs['fichier']);
+
                        return $test; // erreur sur les dimensions du fichier
                }
 
@@ -176,17 +217,22 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
        }
 
        // si le media est pas renseigne, le faire, en fonction de l'extension
-       if (!isset($champs['media'])){
-               $champs['media'] = sql_getfetsel('media_defaut','spip_types_documents','extension='.sql_quote($champs['extension']));
+       if (!isset($champs['media'])) {
+               $champs['media'] = sql_getfetsel(
+                       'media_defaut',
+                       'spip_types_documents',
+                       'extension=' . sql_quote($champs['extension'])
+               );
        }
-       
+
        // lier le parent si necessaire
-       if ($id_objet=intval($id_objet) AND $objet)
+       if ($id_objet = intval($id_objet) and $objet) {
                $champs['parents'][] = "$objet|$id_objet";
+       }
 
        // "mettre a jour un document" si on lui
        // passe un id_document
-       if ($id_document=intval($id_document)){
+       if ($id_document = intval($id_document)) {
                unset($champs['titre']); // garder le titre d'origine
                unset($champs['date']); // garder la date d'origine
                unset($champs['descriptif']); // garder la desc d'origine
@@ -196,27 +242,36 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
 
        include_spip('action/editer_document');
        // Installer le document dans la base
-       if (!$id_document){
-               if ($id_document = document_inserer())
-                       spip_log ("ajout du document ".$file['tmp_name']." ".$file['name']."  (M '$mode' T '$objet' L '$id_objet' D '$id_document')",'medias');
-               else
-                       spip_log ("Echec insert_document() du document ".$file['tmp_name']." ".$file['name']."  (M '$mode' T '$objet' L '$id_objet' D '$id_document')",'medias'._LOG_ERREUR);
+       if (!$id_document) {
+               if ($id_document = document_inserer()) {
+                       spip_log(
+                               'ajout du document ' . $file['tmp_name'] . ' ' . $file['name'] . "  (M '$mode' T '$objet' L '$id_objet' D '$id_document')",
+                               'medias'
+                       );
+               } else {
+                       spip_log(
+                               'Echec insert_document() du document ' . $file['tmp_name'] . ' ' . $file['name'] . "  (M '$mode' T '$objet' L '$id_objet' D '$id_document')",
+                               'medias' . _LOG_ERREUR
+                       );
+               }
+       }
+       if (!$id_document) {
+               return _T('medias:erreur_insertion_document_base', array('fichier' => '<em>' . $file['name'] . '</em>'));
        }
-       if (!$id_document)
-               return _T('medias:erreur_insertion_document_base',array('fichier'=>"<em>".$file['name']."</em>"));
-       
-       document_modifier($id_document,$champs);
+
+       document_modifier($id_document, $champs);
 
        // permettre aux plugins de faire des modifs a l'ajout initial
        // ex EXIF qui tourne les images si necessaire
        // Ce plugin ferait quand même mieux de se placer dans metadata/jpg.php
-       pipeline('post_edition',
+       pipeline(
+               'post_edition',
                array(
                        'args' => array(
                                'table' => 'spip_documents', // compatibilite
                                'table_objet' => 'documents',
                                'spip_table_objet' => 'spip_documents',
-                               'type' =>'document',
+                               'type' => 'document',
                                'id_objet' => $id_document,
                                'champs' => array_keys($champs),
                                'serveur' => '', // serveur par defaut, on ne sait pas faire mieux pour le moment
@@ -227,15 +282,19 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
                )
        );
 
-       return $id_document ;
+       return $id_document;
 }
 
 
 /**
  * Corrige l'extension du fichier dans quelques cas particuliers
- * (a passer dans ecrire/base/typedoc)
- * A noter : une extension 'pdf ' passe dans la requete de controle
- * mysql> SELECT * FROM spip_types_documents WHERE extension="pdf ";
+ *
+ * @note
+ *     Une extension 'pdf ' passe dans la requête de contrôle
+ *     mysql> SELECT * FROM spip_types_documents WHERE extension="pdf ";
+ *
+ * @todo
+ *     À passer dans base/typedoc
  *
  * @param string $ext
  * @return string
@@ -244,60 +303,78 @@ function corriger_extension($ext) {
        $ext = preg_replace(',[^a-z0-9],i', '', $ext);
        switch ($ext) {
                case 'htm':
-                       $ext='html';
+                       $ext = 'html';
                        break;
                case 'jpeg':
-                       $ext='jpg';
+                       $ext = 'jpg';
                        break;
                case 'tiff':
-                       $ext='tif';
+                       $ext = 'tif';
                        break;
                case 'aif':
-                       $ext='aiff';
+                       $ext = 'aiff';
                        break;
                case 'mpeg':
-                       $ext='mpg';
+                       $ext = 'mpg';
                        break;
        }
+
        return $ext;
 }
 
 /**
- * Verifie la possibilite d'uploader une extension
- * renvoie un tableau descriptif si l'extension est acceptee
- * avec un index 'autozip' si il faut zipper
- * false ou message d'erreur si l'extension est refusee
- * Verifie aussi si l'extension est autorisee pour le mode demande
- * si on connait le mode a ce moment la
- * 
+ * Vérifie la possibilité d'uploader une extension
+ *
+ * Vérifie aussi si l'extension est autorisée pour le mode demandé
+ * si on connait le mode à ce moment là
+ *
+ * @param string $source
+ *     Nom du fichier
+ * @param string $mode
+ *     Mode d'inclusion du fichier, si connu
+ * @return array|bool|string
+ *
+ *     - array : extension acceptée (tableau descriptif).
+ *       Avec un index 'autozip' si il faut zipper
+ *     - false ou message d'erreur si l'extension est refusée
  */
-function verifier_upload_autorise($source, $mode=''){
-       $infos = array('fichier'=>$source);
+function verifier_upload_autorise($source, $mode = '') {
+       $infos = array('fichier' => $source);
        $res = false;
-       if (preg_match(",\.([a-z0-9]+)(\?.*)?$,i", $source, $match)
-         AND $ext = $match[1]){
-               
-         $ext = corriger_extension(strtolower($ext));
-               if ($res = sql_fetsel("extension,inclus,media_defaut as media", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'"))
-                       $infos = array_merge($infos,$res);
+       if (preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $match)
+               and $ext = $match[1]
+       ) {
+               $ext = corriger_extension(strtolower($ext));
+               if ($res = sql_fetsel(
+                       'extension,inclus,media_defaut as media',
+                       'spip_types_documents',
+                       'extension=' . sql_quote($ext) . " AND upload='oui'"
+               )) {
+                       $infos = array_merge($infos, $res);
+               }
        }
-       if (!$res){
-               if ($res = sql_fetsel("extension,inclus,media_defaut as media", "spip_types_documents", "extension='zip' AND upload='oui'")){
-                       $infos = array_merge($infos,$res);
+       if (!$res) {
+               if ($res = sql_fetsel(
+                       'extension,inclus,media_defaut as media',
+                       'spip_types_documents',
+                       "extension='zip' AND upload='oui'"
+               )) {
+                       $infos = array_merge($infos, $res);
                        $res['autozip'] = true;
                }
        }
-       if ($mode AND $res){
+       if ($mode and $res) {
                // verifier en fonction du mode si une fonction est proposee
-               if ($verifier_document_mode = charger_fonction("verifier_document_mode_".$mode,"inc",true)){
+               if ($verifier_document_mode = charger_fonction('verifier_document_mode_' . $mode, 'inc', true)) {
                        $check = $verifier_document_mode($infos); // true ou message d'erreur sous forme de chaine
-                       if ($check!==true)
+                       if ($check !== true) {
                                $res = $check;
+                       }
                }
        }
 
-       if (!$res OR is_string($res)) {
-               spip_log("Upload $source interdit ($res)",_LOG_INFO_IMPORTANTE);
+       if (!$res or is_string($res)) {
+               spip_log("Upload $source interdit ($res)", _LOG_INFO_IMPORTANTE);
        }
 
        return $res;
@@ -305,132 +382,185 @@ function verifier_upload_autorise($source, $mode=''){
 
 
 /**
- * tester le type de document :
+ * Tester le type de document
+ *
+ * - le document existe et n'est pas de taille 0 ?
  * - interdit a l'upload ?
  * - quelle extension dans spip_types_documents ?
  * - est-ce "inclus" comme une image ?
- * 
- * le zipper si necessaire
- * 
- * @param array $file //format $_FILES
+ *
+ * Le zipper si necessaire
+ *
+ * @param array $file
+ *     Au format $_FILES
+ * @param string $mode
+ *     Mode d'inclusion du fichier, si connu
  * @return array
  */
-function fixer_fichier_upload($file, $mode=''){
-
-       if (is_array($row=verifier_upload_autorise($file['name'], $mode))) {
-               if (!isset($row['autozip'])){
+function fixer_fichier_upload($file, $mode = '') {
+       /**
+        * On vérifie que le fichier existe et qu'il contient quelque chose
+        */
+       if (is_array($row = verifier_upload_autorise($file['name'], $mode))) {
+               if (!isset($row['autozip'])) {
                        $row['fichier'] = copier_document($row['extension'], $file['name'], $file['tmp_name']);
-                       
                        /**
                         * On vérifie que le fichier a une taille
                         * si non, on le supprime et on affiche une erreur
                         */
-                       if($row['fichier'] && (!$taille = @intval(filesize(get_spip_doc($row['fichier']))))) { 
-                               spip_log ("Echec copie du fichier ".$file['tmp_name']." (taille de fichier indéfinie)");
+                       if ($row['fichier'] && (!$taille = @intval(filesize(get_spip_doc($row['fichier']))))) {
+                               spip_log('Echec copie du fichier ' . $file['tmp_name'] . ' (taille de fichier indéfinie)');
                                spip_unlink(get_spip_doc($row['fichier']));
-                               return _T('medias:erreur_copie_fichier',array('nom'=> $file['tmp_name']));
-                       }else 
+                               return _T('medias:erreur_copie_fichier', array('nom' => $file['tmp_name']));
+                       } else {
                                return $row;
-               }
-               // creer un zip comme demande
-               // pour encapsuler un fichier dont l'extension n'est pas supportee
-               else{
-               
+                       }
+               } else {
+                       // creer un zip comme demande
+                       // pour encapsuler un fichier dont l'extension n'est pas supportee
                        unset($row['autozip']);
 
                        $ext = 'zip';
-                       if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload'))
+                       if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) {
                                return false;
+                       }
 
                        spip_unlink($tmp_dir);
                        @mkdir($tmp_dir);
 
                        include_spip('inc/charsets');
-                       $tmp = $tmp_dir.'/'.translitteration($file['name']);
+                       $tmp = $tmp_dir . '/' . translitteration($file['name']);
 
-                       $file['name'] .= '.'.$ext; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
+                       // conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
+                       $file['name'] .= '.' . $ext;
 
                        // deplacer le fichier tmp_name dans le dossier tmp
                        deplacer_fichier_upload($file['tmp_name'], $tmp, true);
 
                        include_spip('inc/pclzip');
-                       $source = _DIR_TMP . basename($tmp_dir) . '.'.$ext;
+                       $source = _DIR_TMP . basename($tmp_dir) . '.' . $ext;
                        $archive = new PclZip($source);
 
-                       $v_list = $archive->create($tmp,
-                                       PCLZIP_OPT_REMOVE_PATH, $tmp_dir,
-                                       PCLZIP_OPT_ADD_PATH, '');
+                       $v_list = $archive->create(
+                               $tmp,
+                               PCLZIP_OPT_REMOVE_PATH,
+                               $tmp_dir,
+                               PCLZIP_OPT_ADD_PATH,
+                               ''
+                       );
 
                        effacer_repertoire_temporaire($tmp_dir);
                        if (!$v_list) {
-                               spip_log("Echec creation du zip ");
+                               spip_log('Echec creation du zip');
                                return false;
                        }
 
-                       $row['fichier']  = copier_document($row['extension'], $file['name'], $source);
+                       $row['fichier'] = copier_document($row['extension'], $file['name'], $source);
                        spip_unlink($source);
-                       
                        /**
-                        * On vérifie que le fichier zip créé a une taille
+                        * On vérifie que le fichier a une taille
                         * si non, on le supprime et on affiche une erreur
                         */
-                       if($row['fichier'] && (!$taille = @intval(filesize(get_spip_doc($row['fichier']))))) { 
-                               spip_log ("Echec copie du fichier ".$file['tmp_name']." (taille de fichier indéfinie)");
+                       if ($row['fichier'] && (!$taille = @intval(filesize(get_spip_doc($row['fichier']))))) {
+                               spip_log('Echec copie du fichier ' . $file['tmp_name'] . ' (taille de fichier indéfinie)');
                                spip_unlink(get_spip_doc($row['fichier']));
-                               return _T('medias:erreur_copie_fichier',array('nom'=> $file['tmp_name']));
-                       }else 
+
+                               return _T('medias:erreur_copie_fichier', array('nom' => $file['tmp_name']));
+                       } else {
                                return $row;
+                       }
                }
-       }
-       else
-               return $row; // retourner le message d'erreur
+       } else {
+               return $row;
+       } // retourner le message d'erreur
 }
 
 /**
  * Verifier si le fichier respecte les contraintes de tailles
- * 
+ *
  * @param  array $infos
  * @return bool|mixed|string
  */
-function verifier_taille_document_acceptable($infos){
-       
+function verifier_taille_document_acceptable(&$infos) {
+
        // si ce n'est pas une image
        if (!$infos['type_image']) {
-               if (_DOC_MAX_SIZE > 0
-                AND $infos['taille'] > _DOC_MAX_SIZE*1024)
-                       return _T('medias:info_doc_max_poids', array('maxi' => taille_en_octets(_DOC_MAX_SIZE*1024), 'actuel' => taille_en_octets($infos['taille'])));
-       }
-       
-       // si c'est une image
+               if (defined('_DOC_MAX_SIZE') and _DOC_MAX_SIZE > 0 and $infos['taille'] > _DOC_MAX_SIZE * 1024) {
+                       return _T(
+                               'medias:info_doc_max_poids',
+                               array(
+                                       'maxi' => taille_en_octets(_DOC_MAX_SIZE * 1024),
+                                       'actuel' => taille_en_octets($infos['taille'])
+                               )
+                       );
+               }
+       } // si c'est une image
        else {
+               if ((defined('_IMG_MAX_WIDTH') and _IMG_MAX_WIDTH and $infos['largeur'] > _IMG_MAX_WIDTH)
+                       or (defined('_IMG_MAX_HEIGHT') and _IMG_MAX_HEIGHT and $infos['hauteur'] > _IMG_MAX_HEIGHT)
+               ) {
+                       $max_width = (defined('_IMG_MAX_WIDTH') and _IMG_MAX_WIDTH) ? _IMG_MAX_WIDTH : '*';
+                       $max_height = (defined('_IMG_MAX_HEIGHT') and _IMG_MAX_HEIGHT) ? _IMG_MAX_HEIGHT : '*';
+
+                       // pas la peine d'embeter le redacteur avec ca si on a active le calcul des miniatures
+                       // on met directement a la taille maxi a la volee
+                       if (isset($GLOBALS['meta']['creer_preview']) and $GLOBALS['meta']['creer_preview'] == 'oui') {
+                               include_spip('inc/filtres');
+                               $img = filtrer('image_reduire', $infos['fichier'], $max_width, $max_height);
+                               $img = extraire_attribut($img, 'src');
+                               $img = supprimer_timestamp($img);
+                               if (@file_exists($img) and $img !== $infos['fichier']) {
+                                       spip_unlink($infos['fichier']);
+                                       @rename($img, $infos['fichier']);
+                                       $size = @getimagesize($infos['fichier']);
+                                       $infos['largeur'] = $size[0];
+                                       $infos['hauteur'] = $size[1];
+                                       $infos['taille'] = @filesize($infos['fichier']);
+                               }
+                       }
 
-               if (_IMG_MAX_SIZE > 0
-                AND $infos['taille'] > _IMG_MAX_SIZE*1024)
-                       return _T('medias:info_image_max_poids', array('maxi' => taille_en_octets(_IMG_MAX_SIZE*1024), 'actuel' => taille_en_octets($infos['taille'])));
-       
-               if (_IMG_MAX_WIDTH * _IMG_MAX_HEIGHT
-                AND ($infos['largeur'] > _IMG_MAX_WIDTH
-                OR $infos['hauteur'] > _IMG_MAX_HEIGHT))
-
-                       return _T('medias:info_logo_max_taille',
+                       if ((defined('_IMG_MAX_WIDTH') and _IMG_MAX_WIDTH and $infos['largeur'] > _IMG_MAX_WIDTH)
+                               or (defined('_IMG_MAX_HEIGHT') and _IMG_MAX_HEIGHT and $infos['hauteur'] > _IMG_MAX_HEIGHT)
+                       ) {
+                               return _T(
+                                       'medias:info_image_max_taille',
                                        array(
-                                       'maxi' =>
-                                               _T('info_largeur_vignette',
-                                                       array('largeur_vignette' => _IMG_MAX_WIDTH,
-                                                       'hauteur_vignette' => _IMG_MAX_HEIGHT)),
-                                       'actuel' =>
-                                               _T('info_largeur_vignette',
-                                                       array('largeur_vignette' => $infos['largeur'],
-                                                       'hauteur_vignette' => $infos['hauteur']))
-                               ));
+                                               'maxi' =>
+                                                       _T(
+                                                               'info_largeur_vignette',
+                                                               array(
+                                                                       'largeur_vignette' => $max_width,
+                                                                       'hauteur_vignette' => $max_height
+                                                               )
+                                                       ),
+                                               'actuel' =>
+                                                       _T(
+                                                               'info_largeur_vignette',
+                                                               array(
+                                                                       'largeur_vignette' => $infos['largeur'],
+                                                                       'hauteur_vignette' => $infos['hauteur']
+                                                               )
+                                                       )
+                                       )
+                               );
+                       }
+               }
+
+               if (defined('_IMG_MAX_SIZE') and _IMG_MAX_SIZE > 0 and $infos['taille'] > _IMG_MAX_SIZE * 1024) {
+                       return _T(
+                               'medias:info_image_max_poids',
+                               array(
+                                       'maxi' => taille_en_octets(_IMG_MAX_SIZE * 1024),
+                                       'actuel' => taille_en_octets($infos['taille'])
+                               )
+                       );
+               }
        }
 
        // verifier en fonction du mode si une fonction est proposee
-       if ($verifier_document_mode = charger_fonction("verifier_document_mode_".$infos['mode'],"inc",true))
+       if ($verifier_document_mode = charger_fonction('verifier_document_mode_' . $infos['mode'], 'inc', true)) {
                return $verifier_document_mode($infos);
+       }
 
        return true;
 }
-
-
-?>