From 4d80705bbd0f7f338387e37d0bfd3908c5deee31 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Fri, 4 Nov 2005 13:24:43 +0000
Subject: [PATCH] Menage dans la validation des forums pour : - permettre la
 surcharge dans les scripts ecrire/forum et ecrire/forum_admin - evacuer de
 inc.php le code presque jamais execute (passer par le redirect de iframe) -
 en profiter pour corriger le bug du chgt de statut des breves par iframe

L'existence d'un script forum et d'un fichier inc_forum qui n'a rien a voir est genante (d'ailleurs le scripts aurait du s'appeler forumS.php). Je m'en suis sorti en deportant le code sur le clone forum_admin.php, et c'est forum.php qui devient la coquille vide, mais le nommage est troublant. On arrangera ca lors de l'abandon des .php3
---
 ecrire/articles_forum.php3    |   3 +-
 ecrire/forum.php3             |  83 +-------------------
 ecrire/forum_admin.php3       |  19 ++++-
 ecrire/iframe_action.php3     |  28 ++++---
 ecrire/inc.php3               |   8 --
 ecrire/inc_articles.php       |   1 -
 ecrire/inc_breves.php         |  16 ++++
 ecrire/inc_controle_forum.php |   4 +-
 ecrire/inc_forum.php3         | 143 ++++++++--------------------------
 ecrire/inc_presentation.php3  |  10 +--
 10 files changed, 90 insertions(+), 225 deletions(-)

diff --git a/ecrire/articles_forum.php3 b/ecrire/articles_forum.php3
index d0e1ac2501..0892eaa3f1 100644
--- a/ecrire/articles_forum.php3
+++ b/ecrire/articles_forum.php3
@@ -107,7 +107,6 @@ echo "<A HREF='articles_forum.php3?id_article=$id_article&debut=$i&page=$page'>.
 
 echo "</div>";
 
