*
*/
-$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:
*/
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);
+ }
}
}
}
// 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){
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;
* @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']);
}