Fix: Data in memory must always be encoded in utf8. PHP files functions need ISO, so we convert data just before and after using them.

This commit is contained in:
Laurent Destailleur
2009-10-04 17:18:09 +00:00
parent e192abc755
commit f68be991ff
15 changed files with 502 additions and 450 deletions

View File

@@ -1094,7 +1094,7 @@ class Categorie
$filename = eregi_replace($dir,'',$file); // Nom du fichier $filename = eregi_replace($dir,'',$file); // Nom du fichier
// On efface l'image d'origine // On efface l'image d'origine
unlink($file); dol_delete_file($file,1);
// Si elle existe, on efface la vignette // Si elle existe, on efface la vignette
if (eregi('(\.jpg|\.bmp|\.gif|\.png|\.tiff)$',$filename,$regs)) if (eregi('(\.jpg|\.bmp|\.gif|\.png|\.tiff)$',$filename,$regs))
@@ -1102,7 +1102,7 @@ class Categorie
$photo_vignette=eregi_replace($regs[0],'',$filename).'_small'.$regs[0]; $photo_vignette=eregi_replace($regs[0],'',$filename).'_small'.$regs[0];
if (file_exists($dirthumb.$photo_vignette)) if (file_exists($dirthumb.$photo_vignette))
{ {
unlink($dirthumb.$photo_vignette); dol_delete_file($dirthumb.$photo_vignette,1);
} }
} }
} }

View File

@@ -454,23 +454,21 @@ if (eregi('\.\.',$original_file) || eregi('[<>|]',$original_file))
} }
if ($action == 'remove_file') // Remove a file
if ($action == 'remove_file')
{ {
/*
* Suppression fichier
*/
clearstatcache(); clearstatcache();
$filename = basename($original_file);
dol_syslog("document.php remove $original_file $filename $urlsource", LOG_DEBUG); dol_syslog("document.php remove $original_file $urlsource", LOG_DEBUG);
if (! file_exists($original_file)) // This test should be useless. We keep it to find bug more easily
$neworiginal_file=utf8_check($original_file)?utf8_decode($original_file):$original_file;
if (! file_exists($neworiginal_file))
{ {
dol_print_error(0,$langs->trans("ErrorFileDoesNotExists",$_GET["file"])); dol_print_error(0,$langs->trans("ErrorFileDoesNotExists",$_GET["file"]));
exit; exit;
} }
unlink($original_file);
dol_delete_file($original_file);
dol_syslog("document.php back to ".urldecode($urlsource), LOG_DEBUG); dol_syslog("document.php back to ".urldecode($urlsource), LOG_DEBUG);
@@ -478,23 +476,23 @@ if ($action == 'remove_file')
return; return;
} }
else else // Open and return file
{ {
/*
* Open and return file
*/
clearstatcache(); clearstatcache();
$filename = basename($original_file); $filename = basename($original_file);
// Output file on browser
dol_syslog("document.php download $original_file $filename content-type=$type"); dol_syslog("document.php download $original_file $filename content-type=$type");
$neworiginal_file=utf8_check($original_file)?utf8_decode($original_file):$original_file;
if (! file_exists($original_file)) // This test if file exists should be useless. We keep it to find bug more easily
if (! file_exists($neworiginal_file))
{ {
dol_print_error(0,$langs->trans("ErrorFileDoesNotExists",$original_file)); dol_print_error(0,$langs->trans("ErrorFileDoesNotExists",$original_file));
exit; exit;
} }
// Les drois sont ok et fichier trouve, on l'envoie // Les drois sont ok et fichier trouve, on l'envoie
if ($encoding) header('Content-Encoding: '.$encoding); if ($encoding) header('Content-Encoding: '.$encoding);
@@ -506,7 +504,7 @@ else
header('Cache-Control: Public, must-revalidate'); header('Cache-Control: Public, must-revalidate');
header('Pragma: public'); header('Pragma: public');
readfile($original_file); readfile($neworiginal_file); // Need a path in ISO
} }
?> ?>

View File

@@ -376,7 +376,7 @@ class FormFile
print '</a>'; print '</a>';
if (!$iconPDF) print '</td>'; if (!$iconPDF) print '</td>';
// Affiche taille fichier // Affiche taille fichier
if (!$iconPDF) print '<td align="right">'.dol_filesize($filedir."/".$file["name"]).'</td>'; if (!$iconPDF) print '<td align="right">'.dol_print_size(filesize($filedir."/".$file["name"])).'</td>';
// Affiche date fichier // Affiche date fichier
if (!$iconPDF) print '<td align="right">'.dol_print_date(filemtime($filedir."/".$file["name"]),'dayhour').'</td>'; if (!$iconPDF) print '<td align="right">'.dol_print_date(filemtime($filedir."/".$file["name"]),'dayhour').'</td>';
@@ -490,16 +490,4 @@ class FormFile
} }
/**
* Return size of a file with units
*
* @param $pathoffile
* @return string File size with units translated
*/
function dol_filesize($pathoffile)
{
global $langs;
return filesize($pathoffile). ' '.$langs->trans("Bytes");
}
?> ?>

