From fc992ad8821938f1a870da62569e35e5a47c9cb0 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Sun, 23 Jul 2006 14:53:38 +0000
Subject: [PATCH] =?UTF-8?q?L'action=20=20logout=20explicite=20est=20=C3=A0?=
 =?UTF-8?q?=20pr=C3=A9sent=20assur=C3=A9e=20par=20un=20script=20ind=C3=A9p?=
 =?UTF-8?q?endant=20de=20action/cookie.php=20afin=20d'en=20permettre=20fac?=
 =?UTF-8?q?ilement=20la=20surcharge=20(par=20exemple:=20m=C3=A9nage=20?=
 =?UTF-8?q?=C3=A0=20la=20deconnexion)=20et=20d'=C3=A9viter=20l'ambiguit?=
 =?UTF-8?q?=C3=A9=20de=20son=20argument=20(logout=3Dconnect=5Flogin)=20don?=
 =?UTF-8?q?t=20la=20valeur=20n'=C3=A9tait=20en=20fait=20pas=20significativ?=
 =?UTF-8?q?e.=20Quant=20au=20cookie=20rajout=C3=A9=20au=20mode=20PHP=5FAUT?=
 =?UTF-8?q?H,=20bien=20que=20pos=C3=A9=20au=20niveau=20de=20ecrire/=20il?=
 =?UTF-8?q?=20doit=20concerner=20tout=20le=20site.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitattributes               |  1 +
 ecrire/action/cookie.php     | 54 ++++++++----------------------------
 ecrire/action/logout.php     | 50 +++++++++++++++++++++++++++++++++
 ecrire/balise/url_logout.php |  6 ++--
 ecrire/inc/auth.php          | 12 ++++----
 ecrire/inc/presentation.php  | 11 +++++---
 6 files changed, 78 insertions(+), 56 deletions(-)
 create mode 100644 ecrire/action/logout.php

diff --git a/.gitattributes b/.gitattributes
index 89d3d8407c..a392cdd353 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -22,6 +22,7 @@ ecrire/action/ical.php -text
 ecrire/action/iconifier.php -text
 ecrire/action/instituer.php -text
 ecrire/action/joindre.php -text
+ecrire/action/logout.php -text
 ecrire/action/purger.php -text
 ecrire/action/redirect.php -text
 ecrire/action/supprimer.php -text
diff --git a/ecrire/action/cookie.php b/ecrire/action/cookie.php
index 8931162dcd..2ca4e20f2d 100644
--- a/ecrire/action/cookie.php
+++ b/ecrire/action/cookie.php
@@ -16,24 +16,17 @@ function action_cookie_dist() {
 	action_spip_cookie_dist();
 }
 
