From 18a0dce608f58a62a17553f85a7b2734b0b5c416 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Sat, 23 Sep 2006 08:20:16 +0000
Subject: [PATCH] =?UTF-8?q?Acc=C3=A8s=20interdits=20excessif=20depuis=20le?=
 =?UTF-8?q?=20renforcement=20de=20s=C3=A9curit=C3=A9:?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- en PHP_AUTH (dont LDAP) il faut forcer la récréation du fichier de session quand il n'est plus compatible avec le cookie;

- le id_auteur retiré de l'URL lors de [7329] était en fait encore nécessaire pour le mode PHP_AUTH lors d'une action (car il n'y a pas forcément un .htacces au niveau du répertoire public); mais il sufit de se rabattre sur le cookie, ce qui est d'ailleurs beaucoup plus sécurisé qu'auparavant;

- et enfin il est normal que le id_auteur soit vide pour les forums anonymes.
---
 ecrire/inc/actions.php | 42 +++++++++++++++++++++++++++++-------------
 ecrire/inc/auth.php    |  8 +++++---
 2 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/ecrire/inc/actions.php b/ecrire/inc/actions.php
index 2d99c50484..7f5dd790c0 100644
--- a/ecrire/inc/actions.php
+++ b/ecrire/inc/actions.php
@@ -23,27 +23,42 @@ function inc_controler_action_auteur_dist()
 	$arg = _request('arg');
 	$hash = _request('hash');
 	$action = _request('action');
-	$id_auteur = $GLOBALS['auteur_session']['id_auteur'];
 
-	if (!verifier_action_auteur("$action-$arg", $hash, $id_auteur)) {
+	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($id_auteur=0) {
+function caracteriser_auteur() {
 	global $auteur_session;
-	if (!$id_auteur = intval($id_auteur))
-		$id_auteur = $auteur_session['id_auteur'];
+	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 array($id_auteur, $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)) die(_L("Faut pas se gener"));
-		return array($t['id_auteur'], $t['pass']);
+		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'));
 	}
 }
 
@@ -53,14 +68,14 @@ function _action_auteur($action, $id_auteur, $pass, $nom_alea) {
 }
 
 // http://doc.spip.org/@calculer_action_auteur
-function calculer_action_auteur($action, $id_auteur = 0) {
-	list($id_auteur, $pass) = caracteriser_auteur($id_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, $id_auteur = 0) {
-	list($id_auteur, $pass) = caracteriser_auteur($id_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;
@@ -226,7 +241,8 @@ function verifier_php_auth() {
 			}
 		  }
 		}
-	}
+	} 
+	return false;
 }
 
 //
diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php
index 540f14d634..571df92098 100644
--- a/ecrire/inc/auth.php
+++ b/ecrire/inc/auth.php
@@ -43,7 +43,9 @@ function acces_mots() {
 // http://doc.spip.org/@acces_article
 function acces_article($id_article)
 {
-	global $connect_id_auteur;
+	global $connect_id_auteur, $connect_toutes_rubriques;
+
+	if ($connect_toutes_rubriques) return true;
 
 	$row = spip_fetch_array(spip_query("SELECT id_rubrique, statut FROM spip_articles WHERE id_article=$id_article"));
 
@@ -120,10 +122,10 @@ function inc_auth_dist() {
 		$var_f = charger_fonction('session', 'inc');
 		if ($connect_id_auteur = $var_f()) {
 			$auth_can_disconnect = true;
-		}
+		} else unset($_COOKIE['spip_session']);
 	}
 	
-	// sinon, essayer auth http si significatif
+	// Essayer auth http si significatif
 	// (ignorer les login d'intranet independants de spip)
 	if (!$ignore_auth_http AND !$connect_id_auteur) {
 		if ($_SERVER['PHP_AUTH_USER'] AND $_SERVER['PHP_AUTH_PW']) {
-- 
GitLab