View File

@@ -535,10 +535,10 @@ if ($step == 3 && $datatoimport)
print '<input type="hidden" value="'.$datatoimport.'" name="datatoimport">'; print '<input type="hidden" value="'.$datatoimport.'" name="datatoimport">';
print "</tr>\n"; print "</tr>\n";
$dir = $conf->import->dir_temp;
// Search available imports // Search available imports
$handle=@opendir($dir); $dir = $conf->import->dir_temp;
$newdir=utf8_check($dir)?utf8_decode($dir):$dir; // opendir need ISO
$handle=@opendir($newdir);
if ($handle) if ($handle)
{ {
//print '<tr><td colspan="4">'; //print '<tr><td colspan="4">';
@@ -548,6 +548,9 @@ if ($step == 3 && $datatoimport)
$i=0; $i=0;
while (($file = readdir($handle))!==false) while (($file = readdir($handle))!==false)
{ {
// readdir return value in ISO and we want UTF8 in memory
if (! utf8_check($file)) $file=utf8_encode($file);
if (eregi('^\.',$file)) continue; if (eregi('^\.',$file)) continue;
$modulepart='import'; $modulepart='import';
@@ -558,9 +561,9 @@ if ($step == 3 && $datatoimport)
print '<td width="16">'.img_mime($file).'</td>'; print '<td width="16">'.img_mime($file).'</td>';
print '<td>'.$file.'</td>'; print '<td>'.$file.'</td>';
// Affiche taille fichier // Affiche taille fichier
print '<td align="right">'.dol_filesize($dir.'/'.$file).'</td>'; print '<td align="right">'.dol_print_size(filesize($newdir.'/'.$newfile)).'</td>';
// Affiche date fichier // Affiche date fichier
print '<td align="right">'.dol_print_date(filemtime($dir.'/'.$file),'dayhour').'</td>'; print '<td align="right">'.dol_print_date(filemtime($newdir.'/'.$newfile),'dayhour').'</td>';
// Del button // Del button
print '<td align="right"><a href="'.DOL_URL_ROOT.'/document.php?action=remove_file&step=3&format='.$format.'&modulepart='.$modulepart.'&file='.urlencode($relativepath); print '<td align="right"><a href="'.DOL_URL_ROOT.'/document.php?action=remove_file&step=3&format='.$format.'&modulepart='.$modulepart.'&file='.urlencode($relativepath);
print '&amp;urlsource='.urlencode($urlsource); print '&amp;urlsource='.urlencode($urlsource);

View File

@@ -24,8 +24,8 @@
/** /**
\file htdocs/includes/modules/commande/modules_commande.php \file htdocs/includes/modules/commande/modules_commande.php
\ingroup commande \ingroup commande
\brief Fichier contenant la classe m<>re de generation des commandes en PDF \brief Fichier contenant la classe m<>re de generation des commandes en PDF
et la classe m<>re de num<75>rotation des commandes et la classe m<>re de num<75>rotation des commandes
\version $Id$ \version $Id$
*/ */
@@ -37,14 +37,14 @@ require_once(DOL_DOCUMENT_ROOT.'/discount.class.php');
/** /**
\class ModelePDFCommandes \class ModelePDFCommandes
\brief Classe m<>re des mod<6F>les de commandes \brief Classe m<>re des mod<6F>les de commandes
*/ */
class ModelePDFCommandes extends FPDF class ModelePDFCommandes extends FPDF
{ {
var $error=''; var $error='';
/** /**
* \brief Renvoi le dernier message d'erreur de cr<63>ation de PDF de commande * \brief Renvoi le dernier message d'erreur de cr<63>ation de PDF de commande
*/ */
function pdferror() function pdferror()
{ {
@@ -52,7 +52,7 @@ class ModelePDFCommandes extends FPDF
} }
/** /**
* \brief Renvoi la liste des mod<6F>les actifs * \brief Renvoi la liste des mod<6F>les actifs
* \return array Tableau des modeles (cle=id, valeur=libelle) * \return array Tableau des modeles (cle=id, valeur=libelle)
*/ */
function liste_modeles($db) function liste_modeles($db)
@@ -92,7 +92,7 @@ class ModelePDFCommandes extends FPDF
/** /**
\class ModeleNumRefCommandes \class ModeleNumRefCommandes
\brief Classe m<>re des mod<6F>les de num<75>rotation des r<>f<EFBFBD>rences de commandes \brief Classe m<>re des mod<6F>les de num<75>rotation des r<>f<EFBFBD>rences de commandes
*/ */
class ModeleNumRefCommandes class ModeleNumRefCommandes
@@ -107,7 +107,7 @@ class ModeleNumRefCommandes
return true; return true;
} }
/** \brief Renvoi la description par defaut du modele de num<75>rotation /** \brief Renvoi la description par defaut du modele de num<75>rotation
* \return string Texte descripif * \return string Texte descripif
*/ */
function info() function info()
@@ -117,7 +117,7 @@ class ModeleNumRefCommandes
return $langs->trans("NoDescription"); return $langs->trans("NoDescription");
} }
/** \brief Renvoi un exemple de num<75>rotation /** \brief Renvoi un exemple de num<75>rotation
* \return string Example * \return string Example
*/ */
function getExample() function getExample()
@@ -127,8 +127,8 @@ class ModeleNumRefCommandes
return $langs->trans("NoExample"); return $langs->trans("NoExample");
} }
/** \brief Test si les num<75>ros d<>j<EFBFBD> en vigueur dans la base ne provoquent pas de /** \brief Test si les num<75>ros d<>j<EFBFBD> en vigueur dans la base ne provoquent pas de
* de conflits qui empechera cette num<75>rotation de fonctionner. * de conflits qui empechera cette num<75>rotation de fonctionner.
* \return boolean false si conflit, true si ok * \return boolean false si conflit, true si ok
*/ */
function canBeActivated() function canBeActivated()
@@ -136,7 +136,7 @@ class ModeleNumRefCommandes
return true; return true;
} }
/** \brief Renvoi prochaine valeur attribu<62>e /** \brief Renvoi prochaine valeur attribu<62>e
* \return string Valeur * \return string Valeur
*/ */
function getNextValue() function getNextValue()
@@ -162,10 +162,10 @@ class ModeleNumRefCommandes
/* /*
\brief Cr<43>e un bon de commande sur disque en fonction d'un mod<6F>le \brief Cr<43>e un bon de commande sur disque en fonction d'un mod<6F>le
\param db objet base de donn<6E>e \param db objet base de donn<6E>e
\param id id de la propale <20> cr<63>er \param id id de la propale <20> cr<63>er
\param modele force le modele <20> utiliser ('' to not force) \param modele force le modele <20> utiliser ('' to not force)
\param outputlangs objet lang a utiliser pour traduction \param outputlangs objet lang a utiliser pour traduction
*/ */
function commande_pdf_create($db, $id, $modele, $outputlangs) function commande_pdf_create($db, $id, $modele, $outputlangs)
@@ -177,7 +177,7 @@ function commande_pdf_create($db, $id, $modele, $outputlangs)
$modelisok=0; $modelisok=0;
$liste=array(); $liste=array();
// Positionne modele sur le nom du modele de commande <20> utiliser // Positionne modele sur le nom du modele de commande <20> utiliser
$file = "pdf_".$modele.".modules.php"; $file = "pdf_".$modele.".modules.php";
if ($modele && file_exists($dir.$file)) $modelisok=1; if ($modele && file_exists($dir.$file)) $modelisok=1;
@@ -194,7 +194,7 @@ function commande_pdf_create($db, $id, $modele, $outputlangs)
{ {
$model=new ModelePDFCommandes(); $model=new ModelePDFCommandes();
$liste=$model->liste_modeles($db); $liste=$model->liste_modeles($db);
$modele=key($liste); // Renvoie premiere valeur de cl<63> trouv<75> dans le tableau $modele=key($liste); // Renvoie premiere valeur de cl<63> trouv<75> dans le tableau
$file = "pdf_".$modele.".modules.php"; $file = "pdf_".$modele.".modules.php";
if (file_exists($dir.$file)) $modelisok=1; if (file_exists($dir.$file)) $modelisok=1;
} }
@@ -240,10 +240,10 @@ function commande_pdf_create($db, $id, $modele, $outputlangs)
} }
/** /**
\brief Supprime l'image de pr<70>visualitation, pour le cas de r<>g<EFBFBD>n<EFBFBD>ration de commande \brief Supprime l'image de pr<70>visualitation, pour le cas de r<>g<EFBFBD>n<EFBFBD>ration de commande
\param db objet base de donn<6E>e \param db objet base de donn<6E>e
\param commandeid id de la commande <20> effacer \param commandeid id de la commande <20> effacer
\param commanderef r<>f<EFBFBD>rence de la commande si besoin \param commanderef r<>f<EFBFBD>rence de la commande si besoin
*/ */
function commande_delete_preview($db, $commandeid, $commanderef='') function commande_delete_preview($db, $commandeid, $commanderef='')
{ {
@@ -265,7 +265,7 @@ function commande_delete_preview($db, $commandeid, $commanderef='')
if ( file_exists( $file ) && is_writable( $file ) ) if ( file_exists( $file ) && is_writable( $file ) )
{ {
if ( ! unlink($file) ) if ( ! dol_delete_file($file,1) )
{ {
$this->error=$langs->trans("ErrorFailedToOpenFile",$file); $this->error=$langs->trans("ErrorFailedToOpenFile",$file);
return 0; return 0;
@@ -279,7 +279,7 @@ function commande_delete_preview($db, $commandeid, $commanderef='')
if ( file_exists( $preview ) && is_writable( $preview ) ) if ( file_exists( $preview ) && is_writable( $preview ) )
{ {
if ( ! unlink($preview) ) if ( ! dol_delete_file($preview,1) )
{ {
$this->error=$langs->trans("ErrorFailedToOpenFile",$preview); $this->error=$langs->trans("ErrorFailedToOpenFile",$preview);
return 0; return 0;
@@ -288,5 +288,7 @@ function commande_delete_preview($db, $commandeid, $commanderef='')
} }
} }
} }
return 1;
} }
?> ?>

View File

@@ -287,9 +287,9 @@ ITEM_" . $i . "_DESCRIPTION=\"" . str_replace("\r\n","",nl2br($fac->lignes[$i]->
/** /**
\brief Supprime l'image de previsualitation, pour le cas de regeneration de facture * \brief Supprime l'image de previsualitation, pour le cas de regeneration de facture
\param db objet base de donnee * \param db objet base de donnee
\param facid id de la facture a creer * \param facid id de la facture a creer
*/ */
function facture_delete_preview($db, $facid) function facture_delete_preview($db, $facid)
{ {
@@ -306,12 +306,14 @@ function facture_delete_preview($db, $facid)
if ( file_exists( $file ) && is_writable( $file ) ) if ( file_exists( $file ) && is_writable( $file ) )
{ {
if ( ! unlink($file) ) if ( ! dol_delete_file($file,1) )
{ {
return 0; return 0;
} }
} }
} }
return 1;
} }
?> ?>

View File

@@ -22,8 +22,8 @@
/** /**
\file htdocs/includes/modules/fichinter/modules_fichinter.php \file htdocs/includes/modules/fichinter/modules_fichinter.php
\ingroup ficheinter \ingroup ficheinter
\brief Fichier contenant la classe m<>re de generation des fiches interventions en PDF \brief Fichier contenant la classe m<>re de generation des fiches interventions en PDF
et la classe m<>re de num<75>rotation des fiches interventions et la classe m<>re de num<75>rotation des fiches interventions
\version $Id$ \version $Id$
*/ */
@@ -33,7 +33,7 @@ require_once(DOL_DOCUMENT_ROOT.'/includes/fpdf/fpdfi/fpdi_protection.php');
/** /**
\class ModelePDFFicheinter \class ModelePDFFicheinter
\brief Classe m<>re des mod<6F>les de fiche intervention \brief Classe m<>re des mod<6F>les de fiche intervention
*/ */
class ModelePDFFicheinter extends FPDF class ModelePDFFicheinter extends FPDF
{ {
@@ -48,7 +48,7 @@ class ModelePDFFicheinter extends FPDF
} }
/** /**
\brief Renvoi le dernier message d'erreur de cr<63>ation de fiche intervention \brief Renvoi le dernier message d'erreur de cr<63>ation de fiche intervention
*/ */
function pdferror() function pdferror()
{ {
@@ -56,7 +56,7 @@ class ModelePDFFicheinter extends FPDF
} }
/** /**
* \brief Renvoi la liste des mod<6F>les actifs * \brief Renvoi la liste des mod<6F>les actifs
*/ */
function liste_modeles($db) function liste_modeles($db)
{ {
@@ -93,7 +93,7 @@ class ModelePDFFicheinter extends FPDF
/** /**
\class ModeleNumRefFicheinter \class ModeleNumRefFicheinter
\brief Classe m<>re des mod<6F>les de num<75>rotation des r<>f<EFBFBD>rences de fiches d'intervention \brief Classe m<>re des mod<6F>les de num<75>rotation des r<>f<EFBFBD>rences de fiches d'intervention
*/ */
class ModeleNumRefFicheinter class ModeleNumRefFicheinter
@@ -108,7 +108,7 @@ class ModeleNumRefFicheinter
return true; return true;
} }
/** \brief Renvoi la description par defaut du modele de num<75>rotation /** \brief Renvoi la description par defaut du modele de num<75>rotation
* \return string Texte descripif * \return string Texte descripif
*/ */
function info() function info()
@@ -118,7 +118,7 @@ class ModeleNumRefFicheinter
return $langs->trans("NoDescription"); return $langs->trans("NoDescription");
} }
/** \brief Renvoi un exemple de num<75>rotation /** \brief Renvoi un exemple de num<75>rotation
* \return string Example * \return string Example
*/ */
function getExample() function getExample()
@@ -128,8 +128,8 @@ class ModeleNumRefFicheinter
return $langs->trans("NoExample"); return $langs->trans("NoExample");
} }
/** \brief Test si les num<75>ros d<>j<EFBFBD> en vigueur dans la base ne provoquent pas de /** \brief Test si les num<75>ros d<>j<EFBFBD> en vigueur dans la base ne provoquent pas de
* de conflits qui empechera cette num<75>rotation de fonctionner. * de conflits qui empechera cette num<75>rotation de fonctionner.
* \return boolean false si conflit, true si ok * \return boolean false si conflit, true si ok
*/ */
function canBeActivated() function canBeActivated()
@@ -137,7 +137,7 @@ class ModeleNumRefFicheinter
return true; return true;
} }
/** \brief Renvoi prochaine valeur attribu<62>e /** \brief Renvoi prochaine valeur attribu<62>e
* \return string Valeur * \return string Valeur
*/ */
function getNextValue() function getNextValue()
@@ -163,10 +163,10 @@ class ModeleNumRefFicheinter
/** /**
\brief Cr<43>e une fiche intervention sur disque en fonction du mod<6F>le de FICHEINTER_ADDON_PDF \brief Cr<43>e une fiche intervention sur disque en fonction du mod<6F>le de FICHEINTER_ADDON_PDF
\param db objet base de donn<6E>e \param db objet base de donn<6E>e
\param object Object fichinter \param object Object fichinter
\param modele force le modele <20> utiliser ('' par defaut) \param modele force le modele <20> utiliser ('' par defaut)
\param outputlangs objet lang a utiliser pour traduction \param outputlangs objet lang a utiliser pour traduction
\return int 0 si KO, 1 si OK \return int 0 si KO, 1 si OK
*/ */
@@ -177,7 +177,7 @@ function fichinter_create($db, $object, $modele='', $outputlangs='')
$dir = DOL_DOCUMENT_ROOT."/includes/modules/fichinter/"; $dir = DOL_DOCUMENT_ROOT."/includes/modules/fichinter/";
// Positionne modele sur le nom du modele de facture <20> utiliser // Positionne modele sur le nom du modele de facture <20> utiliser
if (! strlen($modele)) if (! strlen($modele))
{ {
if ($conf->global->FICHEINTER_ADDON_PDF) if ($conf->global->FICHEINTER_ADDON_PDF)
@@ -226,10 +226,10 @@ function fichinter_create($db, $object, $modele='', $outputlangs='')
} }
/** /**
\brief Supprime l'image de pr<70>visualitation, pour le cas de r<>g<EFBFBD>n<EFBFBD>ration de propal \brief Supprime l'image de pr<70>visualitation, pour le cas de r<>g<EFBFBD>n<EFBFBD>ration de propal
\param db objet base de donn<6E>e \param db objet base de donn<6E>e
\param propalid id de la propal <20> effacer \param propalid id de la propal <20> effacer
\param propalref r<>f<EFBFBD>rence de la propal si besoin \param propalref r<>f<EFBFBD>rence de la propal si besoin
*/ */
function fichinter_delete_preview($db, $fichinterid, $fichinterref='') function fichinter_delete_preview($db, $fichinterid, $fichinterref='')
{ {
@@ -251,7 +251,7 @@ function fichinter_delete_preview($db, $fichinterid, $fichinterref='')
if ( file_exists( $file ) && is_writable( $file ) ) if ( file_exists( $file ) && is_writable( $file ) )
{ {
if ( ! unlink($file) ) if ( ! dol_delete_file($file,1) )
{ {
$this->error=$langs->trans("ErrorFailedToOpenFile",$file); $this->error=$langs->trans("ErrorFailedToOpenFile",$file);
return 0; return 0;
@@ -264,7 +264,7 @@ function fichinter_delete_preview($db, $fichinterid, $fichinterref='')
$preview = $multiple.$i; $preview = $multiple.$i;
if ( file_exists( $preview ) && is_writable( $preview ) ) if ( file_exists( $preview ) && is_writable( $preview ) )
{ {
if ( ! unlink($preview) ) if ( ! dol_delete_file($preview,1) )
{ {
$this->error=$langs->trans("ErrorFailedToOpenFile",$preview); $this->error=$langs->trans("ErrorFailedToOpenFile",$preview);
return 0; return 0;
@@ -273,6 +273,8 @@ function fichinter_delete_preview($db, $fichinterid, $fichinterref='')
} }
} }
} }
return 1;
} }
?> ?>

View File

@@ -161,9 +161,9 @@ class ModeleNumRefDeliveryOrder
/** /**
* \brief Create object on disk * \brief Create object on disk
* \param db objet base de donn<6E>e * \param db objet base de donn<6E>e
* \param deliveryid id object * \param deliveryid id object
* \param modele force le modele <20> utiliser ('' to not force) * \param modele force le modele <20> utiliser ('' to not force)
* \param outputlangs objet lang a utiliser pour traduction * \param outputlangs objet lang a utiliser pour traduction
* \return int 0 si KO, 1 si OK * \return int 0 si KO, 1 si OK
*/ */
@@ -240,12 +240,14 @@ function delivery_order_delete_preview($db, $deliveryid)
if ( file_exists( $file ) && is_writable( $file ) ) if ( file_exists( $file ) && is_writable( $file ) )
{ {
if ( ! unlink($file) ) if ( ! dol_delete_file($file,1) )
{ {
$this->error=$langs->trans("ErrorFailedToOpenFile",$file); $this->error=$langs->trans("ErrorFailedToOpenFile",$file);
return 0; return 0;
} }
} }
} }
return 1;
} }
?> ?>

