From d6051063fc27e80ac8aa5d1968f2cc24c8ee2a7a Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Tue, 11 Sep 2007 10:27:04 +0000
Subject: [PATCH] =?UTF-8?q?Admin=5Frepair=20r=C3=A9parait=20TOUTES=20les?=
 =?UTF-8?q?=20tables=20de=20la=20base,=20sans=20tenir=20compte=20du=20pr?=
 =?UTF-8?q?=C3=A9fixe=20du=20site=20demandeur.=20Le=20temps=20devenant=20i?=
 =?UTF-8?q?mportant,=20on=20subissait=20un=20time=5Fout=20et=20la=20meta?=
 =?UTF-8?q?=20admin=20bloquait=20au=20coup=20d'apr=C3=A8s.=20On=20en=20pro?=
 =?UTF-8?q?fite=20pour=20g=C3=A9rer=20plus=20finement=20cette=20m=C3=A9ta,?=
 =?UTF-8?q?=20afin=20de=20r=C3=A9cup=C3=A9rer=20la=20main=20lorsque=20le?=
 =?UTF-8?q?=20temps=20d'admin=20est=20visiblement=20trop=20long.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/base/admin_repair.php | 16 ++++++++-------
 ecrire/inc/admin.php         | 39 +++++++++++++++++++++++++-----------
 2 files changed, 36 insertions(+), 19 deletions(-)

diff --git a/ecrire/base/admin_repair.php b/ecrire/base/admin_repair.php
index 0cf4b1c5fb..bbf22c17e1 100644
--- a/ecrire/base/admin_repair.php
+++ b/ecrire/base/admin_repair.php
@@ -14,14 +14,16 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 
 // http://doc.spip.org/@base_admin_repair_dist
 function base_admin_repair_dist() {
-	$res1= spip_query("SHOW TABLES");
 
+  $connexion = $GLOBALS['connexions'][0];
+  $prefixe = $connexion['prefixe'];
+  $res1= spip_query("SHOW TABLES LIKE " . _q("$prefixe%"));
 	$res = "";
 	if ($res1) { while ($r = sql_fetch($res1)) {
 		$tab = array_shift($r);
 
 		$res .= "<p><b>$tab</b> ";
-
+		spip_log("Repare $tab");
 		$result_repair = spip_query("REPAIR TABLE ".$tab);
 		if (!$result_repair) return false;
 
@@ -44,14 +46,14 @@ function base_admin_repair_dist() {
 			$res .= " "._T('texte_table_ok')."<br />\n";
 	  }
 	}
-
-	include_spip('inc/rubriques');
-	calculer_rubriques();
-
 	if (!$res) {
 		$res = "<br /><br /><span style='color: red; font-weight: bold;'><tt>"._T('avis_erreur_mysql').' '.sql_errno().': '.sql_error() ."</tt></span><br /><br /><br />\n";
+	} else {
+		include_spip('inc/rubriques');
+		calculer_rubriques();
 	}
 	include_spip('inc/minipres');
-	echo minipres(_T('texte_tentative_recuperation'), $res);
+	echo minipres(_T('texte_tentative_recuperation'),
+			$res . generer_form_ecrire('accueil', '','',_T('public:accueil_site')));
 }
 ?>
diff --git a/ecrire/inc/admin.php b/ecrire/inc/admin.php
index 5515494ded..f633fa889c 100644
--- a/ecrire/inc/admin.php
+++ b/ecrire/inc/admin.php
@@ -29,7 +29,8 @@ function inc_admin_dist($script, $titre, $comment='', $retour='')
 		spip_log("meta: $script " . join(',', $_POST));
 		ecrire_meta($script, serialize($_POST));
 		ecrire_metas();
-	} else 	admin_verifie_session($script);
+	} elseif  ($script !== 'admin_repair')
+		admin_verifie_session($script);
 
 	$base = charger_fonction($script, 'base');
 	$base($titre,$reprise);
@@ -40,27 +41,40 @@ function inc_admin_dist($script, $titre, $comment='', $retour='')
 
 // Gestion dans la meta "admin" du script d'administation demande,
 // pour eviter des executions en parallele, notamment apres Time-Out.
-// Cette meta contient le nom du script et, a un codage pres, du demandeur.
+// Cette meta contient le nom du script et, a un hachage pres, du demandeur.
 // Le code de ecrire/index.php devie toute demande d'execution d'un script
 // vers le script d'administration indique par cette meta si elle est lа.
 // Au niveau de la fonction inc_admin, on controle la meta 'admin'.
-// Si la meta n'est pas la, c'est le debut on la cree 
-// Sinon, on verifie que le connecte est bien celui ayant entame 
-// l'operation d'administration, 
-// Si le connecte n'est pas le bon, on refuse la connexion.
+// Si la meta n'est pas la, 
+//	c'est le debut on la cree.
+// Sinon, si le hachage actuel est le meme que celui en base, 
+//	c'est une reprise, on continue
+// Sinon, si le hachage differe a cause du connecte,
+// 	c'est une arrivee inoppotune, on refuse sa connexion.
+// Enfin, si hachage differe pour une autre raison
+// 	c'est que l'operation se passe mal, on la stoppe
 
 // http://doc.spip.org/@admin_verifie_session
 function admin_verifie_session($script) {
 
 	include_spip('base/abstract_sql');
-	$signal = $script . ' ' . fichier_admin($action);
+	$pref = sprintf("_%d_",$GLOBALS['auteur_session']['id_auteur']) .
+	$signal = fichier_admin($script, "$script$pref");
 	$row = sql_fetsel('valeur', 'spip_meta', "nom='admin'");
 	if (!$row) {
 		ecrire_meta('admin', $signal,'non');
 		ecrire_metas();
-	} elseif ($row['valeur'] != $signal)
-		die(_T('info_travaux_texte'));
-	else spip_log("reprise de $script");
+	} else {
+		if (($s = $row['valeur']) != $signal) {
+			if (intval(susbtr($s, strpos($s,'_')+1))<>
+			    $GLOBALS['auteur_session']['id_auteur']) {
+			  include_spip('inc/minipres');
+			  echo minipres(_T('info_travaux_texte'));
+			  exit;
+			}
+		}
+	}
+	spip_log("admin $pref" . ($row ? " (reprise)" : ''));
 }
 
 // http://doc.spip.org/@dir_admin
@@ -74,9 +88,10 @@ function dir_admin()
 }
 
 // http://doc.spip.org/@fichier_admin
-function fichier_admin($action) {
+function fichier_admin($action, $pref='admin_') {
 
-	return "admin_".substr(md5($action.(time() & ~2047).$GLOBALS['auteur_session']['login']), 0, 10);
+	return $pref . 
+	  substr(md5($action.(time() & ~2047).$GLOBALS['auteur_session']['login']), 0, 10);
 }
 
 // demande la creation d'un repertoire et sort
-- 
GitLab