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