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,10 +24,10 @@
/** /**
\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<EFBFBD>re de generation des commandes en PDF
et la classe mère de numérotation des commandes et la classe m<EFBFBD>re de num<EFBFBD>rotation des commandes
\version $Id$ \version $Id$
*/ */
require_once(DOL_DOCUMENT_ROOT.'/lib/pdf.lib.php'); require_once(DOL_DOCUMENT_ROOT.'/lib/pdf.lib.php');
require_once(DOL_DOCUMENT_ROOT.'/includes/fpdf/fpdfi/fpdi_protection.php'); require_once(DOL_DOCUMENT_ROOT.'/includes/fpdf/fpdfi/fpdi_protection.php');
@ -37,14 +37,14 @@ require_once(DOL_DOCUMENT_ROOT.'/discount.class.php');
/** /**
\class ModelePDFCommandes \class ModelePDFCommandes
\brief Classe mère des modèles de commandes \brief Classe m<EFBFBD>re des mod<EFBFBD>les de commandes
*/ */
class ModelePDFCommandes extends FPDF class ModelePDFCommandes extends FPDF
{ {
var $error=''; var $error='';
/** /**
* \brief Renvoi le dernier message d'erreur de création de PDF de commande * \brief Renvoi le dernier message d'erreur de cr<EFBFBD>ation de PDF de commande
*/ */
function pdferror() function pdferror()
{ {
@ -52,7 +52,7 @@ class ModelePDFCommandes extends FPDF
} }
/** /**
* \brief Renvoi la liste des modèles actifs * \brief Renvoi la liste des mod<EFBFBD>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,8 +92,8 @@ class ModelePDFCommandes extends FPDF
/** /**
\class ModeleNumRefCommandes \class ModeleNumRefCommandes
\brief Classe mère des modèles de numérotation des références de commandes \brief Classe m<EFBFBD>re des mod<EFBFBD>les de num<EFBFBD>rotation des r<EFBFBD>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érotation /** \brief Renvoi la description par defaut du modele de num<EFBFBD>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érotation /** \brief Renvoi un exemple de num<EFBFBD>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éros déjà en vigueur dans la base ne provoquent pas de /** \brief Test si les num<EFBFBD>ros d<EFBFBD>j<EFBFBD> en vigueur dans la base ne provoquent pas de
* de conflits qui empechera cette numérotation de fonctionner. * de conflits qui empechera cette num<EFBFBD>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ée /** \brief Renvoi prochaine valeur attribu<EFBFBD>e
* \return string Valeur * \return string Valeur
*/ */
function getNextValue() function getNextValue()
@ -162,12 +162,12 @@ class ModeleNumRefCommandes
/* /*
\brief Crée un bon de commande sur disque en fonction d'un modèle \brief Cr<EFBFBD>e un bon de commande sur disque en fonction d'un mod<EFBFBD>le
\param db objet base de donnée \param db objet base de donn<EFBFBD>e
\param id id de la propale à créer \param id id de la propale <EFBFBD> cr<EFBFBD>er
\param modele force le modele à utiliser ('' to not force) \param modele force le modele <EFBFBD> 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)
{ {
global $conf,$langs; global $conf,$langs;
@ -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 à utiliser // Positionne modele sur le nom du modele de commande <EFBFBD> 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é trouvé dans le tableau $modele=key($liste); // Renvoie premiere valeur de cl<EFBFBD> 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,11 +240,11 @@ function commande_pdf_create($db, $id, $modele, $outputlangs)
} }
/** /**
\brief Supprime l'image de prévisualitation, pour le cas de régénération de commande \brief Supprime l'image de pr<EFBFBD>visualitation, pour le cas de r<EFBFBD>g<EFBFBD>n<EFBFBD>ration de commande
\param db objet base de donnée \param db objet base de donn<EFBFBD>e
\param commandeid id de la commande à effacer \param commandeid id de la commande <EFBFBD> effacer
\param commanderef référence de la commande si besoin \param commanderef r<EFBFBD>f<EFBFBD>rence de la commande si besoin
*/ */
function commande_delete_preview($db, $commandeid, $commanderef='') function commande_delete_preview($db, $commandeid, $commanderef='')
{ {
global $langs,$conf; global $langs,$conf;
@ -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<EFBFBD>re de generation des fiches interventions en PDF
et la classe mère de numérotation des fiches interventions et la classe m<EFBFBD>re de num<EFBFBD>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èles de fiche intervention \brief Classe m<EFBFBD>re des mod<EFBFBD>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éation de fiche intervention \brief Renvoi le dernier message d'erreur de cr<EFBFBD>ation de fiche intervention
*/ */
function pdferror() function pdferror()
{ {
@ -56,7 +56,7 @@ class ModelePDFFicheinter extends FPDF
} }
/** /**
* \brief Renvoi la liste des modèles actifs * \brief Renvoi la liste des mod<EFBFBD>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èles de numérotation des références de fiches d'intervention \brief Classe m<EFBFBD>re des mod<EFBFBD>les de num<EFBFBD>rotation des r<EFBFBD>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érotation /** \brief Renvoi la description par defaut du modele de num<EFBFBD>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érotation /** \brief Renvoi un exemple de num<EFBFBD>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éros déjà en vigueur dans la base ne provoquent pas de /** \brief Test si les num<EFBFBD>ros d<EFBFBD>j<EFBFBD> en vigueur dans la base ne provoquent pas de
* de conflits qui empechera cette numérotation de fonctionner. * de conflits qui empechera cette num<EFBFBD>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ée /** \brief Renvoi prochaine valeur attribu<EFBFBD>e
* \return string Valeur * \return string Valeur
*/ */
function getNextValue() function getNextValue()
@ -163,10 +163,10 @@ class ModeleNumRefFicheinter
/** /**
\brief Crée une fiche intervention sur disque en fonction du modèle de FICHEINTER_ADDON_PDF \brief Cr<EFBFBD>e une fiche intervention sur disque en fonction du mod<EFBFBD>le de FICHEINTER_ADDON_PDF
\param db objet base de donnée \param db objet base de donn<EFBFBD>e
\param object Object fichinter \param object Object fichinter
\param modele force le modele à utiliser ('' par defaut) \param modele force le modele <EFBFBD> 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 à utiliser // Positionne modele sur le nom du modele de facture <EFBFBD> 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évisualitation, pour le cas de régénération de propal \brief Supprime l'image de pr<EFBFBD>visualitation, pour le cas de r<EFBFBD>g<EFBFBD>n<EFBFBD>ration de propal
\param db objet base de donnée \param db objet base de donn<EFBFBD>e
\param propalid id de la propal à effacer \param propalid id de la propal <EFBFBD> effacer
\param propalref référence de la propal si besoin \param propalref r<EFBFBD>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ée * \param db objet base de donn<EFBFBD>e
* \param deliveryid id object * \param deliveryid id object
* \param modele force le modele à utiliser ('' to not force) * \param modele force le modele <EFBFBD> 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,10 +22,10 @@
/** /**
\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<EFBFBD>re de generation des propales en PDF
et la classe mère de numérotation des propales et la classe m<EFBFBD>re de num<EFBFBD>rotation des propales
\version $Id$ \version $Id$
*/ */
require_once(DOL_DOCUMENT_ROOT.'/lib/pdf.lib.php'); require_once(DOL_DOCUMENT_ROOT.'/lib/pdf.lib.php');
require_once(DOL_DOCUMENT_ROOT.'/includes/fpdf/fpdfi/fpdi_protection.php'); require_once(DOL_DOCUMENT_ROOT.'/includes/fpdf/fpdfi/fpdi_protection.php');
@ -35,7 +35,7 @@ require_once(DOL_DOCUMENT_ROOT."/compta/bank/account.class.php"); // Requis ca
/** /**
\class ModelePDFPropales \class ModelePDFPropales
\brief Classe mere des modeles de propale \brief Classe mere des modeles de propale
*/ */
class ModelePDFPropales extends FPDF class ModelePDFPropales extends FPDF
{ {
@ -90,7 +90,7 @@ class ModelePDFPropales extends FPDF
/** /**
\class ModeleNumRefPropales \class ModeleNumRefPropales
\brief Classe mere des modeles de numerotation des references de propales \brief Classe mere des modeles de numerotation des references de propales
*/ */
class ModeleNumRefPropales class ModeleNumRefPropales
{ {
@ -161,11 +161,11 @@ 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 à creer \param id id de la propale <EFBFBD> creer
\param modele force le modele à utiliser ('' to not force) \param modele force le modele <EFBFBD> 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
*/ */
function propale_pdf_create($db, $id, $modele, $outputlangs) function propale_pdf_create($db, $id, $modele, $outputlangs)
{ {
global $langs; global $langs;
@ -240,10 +240,10 @@ 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ée \param db objet base de donn<EFBFBD>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
*/ */
function propale_delete_preview($db, $propalid, $propalref='') function propale_delete_preview($db, $propalid, $propalref='')
{ {
global $langs,$conf; global $langs,$conf;
@ -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
} }
?> ?>