-function auth_http($url, $essai_auth_http) {
-	global $_SERVER;
-	if ($essai_auth_http == 'oui') {
-		if (verifier_php_auth())
-			redirige_par_entete($url);
-		else {
-			ask_php_auth(_T('login_connexion_refusee'),
-			_T('login_login_pass_incorrect'), _T('login_retour_site'),
-			"url=".rawurlencode($url), _T('login_nouvelle_tentative'),
-			(ereg(_DIR_RESTREINT_ABS, $url)));
-			exit;
-		}
-	}
-	// si demande logout auth_http
-	else if ($essai_auth_http == 'logout') {
-		ask_php_auth(_T('login_deconnexion_ok'),
-		_T('login_verifiez_navigateur'), _T('login_retour_public'),
-		"redirect="._DIR_RESTREINT_ABS, _T('login_test_navigateur'), true);
+function auth_http($url) {
+
+	if (verifier_php_auth())
+		redirige_par_entete($url);
+	else {
+		ask_php_auth(_T('login_connexion_refusee'),
+			     _T('login_login_pass_incorrect'),
+			     _T('login_retour_site'),
+			     "url=".rawurlencode($url),
+			     _T('login_nouvelle_tentative'),
+			     (ereg(_DIR_RESTREINT_ABS, $url)));
 		exit;
 	}
 }
@@ -80,31 +73,6 @@ if ($essai_auth_http AND !$ignore_auth_http) {
 	exit;
 }
 
-// cas particulier, logout dans l'espace public
-if ($logout_public) {
-	$logout = $logout_public;
-	if (!$url)  $url = $GLOBALS['meta']['adresse_site'];
- }
-// tentative de logout
-if ($logout) {
-	if ($auteur_session['login'] == $logout) { // init verifier_visiteur
-		spip_query("UPDATE spip_auteurs SET en_ligne = DATE_SUB(NOW(),INTERVAL 15 MINUTE) WHERE id_auteur = ".$auteur_session['id_auteur']);
-		if ($spip_session) {
-			$var_f = charger_fonction('session', 'inc');
-			$var_f($auteur_session['id_auteur']);
-		}
-		
-		if ($_SERVER['PHP_AUTH_USER']
-		AND !$ignore_auth_http
-		AND verifier_php_auth()) {
-			auth_http(($url ? $url : _DIR_RESTREINT_ABS), 'logout');
-		}
-	}
-	spip_log("logout: $logout");
-	spip_setcookie('spip_session', '', 0);
-	redirige_par_entete($url ? $url : generer_url_public('login'));
-}
-
 // en cas de login sur bonjour=oui, on tente de poser un cookie
 // puis de passer au login qui diagnostiquera l'echec de cookie
 // le cas echeant.
diff --git a/ecrire/action/logout.php b/ecrire/action/logout.php
new file mode 100644
index 0000000000..c6d5e2ae2b
--- /dev/null
+++ b/ecrire/action/logout.php
@@ -0,0 +1,50 @@
+<?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');
+
+function action_logout_dist()
+{
+	global $auteur_session, $ignore_auth_httpa;
+	$logout =_request('logout');
+	$url = _request('url');
+	spip_log("logout $logout $url" . $auteur_session['id_auteur']);
+// cas particulier, logout dans l'espace public
+	if ($logout='public' AND !$url)  $url = $GLOBALS['meta']['adresse_site'];
+
+// seul le loge peut se deloger
+	if ($auteur_session['id_auteur']) {
+		spip_query("UPDATE spip_auteurs SET en_ligne = DATE_SUB(NOW(),INTERVAL 15 MINUTE) WHERE id_auteur = ".$auteur_session['id_auteur']);
+	// le logout explicite vaut destruction de toutes les sessions
+		if ($_COOKIE['spip_session']) {
+			$var_f = charger_fonction('session', 'inc');
+			$var_f($auteur_session['id_auteur']);
+			spip_setcookie('spip_session', '', 0);
+		}
+		if ($_SERVER['PHP_AUTH_USER'] AND !$ignore_auth_http) {
+			include_spip('inc/actions');
+			if (verifier_php_auth()) {
+			  ask_php_auth(_T('login_deconnexion_ok'),
+				       _T('login_verifiez_navigateur'),
+				       _T('login_retour_public'),
+				       	"redirect=". _DIR_RESTREINT_ABS, 
+				       _T('login_test_navigateur'),
+				       true);
+			  exit;
+			}
+		}
+	}
+	redirige_par_entete($url ? $url : generer_url_public('login'));
+}
+?>
diff --git a/ecrire/balise/url_logout.php b/ecrire/balise/url_logout.php
index 7ec3fbfde4..39d2163d12 100644
--- a/ecrire/balise/url_logout.php
+++ b/ecrire/balise/url_logout.php
@@ -21,11 +21,9 @@ function balise_URL_LOGOUT_stat ($args, $filtres) {
 }
 
 function balise_URL_LOGOUT_dyn($cible) {
-	if (!$login = rawurlencode($GLOBALS['auteur_session']['login']))
-		return '';
 
-	if (!$cible) $cible = self();
+	if (!$GLOBALS['auteur_session']['login']) return '';
 
-	return generer_url_public('spip_cookie',"logout_public=$login&url=" . rawurlencode($cible));
+	return generer_url_action('logout',"logout=public&url=" . rawurlencode($cible ? $cible : self()));
 }
 ?>
diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php
index e0fd0786e1..d7833ab0f6 100644
--- a/ecrire/inc/auth.php
+++ b/ecrire/inc/auth.php
@@ -154,8 +154,12 @@ function inc_auth_dist() {
 	// pour permettre les connexions multiples
 	if (!$_COOKIE['spip_session']) {
 		$var_f = charger_fonction('session', 'inc');
-		if ($session = $var_f($row))
-			spip_setcookie('spip_session', $session, time() + 3600 * 24 * 14);
+		if ($session = $var_f($row)) {
+			preg_match(',^[^/]*//[^/]*(.*)$,',
+				   $GLOBALS['meta']['adresse_site'],
+				   $r);
+			spip_setcookie('spip_session', $session, time() + 3600 * 24 * 14, $r[1]);
+		}
 	}
 
 	// ceci n'arrive qu'a la premiere connexion il me semble
@@ -200,7 +204,5 @@ function auth_arefaire()
 	$url = rawurlencode(str_replace('/./', '/',
 			(_DIR_RESTREINT ? "" : _DIR_RESTREINT_ABS) . str_replace('&amp;', '&', self()))); 
 	return generer_url_public('login', "url=$url" . ($_GET['bonjour'] == 'oui' ? '&var_echec_cookie=true' : ''),true);
-	  }
-
-
+}
 ?>
diff --git a/ecrire/inc/presentation.php b/ecrire/inc/presentation.php
index 3b592fdc43..36192f450b 100644
--- a/ecrire/inc/presentation.php
+++ b/ecrire/inc/presentation.php
@@ -2289,9 +2289,12 @@ if (true /*$bandeau_colore*/) {
 
 		echo "<td class='bandeau_couleur' style='text-align: $spip_lang_right; width: 28px;' valign='middle'>";
 
-			if ($auth_can_disconnect) {	
-				echo "<a href='" . generer_url_public("spip_cookie","logout=$connect_login") . "' class='icone26' onmouseover=\"changestyle('bandeaudeconnecter','visibility', 'visible');\">" .
-				  http_img_pack("deconnecter-24.gif", "", "") . "</a>";
+		if ($auth_can_disconnect) {
+			echo "<a href='",
+			  generer_url_action("logout","logout=prive"),
+			  "' class='icone26' onmouseover=\"changestyle('bandeaudeconnecter','visibility', 'visible');\">",
+			  http_img_pack("deconnecter-24.gif", "", ""),
+			  "</a>";
 			}
 		echo "</td>";
 	
@@ -2525,7 +2528,7 @@ function bandeau_gadgets($largeur, $simple, $id_rubrique)
 	
 		// Deconnection
 	echo "<div class='bandeau_couleur_sous' id='bandeaudeconnecter' style='$spip_lang_right: 0px;'>";
-	echo "<a href='" . generer_url_public("spip_cookie","logout=$connect_login") . "' class='lien_sous'>"._T('icone_deconnecter')."</a>".aide("deconnect");
+	echo "<a href='" . generer_url_action("logout","logout=prive") . "' class='lien_sous'>"._T('icone_deconnecter')."</a>".aide("deconnect");
 	echo "</div>";
 	
 	$decal = 0;
-- 
GitLab