From 6eb0420c430fee2ba7fe5b4c45b975c8e2bc44d1 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Sun, 12 Nov 2006 23:45:01 +0000
Subject: [PATCH] =?UTF-8?q?Rationnalisation=20de=20l'interace=20des=20scri?=
 =?UTF-8?q?pts=20action:=20appel=20de=20la=20fonction=20surchargeable=20se?=
 =?UTF-8?q?curiser=5Faction=20qui=20fait=20le=20travail=20de=20generer=5Fa?=
 =?UTF-8?q?ction=5Fauteur=20si=20elle=20est=20appel=C3=A9e=20avec=20au=20m?=
 =?UTF-8?q?oins=20argument,=20et=20sinon=20controle=20les=20valeurs=20de?=
 =?UTF-8?q?=20s=C3=A9curit=C3=A9=20(ex-fonction=20contoler=5Faction=5Faute?=
 =?UTF-8?q?ur=20qui=20semblait=20surchargeable=20mais=20ne=20l'=C3=A9tait?=
 =?UTF-8?q?=20pas).=20generer=5Faction=5Fauteur=20reste=20disponible=20mai?=
 =?UTF-8?q?s=20est=20appel=C3=A9e=20a=20disparaitre.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitattributes                              |   2 +
 dist/formulaires/formulaire_forum.html      |   2 +-
 ecrire/action/converser.php                 |  48 +++++++++
 ecrire/action/cookie.php                    |  21 +---
 ecrire/action/dater.php                     |   3 +-
 ecrire/action/documenter.php                |   2 +-
 ecrire/action/editer_article.php            |   3 +-
 ecrire/action/editer_auteurs.php            |   3 +-
 ecrire/action/editer_breve.php              |   3 +-
 ecrire/action/editer_mot.php                |   3 +-
 ecrire/action/editer_rubrique.php           |   3 +-
 ecrire/action/editer_signatures.php         |   3 +-
 ecrire/action/editer_site.php               |   3 +-
 ecrire/action/iconifier.php                 |   2 +-
 ecrire/action/instituer_article.php         |   3 +-
 ecrire/action/instituer_auteur.php          |   3 +-
 ecrire/action/instituer_breve.php           |   3 +-
 ecrire/action/instituer_collaboration.php   |   3 +-
 ecrire/action/instituer_forum.php           |   3 +-
 ecrire/action/instituer_groupe_mots.php     |   3 +-
 ecrire/action/instituer_langue_rubrique.php |   3 +-
 ecrire/action/instituer_mot.php             |   3 +-
 ecrire/action/instituer_syndic.php          |   3 +-
 ecrire/action/joindre.php                   |   2 +-
 ecrire/action/legender.php                  |   3 +-
 ecrire/action/legender_auteur.php           |   3 +-
 ecrire/action/petitionner.php               |   3 +-
 ecrire/action/poster_forum_prive.php        |   3 +-
 ecrire/action/purger.php                    |   3 +-
 ecrire/action/referencer_traduction.php     |   3 +-
 ecrire/action/regler_moderation.php         |   3 +-
 ecrire/action/reorganiser.php               |  18 ++--
 ecrire/action/supprimer.php                 |   3 +-
 ecrire/action/supprimer_traduction.php      |   3 +-
 ecrire/action/tourner.php                   |   3 +-
 ecrire/action/virtualiser.php               |   3 +-
 ecrire/balise/formulaire_forum.php          |  13 +--
 ecrire/inc/actions.php                      |  94 +----------------
 ecrire/inc/forum_insert.php                 |  33 ++----
 ecrire/inc/lang.php                         |   2 +-
 ecrire/inc/securiser_action.php             | 111 ++++++++++++++++++++
 spip.php                                    |   4 +-
 42 files changed, 227 insertions(+), 211 deletions(-)
 create mode 100644 ecrire/action/converser.php
 create mode 100644 ecrire/inc/securiser_action.php

diff --git a/.gitattributes b/.gitattributes
index cf4591b555..0f862e83b7 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -309,6 +309,7 @@ dist/vignettes/xml.png -text
 dist/vignettes/zip.png -text
 dist/win_width.htc -text
 ecrire/action/autoriser.php -text
+ecrire/action/converser.php -text
 ecrire/action/dater.php -text
 ecrire/action/documenter.php -text
 ecrire/action/editer_article.php -text
@@ -492,6 +493,7 @@ ecrire/inc/plugin.php -text
 ecrire/inc/popularites.php -text
 ecrire/inc/referencer_traduction.php -text
 ecrire/inc/regler_moderation.php -text
