Skip to content
Extraits de code Groupes Projets
Valider 8f498ad5 rédigé par cedric@yterium.com's avatar cedric@yterium.com
Parcourir les fichiers
verifier plus en amont que le type de fichier qu'on essayer d'uploader est autorise pour eviter de creer des repertoires fantomes inutiles.
Du coup on deplace la verification du type image dans une fonction verifier_document_mode_image,
et ces fonctions de verifications sont appelees deux fois :
- une fois avant copie du fichier dans IMG/
- une fois apres analyse détaillée du contenu du fichier
Les fonctions ne doivent pas refuser a tort un document a la premiere passe si les infos ne sont pas completes
parent a6e6d528
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -30,6 +30,7 @@ inc/getdocument.php -text ...@@ -30,6 +30,7 @@ inc/getdocument.php -text
inc/joindre_document.php -text inc/joindre_document.php -text
inc/marquer_doublons_doc.php -text inc/marquer_doublons_doc.php -text
inc/renseigner_document.php -text inc/renseigner_document.php -text
inc/verifier_document_mode_image.php -text
inc/verifier_document_mode_vignette.php -text inc/verifier_document_mode_vignette.php -text
inc/vignette.php -text inc/vignette.php -text
javascript/jquery.multifile.js -text javascript/jquery.multifile.js -text
......
...@@ -131,8 +131,8 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet, ...@@ -131,8 +131,8 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
$champs['titre'] = preg_replace(',\.([^.]+)$,', '', $titre); $champs['titre'] = preg_replace(',\.([^.]+)$,', '', $titre);
} }
if (!$fichier = fixer_fichier_upload($file)) if (!is_array($fichier = fixer_fichier_upload($file, $mode)))
return ("Impossible de telecharger le fichier"); return is_string($fichier)?$fichier:_T("erreur_upload_type_interdit",array('nom'=>$file['name']));
$champs['inclus'] = $fichier['inclus']; $champs['inclus'] = $fichier['inclus'];
$champs['extension'] = $fichier['extension']; $champs['extension'] = $fichier['extension'];
...@@ -241,24 +241,40 @@ function corriger_extension($ext) { ...@@ -241,24 +241,40 @@ function corriger_extension($ext) {
/** /**
* Verifie la possibilite d'uploader une extension * Verifie la possibilite d'uploader une extension
* renvoie un tableau descriptif si l'extension est acceptee * renvoie un tableau descriptif si l'extension est acceptee
* une chaine 'zip' si il faut zipper * avec un index 'autozip' si il faut zipper
* false si l'extension est refusee * 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) if (preg_match(",\.([^.]+)$,", $source, $match)
AND $ext = $match[1]){ AND $ext = $match[1]){
$ext = corriger_extension(strtolower($ext)); $ext = corriger_extension(strtolower($ext));
if ($row = sql_fetsel("extension,inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'")) if ($res = sql_fetsel("extension,inclus,media", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'"))
return $row; $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"); if (!$res OR is_string($res));
return false; spip_log("Upload $source interdit ($res)",_LOG_INFO_IMPORTANTE);
return $res;
} }
...@@ -273,53 +289,55 @@ function verifier_upload_autorise($source){ ...@@ -273,53 +289,55 @@ function verifier_upload_autorise($source){
* @param array $file //format $_FILES * @param array $file //format $_FILES
* @return array * @return array
*/ */
function fixer_fichier_upload($file){ function fixer_fichier_upload($file, $mode=''){
if (is_array($row=verifier_upload_autorise($file['name']))) { if (is_array($row=verifier_upload_autorise($file['name'], $mode))) {
$row['fichier'] = copier_document($row['extension'], $file['name'], $file['tmp_name']); if (!isset($row['autozip'])){
return $row; $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 // creer un zip comme demande
elseif($row==='zip'){ // pour encapsuler un fichier dont l'extension n'est pas supportee
else{
$row = array('extension'=>'zip','inclus'=>false); unset($row['autozip']);
$ext = 'zip'; $ext = 'zip';
if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload'))
return false; 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
// deplacer le fichier tmp_name dans le dossier tmp spip_unlink($tmp_dir);
deplacer_fichier_upload($file['tmp_name'], $tmp, true); @mkdir($tmp_dir);
include_spip('inc/pclzip'); include_spip('inc/charset');
$source = _DIR_TMP . basename($tmp_dir) . '.zip'; $tmp = $tmp_dir.'/'.translitteration($file['name']);
$archive = new PclZip($source);
$file['name'] .= '.'.$ext; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
$v_list = $archive->create($tmp,
PCLZIP_OPT_REMOVE_PATH, $tmp_dir, // deplacer le fichier tmp_name dans le dossier tmp
PCLZIP_OPT_ADD_PATH, ''); deplacer_fichier_upload($file['tmp_name'], $tmp, true);
effacer_repertoire_temporaire($tmp_dir); include_spip('inc/pclzip');
if (!$v_list) { $source = _DIR_TMP . basename($tmp_dir) . '.'.$ext;
spip_log("Echec creation du zip "); $archive = new PclZip($source);
return false;
$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;
} }
else
return false; return $row; // retourner le message d'erreur
} }
/** /**
...@@ -335,9 +353,6 @@ function verifier_taille_document_acceptable($infos){ ...@@ -335,9 +353,6 @@ function verifier_taille_document_acceptable($infos){
if (_DOC_MAX_SIZE > 0 if (_DOC_MAX_SIZE > 0
AND $infos['taille'] > _DOC_MAX_SIZE*1024) 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']))); 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 // si c'est une image
......
...@@ -47,7 +47,7 @@ function joindre_trouver_fichier_envoye(){ ...@@ -47,7 +47,7 @@ function joindre_trouver_fichier_envoye(){
if (!($test['error'] == 4)){ if (!($test['error'] == 4)){
if (is_string($err = joindre_upload_error($test['error']))) if (is_string($err = joindre_upload_error($test['error'])))
return $err; // un erreur upload 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'])); return _T('medias:erreur_upload_type_interdit',array('nom'=>$test['name']));
$files[]=$test; $files[]=$test;
} }
...@@ -58,7 +58,7 @@ function joindre_trouver_fichier_envoye(){ ...@@ -58,7 +58,7 @@ function joindre_trouver_fichier_envoye(){
if (!($file['error'] == 4)){ if (!($file['error'] == 4)){
if (is_string($err = joindre_upload_error($file['error']))) if (is_string($err = joindre_upload_error($file['error'])))
return $err; // un erreur upload 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'])); return _T('medias:erreur_upload_type_interdit',array('nom'=>$file['name']));
$files[]=$file; $files[]=$file;
} }
......
<?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
...@@ -17,8 +17,10 @@ function inc_verifier_document_mode_vignette_dist($infos){ ...@@ -17,8 +17,10 @@ function inc_verifier_document_mode_vignette_dist($infos){
if ($infos['inclus'] != 'image') if ($infos['inclus'] != 'image')
return _T('medias:erreur_format_fichier_image',array('nom'=> $infos['fichier'])); #SVG return _T('medias:erreur_format_fichier_image',array('nom'=> $infos['fichier'])); #SVG
if (!($infos['largeur'] OR $infos['hauteur'])) if (isset($infos['largeur']) AND isset($infos['hauteur'])){
return _T('medias:erreur_upload_vignette',array('nom'=>$infos['fichier'])); if (!($infos['largeur'] OR $infos['hauteur']))
return _T('medias:erreur_upload_vignette',array('nom'=>$infos['fichier']));
}
return true; return true;
} }
\ No newline at end of file
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