[SPIP] ~maj v3.2.9-->v3.2.11
[lhc/web/www.git] / www / ecrire / inc / session.php
index a759650..2e331bf 100644 (file)
@@ -77,16 +77,26 @@ 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", "session");
        if ($toutes or $id_auteur !== $GLOBALS['visiteur_session']['id_auteur']) {
                if ($dir = opendir(_DIR_SESSIONS)) {
+                       $t = $_SERVER['REQUEST_TIME']  - (4*_RENOUVELLE_ALEA); // 48h par defaut
+                       $t_short = $_SERVER['REQUEST_TIME']  - max(_RENOUVELLE_ALEA/4,3*3600); // 3h par defaut
                        $t = time() - (4 * _RENOUVELLE_ALEA);
                        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))) {
                                                spip_unlink($f);
                                        }
+                                       // si il y a trop de sessions ouvertes, on purge les sessions anonymes de plus de 3H
+                                       // cf http://core.spip.org/issues/3276
+                                       elseif ($nb_files>$nb_max_files and !intval($regs[1]) and ($t_short > filemtime($f))) {
+                                               spip_unlink($f);
+                                       }
                                }
                        }
                }