X-Git-Url: https://git.cyclocoop.org/?a=blobdiff_plain;f=www%2Fecrire%2Finc%2Fsession.php;fp=www%2Fecrire%2Finc%2Fsession.php;h=97067cef4034620870446281f66529ae37573c78;hb=d18fcb8f27a4016e3fa7b50a9b2255d529dca543;hp=1a94d1796c30286b8363feb0681a587c228c94f8;hpb=e847eea4a82a7396dd0abf860f9b30d654f38629;p=ptitvelo%2Fweb%2Fwww.git diff --git a/www/ecrire/inc/session.php b/www/ecrire/inc/session.php index 1a94d17..97067ce 100644 --- a/www/ecrire/inc/session.php +++ b/www/ecrire/inc/session.php @@ -19,7 +19,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * */ -$GLOBALS['visiteur_session'] = ''; # globale decrivant l'auteur +$GLOBALS['visiteur_session'] = array(); # globale decrivant l'auteur /** * 3 actions sur les sessions, selon le type de l'argument: @@ -65,15 +65,25 @@ function inc_session_dist($auteur=false) */ function supprimer_sessions($id_auteur, $toutes=true, $actives=true) { + $nb_files = 0; + $nb_max_files = (defined('_MAX_NB_SESSIONS_OUVERTES')?_MAX_NB_SESSIONS_OUVERTES:1000); spip_log("supprimer sessions auteur $id_auteur"); if ($toutes OR $id_auteur!==$GLOBALS['visiteur_session']['id_auteur']) { if ($dir = opendir(_DIR_SESSIONS)){ - $t = time() - (4*_RENOUVELLE_ALEA); + $t = $_SERVER['REQUEST_TIME'] - (4*_RENOUVELLE_ALEA); // 48h par defaut + $t_short = $_SERVER['REQUEST_TIME'] - max(_RENOUVELLE_ALEA/4,3*3600); // 3h par defaut while(($f = readdir($dir)) !== false) { + $nb_files++; if (preg_match(",^[^\d-]*(-?\d+)_\w{32}\.php[3]?$,", $f, $regs)){ $f = _DIR_SESSIONS . $f; - if (($actives AND $regs[1] == $id_auteur) OR ($t > filemtime($f))) + if (($actives AND $regs[1] == $id_auteur) OR ($t > filemtime($f))){ spip_unlink($f); + } + // si il y a trop de sessions ouvertes, on purge les sessions anonymes de plus de 3H + // cd http://core.spip.org/issues/3276 + elseif($nb_files>$nb_max_files AND !intval($regs[1]) AND ($t_short > filemtime($f))){ + spip_unlink($f); + } } } } @@ -102,12 +112,7 @@ function ajouter_session($auteur) { // Attention un visiteur peut avoir une session et un id=0, // => ne pas melanger les sessions des differents visiteurs $id_auteur = intval($auteur['id_auteur']); - if (!isset($_COOKIE['spip_session']) - OR !preg_match(',^'.$id_auteur.'_,', $_COOKIE['spip_session'])) - $_COOKIE['spip_session'] = $id_auteur.'_'.md5(uniqid(rand(),true)); - $fichier_session = fichier_session('alea_ephemere'); - // Si ce n'est pas un inscrit (les inscrits ont toujours des choses en session) // on va vérifier s'il y a vraiment des choses à écrire if (!$id_auteur){ @@ -124,14 +129,28 @@ function ajouter_session($auteur) { unset($auteur_verif[$variable]); } } - - // Si après ça la session est vide alors on supprime l'éventuel fichier et on arrête là - if (!$auteur_verif){ - if (@file_exists($fichier_session)) spip_unlink($fichier_session); + // Si après ça la session est vide et qu'on a pas de cookie session, on arrete + if (!$auteur_verif AND !isset($_COOKIE['spip_session'])){ return false; } } - + + if (!isset($_COOKIE['spip_session']) + OR !preg_match(',^'.$id_auteur.'_,', $_COOKIE['spip_session'])){ + $_COOKIE['spip_session'] = $id_auteur.'_'.md5(uniqid(rand(),true)); + } + + $fichier_session = fichier_session('alea_ephemere'); + + // Si la session est vide alors on supprime l'éventuel fichier et on arrête là + if (!$id_auteur AND !$auteur_verif){ + if (@file_exists($fichier_session)) spip_unlink($fichier_session); + // unset le COOKIE de session + // car il est pris en compte dans spip_session() qui va croire a tort qu'on est pas un visiteur anonyme + unset($_COOKIE['spip_session']); + return false; + } + // Maintenant on sait qu'on a des choses à écrire // On s'assure d'avoir au moins ces valeurs $auteur['id_auteur'] = $id_auteur; @@ -268,9 +287,17 @@ function session_get($nom) { * @return void */ function session_set($nom, $val=null) { - // On ajoute la valeur dans la globale - $GLOBALS['visiteur_session'][$nom] = $val; - + + if (is_null($val)){ + // rien a faire + if (!isset($GLOBALS['visiteur_session'][$nom])) return; + unset($GLOBALS['visiteur_session'][$nom]); + } + else { + // On ajoute la valeur dans la globale + $GLOBALS['visiteur_session'][$nom] = $val; + } + ajouter_session($GLOBALS['visiteur_session']); actualiser_sessions($GLOBALS['visiteur_session']); }