+ecrire/inc/securiser_action.php -text
 ecrire/inc/selectionner.php -text
 ecrire/inc/selectionner_auteur.php -text
 ecrire/inc/sites_voir.php -text
diff --git a/dist/formulaires/formulaire_forum.html b/dist/formulaires/formulaire_forum.html
index bc6d139b56..ffb0b3b2cd 100644
--- a/dist/formulaires/formulaire_forum.html
+++ b/dist/formulaires/formulaire_forum.html
@@ -4,7 +4,7 @@
 
 <form action="#ENV{url}#formulaire_forum" method="post">
 [(#ENV{url_post}|form_hidden)]
-[<input type="hidden" name="alea" value="(#ENV{alea})" />]
+[<input type="hidden" name="arg" value="(#ENV{arg})" />]
 [<input type="hidden" name="hash" value="(#ENV{hash})" />]
 [<input type="hidden" name="verif_(#ENV{hash})" value="ok" />]
 [<input type="hidden" name="afficher_texte" value="(#ENV{afficher_texte})" />]
diff --git a/ecrire/action/converser.php b/ecrire/action/converser.php
new file mode 100644
index 0000000000..14607f5299
--- /dev/null
+++ b/ecrire/action/converser.php
@@ -0,0 +1,48 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/cookie');
+
+// changer de langue espace prive (ou login)
+
+function action_converser_dist()
+{
+	$lang = _request('var_lang_ecrire');
+
+	if (_FILE_CONNECT AND $lang) {
+		$var_f = charger_fonction('securiser_action', 'inc');
+		$var_f();
+		spip_query("UPDATE spip_auteurs SET lang = " . _q($lang) . " WHERE id_auteur = " . $GLOBALS['auteur_session']['id_auteur']);
+		$auteur_session['lang'] = $lang;
+		$var_f = charger_fonction('session', 'inc');
+		$var_f($auteur_session);
+	}
+}
+
+function action_converser_post()
+{
+	if ($lang = _request('var_lang_ecrire')) {
+		include_spip('inc/lang');
+
+		spip_setcookie('spip_lang_ecrire', $lang, time() + 365 * 24 * 3600);
+		spip_setcookie('spip_lang', $lang, time() + 365 * 24 * 3600);
+	}
+	$redirect = rawurldecode(_request('url'));
+	spip_log("acp $redirect");
+	if (!$redirect) $redirect = _DIR_RESTREINT_ABS;
+	$redirect = parametre_url($redirect,'lang',$lang,'&');
+	redirige_par_entete($redirect, true);
+}
+
+?>
diff --git a/ecrire/action/cookie.php b/ecrire/action/cookie.php
index 7892e12abb..8893d23a9d 100644
--- a/ecrire/action/cookie.php
+++ b/ecrire/action/cookie.php
@@ -161,24 +161,11 @@ if ($var_lang) {
 	}
  }
 
-// changer de langue espace prive (ou login)
-if ($var_lang_ecrire) {
-	include_spip('inc/lang');
-
-	spip_setcookie('spip_lang_ecrire', $var_lang_ecrire, time() + 365 * 24 * 3600);
-	spip_setcookie('spip_lang', $var_lang_ecrire, time() + 365 * 24 * 3600);
-
-	if (_FILE_CONNECT
-	AND verifier_action_auteur("cookie-var_lang_ecrire", $hash)) {
-		spip_query("UPDATE spip_auteurs SET lang = " . _q($var_lang_ecrire) . " WHERE id_auteur = " . $GLOBALS['auteur_session']['id_auteur']);
-		$auteur_session['lang'] = $var_lang_ecrire;
-		$var_f = charger_fonction('session', 'inc');
-		$var_f($auteur_session);
-	}
-
-	$redirect = parametre_url($redirect,'lang',$var_lang_ecrire,'&');
+// changer de langue espace prive avant le login (i.e. pas authentfie)
+elseif ($var_lang_ecrire) {
+	include_spip('action/converser');
+	action_converser_post();
  }
-
   redirige_par_entete($redirect, true);
 }
 ?>
diff --git a/ecrire/action/dater.php b/ecrire/action/dater.php
index fedab67111..250da02439 100644
--- a/ecrire/action/dater.php
+++ b/ecrire/action/dater.php
@@ -15,8 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@action_dater_dist
 function action_dater_dist() {
 	
-	include_spip('inc/actions');
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/documenter.php b/ecrire/action/documenter.php
index 0141b1f2a6..98fbf6676a 100644
--- a/ecrire/action/documenter.php
+++ b/ecrire/action/documenter.php
@@ -17,7 +17,7 @@ include_spip('action/supprimer');
 // http://doc.spip.org/@action_documenter_dist
 function action_documenter_dist()
 {
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/editer_article.php b/ecrire/action/editer_article.php
index 5b82bb37bc..2444079ce2 100644
--- a/ecrire/action/editer_article.php
+++ b/ecrire/action/editer_article.php
@@ -12,12 +12,11 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-include_spip('inc/actions');
 
 // http://doc.spip.org/@action_editer_article_dist
 function action_editer_article_dist() {
 
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/editer_auteurs.php b/ecrire/action/editer_auteurs.php
index bbef1cb854..7655da669e 100644
--- a/ecrire/action/editer_auteurs.php
+++ b/ecrire/action/editer_auteurs.php
@@ -13,12 +13,11 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('base/abstract_sql');
-include_spip('inc/actions');
 
 // http://doc.spip.org/@action_editer_auteurs_dist
 function action_editer_auteurs_dist() {
 	
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/editer_breve.php b/ecrire/action/editer_breve.php
index c202842e3e..4cf8d548e7 100644
--- a/ecrire/action/editer_breve.php
+++ b/ecrire/action/editer_breve.php
@@ -12,12 +12,11 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-include_spip('inc/actions');
 
 // http://doc.spip.org/@action_editer_breve_dist
 function action_editer_breve_dist() {
 
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/editer_mot.php b/ecrire/action/editer_mot.php
index 7ed52ef808..72f880ce8b 100644
--- a/ecrire/action/editer_mot.php
+++ b/ecrire/action/editer_mot.php
@@ -15,8 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@action_editer_mot_dist
 function action_editer_mot_dist() {
 
-	include_spip('inc/actions');
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/editer_rubrique.php b/ecrire/action/editer_rubrique.php
index 442ae69880..2ba0293086 100644
--- a/ecrire/action/editer_rubrique.php
+++ b/ecrire/action/editer_rubrique.php
@@ -12,13 +12,12 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-include_spip('inc/actions');
 include_spip('inc/rubriques');
 
 // http://doc.spip.org/@action_editer_rubrique_dist
 function action_editer_rubrique_dist() {
 
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/editer_signatures.php b/ecrire/action/editer_signatures.php
index fc77601ec4..993fc49cb0 100644
--- a/ecrire/action/editer_signatures.php
+++ b/ecrire/action/editer_signatures.php
@@ -12,13 +12,12 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-include_spip('inc/actions');
 
 // Modifier le reglage des forums publics de l'article x
 // http://doc.spip.org/@action_editer_signatures_dist
 function action_editer_signatures_dist()
 {
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/editer_site.php b/ecrire/action/editer_site.php
index be6d608fc3..37918111a6 100644
--- a/ecrire/action/editer_site.php
+++ b/ecrire/action/editer_site.php
@@ -12,12 +12,11 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-include_spip('inc/actions');
 
 // http://doc.spip.org/@action_editer_site_dist
 function action_editer_site_dist() {
 
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/iconifier.php b/ecrire/action/iconifier.php
index fee8d7824c..3af731f082 100644
--- a/ecrire/action/iconifier.php
+++ b/ecrire/action/iconifier.php
@@ -16,7 +16,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 function action_iconifier_dist()
 {
 	include_spip('inc/actions');
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 	$arg = _request('arg');
 	$iframe_redirect = _request('iframe_redirect');
diff --git a/ecrire/action/instituer_article.php b/ecrire/action/instituer_article.php
index 5a61d584f2..92ecd3f931 100644
--- a/ecrire/action/instituer_article.php
+++ b/ecrire/action/instituer_article.php
@@ -15,8 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@action_instituer_article_dist
 function action_instituer_article_dist() {
 
-	include_spip('inc/actions');
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/instituer_auteur.php b/ecrire/action/instituer_auteur.php
index aee5128d49..bd038ba9f4 100644
--- a/ecrire/action/instituer_auteur.php
+++ b/ecrire/action/instituer_auteur.php
@@ -15,8 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@action_instituer_auteur_dist
 function action_instituer_auteur_dist() {
 
-	include_spip('inc/actions');
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/instituer_breve.php b/ecrire/action/instituer_breve.php
index b11babd458..54f8d8a6e7 100644
--- a/ecrire/action/instituer_breve.php
+++ b/ecrire/action/instituer_breve.php
@@ -15,8 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@action_instituer_breve_dist
 function action_instituer_breve_dist() {
 
-	include_spip('inc/actions');
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/instituer_collaboration.php b/ecrire/action/instituer_collaboration.php
index c56d5274b9..c9ee8b49dd 100644
--- a/ecrire/action/instituer_collaboration.php
+++ b/ecrire/action/instituer_collaboration.php
@@ -15,8 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@action_instituer_collaboration_dist
 function action_instituer_collaboration_dist() {
 
-	include_spip('inc/actions');
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/instituer_forum.php b/ecrire/action/instituer_forum.php
index fb00e7a7a1..76bc0ab7eb 100644
--- a/ecrire/action/instituer_forum.php
+++ b/ecrire/action/instituer_forum.php
@@ -15,8 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@action_instituer_forum_dist
 function action_instituer_forum_dist() {
 
-	include_spip('inc/actions');
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/instituer_groupe_mots.php b/ecrire/action/instituer_groupe_mots.php
index 685aa5f803..d99749429a 100644
--- a/ecrire/action/instituer_groupe_mots.php
+++ b/ecrire/action/instituer_groupe_mots.php
@@ -12,14 +12,13 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-include_spip('inc/actions');
 include_spip('inc/filtres');
 include_spip('base/abstract_sql');
 
 // http://doc.spip.org/@action_instituer_groupe_mots_dist
 function action_instituer_groupe_mots_dist()
 {
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/instituer_langue_rubrique.php b/ecrire/action/instituer_langue_rubrique.php
index e0dc25453f..d84119926e 100644
--- a/ecrire/action/instituer_langue_rubrique.php
+++ b/ecrire/action/instituer_langue_rubrique.php
@@ -15,8 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@action_instituer_langue_rubrique_dist
 function action_instituer_langue_rubrique_dist() {
 
-	include_spip('inc/actions');
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/instituer_mot.php b/ecrire/action/instituer_mot.php
index 47642858c3..ffb90af76b 100644
--- a/ecrire/action/instituer_mot.php
+++ b/ecrire/action/instituer_mot.php
@@ -12,7 +12,6 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-include_spip('inc/actions');
 include_spip('inc/filtres');
 include_spip('base/abstract_sql');
 
@@ -20,7 +19,7 @@ include_spip('base/abstract_sql');
 // http://doc.spip.org/@action_instituer_mot_dist
 function action_instituer_mot_dist()
 {
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/instituer_syndic.php b/ecrire/action/instituer_syndic.php
index ea14ebe0a8..3298dffb9e 100644
--- a/ecrire/action/instituer_syndic.php
+++ b/ecrire/action/instituer_syndic.php
@@ -15,8 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@action_instituer_syndic_dist
 function action_instituer_syndic_dist() {
 
-	include_spip('inc/actions');
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/joindre.php b/ecrire/action/joindre.php
index e824dc5a8a..8852155f12 100644
--- a/ecrire/action/joindre.php
+++ b/ecrire/action/joindre.php
@@ -27,7 +27,7 @@ function action_joindre_dist()
 	  $sousaction5,
 	  $_FILES,  $HTTP_POST_FILES;
 
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$redirect = _request('redirect');
diff --git a/ecrire/action/legender.php b/ecrire/action/legender.php
index b6ad9f370d..c3384cfe51 100644
--- a/ecrire/action/legender.php
+++ b/ecrire/action/legender.php
@@ -13,7 +13,6 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/filtres');
-include_spip('inc/actions');
 
 // En Ajax on utilise GET et sinon POST.
 // De plus Ajax en POST ne remplit pas $_POST 
@@ -23,7 +22,7 @@ include_spip('inc/actions');
 // http://doc.spip.org/@action_legender_dist
 function action_legender_dist() {
 	
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/legender_auteur.php b/ecrire/action/legender_auteur.php
index fa3d84a6de..38c2d20e42 100644
--- a/ecrire/action/legender_auteur.php
+++ b/ecrire/action/legender_auteur.php
@@ -13,14 +13,13 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/filtres');
-include_spip('inc/actions');
 include_spip('inc/acces');
 include_spip('base/abstract_sql');
 
 // http://doc.spip.org/@action_legender_auteur_dist
 function action_legender_auteur_dist()
 {
-        $var_f = charger_fonction('controler_action_auteur', 'inc');
+        $var_f = charger_fonction('securiser_action', 'inc');
         $var_f();
 
         $arg = _request('arg');
diff --git a/ecrire/action/petitionner.php b/ecrire/action/petitionner.php
index 4617202027..a408fd6a74 100644
--- a/ecrire/action/petitionner.php
+++ b/ecrire/action/petitionner.php
@@ -15,10 +15,9 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@action_petitionner_dist
 function action_petitionner_dist() {
 
-	include_spip('inc/actions');
 	include_spip('inc/autoriser');
 
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/poster_forum_prive.php b/ecrire/action/poster_forum_prive.php
index 616e3d3903..9c498d117a 100644
--- a/ecrire/action/poster_forum_prive.php
+++ b/ecrire/action/poster_forum_prive.php
@@ -15,8 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@action_poster_forum_prive_dist
 function action_poster_forum_prive_dist() {
 
-	include_spip('inc/actions');
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/purger.php b/ecrire/action/purger.php
index b38b96ce97..71123a953a 100644
--- a/ecrire/action/purger.php
+++ b/ecrire/action/purger.php
@@ -15,8 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // securiser
 // http://doc.spip.org/@action_purger_dist
 function action_purger_dist()
 {
-	include_spip('inc/actions');
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/referencer_traduction.php b/ecrire/action/referencer_traduction.php
index ae3dad5082..4386626e31 100644
--- a/ecrire/action/referencer_traduction.php
+++ b/ecrire/action/referencer_traduction.php
@@ -13,12 +13,11 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/filtres');
-include_spip('inc/actions');
 
 // http://doc.spip.org/@action_referencer_traduction_dist
 function action_referencer_traduction_dist() {
 	
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/regler_moderation.php b/ecrire/action/regler_moderation.php
index 44d2cf0c3d..ea7300bfb8 100644
--- a/ecrire/action/regler_moderation.php
+++ b/ecrire/action/regler_moderation.php
@@ -16,10 +16,9 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@action_regler_moderation_dist
 function action_regler_moderation_dist()
 {
-	include_spip('inc/actions');
 	include_spip('inc/autoriser');
 
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/reorganiser.php b/ecrire/action/reorganiser.php
index 31ccbcafff..32a8deac38 100644
--- a/ecrire/action/reorganiser.php
+++ b/ecrire/action/reorganiser.php
@@ -12,7 +12,6 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-include_spip('inc/actions');
 include_spip('inc/autoriser');
 
 // http://doc.spip.org/@gerer_deplacements
@@ -40,17 +39,16 @@ function gerer_deplacements($deplacements){
 
 // http://doc.spip.org/@action_reorganiser_dist
 function action_reorganiser_dist(){
-	global $auteur_session;
-	$arg = _request('arg');
-	$hash = _request('hash');
-	$id_auteur = $auteur_session['id_auteur'];
+
+	$var_f = charger_fonction('securiser_action', 'inc');
+	$var_f();
+
+	if (_request('deplacements')!==NULL)
+		  gerer_deplacements(_request('deplacements'));
+
 	$redirect = _request('redirect');
 	if ($redirect==NULL) $redirect="";
-	include_spip("inc/actions");
-	if (verifier_action_auteur("reorganiser-$arg",$hash,$id_auteur)==TRUE) {
-		if (_request('deplacements')!==NULL)
-			gerer_deplacements(_request('deplacements'));
-	}
+
 	redirige_par_entete(str_replace("&amp;","&",urldecode($redirect)));
 }
 
diff --git a/ecrire/action/supprimer.php b/ecrire/action/supprimer.php
index 1643db848a..2f8943c9eb 100644
--- a/ecrire/action/supprimer.php
+++ b/ecrire/action/supprimer.php
@@ -14,13 +14,12 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/charsets');	# pour le nom de fichier
 include_spip('base/abstract_sql');
-include_spip('inc/actions');
 
 // Effacer un doc (et sa vignette)
 // http://doc.spip.org/@action_supprimer_dist
 function action_supprimer_dist() {
 
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/supprimer_traduction.php b/ecrire/action/supprimer_traduction.php
index 236a2efd5c..fad48a8f50 100644
--- a/ecrire/action/supprimer_traduction.php
+++ b/ecrire/action/supprimer_traduction.php
@@ -15,8 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@action_supprimer_traduction_dist
 function action_supprimer_traduction_dist() {
 
-	include_spip('inc/actions');
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/tourner.php b/ecrire/action/tourner.php
index c7093c9fdd..48029f13e4 100644
--- a/ecrire/action/tourner.php
+++ b/ecrire/action/tourner.php
@@ -14,13 +14,12 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/charsets');	# pour le nom de fichier
 include_spip('base/abstract_sql');
-include_spip('inc/actions');
 
 // http://doc.spip.org/@action_tourner_dist
 function action_tourner_dist() {
 	include_spip('inc/distant'); # pour copie_locale
 
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/action/virtualiser.php b/ecrire/action/virtualiser.php
index dd4ed55a8e..4c90d5ca8d 100644
--- a/ecrire/action/virtualiser.php
+++ b/ecrire/action/virtualiser.php
@@ -13,12 +13,11 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/filtres');
-include_spip('inc/actions');
 
 // http://doc.spip.org/@action_virtualiser_dist
 function action_virtualiser_dist() {
 
-	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f = charger_fonction('securiser_action', 'inc');
 	$var_f();
 
 	$arg = _request('arg');
diff --git a/ecrire/balise/formulaire_forum.php b/ecrire/balise/formulaire_forum.php
index 63c340eb40..8fd286d268 100644
--- a/ecrire/balise/formulaire_forum.php
+++ b/ecrire/balise/formulaire_forum.php
@@ -161,10 +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();
+		$arg = forum_fichier_tmp(join('', $ids));
 
-		include_spip('inc/actions');
-		$hash = calculer_action_auteur('ajout_forum'.join(' ', $ids).' '.$alea);
+		$securiser_action = charger_fonction('securiser_action', 'inc');
+		// on sait que cette fonction est dans le fichier associe
+		$hash = calculer_action_auteur("ajout_forum-$arg");
 
 		// Poser un cookie pour ne pas retaper les infos invariables
 		include_spip('inc/cookie');
@@ -194,7 +195,7 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 		'url' => $script, # ce sur quoi on fait le action='...'
 		'url_post' => $script_hidden, # pour les variables hidden
 		'url_site' => ($url_site ? $url_site : "http://"),
-		'alea' => $alea,
+		'arg' => $arg,
 		'hash' => $hash,
 		'nobot' => _request('nobot'),
 		'ajouter_groupe' => $ajouter_groupe,
@@ -253,10 +254,10 @@ function inclure_previsu($texte,$titre, $email_auteur, $auteur, $url_site, $nom_
 // si $afficher_texte = 'non')
 
 // http://doc.spip.org/@forum_fichier_tmp
-function forum_fichier_tmp()
+function forum_fichier_tmp($arg)
 {
 # astuce : mt_rand pour autoriser les hits simultanes
-	while (($alea = time() + @mt_rand())
+	while (($alea = time() + @mt_rand()) + intval($arg)
 	       AND @file_exists($f = _DIR_TMP."forum_$alea.lck"))
 	  {};
 	spip_touch ($f);
diff --git a/ecrire/inc/actions.php b/ecrire/inc/actions.php
index 2c1f82b8a0..bbbc4b74de 100644
--- a/ecrire/inc/actions.php
+++ b/ecrire/inc/actions.php
@@ -14,100 +14,10 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/meta');
 
-// fonction de securite appelee par les scripts de action/
-// cf fabrication des arguments dans generer_action_auteur
-
-// http://doc.spip.org/@inc_controler_action_auteur_dist
-function inc_controler_action_auteur_dist()
-{
-	$arg = _request('arg');
-	$hash = _request('hash');
-	$action = _request('action');
-
-	if (!verifier_action_auteur("$action-$arg", $hash)) {
-		include_spip('inc/minipres');
-		minipres(_T('info_acces_interdit'));
-	}
-}
-
-// http://doc.spip.org/@caracteriser_auteur
-function caracteriser_auteur() {
-	global $auteur_session;
-	static $caracterisation = array();
-
-	if ($caracterisation) return $caracterisation;
-
-	$id_auteur = $auteur_session['id_auteur'];
-	if (!$id_auteur) {
-  // si l'auteur courant n'est pas connu alors qu'il peut demander une action
-  // c'est une connexion par php_auth, on se rabat sur le cookie.
-  // S'il n'avait pas le droit de realiser cette action, le hash sera faux.
-		if (isset($_COOKIE['spip_session'])
-		AND (preg_match('/^(\d+)/',$_COOKIE['spip_session'],$r))) {
-			  return array($r[1], '');
-			  // Necessaire aux forums anonymes.
-			  // Pour le reste, ca echouera.
-		} else return array('',''); 	  
-	}
-	// Eviter l'acces SQL si le pass est connu de PHP
-
-	if ($auteur_session['pass'])
-		return $caracterisation = array($id_auteur, $auteur_session['pass']); 
-	else {
-		$t = spip_query("SELECT id_auteur, pass FROM spip_auteurs WHERE id_auteur=$id_auteur");
-		if ($t = spip_fetch_array($t))
-			return $caracterisation = array($t['id_auteur'], $t['pass']);
-		spip_log("auteur $id_auteur sans caracterisation");
-		die(_T('info_acces_interdit'));
-	}
-}
-
-// http://doc.spip.org/@_action_auteur
-function _action_auteur($action, $id_auteur, $pass, $nom_alea) {
-	return md5($action.$id_auteur.$pass .$GLOBALS['meta'][$nom_alea]);
-}
-
-// http://doc.spip.org/@calculer_action_auteur
-function calculer_action_auteur($action) {
-	list($id_auteur, $pass) = caracteriser_auteur();
-	return _action_auteur($action, $id_auteur, $pass, 'alea_ephemere');
-}
-
-// http://doc.spip.org/@verifier_action_auteur
-function verifier_action_auteur($action, $valeur) {
-	list($id_auteur, $pass) = caracteriser_auteur();
-
-	if ($valeur == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere'))
-		return true;
-	if ($valeur == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere_ancien'))
-		return true;
-	spip_log("verifier action $action $id_auteur : echec");
-	return false;
-}
-
-
-// http://doc.spip.org/@generer_action_auteur
 function generer_action_auteur($action, $arg, $redirect="", $mode=false, $att='')
 {
-	static $id_auteur=0, $pass;
-	if (!$id_auteur) {
-		list($id_auteur, $pass) =  caracteriser_auteur();
-	}
-	$hash = _action_auteur("$action-$arg", $id_auteur, $pass, 'alea_ephemere');
-	$r = rawurlencode($redirect);
-	if (!is_string($mode))
-	  return generer_url_action($action, "arg=$arg&hash=$hash" . (!$r ? '' : "&redirect=$r"), $mode);
-
-	// Attention, JS n'aime pas le melange de param GET/POST
-	return "\n<form style='margin:0px' action='" .
-		generer_url_public('') .
-		"'$att>\n\t<div>
-		<input name='hash' type='hidden' value='$hash' />
-		<input name='action' type='hidden' value='$action' />
-		<input name='arg' type='hidden' value='$arg' />" .
-		(!$r ? '' : "\n\t\t<input name='redirect' type='hidden' value='$r' />") .
-		$mode .
-		"\n\t</div>\n</form>\n";
+	$securiser_action = charger_fonction('securiser_action', 'inc');
+	return $securiser_action($action, $arg, $redirect, $mode, $att);
 }
 
 // http://doc.spip.org/@redirige_action_auteur
diff --git a/ecrire/inc/forum_insert.php b/ecrire/inc/forum_insert.php
index f8b6d35597..468cd0138e 100644
--- a/ecrire/inc/forum_insert.php
+++ b/ecrire/inc/forum_insert.php
@@ -113,28 +113,6 @@ 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($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 : '';
-}
 
 // http://doc.spip.org/@reduce_strlen
 function reduce_strlen($n, $c) 
@@ -204,8 +182,15 @@ function inc_forum_insert_dist() {
 
 	// Verifier hash securite pour les forums avec previsu
 	if ($afficher_texte <> 'non') {
-		$file = forum_insert_secure(_request('alea'), _request('hash'));
-		if (!$file) {
+
+		// simuler une action venant de l'espace public
+		// pour se conformer au a general.
+		set_request('action', 'ajout_forum');
+	        $var_f = charger_fonction('securiser_action', 'inc');
+        	$var_f();
+
+		$file = _DIR_TMP ."forum_" . preg_replace('/[^0-9]/', '', _request('arg')) .".lck";
+		if (!file_exists($file)) {
 			# ne pas tracer cette erreur, peut etre due a un double POST
 			# tracer_erreur_forum('session absente');
 			return $retour_forum; # echec silencieux du POST
diff --git a/ecrire/inc/lang.php b/ecrire/inc/lang.php
index b3f21ccef8..7ccf45f4be 100644
--- a/ecrire/inc/lang.php
+++ b/ecrire/inc/lang.php
@@ -129,7 +129,7 @@ function menu_langues($nom_select = 'var_lang', $default = '', $texte = '', $her
 		} else {
 			$cible = _DIR_RESTREINT_ABS . $lien;
 			if (_FILE_CONNECT) {
-				$lien = generer_action_auteur('cookie','var_lang_ecrire');
+			  $lien = generer_action_auteur('converser','');
 			} else $lien = generer_url_action('cookie');
 		}
 	}
diff --git a/ecrire/inc/securiser_action.php b/ecrire/inc/securiser_action.php
new file mode 100644
index 0000000000..3b50993114
--- /dev/null
+++ b/ecrire/inc/securiser_action.php
@@ -0,0 +1,111 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/meta');
+
+// interface d'appel:
+// - avec au moins un argument, construit une URL ou un formulaire securises
+// - sans argument: verifie que les param HTTP attestent de la securite
+
+function inc_securiser_action_dist($action='', $arg='', $redirect="", $mode=false, $att='')
+{
+	if ($action)
+		return securiser_action_auteur($action, $arg, $redirect, $mode, $att);
+	elseif (!verifier_action_auteur(_request('action') . '-' . _request('arg'), _request('hash'))) {
+		include_spip('inc/minipres');
+		minipres(_T('info_acces_interdit'));
+	}
+}
+
+// http://doc.spip.org/@generer_action_auteur
+function securiser_action_auteur($action, $arg, $redirect="", $mode=false, $att='')
+{
+	static $id_auteur=0, $pass;
+	if (!$id_auteur) {
+		list($id_auteur, $pass) =  caracteriser_auteur();
+	}
+	$hash = _action_auteur("$action-$arg", $id_auteur, $pass, 'alea_ephemere');
+	$r = rawurlencode($redirect);
+	if (!is_string($mode))
+	  return generer_url_action($action, "arg=$arg&hash=$hash" . (!$r ? '' : "&redirect=$r"), $mode);
+
+	// Attention, JS n'aime pas le melange de param GET/POST
+	return "\n<form style='margin:0px' action='" .
+		generer_url_public('') .
+		"'$att>\n\t<div>
+		<input name='hash' type='hidden' value='$hash' />
+		<input name='action' type='hidden' value='$action' />
+		<input name='arg' type='hidden' value='$arg' />" .
+		(!$r ? '' : "\n\t\t<input name='redirect' type='hidden' value='$r' />") .
+		$mode .
+		"\n\t</div>\n</form>\n";
+}
+
+// http://doc.spip.org/@caracteriser_auteur
+function caracteriser_auteur() {
+	global $auteur_session;
+	static $caracterisation = array();
+
+	if ($caracterisation) return $caracterisation;
+
+	$id_auteur = $auteur_session['id_auteur'];
+	if (!$id_auteur) {
+  // si l'auteur courant n'est pas connu alors qu'il peut demander une action
+  // c'est une connexion par php_auth, on se rabat sur le cookie.
+  // S'il n'avait pas le droit de realiser cette action, le hash sera faux.
+		if (isset($_COOKIE['spip_session'])
+		AND (preg_match('/^(\d+)/',$_COOKIE['spip_session'],$r))) {
+			  return array($r[1], '');
+			  // Necessaire aux forums anonymes.
+			  // Pour le reste, ca echouera.
+		} else return array('',''); 	  
+	}
+	// Eviter l'acces SQL si le pass est connu de PHP
+
+	if ($auteur_session['pass'])
+		return $caracterisation = array($id_auteur, $auteur_session['pass']); 
+	else {
+		$t = spip_query("SELECT id_auteur, pass FROM spip_auteurs WHERE id_auteur=$id_auteur");
+		if ($t = spip_fetch_array($t))
+			return $caracterisation = array($t['id_auteur'], $t['pass']);
+		spip_log("auteur $id_auteur sans caracterisation");
+		die(_T('info_acces_interdit'));
+	}
+}
+
+// http://doc.spip.org/@_action_auteur
+function _action_auteur($action, $id_auteur, $pass, $nom_alea) {
+	return md5($action.$id_auteur.$pass .$GLOBALS['meta'][$nom_alea]);
+}
+
+// http://doc.spip.org/@calculer_action_auteur
+function calculer_action_auteur($action) {
+	list($id_auteur, $pass) = caracteriser_auteur();
+	return _action_auteur($action, $id_auteur, $pass, 'alea_ephemere');
+}
+
+// http://doc.spip.org/@verifier_action_auteur
+function verifier_action_auteur($action, $valeur) {
+	list($id_auteur, $pass) = caracteriser_auteur();
+
+	if ($valeur == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere'))
+		return true;
+	if ($valeur == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere_ancien'))
+		return true;
+	spip_log("verifier action $action $id_auteur : echec");
+	return false;
+}
+
+
+?>
\ No newline at end of file
diff --git a/spip.php b/spip.php
index 665e940a09..e8300e1eae 100644
--- a/spip.php
+++ b/spip.php
@@ -15,8 +15,10 @@
 include_once _DIR_RESTREINT_ABS.'inc_version.php';
 
 # rediriger les anciens URLs de la forme page.php3fond=xxx
-if (isset($_GET['fond']))
+if (isset($_GET['fond'])) {
+	include_spip('inc/headers');
 	redirige_par_entete(generer_url_public($_GET['fond']));
+ }
 
 # au travail...
 include _DIR_RESTREINT_ABS.'public.php';
-- 
GitLab