#8 bug avec open_basedir restriction

closed
nobody
None
5
2009-10-09
2009-10-02
Eriseux
No

Le pb : l'appel $tmp = tempnam(null, md5(uniqid())); dans le constructeur échoue ; le passage du paramètre null essaye d'ouvrir un dossier temp par défaut qui n'est pas trouvé ("open_basedir restriction in effect. File(/tmp) is not within the allowed path(s)") ; dans la config de nos serveurs (hotes virtuels), le dossier tmp n'est pas dans les chemins accessibles par défaut ; il faut du coup lui passer "en dur" le chemin : $tmp = tempnam('/var/www/virtual/www.monsite.fr/phptmp', md5(uniqid())); pour que cela marche. On tombe donc dans le cas du pb de la maj de la classe pour suivre son évolution.

L'extension de la classe + redéfinition du constructeur (pour pallier le pb) provoque une erreur : Fatal error: Call to private method Odf::_moveRowSegments() from context 'Odf_Dfoad' in C:\wamp\www\phpodt\library\odf_dfoad.php on line 34

puisque la méthode $this->_moveRowSegments(); est appelée dans le constructeur parent

Pour que cela fonctionne il faut soit passer la méthode à public (pas une bonne idée) ou protected (mieux) pour que la classe fille puisse l'étendre ; Dans ce cas je redéfini le constructeur dans la classe fille en passant en dur mon chemin ; marche bien tant que le constructeur de la classe parente n'évolue pas, c'est un copier/coller... (pas terrible pour l'évolutivité). Donc pas une très bonne solution non plus.

En définitive ce qui me semble le plus approprié (dans une première approche) :

Proposition de patch :
Passer par le chemin vers le répertoire d'upload temporaire du serveur et profiter du tableau $config et lui ajouter un paramètre par exemple : 'PATH_TO_TMP' => null

soit : protected $config = array(
'ZIP_PROXY' => 'PclZipProxy',
'DELIMITER_LEFT' => '{',
'DELIMITER_RIGHT' => '}',
'PATH_TO_TMP' => null
);

et modifier $tmp = tempnam(null, md5(uniqid())); en

$tmp = tempnam($this->config['PATH_TO_TMP'], md5(uniqid()));

du coup on peut passer le paramètre à la création de l'objet et profiter des mises à jour de la classe... (qui est très bien au passage !! ;) )

Patch testé et validé sur mon serveur de prod.

ou 2ème solution : récupérer la valeur de la directive upload_tmp_dir avec ini_get("upload_tmp_dir") si la tempnam échoue (peut être plus portable que la solution 1 ??) ; pas encore testé pour ma part.
Qu'en pensez-vous ?

Discussion

  • PIERRE de GEYER

    PIERRE de GEYER - 2009-10-09

    Fixed.

    Thx

     
  • PIERRE de GEYER

    PIERRE de GEYER - 2009-10-09
    • status: open --> closed
     

Log in to post a comment.