From 71ccd13b67c0bf4d147f0710b6f032c80a683685 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Fri, 10 Jun 2011 09:40:40 +0000
Subject: [PATCH] Allegement de la verification de fichier manquant dans un
 plugin : puisqu'on fait deja un file_exists() quand on a besoin d'inclure un
 fichier, on en profite pour peupler la globale message_crash_plugins a ce
 moment, via la fonction include_once_check qu'on utilise dans la compilation
 des plugins. Plus besoin de parcourir la liste des fichiers a verifier en
 debut de chaque hit

---
 ecrire/inc/filtres_ecrire.php | 16 ++++++++--------
 ecrire/inc/plugin.php         |  5 ++---
 ecrire/inc/utils.php          | 13 +++++++++++++
 ecrire/index.php              | 18 ------------------
 4 files changed, 23 insertions(+), 29 deletions(-)

diff --git a/ecrire/inc/filtres_ecrire.php b/ecrire/inc/filtres_ecrire.php
index af090d4ea8..343ef53d47 100644
--- a/ecrire/inc/filtres_ecrire.php
+++ b/ecrire/inc/filtres_ecrire.php
@@ -367,17 +367,17 @@ function alertes_auteur($id_auteur) {
 	}
 
 	if (isset($GLOBALS['meta']['message_crash_plugins'])
-	AND autoriser('configurer', 'plugins', null, $id_auteur)) {
-		include_spip('inc/plugin');
-		if ($msg = message_crash_plugins())
-			$alertes[] = $msg;
+	  AND $GLOBALS['meta']['message_crash_plugins']
+	  AND autoriser('configurer', 'plugins', null, $id_auteur)
+	  AND is_array($msg = unserialize($GLOBALS['meta']['message_crash_plugins']))) {
+			$msg = implode(', ',array_map('joli_repertoire',array_keys($msg)));
+			$alertes[] = _T('plugins_erreur', array('plugins' => $msg));
 	}
 
-
 	if (isset($GLOBALS['meta']['plugin_erreur_activation'])
-	AND autoriser('configurer', 'plugins', null, $id_auteur)) {
-		$alertes[] = $GLOBALS['meta']['plugin_erreur_activation'];
-		effacer_meta('plugin_erreur_activation'); // pas normal que ce soit ici
+	  AND autoriser('configurer', 'plugins', null, $id_auteur)) {
+		include_spip('inc/plugin');
+		$alertes[] = plugin_donne_erreurs();
 	}
 
 	$alertes = pipeline(
diff --git a/ecrire/inc/plugin.php b/ecrire/inc/plugin.php
index eb8b07cb67..bfa9d3c67d 100644
--- a/ecrire/inc/plugin.php
+++ b/ecrire/inc/plugin.php
@@ -416,7 +416,7 @@ function plugins_precompile_xxxtions($plugin_valides, $ordre)
 		// pour pouvoir garder le meme niveau d'erreur general
 				$file = trim($file);
 				$_file = $root_dir_type . ".'$plug/$file'";
-				$contenu[$charge] .= "if (file_exists(\$f=$_file)){include_once \$f;}\n";
+				$contenu[$charge] .= "include_once_check($_file);\n";
 				$liste_fichier_verif["$root_dir_type:$plug/$file"]=1;
 			}
 		}
@@ -523,8 +523,7 @@ function pipeline_precompile($verifs){
 					$file = str_replace("''.","",$file);
 					$file = str_replace(constant($dir), '', $file);
 				}
-				$s_inc .= 'if (file_exists($f='
-				. $file . ')){include_once($f);}'."\n";
+				$s_inc .= "include_once_check($file);\n";
 			}
 		}
 		if (strlen($s_inc))
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index d3715ca2a3..3c76656d73 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -67,6 +67,19 @@ function charger_fonction($nom, $dossier='exec', $continue=false) {
 	exit;
 }
 
+/**
+ * Inclusion unique avec verification d'existence du fichier + log en crash sinon
+ * @param string $file
+ * @return bool
+ */
+function include_once_check($file){
+	if (file_exists($file)) {include_once $file;return true;}
+	$crash = (isset($GLOBALS['message_crash_plugins'])?unserialize($GLOBALS['message_crash_plugins']):'');
+	$crash = ($crash?$crash:array());
+	$crash[$file] = true;
+	ecrire_meta('message_crash_plugins',serialize($crash));
+	return false;
+}
 
 //
 // la fonction cherchant un fichier PHP dans le SPIP_PATH
diff --git a/ecrire/index.php b/ecrire/index.php
index 96802b0dcc..d92d28caa3 100644
--- a/ecrire/index.php
+++ b/ecrire/index.php
@@ -113,24 +113,6 @@ elseif (!preg_match(',^[a-z4_][0-9a-z_-]*$,i', $exec)) {
 	set_request('exec', $exec);
 }
 
-// Verification des plugins
-// (ne pas interrompre une restauration ou un upgrade)
-elseif ($exec!='upgrade'
-AND !$var_auth
-AND !_DIR_RESTREINT
-AND autoriser('configurer')
-AND lire_fichier(_CACHE_PLUGINS_VERIF,$l)
-AND $l = @unserialize($l)) {
-	foreach ($l as $fichier) {
-		if (!@is_readable($fichier)) {
-			spip_log("Verification plugin: echec sur $fichier !");
-			include_spip('inc/plugin');
-			verifie_include_plugins();
-			break; // sortir de la boucle, on a fait un verif
-		}
-	}
-}
-
 // compatibilite ascendante
 $GLOBALS['spip_display'] = isset($GLOBALS['visiteur_session']['prefs']['display'])
 	? $GLOBALS['visiteur_session']['prefs']['display']
-- 
GitLab