From 6e2a54874290b1ea50f9962057c82d36cf7f5487 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Sun, 12 Nov 2006 19:40:11 +0000
Subject: [PATCH] Double Oups: les 2 autres, c'est pas pour tout de suite.

---
 ecrire/balise/formulaire_forum.php | 49 ++++++++++++++----------------
 ecrire/inc/forum_insert.php        | 21 +++++++++----
 2 files changed, 37 insertions(+), 33 deletions(-)

diff --git a/ecrire/balise/formulaire_forum.php b/ecrire/balise/formulaire_forum.php
index b07343115d..63c340eb40 100644
--- a/ecrire/balise/formulaire_forum.php
+++ b/ecrire/balise/formulaire_forum.php
@@ -103,6 +103,21 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 			$email_auteur = $GLOBALS['auteur_session']['email'];
 		}
 	}
+	// Tableau des valeurs servant au calcul d'une signature de securite.
+	// Elles seront placees en Input Hidden pour que inc/forum_insert
+	// recalcule la meme chose et verifie l'identite des resultats.
+	// Donc ne pas changer la valeur de ce tableau entre le calcul de
+	// la signature et la fabrication des Hidden
+	// Faire attention aussi a 0 != ''
+
+	// id_rubrique est parfois passee pour les articles, on n'en veut pas
+	$ids = array();
+	if ($id_rubrique > 0 AND ($id_article OR $id_breve OR $id_syndic))
+		$id_rubrique = 0;
+	foreach (array('id_article', 'id_breve', 'id_forum', 'id_rubrique', 'id_syndic') as $o) {
+		$ids[$o] = ($x = intval($$o)) ? $x : '';
+	}
+
 
 	// ne pas mettre '', sinon le squelette n'affichera rien.
 	$previsu = ' ';
@@ -146,9 +161,11 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 		if ($afficher_texte != 'non') 
 			$previsu = inclure_previsu($texte, $titre, $email_auteur, $auteur, $url_site, $nom_site_forum, $ajouter_mot);
 
-
 		$alea = forum_fichier_tmp();
 
+		include_spip('inc/actions');
+		$hash = calculer_action_auteur('ajout_forum'.join(' ', $ids).' '.$alea);
+
 		// Poser un cookie pour ne pas retaper les infos invariables
 		include_spip('inc/cookie');
 		spip_setcookie('spip_forum_user',
@@ -156,32 +173,10 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 				'email' => $email_auteur)));
 	}
 
-
-	// Valeurs servant au calcul d'une signature de securite.
-	// Elles seront placees en Input Hidden pour que inc/forum_insert
-	// recalcule la meme chose et verifie l'identite des resultats.
-	// Ne pas changer ces valeurs entre le calcul de la signature
-	// et leur insertion en hidden.
-	// Faire attention aussi a 0 != ''
-
-	// id_rubrique est parfois passee pour les articles, on n'en veut pas
-
-	if ($id_rubrique > 0 AND ($id_article OR $id_breve OR $id_syndic))
-		$id_rubrique = 0;
-
-	$arg = intval($id_article) .'/'. .
-	  intval($id_breve) . '/' .
-	  intval($id_forum) . '/' .
-	  intval($id_rubrique) . '/' .
-	  intval($id_syndic) . '/' .
-	  $alea;
-
-	include_spip('inc/actions');
-	$hash = calculer_action_auteur("ajout_forum-$arg");
-
-	$script = str_replace('&amp;', '&', $script);
-	$script_hidden = parametre_url($script, 'arg', $arg, '&');
-	$script_hidden = parametre_url($script_hidden, 'action', 'ajout_forum, '&');
+	// pour la chaine de hidden
+	$script_hidden = $script = str_replace('&amp;', '&', $script);
+	foreach ($ids as $id => $v)
+		$script_hidden = parametre_url($script_hidden, $id, $v, '&');
 
 	return array('formulaires/formulaire_forum', 0,
 	array(
diff --git a/ecrire/inc/forum_insert.php b/ecrire/inc/forum_insert.php
index 54b0bb4e3b..f8b6d35597 100644
--- a/ecrire/inc/forum_insert.php
+++ b/ecrire/inc/forum_insert.php
@@ -113,12 +113,24 @@ function mots_du_forum($ajouter_mot, $id_message)
 		  spip_abstract_insert('spip_mots_forum', '(id_mot, id_forum)', "($id_mot, $id_message)");
 }
 
-
+// Recalcule la signature faite dans formulaires/inc-formulaire-forum
+// en fonction des input POST (ne pas se fier aux parametres d'URL)
 // Retourne le fichier verrouillant si correct
 
 // http://doc.spip.org/@forum_insert_secure
-function forum_insert_secure($arg, $hash)
+function forum_insert_secure($alea, $hash)
 {
+	$ids = array();
+
+	foreach (array('id_article', 'id_breve', 'id_forum', 'id_rubrique', 'id_syndic') as $o) {
+		$ids[$o] = ($x = intval($_POST[$o])) ? $x : '';
+	}
+
+	if (!verifier_action_auteur('ajout_forum'.join(' ', $ids).' '.$alea,
+		$hash)) {
+		spip_log('erreur hash forum');
+		die (_T('forum_titre_erreur')); 	# echec du POST
+	}
 
 	$file = _DIR_TMP ."forum_" . preg_replace('/[^0-9]/', '', $alea) .".lck";
 	return  file_exists($file) ? $file : '';
@@ -192,10 +204,7 @@ function inc_forum_insert_dist() {
 
 	// Verifier hash securite pour les forums avec previsu
 	if ($afficher_texte <> 'non') {
-	        $var_f = charger_fonction('controler_action_auteur', 'inc');
-        	$var_f();
-
-		$file = forum_insert_secure(_request('arg'), _request('hash'));
+		$file = forum_insert_secure(_request('alea'), _request('hash'));
 		if (!$file) {
 			# ne pas tracer cette erreur, peut etre due a un double POST
 			# tracer_erreur_forum('session absente');
-- 
GitLab