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 à l'espace privé"); 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