From 5f7f3496e74bc16d2a3ebd29d1287973cdd9fb26 Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Thu, 24 May 2012 08:37:36 +0000 Subject: [PATCH] Gerer les erreurs de recuperation lors de copie_locale pour eviter de stocker un fichier corrompu et inutilisable + PHP Doc --- ecrire/inc/acces.php | 12 +++++++----- ecrire/inc/distant.php | 17 +++++++++++++++-- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/ecrire/inc/acces.php b/ecrire/inc/acces.php index 68b81f00e8..4f895a40cd 100644 --- a/ecrire/inc/acces.php +++ b/ecrire/inc/acces.php @@ -41,11 +41,13 @@ function creer_pass_aleatoire($longueur = 8, $sel = "") { return $pass; } -// -// Creer un identifiant aleatoire -// - -// http://doc.spip.org/@creer_uniqid +/** + * Creer un identifiant aleatoire + * + * http://doc.spip.org/@creer_uniqid + * + * @return string + */ function creer_uniqid() { static $seeded; diff --git a/ecrire/inc/distant.php b/ecrire/inc/distant.php index a3f2bfeacd..be216ffc00 100644 --- a/ecrire/inc/distant.php +++ b/ecrire/inc/distant.php @@ -70,9 +70,22 @@ function copie_locale($source, $mode = 'auto', $local = null){ return $local; if ($mode=='modif' OR !$t){ - $res = recuperer_page($source, $localrac, false, _COPIE_LOCALE_MAX_SIZE, '', '', false, $t ? filemtime($localrac) : ''); + // passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation + // et des eventuelles recuperations concurantes + include_spip("inc/acces"); + $localractmp = "$localrac.".creer_uniqid().".tmp"; + $res = recuperer_page($source, $localractmp, false, _COPIE_LOCALE_MAX_SIZE, '', '', false, $t ? filemtime($localrac) : ''); + if ($res) { + // si OK on supprime l'ancien fichier et on renomme + spip_log("copie_locale : recuperation $source sur $localractmp taille $res OK, renommage en $localrac"); + spip_unlink($localrac); + @rename($localractmp, $localrac); + } else { + // sinon on supprime le fichier temporaire qui a echoue et qui est sans doute corrompu... + spip_log("copie_locale : Echec recuperation $source sur $localractmp, fichier supprime",_LOG_INFO_IMPORTANTE); + spip_unlink($localractmp); + } if (!$res) return $t ? $local : false; -# spip_log ('ecrire copie locale '.$localrac." taille $res"); // pour une eventuelle indexation pipeline('post_edition', -- GitLab