From 6b956a53d8408ce379dfc8f5741bce3209b9f1d1 Mon Sep 17 00:00:00 2001
From: Antoine Pitrou <pitrou@free.fr>
Date: Fri, 7 Jun 2002 13:28:01 +0000
Subject: [PATCH] =?UTF-8?q?-=20syst=C3=A8me=20de=20sessions=20r=C3=A9?=
 =?UTF-8?q?=C3=A9crit=20avec=20un=20fichier=20par=20session.=20-=20suppres?=
 =?UTF-8?q?sion=20de=20cookie=20qui=20marche=20sous=20mozilla=20(rawurlenc?=
 =?UTF-8?q?ode).?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/inc_auth.php3    |  57 +++++++++--------
 ecrire/inc_session.php3 | 133 +++++++++++++++++++++++++++++++++++-----
 ecrire/index.php3       |   2 +-
 ecrire/login.php3       |   4 +-
 inc-public.php3         |  37 +++++------
 spip_cookie.php3        |  65 ++++++++++----------
 6 files changed, 198 insertions(+), 100 deletions(-)

diff --git a/ecrire/inc_auth.php3 b/ecrire/inc_auth.php3
index 871cf8b17c..c8148eaa43 100644
--- a/ecrire/inc_auth.php3
+++ b/ecrire/inc_auth.php3
@@ -54,6 +54,8 @@ function auth() {
 	global $connect_activer_imessage, $connect_activer_messagerie;
 	global $connect_statut, $connect_toutes_rubriques, $connect_id_rubrique;
 
+	global $auteur_session;
+
 	//
 	// Si pas MySQL, fini
 	//
@@ -76,47 +78,44 @@ function auth() {
 	$auth_pass_ok = false;
 	$auth_can_disconnect = false;
 	$auth_htaccess = false;
-	if ($HTTP_GET_VARS["REMOTE_USER"] || $HTTP_POST_VARS["REMOTE_USER"] || $HTTP_COOKIE_VARS["REMOTE_USER"]) {
-		ask_php_auth($auth_text_failure);
-	}
-	else $auth_login = $REMOTE_USER;
 
 	//
 	// Recuperer les donnees d'identification
 	//
 
-	// cookie de session ?
-	if ($cookie_session = $HTTP_COOKIE_VARS['spip_session']) {
+	// Authentification .htaccess
+	if ($REMOTE_USER &&
+		!($HTTP_GET_VARS["REMOTE_USER"] || $HTTP_POST_VARS["REMOTE_USER"] || $HTTP_COOKIE_VARS["REMOTE_USER"])) {
+		$auth_login = $REMOTE_USER;
+		$auth_pass_ok = true;
+		$auth_htaccess = true;
+	}
+	// Authentification session
+	else if ($cookie_session = $HTTP_COOKIE_VARS['spip_session']) {
+		include_local ("inc_meta.php3");
 		include_local ("inc_session.php3");
-		if ($visiteur = verifie_cookie_session ($cookie_session)) {
-			if ($visiteur->statut == '0minirezo' OR $visiteur->statut == '1comite') {
-				$session_login = $visiteur->login;
+		if (verifier_session($cookie_session)) {
+			if ($auteur_session['statut'] == '0minirezo' OR $auteur_session['statut'] == '1comite') {
+				$auth_login = $auteur_session['login'];
+				$auth_pass_ok = true;
+				$auth_can_disconnect = true;
+				if ($GLOBALS['logout'] == $auth_login) {
+					@header("Location: ../spip_cookie.php3?cookie_session=non&redirect=".rawurlencode("./ecrire/login.php3"));
+					exit;
+				}
 			}
 		}
 	}
-	// demander cookie de session - sauf si authentification via .htaccess
-	if ((! $session_login) AND (! $auth_login)) {
-		@header ("Location: ./login.php3");
+
+	// Si pas authentifie, demander login / mdp
+	if (!$auth_login) {
+		@header("Location: ./login.php3");
 		exit;
 	}
 
-	// si on a un cookie de session
-	if ($session_login) {
-		$auth_login = $session_login;
-		$auth_pass_ok = true;
-		$auth_can_disconnect = true;
-		if ($GLOBALS['logout'] == $auth_login) {
-			@header("Location: ../spip_cookie.php3?cookie_session=-1&redirect=./ecrire/login.php3");
-			exit;
-		}
-	} else
 
-	// un .htaccess
-	if ($auth_login) {
-		$auth_pass_ok = true;
-		$auth_htaccess = true;
-	}
-	else if (($GLOBALS['logout'] == $PHP_AUTH_USER) || !$PHP_AUTH_USER) {
+
+/*	else if (($GLOBALS['logout'] == $PHP_AUTH_USER) || !$PHP_AUTH_USER) {
 		ask_php_auth($auth_text_failure);
 	}
 	else {
@@ -127,7 +126,7 @@ function auth() {
 		$PHP_AUTH_PW = '';
 		$_SERVER['PHP_AUTH_PW'] = '';
 		$HTTP_SERVER_VARS['PHP_AUTH_PW'] = '';
-	}
+	}*/
 
 	//
 	// Chercher le login dans la table auteurs
diff --git a/ecrire/inc_session.php3 b/ecrire/inc_session.php3
index da961112f4..faa4510ce5 100644
--- a/ecrire/inc_session.php3
+++ b/ecrire/inc_session.php3
@@ -1,4 +1,9 @@
 <?php
+//
+// Ce fichier ne sera execute qu'une fois
+if (defined("_ECRIRE_INC_SESSION")) return;
+define("_ECRIRE_INC_SESSION", "1");
+
 
 /*
  * Gestion de l'authentification par sessions
@@ -7,11 +12,7 @@
  *
  */
 
-//
-// Ce fichier ne sera execute qu'une fois
-if (defined("_ECRIRE_INC_SESSION")) return;
-define("_ECRIRE_INC_SESSION", "1");
-srand((double) microtime() * 1000000); // une fois et une seule par script
+$GLOBALS['auteur_session'] = '';
 
 
 // un truc le plus unique possible mais constant brouteur + numero ip
@@ -19,9 +20,112 @@ function md5_brouteur() {
 	return md5(getenv('HTTP_USER_AGENT'));
 }
 
+
+//
+// Calcule le nom du fichier session
+//
+function fichier_session($id_session, $alea) {
+	$fichier_session = 'session_'.md5($id_session.' '.$alea).'.php3';
+	$fichier_session = 'data/'.$fichier_session;
+	if (!$GLOBALS['flag_ecrire']) $fichier_session = 'ecrire/'.$fichier_session;
+	return $fichier_session;
+}
+
+//
+// Effacer toutes les sessions crees il y a plus de 48 heures
+// (de toute facon invalides car l'alea est expire)
+//
+function nettoyer_sessions() {
+	$dir = 'data';
+	if (!$GLOBALS['flag_ecrire']) $dir = 'ecrire/'.$dir;
+	$handle = opendir($dir);
+	$t = time();
+	while (($fichier = readdir($handle)) != '') {
+		if (!eregi("^session_[0-9a-f].php3?$", $fichier)) continue;
+		$chemin = "$dir/$fichier";
+		if (($t - filemtime($chemin)) > 48 * 3600) {
+			@unlink($chemin);
+		}
+	}
+	closedir($handle);
+}
+
+//
+// Ajouter une session pour l'auteur specifie
+//
+function ajouter_session($auteur, $id_session) {
+	nettoyer_sessions();
+	$fichier_session = fichier_session($id_session, lire_meta('alea_ephemere'));
+	$vars = array('id_auteur', 'nom', 'login', 'email', 'statut', 'brouteur');
+
+	$texte = "<"."?php\n";
+	reset($vars);
+	while (list(, $var) = each($vars)) {
+		$texte .= "\$GLOBALS['auteur_session']['$var'] = '".addslashes($auteur[$var])."';\n";
+	}
+	$texte .= "?".">";
+	if ($f = fopen($fichier_session, "wb")) {
+		fputs($f, $texte);
+ 		fclose($f);
+	}
+}
+
+//
+// Verifier et inclure une session
+//
+function verifier_session($id_session) {
+	// Tester avec alea courant
+	$fichier_session = fichier_session($id_session, lire_meta('alea_ephemere'));
+	if (file_exists($fichier_session)) {
+		include($fichier_session);
+		return true;
+	}
+	// Sinon, tester avec alea precedent
+	$fichier_session = fichier_session($id_session, lire_meta('alea_ephemere_ancien'));
+	if (file_exists($fichier_session)) {
+		// Renouveler la session (avec l'alea courant)
+		include($fichier_session);
+		supprimer_session($id_session);
+		ajouter_session($GLOBALS['auteur_session'], $id_session);
+		return true;
+	}
+	return false;
+}
+
+//
+// Supprimer une session
+//
+function supprimer_session($id_session) {
+	$fichier_session = fichier_session($id_session, lire_meta('alea_ephemere'));
+	if (file_exists($fichier_session)) {
+		@unlink($fichier_session);
+	}
+	$fichier_session = fichier_session($id_session, lire_meta('alea_ephemere_ancien'));
+	if (file_exists($fichier_session)) {
+		@unlink($fichier_session);
+	}
+}
+
+//
+// Creer une session et retourne le cookie correspondant (a poser)
+//
+function creer_cookie_session($auteur) {
+	if ($id_auteur = $auteur['id_auteur']) {
+		$seed = (double) (microtime() + 1) * time();
+		if ($GLOBALS['flag_mt_rand']) mt_srand($seed);
+		srand($seed);
+		if ($flag_mt_rand) $s = mt_rand();
+		if (!$s) $s = rand();
+		$id_session = md5(uniqid($s));
+		ajouter_session($auteur, $id_session);
+		return $id_session;
+	}
+}
+
+
 // Ajoute une session dans le cache des sessions
 // ou supprimer toute session de cet auteur si $session == false
-function ajouter_session($auteur, $session) {
+/*function ajouter_session($auteur, $session) {
 
 	if (file_exists ('ecrire/inc_sessions_cache.php3')) {
 		include ('ecrire/inc_sessions_cache.php3');
@@ -59,28 +163,28 @@ function ajouter_session($auteur, $session) {
 		fputs($myFile, $texte);
  		fclose($myFile);
 	}
-}
+}*/
 
 // cree le cookie correspondant a l'auteur
 // attention aux trous de securite ;)
-function cree_cookie_session ($auteur) {
+/*function cree_cookie_session ($auteur) {
 	if ($auteur->id_auteur > 0) {
 		$session = md5(rand()); // numero de session
 		ajouter_session($auteur, $session);
 		$cookie = $auteur->id_auteur ."@". $auteur->login ."@". $session;
 		return $cookie;
 	}
-}
+}*/
 
 // cree le cookie admin correspondant a l'auteur
-function cree_cookie_admin ($auteur) {
+/*function cree_cookie_admin ($auteur) {
 	if ($auteur->id_auteur > 0) {
 		$cookie = $auteur->id_auteur ."@". $auteur->login ."@". $auteur->nom ."@". $auteur->email;
 		return $cookie;
 	}
-}
+}*/
 
-function verifie_cookie_session ($cookie) {
+/*function verifie_cookie_session ($cookie) {
 	if ((list(,$id,$login,$session) = decode_cookie_session ($cookie)) AND ($id > 0)) {
 		if (file_exists ('ecrire/inc_sessions_cache.php3')) {
 			include ('ecrire/inc_sessions_cache.php3');
@@ -108,8 +212,9 @@ function decode_cookie_session ($cookie) {
 	return $regs;
 	// list(,$id_auteur,$login,$session) = decode_cookie_session($cookie)
 }
+*/
 
-function pose_cookie_session ($cookie_session, $cookie_admin='') {
+/*function pose_cookie_session ($cookie_session, $cookie_admin='') {
 	global $redirect;
 	$cookie_pose = false;
 
@@ -152,7 +257,7 @@ function supprime_cookie_session () {
 	}
 	setcookie ('spip_session', '', time() - 24*3600);
 	setcookie ('spip_admin', '', time() - 24*3600);
-}
+}*/
 
 
 // $login est optionnel
diff --git a/ecrire/index.php3 b/ecrire/index.php3
index 6fd22d5bc7..e3e5a78ee4 100644
--- a/ecrire/index.php3
+++ b/ecrire/index.php3
@@ -118,7 +118,7 @@ if ($connect_statut == "0minirezo" AND $cookie_admin) {
 	echo "<hr>";
 	echo "<font face='Verdana,Arial,Helvetica,sans-serif' size=1>";
 	echo "<img src='img_pack/triangle.gif' width=16 height=14 border=0>";
-	echo " <a href='../spip_cookie.php3?cookie_admin=-1&redirect=./ecrire/index.php3'><B>SUPPRIMER LE COOKIE</B></A>";
+	echo " <a href='../spip_cookie.php3?cookie_admin=non&redirect=".rawurlencode("./ecrire/index.php3")."'><B>SUPPRIMER LE COOKIE</B></A>";
 		echo aide ("cookie");
 	echo "</font>";
 }
diff --git a/ecrire/login.php3 b/ecrire/login.php3
index 15ce5656fc..3f36b021e1 100644
--- a/ecrire/login.php3
+++ b/ecrire/login.php3
@@ -14,9 +14,9 @@
 	$url_site = lire_meta('adresse_site');
 
 	// deja connecte
-	if (($session = $GLOBALS['HTTP_COOKIE_VARS']['spip_session']) && $auteur = verifie_cookie_session($session)) {
+/*	if (($session = $GLOBALS['HTTP_COOKIE_VARS']['spip_session']) && $auteur = verifie_cookie_session($session)) {
 		$connecte = true;
-	}
+	}*/
 
 	install_debut_html("$nom_site : connexion &agrave; l'espace priv&eacute;");
 
diff --git a/inc-public.php3 b/inc-public.php3
index e8c2b6e764..2319e97dbe 100644
--- a/inc-public.php3
+++ b/inc-public.php3
@@ -40,14 +40,7 @@ include ("ecrire/inc_version.php3");
 include_local ("inc-cache.php3");
 
 
-//
-// Presence du cookie de visiteur : valider ce cookie et extraire les donnees
-//
-if ($cookie = $HTTP_COOKIE_VARS['spip_session']) {
-	include_ecrire ("inc_session.php3");
-	if ($visiteur = verifie_cookie_session ($cookie))
-		$visiteur->authentifie = true;
-} else {
+/* else {
 	$visiteur = false;
 	if (ereg("^([0-9]+)@([^@]+)", $HTTP_COOKIE_VARS['spip_admin'], $regs)) {
 		// definir $visiteur a partir du cookie
@@ -60,7 +53,7 @@ if ($cookie = $HTTP_COOKIE_VARS['spip_session']) {
 			$visiteur->htpass = '';
 		}
 	}
-}
+}*/
 
 //
 // Ajouter un forum
@@ -87,18 +80,22 @@ $chemin_cache = "CACHE/".$fichier_cache;
 $use_cache = utiliser_cache($chemin_cache, $delais);
 
 
-if ($use_cache) {
-	if (file_exists("ecrire/inc_meta_cache.php3")) {
-		include_ecrire("inc_meta_cache.php3");
-	}
-	else {
-		include_ecrire("inc_connect.php3");
-		include_ecrire("inc_meta.php3");
-	}
+if ($use_cache AND file_exists("ecrire/inc_meta_cache.php3")) {
+	include_ecrire("inc_meta_cache.php3");
 }
 else {
+	include_ecrire("inc_connect.php3");
+	include_ecrire("inc_meta.php3");
+}
+
+if ($cookie = $HTTP_COOKIE_VARS['spip_session']) {
+	include_ecrire ("inc_session.php3");
+	verifier_session($cookie);
+}
+
+
+if (!$use_cache) {
 	$lastmodified = time();
-	include_local ("ecrire/inc_meta.php3");
 	if (($lastmodified - lire_meta('date_purge_cache')) > 24 * 3600) {
 		ecrire_meta('date_purge_cache', $lastmodified);
 		$f = fopen('CACHE/.purge', 'w');
@@ -301,10 +298,10 @@ function bouton($titre, $lien) {
 
 
 //
-// Fonctionnalites administrateur (declenchees par le cookie visiteur, authentifie ou non)
+// Fonctionnalites administrateur (declenchees par le cookie admin, authentifie ou non)
 //
 
-if ((($HTTP_COOKIE_VARS['spip_admin'] == 'oui') OR ($visiteur->statut == '0minirezo') OR ($visiteur->statut == '1comite')) AND !$flag_preserver) {
+if (($HTTP_COOKIE_VARS['spip_admin'] == 'admin' OR ($auteur_session['statut'] == '0minirezo')) AND !$flag_preserver) {
 	if ($id_article) {
 		bouton("Modifier cet article ($id_article)", "./ecrire/articles.php3?id_article=$id_article");
 	}
diff --git a/spip_cookie.php3 b/spip_cookie.php3
index b0486772f6..36d5527dc4 100644
--- a/spip_cookie.php3
+++ b/spip_cookie.php3
@@ -1,44 +1,41 @@
 <?php
 
-	include ("ecrire/inc_version.php3");
-	include_ecrire ("inc_connect.php3");
-	include_ecrire ("inc_session.php3");
-
-
-	// tentative de login
-	if ($session_login !='' AND $session_password != '')
-	{
-		// verifie l'auteur
-		$md5pass = md5($session_password);
-		$query = "SELECT * FROM spip_auteurs WHERE login='$session_login' AND pass='$md5pass'";
-		$result = spip_query($query);
-
-		if ($auteur = mysql_fetch_object($result)) {
-			$cookie_session = cree_cookie_session ($auteur);
-			$cookie_admin = cree_cookie_admin ($auteur);
-		}
+include ("ecrire/inc_version.php3");
+include_ecrire ("inc_connect.php3");
+include_ecrire ("inc_meta.php3");
+include_ecrire ("inc_session.php3");
+
+
+// tentative de login
+if ($cookie_session == "non") {
+	supprimer_session($spip_session);
+	setcookie('spip_session', $spip_session, time() - 3600 * 24);
+}
+else if ($session_login != '' AND $session_password != '') {
+	// verifie l'auteur
+	$md5pass = md5($session_password);
+	$query = "SELECT * FROM spip_auteurs WHERE login='$session_login' AND pass='$md5pass'";
+	$result = spip_query($query);
+
+	if ($row_auteur = mysql_fetch_array($result)) {
+		$cookie_session = creer_cookie_session($row_auteur);
+		setcookie('spip_session', $cookie_session, time() + 3600 * 24 * 7);
 	}
+}
 
 
-	// un cookie de session a poser
-	if ($cookie_session == -1)
-		supprime_cookie_session();
-	else if ($cookie_session)
-		pose_cookie_session($cookie_session, $cookie_admin);
+// cookie d'admin ?
+if ($cookie_admin == "oui") {
+	setcookie('spip_admin', 'admin', time() + 3600 * 24 * 7);
+}
+else if ($cookie_admin == "non") {
+	setcookie('spip_admin', $spip_admin, time() - 3600 * 24);
+}
 
 
-	// cookie d'admin ?
-	if ($cookie_admin == "oui") {
-		setcookie('spip_admin', 'admin', time() + 3600 * 24 * 7);
-	} else if ($cookie_admin == -1) {
-		setcookie('spip_admin', '', time() - 3600 * 24 * 7);
-	}
-
-
-	// redirection
-	if (!$redirect)
-		$redirect = './index.php3';
+// redirection
+if (!$redirect) $redirect = './index.php3';
 
-	@header("Location: $redirect");
+@header("Location: $redirect");
 
 ?>
\ No newline at end of file
-- 
GitLab