diff --git a/.gitattributes b/.gitattributes index 10063033727386d4396af5be8c22eb3a5c4cb541..08dc238fcb1e22eaa8b9f7554c82a5e4616d1c8f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -30,6 +30,7 @@ inc/getdocument.php -text inc/joindre_document.php -text inc/marquer_doublons_doc.php -text inc/renseigner_document.php -text +inc/verifier_document_mode_image.php -text inc/verifier_document_mode_vignette.php -text inc/vignette.php -text javascript/jquery.multifile.js -text diff --git a/action/ajouter_documents.php b/action/ajouter_documents.php index 2dff3bd8db00147c321c5b1450aed9c80792c29e..8cbf139f5660fddeeda7c09bc7e28f0a173e709f 100644 --- a/action/ajouter_documents.php +++ b/action/ajouter_documents.php @@ -131,8 +131,8 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet, $champs['titre'] = preg_replace(',\.([^.]+)$,', '', $titre); } - if (!$fichier = fixer_fichier_upload($file)) - return ("Impossible de telecharger le fichier"); + if (!is_array($fichier = fixer_fichier_upload($file, $mode))) + return is_string($fichier)?$fichier:_T("erreur_upload_type_interdit",array('nom'=>$file['name'])); $champs['inclus'] = $fichier['inclus']; $champs['extension'] = $fichier['extension']; @@ -241,24 +241,40 @@ function corriger_extension($ext) { /** * Verifie la possibilite d'uploader une extension * renvoie un tableau descriptif si l'extension est acceptee - * une chaine 'zip' si il faut zipper - * false si l'extension est refusee + * 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 * */ -function verifier_upload_autorise($source){ +function verifier_upload_autorise($source, $mode=''){ + $infos = array('fichier'=>$source); + $res = false; if (preg_match(",\.([^.]+)$,", $source, $match) AND $ext = $match[1]){ $ext = corriger_extension(strtolower($ext)); - if ($row = sql_fetsel("extension,inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'")) - return $row; + if ($res = sql_fetsel("extension,inclus,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", "spip_types_documents", "extension='zip' AND upload='oui'")){ + $infos = array_merge($infos,$res); + $res['autozip'] = true; + } + } + 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)){ + $check = $verifier_document_mode($infos); // true ou message d'erreur sous forme de chaine + if ($check!==true) + $res = $check; + } } - - if (sql_countsel("spip_types_documents", "extension='zip' AND upload='oui'")) - return 'zip'; - spip_log("Extension $ext interdite a l'upload"); - return false; + if (!$res OR is_string($res)); + spip_log("Upload $source interdit ($res)",_LOG_INFO_IMPORTANTE); + return $res; } @@ -273,53 +289,55 @@ function verifier_upload_autorise($source){ * @param array $file //format $_FILES * @return array */ -function fixer_fichier_upload($file){ +function fixer_fichier_upload($file, $mode=''){ - if (is_array($row=verifier_upload_autorise($file['name']))) { - $row['fichier'] = copier_document($row['extension'], $file['name'], $file['tmp_name']); - return $row; - } - // creer un zip comme demande - // pour encapsuler un fichier dont l'extension n'est pas supportee - elseif($row==='zip'){ + 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']); + return $row; + } + // creer un zip comme demande + // pour encapsuler un fichier dont l'extension n'est pas supportee + else{ - $row = array('extension'=>'zip','inclus'=>false); + unset($row['autozip']); - $ext = 'zip'; - if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) - return false; - - spip_unlink($tmp_dir); - @mkdir($tmp_dir); - - include_spip('inc/charset'); - $tmp = $tmp_dir.'/'.translitteration($file['name']); - - $file['name'] .= '.zip'; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip + $ext = 'zip'; + if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) + return false; - // 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) . '.zip'; - $archive = new PclZip($source); - - $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 "); - return false; + spip_unlink($tmp_dir); + @mkdir($tmp_dir); + + include_spip('inc/charset'); + $tmp = $tmp_dir.'/'.translitteration($file['name']); + + $file['name'] .= '.'.$ext; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip + + // 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; + $archive = new PclZip($source); + + $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 "); + return false; + } + + $row['fichier'] = copier_document($row['extension'], $file['name'], $source); + spip_unlink($source); + return $row; } - - $row['fichier'] = copier_document($row['extension'], $file['name'], $source); - spip_unlink($source); - return $row; } - - return false; + else + return $row; // retourner le message d'erreur } /** @@ -335,9 +353,6 @@ function verifier_taille_document_acceptable($infos){ 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']))); - - if ($infos['mode'] == 'image') - return _T('medias:erreur_format_fichier_image',array('nom'=> $infos['fichier'])); } // si c'est une image diff --git a/inc/joindre_document.php b/inc/joindre_document.php index e5a57a11972a432460bad4b60fdd4ba5d0c4d51a..68d26d0aaf797d4eacdbb394f1b18446ddff24ef 100644 --- a/inc/joindre_document.php +++ b/inc/joindre_document.php @@ -47,7 +47,7 @@ function joindre_trouver_fichier_envoye(){ if (!($test['error'] == 4)){ if (is_string($err = joindre_upload_error($test['error']))) return $err; // un erreur upload - if (!verifier_upload_autorise($test['name'])) + if (!is_array(verifier_upload_autorise($test['name']))) return _T('medias:erreur_upload_type_interdit',array('nom'=>$test['name'])); $files[]=$test; } @@ -58,7 +58,7 @@ function joindre_trouver_fichier_envoye(){ if (!($file['error'] == 4)){ if (is_string($err = joindre_upload_error($file['error']))) return $err; // un erreur upload - if (!verifier_upload_autorise($file['name'])) + if (!is_array(verifier_upload_autorise($file['name']))) return _T('medias:erreur_upload_type_interdit',array('nom'=>$file['name'])); $files[]=$file; } diff --git a/inc/verifier_document_mode_image.php b/inc/verifier_document_mode_image.php new file mode 100644 index 0000000000000000000000000000000000000000..1b2afbe5e2bb610a79a5e5d14290edd401401058 --- /dev/null +++ b/inc/verifier_document_mode_image.php @@ -0,0 +1,26 @@ +<?php +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2010 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +if (!defined("_ECRIRE_INC_VERSION")) return; + +function inc_verifier_document_mode_image_dist($infos){ + + // Si on veut uploader une image, il faut qu'elle ait ete bien lue + if ($infos['inclus'] != 'image') + return _T('medias:erreur_format_fichier_image',array('nom'=> $infos['fichier'])); #SVG + + if (isset($infos['largeur']) AND isset($infos['hauteur'])){ + if (!($infos['largeur'] OR $infos['hauteur'])) + return _T('medias:erreur_upload_vignette',array('nom'=>$infos['fichier'])); + } + + return true; +} \ No newline at end of file diff --git a/inc/verifier_document_mode_vignette.php b/inc/verifier_document_mode_vignette.php index 8317652844225c3f1195d44b09a7ecde828b3572..9b829117cda523de108bcfde7a0c29c347d08294 100644 --- a/inc/verifier_document_mode_vignette.php +++ b/inc/verifier_document_mode_vignette.php @@ -17,8 +17,10 @@ function inc_verifier_document_mode_vignette_dist($infos){ if ($infos['inclus'] != 'image') return _T('medias:erreur_format_fichier_image',array('nom'=> $infos['fichier'])); #SVG - if (!($infos['largeur'] OR $infos['hauteur'])) - return _T('medias:erreur_upload_vignette',array('nom'=>$infos['fichier'])); + if (isset($infos['largeur']) AND isset($infos['hauteur'])){ + if (!($infos['largeur'] OR $infos['hauteur'])) + return _T('medias:erreur_upload_vignette',array('nom'=>$infos['fichier'])); + } return true; } \ No newline at end of file