[SPIP] ~v3.0.17-->v3.0.19
[ptitvelo/web/www.git] / www / ecrire / inc / session.php
index 1a94d17..97067ce 100644 (file)
@@ -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']);
 }