View File

@@ -22,8 +22,8 @@
/** /**
\file htdocs/includes/modules/propale/modules_propale.php \file htdocs/includes/modules/propale/modules_propale.php
\ingroup propale \ingroup propale
\brief Fichier contenant la classe m<>re de generation des propales en PDF \brief Fichier contenant la classe m<>re de generation des propales en PDF
et la classe m<>re de num<75>rotation des propales et la classe m<>re de num<75>rotation des propales
\version $Id$ \version $Id$
*/ */
@@ -161,8 +161,8 @@ class ModeleNumRefPropales
/** /**
\brief Cree une propale sur disque en fonction du modele de PROPALE_ADDON_PDF \brief Cree une propale sur disque en fonction du modele de PROPALE_ADDON_PDF
\param db objet base de donnee \param db objet base de donnee
\param id id de la propale <20> creer \param id id de la propale <20> creer
\param modele force le modele <20> utiliser ('' to not force) \param modele force le modele <20> utiliser ('' to not force)
\param outputlangs objet lang a utiliser pour traduction \param outputlangs objet lang a utiliser pour traduction
\return int 0 si KO, 1 si OK \return int 0 si KO, 1 si OK
*/ */
@@ -240,7 +240,7 @@ function propale_pdf_create($db, $id, $modele, $outputlangs)
/** /**
\brief Supprime l'image de previsualitation, pour le cas de regeneration de propal \brief Supprime l'image de previsualitation, pour le cas de regeneration de propal
\param db objet base de donn<6E>e \param db objet base de donn<6E>e
\param propalid id de la propal a effacer \param propalid id de la propal a effacer
\param propalref reference de la propal si besoin \param propalref reference de la propal si besoin
*/ */
@@ -264,7 +264,7 @@ function propale_delete_preview($db, $propalid, $propalref='')
if ( file_exists( $file ) && is_writable( $file ) ) if ( file_exists( $file ) && is_writable( $file ) )
{ {
if ( ! unlink($file) ) if ( ! dol_delete_file($file,1) )
{ {
$this->error=$langs->trans("ErrorFailedToOpenFile",$file); $this->error=$langs->trans("ErrorFailedToOpenFile",$file);
return 0; return 0;
@@ -287,5 +287,7 @@ function propale_delete_preview($db, $propalid, $propalref='')
} }
} }
} }
return 1;
} }
?> ?>