-
 $mots_cles_forums = lire_meta("mots_cles_forums");
 
 if ($connect_statut == "0minirezo") {
@@ -118,7 +117,7 @@ if ($connect_statut == "0minirezo") {
 		AND pied.statut IN ('publie', 'off', 'prop')
 		AND thread.id_thread=pied.id_forum
 		GROUP BY id_thread
-		ORDER BY date DESC LIMIT  $pack OFFSET $debut";
+		ORDER BY date DESC LIMIT $debut, $pack";
 	$result_forum = spip_query($query_forum);
 	afficher_forum($result_forum, $forum_retour, $id_article);
 }
diff --git a/ecrire/forum.php3 b/ecrire/forum.php3
index 452d5eef63..d1196468fe 100644
--- a/ecrire/forum.php3
+++ b/ecrire/forum.php3
@@ -10,85 +10,6 @@
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-
-include ("inc.php3");
-
-// cette page gere les deux types de forums ; forum_admin.php3 n'est qu'une coquille vide
-if ($admin=='oui') {
-	debut_page(_T('titre_page_forum'), "redacteurs", "privadm");
-	$statutforum = 'privadm';
-	$logo = "forum-admin-24.gif";
-	$urlforum = 'forum_admin.php3';
-} else {
-	debut_page(_T('titre_forum'), "redacteurs", "forum-interne");
-	$statutforum = 'privrac';
-	$logo = "forum-interne-24.gif";
-	$urlforum = 'forum.php3';
-}
-
-debut_gauche();
-
-
-//
-// Raccourcis
-//
-/*
-	debut_raccourcis();
-	// rien
-	fin_raccourcis();
-*/
-
-
-debut_droite();
-
-if ($admin=='oui')
-	gros_titre(_T('titre_cadre_forum_administrateur'));
-else
-	gros_titre(_T('titre_cadre_forum_interne'));
-
-if ($admin == 'oui' AND $connect_statut != "0minirezo") {
-	echo _T('avis_non_acces_page');
-	exit;
-}
-
-echo "<div class='serif2'>";
-
-if (!$debut) $debut = 0;
-
-$query_forum = "SELECT COUNT(*) AS cnt FROM spip_forum WHERE statut='$statutforum' AND id_parent=0";
-$result_forum = spip_query($query_forum);
-$total = 0;
-if ($row = spip_fetch_array($result_forum)) $total = $row['cnt'];
-
-if ($total > 10) {
-	echo "<p>";
-	for ($i = 0; $i < $total; $i = $i + 10){
-		if ($i > 0) echo " | ";
-		if ($i == $debut)
-			echo "<FONT SIZE=3><B>$i</B></FONT>";
-		else
-			echo "<A HREF='$urlforum?debut=$i'>$i</A>";
-	}
-}
-
-
-
-echo "<p><div align='center'>";
-icone (_T('icone_poster_message'), "forum_envoi.php3?statut=$statutforum&adresse_retour=$urlforum&titre_message=".urlencode(filtrer_entites(_T('texte_nouveau_message'))), $logo, "creer.gif");
-echo "</div>";
-
-
-echo "<P align='left'>";
-
-$query_forum="SELECT * FROM spip_forum WHERE statut='$statutforum' AND id_parent=0 ORDER BY date_heure DESC LIMIT 10 OFFSET $debut";
-$result_forum=spip_query($query_forum);
-
-afficher_forum($result_forum,$urlforum);
-
-echo "</div>";
-
-
-fin_page();
-
+  // obsolete, mais assurer le service pour les vieux liens
+include ("forum_admin.php3");
 ?>
-
diff --git a/ecrire/forum_admin.php3 b/ecrire/forum_admin.php3
index 20776c0203..bc67d96ff8 100644
--- a/ecrire/forum_admin.php3
+++ b/ecrire/forum_admin.php3
@@ -10,9 +10,22 @@
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
+include ("inc.php3");
 
-$admin = 'oui';
-include ('forum.php3');
+// prendre $var_* comme variables pour eviter les conflits avec les http_vars
 
-?>
+$var_nom = "forum_admin";
+$var_f = find_in_path('inc_' . $var_nom . '.php');
+
+if ($var_f) 
+  include($var_f);
+elseif (file_exists($var_f = (_DIR_INCLUDE . 'inc_' . $var_nom . '.php')))
+  include($var_f);
 
+if (function_exists($var_nom))
+  $var_nom($debut, $admin);
+elseif (function_exists($var_f = $var_nom . "_dist"))
+  $var_f($debut, $admin);
+else
+   spip_log("fonction $var_nom indisponible");
+?>
diff --git a/ecrire/iframe_action.php3 b/ecrire/iframe_action.php3
index 3129e262fb..b027cf4b17 100644
--- a/ecrire/iframe_action.php3
+++ b/ecrire/iframe_action.php3
@@ -13,19 +13,23 @@
 include ("inc_version.php3");
 include_ecrire("inc_auth.php3");
 
-@header("Cache-Control: no-store, no-cache, must-revalidate");
-echo "";
-
 if ($id && ($connect_statut == "0minirezo")) {
 
-	$nom = "inc_" . $action . ".php";
-	$f = find_in_path($nom);
-	if ($f) 
-	  include($f);
-	elseif (file_exists($f = (_DIR_INCLUDE . $nom)))
-	  include($f);
-	$nom = 'changer_statut_' . $action;
-	if (function_exists($nom))
-		$nom($id, $statut);
+	$var_f = find_in_path('inc_' . $action . '.php');
+	if ($var_f) 
+	  include($var_f);
+	elseif (is_readable($var_f = (_DIR_INCLUDE . 'inc_' . $action . '.php')))
+	  include($var_f);
+	else spip_log("pas de fichier $var_f");
+	$var_nom = 'changer_statut_' . $action;
+	if (function_exists($var_nom))
+		$var_nom($id, $statut);
+	else spip_log("fonction $var_nom indisponible dans $var_f");
  }
+
+if (!$redirect)
+	header("Cache-Control: no-store, no-cache, must-revalidate");
+else
+	header("Location: " . urldecode($redirect));
+
 ?>
diff --git a/ecrire/inc.php3 b/ecrire/inc.php3
index c452022c48..42d311c297 100644
--- a/ecrire/inc.php3
+++ b/ecrire/inc.php3
@@ -216,12 +216,4 @@ function tester_rubrique_vide($id_rubrique) {
 
 $cookie_admin = $_COOKIE['spip_admin'];
 
-
-// Modifs forum
-if ($controle_forum AND $id_controle_forum) {
-	controler_statut_forum($controle_forum, $id_controle_forum);
-	if ($redirect)
-		redirige_par_entete($redirect);
-}
-
 ?>
diff --git a/ecrire/inc_articles.php b/ecrire/inc_articles.php
index fe93aa41eb..7893203f9a 100644
--- a/ecrire/inc_articles.php
+++ b/ecrire/inc_articles.php
@@ -468,7 +468,6 @@ meme_rubrique_articles($id_rubrique, $id_article, $options);
 
 function changer_statut_articles($id_article, $statut)
 {
-	spip_log("arti $id_article, $statut");
 	$result = spip_query("SELECT statut FROM spip_articles WHERE id_article=$id_article");
 
 	if ($row = spip_fetch_array($result)) {
diff --git a/ecrire/inc_breves.php b/ecrire/inc_breves.php
index ccef1583fc..a7083a5c24 100644
--- a/ecrire/inc_breves.php
+++ b/ecrire/inc_breves.php
@@ -42,6 +42,22 @@ function enfant_breves($leparent){
 	}
 }
 
+function changer_statut_breves($id_breve, $statut)
+{
+	$query = "SELECT statut FROM spip_breves WHERE id_breve=$id_breve";
+	$result = spip_query($query);
+	if ($row = spip_fetch_array($result)) {
+        	$statut_ancien = $row['statut'];
+	}
+
+	if ($statut != $statut_ancien) {
+        	$query = "UPDATE spip_breves SET date_heure=NOW(), statut='$statut' WHERE id_breve=$id_breve";
+		$result = spip_query($query);
+
+		include_ecrire("inc_rubriques.php3");
+		calculer_rubriques();
+	}
+}
 
 function breves_dist()
 {
diff --git a/ecrire/inc_controle_forum.php b/ecrire/inc_controle_forum.php
index e7e5f37dd6..e3693e57d5 100644
--- a/ecrire/inc_controle_forum.php
+++ b/ecrire/inc_controle_forum.php
@@ -91,14 +91,14 @@ SELECT * FROM spip_breves WHERE id_breve='$forum_id_breve'"));
 	  $retour = forum_parent($forum_id_parent);
 	  if ($retour) return $retour;
 	  else return array('pref' => _T('info_message'),
-			    'url' => 'forum_admin.php3',
+			    'url' => 'forum_admin.php3?admin=admin',
 			    'titre' => _T('info_forum_administrateur'));
 	}
 	else {
 	  $retour = forum_parent($forum_id_parent);
 	  if ($retour) return $retour;
 	  else return array('pref' => _T('info_message'),
-			    'url' => 'forum.php3',
+			    'url' => 'forum_admin.php3',
 			    'titre' => _T('info_forum_interne'));
 	}
 }
diff --git a/ecrire/inc_forum.php3 b/ecrire/inc_forum.php3
index e1b9abf619..50205a71aa 100644
--- a/ecrire/inc_forum.php3
+++ b/ecrire/inc_forum.php3
@@ -16,93 +16,19 @@
 if (defined("_ECRIRE_INC_FORUM")) return;
 define("_ECRIRE_INC_FORUM", "1");
 
-
-//
-// Suppression de forums
-//
-function changer_statut_forum($id_forum, $statut) {
-	$result = spip_query("SELECT * FROM spip_forum WHERE id_forum=$id_forum");
-
-	if (!($row = spip_fetch_array($result)))
-		return;
-
-	$id_parent = $row['id_parent'];
-
-	// invalider les pages comportant ce forum
-	include_ecrire('inc_invalideur.php3');
-	$index_forum = calcul_index_forum($row['id_article'], $row['id_breve'], $row['id_rubrique'], $row['id_syndic']);
-	suivre_invalideur("id='id_forum/$index_forum'");
-
-	// Signaler au moteur de recherche qu'il faut reindexer le thread
-	if ($id_parent) {
-		include_ecrire('inc_index.php3');
-		marquer_indexer ('forum', $id_parent);
-	}
-
-	// changer le statut de toute l'arborescence dependant de ce message
-	$id_messages = array($id_forum);
-	while ($id_messages) {
-		$id_messages = join(',', $id_messages);
-		$query_forum = "UPDATE spip_forum SET statut='$statut'
-		WHERE id_forum IN ($id_messages)";
-		$result_forum = spip_query($query_forum);
-		$query_forum = "SELECT id_forum FROM spip_forum
-		WHERE id_parent IN ($id_messages)";
-		$result_forum = spip_query($query_forum);
-		unset($id_messages);
-		while ($row = spip_fetch_array($result_forum))
-			$id_messages[] = $row['id_forum'];
-	}
-}
-
-function controler_statut_forum ($controle_forum, $id_controle_forum) {
-	// Verifier qu'on a le droit d'agir sur ce forum
-	global $connect_toutes_rubriques, $connect_statut;
-	$ok = ($connect_statut == "0minirezo" AND $connect_toutes_rubriques);
-	if (!$ok) return;
-
-	// Que faut-il faire ?
-	switch($controle_forum) {
-		case 'supp_forum':
-			$statut = 'off';
-			break;
-		case 'supp_forum_priv':
-			$statut = 'privoff';
-			break;
-		case 'valid_forum':
-			$statut = 'publie';
-			break;
-		// nb : les forums prives (privrac ou prive), une fois effaces
-		// (privoff), ne sont pas revalidables ; le forum d'admin (privadm)
-		// n'est pas effacable
-	}
-	changer_statut_forum($id_controle_forum, $statut);
-	return $statut;
-}
-
-// Installer un bouton de moderation dans l'espace prive
-function controle_cache_forum($action, $id, $texte, $fond, $fonction, $but='') {
-	$link = new Link();
-
-	$link->addvar('controle_forum', $action);
-	$link->addvar('id_controle_forum', $id);
-	$link = $link->geturl() . "#id$id";
-
-	if ($but)
-		$link = $but . "&retour=ecrire/" . urlencode($link);
-
-	return icone($texte,
-		$link,
-		$fond,
-		$fonction,
-		"right",
-		'non');
-}
-
 // tous les boutons de controle d'un forum
+// nb : les forums prives (privrac ou prive), une fois effaces
+// (privoff), ne sont pas revalidables ; le forum d'admin (privadm)
+// n'est pas effacable
+
 function boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur=0, $ref, $forum_ip) {
 	$controle = '';
 
+	$link = new Link();
+	$link = $link->geturl() . "#id$id_forum";
+	$ulink = urlencode($link);
+	$action = "iframe_action.php3?action=forum_admin&amp;id=$id_forum";
+
 	// selection du logo et des boutons correspondant a l'etat du forum
 	switch ($forum_stat) {
 		# forum sous un article dans l'espace prive
@@ -110,7 +36,7 @@ function boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur=0, $ref
 			$logo = "forum-interne-24.gif";
 			$valider = false;
 			$valider_repondre = false;
-			$supprimer = 'supp_forum_priv';
+			$supprimer = 'privoff';
 			break;
 		# forum des administrateurs
 		case "privadmin":
@@ -132,7 +58,7 @@ function boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur=0, $ref
 			$logo = "forum-interne-24.gif";
 			$valider = false;
 			$valider_repondre = false;
-			$supprimer = 'supp_forum_priv';
+			$supprimer = 'privoff';
 			break;
 
 		# forum publie sur le site public
@@ -140,57 +66,52 @@ function boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur=0, $ref
 			$logo = "forum-public-24.gif";
 			$valider = false;
 			$valider_repondre = false;
-			$supprimer = 'supp_forum';
+			$supprimer = 'off';
 			break;
 		# forum supprime sur le site public
 		case "off":
 			$logo = "forum-public-24.gif";
-			$valider = 'valid_forum';
+			$valider = 'publie';
 			$valider_repondre = false;
 			$supprimer = false;
-			$message = "<BR><FONT COLOR='red'><B>"._T('info_message_supprime')." $forum_ip</B></FONT>";
+			$controle = "<br /><FONT COLOR='red'><B>"._T('info_message_supprime')." $forum_ip</B></FONT>";
 			if($forum_id_auteur)
-				$message .= " - <A HREF='auteurs_edit.php3?id_auteur="
+				$controle .= " - <A HREF='auteurs_edit.php3?id_auteur="
 				.$forum_id_auteur."'>" ._T('lien_voir_auteur'). "</A>";
 			break;
 		# forum propose (a moderer) sur le site public
 		case "prop":
 			$logo = "forum-public-24.gif";
-			$valider = 'valid_forum';
+			$valider = 'publie';
 			$valider_repondre = true;
-			$supprimer = 'supp_forum';
+			$supprimer = 'off';
 			break;
 		default:
 			return;
 	}
 
-	if ($message)
-		$controle .= $message;
-
 	if ($supprimer)
-		$controle .= controle_cache_forum($supprimer,
-			$id_forum,
-			_T('icone_supprimer_message'), 
+		$controle .= icone(_T('icone_supprimer_message'), 
+			$action ."&amp;statut=$supprimer&amp;redirect=$link",
 			$logo,
-			"supprimer.gif");
+			"supprimer.gif", 'right', 'non');
 
 	if ($valider)
-		$controle .= controle_cache_forum($valider,
-			$id_forum,
-			_T('icone_valider_message'), 
+		$controle .= icone(_T('icone_valider_message'), 
+			$action ."&amp;statut=$valider&amp;redirect=$link",
 			$logo,
-			"creer.gif");
+			"creer.gif", 'right', 'non');
 
 	if ($valider_repondre) {
 
-		$controle .= controle_cache_forum($valider,
-			$id_forum,
-			_T('icone_valider_message') . " &amp; " .
-			_T('lien_repondre_message'),
-			$logo,
-			"creer.gif",
-			"../forum.php3?$ref&id_forum=$id_forum"
-		);
+		$retour = urlencode("../forum.php3?$ref&id_forum=$id_forum&retour=" .
+			      urlencode(_DIR_RESTREINT_ABS . $link));
+		$controle .= icone(_T('icone_valider_message') 
+				   . " &amp; " .
+				   _T('lien_repondre_message'),
+				   $action ."&amp;statut=$valider&amp;redirect=$retour",
+				   $logo,
+				   "creer.gif", 'right', 'non');
 	}
 
 	return $controle;
@@ -300,7 +221,7 @@ function generer_url_forum_dist($id_forum, $show_thread=false) {
 			return generer_url_site($id)."#forum$id_forum";
 			break;
 		default:
-			return "forum.php3?id_forum=".$id_forum;
+			return "forum_admin.php3?id_forum=".$id_forum;
 	}
 }
 
diff --git a/ecrire/inc_presentation.php3 b/ecrire/inc_presentation.php3
index a61698b373..5e7bb5b4bb 100644
--- a/ecrire/inc_presentation.php3
+++ b/ecrire/inc_presentation.php3
@@ -1619,7 +1619,7 @@ function afficher_messages($titre_table, $query_message, $afficher_auteurs = tru
 // Afficher les forums
 //
 
-function afficher_forum($request, $adresse_retour, $controle_id_article = 0) {
+function afficher_forum($request, $adresse_retour, $controle_id_article = false) {
 	global $debut;
 	static $compteur_forum;
 	static $nb_forum;
@@ -1740,7 +1740,7 @@ function afficher_forum($request, $adresse_retour, $controle_id_article = 0) {
 			}
 
 			// boutons de moderation
-			if ($controle_id_article && is_int($controle_id_article))
+			if ($controle_id_article && is_numeric($controle_id_article))
 				echo boutons_controle_forum($id_forum, $statut, $id_auteur, "id_article=$controle_id_article", $ip);
 
 			echo safehtml(justifier(propre($texte)));
@@ -2375,7 +2375,7 @@ if ($spip_display == "4") {
 	echo "<ul>";
 	echo "<li><a href=\"index.php3\">"._T('icone_a_suivre')."</a>";
 	echo "<li><a href=\"naviguer.php3\">"._T('icone_edition_site')."</a>";
-	echo "<li><a href=\"forum.php3\">"._T('titre_forum')."</a>";
+	echo "<li><a href=\"forum_admin.php3\">"._T('titre_forum')."</a>";
 	echo "<li><a href=\"auteurs.php3\">"._T('icone_auteurs')."</a>";
 	echo "<li><a href=\"$adresse_site/\">"._T('icone_visiter_site')."</a>";
 	echo "</ul>";
@@ -2397,7 +2397,7 @@ else {
 
 	icone_bandeau_principal (_T('icone_a_suivre'), "index.php3", "asuivre-48.png", "asuivre", $rubrique, "", "asuivre", $sous_rubrique);
 	icone_bandeau_principal (_T('icone_edition_site'), "naviguer.php3", "documents-48$spip_lang_rtl.png", "documents", $rubrique, "", "rubriques", $sous_rubrique);
-	icone_bandeau_principal (_T('titre_forum'), "forum.php3", "messagerie-48.png", "redacteurs", $rubrique, "", "forum-interne", $sous_rubrique);
+	icone_bandeau_principal (_T('titre_forum'), "forum_admin.php3", "messagerie-48.png", "redacteurs", $rubrique, "", "forum-interne", $sous_rubrique);
 	icone_bandeau_principal (_T('icone_auteurs'), "auteurs.php3", "redacteurs-48.png", "auteurs", $rubrique, "", "redacteurs", $sous_rubrique);
 	if ($connect_statut == "0minirezo"  AND lire_meta("activer_statistiques") != 'non') {
 		//bandeau_barre_verticale();
@@ -2500,7 +2500,7 @@ else {
 		}
 
 			echo "<div class='$class' id='bandeauredacteurs' style='position: absolute; $spip_lang_left: ".$decal."px;'><div class='bandeau_sec'><table class='gauche'><tr>\n";
-				if (lire_meta('forum_prive_admin') == 'oui') icone_bandeau_secondaire (_T('icone_forum_administrateur'), "forum_admin.php3", "forum-admin-24.gif", "privadm", $sous_rubrique);
+				if (lire_meta('forum_prive_admin') == 'oui') icone_bandeau_secondaire (_T('icone_forum_administrateur'), "forum_admin.php3?admin=admin", "forum-admin-24.gif", "privadm", $sous_rubrique);
 
 				icone_bandeau_secondaire (_T('icone_suivi_forums'), "controle_forum.php3", "suivi-forum-24.gif", "forum-controle", $sous_rubrique);
 				icone_bandeau_secondaire (_T('icone_suivi_pettions'), "controle_petition.php3", "suivi-petition-24.gif", "suivi-petition", $sous_rubrique);
-- 
GitLab