/** * Supprimer toutes les vieilles sessions d'un auteur * * Cette fonction efface toutes les sessions appartenant a l'auteur * On en profite pour effacer toutes les sessions * creees il y a plus de 4*_RENOUVELLE_ALEA * Tenir compte de l'ancien format ou les noms commencaient par "session_" * et du meme coup des repertoires plats * Attention : id_auteur peut etre negatif (cas des auteurs temporaires pendant le dump) * * http://doc.spip.org/@supprimer_sessions * * @param int $id_auteur * Identifiant d'auteur dont on veut supprimer les sessions * @param bool $toutes * Supprimer aussi les vieilles sessions des autres auteurs ? * @param bool $actives * false pour ne pas supprimer les sessions valides de $id_auteur. * false revient donc a uniquement supprimer les vieilles sessions ! */ function supprimer_sessions($id_auteur, $toutes = true, $actives = true) { 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; while (($f = readdir($dir)) !== false) { 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); } } } } } else { verifier_session(); spip_unlink(fichier_session('alea_ephemere', true)); } // forcer le recalcul de la session courante spip_session(true); }
function invalideur_session(&$Cache, $code = NULL) { $Cache['session'] = spip_session(); return $code; }
function supprimer_sessions($id_auteur) { $i = 0; $t = (time() - (_RENOUVELLE_ALEA << 2)); $dir = opendir(_DIR_SESSIONS); while(($e = readdir($dir)) !== false) { if (!preg_match(",^\D*(\d+)_\w{32}\.php[3]?$,", $e, $r)) continue; $f = _DIR_SESSIONS . $e; if (file_exists($f) AND (($id_auteur AND ($r[1] == $id_auteur)) OR ($t > filemtime($f)))) { spip_unlink($f); $i++; } } // pour un anonyme, se fonder sur le cookie pour trouver le fichier if (!$id_auteur) { verifier_session(); spip_unlink(fichier_session('alea_ephemere', true)); } if ($i) spip_log("destruction des $i fichiers de session de $id_auteur et 0"); // forcer le recalcul de la session courante spip_session(true); }
/** * Interface du gestionnaire de cache * Si son 3e argument est non vide, elle passe la main a creer_cache * Sinon, elle recoit un contexte (ou le construit a partir de REQUEST_URI) * et affecte les 4 autres parametres recus par reference: * - use_cache qui vaut * -1 s'il faut calculer la page sans la mettre en cache * 0 si on peut utiliser un cache existant * 1 s'il faut calculer la page et la mettre en cache * - chemin_cache qui est le chemin d'acces au fichier ou vide si pas cachable * - page qui est le tableau decrivant la page, si le cache la contenait * - lastmodified qui vaut la date de derniere modif du fichier. * Elle retourne '' si tout va bien * un message d'erreur si le calcul de la page est totalement impossible * * http://code.spip.net/@public_cacher_dist * * @param array $contexte * @param int $use_cache * @param string $chemin_cache * @param array $page * @param int $lastmodified * @return string|void */ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified) { # fonction de cache minimale : dire "non on ne met rien en cache" # $use_cache = -1; return; // Second appel, destine a l'enregistrement du cache sur le disque if (isset($chemin_cache)) { return creer_cache($page, $chemin_cache); } // Toute la suite correspond au premier appel $contexte_implicite = $page['contexte_implicite']; // Cas ignorant le cache car completement dynamique if ($_SERVER['REQUEST_METHOD'] == 'POST' or _request('connect')) { $use_cache = -1; $lastmodified = 0; $chemin_cache = ""; $page = array(); return; } // Controler l'existence d'un cache nous correspondant $chemin_cache = generer_nom_fichier_cache($contexte, $page); $lastmodified = 0; // charger le cache s'il existe (et si il a bien le bon hash = anticollision) if (!($page = lire_cache($chemin_cache))) { $page = array(); } // s'il est sessionne, charger celui correspondant a notre session if (isset($page['invalideurs']) and isset($page['invalideurs']['session'])) { $chemin_cache_session = generer_nom_fichier_cache(array("chemin_cache" => $chemin_cache), array("session" => spip_session())); if ($page_session = lire_cache($chemin_cache_session) and $page_session['lastmodified'] >= $page['lastmodified']) { $page = $page_session; } else { $page = array(); } } // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ? if (isset($GLOBALS['meta']['invalider'])) { // ne le faire que si la base est disponible if (spip_connect()) { include_spip('inc/invalideur'); retire_caches($chemin_cache); # API invalideur inutile supprimer_fichier(_DIR_CACHE . $chemin_cache); if (isset($chemin_cache_session) and $chemin_cache_session) { supprimer_fichier(_DIR_CACHE . $chemin_cache_session); } } } // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande, // on supprime le cache if (defined('_VAR_MODE') && _VAR_MODE && (isset($_COOKIE['spip_session']) || isset($_COOKIE['spip_admin']) || @file_exists(_ACCESS_FILE_NAME))) { $page = array('contexte_implicite' => $contexte_implicite); // ignorer le cache deja lu include_spip('inc/invalideur'); retire_caches($chemin_cache); # API invalideur inutile supprimer_fichier(_DIR_CACHE . $chemin_cache); if (isset($chemin_cache_session) and $chemin_cache_session) { supprimer_fichier(_DIR_CACHE . $chemin_cache_session); } } // $delais par defaut // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé // qui sont a cache nul par defaut if (!isset($GLOBALS['delais'])) { if (!defined('_DUREE_CACHE_DEFAUT')) { define('_DUREE_CACHE_DEFAUT', 24 * 3600); } $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT; } // determiner la validite de la page if ($page) { $use_cache = cache_valide($page, isset($page['lastmodified']) ? $page['lastmodified'] : 0); // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul $page['contexte_implicite'] = $contexte_implicite; if (!$use_cache) { // $page est un cache utilisable gunzip_page($page); return; } } else { $page = array('contexte_implicite' => $contexte_implicite); $use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul } // Si pas valide mais pas de connexion a la base, le garder quand meme if (!spip_connect()) { if (isset($page['texte'])) { gunzip_page($page); $use_cache = 0; } else { spip_log("Erreur base de donnees, impossible utiliser {$chemin_cache}"); include_spip('inc/minipres'); return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), array('status' => 503)); } } if ($use_cache < 0) { $chemin_cache = ''; } return; }
function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified) { // Second appel, destine a l'enregistrement du cache sur le disque if (isset($chemin_cache)) return creer_cache($page, $chemin_cache); // Toute la suite correspond au premier appel $contexte_implicite = $page['contexte_implicite']; // Cas ignorant le cache car completement dynamique if ($_SERVER['REQUEST_METHOD'] == 'POST' OR (substr($contexte_implicite['cache'],0,8)=='modeles/') OR (_request('connect')) // Mode auteur authentifie appelant de ecrire/ : il ne faut rien lire du cache // et n'y ecrire que la compilation des squelettes (pas les pages produites) // car les references aux repertoires ne sont pas relatifs a l'espace public OR test_espace_prive()) { $use_cache = -1; $lastmodified = 0; $chemin_cache = ""; $page = array(); return; } // Controler l'existence d'un cache nous correspondant $chemin_cache = generer_nom_fichier_cache($contexte, $page); $lastmodified = 0; // charger le cache s'il existe if (lire_fichier(_DIR_CACHE . $chemin_cache, $page)) $page = @unserialize($page); else $page = array(); // s'il est sessionne, charger celui correspondant a notre session if (isset($page['invalideurs']) AND isset($page['invalideurs']['session'])) { $chemin_cache_session = $chemin_cache . '_' . spip_session(); if (lire_fichier(_DIR_CACHE . $chemin_cache_session, $page_session) AND $page_session = @unserialize($page_session) AND $page_session['lastmodified'] >= $page['lastmodified']) $page = $page_session; else $page = array(); } // HEAD : cas sans jamais de calcul pour raisons de performance if ($_SERVER['REQUEST_METHOD'] == 'HEAD') { $use_cache = 0; $page = array('contexte_implicite'=>$contexte_implicite); return; } // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande, // on supprime le cache if ($GLOBALS['var_mode'] && (isset($_COOKIE['spip_session']) || isset($_COOKIE['spip_admin']) || @file_exists(_ACCESS_FILE_NAME)) ) { $page = array('contexte_implicite'=>$contexte_implicite); // ignorer le cache deja lu include_spip('inc/invalideur'); retire_caches($chemin_cache); # API invalideur inutile supprimer_fichier(_DIR_CACHE.$chemin_cache); if ($chemin_cache_session) supprimer_fichier(_DIR_CACHE.$chemin_cache_session); } // $delais par defaut (pour toutes les pages sans #CACHE{}) if (!isset($GLOBALS['delais'])) { define('_DUREE_CACHE_DEFAUT', 24*3600); $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT; } // determiner la validite de la page if ($page) { $use_cache = cache_valide($page, $page['lastmodified']); // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul $page['contexte_implicite'] = $contexte_implicite; if (!$use_cache) { // $page est un cache utilisable gunzip_page($page); return; } } else { $page = array('contexte_implicite'=>$contexte_implicite); $use_cache = cache_valide($page,0); // fichier cache absent : provoque le calcul } // Si pas valide mais pas de connexion a la base, le garder quand meme if (!spip_connect()) { if (isset($page['texte'])) { gunzip_page($page); $use_cache = 0; } else { spip_log("Erreur base de donnees, impossible utiliser $chemin_cache"); include_spip('inc/minipres'); return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique')); } } if ($use_cache < 0) $chemin_cache = ''; return; }
/** * Supprimer toutes les vieilles sessions d'un auteur * * Cette fonction efface toutes les sessions appartenant a l'auteur * On en profite pour effacer toutes les sessions * creees il y a plus de 4*_RENOUVELLE_ALEA * Tenir compte de l'ancien format ou les noms commencaient par "session_" * et du meme coup des repertoires plats * Attention : id_auteur peut etre negatif (cas des auteurs temporaires pendant le dump) * * http://doc.spip.org/@supprimer_sessions * * @param int $id_auteur * Identifiant d'auteur dont on veut supprimer les sessions * @param bool $toutes * Supprimer aussi les vieilles sessions des autres auteurs ? * @param bool $actives * false pour ne pas supprimer les sessions valides de $id_auteur. * false revient donc a uniquement supprimer les vieilles sessions ! */ 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 = $_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)) { spip_unlink($f); } elseif ($nb_files > $nb_max_files and !intval($regs[1]) and $t_short > filemtime($f)) { spip_unlink($f); } } } } } else { verifier_session(); spip_unlink(fichier_session('alea_ephemere', true)); } // forcer le recalcul de la session courante spip_session(true); }