View File

@@ -238,12 +238,14 @@ function supplier_order_delete_preview($db, $propalid)
if ( file_exists( $file ) && is_writable( $file ) ) if ( file_exists( $file ) && is_writable( $file ) )
{ {
if ( ! unlink($file) ) if ( ! dol_delete_file($file) )
{ {
$this->error=$langs->trans("ErrorFailedToOpenFile",$file); $this->error=$langs->trans("ErrorFailedToOpenFile",$file);
return 0; return 0;
} }
} }
} }
return 1;
} }
?> ?>

View File

@@ -196,7 +196,7 @@ function dol_mimetype($file)
*/ */
function dol_dir_is_emtpy($folder) function dol_dir_is_emtpy($folder)
{ {
$newfolder=utf8_check($folder)?utf8_decode($folder):$folder; // The opendir need ISO strings $newfolder=utf8_check($folder)?utf8_decode($folder):$folder; // The is_dir and opendir need ISO strings
if (is_dir($newfolder)) if (is_dir($newfolder))
{ {
$handle = opendir($newfolder); $handle = opendir($newfolder);
@@ -244,4 +244,41 @@ function dol_count_nb_of_line($file)
return $nb; return $nb;
} }
/**
* Return size of a file
*
* @param $pathoffile
* @return string File size
*/
function dol_filesize($pathoffile)
{
$newpathoffile=check_utf8($pathoffile)?utf8_decode($pathoffile):$pathoffile;
return filesize($pathoffile);
}
/**
* Return time of a file
*
* @param $pathoffile
* @return timestamp Time of file
*/
function dol_filetime($pathoffile)
{
$newpathoffile=check_utf8($pathoffile)?utf8_decode($pathoffile):$pathoffile;
return filemtime($nrwpathoffile);
}
/**
* Return if path is a file
*
* @param $pathoffile
* @return boolean True or false
*/
function dol_is_file($pathoffile)
{
$newpathoffile=utf8_check($pathoffile)?utf8_decode($pathoffile):$pathoffile;
return is_file($newpathoffile);
}
?> ?>

View File

@@ -2124,20 +2124,30 @@ function print_fleche_navigation($page,$file,$options='',$nextpage,$betweenarrow
/** /**
* \brief Remove a file * \brief Remove a file or several files with a mask
* \param file Fichier a effacer ou masque de fichier a effacer * \param file File to delete or mask of file to delete
* \param boolean true if file deleted, false if error * \param disableglob Disable usage of globa like *
* \param boolean True if file deleted, False if error
*/ */
function dol_delete_file($file) function dol_delete_file($file,$disableglob=0)
{ {
$ok=true; $ok=true;
$newfile=utf8_check($file)?utf8_decode($file):$file; // glob function accepts only ISO string $newfile=utf8_check($file)?utf8_decode($file):$file; // glob function accepts only ISO string
if (empty($disableglob))
{
foreach (glob($newfile) as $filename) foreach (glob($newfile) as $filename)
{ {
$ok=unlink($filename); $ok=unlink($filename); // The unlink encapsulated by dolibarr
if ($ok) dol_syslog("Removed file ".$filename,LOG_DEBUG); if ($ok) dol_syslog("Removed file ".$filename,LOG_DEBUG);
else dol_syslog("Failed to remove file ".$filename,LOG_ERR); else dol_syslog("Failed to remove file ".$filename,LOG_ERR);
} }
}
else
{
$ok=unlink($newfile); // The unlink encapsulated by dolibarr
if ($ok) dol_syslog("Removed file ".$newfile,LOG_DEBUG);
else dol_syslog("Failed to remove file ".$newfile,LOG_ERR);
}
return $ok; return $ok;
} }
@@ -3006,5 +3016,4 @@ function utf8_check($Str)
return true; return true;
} }
?> ?>

View File

@@ -2487,33 +2487,38 @@ class Product extends CommonObject
*/ */
function liste_photos($dir,$nbmax=0) function liste_photos($dir,$nbmax=0)
{ {
include_once(DOL_DOCUMENT_ROOT.'/lib/files.lib.php');
$nbphoto=0; $nbphoto=0;
$tabobj=array(); $tabobj=array();
$dirthumb = $dir.'thumbs/'; $newdir=utf8_check($dir)?utf8_decode($dir):$dir;
if (file_exists($dir)) $handle=@opendir($newdir);
if ($handle)
{ {
$handle=opendir($dir);
while (($file = readdir($handle)) != false) while (($file = readdir($handle)) != false)
{ {
if (is_file($dir.$file)) if (! utf8_check($file)) $file=utf8_encode($file); // readdir returns ISO
if (dol_is_file($dir.$file))
{ {
$nbphoto++; $nbphoto++;
$photo = $file;
// On determine nom du fichier vignette // On determine nom du fichier vignette
$photo=$file;
$photo_vignette=''; $photo_vignette='';
if (eregi('(\.jpg|\.bmp|\.gif|\.png|\.tiff)$',$photo,$regs)) if (eregi('(\.jpg|\.bmp|\.gif|\.png|\.tiff)$',$photo,$regs))
{ {
$photo_vignette=eregi_replace($regs[0],'',$photo).'_small'.$regs[0]; $photo_vignette=eregi_replace($regs[0],'',$photo).'_small'.$regs[0];
} }
$dirthumb = $dir.'thumbs/';
// Objet // Objet
$obj=array(); $obj=array();
$obj['photo']=$photo; $obj['photo']=$photo;
if ($photo_vignette && is_file($dirthumb.$photo_vignette)) $obj['photo_vignette']=$photo_vignette; if ($photo_vignette && dol_is_file($dirthumb.$photo_vignette)) $obj['photo_vignette']=$photo_vignette;
else $obj['photo_vignette']=""; else $obj['photo_vignette']="";
$tabobj[$nbphoto-1]=$obj; $tabobj[$nbphoto-1]=$obj;
@@ -2540,7 +2545,7 @@ class Product extends CommonObject
$filename = eregi_replace($dir,'',$file); // Nom du fichier $filename = eregi_replace($dir,'',$file); // Nom du fichier
// On efface l'image d'origine // On efface l'image d'origine
unlink($file); dol_delete_file($file);
// Si elle existe, on efface la vignette // Si elle existe, on efface la vignette
if (eregi('(\.jpg|\.bmp|\.gif|\.png|\.tiff)$',$filename,$regs)) if (eregi('(\.jpg|\.bmp|\.gif|\.png|\.tiff)$',$filename,$regs))
@@ -2548,7 +2553,7 @@ class Product extends CommonObject
$photo_vignette=eregi_replace($regs[0],'',$filename).'_small'.$regs[0]; $photo_vignette=eregi_replace($regs[0],'',$filename).'_small'.$regs[0];
if (file_exists($dirthumb.$photo_vignette)) if (file_exists($dirthumb.$photo_vignette))
{ {
unlink($dirthumb.$photo_vignette); dol_delete_file($dirthumb.$photo_vignette);
} }
} }
} }
@@ -2559,7 +2564,8 @@ class Product extends CommonObject
*/ */
function get_image_size($file) function get_image_size($file)
{ {
$infoImg = getimagesize($file); // Get information on image $newfile=utf8_check($file)?utf8_decode($file):$file;
$infoImg = getimagesize($newfile); // Get information on image
$this->imgWidth = $infoImg[0]; // Largeur de l'image $this->imgWidth = $infoImg[0]; // Largeur de l'image
$this->imgHeight = $infoImg[1]; // Hauteur de l'image $this->imgHeight = $infoImg[1]; // Hauteur de l'image
} }

View File

@@ -1,6 +1,6 @@
<?php <?php
/* Copyright (C) 2001-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org> /* Copyright (C) 2001-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2008 Laurent Destailleur <eldy@users.sourceforge.net> * Copyright (C) 2004-2009 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005 Eric Seigne <eric.seigne@ryxeo.com> * Copyright (C) 2005 Eric Seigne <eric.seigne@ryxeo.com>
* Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr> * Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr>
* *
@@ -171,7 +171,7 @@ if ($_GET["id"] || $_GET["ref"])
print "\n</div>\n"; print "\n</div>\n";
/* /*
* Ajouter une photo * Add a photo
*/ */
if ($_GET["action"] == 'ajout_photo' && ($user->rights->produit->creer || $user->rights->service->creer) && ! empty($conf->global->MAIN_UPLOAD_DOC)) if ($_GET["action"] == 'ajout_photo' && ($user->rights->produit->creer || $user->rights->service->creer) && ! empty($conf->global->MAIN_UPLOAD_DOC))
{ {
@@ -204,7 +204,7 @@ if ($_GET["id"] || $_GET["ref"])
if ($nbbyrow && ($nbphoto % $nbbyrow == 1)) print '<tr align=center valign=middle border=1>'; if ($nbbyrow && ($nbphoto % $nbbyrow == 1)) print '<tr align=center valign=middle border=1>';
if ($nbbyrow) print '<td width="'.ceil(100/$nbbyrow).'%" class="photo">'; if ($nbbyrow) print '<td width="'.ceil(100/$nbbyrow).'%" class="photo">';
print '<a href="'.DOL_URL_ROOT.'/viewimage.php?modulepart=product&file='.urlencode($pdir.$obj['photo']).'" alt="Taille origine" target="_blank">'; print '<a href="'.DOL_URL_ROOT.'/viewimage.php?modulepart=product&file='.urlencode($pdir.$obj['photo']).'" alt="'.dol_escape_htmltag($langs->trans("OriginalSize")).'" target="_blank">';
// Si fichier vignette disponible, on l'utilise, sinon on utilise photo origine // Si fichier vignette disponible, on l'utilise, sinon on utilise photo origine
if ($obj['photo_vignette']) if ($obj['photo_vignette'])

View File

@@ -376,17 +376,16 @@ if ($modulepart == 'barcode')
$result=$module->buildBarCode($code,$encoding,$readable); $result=$module->buildBarCode($code,$encoding,$readable);
} }
} }
else else // Open and return file
{ {
// Ouvre et renvoi fichier
clearstatcache(); clearstatcache();
// Output files on disk // Output files on browser
$filename = basename($original_file); dol_syslog("viewimage.php return file $original_file content-type=$type");
$neworiginal_file=utf8_check($original_file)?utf8_decode($original_file):$original_file;
dol_syslog("viewimage.php return file $original_file $filename content-type=$type"); // This test if file exists should be useless. We keep it to find bug more easily
if (! file_exists($neworiginal_file))
if (! file_exists($original_file))
{ {
$langs->load("main"); $langs->load("main");
dol_print_error(0,$langs->trans("ErrorFileDoesNotExists",$_GET["file"])); dol_print_error(0,$langs->trans("ErrorFileDoesNotExists",$_GET["file"]));
@@ -403,7 +402,7 @@ else
header('Content-type: image/png'); header('Content-type: image/png');
} }
readfile($original_file); readfile($neworiginal_file); // Need a path in ISO
} }
?> ?>